[Scummvm-git-logs] scummvm-web master -> 7809a83d5644e2e8b5009f3d24081dd52354c744

Mataniko mataniko at gmail.com
Thu Jul 26 13:17:45 CEST 2018


This automated email contains information about 10 new commits which have been
pushed to the 'scummvm-web' repo located at https://github.com/scummvm/scummvm-web .

Summary:
5b48af2205 WEB: Use postcss to add vendor prefixes in our CSS
ab1ded4bba WEB: Upgrade to Smarty 3
3ff4a1b01e WEB: Remove broken getImage method from news articles
904f4494ca WEB: Add a method to generate News links in HTML and feeds
157f71a271 WEB: Move templates to subfolders
f3cbfb6b5c WEB: Prevent access to node related files
f0be08f8dc WEB: update templates includes to use the new folder structure
ef0a23594b WEB: Fix feed templates
8f4f769f9e WEB: Update gitignore
7809a83d56 WEB: Fix the snowberry PR page


Commit: 5b48af2205655e6bb50b091b77fdf87898d0b37a
    https://github.com/scummvm/scummvm-web/commit/5b48af2205655e6bb50b091b77fdf87898d0b37a
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Use postcss to add vendor prefixes in our CSS

Changed paths:
  A package-lock.json
  A package.json
    .gitignore
    site-update/install.sh


diff --git a/.gitignore b/.gitignore
index 8491655..37134f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@
 /images/games.png
 /images/platforms at 2x.png
 /images/games at 2x.png
+/node_modules
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..38e95f2
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2466 @@
+{
+  "name": "scummvm-web",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz",
+      "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A=="
+    },
+    "ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+    },
+    "atob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+      "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
+    },
+    "autoprefixer": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.0.1.tgz",
+      "integrity": "sha512-ytUcgSKu1mZh8pCJq54BkaK7ijigK+nhqVmu8PYOR00letCkrU71qTfKnzhQgn7by/QJvlJGUAofMt+jyXJTxA==",
+      "requires": {
+        "browserslist": "^4.0.1",
+        "caniuse-lite": "^1.0.30000865",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.1",
+        "postcss-value-parser": "^3.2.3"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "binary-extensions": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "browserslist": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.0.1.tgz",
+      "integrity": "sha512-QqiiIWchEIkney3wY53/huI7ZErouNAdvOkjorUALAwRcu3tEwOV3Sh6He0DnP38mz1JjBpCBb50jQBmaYuHPw==",
+      "requires": {
+        "caniuse-lite": "^1.0.30000865",
+        "electron-to-chromium": "^1.3.52",
+        "node-releases": "^1.0.0-alpha.10"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
+    },
+    "camelcase": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+      "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000865",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz",
+      "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw=="
+    },
+    "chalk": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+      "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "chokidar": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+      "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.0",
+        "braces": "^2.3.0",
+        "fsevents": "^1.2.2",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "lodash.debounce": "^4.0.8",
+        "normalize-path": "^2.1.1",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0",
+        "upath": "^1.0.5"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+      "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+      "requires": {
+        "string-width": "^2.1.1",
+        "strip-ansi": "^4.0.0",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
+      "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
+      "requires": {
+        "color-name": "1.1.1"
+      }
+    },
+    "color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "cosmiconfig": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+      "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+      "requires": {
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.9.0",
+        "parse-json": "^4.0.0",
+        "require-from-string": "^2.0.1"
+      }
+    },
+    "cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "requires": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
+      "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
+      "requires": {
+        "xregexp": "4.0.0"
+      }
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "dependency-graph": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.1.tgz",
+      "integrity": "sha512-2s2uojwu7aq0K94DwrnJwo/mTkGiPqy2cU7z5BVXmhb564WgITZR3ruZMUIJ8Ymb5ruew244odZCR23/lZoxXg=="
+    },
+    "dir-glob": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+      "requires": {
+        "arrify": "^1.0.1",
+        "path-type": "^3.0.0"
+      }
+    },
+    "electron-to-chromium": {
+      "version": "1.3.52",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz",
+      "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA="
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "requires": {
+        "cross-spawn": "^5.0.1",
+        "get-stream": "^3.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "fast-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz",
+      "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==",
+      "requires": {
+        "@mrmlnc/readdir-enhanced": "^2.2.1",
+        "@nodelib/fs.stat": "^1.0.1",
+        "glob-parent": "^3.1.0",
+        "is-glob": "^4.0.0",
+        "merge2": "^1.2.1",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fs-extra": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz",
+      "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+      "optional": true,
+      "requires": {
+        "nan": "^2.9.2",
+        "node-pre-gyp": "^0.10.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.5.1",
+          "bundled": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.21",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": "^2.1.0"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true
+        },
+        "minipass": {
+          "version": "2.2.4",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.1.2",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.10.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.0",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.1.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.1.10",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "^0.5.1",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.0.5"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.1",
+          "bundled": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.5.0",
+          "bundled": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.0.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.2.4",
+            "minizlib": "^1.1.0",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "yallist": {
+          "version": "3.0.2",
+          "bundled": true
+        }
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+    },
+    "get-stdin": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+      "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g=="
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "requires": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
+    },
+    "globby": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
+      "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
+      "requires": {
+        "array-union": "^1.0.1",
+        "dir-glob": "^2.0.0",
+        "fast-glob": "^2.0.2",
+        "glob": "^7.1.2",
+        "ignore": "^3.3.5",
+        "pify": "^3.0.0",
+        "slash": "^1.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "ignore": {
+      "version": "3.3.10",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+    },
+    "is-glob": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+    },
+    "js-yaml": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+      "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "kind-of": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+      "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "requires": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.10",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+      "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "mem": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "merge2": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz",
+      "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg=="
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "nan": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "node-releases": {
+      "version": "1.0.0-alpha.10",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.10.tgz",
+      "integrity": "sha512-BSQrRgOfN6L/MoKIa7pRUc7dHvflCXMcqyTBvphixcSsgJTuUd24vAFONuNfVsuwTyz28S1HEc9XN6ZKylk4Hg==",
+      "requires": {
+        "semver": "^5.3.0"
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "requires": {
+        "remove-trailing-separator": "^1.0.1"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "os-locale": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+      "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+      "requires": {
+        "execa": "^0.7.0",
+        "lcid": "^1.0.0",
+        "mem": "^1.1.0"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+    },
+    "p-limit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
+      "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "requires": {
+        "p-limit": "^2.0.0"
+      }
+    },
+    "p-try": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
+      "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="
+    },
+    "parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+      "requires": {
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
+      }
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "requires": {
+        "pify": "^3.0.0"
+      }
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "postcss": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.1.tgz",
+      "integrity": "sha512-c6M68yZX0bWnZ0GcX8duWcfweGeGQvYgw6w4xksRePDmrpCrLMqneN07xwce17ACWBAr0S+DoI0T31axZ21TKg==",
+      "requires": {
+        "chalk": "^2.4.1",
+        "source-map": "^0.6.1",
+        "supports-color": "^5.4.0"
+      }
+    },
+    "postcss-cli": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.0.0.tgz",
+      "integrity": "sha512-7DuxMn1Wj6dJKbjKpZXOdAc5nl5NfPXiJbg0m/+tdObPvgk1xv4+lZgNKD3jL/kCrDRPf1jgFlmq1cHh8lBR2w==",
+      "requires": {
+        "chalk": "^2.1.0",
+        "chokidar": "^2.0.0",
+        "dependency-graph": "^0.7.0",
+        "fs-extra": "^7.0.0",
+        "get-stdin": "^6.0.0",
+        "globby": "^8.0.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "postcss-reporter": "^5.0.0",
+        "pretty-hrtime": "^1.0.3",
+        "read-cache": "^1.0.0",
+        "yargs": "^12.0.1"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz",
+      "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==",
+      "requires": {
+        "cosmiconfig": "^4.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-reporter": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz",
+      "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==",
+      "requires": {
+        "chalk": "^2.0.1",
+        "lodash": "^4.17.4",
+        "log-symbols": "^2.0.0",
+        "postcss": "^6.0.8"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
+    },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "requires": {
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "minimatch": "^3.0.2",
+        "readable-stream": "^2.0.2",
+        "set-immediate-shim": "^1.0.1"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "repeat-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "semver": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-immediate-shim": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "requires": {
+        "ansi-regex": "^3.0.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+    },
+    "supports-color": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
+          }
+        }
+      }
+    },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        }
+      }
+    },
+    "upath": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+      "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw=="
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "xregexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
+      "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg=="
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+    },
+    "yargs": {
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz",
+      "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==",
+      "requires": {
+        "cliui": "^4.0.0",
+        "decamelize": "^2.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^2.0.0",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^2.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^3.2.1 || ^4.0.0",
+        "yargs-parser": "^10.1.0"
+      }
+    },
+    "yargs-parser": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+      "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+      "requires": {
+        "camelcase": "^4.1.0"
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..181b801
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "scummvm-web",
+  "description": "ScummVM.org main site",
+  "version": "1.0.0",
+  "dependencies": {
+    "autoprefixer": "^9.0.1",
+    "postcss-cli": "^6.0.0"
+  },
+  "scripts": {
+    "postinstall": "postcss ./css/*.css --use autoprefixer --no-map -r"
+  }
+}
diff --git a/site-update/install.sh b/site-update/install.sh
index 17569b4..e78b9b1 100644
--- a/site-update/install.sh
+++ b/site-update/install.sh
@@ -26,4 +26,7 @@ export COMPOSER_HOME=/var/www/composer
 echo "$ Composer home:" $COMPOSER_HOME
 echo '$ composer install'
 composer install 2>&1
- 
\ No newline at end of file
+ 
+# Run npm install
+echo "$ npm install"
+npm install


Commit: ab1ded4bba9b1d3573c0bd7634d9cb2f1a076055
    https://github.com/scummvm/scummvm-web/commit/ab1ded4bba9b1d3573c0bd7634d9cb2f1a076055
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Upgrade to Smarty 3

Changed paths:
  R include/smarty/Config_File.class.php
  R include/smarty/Smarty.class.php
  R include/smarty/Smarty_Compiler.class.php
  R include/smarty/debug.tpl
  R include/smarty/internals/core.assemble_plugin_filepath.php
  R include/smarty/internals/core.assign_smarty_interface.php
  R include/smarty/internals/core.create_dir_structure.php
  R include/smarty/internals/core.display_debug_console.php
  R include/smarty/internals/core.get_include_path.php
  R include/smarty/internals/core.get_microtime.php
  R include/smarty/internals/core.get_php_resource.php
  R include/smarty/internals/core.is_secure.php
  R include/smarty/internals/core.is_trusted.php
  R include/smarty/internals/core.load_plugins.php
  R include/smarty/internals/core.load_resource_plugin.php
  R include/smarty/internals/core.process_cached_inserts.php
  R include/smarty/internals/core.process_compiled_include.php
  R include/smarty/internals/core.read_cache_file.php
  R include/smarty/internals/core.rm_auto.php
  R include/smarty/internals/core.rmdir.php
  R include/smarty/internals/core.run_insert_handler.php
  R include/smarty/internals/core.smarty_include_php.php
  R include/smarty/internals/core.write_cache_file.php
  R include/smarty/internals/core.write_compiled_include.php
  R include/smarty/internals/core.write_compiled_resource.php
  R include/smarty/internals/core.write_file.php
  R include/smarty/plugins/block.textformat.php
  R include/smarty/plugins/compiler.assign.php
  R include/smarty/plugins/function.assign_debug_info.php
  R include/smarty/plugins/function.config_load.php
  R include/smarty/plugins/function.counter.php
  R include/smarty/plugins/function.cycle.php
  R include/smarty/plugins/function.debug.php
  R include/smarty/plugins/function.eval.php
  R include/smarty/plugins/function.fetch.php
  R include/smarty/plugins/function.html_checkboxes.php
  R include/smarty/plugins/function.html_image.php
  R include/smarty/plugins/function.html_options.php
  R include/smarty/plugins/function.html_radios.php
  R include/smarty/plugins/function.html_select_date.php
  R include/smarty/plugins/function.html_select_time.php
  R include/smarty/plugins/function.html_table.php
  R include/smarty/plugins/function.mailto.php
  R include/smarty/plugins/function.math.php
  R include/smarty/plugins/function.popup.php
  R include/smarty/plugins/function.popup_init.php
  R include/smarty/plugins/modifier.capitalize.php
  R include/smarty/plugins/modifier.cat.php
  R include/smarty/plugins/modifier.count_characters.php
  R include/smarty/plugins/modifier.count_paragraphs.php
  R include/smarty/plugins/modifier.count_sentences.php
  R include/smarty/plugins/modifier.count_words.php
  R include/smarty/plugins/modifier.date_format.php
  R include/smarty/plugins/modifier.debug_print_var.php
  R include/smarty/plugins/modifier.default.php
  R include/smarty/plugins/modifier.escape.php
  R include/smarty/plugins/modifier.indent.php
  R include/smarty/plugins/modifier.lower.php
  R include/smarty/plugins/modifier.nl2br.php
  R include/smarty/plugins/modifier.regex_replace.php
  R include/smarty/plugins/modifier.replace.php
  R include/smarty/plugins/modifier.spacify.php
  R include/smarty/plugins/modifier.string_format.php
  R include/smarty/plugins/modifier.strip.php
  R include/smarty/plugins/modifier.strip_tags.php
  R include/smarty/plugins/modifier.truncate.php
  R include/smarty/plugins/modifier.upper.php
  R include/smarty/plugins/modifier.wordwrap.php
  R include/smarty/plugins/outputfilter.trimwhitespace.php
  R include/smarty/plugins/shared.escape_special_chars.php
  R include/smarty/plugins/shared.make_timestamp.php
    .gitignore
    composer.json
    composer.lock
    include/Controller.php
    include/Pages/CompatibilityPage.php
    include/Pages/ContactPage.php
    include/Pages/CreditsPage.php
    include/Pages/DemosPage.php
    include/Pages/DocumentationPage.php
    include/Pages/DownloadsPage.php
    include/Pages/ExceptionsPage.php
    include/Pages/FAQPage.php
    include/Pages/GamesPage.php
    include/Pages/LinksPage.php
    include/Pages/NewsPage.php
    include/Pages/PressPage.php
    include/Pages/PressSnowberryPage.php
    include/Pages/ScreenshotsPage.php
    include/Pages/SubprojectsPage.php
    include/config.inc.php


diff --git a/.gitignore b/.gitignore
index 37134f8..b4f0242 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /include/smarty/template_c
+/vendor
 /templates_c
 .DS_Store
 /css
diff --git a/composer.json b/composer.json
index 3ccbd24..12c04a5 100644
--- a/composer.json
+++ b/composer.json
@@ -1,9 +1,16 @@
 {
     "name": "scummvm/web",
-    "description": "ScummVM.org main site",
-    "type": "project",    
+    "description": "Scummvm.org main site",
+    "type": "project",
+    "authors": [
+        {
+            "name": "Matan Bareket",
+            "email": "mataniko at gmail.com"
+        }
+    ],
     "require": {
-        "leafo/scssphp": "^0.7.6"
+        "leafo/scssphp": "^0.7.6",
+        "smarty/smarty": "^3.1"
     },
     "scripts": {
       "post-install-cmd": [
diff --git a/composer.lock b/composer.lock
index 6cb9a4d..83804fd 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "ac55030bc9483e27482cfb82072ff47c",
+    "content-hash": "b3beee70c2e326b0c5f59e77a519ed7f",
     "packages": [
         {
             "name": "leafo/scssphp",
@@ -57,6 +57,59 @@
                 "stylesheet"
             ],
             "time": "2018-05-24T02:18:53+00:00"
+        },
+        {
+            "name": "smarty/smarty",
+            "version": "v3.1.32",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/smarty-php/smarty.git",
+                "reference": "ac9d4b587e5bf53381e21881820a9830765cb459"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/smarty-php/smarty/zipball/ac9d4b587e5bf53381e21881820a9830765cb459",
+                "reference": "ac9d4b587e5bf53381e21881820a9830765cb459",
+                "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 at ohrt.com"
+                },
+                {
+                    "name": "Uwe Tews",
+                    "email": "uwe.tews at googlemail.com"
+                },
+                {
+                    "name": "Rodney Rehm",
+                    "email": "rodney.rehm at medialize.de"
+                }
+            ],
+            "description": "Smarty - the compiling PHP template engine",
+            "homepage": "http://www.smarty.net",
+            "keywords": [
+                "templating"
+            ],
+            "time": "2018-04-24T14:53:33+00:00"
         }
     ],
     "packages-dev": [],
diff --git a/include/Controller.php b/include/Controller.php
index 06796e2..b9defdf 100644
--- a/include/Controller.php
+++ b/include/Controller.php
@@ -1,5 +1,5 @@
 <?php
-require_once(SMARTY_DIR_BASE . '/Smarty.class.php');
+require_once(SMARTY_DIR . '/Smarty.class.php');
 require_once('Models/MenuModel.php');
 /**
  * The Controller class will create an instance of the Smarty object configured
@@ -35,38 +35,38 @@ class Controller {
 		$this->_smarty->compile_dir = SMARTY_DIR_COMPILE;
 		$this->_smarty->cache_dir = SMARTY_DIR_CACHE;
 		$this->_smarty->config_dir = SMARTY_DIR_CONFIG;
-		$this->_smarty->request_use_auto_globals = SMARTY_USE_GLOBALS;
 		$this->_smarty->caching = SMARTY_CACHING_ENABLE;
 		$this->_smarty->cache_lifetime = SMARTY_CACHING_LIFETIME;
 		$this->_smarty->compile_check = SMARTY_CACHING_COMPILE_CHECK;
-		$this->_smarty->force_recheck = SMARTY_CACHING_FORCE_RECHECK;
+		$this->_smarty->force_compile = SMARTY_CACHING_FORCE_RECHECK;
 		$this->_smarty->template_dir = array("templates_$lang", 'templates');
 		$this->_smarty->compile_id = $lang;
 		$this->_smarty->config_dir = ".";
 
-		# First we read English, so al defaults are there
-		$this->_smarty->config_load(DIR_LANG . "/lang.ini");
+		# First we read English, so all defaults are there
+		$this->_smarty->configLoad(DIR_LANG . "/lang.ini");
 
 		# Now we try to read translations
 		if (is_file(($fname = DIR_LANG . "/lang.$lang.ini"))
 			&& is_readable($fname)) {
-			$this->_smarty->config_load($fname);
+			$this->_smarty->configLoad($fname);
 		}
-
-		setlocale(LC_TIME, $Smarty->_config[0]['vars']['locale']);
+    
+		setlocale(LC_TIME, $Smarty->getConfigVars('locale'));
 
 		/**
 		 * Add a output-filter to make sure ampersands are properly encoded to
 		 * HTML-entities.
 		 */
-		$this->_smarty->register_outputfilter(array(&$this, 'outputFilter'));
+		$this->_smarty->registerFilter('output', array($this, 'outputFilter'));
 
 		/* Give Smarty-template access to date(). */
-		$this->_smarty->register_modifier('date_f', array(&$this, 'date_f'));
-		$this->_smarty->register_modifier('date_localized', array(&$this, 'date_localized'));
+		$this->_smarty->registerPlugin('modifier', 'date_f', array(&$this, 'date_f'));
+		$this->_smarty->registerPlugin('modifier', 'date_localized', array(&$this, 'date_localized'));
 
 		/* Give Smarty-templates access to the ampersandEntity() function. */
-		$this->_smarty->register_modifier(
+		$this->_smarty->registerPlugin(
+      'modifier',
 			'escapeAmpersand',
 			array(&$this, 'ampersandEntity')
 		);
@@ -99,7 +99,7 @@ class Controller {
 	}
 
 	/** Smarty outputfilter, run just before displaying. */
-	public function outputFilter($string, &$smarty) {
+	public function outputFilter($string, $smarty) {
 		/* Properly encode all ampersands as "&". */
 		$string = preg_replace('/&(?!([a-z]+|(#\d+));)/i', '&', $string);
 		/* Replace weird characters that appears in some of the data. */
diff --git a/include/Pages/CompatibilityPage.php b/include/Pages/CompatibilityPage.php
index 7ccd1b5..c68ea26 100644
--- a/include/Pages/CompatibilityPage.php
+++ b/include/Pages/CompatibilityPage.php
@@ -19,11 +19,11 @@ class CompatibilityPage extends Controller {
 		$this->_template = 'compatibility.tpl';
 		$this->_template_details = 'compatibility_details.tpl';
 		$this->_supportLevelDesc = array(
-			'untested' => $Smarty->_config[0]['vars']['compatibilityUntested'],
-			'broken' => $Smarty->_config[0]['vars']['compatibilityBroken'],
-			'bugged' => $Smarty->_config[0]['vars']['compatibilityBugged'],
-			'good' => $Smarty->_config[0]['vars']['compatibilityGood'],
-			'excellent' => $Smarty->_config[0]['vars']['compatibilityExcellent']
+			'untested' => $Smarty->getConfigVars('compatibilityUntested'),
+			'broken' => $Smarty->getConfigVars('compatibilityBroken'),
+			'bugged' => $Smarty->getConfigVars('compatibilityBugged'),
+			'good' => $Smarty->getConfigVars('compatibilityGood'),
+			'excellent' => $Smarty->getConfigVars('compatibilityExcellent')
 		);
 		$this->_supportLevelClass = array(
 			'untested' => 'pctU',
@@ -65,8 +65,8 @@ class CompatibilityPage extends Controller {
 		
 		return $this->renderPage(
 			array(
-				'title' => preg_replace('/{version}/', $version, $Smarty->_config[0]['vars']['compatibilityTitle']),
-				'content_title' => preg_replace('/{version}/', $version, $Smarty->_config[0]['vars']['compatibilityContentTitle']),
+				'title' => preg_replace('/{version}/', $version, $Smarty->getConfigVars('compatibilityTitle')),
+				'content_title' => preg_replace('/{version}/', $version, $Smarty->getConfigVars('compatibilityContentTitle')),
 				'version' => $version,
 				'game' => $game,
 				'old_layout' => $oldLayout,
@@ -92,8 +92,8 @@ class CompatibilityPage extends Controller {
 		
 		return $this->renderPage(
 			array(
-				'title' => preg_replace('/{version}/', $version, $Smarty->_config[0]['vars']['compatibilityTitle']),
-				'content_title' => preg_replace('/{version}/', $version, $Smarty->_config[0]['vars']['compatibilityContentTitle']),
+				'title' => preg_replace('/{version}/', $version, $Smarty->getConfigVars('compatibilityTitle')),
+				'content_title' => preg_replace('/{version}/', $version, $Smarty->getConfigVars('compatibilityContentTitle')),
 				'version' => $version,
 				'compat_data' => $compat_data,
 				'last_updated' => $last_updated,
diff --git a/include/Pages/ContactPage.php b/include/Pages/ContactPage.php
index 6b7f45d..bcce003 100644
--- a/include/Pages/ContactPage.php
+++ b/include/Pages/ContactPage.php
@@ -16,8 +16,8 @@ class ContactPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['contactTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['contactContentTitle'],
+				'title' => $Smarty->getConfigVars('contactTitle'),
+				'content_title' => $Smarty->getConfigVars('contactContentTitle'),
 			),
 			$this->_template
 		);
diff --git a/include/Pages/CreditsPage.php b/include/Pages/CreditsPage.php
index f45e84c..9b873b9 100644
--- a/include/Pages/CreditsPage.php
+++ b/include/Pages/CreditsPage.php
@@ -18,8 +18,8 @@ class CreditsPage extends Controller {
 		
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['creditsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['creditsContentTitle'],
+				'title' => $Smarty->getConfigVars('creditsTitle'),
+				'content_title' => $Smarty->getConfigVars('creditsContentTitle'),
 				'credits' => $credits,
 			),
 			$this->_template
diff --git a/include/Pages/DemosPage.php b/include/Pages/DemosPage.php
index 35dc670..0376022 100644
--- a/include/Pages/DemosPage.php
+++ b/include/Pages/DemosPage.php
@@ -18,8 +18,8 @@ class DemosPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['demosTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['demosContentTitle'],
+				'title' => $Smarty->getConfigVars('demosTitle'),
+				'content_title' => $Smarty->getConfigVars('demosContentTitle'),
 				'demos' => $demos,
 			),
 			$this->_template
diff --git a/include/Pages/DocumentationPage.php b/include/Pages/DocumentationPage.php
index 8756ffd..7b23b4b 100644
--- a/include/Pages/DocumentationPage.php
+++ b/include/Pages/DocumentationPage.php
@@ -20,8 +20,8 @@ class DocumentationPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['documentationTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['documentationContentTitle'],
+				'title' => $Smarty->getConfigVars('documentationTitle'),
+				'content_title' => $Smarty->getConfigVars('documentationContentTitle'),
 				'documents' => $documents,
 			),
 			$this->_template
diff --git a/include/Pages/DownloadsPage.php b/include/Pages/DownloadsPage.php
index 3d3c8c6..f7a1a8d 100644
--- a/include/Pages/DownloadsPage.php
+++ b/include/Pages/DownloadsPage.php
@@ -54,8 +54,8 @@ class DownloadsPage extends Controller {
 		
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['downloadsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['downloadsContentTitle'],
+				'title' => $Smarty->getConfigVars('downloadsTitle'),
+				'content_title' => $Smarty->getConfigVars('downloadsContentTitle'),
 				'downloads' => $downloads,
 				'sections' => $sections,
 				'release_tools' => RELEASE_TOOLS,
diff --git a/include/Pages/ExceptionsPage.php b/include/Pages/ExceptionsPage.php
index de46258..3c8ecf4 100644
--- a/include/Pages/ExceptionsPage.php
+++ b/include/Pages/ExceptionsPage.php
@@ -16,8 +16,8 @@ class ExceptionsPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['exceptionsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['exceptionsContentTitle'],
+				'title' => $Smarty->getConfigVars('exceptionsTitle'),
+				'content_title' => $Smarty->getConfigVars('exceptionsContentTitle'),
 				'exception' => $exception,
 			),
 			'exception.tpl'
diff --git a/include/Pages/FAQPage.php b/include/Pages/FAQPage.php
index 93fae2b..5d9f29d 100644
--- a/include/Pages/FAQPage.php
+++ b/include/Pages/FAQPage.php
@@ -19,8 +19,8 @@ class FAQPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['faqTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['faqContentTitle'],
+				'title' => $Smarty->getConfigVars('faqTitle'),
+				'content_title' => $Smarty->getConfigVars('faqContentTitle'),
 				'contents' => $contents,
 				'modified' => $modified,
 			),
diff --git a/include/Pages/GamesPage.php b/include/Pages/GamesPage.php
index 8782606..00f5727 100644
--- a/include/Pages/GamesPage.php
+++ b/include/Pages/GamesPage.php
@@ -19,8 +19,8 @@ class GamesPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['gamesTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['gamesContentTitle'],
+				'title' => $Smarty->getConfigVars('gamesTitle'),
+				'content_title' => $Smarty->getConfigVars('gamesContentTitle'),
 				'downloads' => $downloads,
 				'sections' => $sections,
 				'release_tools' => RELEASE_TOOLS,
diff --git a/include/Pages/LinksPage.php b/include/Pages/LinksPage.php
index b3527e0..153d848 100644
--- a/include/Pages/LinksPage.php
+++ b/include/Pages/LinksPage.php
@@ -18,8 +18,8 @@ class LinksPage extends Controller {
 		
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['linksTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['linksContentTitle'],
+				'title' => $Smarty->getConfigVars('linksTitle'),
+				'content_title' => $Smarty->getConfigVars('linksContentTitle'),
 				'links' => $links,
 			),
 			$this->_template
diff --git a/include/Pages/NewsPage.php b/include/Pages/NewsPage.php
index 9f77430..af29c32 100644
--- a/include/Pages/NewsPage.php
+++ b/include/Pages/NewsPage.php
@@ -39,11 +39,11 @@ class NewsPage extends Controller {
 				$news_items = array(NewsModel::getOneByDate($date));
 			}
 		}
-
+    
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['newsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['newsContentTitle'],
+				'title' => $Smarty->getConfigVars('newsTitle'),
+				'content_title' => $Smarty->getConfigVars('newsContentTitle'),
 				'show_intro' => false,
 				'news_items' => $news_items,
 				'news_archive_link' => false,
@@ -66,8 +66,8 @@ class NewsPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['newsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['newsContentTitle'],
+				'title' => $Smarty->getConfigVars('newsTitle'),
+				'content_title' => $Smarty->getConfigVars('newsContentTitle'),
 				'show_intro' => true,
 				'news_items' => $news_items,
 				'news_archive_link' => true,
diff --git a/include/Pages/PressPage.php b/include/Pages/PressPage.php
index 21fc6de..9b95feb 100644
--- a/include/Pages/PressPage.php
+++ b/include/Pages/PressPage.php
@@ -18,8 +18,8 @@ class PressPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['pressTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['pressContentTitle'],
+				'title' => $Smarty->getConfigVars('pressTitle'),
+				'content_title' => $Smarty->getConfigVars('pressContentTitle'),
 				'articles' => $articles,
 			),
 			$this->_template
diff --git a/include/Pages/PressSnowberryPage.php b/include/Pages/PressSnowberryPage.php
index 8638400..be278a0 100644
--- a/include/Pages/PressSnowberryPage.php
+++ b/include/Pages/PressSnowberryPage.php
@@ -18,8 +18,8 @@ class PressSnowberryPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['pressSnowberryTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['pressSnowberryContentTitle'],
+				'title' => $Smarty->getConfigVars('pressSnowberryTitle'),
+				'content_title' => $Smarty->getConfigVars('pressSnowberryContentTitle'),
 				'articles' => $articles,
 			),
 			$this->_template
diff --git a/include/Pages/ScreenshotsPage.php b/include/Pages/ScreenshotsPage.php
index 136e244..c076e14 100644
--- a/include/Pages/ScreenshotsPage.php
+++ b/include/Pages/ScreenshotsPage.php
@@ -37,8 +37,8 @@ class ScreenshotsPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['screenshotsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['screenshotsContentTitle'],
+				'title' => $Smarty->getConfigVars('screenshotsTitle'),
+				'content_title' => $Smarty->getConfigVars('screenshotsContentTitle'),
 				'screenshots' => $screenshot,
 				'random_shot' => $random_shot,
 			),
@@ -65,8 +65,8 @@ class ScreenshotsPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['screenshotsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['screenshotsContentTitle'],
+				'title' => $Smarty->getConfigVars('screenshotsTitle'),
+				'content_title' => $Smarty->getConfigVars('screenshotsContentTitle'),
 				'screenshots' => $screenshots,
 				'category' => $category,
 				'game' => $game,
diff --git a/include/Pages/SubprojectsPage.php b/include/Pages/SubprojectsPage.php
index 1e13088..425d171 100644
--- a/include/Pages/SubprojectsPage.php
+++ b/include/Pages/SubprojectsPage.php
@@ -18,8 +18,8 @@ class SubprojectsPage extends Controller {
 
 		return $this->renderPage(
 			array(
-				'title' => $Smarty->_config[0]['vars']['subprojectsTitle'],
-				'content_title' => $Smarty->_config[0]['vars']['subprojectsContentTitle'],
+				'title' => $Smarty->getConfigVars('subprojectsTitle'),
+				'content_title' => $Smarty->getConfigVars('subprojectsContentTitle'),
 				'subprojects' => $subprojects,
 			),
 			$this->_template
diff --git a/include/config.inc.php b/include/config.inc.php
index 93b4ef7..8740f41 100644
--- a/include/config.inc.php
+++ b/include/config.inc.php
@@ -42,12 +42,11 @@ define('DIR_SCREENSHOTS', '/data/screenshots');
  * directories used under the web server root. 'SMARTY_DIR_COMPILE' and
  * 'SMARTY_DIR_CACHE' must be writable by the web server (chown).
  */
-define('SMARTY_DIR_BASE', 'include/smarty');
+define('SMARTY_DIR', 'vendor/smarty/smarty/libs/');
 define('SMARTY_DIR_TEMPLATE', 'templates');
-define('SMARTY_DIR_COMPILE', SMARTY_DIR_BASE . '/template_c');
-define('SMARTY_DIR_CACHE', SMARTY_DIR_BASE . '/cache');
-define('SMARTY_DIR_CONFIG', SMARTY_DIR_BASE . '/config');
-define('SMARTY_USE_GLOBALS', false);
+define('SMARTY_DIR_COMPILE', SMARTY_DIR . '/template_c');
+define('SMARTY_DIR_CACHE', SMARTY_DIR . '/cache');
+define('SMARTY_DIR_CONFIG', SMARTY_DIR . '/config');
 /**
  * Smarty caching options, makes it possible to cache the generated HTML to
  * speed things up. More information is available at [1].
diff --git a/include/smarty/Config_File.class.php b/include/smarty/Config_File.class.php
deleted file mode 100644
index 6d8c298..0000000
--- a/include/smarty/Config_File.class.php
+++ /dev/null
@@ -1,393 +0,0 @@
-<?php
-
-/**
- * Config_File class.
- *
- * 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 for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For questions, help, comments, discussion, etc., please join the
- * Smarty mailing list. Send a blank e-mail to
- * smarty-discussion-subscribe at googlegroups.com 
- *
- * @link http://www.smarty.net/
- * @version 2.6.25-dev
- * @copyright Copyright: 2001-2005 New Digital Group, Inc.
- * @author Andrei Zmievski <andrei at php.net>
- * @access public
- * @package Smarty
- */
-
-/* $Id$ */
-
-/**
- * Config file reading class
- * @package Smarty
- */
-class Config_File {
-    /**#@+
-     * Options
-     * @var boolean
-     */
-    /**
-     * Controls whether variables with the same name overwrite each other.
-     */
-    var $overwrite        =    true;
-
-    /**
-     * Controls whether config values of on/true/yes and off/false/no get
-     * converted to boolean values automatically.
-     */
-    var $booleanize        =    true;
-
-    /**
-     * Controls whether hidden config sections/vars are read from the file.
-     */
-    var $read_hidden     =    true;
-
-    /**
-     * Controls whether or not to fix mac or dos formatted newlines.
-     * If set to true, \r or \r\n will be changed to \n.
-     */
-    var $fix_newlines =    true;
-    /**#@-*/
-
-    /** @access private */
-    var $_config_path    = "";
-    var $_config_data    = array();
-    /**#@-*/
-
-    /**
-     * Constructs a new config file class.
-     *
-     * @param string $config_path (optional) path to the config files
-     */
-    public function __construct($config_path = NULL)
-    {
-        if (isset($config_path))
-            $this->set_path($config_path);
-    }
-
-
-    /**
-     * Set the path where configuration files can be found.
-     *
-     * @param string $config_path path to the config files
-     */
-    function set_path($config_path)
-    {
-        if (!empty($config_path)) {
-            if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
-                $this->_trigger_error_msg("Bad config file path '$config_path'");
-                return;
-            }
-            if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
-                $config_path .= DIRECTORY_SEPARATOR;
-            }
-
-            $this->_config_path = $config_path;
-        }
-    }
-
-
-    /**
-     * Retrieves config info based on the file, section, and variable name.
-     *
-     * @param string $file_name config file to get info for
-     * @param string $section_name (optional) section to get info for
-     * @param string $var_name (optional) variable to get info for
-     * @return string|array a value or array of values
-     */
-    function get($file_name, $section_name = NULL, $var_name = NULL)
-    {
-        if (empty($file_name)) {
-            $this->_trigger_error_msg('Empty config file name');
-            return;
-        } else {
-            $file_name = $this->_config_path . $file_name;
-            if (!isset($this->_config_data[$file_name]))
-                $this->load_file($file_name, false);
-        }
-
-        if (!empty($var_name)) {
-            if (empty($section_name)) {
-                return $this->_config_data[$file_name]["vars"][$var_name];
-            } else {
-                if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
-                    return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
-                else
-                    return array();
-            }
-        } else {
-            if (empty($section_name)) {
-                return (array)$this->_config_data[$file_name]["vars"];
-            } else {
-                if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
-                    return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
-                else
-                    return array();
-            }
-        }
-    }
-
-
-    /**
-     * Retrieves config info based on the key.
-     *
-     * @param $file_name string config key (filename/section/var)
-     * @return string|array same as get()
-     * @uses get() retrieves information from config file and returns it
-     */
-    function &get_key($config_key)
-    {
-        list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
-        $result = &$this->get($file_name, $section_name, $var_name);
-        return $result;
-    }
-
-    /**
-     * Get all loaded config file names.
-     *
-     * @return array an array of loaded config file names
-     */
-    function get_file_names()
-    {
-        return array_keys($this->_config_data);
-    }
-
-
-    /**
-     * Get all section names from a loaded file.
-     *
-     * @param string $file_name config file to get section names from
-     * @return array an array of section names from the specified file
-     */
-    function get_section_names($file_name)
-    {
-        $file_name = $this->_config_path . $file_name;
-        if (!isset($this->_config_data[$file_name])) {
-            $this->_trigger_error_msg("Unknown config file '$file_name'");
-            return;
-        }
-
-        return array_keys($this->_config_data[$file_name]["sections"]);
-    }
-
-
-    /**
-     * Get all global or section variable names.
-     *
-     * @param string $file_name config file to get info for
-     * @param string $section_name (optional) section to get info for
-     * @return array an array of variables names from the specified file/section
-     */
-    function get_var_names($file_name, $section = NULL)
-    {
-        if (empty($file_name)) {
-            $this->_trigger_error_msg('Empty config file name');
-            return;
-        } else if (!isset($this->_config_data[$file_name])) {
-            $this->_trigger_error_msg("Unknown config file '$file_name'");
-            return;
-        }
-
-        if (empty($section))
-            return array_keys($this->_config_data[$file_name]["vars"]);
-        else
-            return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
-    }
-
-
-    /**
-     * Clear loaded config data for a certain file or all files.
-     *
-     * @param string $file_name file to clear config data for
-     */
-    function clear($file_name = NULL)
-    {
-        if ($file_name === NULL)
-            $this->_config_data = array();
-        else if (isset($this->_config_data[$file_name]))
-            $this->_config_data[$file_name] = array();
-    }
-
-
-    /**
-     * Load a configuration file manually.
-     *
-     * @param string $file_name file name to load
-     * @param boolean $prepend_path whether current config path should be
-     *                              prepended to the filename
-     */
-    function load_file($file_name, $prepend_path = true)
-    {
-        if ($prepend_path && $this->_config_path != "")
-            $config_file = $this->_config_path . $file_name;
-        else
-            $config_file = $file_name;
-
-        ini_set('track_errors', true);
-        $fp = @fopen($config_file, "r");
-        if (!is_resource($fp)) {
-            $this->_trigger_error_msg("Could not open config file '$config_file'");
-            return false;
-        }
-
-        $contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
-        fclose($fp);
-
-        $this->_config_data[$config_file] = $this->parse_contents($contents);
-        return true;
-    }
-
-    /**
-     * Store the contents of a file manually.
-     *
-     * @param string $config_file file name of the related contents
-     * @param string $contents the file-contents to parse
-     */
-    function set_file_contents($config_file, $contents)
-    {
-        $this->_config_data[$config_file] = $this->parse_contents($contents);
-        return true;
-    }
-
-    /**
-     * parse the source of a configuration file manually.
-     *
-     * @param string $contents the file-contents to parse
-     */
-    function parse_contents($contents)
-    {
-        if($this->fix_newlines) {
-            // fix mac/dos formatted newlines
-            $contents = preg_replace('!\r\n?!', "\n", $contents);
-        }
-
-        $config_data = array();
-        $config_data['sections'] = array();
-        $config_data['vars'] = array();
-
-        /* reference to fill with data */
-        $vars =& $config_data['vars'];
-
-        /* parse file line by line */
-        preg_match_all('!^.*\r?\n?!m', $contents, $match);
-        $lines = $match[0];
-        for ($i=0, $count=count($lines); $i<$count; $i++) {
-            $line = $lines[$i];
-            if (empty($line)) continue;
-
-            if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
-                /* section found */
-                if (substr($match[1], 0, 1) == '.') {
-                    /* hidden section */
-                    if ($this->read_hidden) {
-                        $section_name = substr($match[1], 1);
-                    } else {
-                        /* break reference to $vars to ignore hidden section */
-                        unset($vars);
-                        $vars = array();
-                        continue;
-                    }
-                } else {                    
-                    $section_name = $match[1];
-                }
-                if (!isset($config_data['sections'][$section_name]))
-                    $config_data['sections'][$section_name] = array('vars' => array());
-                $vars =& $config_data['sections'][$section_name]['vars'];
-                continue;
-            }
-
-            if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
-                /* variable found */
-                $var_name = rtrim($match[1]);
-                if (strpos($match[2], '"""') === 0) {
-                    /* handle multiline-value */
-                    $lines[$i] = substr($match[2], 3);
-                    $var_value = '';
-                    while ($i<$count) {
-                        if (($pos = strpos($lines[$i], '"""')) === false) {
-                            $var_value .= $lines[$i++];
-                        } else {
-                            /* end of multiline-value */
-                            $var_value .= substr($lines[$i], 0, $pos);
-                            break;
-                        }
-                    }
-                    $booleanize = false;
-
-                } else {
-                    /* handle simple value */
-                    $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2]));
-                    $booleanize = $this->booleanize;
-
-                }
-                $this->_set_config_var($vars, $var_name, $var_value, $booleanize);
-            }
-            /* else unparsable line / means it is a comment / means ignore it */
-        }
-        return $config_data;
-    }
-
-    /**#@+ @access private */
-    /**
-     * @param array &$container
-     * @param string $var_name
-     * @param mixed $var_value
-     * @param boolean $booleanize determines whether $var_value is converted to
-     *                            to true/false
-     */
-    function _set_config_var(&$container, $var_name, $var_value, $booleanize)
-    {
-        if (substr($var_name, 0, 1) == '.') {
-            if (!$this->read_hidden)
-                return;
-            else
-                $var_name = substr($var_name, 1);
-        }
-
-        if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
-            $this->_trigger_error_msg("Bad variable name '$var_name'");
-            return;
-        }
-
-        if ($booleanize) {
-            if (preg_match("/^(on|true|yes)$/i", $var_value))
-                $var_value = true;
-            else if (preg_match("/^(off|false|no)$/i", $var_value))
-                $var_value = false;
-        }
-
-        if (!isset($container[$var_name]) || $this->overwrite)
-            $container[$var_name] = $var_value;
-        else {
-            settype($container[$var_name], 'array');
-            $container[$var_name][] = $var_value;
-        }
-    }
-
-    /**
-     * @uses trigger_error() creates a PHP warning/error
-     * @param string $error_msg
-     * @param integer $error_type one of
-     */
-    function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
-    {
-        trigger_error("Config_File error: $error_msg", $error_type);
-    }
-    /**#@-*/
-}
-
-?>
diff --git a/include/smarty/Smarty.class.php b/include/smarty/Smarty.class.php
deleted file mode 100644
index 1aae5e6..0000000
--- a/include/smarty/Smarty.class.php
+++ /dev/null
@@ -1,1962 +0,0 @@
-<?php
-
-/**
- * Project:     Smarty: the PHP compiling template engine
- * File:        Smarty.class.php
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 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 for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * For questions, help, comments, discussion, etc., please join the
- * Smarty mailing list. Send a blank e-mail to
- * smarty-discussion-subscribe at googlegroups.com
- *
- * @link http://www.smarty.net/
- * @copyright 2001-2005 New Digital Group, Inc.
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author Andrei Zmievski <andrei at php.net>
- * @package Smarty
- * @version 2.6.29
- */
-
-/* $Id$ */
-
-/**
- * DIR_SEP isn't used anymore, but third party apps might
- */
-if(!defined('DIR_SEP')) {
-    define('DIR_SEP', DIRECTORY_SEPARATOR);
-}
-
-/**
- * set SMARTY_DIR to absolute path to Smarty library files.
- * if not defined, include_path will be used. Sets SMARTY_DIR only if user
- * application has not already defined it.
- */
-
-if (!defined('SMARTY_DIR')) {
-    define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
-}
-
-if (!defined('SMARTY_CORE_DIR')) {
-    define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
-}
-
-define('SMARTY_PHP_PASSTHRU',   0);
-define('SMARTY_PHP_QUOTE',      1);
-define('SMARTY_PHP_REMOVE',     2);
-define('SMARTY_PHP_ALLOW',      3);
-
-/**
- * @package Smarty
- */
-class Smarty
-{
-    /**#@+
-     * Smarty Configuration Section
-     */
-
-    /**
-     * The name of the directory where templates are located.
-     *
-     * @var string
-     */
-    var $template_dir    =  'templates';
-
-    /**
-     * The directory where compiled templates are located.
-     *
-     * @var string
-     */
-    var $compile_dir     =  'templates_c';
-
-    /**
-     * The directory where config files are located.
-     *
-     * @var string
-     */
-    var $config_dir      =  'configs';
-
-    /**
-     * An array of directories searched for plugins.
-     *
-     * @var array
-     */
-    var $plugins_dir     =  array('plugins');
-
-    /**
-     * If debugging is enabled, a debug console window will display
-     * when the page loads (make sure your browser allows unrequested
-     * popup windows)
-     *
-     * @var boolean
-     */
-    var $debugging       =  false;
-
-    /**
-     * When set, smarty does uses this value as error_reporting-level.
-     *
-     * @var integer
-     */
-    var $error_reporting  =  null;
-
-    /**
-     * This is the path to the debug console template. If not set,
-     * the default one will be used.
-     *
-     * @var string
-     */
-    var $debug_tpl       =  '';
-
-    /**
-     * This determines if debugging is enable-able from the browser.
-     * <ul>
-     *  <li>NONE => no debugging control allowed</li>
-     *  <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
-     * </ul>
-     * @link http://www.foo.dom/index.php?SMARTY_DEBUG
-     * @var string
-     */
-    var $debugging_ctrl  =  'NONE';
-
-    /**
-     * This tells Smarty whether to check for recompiling or not. Recompiling
-     * does not need to happen unless a template or config file is changed.
-     * Typically you enable this during development, and disable for
-     * production.
-     *
-     * @var boolean
-     */
-    var $compile_check   =  true;
-
-    /**
-     * This forces templates to compile every time. Useful for development
-     * or debugging.
-     *
-     * @var boolean
-     */
-    var $force_compile   =  false;
-
-    /**
-     * This enables template caching.
-     * <ul>
-     *  <li>0 = no caching</li>
-     *  <li>1 = use class cache_lifetime value</li>
-     *  <li>2 = use cache_lifetime in cache file</li>
-     * </ul>
-     * @var integer
-     */
-    var $caching         =  0;
-
-    /**
-     * The name of the directory for cache files.
-     *
-     * @var string
-     */
-    var $cache_dir       =  'cache';
-
-    /**
-     * This is the number of seconds cached content will persist.
-     * <ul>
-     *  <li>0 = always regenerate cache</li>
-     *  <li>-1 = never expires</li>
-     * </ul>
-     *
-     * @var integer
-     */
-    var $cache_lifetime  =  3600;
-
-    /**
-     * Only used when $caching is enabled. If true, then If-Modified-Since headers
-     * are respected with cached content, and appropriate HTTP headers are sent.
-     * This way repeated hits to a cached page do not send the entire page to the
-     * client every time.
-     *
-     * @var boolean
-     */
-    var $cache_modified_check = false;
-
-    /**
-     * This determines how Smarty handles "<?php ... ?>" tags in templates.
-     * possible values:
-     * <ul>
-     *  <li>SMARTY_PHP_PASSTHRU -> print tags as plain text</li>
-     *  <li>SMARTY_PHP_QUOTE    -> escape tags as entities</li>
-     *  <li>SMARTY_PHP_REMOVE   -> remove php tags</li>
-     *  <li>SMARTY_PHP_ALLOW    -> execute php tags</li>
-     * </ul>
-     *
-     * @var integer
-     */
-    var $php_handling    =  SMARTY_PHP_PASSTHRU;
-
-    /**
-     * This enables template security. When enabled, many things are restricted
-     * in the templates that normally would go unchecked. This is useful when
-     * untrusted parties are editing templates and you want a reasonable level
-     * of security. (no direct execution of PHP in templates for example)
-     *
-     * @var boolean
-     */
-    var $security       =   false;
-
-    /**
-     * This is the list of template directories that are considered secure. This
-     * is used only if {@link $security} is enabled. One directory per array
-     * element.  {@link $template_dir} is in this list implicitly.
-     *
-     * @var array
-     */
-    var $secure_dir     =   array();
-
-    /**
-     * These are the security settings for Smarty. They are used only when
-     * {@link $security} is enabled.
-     *
-     * @var array
-     */
-    var $security_settings  = array(
-                                    'PHP_HANDLING'    => false,
-                                    'IF_FUNCS'        => array('array', 'list',
-                                                               'isset', 'empty',
-                                                               'count', 'sizeof',
-                                                               'in_array', 'is_array',
-                                                               'true', 'false', 'null'),
-                                    'INCLUDE_ANY'     => false,
-                                    'PHP_TAGS'        => false,
-                                    'MODIFIER_FUNCS'  => array('count'),
-                                    'ALLOW_CONSTANTS'  => false,
-                                    'ALLOW_SUPER_GLOBALS' => true
-                                   );
-
-    /**
-     * This is an array of directories where trusted php scripts reside.
-     * {@link $security} is disabled during their inclusion/execution.
-     *
-     * @var array
-     */
-    var $trusted_dir        = array();
-
-    /**
-     * The left delimiter used for the template tags.
-     *
-     * @var string
-     */
-    var $left_delimiter  =  '{';
-
-    /**
-     * The right delimiter used for the template tags.
-     *
-     * @var string
-     */
-    var $right_delimiter =  '}';
-
-    /**
-     * The order in which request variables are registered, similar to
-     * variables_order in php.ini E = Environment, G = GET, P = POST,
-     * C = Cookies, S = Server
-     *
-     * @var string
-     */
-    var $request_vars_order    = 'EGPCS';
-
-    /**
-     * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false)
-     * are uses as request-vars or $_*[]-vars. note: if
-     * request_use_auto_globals is true, then $request_vars_order has
-     * no effect, but the php-ini-value "gpc_order"
-     *
-     * @var boolean
-     */
-    var $request_use_auto_globals      = true;
-
-    /**
-     * Set this if you want different sets of compiled files for the same
-     * templates. This is useful for things like different languages.
-     * Instead of creating separate sets of templates per language, you
-     * set different compile_ids like 'en' and 'de'.
-     *
-     * @var string
-     */
-    var $compile_id            = null;
-
-    /**
-     * This tells Smarty whether or not to use sub dirs in the cache/ and
-     * templates_c/ directories. sub directories better organized, but
-     * may not work well with PHP safe mode enabled.
-     *
-     * @var boolean
-     *
-     */
-    var $use_sub_dirs          = false;
-
-    /**
-     * This is a list of the modifiers to apply to all template variables.
-     * Put each modifier in a separate array element in the order you want
-     * them applied. example: <code>array('escape:"htmlall"');</code>
-     *
-     * @var array
-     */
-    var $default_modifiers        = array();
-
-    /**
-     * This is the resource type to be used when not specified
-     * at the beginning of the resource path. examples:
-     * $smarty->display('file:index.tpl');
-     * $smarty->display('db:index.tpl');
-     * $smarty->display('index.tpl'); // will use default resource type
-     * {include file="file:index.tpl"}
-     * {include file="db:index.tpl"}
-     * {include file="index.tpl"} {* will use default resource type *}
-     *
-     * @var array
-     */
-    var $default_resource_type    = 'file';
-
-    /**
-     * The function used for cache file handling. If not set, built-in caching is used.
-     *
-     * @var null|string function name
-     */
-    var $cache_handler_func   = null;
-
-    /**
-     * This indicates which filters are automatically loaded into Smarty.
-     *
-     * @var array array of filter names
-     */
-    var $autoload_filters = array();
-
-    /**#@+
-     * @var boolean
-     */
-    /**
-     * This tells if config file vars of the same name overwrite each other or not.
-     * if disabled, same name variables are accumulated in an array.
-     */
-    var $config_overwrite = true;
-
-    /**
-     * This tells whether or not to automatically booleanize config file variables.
-     * If enabled, then the strings "on", "true", and "yes" are treated as boolean
-     * true, and "off", "false" and "no" are treated as boolean false.
-     */
-    var $config_booleanize = true;
-
-    /**
-     * This tells whether hidden sections [.foobar] are readable from the
-     * tempalates or not. Normally you would never allow this since that is
-     * the point behind hidden sections: the application can access them, but
-     * the templates cannot.
-     */
-    var $config_read_hidden = false;
-
-    /**
-     * This tells whether or not automatically fix newlines in config files.
-     * It basically converts \r (mac) or \r\n (dos) to \n
-     */
-    var $config_fix_newlines = true;
-    /**#@-*/
-
-    /**
-     * If a template cannot be found, this PHP function will be executed.
-     * Useful for creating templates on-the-fly or other special action.
-     *
-     * @var string function name
-     */
-    var $default_template_handler_func = '';
-
-    /**
-     * The file that contains the compiler class. This can a full
-     * pathname, or relative to the php_include path.
-     *
-     * @var string
-     */
-    var $compiler_file        =    'Smarty_Compiler.class.php';
-
-    /**
-     * The class used for compiling templates.
-     *
-     * @var string
-     */
-    var $compiler_class        =   'Smarty_Compiler';
-
-    /**
-     * The class used to load config vars.
-     *
-     * @var string
-     */
-    var $config_class          =   'Config_File';
-
-/**#@+
- * END Smarty Configuration Section
- * There should be no need to touch anything below this line.
- * @access private
- */
-    /**
-     * where assigned template vars are kept
-     *
-     * @var array
-     */
-    var $_tpl_vars             = array();
-
-    /**
-     * stores run-time $smarty.* vars
-     *
-     * @var null|array
-     */
-    var $_smarty_vars          = null;
-
-    /**
-     * keeps track of sections
-     *
-     * @var array
-     */
-    var $_sections             = array();
-
-    /**
-     * keeps track of foreach blocks
-     *
-     * @var array
-     */
-    var $_foreach              = array();
-
-    /**
-     * keeps track of tag hierarchy
-     *
-     * @var array
-     */
-    var $_tag_stack            = array();
-
-    /**
-     * configuration object
-     *
-     * @var Config_file
-     */
-    var $_conf_obj             = null;
-
-    /**
-     * loaded configuration settings
-     *
-     * @var array
-     */
-    var $_config               = array(array('vars'  => array(), 'files' => array()));
-
-    /**
-     * md5 checksum of the string 'Smarty'
-     *
-     * @var string
-     */
-    var $_smarty_md5           = 'f8d698aea36fcbead2b9d5359ffca76f';
-
-    /**
-     * Smarty version number
-     *
-     * @var string
-     */
-    var $_version              = '2.6.29';
-
-    /**
-     * current template inclusion depth
-     *
-     * @var integer
-     */
-    var $_inclusion_depth      = 0;
-
-    /**
-     * for different compiled templates
-     *
-     * @var string
-     */
-    var $_compile_id           = null;
-
-    /**
-     * text in URL to enable debug mode
-     *
-     * @var string
-     */
-    var $_smarty_debug_id      = 'SMARTY_DEBUG';
-
-    /**
-     * debugging information for debug console
-     *
-     * @var array
-     */
-    var $_smarty_debug_info    = array();
-
-    /**
-     * info that makes up a cache file
-     *
-     * @var array
-     */
-    var $_cache_info           = array();
-
-    /**
-     * default file permissions
-     *
-     * @var integer
-     */
-    var $_file_perms           = 0644;
-
-    /**
-     * default dir permissions
-     *
-     * @var integer
-     */
-    var $_dir_perms               = 0771;
-
-    /**
-     * registered objects
-     *
-     * @var array
-     */
-    var $_reg_objects           = array();
-
-    /**
-     * table keeping track of plugins
-     *
-     * @var array
-     */
-    var $_plugins              = array(
-                                       'modifier'      => array(),
-                                       'function'      => array(),
-                                       'block'         => array(),
-                                       'compiler'      => array(),
-                                       'prefilter'     => array(),
-                                       'postfilter'    => array(),
-                                       'outputfilter'  => array(),
-                                       'resource'      => array(),
-                                       'insert'        => array());
-
-
-    /**
-     * cache serials
-     *
-     * @var array
-     */
-    var $_cache_serials = array();
-
-    /**
-     * name of optional cache include file
-     *
-     * @var string
-     */
-    var $_cache_include = null;
-
-    /**
-     * indicate if the current code is used in a compiled
-     * include
-     *
-     * @var string
-     */
-    var $_cache_including = false;
-
-    /**#@-*/
-    /**
-     * The class constructor.
-     */
-    public function __construct()
-    {
-      $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
-                    : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
-    }
-
-    /**
-     * assigns values to template variables
-     *
-     * @param array|string $tpl_var the template variable name(s)
-     * @param mixed $value the value to assign
-     */
-    function assign($tpl_var, $value = null)
-    {
-        if (is_array($tpl_var)){
-            foreach ($tpl_var as $key => $val) {
-                if ($key != '') {
-                    $this->_tpl_vars[$key] = $val;
-                }
-            }
-        } else {
-            if ($tpl_var != '')
-                $this->_tpl_vars[$tpl_var] = $value;
-        }
-    }
-
-    /**
-     * assigns values to template variables by reference
-     *
-     * @param string $tpl_var the template variable name
-     * @param mixed $value the referenced value to assign
-     */
-    function assign_by_ref($tpl_var, &$value)
-    {
-        if ($tpl_var != '')
-            $this->_tpl_vars[$tpl_var] = &$value;
-    }
-
-    /**
-     * appends values to template variables
-     *
-     * @param array|string $tpl_var the template variable name(s)
-     * @param mixed $value the value to append
-     */
-    function append($tpl_var, $value=null, $merge=false)
-    {
-        if (is_array($tpl_var)) {
-            // $tpl_var is an array, ignore $value
-            foreach ($tpl_var as $_key => $_val) {
-                if ($_key != '') {
-                    if(!@is_array($this->_tpl_vars[$_key])) {
-                        settype($this->_tpl_vars[$_key],'array');
-                    }
-                    if($merge && is_array($_val)) {
-                        foreach($_val as $_mkey => $_mval) {
-                            $this->_tpl_vars[$_key][$_mkey] = $_mval;
-                        }
-                    } else {
-                        $this->_tpl_vars[$_key][] = $_val;
-                    }
-                }
-            }
-        } else {
-            if ($tpl_var != '' && isset($value)) {
-                if(!@is_array($this->_tpl_vars[$tpl_var])) {
-                    settype($this->_tpl_vars[$tpl_var],'array');
-                }
-                if($merge && is_array($value)) {
-                    foreach($value as $_mkey => $_mval) {
-                        $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
-                    }
-                } else {
-                    $this->_tpl_vars[$tpl_var][] = $value;
-                }
-            }
-        }
-    }
-
-    /**
-     * appends values to template variables by reference
-     *
-     * @param string $tpl_var the template variable name
-     * @param mixed $value the referenced value to append
-     */
-    function append_by_ref($tpl_var, &$value, $merge=false)
-    {
-        if ($tpl_var != '' && isset($value)) {
-            if(!@is_array($this->_tpl_vars[$tpl_var])) {
-             settype($this->_tpl_vars[$tpl_var],'array');
-            }
-            if ($merge && is_array($value)) {
-                foreach($value as $_key => $_val) {
-                    $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
-                }
-            } else {
-                $this->_tpl_vars[$tpl_var][] = &$value;
-            }
-        }
-    }
-
-
-    /**
-     * clear the given assigned template variable.
-     *
-     * @param string $tpl_var the template variable to clear
-     */
-    function clear_assign($tpl_var)
-    {
-        if (is_array($tpl_var))
-            foreach ($tpl_var as $curr_var)
-                unset($this->_tpl_vars[$curr_var]);
-        else
-            unset($this->_tpl_vars[$tpl_var]);
-    }
-
-
-    /**
-     * Registers custom function to be used in templates
-     *
-     * @param string $function the name of the template function
-     * @param string $function_impl the name of the PHP function to register
-     */
-    function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
-    {
-        $this->_plugins['function'][$function] =
-            array($function_impl, null, null, false, $cacheable, $cache_attrs);
-
-    }
-
-    /**
-     * Unregisters custom function
-     *
-     * @param string $function name of template function
-     */
-    function unregister_function($function)
-    {
-        unset($this->_plugins['function'][$function]);
-    }
-
-    /**
-     * Registers object to be used in templates
-     *
-     * @param string $object name of template object
-     * @param object &$object_impl the referenced PHP object to register
-     * @param null|array $allowed list of allowed methods (empty = all)
-     * @param boolean $smarty_args smarty argument format, else traditional
-     * @param null|array $block_functs list of methods that are block format
-     */
-    function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
-    {
-        settype($allowed, 'array');
-        settype($smarty_args, 'boolean');
-        $this->_reg_objects[$object] =
-            array(&$object_impl, $allowed, $smarty_args, $block_methods);
-    }
-
-    /**
-     * Unregisters object
-     *
-     * @param string $object name of template object
-     */
-    function unregister_object($object)
-    {
-        unset($this->_reg_objects[$object]);
-    }
-
-
-    /**
-     * Registers block function to be used in templates
-     *
-     * @param string $block name of template block
-     * @param string $block_impl PHP function to register
-     */
-    function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
-    {
-        $this->_plugins['block'][$block] =
-            array($block_impl, null, null, false, $cacheable, $cache_attrs);
-    }
-
-    /**
-     * Unregisters block function
-     *
-     * @param string $block name of template function
-     */
-    function unregister_block($block)
-    {
-        unset($this->_plugins['block'][$block]);
-    }
-
-    /**
-     * Registers compiler function
-     *
-     * @param string $function name of template function
-     * @param string $function_impl name of PHP function to register
-     */
-    function register_compiler_function($function, $function_impl, $cacheable=true)
-    {
-        $this->_plugins['compiler'][$function] =
-            array($function_impl, null, null, false, $cacheable);
-    }
-
-    /**
-     * Unregisters compiler function
-     *
-     * @param string $function name of template function
-     */
-    function unregister_compiler_function($function)
-    {
-        unset($this->_plugins['compiler'][$function]);
-    }
-
-    /**
-     * Registers modifier to be used in templates
-     *
-     * @param string $modifier name of template modifier
-     * @param string $modifier_impl name of PHP function to register
-     */
-    function register_modifier($modifier, $modifier_impl)
-    {
-        $this->_plugins['modifier'][$modifier] =
-            array($modifier_impl, null, null, false);
-    }
-
-    /**
-     * Unregisters modifier
-     *
-     * @param string $modifier name of template modifier
-     */
-    function unregister_modifier($modifier)
-    {
-        unset($this->_plugins['modifier'][$modifier]);
-    }
-
-    /**
-     * Registers a resource to fetch a template
-     *
-     * @param string $type name of resource
-     * @param array $functions array of functions to handle resource
-     */
-    function register_resource($type, $functions)
-    {
-        if (count($functions)==4) {
-            $this->_plugins['resource'][$type] =
-                array($functions, false);
-
-        } elseif (count($functions)==5) {
-            $this->_plugins['resource'][$type] =
-                array(array(array(&$functions[0], $functions[1])
-                            ,array(&$functions[0], $functions[2])
-                            ,array(&$functions[0], $functions[3])
-                            ,array(&$functions[0], $functions[4]))
-                      ,false);
-
-        } else {
-            $this->trigger_error("malformed function-list for '$type' in register_resource");
-
-        }
-    }
-
-    /**
-     * Unregisters a resource
-     *
-     * @param string $type name of resource
-     */
-    function unregister_resource($type)
-    {
-        unset($this->_plugins['resource'][$type]);
-    }
-
-    /**
-     * Registers a prefilter function to apply
-     * to a template before compiling
-     *
-     * @param callback $function
-     */
-    function register_prefilter($function)
-    {
-        $this->_plugins['prefilter'][$this->_get_filter_name($function)]
-            = array($function, null, null, false);
-    }
-
-    /**
-     * Unregisters a prefilter function
-     *
-     * @param callback $function
-     */
-    function unregister_prefilter($function)
-    {
-        unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
-    }
-
-    /**
-     * Registers a postfilter function to apply
-     * to a compiled template after compilation
-     *
-     * @param callback $function
-     */
-    function register_postfilter($function)
-    {
-        $this->_plugins['postfilter'][$this->_get_filter_name($function)]
-            = array($function, null, null, false);
-    }
-
-    /**
-     * Unregisters a postfilter function
-     *
-     * @param callback $function
-     */
-    function unregister_postfilter($function)
-    {
-        unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
-    }
-
-    /**
-     * Registers an output filter function to apply
-     * to a template output
-     *
-     * @param callback $function
-     */
-    function register_outputfilter($function)
-    {
-        $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
-            = array($function, null, null, false);
-    }
-
-    /**
-     * Unregisters an outputfilter function
-     *
-     * @param callback $function
-     */
-    function unregister_outputfilter($function)
-    {
-        unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
-    }
-
-    /**
-     * load a filter of specified type and name
-     *
-     * @param string $type filter type
-     * @param string $name filter name
-     */
-    function load_filter($type, $name)
-    {
-        switch ($type) {
-            case 'output':
-                $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
-                require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
-                smarty_core_load_plugins($_params, $this);
-                break;
-
-            case 'pre':
-            case 'post':
-                if (!isset($this->_plugins[$type . 'filter'][$name]))
-                    $this->_plugins[$type . 'filter'][$name] = false;
-                break;
-        }
-    }
-
-    /**
-     * clear cached content for the given template and cache id
-     *
-     * @param string $tpl_file name of template file
-     * @param string $cache_id name of cache_id
-     * @param string $compile_id name of compile_id
-     * @param string $exp_time expiration time
-     * @return boolean
-     */
-    function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
-    {
-
-        if (!isset($compile_id))
-            $compile_id = $this->compile_id;
-
-        if (!isset($tpl_file))
-            $compile_id = null;
-
-        $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
-
-        if (!empty($this->cache_handler_func)) {
-            return call_user_func_array($this->cache_handler_func,
-                                  array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
-        } else {
-            $_params = array('auto_base' => $this->cache_dir,
-                            'auto_source' => $tpl_file,
-                            'auto_id' => $_auto_id,
-                            'exp_time' => $exp_time);
-            require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
-            return smarty_core_rm_auto($_params, $this);
-        }
-
-    }
-
-
-    /**
-     * clear the entire contents of cache (all templates)
-     *
-     * @param string $exp_time expire time
-     * @return boolean results of {@link smarty_core_rm_auto()}
-     */
-    function clear_all_cache($exp_time = null)
-    {
-        return $this->clear_cache(null, null, null, $exp_time);
-    }
-
-
-    /**
-     * test to see if valid cache exists for this template
-     *
-     * @param string $tpl_file name of template file
-     * @param string $cache_id
-     * @param string $compile_id
-     * @return string|false results of {@link _read_cache_file()}
-     */
-    function is_cached($tpl_file, $cache_id = null, $compile_id = null)
-    {
-        if (!$this->caching)
-            return false;
-
-        if (!isset($compile_id))
-            $compile_id = $this->compile_id;
-
-        $_params = array(
-            'tpl_file' => $tpl_file,
-            'cache_id' => $cache_id,
-            'compile_id' => $compile_id
-        );
-        require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
-        return smarty_core_read_cache_file($_params, $this);
-    }
-
-
-    /**
-     * clear all the assigned template variables.
-     *
-     */
-    function clear_all_assign()
-    {
-        $this->_tpl_vars = array();
-    }
-
-    /**
-     * clears compiled version of specified template resource,
-     * or all compiled template files if one is not specified.
-     * This function is for advanced use only, not normally needed.
-     *
-     * @param string $tpl_file
-     * @param string $compile_id
-     * @param string $exp_time
-     * @return boolean results of {@link smarty_core_rm_auto()}
-     */
-    function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
-    {
-        if (!isset($compile_id)) {
-            $compile_id = $this->compile_id;
-        }
-        $_params = array('auto_base' => $this->compile_dir,
-                        'auto_source' => $tpl_file,
-                        'auto_id' => $compile_id,
-                        'exp_time' => $exp_time,
-                        'extensions' => array('.inc', '.php'));
-        require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
-        return smarty_core_rm_auto($_params, $this);
-    }
-
-    /**
-     * Checks whether requested template exists.
-     *
-     * @param string $tpl_file
-     * @return boolean
-     */
-    function template_exists($tpl_file)
-    {
-        $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
-        return $this->_fetch_resource_info($_params);
-    }
-
-    /**
-     * Returns an array containing template variables
-     *
-     * @param string $name
-     * @param string $type
-     * @return array
-     */
-    function &get_template_vars($name=null)
-    {
-        if(!isset($name)) {
-            return $this->_tpl_vars;
-        } elseif(isset($this->_tpl_vars[$name])) {
-            return $this->_tpl_vars[$name];
-        } else {
-            // var non-existant, return valid reference
-            $_tmp = null;
-            return $_tmp;
-        }
-    }
-
-    /**
-     * Returns an array containing config variables
-     *
-     * @param string $name
-     * @param string $type
-     * @return array
-     */
-    function &get_config_vars($name=null)
-    {
-        if(!isset($name) && is_array($this->_config[0])) {
-            return $this->_config[0]['vars'];
-        } else if(isset($this->_config[0]['vars'][$name])) {
-            return $this->_config[0]['vars'][$name];
-        } else {
-            // var non-existant, return valid reference
-            $_tmp = null;
-            return $_tmp;
-        }
-    }
-
-    /**
-     * trigger Smarty error
-     *
-     * @param string $error_msg
-     * @param integer $error_type
-     */
-    function trigger_error($error_msg, $error_type = E_USER_WARNING)
-    {
-        $msg = htmlentities($error_msg);
-        trigger_error("Smarty error: $msg", $error_type);
-    }
-
-
-    /**
-     * executes & displays the template results
-     *
-     * @param string $resource_name
-     * @param string $cache_id
-     * @param string $compile_id
-     */
-    function display($resource_name, $cache_id = null, $compile_id = null)
-    {
-        $this->fetch($resource_name, $cache_id, $compile_id, true);
-    }
-
-    /**
-     * executes & returns or displays the template results
-     *
-     * @param string $resource_name
-     * @param string $cache_id
-     * @param string $compile_id
-     * @param boolean $display
-     */
-    function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
-    {
-        static $_cache_info = array();
-
-        $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
-               ? $this->error_reporting : error_reporting() & ~E_NOTICE);
-
-        if (!$this->debugging && $this->debugging_ctrl == 'URL') {
-            $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
-            if (@strstr($_query_string, $this->_smarty_debug_id)) {
-                if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
-                    // enable debugging for this browser session
-                    @setcookie('SMARTY_DEBUG', true);
-                    $this->debugging = true;
-                } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
-                    // disable debugging for this browser session
-                    @setcookie('SMARTY_DEBUG', false);
-                    $this->debugging = false;
-                } else {
-                    // enable debugging for this page
-                    $this->debugging = true;
-                }
-            } else {
-                $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
-            }
-        }
-
-        if ($this->debugging) {
-            // capture time for debugging info
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $_debug_start_time = smarty_core_get_microtime($_params, $this);
-            $this->_smarty_debug_info[] = array('type'      => 'template',
-                                                'filename'  => $resource_name,
-                                                'depth'     => 0);
-            $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
-        }
-
-        if (!isset($compile_id)) {
-            $compile_id = $this->compile_id;
-        }
-
-        $this->_compile_id = $compile_id;
-        $this->_inclusion_depth = 0;
-
-        if ($this->caching) {
-            // save old cache_info, initialize cache_info
-            array_push($_cache_info, $this->_cache_info);
-            $this->_cache_info = array();
-            $_params = array(
-                'tpl_file' => $resource_name,
-                'cache_id' => $cache_id,
-                'compile_id' => $compile_id,
-                'results' => null
-            );
-            require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
-            if (smarty_core_read_cache_file($_params, $this)) {
-                $_smarty_results = $_params['results'];
-                if (!empty($this->_cache_info['insert_tags'])) {
-                    $_params = array('plugins' => $this->_cache_info['insert_tags']);
-                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
-                    smarty_core_load_plugins($_params, $this);
-                    $_params = array('results' => $_smarty_results);
-                    require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
-                    $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
-                }
-                if (!empty($this->_cache_info['cache_serials'])) {
-                    $_params = array('results' => $_smarty_results);
-                    require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
-                    $_smarty_results = smarty_core_process_compiled_include($_params, $this);
-                }
-
-
-                if ($display) {
-                    if ($this->debugging)
-                    {
-                        // capture time for debugging info
-                        $_params = array();
-                        require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-                        $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
-                        require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
-                        $_smarty_results .= smarty_core_display_debug_console($_params, $this);
-                    }
-                    if ($this->cache_modified_check) {
-                        $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
-                        $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
-                        $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
-                        if (@count($this->_cache_info['insert_tags']) == 0
-                            && !$this->_cache_serials
-                            && $_gmt_mtime == $_last_modified_date) {
-                            if (php_sapi_name()=='cgi')
-                                header('Status: 304 Not Modified');
-                            else
-                                header('HTTP/1.1 304 Not Modified');
-
-                        } else {
-                            header('Last-Modified: '.$_gmt_mtime);
-                            echo $_smarty_results;
-                        }
-                    } else {
-                            echo $_smarty_results;
-                    }
-                    error_reporting($_smarty_old_error_level);
-                    // restore initial cache_info
-                    $this->_cache_info = array_pop($_cache_info);
-                    return true;
-                } else {
-                    error_reporting($_smarty_old_error_level);
-                    // restore initial cache_info
-                    $this->_cache_info = array_pop($_cache_info);
-                    return $_smarty_results;
-                }
-            } else {
-                $this->_cache_info['template'][$resource_name] = true;
-                if ($this->cache_modified_check && $display) {
-                    header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
-                }
-            }
-        }
-
-        // load filters that are marked as autoload
-        if (count($this->autoload_filters)) {
-            foreach ($this->autoload_filters as $_filter_type => $_filters) {
-                foreach ($_filters as $_filter) {
-                    $this->load_filter($_filter_type, $_filter);
-                }
-            }
-        }
-
-        $_smarty_compile_path = $this->_get_compile_path($resource_name);
-
-        // if we just need to display the results, don't perform output
-        // buffering - for speed
-        $_cache_including = $this->_cache_including;
-        $this->_cache_including = false;
-        if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
-            if ($this->_is_compiled($resource_name, $_smarty_compile_path)
-                    || $this->_compile_resource($resource_name, $_smarty_compile_path))
-            {
-                include($_smarty_compile_path);
-            }
-        } else {
-            ob_start();
-            if ($this->_is_compiled($resource_name, $_smarty_compile_path)
-                    || $this->_compile_resource($resource_name, $_smarty_compile_path))
-            {
-                include($_smarty_compile_path);
-            }
-            $_smarty_results = ob_get_contents();
-            ob_end_clean();
-
-            foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
-                $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
-            }
-        }
-
-        if ($this->caching) {
-            $_params = array('tpl_file' => $resource_name,
-                        'cache_id' => $cache_id,
-                        'compile_id' => $compile_id,
-                        'results' => $_smarty_results);
-            require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
-            smarty_core_write_cache_file($_params, $this);
-            require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
-            $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
-
-            if ($this->_cache_serials) {
-                // strip nocache-tags from output
-                $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
-                                                ,''
-                                                ,$_smarty_results);
-            }
-            // restore initial cache_info
-            $this->_cache_info = array_pop($_cache_info);
-        }
-        $this->_cache_including = $_cache_including;
-
-        if ($display) {
-            if (isset($_smarty_results)) { echo $_smarty_results; }
-            if ($this->debugging) {
-                // capture time for debugging info
-                $_params = array();
-                require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-                $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
-                require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
-                echo smarty_core_display_debug_console($_params, $this);
-            }
-            error_reporting($_smarty_old_error_level);
-            return;
-        } else {
-            error_reporting($_smarty_old_error_level);
-            if (isset($_smarty_results)) { return $_smarty_results; }
-        }
-    }
-
-    /**
-     * load configuration values
-     *
-     * @param string $file
-     * @param string $section
-     * @param string $scope
-     */
-    function config_load($file, $section = null, $scope = 'global')
-    {
-        require_once($this->_get_plugin_filepath('function', 'config_load'));
-        smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
-    }
-
-    /**
-     * return a reference to a registered object
-     *
-     * @param string $name
-     * @return object
-     */
-    function &get_registered_object($name) {
-        if (!isset($this->_reg_objects[$name]))
-        $this->_trigger_fatal_error("'$name' is not a registered object");
-
-        if (!is_object($this->_reg_objects[$name][0]))
-        $this->_trigger_fatal_error("registered '$name' is not an object");
-
-        return $this->_reg_objects[$name][0];
-    }
-
-    /**
-     * clear configuration values
-     *
-     * @param string $var
-     */
-    function clear_config($var = null)
-    {
-        if(!isset($var)) {
-            // clear all values
-            $this->_config = array(array('vars'  => array(),
-                                         'files' => array()));
-        } else {
-            unset($this->_config[0]['vars'][$var]);
-        }
-    }
-
-    /**
-     * get filepath of requested plugin
-     *
-     * @param string $type
-     * @param string $name
-     * @return string|false
-     */
-    function _get_plugin_filepath($type, $name)
-    {
-        $_params = array('type' => $type, 'name' => $name);
-        require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
-        return smarty_core_assemble_plugin_filepath($_params, $this);
-    }
-
-   /**
-     * test if resource needs compiling
-     *
-     * @param string $resource_name
-     * @param string $compile_path
-     * @return boolean
-     */
-    function _is_compiled($resource_name, $compile_path)
-    {
-        if (!$this->force_compile && file_exists($compile_path)) {
-            if (!$this->compile_check) {
-                // no need to check compiled file
-                return true;
-            } else {
-                // get file source and timestamp
-                $_params = array('resource_name' => $resource_name, 'get_source'=>false);
-                if (!$this->_fetch_resource_info($_params)) {
-                    return false;
-                }
-                if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
-                    // template not expired, no recompile
-                    return true;
-                } else {
-                    // compile template
-                    return false;
-                }
-            }
-        } else {
-            // compiled template does not exist, or forced compile
-            return false;
-        }
-    }
-
-   /**
-     * compile the template
-     *
-     * @param string $resource_name
-     * @param string $compile_path
-     * @return boolean
-     */
-    function _compile_resource($resource_name, $compile_path)
-    {
-
-        $_params = array('resource_name' => $resource_name);
-        if (!$this->_fetch_resource_info($_params)) {
-            return false;
-        }
-
-        $_source_content = $_params['source_content'];
-        $_cache_include    = substr($compile_path, 0, -4).'.inc';
-
-        if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
-            // if a _cache_serial was set, we also have to write an include-file:
-            if ($this->_cache_include_info) {
-                require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
-                smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)),  $this);
-            }
-
-            $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
-            require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
-            smarty_core_write_compiled_resource($_params, $this);
-
-            return true;
-        } else {
-            return false;
-        }
-
-    }
-
-   /**
-     * compile the given source
-     *
-     * @param string $resource_name
-     * @param string $source_content
-     * @param string $compiled_content
-     * @return boolean
-     */
-    function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
-    {
-        if (file_exists(SMARTY_DIR . $this->compiler_file)) {
-            require_once(SMARTY_DIR . $this->compiler_file);
-        } else {
-            // use include_path
-            require_once($this->compiler_file);
-        }
-
-
-        $smarty_compiler = new $this->compiler_class;
-
-        $smarty_compiler->template_dir      = $this->template_dir;
-        $smarty_compiler->compile_dir       = $this->compile_dir;
-        $smarty_compiler->plugins_dir       = $this->plugins_dir;
-        $smarty_compiler->config_dir        = $this->config_dir;
-        $smarty_compiler->force_compile     = $this->force_compile;
-        $smarty_compiler->caching           = $this->caching;
-        $smarty_compiler->php_handling      = $this->php_handling;
-        $smarty_compiler->left_delimiter    = $this->left_delimiter;
-        $smarty_compiler->right_delimiter   = $this->right_delimiter;
-        $smarty_compiler->_version          = $this->_version;
-        $smarty_compiler->security          = $this->security;
-        $smarty_compiler->secure_dir        = $this->secure_dir;
-        $smarty_compiler->security_settings = $this->security_settings;
-        $smarty_compiler->trusted_dir       = $this->trusted_dir;
-        $smarty_compiler->use_sub_dirs      = $this->use_sub_dirs;
-        $smarty_compiler->_reg_objects      = &$this->_reg_objects;
-        $smarty_compiler->_plugins          = &$this->_plugins;
-        $smarty_compiler->_tpl_vars         = &$this->_tpl_vars;
-        $smarty_compiler->default_modifiers = $this->default_modifiers;
-        $smarty_compiler->compile_id        = $this->_compile_id;
-        $smarty_compiler->_config            = $this->_config;
-        $smarty_compiler->request_use_auto_globals  = $this->request_use_auto_globals;
-
-        if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
-            $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
-        }
-        $smarty_compiler->_cache_include = $cache_include_path;
-
-
-        $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
-
-        if ($smarty_compiler->_cache_serial) {
-            $this->_cache_include_info = array(
-                'cache_serial'=>$smarty_compiler->_cache_serial
-                ,'plugins_code'=>$smarty_compiler->_plugins_code
-                ,'include_file_path' => $cache_include_path);
-
-        } else {
-            $this->_cache_include_info = null;
-
-        }
-
-        return $_results;
-    }
-
-    /**
-     * Get the compile path for this resource
-     *
-     * @param string $resource_name
-     * @return string results of {@link _get_auto_filename()}
-     */
-    function _get_compile_path($resource_name)
-    {
-        return $this->_get_auto_filename($this->compile_dir, $resource_name,
-                                         $this->_compile_id) . '.php';
-    }
-
-    /**
-     * fetch the template info. Gets timestamp, and source
-     * if get_source is true
-     *
-     * sets $source_content to the source of the template, and
-     * $resource_timestamp to its time stamp
-     * @param string $resource_name
-     * @param string $source_content
-     * @param integer $resource_timestamp
-     * @param boolean $get_source
-     * @param boolean $quiet
-     * @return boolean
-     */
-
-    function _fetch_resource_info(&$params)
-    {
-        if(!isset($params['get_source'])) { $params['get_source'] = true; }
-        if(!isset($params['quiet'])) { $params['quiet'] = false; }
-
-        $_return = false;
-        $_params = array('resource_name' => $params['resource_name']) ;
-        if (isset($params['resource_base_path']))
-            $_params['resource_base_path'] = $params['resource_base_path'];
-        else
-            $_params['resource_base_path'] = $this->template_dir;
-
-        if ($this->_parse_resource_name($_params)) {
-            $_resource_type = $_params['resource_type'];
-            $_resource_name = $_params['resource_name'];
-            switch ($_resource_type) {
-                case 'file':
-                    if ($params['get_source']) {
-                        $params['source_content'] = $this->_read_file($_resource_name);
-                    }
-                    $params['resource_timestamp'] = filemtime($_resource_name);
-                    $_return = is_file($_resource_name) && is_readable($_resource_name);
-                    break;
-
-                default:
-                    // call resource functions to fetch the template source and timestamp
-                    if ($params['get_source']) {
-                        $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
-                            call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
-                                                 array($_resource_name, &$params['source_content'], &$this));
-                    } else {
-                        $_source_return = true;
-                    }
-
-                    $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
-                        call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
-                                             array($_resource_name, &$params['resource_timestamp'], &$this));
-
-                    $_return = $_source_return && $_timestamp_return;
-                    break;
-            }
-        }
-
-        if (!$_return) {
-            // see if we can get a template with the default template handler
-            if (!empty($this->default_template_handler_func)) {
-                if (!is_callable($this->default_template_handler_func)) {
-                    $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
-                } else {
-                    $_return = call_user_func_array(
-                        $this->default_template_handler_func,
-                        array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
-                }
-            }
-        }
-
-        if (!$_return) {
-            if (!$params['quiet']) {
-                $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
-            }
-        } else if ($_return && $this->security) {
-            require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
-            if (!smarty_core_is_secure($_params, $this)) {
-                if (!$params['quiet'])
-                    $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
-                $params['source_content'] = null;
-                $params['resource_timestamp'] = null;
-                return false;
-            }
-        }
-        return $_return;
-    }
-
-
-    /**
-     * parse out the type and name from the resource
-     *
-     * @param string $resource_base_path
-     * @param string $resource_name
-     * @param string $resource_type
-     * @param string $resource_name
-     * @return boolean
-     */
-
-    function _parse_resource_name(&$params)
-    {
-
-        // split tpl_path by the first colon
-        $_resource_name_parts = explode(':', $params['resource_name'], 2);
-
-        if (count($_resource_name_parts) == 1) {
-            // no resource type given
-            $params['resource_type'] = $this->default_resource_type;
-            $params['resource_name'] = $_resource_name_parts[0];
-        } else {
-            if(strlen($_resource_name_parts[0]) == 1) {
-                // 1 char is not resource type, but part of filepath
-                $params['resource_type'] = $this->default_resource_type;
-                $params['resource_name'] = $params['resource_name'];
-            } else {
-                $params['resource_type'] = $_resource_name_parts[0];
-                $params['resource_name'] = $_resource_name_parts[1];
-            }
-        }
-
-        if ($params['resource_type'] == 'file') {
-            if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
-                // relative pathname to $params['resource_base_path']
-                // use the first directory where the file is found
-                foreach ((array)$params['resource_base_path'] as $_curr_path) {
-                    $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
-                    if (file_exists($_fullpath) && is_file($_fullpath)) {
-                        $params['resource_name'] = $_fullpath;
-                        return true;
-                    }
-                    // didn't find the file, try include_path
-                    $_params = array('file_path' => $_fullpath);
-                    require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
-                    if(smarty_core_get_include_path($_params, $this)) {
-                        $params['resource_name'] = $_params['new_file_path'];
-                        return true;
-                    }
-                }
-                return false;
-            } else {
-                /* absolute path */
-                return file_exists($params['resource_name']);
-            }
-        } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
-            $_params = array('type' => $params['resource_type']);
-            require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
-            smarty_core_load_resource_plugin($_params, $this);
-        }
-
-        return true;
-    }
-
-
-    /**
-     * Handle modifiers
-     *
-     * @param string|null $modifier_name
-     * @param array|null $map_array
-     * @return string result of modifiers
-     */
-    function _run_mod_handler()
-    {
-        $_args = func_get_args();
-        list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
-        list($_func_name, $_tpl_file, $_tpl_line) =
-            $this->_plugins['modifier'][$_modifier_name];
-
-        $_var = $_args[0];
-        foreach ($_var as $_key => $_val) {
-            $_args[0] = $_val;
-            $_var[$_key] = call_user_func_array($_func_name, $_args);
-        }
-        return $_var;
-    }
-
-    /**
-     * Remove starting and ending quotes from the string
-     *
-     * @param string $string
-     * @return string
-     */
-    function _dequote($string)
-    {
-        if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
-            substr($string, -1) == substr($string, 0, 1))
-            return substr($string, 1, -1);
-        else
-            return $string;
-    }
-
-
-    /**
-     * read in a file
-     *
-     * @param string $filename
-     * @return string
-     */
-    function _read_file($filename)
-    {
-        if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
-            $contents = '';
-            while (!feof($fd)) {
-                $contents .= fread($fd, 8192);
-            }
-            fclose($fd);
-            return $contents;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * get a concrete filename for automagically created content
-     *
-     * @param string $auto_base
-     * @param string $auto_source
-     * @param string $auto_id
-     * @return string
-     * @staticvar string|null
-     * @staticvar string|null
-     */
-    function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
-    {
-        $_compile_dir_sep =  $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
-        $_return = $auto_base . DIRECTORY_SEPARATOR;
-
-        if(isset($auto_id)) {
-            // make auto_id safe for directory names
-            $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
-            // split into separate directories
-            $_return .= $auto_id . $_compile_dir_sep;
-        }
-
-        if(isset($auto_source)) {
-            // make source name safe for filename
-            $_filename = urlencode(basename($auto_source));
-            $_crc32 = sprintf('%08X', crc32($auto_source));
-            // prepend %% to avoid name conflicts with
-            // with $params['auto_id'] names
-            $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
-                      substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
-            $_return .= '%%' . $_crc32 . '%%' . $_filename;
-        }
-
-        return $_return;
-    }
-
-    /**
-     * unlink a file, possibly using expiration time
-     *
-     * @param string $resource
-     * @param integer $exp_time
-     */
-    function _unlink($resource, $exp_time = null)
-    {
-        if(isset($exp_time)) {
-            if(time() - @filemtime($resource) >= $exp_time) {
-                return @unlink($resource);
-            }
-        } else {
-            return @unlink($resource);
-        }
-    }
-
-    /**
-     * returns an auto_id for auto-file-functions
-     *
-     * @param string $cache_id
-     * @param string $compile_id
-     * @return string|null
-     */
-    function _get_auto_id($cache_id=null, $compile_id=null) {
-    if (isset($cache_id))
-        return (isset($compile_id)) ? $cache_id . '|' . $compile_id  : $cache_id;
-    elseif(isset($compile_id))
-        return $compile_id;
-    else
-        return null;
-    }
-
-    /**
-     * trigger Smarty plugin error
-     *
-     * @param string $error_msg
-     * @param string $tpl_file
-     * @param integer $tpl_line
-     * @param string $file
-     * @param integer $line
-     * @param integer $error_type
-     */
-    function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
-            $file = null, $line = null, $error_type = E_USER_ERROR)
-    {
-        if(isset($file) && isset($line)) {
-            $info = ' ('.basename($file).", line $line)";
-        } else {
-            $info = '';
-        }
-        if (isset($tpl_line) && isset($tpl_file)) {
-            $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
-        } else {
-            $this->trigger_error($error_msg . $info, $error_type);
-        }
-    }
-
-
-    /**
-     * callback function for preg_replace, to call a non-cacheable block
-     * @return string
-     */
-    function _process_compiled_include_callback($match) {
-        $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
-        ob_start();
-        $_func($this);
-        $_ret = ob_get_contents();
-        ob_end_clean();
-        return $_ret;
-    }
-
-
-    /**
-     * called for included templates
-     *
-     * @param string $_smarty_include_tpl_file
-     * @param string $_smarty_include_vars
-     */
-
-    // $_smarty_include_tpl_file, $_smarty_include_vars
-
-    function _smarty_include($params)
-    {
-        if ($this->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $debug_start_time = smarty_core_get_microtime($_params, $this);
-            $this->_smarty_debug_info[] = array('type'      => 'template',
-                                                  'filename'  => $params['smarty_include_tpl_file'],
-                                                  'depth'     => ++$this->_inclusion_depth);
-            $included_tpls_idx = count($this->_smarty_debug_info) - 1;
-        }
-
-        $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
-
-        // config vars are treated as local, so push a copy of the
-        // current ones onto the front of the stack
-        array_unshift($this->_config, $this->_config[0]);
-
-        $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
-
-
-        if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
-            || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
-        {
-            include($_smarty_compile_path);
-        }
-
-        // pop the local vars off the front of the stack
-        array_shift($this->_config);
-
-        $this->_inclusion_depth--;
-
-        if ($this->debugging) {
-            // capture time for debugging info
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
-        }
-
-        if ($this->caching) {
-            $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
-        }
-    }
-
-
-    /**
-     * get or set an array of cached attributes for function that is
-     * not cacheable
-     * @return array
-     */
-    function &_smarty_cache_attrs($cache_serial, $count) {
-        $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
-
-        if ($this->_cache_including) {
-            /* return next set of cache_attrs */
-            $_return = current($_cache_attrs);
-            next($_cache_attrs);
-            return $_return;
-
-        } else {
-            /* add a reference to a new set of cache_attrs */
-            $_cache_attrs[] = array();
-            return $_cache_attrs[count($_cache_attrs)-1];
-
-        }
-
-    }
-
-
-    /**
-     * wrapper for include() retaining $this
-     * @return mixed
-     */
-    function _include($filename, $once=false, $params=null)
-    {
-        if ($once) {
-            return include_once($filename);
-        } else {
-            return include($filename);
-        }
-    }
-
-
-    /**
-     * wrapper for eval() retaining $this
-     * @return mixed
-     */
-    function _eval($code, $params=null)
-    {
-        return eval($code);
-    }
-
-    /**
-     * Extracts the filter name from the given callback
-     *
-     * @param callback $function
-     * @return string
-     */
-	function _get_filter_name($function)
-	{
-		if (is_array($function)) {
-			$_class_name = (is_object($function[0]) ?
-				get_class($function[0]) : $function[0]);
-			return $_class_name . '_' . $function[1];
-		}
-		else {
-			return $function;
-		}
-	}
-
-    /**#@-*/
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/Smarty_Compiler.class.php b/include/smarty/Smarty_Compiler.class.php
deleted file mode 100644
index 0060215..0000000
--- a/include/smarty/Smarty_Compiler.class.php
+++ /dev/null
@@ -1,2365 +0,0 @@
-<?php
-
-/**
- * Project:     Smarty: the PHP compiling template engine
- * File:        Smarty_Compiler.class.php
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 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 for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * @link http://smarty.php.net/
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author Andrei Zmievski <andrei at php.net>
- * @version 2.6.25-dev
- * @copyright 2001-2005 New Digital Group, Inc.
- * @package Smarty
- */
-
-/* $Id$ */
-
-/**
- * Template compiling class
- * @package Smarty
- */
-class Smarty_Compiler extends Smarty {
-
-    // internal vars
-    /**#@+
-     * @access private
-     */
-    var $_folded_blocks         =   array();    // keeps folded template blocks
-    var $_current_file          =   null;       // the current template being compiled
-    var $_current_line_no       =   1;          // line number for error messages
-    var $_capture_stack         =   array();    // keeps track of nested capture buffers
-    var $_plugin_info           =   array();    // keeps track of plugins to load
-    var $_init_smarty_vars      =   false;
-    var $_permitted_tokens      =   array('true','false','yes','no','on','off','null');
-    var $_db_qstr_regexp        =   null;        // regexps are setup in the constructor
-    var $_si_qstr_regexp        =   null;
-    var $_qstr_regexp           =   null;
-    var $_func_regexp           =   null;
-    var $_reg_obj_regexp        =   null;
-    var $_var_bracket_regexp    =   null;
-    var $_num_const_regexp      =   null;
-    var $_dvar_guts_regexp      =   null;
-    var $_dvar_regexp           =   null;
-    var $_cvar_regexp           =   null;
-    var $_svar_regexp           =   null;
-    var $_avar_regexp           =   null;
-    var $_mod_regexp            =   null;
-    var $_var_regexp            =   null;
-    var $_parenth_param_regexp  =   null;
-    var $_func_call_regexp      =   null;
-    var $_obj_ext_regexp        =   null;
-    var $_obj_start_regexp      =   null;
-    var $_obj_params_regexp     =   null;
-    var $_obj_call_regexp       =   null;
-    var $_cacheable_state       =   0;
-    var $_cache_attrs_count     =   0;
-    var $_nocache_count         =   0;
-    var $_cache_serial          =   null;
-    var $_cache_include         =   null;
-
-    var $_strip_depth           =   0;
-    var $_additional_newline    =   "\n";
-
-    /**#@-*/
-    /**
-     * The class constructor.
-     */
-    public function __construct()
-    {
-        // matches double quoted strings:
-        // "foobar"
-        // "foo\"bar"
-        $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
-
-        // matches single quoted strings:
-        // 'foobar'
-        // 'foo\'bar'
-        $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
-
-        // matches single or double quoted strings
-        $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')';
-
-        // matches bracket portion of vars
-        // [0]
-        // [foo]
-        // [$bar]
-        $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
-
-        // matches numerical constants
-        // 30
-        // -12
-        // 13.22
-        $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
-
-        // matches $ vars (not objects):
-        // $foo
-        // $foo.bar
-        // $foo.bar.foobar
-        // $foo[0]
-        // $foo[$bar]
-        // $foo[5][blah]
-        // $foo[5].bar[$foobar][4]
-        $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
-        $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
-        $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp
-                . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?';
-        $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
-
-        // matches config vars:
-        // #foo#
-        // #foobar123_foo#
-        $this->_cvar_regexp = '\#\w+\#';
-
-        // matches section vars:
-        // %foo.bar%
-        $this->_svar_regexp = '\%\w+\.\w+\%';
-
-        // matches all valid variables (no quotes, no modifiers)
-        $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|'
-           . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')';
-
-        // matches valid variable syntax:
-        // $foo
-        // $foo
-        // #foo#
-        // #foo#
-        // "text"
-        // "text"
-        $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
-
-        // matches valid object call (one level of object nesting allowed in parameters):
-        // $foo->bar
-        // $foo->bar()
-        // $foo->bar("text")
-        // $foo->bar($foo, $bar, "text")
-        // $foo->bar($foo, "foo")
-        // $foo->bar->foo()
-        // $foo->bar->foo->bar()
-        // $foo->bar($foo->bar)
-        // $foo->bar($foo->bar())
-        // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
-        $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')';
-        $this->_obj_restricted_param_regexp = '(?:'
-                . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')'
-                . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)';
-        $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
-                . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)';
-        $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp
-                . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)';
-        $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
-        $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)';
-        
-        // matches valid modifier syntax:
-        // |foo
-        // |@foo
-        // |foo:"bar"
-        // |foo:$bar
-        // |foo:"bar":$foobar
-        // |foo|bar
-        // |foo:$foo->bar
-        $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|'
-           . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
-
-        // matches valid function name:
-        // foo123
-        // _foo_bar
-        $this->_func_regexp = '[a-zA-Z_]\w*';
-
-        // matches valid registered object:
-        // foo->bar
-        $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*';
-
-        // matches valid parameter values:
-        // true
-        // $foo
-        // $foo|bar
-        // #foo#
-        // #foo#|bar
-        // "text"
-        // "text"|bar
-        // $foo->bar
-        $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|'
-           . $this->_var_regexp . '|' . $this->_num_const_regexp  . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)';
-
-        // matches valid parenthesised function parameters:
-        //
-        // "text"
-        //    $foo, $bar, "text"
-        // $foo|bar, "foo"|bar, $foo->bar($foo)|bar
-        $this->_parenth_param_regexp = '(?:\((?:\w+|'
-                . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
-                . $this->_param_regexp . ')))*)?\))';
-
-        // matches valid function call:
-        // foo()
-        // foo_bar($foo)
-        // _foo_bar($foo,"bar")
-        // foo123($foo,$foo->bar(),"foo")
-        $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:'
-           . $this->_parenth_param_regexp . '))';
-    }
-
-    /**
-     * compile a resource
-     *
-     * sets $compiled_content to the compiled source
-     * @param string $resource_name
-     * @param string $source_content
-     * @param string $compiled_content
-     * @return true
-     */
-    function _compile_file($resource_name, $source_content, &$compiled_content)
-    {
-
-        if ($this->security) {
-            // do not allow php syntax to be executed unless specified
-            if ($this->php_handling == SMARTY_PHP_ALLOW &&
-                !$this->security_settings['PHP_HANDLING']) {
-                $this->php_handling = SMARTY_PHP_PASSTHRU;
-            }
-        }
-
-        $this->_load_filters();
-
-        $this->_current_file = $resource_name;
-        $this->_current_line_no = 1;
-        $ldq = preg_quote($this->left_delimiter, '~');
-        $rdq = preg_quote($this->right_delimiter, '~');
-
-        // run template source through prefilter functions
-        if (count($this->_plugins['prefilter']) > 0) {
-            foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
-                if ($prefilter === false) continue;
-                if ($prefilter[3] || is_callable($prefilter[0])) {
-                    $source_content = call_user_func_array($prefilter[0],
-                                                            array($source_content, &$this));
-                    $this->_plugins['prefilter'][$filter_name][3] = true;
-                } else {
-                    $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented");
-                }
-            }
-        }
-
-        /* fetch all special blocks */
-        $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s";
-
-        preg_match_all($search, $source_content, $match,  PREG_SET_ORDER);
-        $this->_folded_blocks = $match;
-        reset($this->_folded_blocks);
-
-        /* replace special blocks by "{php}" */
-        $source_content = preg_replace_callback($search, create_function ('$matches', "return '"
-                                       . $this->_quote_replace($this->left_delimiter) . 'php'
-                                       . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'"
-                                       . $this->_quote_replace($this->right_delimiter)
-                                       . "';")
-                                       , $source_content);
-
-        /* Gather all template tags. */
-        preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match);
-        $template_tags = $_match[1];
-        /* Split content by template tags to obtain non-template content. */
-        $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content);
-
-        /* loop through text blocks */
-        for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) {
-            /* match anything resembling php tags */
-            if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
-                /* replace tags with placeholders to prevent recursive replacements */
-                $sp_match[1] = array_unique($sp_match[1]);
-                usort($sp_match[1], '_smarty_sort_length');
-                for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
-                    $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]);
-                }
-                /* process each one */
-                for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
-                    if ($this->php_handling == SMARTY_PHP_PASSTHRU) {
-                        /* echo php contents */
-                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $text_blocks[$curr_tb]);
-                    } else if ($this->php_handling == SMARTY_PHP_QUOTE) {
-                        /* quote php tags */
-                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]);
-                    } else if ($this->php_handling == SMARTY_PHP_REMOVE) {
-                        /* remove php tags */
-                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
-                    } else {
-                        /* SMARTY_PHP_ALLOW, but echo non php starting tags */
-                        $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', '<?php echo \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
-                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
-                    }
-                }
-            }
-        }
-        
-        /* Compile the template tags into PHP code. */
-        $compiled_tags = array();
-        for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) {
-            $this->_current_line_no += substr_count($text_blocks[$i], "\n");
-            $compiled_tags[] = $this->_compile_tag($template_tags[$i]);
-            $this->_current_line_no += substr_count($template_tags[$i], "\n");
-        }
-        if (count($this->_tag_stack)>0) {
-            list($_open_tag, $_line_no) = end($this->_tag_stack);
-            $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__);
-            return;
-        }
-
-        /* Reformat $text_blocks between 'strip' and '/strip' tags,
-           removing spaces, tabs and newlines. */
-        $strip = false;
-        for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
-            if ($compiled_tags[$i] == '{strip}') {
-                $compiled_tags[$i] = '';
-                $strip = true;
-                /* remove leading whitespaces */
-                $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
-            }
-            if ($strip) {
-                /* strip all $text_blocks before the next '/strip' */
-                for ($j = $i + 1; $j < $for_max; $j++) {
-                    /* remove leading and trailing whitespaces of each line */
-                    $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]);
-                    if ($compiled_tags[$j] == '{/strip}') {                       
-                        /* remove trailing whitespaces from the last text_block */
-                        $text_blocks[$j] = rtrim($text_blocks[$j]);
-                    }
-                    $text_blocks[$j] = "<?php echo '" . strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
-                    if ($compiled_tags[$j] == '{/strip}') {
-                        $compiled_tags[$j] = "\n"; /* slurped by php, but necessary
-                                    if a newline is following the closing strip-tag */
-                        $strip = false;
-                        $i = $j;
-                        break;
-                    }
-                }
-            }
-        }
-        $compiled_content = '';
-        
-        $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%';
-        
-        /* Interleave the compiled contents and text blocks to get the final result. */
-        for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
-            if ($compiled_tags[$i] == '') {
-                // tag result empty, remove first newline from following text block
-                $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
-            }
-            // replace legit PHP tags with placeholder
-            $text_blocks[$i] = str_replace('<?', $tag_guard, $text_blocks[$i]);
-            $compiled_tags[$i] = str_replace('<?', $tag_guard, $compiled_tags[$i]);
-            
-            $compiled_content .= $text_blocks[$i] . $compiled_tags[$i];
-        }
-        $compiled_content .= str_replace('<?', $tag_guard, $text_blocks[$i]);
-
-        // escape php tags created by interleaving
-        $compiled_content = str_replace('<?', "<?php echo '<?' ?>\n", $compiled_content);
-        $compiled_content = preg_replace("~(?<!')language\s*=\s*[\"\']?\s*php\s*[\"\']?~", "<?php echo 'language=php' ?>\n", $compiled_content);
-
-        // recover legit tags
-        $compiled_content = str_replace($tag_guard, '<?', $compiled_content); 
-        
-        // remove \n from the end of the file, if any
-        if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") ) {
-            $compiled_content = substr($compiled_content, 0, -1);
-        }
-
-        if (!empty($this->_cache_serial)) {
-            $compiled_content = "<?php \$this->_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content;
-        }
-
-        // run compiled template through postfilter functions
-        if (count($this->_plugins['postfilter']) > 0) {
-            foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
-                if ($postfilter === false) continue;
-                if ($postfilter[3] || is_callable($postfilter[0])) {
-                    $compiled_content = call_user_func_array($postfilter[0],
-                                                              array($compiled_content, &$this));
-                    $this->_plugins['postfilter'][$filter_name][3] = true;
-                } else {
-                    $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
-                }
-            }
-        }
-
-        // put header at the top of the compiled template
-        $template_header = "<?php /* Smarty version ".$this->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
-        $template_header .= "         compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n";
-
-        /* Emit code to load needed plugins. */
-        $this->_plugins_code = '';
-        if (count($this->_plugin_info)) {
-            $_plugins_params = "array('plugins' => array(";
-            foreach ($this->_plugin_info as $plugin_type => $plugins) {
-                foreach ($plugins as $plugin_name => $plugin_info) {
-                    $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], ";
-                    $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),';
-                }
-            }
-            $_plugins_params .= '))';
-            $plugins_code = "<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_params, \$this); ?>\n";
-            $template_header .= $plugins_code;
-            $this->_plugin_info = array();
-            $this->_plugins_code = $plugins_code;
-        }
-
-        if ($this->_init_smarty_vars) {
-            $template_header .= "<?php require_once(SMARTY_CORE_DIR . 'core.assign_smarty_interface.php');\nsmarty_core_assign_smarty_interface(null, \$this); ?>\n";
-            $this->_init_smarty_vars = false;
-        }
-
-        $compiled_content = $template_header . $compiled_content;
-        return true;
-    }
-
-    /**
-     * Compile a template tag
-     *
-     * @param string $template_tag
-     * @return string
-     */
-    function _compile_tag($template_tag)
-    {
-        /* Matched comment. */
-        if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
-            return '';
-        
-        /* Split tag into two three parts: command, command modifiers and the arguments. */
-        if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
-                . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
-                      (?:\s+(.*))?$
-                    ~xs', $template_tag, $match)) {
-            $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__);
-        }
-        
-        $tag_command = $match[1];
-        $tag_modifier = isset($match[2]) ? $match[2] : null;
-        $tag_args = isset($match[3]) ? $match[3] : null;
-
-        if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
-            /* tag name is a variable or object */
-            $_return = $this->_parse_var_props($tag_command . $tag_modifier);
-            return "<?php echo $_return; ?>" . $this->_additional_newline;
-        }
-
-        /* If the tag name is a registered object, we process it. */
-        if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
-            return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier);
-        }
-
-        switch ($tag_command) {
-            case 'include':
-                return $this->_compile_include_tag($tag_args);
-
-            case 'include_php':
-                return $this->_compile_include_php_tag($tag_args);
-
-            case 'if':
-                $this->_push_tag('if');
-                return $this->_compile_if_tag($tag_args);
-
-            case 'else':
-                list($_open_tag) = end($this->_tag_stack);
-                if ($_open_tag != 'if' && $_open_tag != 'elseif')
-                    $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
-                else
-                    $this->_push_tag('else');
-                return '<?php else: ?>';
-
-            case 'elseif':
-                list($_open_tag) = end($this->_tag_stack);
-                if ($_open_tag != 'if' && $_open_tag != 'elseif')
-                    $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
-                if ($_open_tag == 'if')
-                    $this->_push_tag('elseif');
-                return $this->_compile_if_tag($tag_args, true);
-
-            case '/if':
-                $this->_pop_tag('if');
-                return '<?php endif; ?>';
-
-            case 'capture':
-                return $this->_compile_capture_tag(true, $tag_args);
-
-            case '/capture':
-                return $this->_compile_capture_tag(false);
-
-            case 'ldelim':
-                return $this->left_delimiter;
-
-            case 'rdelim':
-                return $this->right_delimiter;
-
-            case 'section':
-                $this->_push_tag('section');
-                return $this->_compile_section_start($tag_args);
-
-            case 'sectionelse':
-                $this->_push_tag('sectionelse');
-                return "<?php endfor; else: ?>";
-                break;
-
-            case '/section':
-                $_open_tag = $this->_pop_tag('section');
-                if ($_open_tag == 'sectionelse')
-                    return "<?php endif; ?>";
-                else
-                    return "<?php endfor; endif; ?>";
-
-            case 'foreach':
-                $this->_push_tag('foreach');
-                return $this->_compile_foreach_start($tag_args);
-                break;
-
-            case 'foreachelse':
-                $this->_push_tag('foreachelse');
-                return "<?php endforeach; else: ?>";
-
-            case '/foreach':
-                $_open_tag = $this->_pop_tag('foreach');
-                if ($_open_tag == 'foreachelse')
-                    return "<?php endif; unset(\$_from); ?>";
-                else
-                    return "<?php endforeach; endif; unset(\$_from); ?>";
-                break;
-
-            case 'strip':
-            case '/strip':
-                if (substr($tag_command, 0, 1)=='/') {
-                    $this->_pop_tag('strip');
-                    if (--$this->_strip_depth==0) { /* outermost closing {/strip} */
-                        $this->_additional_newline = "\n";
-                        return '{' . $tag_command . '}';
-                    }
-                } else {
-                    $this->_push_tag('strip');
-                    if ($this->_strip_depth++==0) { /* outermost opening {strip} */
-                        $this->_additional_newline = "";
-                        return '{' . $tag_command . '}';
-                    }
-                }
-                return '';
-
-            case 'php':
-                /* handle folded tags replaced by {php} */
-                list(, $block) = each($this->_folded_blocks);
-                $this->_current_line_no += substr_count($block[0], "\n");
-                /* the number of matched elements in the regexp in _compile_file()
-                   determins the type of folded tag that was found */
-                switch (count($block)) {
-                    case 2: /* comment */
-                        return '';
-
-                    case 3: /* literal */
-                        return "<?php echo '" . strtr($block[2], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline;
-
-                    case 4: /* php */
-                        if ($this->security && !$this->security_settings['PHP_TAGS']) {
-                            $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
-                            return;
-                        }
-                        return '<?php ' . $block[3] .' ?>';
-                }
-                break;
-
-            case 'insert':
-                return $this->_compile_insert_tag($tag_args);
-
-            default:
-                if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
-                    return $output;
-                } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
-                    return $output;
-                } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
-                    return $output;                    
-                } else {
-                    $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
-                }
-
-        }
-    }
-
-
-    /**
-     * compile the custom compiler tag
-     *
-     * sets $output to the compiled custom compiler tag
-     * @param string $tag_command
-     * @param string $tag_args
-     * @param string $output
-     * @return boolean
-     */
-    function _compile_compiler_tag($tag_command, $tag_args, &$output)
-    {
-        $found = false;
-        $have_function = true;
-
-        /*
-         * First we check if the compiler function has already been registered
-         * or loaded from a plugin file.
-         */
-        if (isset($this->_plugins['compiler'][$tag_command])) {
-            $found = true;
-            $plugin_func = $this->_plugins['compiler'][$tag_command][0];
-            if (!is_callable($plugin_func)) {
-                $message = "compiler function '$tag_command' is not implemented";
-                $have_function = false;
-            }
-        }
-        /*
-         * Otherwise we need to load plugin file and look for the function
-         * inside it.
-         */
-        else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) {
-            $found = true;
-
-            include_once $plugin_file;
-
-            $plugin_func = 'smarty_compiler_' . $tag_command;
-            if (!is_callable($plugin_func)) {
-                $message = "plugin function $plugin_func() not found in $plugin_file\n";
-                $have_function = false;
-            } else {
-                $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true);
-            }
-        }
-
-        /*
-         * True return value means that we either found a plugin or a
-         * dynamically registered function. False means that we didn't and the
-         * compiler should now emit code to load custom function plugin for this
-         * tag.
-         */
-        if ($found) {
-            if ($have_function) {
-                $output = call_user_func_array($plugin_func, array($tag_args, &$this));
-                if($output != '') {
-                $output = '<?php ' . $this->_push_cacheable_state('compiler', $tag_command)
-                                   . $output
-                                   . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>';
-                }
-            } else {
-                $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
-            }
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-
-    /**
-     * compile block function tag
-     *
-     * sets $output to compiled block function tag
-     * @param string $tag_command
-     * @param string $tag_args
-     * @param string $tag_modifier
-     * @param string $output
-     * @return boolean
-     */
-    function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output)
-    {
-        if (substr($tag_command, 0, 1) == '/') {
-            $start_tag = false;
-            $tag_command = substr($tag_command, 1);
-        } else
-            $start_tag = true;
-
-        $found = false;
-        $have_function = true;
-
-        /*
-         * First we check if the block function has already been registered
-         * or loaded from a plugin file.
-         */
-        if (isset($this->_plugins['block'][$tag_command])) {
-            $found = true;
-            $plugin_func = $this->_plugins['block'][$tag_command][0];
-            if (!is_callable($plugin_func)) {
-                $message = "block function '$tag_command' is not implemented";
-                $have_function = false;
-            }
-        }
-        /*
-         * Otherwise we need to load plugin file and look for the function
-         * inside it.
-         */
-        else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) {
-            $found = true;
-
-            include_once $plugin_file;
-
-            $plugin_func = 'smarty_block_' . $tag_command;
-            if (!function_exists($plugin_func)) {
-                $message = "plugin function $plugin_func() not found in $plugin_file\n";
-                $have_function = false;
-            } else {
-                $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);
-
-            }
-        }
-
-        if (!$found) {
-            return false;
-        } else if (!$have_function) {
-            $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
-            return true;
-        }
-
-        /*
-         * Even though we've located the plugin function, compilation
-         * happens only once, so the plugin will still need to be loaded
-         * at runtime for future requests.
-         */
-        $this->_add_plugin('block', $tag_command);
-
-        if ($start_tag)
-            $this->_push_tag($tag_command);
-        else
-            $this->_pop_tag($tag_command);
-
-        if ($start_tag) {
-            $output = '<?php ' . $this->_push_cacheable_state('block', $tag_command);
-            $attrs = $this->_parse_attrs($tag_args);
-            $_cache_attrs='';
-            $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs);
-            $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); ';
-            $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);';
-            $output .= 'while ($_block_repeat) { ob_start(); ?>';
-        } else {
-            $output = '<?php $_block_content = ob_get_contents(); ob_end_clean(); ';
-            $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)';
-            if ($tag_modifier != '') {
-                $this->_parse_modifiers($_out_tag_text, $tag_modifier);
-            }
-            $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } ';
-            $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';
-        }
-
-        return true;
-    }
-
-
-    /**
-     * compile custom function tag
-     *
-     * @param string $tag_command
-     * @param string $tag_args
-     * @param string $tag_modifier
-     * @return string
-     */
-    function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output)
-    {
-        $found = false;
-        $have_function = true;
-
-        /*
-         * First we check if the custom function has already been registered
-         * or loaded from a plugin file.
-         */
-        if (isset($this->_plugins['function'][$tag_command])) {
-            $found = true;
-            $plugin_func = $this->_plugins['function'][$tag_command][0];
-            if (!is_callable($plugin_func)) {
-                $message = "custom function '$tag_command' is not implemented";
-                $have_function = false;
-            }
-        }
-        /*
-         * Otherwise we need to load plugin file and look for the function
-         * inside it.
-         */
-        else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) {
-            $found = true;
-
-            include_once $plugin_file;
-
-            $plugin_func = 'smarty_function_' . $tag_command;
-            if (!function_exists($plugin_func)) {
-                $message = "plugin function $plugin_func() not found in $plugin_file\n";
-                $have_function = false;
-            } else {
-                $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true);
-
-            }
-        }
-
-        if (!$found) {
-            return false;
-        } else if (!$have_function) {
-            $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
-            return true;
-        }
-
-        /* declare plugin to be loaded on display of the template that
-           we compile right now */
-        $this->_add_plugin('function', $tag_command);
-
-        $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);
-        $attrs = $this->_parse_attrs($tag_args);
-        $_cache_attrs = '';
-        $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs);
-
-        $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
-        if($tag_modifier != '') {
-            $this->_parse_modifiers($output, $tag_modifier);
-        }
-
-        if($output != '') {
-            $output =  '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $output . ';'
-                . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;
-        }
-
-        return true;
-    }
-
-    /**
-     * compile a registered object tag
-     *
-     * @param string $tag_command
-     * @param array $attrs
-     * @param string $tag_modifier
-     * @return string
-     */
-    function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)
-    {
-        if (substr($tag_command, 0, 1) == '/') {
-            $start_tag = false;
-            $tag_command = substr($tag_command, 1);
-        } else {
-            $start_tag = true;
-        }
-
-        list($object, $obj_comp) = explode('->', $tag_command);
-
-        $arg_list = array();
-        if(count($attrs)) {
-            $_assign_var = false;
-            foreach ($attrs as $arg_name => $arg_value) {
-                if($arg_name == 'assign') {
-                    $_assign_var = $arg_value;
-                    unset($attrs['assign']);
-                    continue;
-                }
-                if (is_bool($arg_value))
-                    $arg_value = $arg_value ? 'true' : 'false';
-                $arg_list[] = "'$arg_name' => $arg_value";
-            }
-        }
-
-        if($this->_reg_objects[$object][2]) {
-            // smarty object argument format
-            $args = "array(".implode(',', (array)$arg_list)."), \$this";
-        } else {
-            // traditional argument format
-            $args = implode(',', array_values($attrs));
-            if (empty($args)) {
-                $args = '';
-            }
-        }
-
-        $prefix = '';
-        $postfix = '';
-        $newline = '';
-        if(!is_object($this->_reg_objects[$object][0])) {
-            $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
-        } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {
-            $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
-        } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {
-            // method
-            if(in_array($obj_comp, $this->_reg_objects[$object][3])) {
-                // block method
-                if ($start_tag) {
-                    $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";
-                    $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
-                    $prefix .= "while (\$_block_repeat) { ob_start();";
-                    $return = null;
-                    $postfix = '';
-                } else {
-                    $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;";
-                    $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)";
-                    $postfix = "} array_pop(\$this->_tag_stack);";
-                }
-            } else {
-                // non-block method
-                $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";
-            }
-        } else {
-            // property
-            $return = "\$this->_reg_objects['$object'][0]->$obj_comp";
-        }
-
-        if($return != null) {
-            if($tag_modifier != '') {
-                $this->_parse_modifiers($return, $tag_modifier);
-            }
-
-            if(!empty($_assign_var)) {
-                $output = "\$this->assign('" . $this->_dequote($_assign_var) ."',  $return);";
-            } else {
-                $output = 'echo ' . $return . ';';
-                $newline = $this->_additional_newline;
-            }
-        } else {
-            $output = '';
-        }
-
-        return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;
-    }
-
-    /**
-     * Compile {insert ...} tag
-     *
-     * @param string $tag_args
-     * @return string
-     */
-    function _compile_insert_tag($tag_args)
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-        $name = $this->_dequote($attrs['name']);
-
-        if (empty($name)) {
-            return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);
-        }
-        
-        if (!preg_match('~^\w+$~', $name)) {
-            return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        if (!empty($attrs['script'])) {
-            $delayed_loading = true;
-        } else {
-            $delayed_loading = false;
-        }
-
-        foreach ($attrs as $arg_name => $arg_value) {
-            if (is_bool($arg_value))
-                $arg_value = $arg_value ? 'true' : 'false';
-            $arg_list[] = "'$arg_name' => $arg_value";
-        }
-
-        $this->_add_plugin('insert', $name, $delayed_loading);
-
-        $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";
-
-        return "<?php require_once(SMARTY_CORE_DIR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;
-    }
-
-    /**
-     * Compile {include ...} tag
-     *
-     * @param string $tag_args
-     * @return string
-     */
-    function _compile_include_tag($tag_args)
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-        $arg_list = array();
-
-        if (empty($attrs['file'])) {
-            $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        foreach ($attrs as $arg_name => $arg_value) {
-            if ($arg_name == 'file') {
-                $include_file = $arg_value;
-                continue;
-            } else if ($arg_name == 'assign') {
-                $assign_var = $arg_value;
-                continue;
-            }
-            if (is_bool($arg_value))
-                $arg_value = $arg_value ? 'true' : 'false';
-            $arg_list[] = "'$arg_name' => $arg_value";
-        }
-
-        $output = '<?php ';
-
-        if (isset($assign_var)) {
-            $output .= "ob_start();\n";
-        }
-
-        $output .=
-            "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";
-
-
-        $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";
-        $output .= "\$this->_smarty_include($_params);\n" .
-        "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .
-        "unset(\$_smarty_tpl_vars);\n";
-
-        if (isset($assign_var)) {
-            $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";
-        }
-
-        $output .= ' ?>';
-
-        return $output;
-
-    }
-
-    /**
-     * Compile {include ...} tag
-     *
-     * @param string $tag_args
-     * @return string
-     */
-    function _compile_include_php_tag($tag_args)
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-
-        if (empty($attrs['file'])) {
-            $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']);
-        $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true';
-
-        $arg_list = array();
-        foreach($attrs as $arg_name => $arg_value) {
-            if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {
-                if(is_bool($arg_value))
-                    $arg_value = $arg_value ? 'true' : 'false';
-                $arg_list[] = "'$arg_name' => $arg_value";
-            }
-        }
-
-        $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))";
-
-        return "<?php require_once(SMARTY_CORE_DIR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;
-    }
-
-
-    /**
-     * Compile {section ...} tag
-     *
-     * @param string $tag_args
-     * @return string
-     */
-    function _compile_section_start($tag_args)
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-        $arg_list = array();
-
-        $output = '<?php ';
-        $section_name = $attrs['name'];
-        if (empty($section_name)) {
-            $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        $output .= "unset(\$this->_sections[$section_name]);\n";
-        $section_props = "\$this->_sections[$section_name]";
-
-        foreach ($attrs as $attr_name => $attr_value) {
-            switch ($attr_name) {
-                case 'loop':
-                    $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
-                    break;
-
-                case 'show':
-                    if (is_bool($attr_value))
-                        $show_attr_value = $attr_value ? 'true' : 'false';
-                    else
-                        $show_attr_value = "(bool)$attr_value";
-                    $output .= "{$section_props}['show'] = $show_attr_value;\n";
-                    break;
-
-                case 'name':
-                    $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
-                    break;
-
-                case 'max':
-                case 'start':
-                    $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
-                    break;
-
-                case 'step':
-                    $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
-                    break;
-
-                default:
-                    $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);
-                    break;
-            }
-        }
-
-        if (!isset($attrs['show']))
-            $output .= "{$section_props}['show'] = true;\n";
-
-        if (!isset($attrs['loop']))
-            $output .= "{$section_props}['loop'] = 1;\n";
-
-        if (!isset($attrs['max']))
-            $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
-        else
-            $output .= "if ({$section_props}['max'] < 0)\n" .
-                       "    {$section_props}['max'] = {$section_props}['loop'];\n";
-
-        if (!isset($attrs['step']))
-            $output .= "{$section_props}['step'] = 1;\n";
-
-        if (!isset($attrs['start']))
-            $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
-        else {
-            $output .= "if ({$section_props}['start'] < 0)\n" .
-                       "    {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .
-                       "else\n" .
-                       "    {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
-        }
-
-        $output .= "if ({$section_props}['show']) {\n";
-        if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {
-            $output .= "    {$section_props}['total'] = {$section_props}['loop'];\n";
-        } else {
-            $output .= "    {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
-        }
-        $output .= "    if ({$section_props}['total'] == 0)\n" .
-                   "        {$section_props}['show'] = false;\n" .
-                   "} else\n" .
-                   "    {$section_props}['total'] = 0;\n";
-
-        $output .= "if ({$section_props}['show']):\n";
-        $output .= "
-            for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
-                 {$section_props}['iteration'] <= {$section_props}['total'];
-                 {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
-        $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
-        $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
-        $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
-        $output .= "{$section_props}['first']      = ({$section_props}['iteration'] == 1);\n";
-        $output .= "{$section_props}['last']       = ({$section_props}['iteration'] == {$section_props}['total']);\n";
-
-        $output .= "?>";
-
-        return $output;
-    }
-
-
-    /**
-     * Compile {foreach ...} tag.
-     *
-     * @param string $tag_args
-     * @return string
-     */
-    function _compile_foreach_start($tag_args)
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-        $arg_list = array();
-
-        if (empty($attrs['from'])) {
-            return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
-        }
-        $from = $attrs['from'];
-
-        if (empty($attrs['item'])) {
-            return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
-        }
-        $item = $this->_dequote($attrs['item']);
-        if (!preg_match('~^\w+$~', $item)) {
-            return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        if (isset($attrs['key'])) {
-            $key  = $this->_dequote($attrs['key']);
-            if (!preg_match('~^\w+$~', $key)) {
-                return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
-            }
-            $key_part = "\$this->_tpl_vars['$key'] => ";
-        } else {
-            $key = null;
-            $key_part = '';
-        }
-
-        if (isset($attrs['name'])) {
-            $name = $attrs['name'];
-        } else {
-            $name = null;
-        }
-
-        $output = '<?php ';
-        $output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }";
-        if (isset($name)) {
-            $foreach_props = "\$this->_foreach[$name]";
-            $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
-            $output .= "if ({$foreach_props}['total'] > 0):\n";
-            $output .= "    foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
-            $output .= "        {$foreach_props}['iteration']++;\n";
-        } else {
-            $output .= "if (count(\$_from)):\n";
-            $output .= "    foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
-        }
-        $output .= '?>';
-
-        return $output;
-    }
-
-
-    /**
-     * Compile {capture} .. {/capture} tags
-     *
-     * @param boolean $start true if this is the {capture} tag
-     * @param string $tag_args
-     * @return string
-     */
-
-    function _compile_capture_tag($start, $tag_args = '')
-    {
-        $attrs = $this->_parse_attrs($tag_args);
-
-        if ($start) {
-            $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'";
-            $assign = isset($attrs['assign']) ? $attrs['assign'] : null;
-            $append = isset($attrs['append']) ? $attrs['append'] : null;
-            
-            $output = "<?php ob_start(); ?>";
-            $this->_capture_stack[] = array($buffer, $assign, $append);
-        } else {
-            list($buffer, $assign, $append) = array_pop($this->_capture_stack);
-            $output = "<?php \$this->_smarty_vars['capture'][$buffer] = ob_get_contents(); ";
-            if (isset($assign)) {
-                $output .= " \$this->assign($assign, ob_get_contents());";
-            }
-            if (isset($append)) {
-                $output .= " \$this->append($append, ob_get_contents());";
-            }
-            $output .= "ob_end_clean(); ?>";
-        }
-
-        return $output;
-    }
-
-    /**
-     * Compile {if ...} tag
-     *
-     * @param string $tag_args
-     * @param boolean $elseif if true, uses elseif instead of if
-     * @return string
-     */
-    function _compile_if_tag($tag_args, $elseif = false)
-    {
-
-        /* Tokenize args for 'if' tag. */
-        preg_match_all('~(?>
-                ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call
-                ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)?    | # var or quoted string
-                \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@    | # valid non-word token
-                \b\w+\b                                                        | # valid word token
-                \S+                                                           # anything else
-                )~x', $tag_args, $match);
-
-        $tokens = $match[0];
-
-        if(empty($tokens)) {
-            $_error_msg = $elseif ? "'elseif'" : "'if'";
-            $_error_msg .= ' statement requires arguments'; 
-            $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__);
-        }
-            
-                
-        // make sure we have balanced parenthesis
-        $token_count = array_count_values($tokens);
-        if(isset($token_count['(']) && $token_count['('] != $token_count[')']) {
-            $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        $is_arg_stack = array();
-
-        for ($i = 0; $i < count($tokens); $i++) {
-
-            $token = &$tokens[$i];
-
-            switch (strtolower($token)) {
-                case '!':
-                case '%':
-                case '!==':
-                case '==':
-                case '===':
-                case '>':
-                case '<':
-                case '!=':
-                case '<>':
-                case '<<':
-                case '>>':
-                case '<=':
-                case '>=':
-                case '&&':
-                case '||':
-                case '|':
-                case '^':
-                case '&':
-                case '~':
-                case ')':
-                case ',':
-                case '+':
-                case '-':
-                case '*':
-                case '/':
-                case '@':
-                    break;
-
-                case 'eq':
-                    $token = '==';
-                    break;
-
-                case 'ne':
-                case 'neq':
-                    $token = '!=';
-                    break;
-
-                case 'lt':
-                    $token = '<';
-                    break;
-
-                case 'le':
-                case 'lte':
-                    $token = '<=';
-                    break;
-
-                case 'gt':
-                    $token = '>';
-                    break;
-
-                case 'ge':
-                case 'gte':
-                    $token = '>=';
-                    break;
-
-                case 'and':
-                    $token = '&&';
-                    break;
-
-                case 'or':
-                    $token = '||';
-                    break;
-
-                case 'not':
-                    $token = '!';
-                    break;
-
-                case 'mod':
-                    $token = '%';
-                    break;
-
-                case '(':
-                    array_push($is_arg_stack, $i);
-                    break;
-
-                case 'is':
-                    /* If last token was a ')', we operate on the parenthesized
-                       expression. The start of the expression is on the stack.
-                       Otherwise, we operate on the last encountered token. */
-                    if ($tokens[$i-1] == ')') {
-                        $is_arg_start = array_pop($is_arg_stack);
-                        if ($is_arg_start != 0) {
-                            if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) {
-                                $is_arg_start--;
-                            } 
-                        } 
-                    } else
-                        $is_arg_start = $i-1;
-                    /* Construct the argument for 'is' expression, so it knows
-                       what to operate on. */
-                    $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
-
-                    /* Pass all tokens from next one until the end to the
-                       'is' expression parsing function. The function will
-                       return modified tokens, where the first one is the result
-                       of the 'is' expression and the rest are the tokens it
-                       didn't touch. */
-                    $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
-
-                    /* Replace the old tokens with the new ones. */
-                    array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
-
-                    /* Adjust argument start so that it won't change from the
-                       current position for the next iteration. */
-                    $i = $is_arg_start;
-                    break;
-
-                default:
-                    if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) {
-                            // function call
-                            if($this->security &&
-                               !in_array($token, $this->security_settings['IF_FUNCS'])) {
-                                $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
-                            }
-                    } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') {
-                        // variable function call
-                        $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);                      
-                    } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) {
-                        // object or variable
-                        $token = $this->_parse_var_props($token);
-                    } elseif(is_numeric($token)) {
-                        // number, skip it
-                    } else {
-                        $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__);
-                    }
-                    break;
-            }
-        }
-
-        if ($elseif)
-            return '<?php elseif ('.implode(' ', $tokens).'): ?>';
-        else
-            return '<?php if ('.implode(' ', $tokens).'): ?>';
-    }
-
-
-    function _compile_arg_list($type, $name, $attrs, &$cache_code) {
-        $arg_list = array();
-
-        if (isset($type) && isset($name)
-            && isset($this->_plugins[$type])
-            && isset($this->_plugins[$type][$name])
-            && empty($this->_plugins[$type][$name][4])
-            && is_array($this->_plugins[$type][$name][5])
-            ) {
-            /* we have a list of parameters that should be cached */
-            $_cache_attrs = $this->_plugins[$type][$name][5];
-            $_count = $this->_cache_attrs_count++;
-            $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');";
-
-        } else {
-            /* no parameters are cached */
-            $_cache_attrs = null;
-        }
-
-        foreach ($attrs as $arg_name => $arg_value) {
-            if (is_bool($arg_value))
-                $arg_value = $arg_value ? 'true' : 'false';
-            if (is_null($arg_value))
-                $arg_value = 'null';
-            if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) {
-                $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)";
-            } else {
-                $arg_list[] = "'$arg_name' => $arg_value";
-            }
-        }
-        return $arg_list;
-    }
-
-    /**
-     * Parse is expression
-     *
-     * @param string $is_arg
-     * @param array $tokens
-     * @return array
-     */
-    function _parse_is_expr($is_arg, $tokens)
-    {
-        $expr_end = 0;
-        $negate_expr = false;
-
-        if (($first_token = array_shift($tokens)) == 'not') {
-            $negate_expr = true;
-            $expr_type = array_shift($tokens);
-        } else
-            $expr_type = $first_token;
-
-        switch ($expr_type) {
-            case 'even':
-                if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
-                    $expr_end++;
-                    $expr_arg = $tokens[$expr_end++];
-                    $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
-                } else
-                    $expr = "!(1 & $is_arg)";
-                break;
-
-            case 'odd':
-                if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
-                    $expr_end++;
-                    $expr_arg = $tokens[$expr_end++];
-                    $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
-                } else
-                    $expr = "(1 & $is_arg)";
-                break;
-
-            case 'div':
-                if (@$tokens[$expr_end] == 'by') {
-                    $expr_end++;
-                    $expr_arg = $tokens[$expr_end++];
-                    $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")";
-                } else {
-                    $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__);
-                }
-                break;
-
-            default:
-                $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__);
-                break;
-        }
-
-        if ($negate_expr) {
-            $expr = "!($expr)";
-        }
-
-        array_splice($tokens, 0, $expr_end, $expr);
-
-        return $tokens;
-    }
-
-
-    /**
-     * Parse attribute string
-     *
-     * @param string $tag_args
-     * @return array
-     */
-    function _parse_attrs($tag_args)
-    {
-
-        /* Tokenize tag attributes. */
-        preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
-                         )+ |
-                         [=]
-                        ~x', $tag_args, $match);
-        $tokens       = $match[0];
-
-        $attrs = array();
-        /* Parse state:
-            0 - expecting attribute name
-            1 - expecting '='
-            2 - expecting attribute value (not '=') */
-        $state = 0;
-
-        foreach ($tokens as $token) {
-            switch ($state) {
-                case 0:
-                    /* If the token is a valid identifier, we set attribute name
-                       and go to state 1. */
-                    if (preg_match('~^\w+$~', $token)) {
-                        $attr_name = $token;
-                        $state = 1;
-                    } else
-                        $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
-                    break;
-
-                case 1:
-                    /* If the token is '=', then we go to state 2. */
-                    if ($token == '=') {
-                        $state = 2;
-                    } else
-                        $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
-                    break;
-
-                case 2:
-                    /* If token is not '=', we set the attribute value and go to
-                       state 0. */
-                    if ($token != '=') {
-                        /* We booleanize the token if it's a non-quoted possible
-                           boolean value. */
-                        if (preg_match('~^(on|yes|true)$~', $token)) {
-                            $token = 'true';
-                        } else if (preg_match('~^(off|no|false)$~', $token)) {
-                            $token = 'false';
-                        } else if ($token == 'null') {
-                            $token = 'null';
-                        } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
-                            /* treat integer literally */
-                        } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) {
-                            /* treat as a string, double-quote it escaping quotes */
-                            $token = '"'.addslashes($token).'"';
-                        }
-
-                        $attrs[$attr_name] = $token;
-                        $state = 0;
-                    } else
-                        $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__);
-                    break;
-            }
-            $last_token = $token;
-        }
-
-        if($state != 0) {
-            if($state == 1) {
-                $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
-            } else {
-                $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__);
-            }
-        }
-
-        $this->_parse_vars_props($attrs);
-
-        return $attrs;
-    }
-
-    /**
-     * compile multiple variables and section properties tokens into
-     * PHP code
-     *
-     * @param array $tokens
-     */
-    function _parse_vars_props(&$tokens)
-    {
-        foreach($tokens as $key => $val) {
-            $tokens[$key] = $this->_parse_var_props($val);
-        }
-    }
-
-    /**
-     * compile single variable and section properties token into
-     * PHP code
-     *
-     * @param string $val
-     * @param string $tag_attrs
-     * @return string
-     */
-    function _parse_var_props($val)
-    {
-        $val = trim($val);
-
-        if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) {
-            // $ variable or object
-            $return = $this->_parse_var($match[1]);
-            $modifiers = $match[2];
-            if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
-                $_default_mod_string = implode('|',(array)$this->default_modifiers);
-                $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
-            }
-            $this->_parse_modifiers($return, $modifiers);
-            return $return;
-        } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
-                // double quoted text
-                preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
-                $return = $this->_expand_quoted_text($match[1]);
-                if($match[2] != '') {
-                    $this->_parse_modifiers($return, $match[2]);
-                }
-                return $return;
-            }
-        elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
-                // numerical constant
-                preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
-                if($match[2] != '') {
-                    $this->_parse_modifiers($match[1], $match[2]);
-                    return $match[1];
-                }
-            }
-        elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
-                // single quoted text
-                preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
-                if($match[2] != '') {
-                    $this->_parse_modifiers($match[1], $match[2]);
-                    return $match[1];
-                }
-            }
-        elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
-                // config var
-                return $this->_parse_conf_var($val);
-            }
-        elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
-                // section var
-                return $this->_parse_section_prop($val);
-            }
-        elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) {
-            // literal string
-            return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
-        }
-        return $val;
-    }
-
-    /**
-     * expand quoted text with embedded variables
-     *
-     * @param string $var_expr
-     * @return string
-     */
-    function _expand_quoted_text($var_expr)
-    {
-        // if contains unescaped $, expand it
-        if(preg_match_all('~(?:\`(?<!\\\\)\$' . $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
-            $_match = $_match[0];
-            $_replace = array();
-            foreach($_match as $_var) {
-                $_replace[$_var] = '".(' . $this->_parse_var(str_replace('`','',$_var)) . ')."';
-            }
-            $var_expr = strtr($var_expr, $_replace);
-            $_return = preg_replace('~\.""|(?<!\\\\)""\.~', '', $var_expr);
-        } else {
-            $_return = $var_expr;
-        }
-        // replace double quoted literal string with single quotes
-        $_return = preg_replace('~^"([\s\w]+)"$~',"'\\1'",$_return);
-        return $_return;
-    }
-
-    /**
-     * parse variable expression into PHP code
-     *
-     * @param string $var_expr
-     * @param string $output
-     * @return string
-     */
-    function _parse_var($var_expr)
-    {
-        $_has_math = false;
-        $_math_vars = preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-        if(count($_math_vars) > 1) {
-            $_first_var = "";
-            $_complete_var = "";
-            $_output = "";
-            // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter)
-            foreach($_math_vars as $_k => $_math_var) {
-                $_math_var = $_math_vars[$_k];
-
-                if(!empty($_math_var) || is_numeric($_math_var)) {
-                    // hit a math operator, so process the stuff which came before it
-                    if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) {
-                        $_has_math = true;
-                        if(!empty($_complete_var) || is_numeric($_complete_var)) {
-                            $_output .= $this->_parse_var($_complete_var);
-                        }
-
-                        // just output the math operator to php
-                        $_output .= $_math_var;
-
-                        if(empty($_first_var))
-                            $_first_var = $_complete_var;
-
-                        $_complete_var = "";
-                    } else {
-                        $_complete_var .= $_math_var;
-                    }
-                }
-            }
-            if($_has_math) {
-                if(!empty($_complete_var) || is_numeric($_complete_var))
-                    $_output .= $this->_parse_var($_complete_var);
-
-                // get the modifiers working (only the last var from math + modifier is left)
-                $var_expr = $_complete_var;
-            }
-        }
-
-        // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit)
-        if(is_numeric(substr($var_expr, 0, 1)))
-            $_var_ref = $var_expr;
-        else
-            $_var_ref = substr($var_expr, 1);
-        
-        if(!$_has_math) {
-            
-            // get [foo] and .foo and ->foo and (...) pieces
-            preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match);
-                        
-            $_indexes = $match[0];
-            $_var_name = array_shift($_indexes);
-
-            /* Handle $smarty.* variable references as a special case. */
-            if ($_var_name == 'smarty') {
-                /*
-                 * If the reference could be compiled, use the compiled output;
-                 * otherwise, fall back on the $smarty variable generated at
-                 * run-time.
-                 */
-                if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) {
-                    $_output = $smarty_ref;
-                } else {
-                    $_var_name = substr(array_shift($_indexes), 1);
-                    $_output = "\$this->_smarty_vars['$_var_name']";
-                }
-            } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) {
-                // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers
-                if(count($_indexes) > 0)
-                {
-                    $_var_name .= implode("", $_indexes);
-                    $_indexes = array();
-                }
-                $_output = $_var_name;
-            } else {
-                $_output = "\$this->_tpl_vars['$_var_name']";
-            }
-
-            foreach ($_indexes as $_index) {
-                if (substr($_index, 0, 1) == '[') {
-                    $_index = substr($_index, 1, -1);
-                    if (is_numeric($_index)) {
-                        $_output .= "[$_index]";
-                    } elseif (substr($_index, 0, 1) == '$') {
-                        if (strpos($_index, '.') !== false) {
-                            $_output .= '[' . $this->_parse_var($_index) . ']';
-                        } else {
-                            $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]";
-                        }
-                    } else {
-                        $_var_parts = explode('.', $_index);
-                        $_var_section = $_var_parts[0];
-                        $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index';
-                        $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]";
-                    }
-                } else if (substr($_index, 0, 1) == '.') {
-                    if (substr($_index, 1, 1) == '$')
-                        $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]";
-                    else
-                        $_output .= "['" . substr($_index, 1) . "']";
-                } else if (substr($_index,0,2) == '->') {
-                    if(substr($_index,2,2) == '__') {
-                        $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__);
-                    } elseif($this->security && substr($_index, 2, 1) == '_') {
-                        $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
-                    } elseif (substr($_index, 2, 1) == '$') {
-                        if ($this->security) {
-                            $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
-                        } else {
-                            $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}';
-                        }
-                    } else {
-                        $_output .= $_index;
-                    }
-                } elseif (substr($_index, 0, 1) == '(') {
-                    $_index = $this->_parse_parenth_args($_index);
-                    $_output .= $_index;
-                } else {
-                    $_output .= $_index;
-                }
-            }
-        }
-
-        return $_output;
-    }
-
-    /**
-     * parse arguments in function call parenthesis
-     *
-     * @param string $parenth_args
-     * @return string
-     */
-    function _parse_parenth_args($parenth_args)
-    {
-        preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match);
-        $orig_vals = $match = $match[0];
-        $this->_parse_vars_props($match);
-        $replace = array();
-        for ($i = 0, $count = count($match); $i < $count; $i++) {
-            $replace[$orig_vals[$i]] = $match[$i];
-        }
-        return strtr($parenth_args, $replace);
-    }
-
-    /**
-     * parse configuration variable expression into PHP code
-     *
-     * @param string $conf_var_expr
-     */
-    function _parse_conf_var($conf_var_expr)
-    {
-        $parts = explode('|', $conf_var_expr, 2);
-        $var_ref = $parts[0];
-        $modifiers = isset($parts[1]) ? $parts[1] : '';
-
-        $var_name = substr($var_ref, 1, -1);
-
-        $output = "\$this->_config[0]['vars']['$var_name']";
-
-        $this->_parse_modifiers($output, $modifiers);
-
-        return $output;
-    }
-
-    /**
-     * parse section property expression into PHP code
-     *
-     * @param string $section_prop_expr
-     * @return string
-     */
-    function _parse_section_prop($section_prop_expr)
-    {
-        $parts = explode('|', $section_prop_expr, 2);
-        $var_ref = $parts[0];
-        $modifiers = isset($parts[1]) ? $parts[1] : '';
-
-        preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);
-        $section_name = $match[1];
-        $prop_name = $match[2];
-
-        $output = "\$this->_sections['$section_name']['$prop_name']";
-
-        $this->_parse_modifiers($output, $modifiers);
-
-        return $output;
-    }
-
-
-    /**
-     * parse modifier chain into PHP code
-     *
-     * sets $output to parsed modified chain
-     * @param string $output
-     * @param string $modifier_string
-     */
-    function _parse_modifiers(&$output, $modifier_string)
-    {
-        preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
-        list(, $_modifiers, $modifier_arg_strings) = $_match;
-
-        for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) {
-            $_modifier_name = $_modifiers[$_i];
-
-            if($_modifier_name == 'smarty') {
-                // skip smarty modifier
-                continue;
-            }
-
-            preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
-            $_modifier_args = $_match[1];
-
-            if (substr($_modifier_name, 0, 1) == '@') {
-                $_map_array = false;
-                $_modifier_name = substr($_modifier_name, 1);
-            } else {
-                $_map_array = true;
-            }
-
-            if (empty($this->_plugins['modifier'][$_modifier_name])
-                && !$this->_get_plugin_filepath('modifier', $_modifier_name)
-                && function_exists($_modifier_name)) {
-                if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
-                    $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
-                } else {
-                    $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name,  null, null, false);
-                }
-            }
-            $this->_add_plugin('modifier', $_modifier_name);
-
-            $this->_parse_vars_props($_modifier_args);
-
-            if($_modifier_name == 'default') {
-                // supress notifications of default modifier vars and args
-                if(substr($output, 0, 1) == '$') {
-                    $output = '@' . $output;
-                }
-                if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') {
-                    $_modifier_args[0] = '@' . $_modifier_args[0];
-                }
-            }
-            if (count($_modifier_args) > 0)
-                $_modifier_args = ', '.implode(', ', $_modifier_args);
-            else
-                $_modifier_args = '';
-
-            if ($_map_array) {
-                $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))";
-
-            } else {
-
-                $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)";
-
-            }
-        }
-    }
-
-
-    /**
-     * add plugin
-     *
-     * @param string $type
-     * @param string $name
-     * @param boolean? $delayed_loading
-     */
-    function _add_plugin($type, $name, $delayed_loading = null)
-    {
-        if (!isset($this->_plugin_info[$type])) {
-            $this->_plugin_info[$type] = array();
-        }
-        if (!isset($this->_plugin_info[$type][$name])) {
-            $this->_plugin_info[$type][$name] = array($this->_current_file,
-                                                      $this->_current_line_no,
-                                                      $delayed_loading);
-        }
-    }
-
-
-    /**
-     * Compiles references of type $smarty.foo
-     *
-     * @param string $indexes
-     * @return string
-     */
-    function _compile_smarty_ref(&$indexes)
-    {
-        /* Extract the reference name. */
-        $_ref = substr($indexes[0], 1);
-        foreach($indexes as $_index_no=>$_index) {
-            if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) {
-                $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
-            }
-        }
-
-        switch ($_ref) {
-            case 'now':
-                $compiled_ref = 'time()';
-                $_max_index = 1;
-                break;
-
-            case 'foreach':
-                array_shift($indexes);
-                $_var = $this->_parse_var_props(substr($indexes[0], 1));
-                $_propname = substr($indexes[1], 1);
-                $_max_index = 1;
-                switch ($_propname) {
-                    case 'index':
-                        array_shift($indexes);
-                        $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)";
-                        break;
-                        
-                    case 'first':
-                        array_shift($indexes);
-                        $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)";
-                        break;
-
-                    case 'last':
-                        array_shift($indexes);
-                        $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])";
-                        break;
-                        
-                    case 'show':
-                        array_shift($indexes);
-                        $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)";
-                        break;
-                        
-                    default:
-                        unset($_max_index);
-                        $compiled_ref = "\$this->_foreach[$_var]";
-                }
-                break;
-
-            case 'section':
-                array_shift($indexes);
-                $_var = $this->_parse_var_props(substr($indexes[0], 1));
-                $compiled_ref = "\$this->_sections[$_var]";
-                break;
-
-            case 'get':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_GET";
-                break;
-
-            case 'post':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_POST";
-                break;
-
-            case 'cookies':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_COOKIE";
-                break;
-
-            case 'env':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_ENV";
-                break;
-
-            case 'server':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_SERVER";
-                break;
-
-            case 'session':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                $compiled_ref = "\$_SESSION";
-                break;
-
-            /*
-             * These cases are handled either at run-time or elsewhere in the
-             * compiler.
-             */
-            case 'request':
-                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
-                    $this->_syntax_error("(secure mode) super global access not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                if ($this->request_use_auto_globals) {
-                    $compiled_ref = "\$_REQUEST";
-                    break;
-                } else {
-                    $this->_init_smarty_vars = true;
-                }
-                return null;
-
-            case 'capture':
-                return null;
-
-            case 'template':
-                $compiled_ref = "'" . addslashes($this->_current_file) . "'";
-                $_max_index = 1;
-                break;
-
-            case 'version':
-                $compiled_ref = "'$this->_version'";
-                $_max_index = 1;
-                break;
-
-            case 'const':
-                if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) {
-                    $this->_syntax_error("(secure mode) constants not permitted",
-                                         E_USER_WARNING, __FILE__, __LINE__);
-                    return;
-                }
-                array_shift($indexes);
-                if (preg_match('!^\.\w+$!', $indexes[0])) {
-                    $compiled_ref = '@' . substr($indexes[0], 1);
-                } else {
-                    $_val = $this->_parse_var_props(substr($indexes[0], 1));
-                    $compiled_ref = '@constant(' . $_val . ')';
-                }
-                $_max_index = 1;
-                break;
-
-            case 'config':
-                $compiled_ref = "\$this->_config[0]['vars']";
-                $_max_index = 3;
-                break;
-
-            case 'ldelim':
-                $compiled_ref = "'$this->left_delimiter'";
-                break;
-
-            case 'rdelim':
-                $compiled_ref = "'$this->right_delimiter'";
-                break;
-                
-            default:
-                $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
-                break;
-        }
-
-        if (isset($_max_index) && count($indexes) > $_max_index) {
-            $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        array_shift($indexes);
-        return $compiled_ref;
-    }
-
-    /**
-     * compiles call to plugin of type $type with name $name
-     * returns a string containing the function-name or method call
-     * without the paramter-list that would have follow to make the
-     * call valid php-syntax
-     *
-     * @param string $type
-     * @param string $name
-     * @return string
-     */
-    function _compile_plugin_call($type, $name) {
-        if (isset($this->_plugins[$type][$name])) {
-            /* plugin loaded */
-            if (is_array($this->_plugins[$type][$name][0])) {
-                return ((is_object($this->_plugins[$type][$name][0][0])) ?
-                        "\$this->_plugins['$type']['$name'][0][0]->"    /* method callback */
-                        : (string)($this->_plugins[$type][$name][0][0]).'::'    /* class callback */
-                       ). $this->_plugins[$type][$name][0][1];
-
-            } else {
-                /* function callback */
-                return $this->_plugins[$type][$name][0];
-
-            }
-        } else {
-            /* plugin not loaded -> auto-loadable-plugin */
-            return 'smarty_'.$type.'_'.$name;
-
-        }
-    }
-
-    /**
-     * load pre- and post-filters
-     */
-    function _load_filters()
-    {
-        if (count($this->_plugins['prefilter']) > 0) {
-            foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
-                if ($prefilter === false) {
-                    unset($this->_plugins['prefilter'][$filter_name]);
-                    $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false)));
-                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
-                    smarty_core_load_plugins($_params, $this);
-                }
-            }
-        }
-        if (count($this->_plugins['postfilter']) > 0) {
-            foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
-                if ($postfilter === false) {
-                    unset($this->_plugins['postfilter'][$filter_name]);
-                    $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false)));
-                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
-                    smarty_core_load_plugins($_params, $this);
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Quote subpattern references
-     *
-     * @param string $string
-     * @return string
-     */
-    function _quote_replace($string)
-    {
-        return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
-    }
-
-    /**
-     * display Smarty syntax error
-     *
-     * @param string $error_msg
-     * @param integer $error_type
-     * @param string $file
-     * @param integer $line
-     */
-    function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
-    {
-        $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
-    }
-
-
-    /**
-     * check if the compilation changes from cacheable to
-     * non-cacheable state with the beginning of the current
-     * plugin. return php-code to reflect the transition.
-     * @return string
-     */
-    function _push_cacheable_state($type, $name) {
-        $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
-        if ($_cacheable
-            || 0<$this->_cacheable_state++) return '';
-        if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty'));
-        $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:'
-            . $this->_cache_serial . '#' . $this->_nocache_count
-            . '}\'; endif;';
-        return $_ret;
-    }
-
-
-    /**
-     * check if the compilation changes from non-cacheable to
-     * cacheable state with the end of the current plugin return
-     * php-code to reflect the transition.
-     * @return string
-     */
-    function _pop_cacheable_state($type, $name) {
-        $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
-        if ($_cacheable
-            || --$this->_cacheable_state>0) return '';
-        return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:'
-            . $this->_cache_serial . '#' . ($this->_nocache_count++)
-            . '}\'; endif;';
-    }
-
-
-    /**
-     * push opening tag-name, file-name and line-number on the tag-stack
-     * @param string the opening tag's name
-     */
-    function _push_tag($open_tag)
-    {
-        array_push($this->_tag_stack, array($open_tag, $this->_current_line_no));
-    }
-
-    /**
-     * pop closing tag-name
-     * raise an error if this stack-top doesn't match with the closing tag
-     * @param string the closing tag's name
-     * @return string the opening tag's name
-     */
-    function _pop_tag($close_tag)
-    {
-        $message = '';
-        if (count($this->_tag_stack)>0) {
-            list($_open_tag, $_line_no) = array_pop($this->_tag_stack);
-            if ($close_tag == $_open_tag) {
-                return $_open_tag;
-            }
-            if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) {
-                return $this->_pop_tag($close_tag);
-            }
-            if ($close_tag == 'section' && $_open_tag == 'sectionelse') {
-                $this->_pop_tag($close_tag);
-                return $_open_tag;
-            }
-            if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') {
-                $this->_pop_tag($close_tag);
-                return $_open_tag;
-            }
-            if ($_open_tag == 'else' || $_open_tag == 'elseif') {
-                $_open_tag = 'if';
-            } elseif ($_open_tag == 'sectionelse') {
-                $_open_tag = 'section';
-            } elseif ($_open_tag == 'foreachelse') {
-                $_open_tag = 'foreach';
-            }
-            $message = " expected {/$_open_tag} (opened line $_line_no).";
-        }
-        $this->_syntax_error("mismatched tag {/$close_tag}.$message",
-                             E_USER_ERROR, __FILE__, __LINE__);
-    }
-
-}
-
-/**
- * compare to values by their string length
- *
- * @access private
- * @param string $a
- * @param string $b
- * @return 0|-1|1
- */
-function _smarty_sort_length($a, $b)
-{
-    if($a == $b)
-        return 0;
-
-    if(strlen($a) == strlen($b))
-        return ($a > $b) ? -1 : 1;
-
-    return (strlen($a) > strlen($b)) ? -1 : 1;
-}
-
-
-/* vim: set et: */
-
-?>
diff --git a/include/smarty/debug.tpl b/include/smarty/debug.tpl
deleted file mode 100644
index c05ef5d..0000000
--- a/include/smarty/debug.tpl
+++ /dev/null
@@ -1,157 +0,0 @@
-{* Smarty *}
-{* debug.tpl, last updated version 2.1.0 *}
-{assign_debug_info}
-{capture assign=debug_output}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-    <title>Smarty Debug Console</title>
-{literal}
-<style type="text/css">
-/* <![CDATA[ */
-body, h1, h2, td, th, p {
-    font-family: sans-serif;
-    font-weight: normal;
-    font-size: 0.9em;
-    margin: 1px;
-    padding: 0;
-}
-
-h1 {
-    margin: 0;
-    text-align: left;
-    padding: 2px;
-    background-color: #f0c040;
-    color:  black;
-    font-weight: bold;
-    font-size: 1.2em;
- }
-
-h2 {
-    background-color: #9B410E;
-    color: white;
-    text-align: left;
-    font-weight: bold;
-    padding: 2px;
-    border-top: 1px solid black;
-}
-
-body {
-    background: black; 
-}
-
-p, table, div {
-    background: #f0ead8;
-} 
-
-p {
-    margin: 0;
-    font-style: italic;
-    text-align: center;
-}
-
-table {
-    width: 100%;
-}
-
-th, td {
-    font-family: monospace;
-    vertical-align: top;
-    text-align: left;
-    width: 50%;
-}
-
-td {
-    color: green;
-}
-
-.odd {
-    background-color: #eeeeee;
-}
-
-.even {
-    background-color: #fafafa;
-}
-
-.exectime {
-    font-size: 0.8em;
-    font-style: italic;
-}
-
-#table_assigned_vars th {
-    color: blue;
-}
-
-#table_config_vars th {
-    color: maroon;
-}
-/* ]]> */
-</style>
-{/literal}
-</head>
-<body>
-
-<h1>Smarty Debug Console</h1>
-
-<h2>included templates & config files (load time in seconds)</h2>
-
-<div>
-{section name=templates loop=$_debug_tpls}
-    {section name=indent loop=$_debug_tpls[templates].depth}   {/section}
-    <font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
-        {$_debug_tpls[templates].filename|escape:html}</font>
-    {if isset($_debug_tpls[templates].exec_time)}
-        <span class="exectime">
-        ({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
-        {if %templates.index% eq 0}(total){/if}
-        </span>
-    {/if}
-    <br />
-{sectionelse}
-    <p>no templates included</p>
-{/section}
-</div>
-
-<h2>assigned template variables</h2>
-
-<table id="table_assigned_vars">
-    {section name=vars loop=$_debug_keys}
-        <tr class="{cycle values="odd,even"}">
-            <th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
-            <td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
-    {sectionelse}
-        <tr><td><p>no template variables assigned</p></td></tr>
-    {/section}
-</table>
-
-<h2>assigned config file variables (outer template scope)</h2>
-
-<table id="table_config_vars">
-    {section name=config_vars loop=$_debug_config_keys}
-        <tr class="{cycle values="odd,even"}">
-            <th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
-            <td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
-    {sectionelse}
-        <tr><td><p>no config vars assigned</p></td></tr>
-    {/section}
-</table>
-</body>
-</html>
-{/capture}
-{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
-    {$debug_output}
-{else}
-<script type="text/javascript">
-// <![CDATA[
-    if ( self.name == '' ) {ldelim}
-       var title = 'Console';
-    {rdelim}
-    else {ldelim}
-       var title = 'Console_' + self.name;
-    {rdelim}
-    _smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
-    _smarty_console.document.write('{$debug_output|escape:'javascript'}');
-    _smarty_console.document.close();
-// ]]>
-</script>
-{/if}
\ No newline at end of file
diff --git a/include/smarty/internals/core.assemble_plugin_filepath.php b/include/smarty/internals/core.assemble_plugin_filepath.php
deleted file mode 100644
index 690d3dd..0000000
--- a/include/smarty/internals/core.assemble_plugin_filepath.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * assemble filepath of requested plugin
- *
- * @param string $type
- * @param string $name
- * @return string|false
- */
-function smarty_core_assemble_plugin_filepath($params, &$smarty)
-{
-    static $_filepaths_cache = array();
-
-    $_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
-    if (isset($_filepaths_cache[$_plugin_filename])) {
-        return $_filepaths_cache[$_plugin_filename];
-    }
-    $_return = false;
-
-    foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
-
-        $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
-
-        // see if path is relative
-        if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
-            $_relative_paths[] = $_plugin_dir;
-            // relative path, see if it is in the SMARTY_DIR
-            if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
-                $_return = SMARTY_DIR . $_plugin_filepath;
-                break;
-            }
-        }
-        // try relative to cwd (or absolute)
-        if (@is_readable($_plugin_filepath)) {
-            $_return = $_plugin_filepath;
-            break;
-        }
-    }
-
-    if($_return === false) {
-        // still not found, try PHP include_path
-        if(isset($_relative_paths)) {
-            foreach ((array)$_relative_paths as $_plugin_dir) {
-
-                $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
-
-                $_params = array('file_path' => $_plugin_filepath);
-                require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
-                if(smarty_core_get_include_path($_params, $smarty)) {
-                    $_return = $_params['new_file_path'];
-                    break;
-                }
-            }
-        }
-    }
-    $_filepaths_cache[$_plugin_filename] = $_return;
-    return $_return;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.assign_smarty_interface.php b/include/smarty/internals/core.assign_smarty_interface.php
deleted file mode 100644
index 7e65a73..0000000
--- a/include/smarty/internals/core.assign_smarty_interface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty assign_smarty_interface core plugin
- *
- * Type:     core<br>
- * Name:     assign_smarty_interface<br>
- * Purpose:  assign the $smarty interface variable
- * @param array Format: null
- * @param Smarty
- */
-function smarty_core_assign_smarty_interface($params, &$smarty)
-{
-        if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
-            return;
-        }
-
-        $_globals_map = array('g'  => 'HTTP_GET_VARS',
-                             'p'  => 'HTTP_POST_VARS',
-                             'c'  => 'HTTP_COOKIE_VARS',
-                             's'  => 'HTTP_SERVER_VARS',
-                             'e'  => 'HTTP_ENV_VARS');
-
-        $_smarty_vars_request  = array();
-
-        foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
-            if (isset($_globals_map[$_c])) {
-                $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
-            }
-        }
-        $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
-
-        $smarty->_smarty_vars['request'] = $_smarty_vars_request;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.create_dir_structure.php b/include/smarty/internals/core.create_dir_structure.php
deleted file mode 100644
index 3eecc49..0000000
--- a/include/smarty/internals/core.create_dir_structure.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * create full directory structure
- *
- * @param string $dir
- */
-
-// $dir
-
-function smarty_core_create_dir_structure($params, &$smarty)
-{
-    if (!file_exists($params['dir'])) {
-        $_open_basedir_ini = ini_get('open_basedir');
-
-        if (DIRECTORY_SEPARATOR=='/') {
-            /* unix-style paths */
-            $_dir = $params['dir'];
-            $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
-            $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
-            if($_use_open_basedir = !empty($_open_basedir_ini)) {
-                $_open_basedirs = explode(':', $_open_basedir_ini);
-            }
-
-        } else {
-            /* other-style paths */
-            $_dir = str_replace('\\','/', $params['dir']);
-            $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
-            if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
-                /* leading "//" for network volume, or "[letter]:/" for full path */
-                $_new_dir = $_root_dir[1];
-                /* remove drive-letter from _dir_parts */
-                if (isset($_root_dir[3])) array_shift($_dir_parts);
-
-            } else {
-                $_new_dir = str_replace('\\', '/', getcwd()).'/';
-
-            }
-
-            if($_use_open_basedir = !empty($_open_basedir_ini)) {
-                $_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
-            }
-
-        }
-
-        /* all paths use "/" only from here */
-        foreach ($_dir_parts as $_dir_part) {
-            $_new_dir .= $_dir_part;
-
-            if ($_use_open_basedir) {
-                // do not attempt to test or make directories outside of open_basedir
-                $_make_new_dir = false;
-                foreach ($_open_basedirs as $_open_basedir) {
-                    if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
-                        $_make_new_dir = true;
-                        break;
-                    }
-                }
-            } else {
-                $_make_new_dir = true;
-            }
-
-            if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
-                $smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
-                return false;
-            }
-            $_new_dir .= '/';
-        }
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.display_debug_console.php b/include/smarty/internals/core.display_debug_console.php
deleted file mode 100644
index 1a80f39..0000000
--- a/include/smarty/internals/core.display_debug_console.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty debug_console function plugin
- *
- * Type:     core<br>
- * Name:     display_debug_console<br>
- * Purpose:  display the javascript debug console window
- * @param array Format: null
- * @param Smarty
- */
-function smarty_core_display_debug_console($params, &$smarty)
-{
-    // we must force compile the debug template in case the environment
-    // changed between separate applications.
-
-    if(empty($smarty->debug_tpl)) {
-        // set path to debug template from SMARTY_DIR
-        $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
-        if($smarty->security && is_file($smarty->debug_tpl)) {
-            $smarty->secure_dir[] = realpath($smarty->debug_tpl);
-        }
-        $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
-    }
-
-    $_ldelim_orig = $smarty->left_delimiter;
-    $_rdelim_orig = $smarty->right_delimiter;
-
-    $smarty->left_delimiter = '{';
-    $smarty->right_delimiter = '}';
-
-    $_compile_id_orig = $smarty->_compile_id;
-    $smarty->_compile_id = null;
-
-    $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
-    if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
-    {
-        ob_start();
-        $smarty->_include($_compile_path);
-        $_results = ob_get_contents();
-        ob_end_clean();
-    } else {
-        $_results = '';
-    }
-
-    $smarty->_compile_id = $_compile_id_orig;
-
-    $smarty->left_delimiter = $_ldelim_orig;
-    $smarty->right_delimiter = $_rdelim_orig;
-
-    return $_results;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.get_include_path.php b/include/smarty/internals/core.get_include_path.php
deleted file mode 100644
index 4343241..0000000
--- a/include/smarty/internals/core.get_include_path.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Get path to file from include_path
- *
- * @param string $file_path
- * @param string $new_file_path
- * @return boolean
- * @staticvar array|null
- */
-
-//  $file_path, &$new_file_path
-
-function smarty_core_get_include_path(&$params, &$smarty)
-{
-    static $_path_array = null;
-
-    if(!isset($_path_array)) {
-        $_ini_include_path = ini_get('include_path');
-
-        if(strstr($_ini_include_path,';')) {
-            // windows pathnames
-            $_path_array = explode(';',$_ini_include_path);
-        } else {
-            $_path_array = explode(':',$_ini_include_path);
-        }
-    }
-    foreach ($_path_array as $_include_path) {
-        if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
-               $params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
-            return true;
-        }
-    }
-    return false;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.get_microtime.php b/include/smarty/internals/core.get_microtime.php
deleted file mode 100644
index f1a28e0..0000000
--- a/include/smarty/internals/core.get_microtime.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Get seconds and microseconds
- * @return double
- */
-function smarty_core_get_microtime($params, &$smarty)
-{
-    $mtime = microtime();
-    $mtime = explode(" ", $mtime);
-    $mtime = (double)($mtime[1]) + (double)($mtime[0]);
-    return ($mtime);
-}
-
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.get_php_resource.php b/include/smarty/internals/core.get_php_resource.php
deleted file mode 100644
index 786d4e7..0000000
--- a/include/smarty/internals/core.get_php_resource.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Retrieves PHP script resource
- *
- * sets $php_resource to the returned resource
- * @param string $resource
- * @param string $resource_type
- * @param  $php_resource
- * @return boolean
- */
-
-function smarty_core_get_php_resource(&$params, &$smarty)
-{
-
-    $params['resource_base_path'] = $smarty->trusted_dir;
-    $smarty->_parse_resource_name($params, $smarty);
-
-    /*
-     * Find out if the resource exists.
-     */
-
-    if ($params['resource_type'] == 'file') {
-        $_readable = false;
-        if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
-            $_readable = true;
-        } else {
-            // test for file in include_path
-            $_params = array('file_path' => $params['resource_name']);
-            require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
-            if(smarty_core_get_include_path($_params, $smarty)) {
-                $_include_path = $_params['new_file_path'];
-                $_readable = true;
-            }
-        }
-    } else if ($params['resource_type'] != 'file') {
-        $_template_source = null;
-        $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
-            && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
-                                    array($params['resource_name'], &$_template_source, &$smarty));
-    }
-
-    /*
-     * Set the error function, depending on which class calls us.
-     */
-    if (method_exists($smarty, '_syntax_error')) {
-        $_error_funcc = '_syntax_error';
-    } else {
-        $_error_funcc = 'trigger_error';
-    }
-
-    if ($_readable) {
-        if ($smarty->security) {
-            require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
-            if (!smarty_core_is_trusted($params, $smarty)) {
-                $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
-                return false;
-            }
-        }
-    } else {
-        $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
-        return false;
-    }
-
-    if ($params['resource_type'] == 'file') {
-        $params['php_resource'] = $params['resource_name'];
-    } else {
-        $params['php_resource'] = $_template_source;
-    }
-    return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.is_secure.php b/include/smarty/internals/core.is_secure.php
deleted file mode 100644
index d54abd4..0000000
--- a/include/smarty/internals/core.is_secure.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * determines if a resource is secure or not.
- *
- * @param string $resource_type
- * @param string $resource_name
- * @return boolean
- */
-
-//  $resource_type, $resource_name
-
-function smarty_core_is_secure($params, &$smarty)
-{
-    if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
-        return true;
-    }
-
-    if ($params['resource_type'] == 'file') {
-        $_rp = realpath($params['resource_name']);
-        if (isset($params['resource_base_path'])) {
-            foreach ((array)$params['resource_base_path'] as $curr_dir) {
-                if ( ($_cd = realpath($curr_dir)) !== false &&
-                     strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
-                     substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
-                    return true;
-                }
-            }
-        }
-        if (!empty($smarty->secure_dir)) {
-            foreach ((array)$smarty->secure_dir as $curr_dir) {
-                if ( ($_cd = realpath($curr_dir)) !== false) {
-                    if($_cd == $_rp) {
-                        return true;
-                    } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
-                        substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
-                        return true;
-                    }
-                }
-            }
-        }
-    } else {
-        // resource is not on local file system
-        return call_user_func_array(
-            $smarty->_plugins['resource'][$params['resource_type']][0][2],
-            array($params['resource_name'], &$smarty));
-    }
-
-    return false;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.is_trusted.php b/include/smarty/internals/core.is_trusted.php
deleted file mode 100644
index 4299731..0000000
--- a/include/smarty/internals/core.is_trusted.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * determines if a resource is trusted or not
- *
- * @param string $resource_type
- * @param string $resource_name
- * @return boolean
- */
-
- // $resource_type, $resource_name
-
-function smarty_core_is_trusted($params, &$smarty)
-{
-    $_smarty_trusted = false;
-    if ($params['resource_type'] == 'file') {
-        if (!empty($smarty->trusted_dir)) {
-            $_rp = realpath($params['resource_name']);
-            foreach ((array)$smarty->trusted_dir as $curr_dir) {
-                if (!empty($curr_dir) && is_readable ($curr_dir)) {
-                    $_cd = realpath($curr_dir);
-                    if (strncmp($_rp, $_cd, strlen($_cd)) == 0
-                        && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
-                        $_smarty_trusted = true;
-                        break;
-                    }
-                }
-            }
-        }
-
-    } else {
-        // resource is not on local file system
-        $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
-                                                array($params['resource_name'], $smarty));
-    }
-
-    return $_smarty_trusted;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.load_plugins.php b/include/smarty/internals/core.load_plugins.php
deleted file mode 100644
index 6db1dc5..0000000
--- a/include/smarty/internals/core.load_plugins.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Load requested plugins
- *
- * @param array $plugins
- */
-
-// $plugins
-
-function smarty_core_load_plugins($params, &$smarty)
-{
-
-    foreach ($params['plugins'] as $_plugin_info) {
-        list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
-        $_plugin = &$smarty->_plugins[$_type][$_name];
-
-        /*
-         * We do not load plugin more than once for each instance of Smarty.
-         * The following code checks for that. The plugin can also be
-         * registered dynamically at runtime, in which case template file
-         * and line number will be unknown, so we fill them in.
-         *
-         * The final element of the info array is a flag that indicates
-         * whether the dynamically registered plugin function has been
-         * checked for existence yet or not.
-         */
-        if (isset($_plugin)) {
-            if (empty($_plugin[3])) {
-                if (!is_callable($_plugin[0])) {
-                    $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
-                } else {
-                    $_plugin[1] = $_tpl_file;
-                    $_plugin[2] = $_tpl_line;
-                    $_plugin[3] = true;
-                    if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
-                }
-            }
-            continue;
-        } else if ($_type == 'insert') {
-            /*
-             * For backwards compatibility, we check for insert functions in
-             * the symbol table before trying to load them as a plugin.
-             */
-            $_plugin_func = 'insert_' . $_name;
-            if (function_exists($_plugin_func)) {
-                $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
-                continue;
-            }
-        }
-
-        $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
-
-        if (! $_found = ($_plugin_file != false)) {
-            $_message = "could not load plugin file '$_type.$_name.php'\n";
-        }
-
-        /*
-         * If plugin file is found, it -must- provide the properly named
-         * plugin function. In case it doesn't, simply output the error and
-         * do not fall back on any other method.
-         */
-        if ($_found) {
-            include_once $_plugin_file;
-
-            $_plugin_func = 'smarty_' . $_type . '_' . $_name;
-            if (!function_exists($_plugin_func)) {
-                $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
-                continue;
-            }
-        }
-        /*
-         * In case of insert plugins, their code may be loaded later via
-         * 'script' attribute.
-         */
-        else if ($_type == 'insert' && $_delayed_loading) {
-            $_plugin_func = 'smarty_' . $_type . '_' . $_name;
-            $_found = true;
-        }
-
-        /*
-         * Plugin specific processing and error checking.
-         */
-        if (!$_found) {
-            if ($_type == 'modifier') {
-                /*
-                 * In case modifier falls back on using PHP functions
-                 * directly, we only allow those specified in the security
-                 * context.
-                 */
-                if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
-                    $_message = "(secure mode) modifier '$_name' is not allowed";
-                } else {
-                    if (!function_exists($_name)) {
-                        $_message = "modifier '$_name' is not implemented";
-                    } else {
-                        $_plugin_func = $_name;
-                        $_found = true;
-                    }
-                }
-            } else if ($_type == 'function') {
-                /*
-                 * This is a catch-all situation.
-                 */
-                $_message = "unknown tag - '$_name'";
-            }
-        }
-
-        if ($_found) {
-            $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
-        } else {
-            // output error
-            $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
-        }
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.load_resource_plugin.php b/include/smarty/internals/core.load_resource_plugin.php
deleted file mode 100644
index a7d37d1..0000000
--- a/include/smarty/internals/core.load_resource_plugin.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * load a resource plugin
- *
- * @param string $type
- */
-
-// $type
-
-function smarty_core_load_resource_plugin($params, &$smarty)
-{
-    /*
-     * Resource plugins are not quite like the other ones, so they are
-     * handled differently. The first element of plugin info is the array of
-     * functions provided by the plugin, the second one indicates whether
-     * all of them exist or not.
-     */
-
-    $_plugin = &$smarty->_plugins['resource'][$params['type']];
-    if (isset($_plugin)) {
-        if (!$_plugin[1] && count($_plugin[0])) {
-            $_plugin[1] = true;
-            foreach ($_plugin[0] as $_plugin_func) {
-                if (!is_callable($_plugin_func)) {
-                    $_plugin[1] = false;
-                    break;
-                }
-            }
-        }
-
-        if (!$_plugin[1]) {
-            $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
-        }
-
-        return;
-    }
-
-    $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
-    $_found = ($_plugin_file != false);
-
-    if ($_found) {            /*
-         * If the plugin file is found, it -must- provide the properly named
-         * plugin functions.
-         */
-        include_once($_plugin_file);
-
-        /*
-         * Locate functions that we require the plugin to provide.
-         */
-        $_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
-        $_resource_funcs = array();
-        foreach ($_resource_ops as $_op) {
-            $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
-            if (!function_exists($_plugin_func)) {
-                $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
-                return;
-            } else {
-                $_resource_funcs[] = $_plugin_func;
-            }
-        }
-
-        $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.process_cached_inserts.php b/include/smarty/internals/core.process_cached_inserts.php
deleted file mode 100644
index 1d78edd..0000000
--- a/include/smarty/internals/core.process_cached_inserts.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Replace cached inserts with the actual results
- *
- * @param string $results
- * @return string
- */
-function smarty_core_process_cached_inserts($params, &$smarty)
-{
-    preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
-                   $params['results'], $match);
-    list($cached_inserts, $insert_args) = $match;
-
-    for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
-        if ($smarty->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $debug_start_time = smarty_core_get_microtime($_params, $smarty);
-        }
-
-        $args = unserialize($insert_args[$i]);
-        $name = $args['name'];
-
-        if (isset($args['script'])) {
-            $_params = array('resource_name' => $smarty->_dequote($args['script']));
-            require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
-            if(!smarty_core_get_php_resource($_params, $smarty)) {
-                return false;
-            }
-            $resource_type = $_params['resource_type'];
-            $php_resource = $_params['php_resource'];
-
-
-            if ($resource_type == 'file') {
-                $smarty->_include($php_resource, true);
-            } else {
-                $smarty->_eval($php_resource);
-            }
-        }
-
-        $function_name = $smarty->_plugins['insert'][$name][0];
-        if (empty($args['assign'])) {
-            $replace = $function_name($args, $smarty);
-        } else {
-            $smarty->assign($args['assign'], $function_name($args, $smarty));
-            $replace = '';
-        }
-
-        $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
-        if ($smarty->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $smarty->_smarty_debug_info[] = array('type'      => 'insert',
-                                                'filename'  => 'insert_'.$name,
-                                                'depth'     => $smarty->_inclusion_depth,
-                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
-        }
-    }
-
-    return $params['results'];
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.process_compiled_include.php b/include/smarty/internals/core.process_compiled_include.php
deleted file mode 100644
index 904d597..0000000
--- a/include/smarty/internals/core.process_compiled_include.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Replace nocache-tags by results of the corresponding non-cacheable
- * functions and return it
- *
- * @param string $compiled_tpl
- * @param string $cached_source
- * @return string
- */
-
-function smarty_core_process_compiled_include($params, &$smarty)
-{
-    $_cache_including = $smarty->_cache_including;
-    $smarty->_cache_including = true;
-
-    $_return = $params['results'];
-
-    foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
-        $smarty->_include($_include_file_path, true);
-    }
-
-    foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
-        $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
-                                         array(&$smarty, '_process_compiled_include_callback'),
-                                         $_return);
-    }
-    $smarty->_cache_including = $_cache_including;
-    return $_return;
-}
-
-?>
diff --git a/include/smarty/internals/core.read_cache_file.php b/include/smarty/internals/core.read_cache_file.php
deleted file mode 100644
index c60e113..0000000
--- a/include/smarty/internals/core.read_cache_file.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * read a cache file, determine if it needs to be
- * regenerated or not
- *
- * @param string $tpl_file
- * @param string $cache_id
- * @param string $compile_id
- * @param string $results
- * @return boolean
- */
-
-//  $tpl_file, $cache_id, $compile_id, &$results
-
-function smarty_core_read_cache_file(&$params, &$smarty)
-{
-    static  $content_cache = array();
-
-    if ($smarty->force_compile) {
-        // force compile enabled, always regenerate
-        return false;
-    }
-
-    if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
-        list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
-        return true;
-    }
-
-    if (!empty($smarty->cache_handler_func)) {
-        // use cache_handler function
-        call_user_func_array($smarty->cache_handler_func,
-                             array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
-    } else {
-        // use local cache file
-        $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
-        $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
-        $params['results'] = $smarty->_read_file($_cache_file);
-    }
-
-    if (empty($params['results'])) {
-        // nothing to parse (error?), regenerate cache
-        return false;
-    }
-
-    $_contents = $params['results'];
-    $_info_start = strpos($_contents, "\n") + 1;
-    $_info_len = (int)substr($_contents, 0, $_info_start - 1);
-    $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
-    $params['results'] = substr($_contents, $_info_start + $_info_len);
-
-    if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
-        // caching by expiration time
-        if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
-            // cache expired, regenerate
-            return false;
-        }
-    } else {
-        // caching by lifetime
-        if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
-            // cache expired, regenerate
-            return false;
-        }
-    }
-
-    if ($smarty->compile_check) {
-        $_params = array('get_source' => false, 'quiet'=>true);
-        foreach (array_keys($_cache_info['template']) as $_template_dep) {
-            $_params['resource_name'] = $_template_dep;
-            if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
-                // template file has changed, regenerate cache
-                return false;
-            }
-        }
-
-        if (isset($_cache_info['config'])) {
-            $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
-            foreach (array_keys($_cache_info['config']) as $_config_dep) {
-                $_params['resource_name'] = $_config_dep;
-                if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
-                    // config file has changed, regenerate cache
-                    return false;
-                }
-            }
-        }
-    }
-
-    $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
-
-    $smarty->_cache_info = $_cache_info;
-    return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.rm_auto.php b/include/smarty/internals/core.rm_auto.php
deleted file mode 100644
index b251f64..0000000
--- a/include/smarty/internals/core.rm_auto.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * delete an automagically created file by name and id
- *
- * @param string $auto_base
- * @param string $auto_source
- * @param string $auto_id
- * @param integer $exp_time
- * @return boolean
- */
-
-// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
-
-function smarty_core_rm_auto($params, &$smarty)
-{
-    if (!@is_dir($params['auto_base']))
-      return false;
-
-    if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
-        $_params = array(
-            'dirname' => $params['auto_base'],
-            'level' => 0,
-            'exp_time' => $params['exp_time']
-        );
-        require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
-        $_res = smarty_core_rmdir($_params, $smarty);
-    } else {
-        $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
-
-        if(isset($params['auto_source'])) {
-            if (isset($params['extensions'])) {
-                $_res = false;
-                foreach ((array)$params['extensions'] as $_extension)
-                    $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
-            } else {
-                $_res = $smarty->_unlink($_tname, $params['exp_time']);
-            }
-        } elseif ($smarty->use_sub_dirs) {
-            $_params = array(
-                'dirname' => $_tname,
-                'level' => 1,
-                'exp_time' => $params['exp_time']
-            );
-            require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
-            $_res = smarty_core_rmdir($_params, $smarty);
-        } else {
-            // remove matching file names
-            $_handle = opendir($params['auto_base']);
-            $_res = true;
-            while (false !== ($_filename = readdir($_handle))) {
-                if($_filename == '.' || $_filename == '..') {
-                    continue;
-                } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
-                    $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
-                }
-            }
-        }
-    }
-
-    return $_res;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.rmdir.php b/include/smarty/internals/core.rmdir.php
deleted file mode 100644
index 2166c44..0000000
--- a/include/smarty/internals/core.rmdir.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * delete a dir recursively (level=0 -> keep root)
- * WARNING: no tests, it will try to remove what you tell it!
- *
- * @param string $dirname
- * @param integer $level
- * @param integer $exp_time
- * @return boolean
- */
-
-//  $dirname, $level = 1, $exp_time = null
-
-function smarty_core_rmdir($params, &$smarty)
-{
-   if(!isset($params['level'])) { $params['level'] = 1; }
-   if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
-
-   if($_handle = @opendir($params['dirname'])) {
-
-        while (false !== ($_entry = readdir($_handle))) {
-            if ($_entry != '.' && $_entry != '..') {
-                if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
-                    $_params = array(
-                        'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
-                        'level' => $params['level'] + 1,
-                        'exp_time' => $params['exp_time']
-                    );
-                    smarty_core_rmdir($_params, $smarty);
-                }
-                else {
-                    $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
-                }
-            }
-        }
-        closedir($_handle);
-   }
-
-   if ($params['level']) {
-       return @rmdir($params['dirname']);
-   }
-   return (bool)$_handle;
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.run_insert_handler.php b/include/smarty/internals/core.run_insert_handler.php
deleted file mode 100644
index 71c3845..0000000
--- a/include/smarty/internals/core.run_insert_handler.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Handle insert tags
- *
- * @param array $args
- * @return string
- */
-function smarty_core_run_insert_handler($params, &$smarty)
-{
-
-    require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-    if ($smarty->debugging) {
-        $_params = array();
-        $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
-    }
-
-    if ($smarty->caching) {
-        $_arg_string = serialize($params['args']);
-        $_name = $params['args']['name'];
-        if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
-            $smarty->_cache_info['insert_tags'][$_name] = array('insert',
-                                                             $_name,
-                                                             $smarty->_plugins['insert'][$_name][1],
-                                                             $smarty->_plugins['insert'][$_name][2],
-                                                             !empty($params['args']['script']) ? true : false);
-        }
-        return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
-    } else {
-        if (isset($params['args']['script'])) {
-            $_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
-            require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
-            if(!smarty_core_get_php_resource($_params, $smarty)) {
-                return false;
-            }
-
-            if ($_params['resource_type'] == 'file') {
-                $smarty->_include($_params['php_resource'], true);
-            } else {
-                $smarty->_eval($_params['php_resource']);
-            }
-            unset($params['args']['script']);
-        }
-
-        $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
-        $_content = $_funcname($params['args'], $smarty);
-        if ($smarty->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $smarty->_smarty_debug_info[] = array('type'      => 'insert',
-                                                'filename'  => 'insert_'.$params['args']['name'],
-                                                'depth'     => $smarty->_inclusion_depth,
-                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
-        }
-
-        if (!empty($params['args']["assign"])) {
-            $smarty->assign($params['args']["assign"], $_content);
-        } else {
-            return $_content;
-        }
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.smarty_include_php.php b/include/smarty/internals/core.smarty_include_php.php
deleted file mode 100644
index 30c6e76..0000000
--- a/include/smarty/internals/core.smarty_include_php.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * called for included php files within templates
- *
- * @param string $smarty_file
- * @param string $smarty_assign variable to assign the included template's
- *               output into
- * @param boolean $smarty_once uses include_once if this is true
- * @param array $smarty_include_vars associative array of vars from
- *              {include file="blah" var=$var}
- */
-
-//  $file, $assign, $once, $_smarty_include_vars
-
-function smarty_core_smarty_include_php($params, &$smarty)
-{
-    $_params = array('resource_name' => $params['smarty_file']);
-    require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
-    smarty_core_get_php_resource($_params, $smarty);
-    $_smarty_resource_type = $_params['resource_type'];
-    $_smarty_php_resource = $_params['php_resource'];
-
-    if (!empty($params['smarty_assign'])) {
-        ob_start();
-        if ($_smarty_resource_type == 'file') {
-            $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
-        } else {
-            $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
-        }
-        $smarty->assign($params['smarty_assign'], ob_get_contents());
-        ob_end_clean();
-    } else {
-        if ($_smarty_resource_type == 'file') {
-            $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
-        } else {
-            $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
-        }
-    }
-}
-
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.write_cache_file.php b/include/smarty/internals/core.write_cache_file.php
deleted file mode 100644
index fa3cdd7..0000000
--- a/include/smarty/internals/core.write_cache_file.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Prepend the cache information to the cache file
- * and write it
- *
- * @param string $tpl_file
- * @param string $cache_id
- * @param string $compile_id
- * @param string $results
- * @return true|null
- */
-
- // $tpl_file, $cache_id, $compile_id, $results
-
-function smarty_core_write_cache_file($params, &$smarty)
-{
-
-    // put timestamp in cache header
-    $smarty->_cache_info['timestamp'] = time();
-    if ($smarty->cache_lifetime > -1){
-        // expiration set
-        $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
-    } else {
-        // cache will never expire
-        $smarty->_cache_info['expires'] = -1;
-    }
-
-    // collapse nocache.../nocache-tags
-    if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
-        // remove everything between every pair of outermost noache.../nocache-tags
-        // and replace it by a single nocache-tag
-        // this new nocache-tag will be replaced by dynamic contents in
-        // smarty_core_process_compiled_includes() on a cache-read
-        
-        $match_count = count($match[0]);
-        $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
-        
-        $level = 0;
-        $j = 0;
-        for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
-            if ($results[$i] == $match[0][$j]) {
-                // nocache tag
-                if ($match[1][$j]) { // closing tag
-                    $level--;
-                    unset($results[$i]);
-                } else { // opening tag
-                    if ($level++ > 0) unset($results[$i]);
-                }
-                $j++;
-            } elseif ($level > 0) {
-                unset($results[$i]);
-            }
-        }
-        $params['results'] = implode('', $results);
-    }
-    $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
-
-    // prepend the cache header info into cache file
-    $_cache_info = serialize($smarty->_cache_info);
-    $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
-
-    if (!empty($smarty->cache_handler_func)) {
-        // use cache_handler function
-        call_user_func_array($smarty->cache_handler_func,
-                             array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires']));
-    } else {
-        // use local cache file
-
-        if(!@is_writable($smarty->cache_dir)) {
-            // cache_dir not writable, see if it exists
-            if(!@is_dir($smarty->cache_dir)) {
-                $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
-                return false;
-            }
-            $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
-            return false;
-        }
-
-        $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
-        $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
-        $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
-        require_once(SMARTY_CORE_DIR . 'core.write_file.php');
-        smarty_core_write_file($_params, $smarty);
-        return true;
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.write_compiled_include.php b/include/smarty/internals/core.write_compiled_include.php
deleted file mode 100644
index c14adb5..0000000
--- a/include/smarty/internals/core.write_compiled_include.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Extract non-cacheable parts out of compiled template and write it
- *
- * @param string $compile_path
- * @param string $template_compiled
- * @return boolean
- */
-
-function smarty_core_write_compiled_include($params, &$smarty)
-{
-    $_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
-    $_tag_end   = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
-
-    preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
-                   $params['compiled_content'], $_match_source, PREG_SET_ORDER);
-    
-    // no nocache-parts found: done
-    if (count($_match_source)==0) return;
-
-    // convert the matched php-code to functions
-    $_include_compiled =  "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
-    $_include_compiled .= "         compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
-
-    $_compile_path = $params['include_file_path'];
-
-    $smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
-    $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
-
-    $_include_compiled .= $params['plugins_code'];
-    $_include_compiled .= "<?php";
-
-    $this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
-    for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
-        $_match =& $_match_source[$_i];
-        $source = $_match[4];
-        if ($this_varname == '_smarty') {
-            /* rename $this to $_smarty in the sourcecode */
-            $tokens = token_get_all('<?php ' . $_match[4]);
-
-            /* remove trailing <?php */
-            $open_tag = '';
-            while ($tokens) {
-                $token = array_shift($tokens);
-                if (is_array($token)) {
-                    $open_tag .= $token[1];
-                } else {
-                    $open_tag .= $token;
-                }
-                if ($open_tag == '<?php ') break;
-            }
-
-            for ($i=0, $count = count($tokens); $i < $count; $i++) {
-                if (is_array($tokens[$i])) {
-                    if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
-                        $tokens[$i] = '$' . $this_varname;
-                    } else {
-                        $tokens[$i] = $tokens[$i][1];
-                    }                   
-                }
-            }
-            $source = implode('', $tokens);
-        }
-
-        /* add function to compiled include */
-        $_include_compiled .= "
-function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
-{
-$source
-}
-
-";
-    }
-    $_include_compiled .= "\n\n?>\n";
-
-    $_params = array('filename' => $_compile_path,
-                     'contents' => $_include_compiled, 'create_dirs' => true);
-
-    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
-    smarty_core_write_file($_params, $smarty);
-    return true;
-}
-
-
-?>
diff --git a/include/smarty/internals/core.write_compiled_resource.php b/include/smarty/internals/core.write_compiled_resource.php
deleted file mode 100644
index b902eff..0000000
--- a/include/smarty/internals/core.write_compiled_resource.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * write the compiled resource
- *
- * @param string $compile_path
- * @param string $compiled_content
- * @return true
- */
-function smarty_core_write_compiled_resource($params, &$smarty)
-{
-    if(!@is_writable($smarty->compile_dir)) {
-        // compile_dir not writable, see if it exists
-        if(!@is_dir($smarty->compile_dir)) {
-            $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
-            return false;
-        }
-        $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
-        return false;
-    }
-
-    $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
-    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
-    smarty_core_write_file($_params, $smarty);
-    return true;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/internals/core.write_file.php b/include/smarty/internals/core.write_file.php
deleted file mode 100644
index 8a3a3b3..0000000
--- a/include/smarty/internals/core.write_file.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * write out a file to disk
- *
- * @param string $filename
- * @param string $contents
- * @param boolean $create_dirs
- * @return boolean
- */
-function smarty_core_write_file($params, &$smarty)
-{
-    $_dirname = dirname($params['filename']);
-
-    if ($params['create_dirs']) {
-        $_params = array('dir' => $_dirname);
-        require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
-        smarty_core_create_dir_structure($_params, $smarty);
-    }
-
-    // write to tmp file, then rename it to avoid file locking race condition
-    $_tmp_file = tempnam($_dirname, 'wrt');
-
-    if (!($fd = @fopen($_tmp_file, 'wb'))) {
-        $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
-        if (!($fd = @fopen($_tmp_file, 'wb'))) {
-            $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
-            return false;
-        }
-    }
-
-    fwrite($fd, $params['contents']);
-    fclose($fd);
-
-    if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
-        // On platforms and filesystems that cannot overwrite with rename() 
-        // delete the file before renaming it -- because windows always suffers
-        // this, it is short-circuited to avoid the initial rename() attempt
-        @unlink($params['filename']);
-        @rename($_tmp_file, $params['filename']);
-    }
-    @chmod($params['filename'], $smarty->_file_perms);
-
-    return true;
-}
-
-/* vim: set expandtab: */
-
-?>
\ No newline at end of file
diff --git a/include/smarty/plugins/block.textformat.php b/include/smarty/plugins/block.textformat.php
deleted file mode 100644
index 8cd010a..0000000
--- a/include/smarty/plugins/block.textformat.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {textformat}{/textformat} block plugin
- *
- * Type:     block function<br>
- * Name:     textformat<br>
- * Purpose:  format text a certain way with preset styles
- *           or custom wrap/indent settings<br>
- * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
- *       (Smarty online manual)
- * @param array
- * <pre>
- * Params:   style: string (email)
- *           indent: integer (0)
- *           wrap: integer (80)
- *           wrap_char string ("\n")
- *           indent_char: string (" ")
- *           wrap_boundary: boolean (true)
- * </pre>
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param string contents of the block
- * @param Smarty clever simulation of a method
- * @return string string $content re-formatted
- */
-function smarty_block_textformat($params, $content, &$smarty)
-{
-    if (is_null($content)) {
-        return;
-    }
-
-    $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:
-                $smarty->trigger_error("textformat: unknown attribute '$_key'");
-        }
-    }
-
-    if ($style == 'email') {
-        $wrap = 72;
-    }
-
-    // split into paragraphs
-    $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
-    $_output = '';
-
-    for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
-        if ($_paragraphs[$_x] == '') {
-            continue;
-        }
-        // convert mult. spaces & special chars to single space
-        $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
-        // indent first line
-        if($indent_first > 0) {
-            $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
-        }
-        // wordwrap sentences
-        $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
-        // indent lines
-        if($indent > 0) {
-            $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
-        }
-    }
-    $_output = implode($wrap_char . $wrap_char, $_paragraphs);
-
-    return $assign ? $smarty->assign($assign, $_output) : $_output;
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/compiler.assign.php b/include/smarty/plugins/compiler.assign.php
deleted file mode 100644
index abef377..0000000
--- a/include/smarty/plugins/compiler.assign.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {assign} compiler function plugin
- *
- * Type:     compiler function<br>
- * Name:     assign<br>
- * Purpose:  assign a value to a template variable
- * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
- *       (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com> (initial author)
- * @author messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
- * @param string containing var-attribute and value-attribute
- * @param Smarty_Compiler
- */
-function smarty_compiler_assign($tag_attrs, &$compiler)
-{
-    $_params = $compiler->_parse_attrs($tag_attrs);
-
-    if (!isset($_params['var'])) {
-        $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
-        return;
-    }
-
-    if (!isset($_params['value'])) {
-        $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
-        return;
-    }
-
-    return "\$this->assign({$_params['var']}, {$_params['value']});";
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.assign_debug_info.php b/include/smarty/plugins/function.assign_debug_info.php
deleted file mode 100644
index 6540498..0000000
--- a/include/smarty/plugins/function.assign_debug_info.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {assign_debug_info} function plugin
- *
- * Type:     function<br>
- * Name:     assign_debug_info<br>
- * Purpose:  assign debug info to the template<br>
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
- *              {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
- * @param Smarty
- */
-function smarty_function_assign_debug_info($params, &$smarty)
-{
-    $assigned_vars = $smarty->_tpl_vars;
-    ksort($assigned_vars);
-    if (@is_array($smarty->_config[0])) {
-        $config_vars = $smarty->_config[0];
-        ksort($config_vars);
-        $smarty->assign("_debug_config_keys", array_keys($config_vars));
-        $smarty->assign("_debug_config_vals", array_values($config_vars));
-    }
-    
-    $included_templates = $smarty->_smarty_debug_info;
-    
-    $smarty->assign("_debug_keys", array_keys($assigned_vars));
-    $smarty->assign("_debug_vals", array_values($assigned_vars));
-    
-    $smarty->assign("_debug_tpls", $included_templates);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.config_load.php b/include/smarty/plugins/function.config_load.php
deleted file mode 100644
index db89f63..0000000
--- a/include/smarty/plugins/function.config_load.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {config_load} function plugin
- *
- * Type:     function<br>
- * Name:     config_load<br>
- * Purpose:  load config file vars
- * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
- *       (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
- * @param array Format:
- * <pre>
- * array('file' => required config file name,
- *       'section' => optional config file section to load
- *       'scope' => local/parent/global
- *       'global' => overrides scope, setting to parent if true)
- * </pre>
- * @param Smarty
- */
-function smarty_function_config_load($params, &$smarty)
-{
-        if ($smarty->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
-        }
-
-        $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
-        $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
-        $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
-        $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
-
-        if (!isset($_file) || strlen($_file) == 0) {
-            $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
-        }
-
-        if (isset($_scope)) {
-            if ($_scope != 'local' &&
-                $_scope != 'parent' &&
-                $_scope != 'global') {
-                $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
-            }
-        } else {
-            if ($_global) {
-                $_scope = 'parent';
-            } else {
-                $_scope = 'local';
-            }
-        }
-
-        $_params = array('resource_name' => $_file,
-                         'resource_base_path' => $smarty->config_dir,
-                         'get_source' => false);
-        $smarty->_parse_resource_name($_params);
-        $_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
-        if (isset($_section))
-            $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
-        else
-            $_compile_file = $smarty->_get_compile_path($_file_path);
-
-        if($smarty->force_compile || !file_exists($_compile_file)) {
-            $_compile = true;
-        } elseif ($smarty->compile_check) {
-            $_params = array('resource_name' => $_file,
-                             'resource_base_path' => $smarty->config_dir,
-                             'get_source' => false);
-            $_compile = $smarty->_fetch_resource_info($_params) &&
-                $_params['resource_timestamp'] > filemtime($_compile_file);
-        } else {
-            $_compile = false;
-        }
-
-        if($_compile) {
-            // compile config file
-            if(!is_object($smarty->_conf_obj)) {
-                require_once SMARTY_DIR . $smarty->config_class . '.class.php';
-                $smarty->_conf_obj = new $smarty->config_class();
-                $smarty->_conf_obj->overwrite = $smarty->config_overwrite;
-                $smarty->_conf_obj->booleanize = $smarty->config_booleanize;
-                $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
-                $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
-            }
-
-            $_params = array('resource_name' => $_file,
-                             'resource_base_path' => $smarty->config_dir,
-                             $_params['get_source'] = true);
-            if (!$smarty->_fetch_resource_info($_params)) {
-                return;
-            }
-            $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
-            $_config_vars = array_merge($smarty->_conf_obj->get($_file),
-                    $smarty->_conf_obj->get($_file, $_section));
-            if(function_exists('var_export')) {
-                $_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
-            } else {
-                $_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
-            }
-            $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
-            require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
-            smarty_core_write_compiled_resource($_params, $smarty);
-        } else {
-            include($_compile_file);
-        }
-
-        if ($smarty->caching) {
-            $smarty->_cache_info['config'][$_file] = true;
-        }
-
-        $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
-        $smarty->_config[0]['files'][$_file] = true;
-
-        if ($_scope == 'parent') {
-                $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
-                $smarty->_config[1]['files'][$_file] = true;
-        } else if ($_scope == 'global') {
-            for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
-                $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
-                $smarty->_config[$i]['files'][$_file] = true;
-            }
-        }
-
-        if ($smarty->debugging) {
-            $_params = array();
-            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
-            $smarty->_smarty_debug_info[] = array('type'      => 'config',
-                                                'filename'  => $_file.' ['.$_section.'] '.$_scope,
-                                                'depth'     => $smarty->_inclusion_depth,
-                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
-        }
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.counter.php b/include/smarty/plugins/function.counter.php
deleted file mode 100644
index 1f26db5..0000000
--- a/include/smarty/plugins/function.counter.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {counter} function plugin
- *
- * Type:     function<br>
- * Name:     counter<br>
- * Purpose:  print out a counter value
- * @author Monte Ohrt <monte at ohrt dot com>
- * @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
- *       (Smarty online manual)
- * @param array parameters
- * @param Smarty
- * @return string|null
- */
-function smarty_function_counter($params, &$smarty)
-{
-    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'])) {
-        $smarty->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;
-    
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.cycle.php b/include/smarty/plugins/function.cycle.php
deleted file mode 100644
index 80378b7..0000000
--- a/include/smarty/plugins/function.cycle.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {cycle} function plugin
- *
- * Type:     function<br>
- * Name:     cycle<br>
- * Date:     May 3, 2002<br>
- * Purpose:  cycle through given values<br>
- * Input:
- *         - 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:<br>
- * <pre>
- * {cycle values="#eeeeee,#d0d0d0d"}
- * {cycle name=row values="one,two,three" reset=true}
- * {cycle name=row}
- * </pre>
- * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
- *       (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @author credit to Mark Priatel <mpriatel at rogers.com>
- * @author credit to Gerard <gerard at interfold.com>
- * @author credit to Jason Sweat <jsweat_php at yahoo.com>
- * @version  1.3
- * @param array
- * @param Smarty
- * @return string|null
- */
-function smarty_function_cycle($params, &$smarty)
-{
-    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 (!in_array('values', array_keys($params))) {
-        if(!isset($cycle_vars[$name]['values'])) {
-            $smarty->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;
-        $smarty->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;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.debug.php b/include/smarty/plugins/function.debug.php
deleted file mode 100644
index 4345230..0000000
--- a/include/smarty/plugins/function.debug.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {debug} function plugin
- *
- * Type:     function<br>
- * Name:     debug<br>
- * Date:     July 1, 2002<br>
- * Purpose:  popup debug window
- * @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
- *       (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @version  1.0
- * @param array
- * @param Smarty
- * @return string output from {@link Smarty::_generate_debug_output()}
- */
-function smarty_function_debug($params, &$smarty)
-{
-    if (isset($params['output'])) {
-        $smarty->assign('_smarty_debug_output', $params['output']);
-    }
-    require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
-    return smarty_core_display_debug_console(null, $smarty);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.eval.php b/include/smarty/plugins/function.eval.php
deleted file mode 100644
index ff0472d..0000000
--- a/include/smarty/plugins/function.eval.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {eval} function plugin
- *
- * Type:     function<br>
- * Name:     eval<br>
- * Purpose:  evaluate a template variable as a template<br>
- * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
- *       (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- */
-function smarty_function_eval($params, &$smarty)
-{
-
-    if (!isset($params['var'])) {
-        $smarty->trigger_error("eval: missing 'var' parameter");
-        return;
-    }
-
-    if($params['var'] == '') {
-        return;
-    }
-
-    $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
-
-    ob_start();
-    $smarty->_eval('?>' . $_var_compiled);
-    $_contents = ob_get_contents();
-    ob_end_clean();
-
-    if (!empty($params['assign'])) {
-        $smarty->assign($params['assign'], $_contents);
-    } else {
-        return $_contents;
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.fetch.php b/include/smarty/plugins/function.fetch.php
deleted file mode 100644
index d72c7b1..0000000
--- a/include/smarty/plugins/function.fetch.php
+++ /dev/null
@@ -1,221 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {fetch} plugin
- *
- * Type:     function<br>
- * Name:     fetch<br>
- * Purpose:  fetch file, web or ftp data and display results
- * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
- *       (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string|null if the assign parameter is passed, Smarty assigns the
- *                     result to a template variable
- */
-function smarty_function_fetch($params, &$smarty)
-{
-    if (empty($params['file'])) {
-        $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
-        return;
-    }
-
-    $content = '';
-    if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
-        $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
-        require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
-        if(!smarty_core_is_secure($_params, $smarty)) {
-            $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
-            return;
-        }
-        
-        // fetch the file
-        if($fp = @fopen($params['file'],'r')) {
-            while(!feof($fp)) {
-                $content .= fgets ($fp,4096);
-            }
-            fclose($fp);
-        } else {
-            $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
-            return;
-        }
-    } else {
-        // not a local file
-        if(preg_match('!^http://!i',$params['file'])) {
-            // 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->_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)) {
-                                    $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
-                                    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 {
-                                $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
-                                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 {
-                                $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
-                                return;
-                            }
-                            break;
-                        default:
-                            $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
-                            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) {
-                    $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
-                    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'])) {
-                        $smarty->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0]));
-                    }
-                }
-            } else {
-                $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
-                return;
-            }
-        } else {
-            // ftp fetch
-            if($fp = @fopen($params['file'],'r')) {
-                while(!feof($fp)) {
-                    $content .= fgets ($fp,4096);
-                }
-                fclose($fp);
-            } else {
-                $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
-                return;
-            }
-        }
-
-    }
-
-
-    if (!empty($params['assign'])) {
-        $smarty->assign($params['assign'],$content);
-    } else {
-        return $content;
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.html_checkboxes.php b/include/smarty/plugins/function.html_checkboxes.php
deleted file mode 100644
index ed8ad7f..0000000
--- a/include/smarty/plugins/function.html_checkboxes.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_checkboxes} function plugin
- *
- * File:       function.html_checkboxes.php<br>
- * Type:       function<br>
- * Name:       html_checkboxes<br>
- * Date:       24.Feb.2003<br>
- * Purpose:    Prints out a list of checkbox input types<br>
- * Input:<br>
- *           - name       (optional) - string default "checkbox"
- *           - values     (required) - array
- *           - options    (optional) - associative array
- *           - checked    (optional) - array default not set
- *           - separator  (optional) - ie <br> or  
- *           - output     (optional) - the output next to each checkbox
- *           - assign     (optional) - assign the output as an array to this variable
- * Examples:
- * <pre>
- * {html_checkboxes values=$ids output=$names}
- * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
- * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
- * </pre>
- * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
- *      (Smarty online manual)
- * @author     Christopher Kvarme <christopher.kvarme at flashjab.com>
- * @author credits to Monte Ohrt <monte at ohrt dot com>
- * @version    1.0
- * @param array
- * @param Smarty
- * @return string
- * @uses smarty_function_escape_special_chars()
- */
-function smarty_function_html_checkboxes($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-
-    $name = 'checkbox';
-    $values = null;
-    $options = null;
-    $selected = null;
-    $separator = '';
-    $labels = true;
-    $output = null;
-
-    $extra = '';
-
-    foreach($params as $_key => $_val) {
-        switch($_key) {
-            case 'name':
-            case 'separator':
-                $$_key = $_val;
-                break;
-
-            case 'labels':
-                $$_key = (bool)$_val;
-                break;
-
-            case 'options':
-                $$_key = (array)$_val;
-                break;
-
-            case 'values':
-            case 'output':
-                $$_key = array_values((array)$_val);
-                break;
-
-            case 'checked':
-            case 'selected':
-                $selected = array_map('strval', array_values((array)$_val));
-                break;
-
-            case 'checkboxes':
-                $smarty->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;
-
-            default:
-                if(!is_array($_val)) {
-                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
-                } else {
-                    $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
-                }
-                break;
-        }
-    }
-
-    if (!isset($options) && !isset($values))
-        return ''; /* raise error here? */
-
-    settype($selected, 'array');
-    $_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);
-
-
-    } 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);
-        }
-
-    }
-
-    if(!empty($params['assign'])) {
-        $smarty->assign($params['assign'], $_html_result);
-    } else {
-        return implode("\n",$_html_result);
-    }
-
-}
-
-function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
-    $_output = '';
-    if ($labels) $_output .= '<label>';
-    $_output .= '<input type="checkbox" name="'
-        . smarty_function_escape_special_chars($name) . '[]" value="'
-        . smarty_function_escape_special_chars($value) . '"';
-
-    if (in_array((string)$value, $selected)) {
-        $_output .= ' checked="checked"';
-    }
-    $_output .= $extra . ' />' . $output;
-    if ($labels) $_output .= '</label>';
-    $_output .=  $separator;
-
-    return $_output;
-}
-
-?>
diff --git a/include/smarty/plugins/function.html_image.php b/include/smarty/plugins/function.html_image.php
deleted file mode 100644
index 9abae72..0000000
--- a/include/smarty/plugins/function.html_image.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_image} function plugin
- *
- * Type:     function<br>
- * Name:     html_image<br>
- * Date:     Feb 24, 2003<br>
- * Purpose:  format HTML tags for the image<br>
- * Input:<br>
- *         - file = file (and path) of image (required)
- *         - height = image height (optional, default actual height)
- *         - width = image width (optional, default actual width)
- *         - basedir = base directory for absolute paths, default
- *                     is environment variable DOCUMENT_ROOT
- *         - path_prefix = prefix for path output (optional, default empty)
- *
- * Examples: {html_image file="/images/masthead.gif"}
- * Output:   <img src="/images/masthead.gif" width=400 height=23>
- * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
- *      (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @author credits to Duda <duda at big.hu> - wrote first image function
- *           in repository, helped with lots of functionality
- * @version  1.0
- * @param array
- * @param Smarty
- * @return string
- * @uses smarty_function_escape_special_chars()
- */
-function smarty_function_html_image($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-    
-    $alt = '';
-    $file = '';
-    $height = '';
-    $width = '';
-    $extra = '';
-    $prefix = '';
-    $suffix = '';
-    $path_prefix = '';
-    $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
-    $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['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 {
-                    $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
-                }
-                break;
-
-            case 'link':
-            case 'href':
-                $prefix = '<a href="' . $_val . '">';
-                $suffix = '</a>';
-                break;
-
-            default:
-                if(!is_array($_val)) {
-                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
-                } else {
-                    $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
-                }
-                break;
-        }
-    }
-
-    if (empty($file)) {
-        $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
-        return;
-    }
-
-    if (substr($file,0,1) == '/') {
-        $_image_path = $basedir . $file;
-    } else {
-        $_image_path = $file;
-    }
-    
-    if(!isset($params['width']) || !isset($params['height'])) {
-        if(!$_image_data = @getimagesize($_image_path)) {
-            if(!file_exists($_image_path)) {
-                $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
-                return;
-            } else if(!is_readable($_image_path)) {
-                $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
-                return;
-            } else {
-                $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
-                return;
-            }
-        }
-        if ($smarty->security &&
-            ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
-            (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
-            (!smarty_core_is_secure($_params, $smarty)) ) {
-            $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
-        }        
-        
-        if(!isset($params['width'])) {
-            $width = $_image_data[0];
-        }
-        if(!isset($params['height'])) {
-            $height = $_image_data[1];
-        }
-
-    }
-
-    if(isset($params['dpi'])) {
-        if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
-            $dpi_default = 72;
-        } else {
-            $dpi_default = 96;
-        }
-        $_resize = $dpi_default/$params['dpi'];
-        $width = round($width * $_resize);
-        $height = round($height * $_resize);
-    }
-
-    return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.' />' . $suffix;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.html_options.php b/include/smarty/plugins/function.html_options.php
deleted file mode 100644
index cebadde..0000000
--- a/include/smarty/plugins/function.html_options.php
+++ /dev/null
@@ -1,122 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_options} function plugin
- *
- * Type:     function<br>
- * Name:     html_options<br>
- * Input:<br>
- *           - 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
- * Purpose:  Prints the list of <option> tags generated from
- *           the passed parameters
- * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
- *      (Smarty online manual)
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- * @uses smarty_function_escape_special_chars()
- */
-function smarty_function_html_options($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-    
-    $name = null;
-    $values = null;
-    $options = null;
-    $selected = array();
-    $output = null;
-    
-    $extra = '';
-    
-    foreach($params as $_key => $_val) {
-        switch($_key) {
-            case 'name':
-                $$_key = (string)$_val;
-                break;
-            
-            case 'options':
-                $$_key = (array)$_val;
-                break;
-                
-            case 'values':
-            case 'output':
-                $$_key = array_values((array)$_val);
-                break;
-
-            case 'selected':
-                $$_key = array_map('strval', array_values((array)$_val));
-                break;
-                
-            default:
-                if(!is_array($_val)) {
-                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
-                } else {
-                    $smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
-                }
-                break;
-        }
-    }
-
-    if (!isset($options) && !isset($values))
-        return ''; /* raise error here? */
-
-    $_html_result = '';
-
-    if (isset($options)) {
-        
-        foreach ($options as $_key=>$_val)
-            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
-
-    } else {
-        
-        foreach ($values as $_i=>$_key) {
-            $_val = isset($output[$_i]) ? $output[$_i] : '';
-            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
-        }
-
-    }
-
-    if(!empty($name)) {
-        $_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
-    }
-
-    return $_html_result;
-
-}
-
-function smarty_function_html_options_optoutput($key, $value, $selected) {
-    if(!is_array($value)) {
-        $_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
-            smarty_function_escape_special_chars($key) . '"';
-        if (in_array((string)$key, $selected))
-            $_html_result .= ' selected="selected"';
-        $_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
-    } else {
-        $_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
-    }
-    return $_html_result;
-}
-
-function smarty_function_html_options_optgroup($key, $values, $selected) {
-    $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
-    foreach ($values as $key => $value) {
-        $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
-    }
-    $optgroup_html .= "</optgroup>\n";
-    return $optgroup_html;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.html_radios.php b/include/smarty/plugins/function.html_radios.php
deleted file mode 100644
index 7503cfa..0000000
--- a/include/smarty/plugins/function.html_radios.php
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_radios} function plugin
- *
- * File:       function.html_radios.php<br>
- * Type:       function<br>
- * Name:       html_radios<br>
- * Date:       24.Feb.2003<br>
- * Purpose:    Prints out a list of radio input types<br>
- * Input:<br>
- *           - name       (optional) - string default "radio"
- *           - values     (required) - array
- *           - options    (optional) - associative array
- *           - checked    (optional) - array default not set
- *           - separator  (optional) - ie <br> or  
- *           - output     (optional) - the output next to each radio button
- *           - assign     (optional) - assign the output as an array to this variable
- * Examples:
- * <pre>
- * {html_radios values=$ids output=$names}
- * {html_radios values=$ids name='box' separator='<br>' output=$names}
- * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
- * </pre>
- * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
- *      (Smarty online manual)
- * @author     Christopher Kvarme <christopher.kvarme at flashjab.com>
- * @author credits to Monte Ohrt <monte at ohrt dot com>
- * @version    1.0
- * @param array
- * @param Smarty
- * @return string
- * @uses smarty_function_escape_special_chars()
- */
-function smarty_function_html_radios($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-   
-    $name = 'radio';
-    $values = null;
-    $options = null;
-    $selected = null;
-    $separator = '';
-    $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)) {
-                    $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
-                } else {
-                    $selected = (string)$_val;
-                }
-                break;
-
-            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':
-                $smarty->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;
-
-            default:
-                if(!is_array($_val)) {
-                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
-                } else {
-                    $smarty->trigger_error("html_radios: 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_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
-
-    } 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);
-        }
-
-    }
-
-    if(!empty($params['assign'])) {
-        $smarty->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) {
-    $_output = '';
-    if ($labels) {
-      if($label_ids) {
-          $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
-          $_output .= '<label for="' . $_id . '">';
-      } else {
-          $_output .= '<label>';           
-      }
-   }
-   $_output .= '<input type="radio" name="'
-        . smarty_function_escape_special_chars($name) . '" value="'
-        . smarty_function_escape_special_chars($value) . '"';
-
-   if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
-
-    if ((string)$value==$selected) {
-        $_output .= ' checked="checked"';
-    }
-    $_output .= $extra . ' />' . $output;
-    if ($labels) $_output .= '</label>';
-    $_output .=  $separator;
-
-    return $_output;
-}
-
-?>
diff --git a/include/smarty/plugins/function.html_select_date.php b/include/smarty/plugins/function.html_select_date.php
deleted file mode 100644
index e5eb183..0000000
--- a/include/smarty/plugins/function.html_select_date.php
+++ /dev/null
@@ -1,331 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Smarty {html_select_date} plugin
- *
- * Type:     function<br>
- * Name:     html_select_date<br>
- * Purpose:  Prints the dropdowns for date selection.
- *
- * ChangeLog:<br>
- *           - 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)
- * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
- *      (Smarty online manual)
- * @version 1.3.4
- * @author Andrei Zmievski
- * @author Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_html_select_date($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
-    require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
-    require_once $smarty->_get_plugin_filepath('function','html_options');
-    /* Default values. */
-    $prefix          = "Date_";
-    $start_year      = strftime("%Y");
-    $end_year        = $start_year;
-    $display_days    = true;
-    $display_months  = true;
-    $display_years   = true;
-    $month_format    = "%B";
-    /* Write months as numbers by default  GL */
-    $month_value_format = "%m";
-    $day_format      = "%02d";
-    /* Write day values using this format MB */
-    $day_value_format = "%d";
-    $year_as_text    = false;
-    /* Display years in reverse order? Ie. 2000,1999,.... */
-    $reverse_years   = false;
-    /* Should the select boxes be part of an array when returned from PHP?
-       e.g. setting it to "birthday", would create "birthday[Day]",
-       "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
-    $field_array     = null;
-    /* <select size>'s of the different <select> tags.
-       If not set, uses default dropdown. */
-    $day_size        = null;
-    $month_size      = null;
-    $year_size       = null;
-    /* Unparsed attributes common to *ALL* the <select>/<input> tags.
-       An example might be in the template: all_extra ='class ="foo"'. */
-    $all_extra       = null;
-    /* Separate attributes for the tags. */
-    $day_extra       = null;
-    $month_extra     = null;
-    $year_extra      = null;
-    /* Order in which to display the fields.
-       "D" -> day, "M" -> month, "Y" -> year. */
-    $field_order     = 'MDY';
-    /* String printed between the different fields. */
-    $field_separator = "\n";
-    $time = time();
-    $all_empty       = null;
-    $day_empty       = null;
-    $month_empty     = null;
-    $year_empty      = null;
-    $extra_attrs     = '';
-
-    foreach ($params as $_key=>$_value) {
-        switch ($_key) {
-            case 'prefix':
-            case 'time':
-            case 'start_year':
-            case 'end_year':
-            case 'month_format':
-            case 'day_format':
-            case 'day_value_format':
-            case 'field_array':
-            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 'month_value_format':
-            case 'month_empty':
-            case 'day_empty':
-            case 'year_empty':
-                $$_key = (string)$_value;
-                break;
-
-            case 'all_empty':
-                $$_key = (string)$_value;
-                $day_empty = $month_empty = $year_empty = $all_empty;
-                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 {
-                    $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
-                }
-                break;
-        }
-    }
-
-    if (preg_match('!^-\d+$!', $time)) {
-        // negative timestamp, use date()
-        $time = date('Y-m-d', $time);
-    }
-    // If $time is not in format yyyy-mm-dd
-    if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
-        $time = $found[1];
-    } else {
-        // use smarty_make_timestamp to get an unix timestamp and
-        // strftime to make yyyy-mm-dd
-        $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
-    }
-    // Now split this in pieces, which later can be used to set the select
-    $time = explode("-", $time);
-
-    // make syntax "+N" or "-N" work with start_year and end_year
-    if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
-        if ($match[1] == '+') {
-            $end_year = strftime('%Y') + $match[2];
-        } else {
-            $end_year = strftime('%Y') - $match[2];
-        }
-    }
-    if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
-        if ($match[1] == '+') {
-            $start_year = strftime('%Y') + $match[2];
-        } else {
-            $start_year = strftime('%Y') - $match[2];
-        }
-    }
-    if (strlen($time[0]) > 0) {
-        if ($start_year > $time[0] && !isset($params['start_year'])) {
-            // force start year to include given date if not explicitly set
-            $start_year = $time[0];
-        }
-        if($end_year < $time[0] && !isset($params['end_year'])) {
-            // force end year to include given date if not explicitly set
-            $end_year = $time[0];
-        }
-    }
-
-    $field_order = strtoupper($field_order);
-
-    $html_result = $month_result = $day_result = $year_result = "";
-
-    $field_separator_count = -1;
-    if ($display_months) {
-    	$field_separator_count++;
-        $month_names = array();
-        $month_values = array();
-        if(isset($month_empty)) {
-            $month_names[''] = $month_empty;
-            $month_values[''] = '';
-        }
-        for ($i = 1; $i <= 12; $i++) {
-            $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
-            $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000));
-        }
-
-        $month_result .= '<select name=';
-        if (null !== $field_array){
-            $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
-        } else {
-            $month_result .= '"' . $prefix . 'Month"';
-        }
-        if (null !== $month_size){
-            $month_result .= ' size="' . $month_size . '"';
-        }
-        if (null !== $month_extra){
-            $month_result .= ' ' . $month_extra;
-        }
-        if (null !== $all_extra){
-            $month_result .= ' ' . $all_extra;
-        }
-        $month_result .= $extra_attrs . '>'."\n";
-
-        $month_result .= smarty_function_html_options(array('output'     => $month_names,
-                                                            'values'     => $month_values,
-                                                            'selected'   => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
-                                                            'print_result' => false),
-                                                      $smarty);
-        $month_result .= '</select>';
-    }
-
-    if ($display_days) {
-    	$field_separator_count++;
-        $days = array();
-        if (isset($day_empty)) {
-            $days[''] = $day_empty;
-            $day_values[''] = '';
-        }
-        for ($i = 1; $i <= 31; $i++) {
-            $days[] = sprintf($day_format, $i);
-            $day_values[] = sprintf($day_value_format, $i);
-        }
-
-        $day_result .= '<select name=';
-        if (null !== $field_array){
-            $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
-        } else {
-            $day_result .= '"' . $prefix . 'Day"';
-        }
-        if (null !== $day_size){
-            $day_result .= ' size="' . $day_size . '"';
-        }
-        if (null !== $all_extra){
-            $day_result .= ' ' . $all_extra;
-        }
-        if (null !== $day_extra){
-            $day_result .= ' ' . $day_extra;
-        }
-        $day_result .= $extra_attrs . '>'."\n";
-        $day_result .= smarty_function_html_options(array('output'     => $days,
-                                                          'values'     => $day_values,
-                                                          'selected'   => $time[2],
-                                                          'print_result' => false),
-                                                    $smarty);
-        $day_result .= '</select>';
-    }
-
-    if ($display_years) {
-    	$field_separator_count++;
-        if (null !== $field_array){
-            $year_name = $field_array . '[' . $prefix . 'Year]';
-        } else {
-            $year_name = $prefix . 'Year';
-        }
-        if ($year_as_text) {
-            $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"';
-            if (null !== $all_extra){
-                $year_result .= ' ' . $all_extra;
-            }
-            if (null !== $year_extra){
-                $year_result .= ' ' . $year_extra;
-            }
-            $year_result .= ' />';
-        } else {
-            $years = range((int)$start_year, (int)$end_year);
-            if ($reverse_years) {
-                rsort($years, SORT_NUMERIC);
-            } else {
-                sort($years, SORT_NUMERIC);
-            }
-            $yearvals = $years;
-            if(isset($year_empty)) {
-                array_unshift($years, $year_empty);
-                array_unshift($yearvals, '');
-            }
-            $year_result .= '<select name="' . $year_name . '"';
-            if (null !== $year_size){
-                $year_result .= ' size="' . $year_size . '"';
-            }
-            if (null !== $all_extra){
-                $year_result .= ' ' . $all_extra;
-            }
-            if (null !== $year_extra){
-                $year_result .= ' ' . $year_extra;
-            }
-            $year_result .= $extra_attrs . '>'."\n";
-            $year_result .= smarty_function_html_options(array('output' => $years,
-                                                               'values' => $yearvals,
-                                                               'selected'   => $time[0],
-                                                               'print_result' => false),
-                                                         $smarty);
-            $year_result .= '</select>';
-        }
-    }
-
-    // Loop thru the field_order field
-    for ($i = 0; $i <= 2; $i++){
-        $c = substr($field_order, $i, 1);
-        switch ($c){
-            case 'D':
-                $html_result .= $day_result;
-                break;
-
-            case 'M':
-                $html_result .= $month_result;
-                break;
-
-            case 'Y':
-                $html_result .= $year_result;
-                break;
-        }
-        // Add the field seperator
-        if($i < $field_separator_count) {
-            $html_result .= $field_separator;
-        }
-    }
-
-    return $html_result;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.html_select_time.php b/include/smarty/plugins/function.html_select_time.php
deleted file mode 100644
index 2e5be7e..0000000
--- a/include/smarty/plugins/function.html_select_time.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_select_time} function plugin
- *
- * Type:     function<br>
- * Name:     html_select_time<br>
- * Purpose:  Prints the dropdowns for time selection
- * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
- *          (Smarty online manual)
- * @author Roberto Berto <roberto at berto.net>
- * @credits Monte Ohrt <monte AT ohrt DOT com>
- * @param array
- * @param Smarty
- * @return string
- * @uses smarty_make_timestamp()
- */
-function smarty_function_html_select_time($params, &$smarty)
-{
-    require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
-    require_once $smarty->_get_plugin_filepath('function','html_options');
-    /* Default values. */
-    $prefix             = "Time_";
-    $time               = time();
-    $display_hours      = true;
-    $display_minutes    = true;
-    $display_seconds    = true;
-    $display_meridian   = true;
-    $use_24_hours       = true;
-    $minute_interval    = 1;
-    $second_interval    = 1;
-    /* Should the select boxes be part of an array when returned from PHP?
-       e.g. setting it to "birthday", would create "birthday[Hour]",
-       "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
-       Can be combined with prefix. */
-    $field_array        = null;
-    $all_extra          = null;
-    $hour_extra         = null;
-    $minute_extra       = null;
-    $second_extra       = null;
-    $meridian_extra     = null;
-
-    foreach ($params as $_key=>$_value) {
-        switch ($_key) {
-            case 'prefix':
-            case 'time':
-            case 'field_array':
-            case 'all_extra':
-            case 'hour_extra':
-            case 'minute_extra':
-            case 'second_extra':
-            case 'meridian_extra':
-                $$_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':
-                $$_key = (int)$_value;
-                break;
-
-            default:
-                $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
-        }
-    }
-
-    $time = smarty_make_timestamp($time);
-
-    $html_result = '';
-
-    if ($display_hours) {
-        $hours       = $use_24_hours ? range(0, 23) : range(1, 12);
-        $hour_fmt = $use_24_hours ? '%H' : '%I';
-        for ($i = 0, $for_max = count($hours); $i < $for_max; $i++)
-            $hours[$i] = sprintf('%02d', $hours[$i]);
-        $html_result .= '<select name=';
-        if (null !== $field_array) {
-            $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
-        } else {
-            $html_result .= '"' . $prefix . 'Hour"';
-        }
-        if (null !== $hour_extra){
-            $html_result .= ' ' . $hour_extra;
-        }
-        if (null !== $all_extra){
-            $html_result .= ' ' . $all_extra;
-        }
-        $html_result .= '>'."\n";
-        $html_result .= smarty_function_html_options(array('output'          => $hours,
-                                                           'values'          => $hours,
-                                                           'selected'      => strftime($hour_fmt, $time),
-                                                           'print_result' => false),
-                                                     $smarty);
-        $html_result .= "</select>\n";
-    }
-
-    if ($display_minutes) {
-        $all_minutes = range(0, 59);
-        for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval)
-            $minutes[] = sprintf('%02d', $all_minutes[$i]);
-        $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
-        $html_result .= '<select name=';
-        if (null !== $field_array) {
-            $html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"';
-        } else {
-            $html_result .= '"' . $prefix . 'Minute"';
-        }
-        if (null !== $minute_extra){
-            $html_result .= ' ' . $minute_extra;
-        }
-        if (null !== $all_extra){
-            $html_result .= ' ' . $all_extra;
-        }
-        $html_result .= '>'."\n";
-        
-        $html_result .= smarty_function_html_options(array('output'          => $minutes,
-                                                           'values'          => $minutes,
-                                                           'selected'      => $selected,
-                                                           'print_result' => false),
-                                                     $smarty);
-        $html_result .= "</select>\n";
-    }
-
-    if ($display_seconds) {
-        $all_seconds = range(0, 59);
-        for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval)
-            $seconds[] = sprintf('%02d', $all_seconds[$i]);
-        $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
-        $html_result .= '<select name=';
-        if (null !== $field_array) {
-            $html_result .= '"' . $field_array . '[' . $prefix . 'Second]"';
-        } else {
-            $html_result .= '"' . $prefix . 'Second"';
-        }
-        
-        if (null !== $second_extra){
-            $html_result .= ' ' . $second_extra;
-        }
-        if (null !== $all_extra){
-            $html_result .= ' ' . $all_extra;
-        }
-        $html_result .= '>'."\n";
-        
-        $html_result .= smarty_function_html_options(array('output'          => $seconds,
-                                                           'values'          => $seconds,
-                                                           'selected'      => $selected,
-                                                           'print_result' => false),
-                                                     $smarty);
-        $html_result .= "</select>\n";
-    }
-
-    if ($display_meridian && !$use_24_hours) {
-        $html_result .= '<select name=';
-        if (null !== $field_array) {
-            $html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"';
-        } else {
-            $html_result .= '"' . $prefix . 'Meridian"';
-        }
-        
-        if (null !== $meridian_extra){
-            $html_result .= ' ' . $meridian_extra;
-        }
-        if (null !== $all_extra){
-            $html_result .= ' ' . $all_extra;
-        }
-        $html_result .= '>'."\n";
-        
-        $html_result .= smarty_function_html_options(array('output'          => array('AM', 'PM'),
-                                                           'values'          => array('am', 'pm'),
-                                                           'selected'      => strtolower(strftime('%p', $time)),
-                                                           'print_result' => false),
-                                                     $smarty);
-        $html_result .= "</select>\n";
-    }
-
-    return $html_result;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.html_table.php b/include/smarty/plugins/function.html_table.php
deleted file mode 100644
index 32aeba8..0000000
--- a/include/smarty/plugins/function.html_table.php
+++ /dev/null
@@ -1,177 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {html_table} function plugin
- *
- * Type:     function<br>
- * Name:     html_table<br>
- * Date:     Feb 17, 2003<br>
- * Purpose:  make an html table from an array of data<br>
- * Input:<br>
- *         - 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:
- * <pre>
- * {table loop=$data}
- * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
- * {table loop=$data cols="first,second,third" tr_attr=$colors}
- * </pre>
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
- * @author credit to boots <boots dot smarty at yahoo dot com>
- * @version  1.1
- * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
- *          (Smarty online manual)
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_html_table($params, &$smarty)
-{
-    $table_attr = 'border="1"';
-    $tr_attr = '';
-    $th_attr = '';
-    $td_attr = '';
-    $cols = $cols_count = 3;
-    $rows = 3;
-    $trailpad = ' ';
-    $vdir = 'down';
-    $hdir = 'right';
-    $inner = 'cols';
-    $caption = '';
-
-    if (!isset($params['loop'])) {
-        $smarty->trigger_error("html_table: missing 'loop' parameter");
-        return;
-    }
-
-    foreach ($params as $_key=>$_value) {
-        switch ($_key) {
-            case 'loop':
-                $$_key = (array)$_value;
-                break;
-
-            case 'cols':
-                if (is_array($_value) && !empty($_value)) {
-                    $cols = $_value;
-                    $cols_count = count($_value);
-                } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
-                    $cols = explode(',', $_value);
-                    $cols_count = count($cols);
-                } elseif (!empty($_value)) {
-                    $cols_count = (int)$_value;
-                } else {
-                    $cols_count = $cols;
-                }
-                break;
-
-            case 'rows':
-                $$_key = (int)$_value;
-                break;
-
-            case 'table_attr':
-            case 'trailpad':
-            case 'hdir':
-            case 'vdir':
-            case 'inner':
-            case 'caption':
-                $$_key = (string)$_value;
-                break;
-
-            case 'tr_attr':
-            case 'td_attr':
-            case 'th_attr':
-                $$_key = $_value;
-                break;
-        }
-    }
-
-    $loop_count = count($loop);
-    if (empty($params['rows'])) {
-        /* no rows specified */
-        $rows = ceil($loop_count/$cols_count);
-    } elseif (empty($params['cols'])) {
-        if (!empty($params['rows'])) {
-            /* no cols specified, but rows */
-            $cols_count = ceil($loop_count/$rows);
-        }
-    }
-
-    $output = "<table $table_attr>\n";
-
-    if (!empty($caption)) {
-        $output .= '<caption>' . $caption . "</caption>\n";
-    }
-
-    if (is_array($cols)) {
-        $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
-        $output .= "<thead><tr>\n";
-
-        for ($r=0; $r<$cols_count; $r++) {
-            $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
-            $output .= $cols[$r];
-            $output .= "</th>\n";
-        }
-        $output .= "</tr></thead>\n";
-    }
-
-    $output .= "<tbody>\n";
-    for ($r=0; $r<$rows; $r++) {
-        $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
-        $rx =  ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
-
-        for ($c=0; $c<$cols_count; $c++) {
-            $x =  ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
-            if ($inner!='cols') {
-                /* shuffle x to loop over rows*/
-                $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
-            }
-
-            if ($x<$loop_count) {
-                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
-            } else {
-                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
-            }
-        }
-        $output .= "</tr>\n";
-    }
-    $output .= "</tbody>\n";
-    $output .= "</table>\n";
-    
-    return $output;
-}
-
-function smarty_function_html_table_cycle($name, $var, $no) {
-    if(!is_array($var)) {
-        $ret = $var;
-    } else {
-        $ret = $var[$no % count($var)];
-    }
-    
-    return ($ret) ? ' '.$ret : '';
-}
-
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.mailto.php b/include/smarty/plugins/function.mailto.php
deleted file mode 100644
index 20e9ed9..0000000
--- a/include/smarty/plugins/function.mailto.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {mailto} function plugin
- *
- * Type:     function<br>
- * Name:     mailto<br>
- * Date:     May 21, 2002
- * Purpose:  automate mailto address link creation, and optionally
- *           encode them.<br>
- * Input:<br>
- *         - address = 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:
- * <pre>
- * {mailto address="me at domain.com"}
- * {mailto address="me at domain.com" encode="javascript"}
- * {mailto address="me at domain.com" encode="hex"}
- * {mailto address="me at domain.com" subject="Hello to you!"}
- * {mailto address="me at domain.com" cc="you at domain.com,they at domain.com"}
- * {mailto address="me at domain.com" extra='class="mailto"'}
- * </pre>
- * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
- *          (Smarty online manual)
- * @version  1.2
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
- * @param    array
- * @param    Smarty
- * @return   string
- */
-function smarty_function_mailto($params, &$smarty)
-{
-    $extra = '';
-
-    if (empty($params['address'])) {
-        $smarty->trigger_error("mailto: missing 'address' parameter");
-        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:
-        }
-    }
-
-    $mail_parm_vals = '';
-    for ($i=0; $i<count($mail_parms); $i++) {
-        $mail_parm_vals .= (0==$i) ? '?' : '&';
-        $mail_parm_vals .= $mail_parms[$i];
-    }
-    $address .= $mail_parm_vals;
-
-    $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
-    if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
-        $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
-        return;
-    }
-
-    if ($encode == 'javascript' ) {
-        $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
-
-        $js_encode = '';
-        for ($x=0; $x < strlen($string); $x++) {
-            $js_encode .= '%' . bin2hex($string[$x]);
-        }
-
-        return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
-
-    } elseif ($encode == 'javascript_charcode' ) {
-        $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
-
-        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
-            $ord[] = ord($string[$x]);   
-        }
-
-        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
-        $_ret .= "<!--\n";
-        $_ret .= "{document.write(String.fromCharCode(";
-        $_ret .= implode(',',$ord);
-        $_ret .= "))";
-        $_ret .= "}\n";
-        $_ret .= "//-->\n";
-        $_ret .= "</script>\n";
-        
-        return $_ret;
-        
-        
-    } elseif ($encode == 'hex') {
-
-        preg_match('!^(.*)(\?.*)$!',$address,$match);
-        if(!empty($match[2])) {
-            $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
-            return;
-        }
-        $address_encode = '';
-        for ($x=0; $x < strlen($address); $x++) {
-            if(preg_match('!\w!',$address[$x])) {
-                $address_encode .= '%' . bin2hex($address[$x]);
-            } else {
-                $address_encode .= $address[$x];
-            }
-        }
-        $text_encode = '';
-        for ($x=0; $x < strlen($text); $x++) {
-            $text_encode .= '&#x' . bin2hex($text[$x]).';';
-        }
-
-        $mailto = "mailto:";
-        return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
-
-    } else {
-        // no encoding
-        return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
-
-    }
-
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.math.php b/include/smarty/plugins/function.math.php
deleted file mode 100644
index 6575e06..0000000
--- a/include/smarty/plugins/function.math.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {math} function plugin
- *
- * Type:     function<br>
- * Name:     math<br>
- * Purpose:  handle math computations in template<br>
- * @link http://smarty.php.net/manual/en/language.function.math.php {math}
- *          (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_math($params, &$smarty)
-{
-    // be sure equation parameter is present
-    if (empty($params['equation'])) {
-        $smarty->trigger_error("math: missing equation parameter");
-        return;
-    }
-
-    // strip out backticks, not necessary for math
-    $equation = str_replace('`','',$params['equation']);
-
-    // make sure parenthesis are balanced
-    if (substr_count($equation,"(") != substr_count($equation,")")) {
-        $smarty->trigger_error("math: unbalanced parenthesis");
-        return;
-    }
-
-    // match all vars in equation, make sure all are passed
-    preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match);
-    $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
-                           'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
-    
-    foreach($match[1] as $curr_var) {
-        if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
-            $smarty->trigger_error("math: function call $curr_var not allowed");
-            return;
-        }
-    }
-
-    foreach($params as $key => $val) {
-        if ($key != "equation" && $key != "format" && $key != "assign") {
-            // make sure value is not empty
-            if (strlen($val)==0) {
-                $smarty->trigger_error("math: parameter $key is empty");
-                return;
-            }
-            if (!is_numeric($val)) {
-                $smarty->trigger_error("math: parameter $key: is not numeric");
-                return;
-            }
-            $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
-        }
-    }
-
-    eval("\$smarty_math_result = ".$equation.";");
-
-    if (empty($params['format'])) {
-        if (empty($params['assign'])) {
-            return $smarty_math_result;
-        } else {
-            $smarty->assign($params['assign'],$smarty_math_result);
-        }
-    } else {
-        if (empty($params['assign'])){
-            printf($params['format'],$smarty_math_result);
-        } else {
-            $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
-        }
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
\ No newline at end of file
diff --git a/include/smarty/plugins/function.popup.php b/include/smarty/plugins/function.popup.php
deleted file mode 100644
index 3a76b78..0000000
--- a/include/smarty/plugins/function.popup.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {popup} function plugin
- *
- * Type:     function<br>
- * Name:     popup<br>
- * Purpose:  make text pop up in windows via overlib
- * @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
- *          (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_popup($params, &$smarty)
-{
-    $append = '';
-    foreach ($params as $_key=>$_value) {
-        switch ($_key) {
-            case 'text':
-            case 'trigger':
-            case 'function':
-            case 'inarray':
-                $$_key = (string)$_value;
-                if ($_key == 'function' || $_key == 'inarray')
-                    $append .= ',' . strtoupper($_key) . ",'$_value'";
-                break;
-
-            case 'caption':
-            case 'closetext':
-            case 'status':
-                $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
-                break;
-
-            case 'fgcolor':
-            case 'bgcolor':
-            case 'textcolor':
-            case 'capcolor':
-            case 'closecolor':
-            case 'textfont':
-            case 'captionfont':
-            case 'closefont':
-            case 'fgbackground':
-            case 'bgbackground':
-            case 'caparray':
-            case 'capicon':
-            case 'background':
-            case 'frame':
-                $append .= ',' . strtoupper($_key) . ",'$_value'";
-                break;
-
-            case 'textsize':
-            case 'captionsize':
-            case 'closesize':
-            case 'width':
-            case 'height':
-            case 'border':
-            case 'offsetx':
-            case 'offsety':
-            case 'snapx':
-            case 'snapy':
-            case 'fixx':
-            case 'fixy':
-            case 'padx':
-            case 'pady':
-            case 'timeout':
-            case 'delay':
-                $append .= ',' . strtoupper($_key) . ",$_value";
-                break;
-
-            case 'sticky':
-            case 'left':
-            case 'right':
-            case 'center':
-            case 'above':
-            case 'below':
-            case 'noclose':
-            case 'autostatus':
-            case 'autostatuscap':
-            case 'fullhtml':
-            case 'hauto':
-            case 'vauto':
-            case 'mouseoff':
-            case 'followmouse':
-            case 'closeclick':
-                if ($_value) $append .= ',' . strtoupper($_key);
-                break;
-
-            default:
-                $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
-        }
-    }
-
-    if (empty($text) && !isset($inarray) && empty($function)) {
-        $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
-        return false;
-    }
-
-    if (empty($trigger)) { $trigger = "onmouseover"; }
-
-    $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
-    $retval .= $append . ');"';
-    if ($trigger == 'onmouseover')
-       $retval .= ' onmouseout="nd();"';
-
-
-    return $retval;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/function.popup_init.php b/include/smarty/plugins/function.popup_init.php
deleted file mode 100644
index 93cb454..0000000
--- a/include/smarty/plugins/function.popup_init.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty {popup_init} function plugin
- *
- * Type:     function<br>
- * Name:     popup_init<br>
- * Purpose:  initialize overlib
- * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
- *          (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param array
- * @param Smarty
- * @return string
- */
-function smarty_function_popup_init($params, &$smarty)
-{
-    $zindex = 1000;
-    
-    if (!empty($params['zindex'])) {
-        $zindex = $params['zindex'];
-    }
-    
-    if (!empty($params['src'])) {
-        return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
-         . '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
-    } else {
-        $smarty->trigger_error("popup_init: missing src parameter");
-    }
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.capitalize.php b/include/smarty/plugins/modifier.capitalize.php
deleted file mode 100644
index 4a611d9..0000000
--- a/include/smarty/plugins/modifier.capitalize.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty capitalize modifier plugin
- *
- * Type:     modifier<br>
- * Name:     capitalize<br>
- * Purpose:  capitalize words in the string
- * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
- *      capitalize (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return string
- */
-function smarty_modifier_capitalize($string, $uc_digits = false)
-{
-    smarty_modifier_capitalize_ucfirst(null, $uc_digits);
-    return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
-}
-
-function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
-{
-    static $_uc_digits = false;
-    
-    if(isset($uc_digits)) {
-        $_uc_digits = $uc_digits;
-        return;
-    }
-    
-    if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
-        return ucfirst($string[0]);
-    else
-        return $string[0];
-}
-
-
-?>
diff --git a/include/smarty/plugins/modifier.cat.php b/include/smarty/plugins/modifier.cat.php
deleted file mode 100644
index 2e37940..0000000
--- a/include/smarty/plugins/modifier.cat.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty cat modifier plugin
- *
- * Type:     modifier<br>
- * Name:     cat<br>
- * 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   Monte Ohrt <monte at ohrt dot com>
- * @version 1.0
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_cat($string, $cat)
-{
-    return $string . $cat;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.count_characters.php b/include/smarty/plugins/modifier.count_characters.php
deleted file mode 100644
index 5ed9a87..0000000
--- a/include/smarty/plugins/modifier.count_characters.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_characters modifier plugin
- *
- * Type:     modifier<br>
- * Name:     count_characteres<br>
- * Purpose:  count the number of characters in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
- *          count_characters (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param boolean include whitespace in the character count
- * @return integer
- */
-function smarty_modifier_count_characters($string, $include_spaces = false)
-{
-    if ($include_spaces)
-       return(strlen($string));
-
-    return preg_match_all("/[^\s]/",$string, $match);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.count_paragraphs.php b/include/smarty/plugins/modifier.count_paragraphs.php
deleted file mode 100644
index e0e274d..0000000
--- a/include/smarty/plugins/modifier.count_paragraphs.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_paragraphs modifier plugin
- *
- * Type:     modifier<br>
- * Name:     count_paragraphs<br>
- * Purpose:  count the number of paragraphs in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- *          count_paragraphs (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_paragraphs($string)
-{
-    // count \r or \n characters
-    return count(preg_split('/[\r\n]+/', $string));
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.count_sentences.php b/include/smarty/plugins/modifier.count_sentences.php
deleted file mode 100644
index f66ea17..0000000
--- a/include/smarty/plugins/modifier.count_sentences.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_sentences modifier plugin
- *
- * Type:     modifier<br>
- * Name:     count_sentences
- * Purpose:  count the number of sentences in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- *          count_sentences (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_sentences($string)
-{
-    // find periods with a word before but not after.
-    return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.count_words.php b/include/smarty/plugins/modifier.count_words.php
deleted file mode 100644
index 9d339f5..0000000
--- a/include/smarty/plugins/modifier.count_words.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty count_words modifier plugin
- *
- * Type:     modifier<br>
- * Name:     count_words<br>
- * Purpose:  count the number of words in a text
- * @link http://smarty.php.net/manual/en/language.modifier.count.words.php
- *          count_words (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @return integer
- */
-function smarty_modifier_count_words($string)
-{
-    // split text by ' ',\r,\n,\f,\t
-    $split_array = preg_split('/\s+/',$string);
-    // count matches that contain alphanumerics
-    $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array);
-
-    return count($word_count);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.date_format.php b/include/smarty/plugins/modifier.date_format.php
deleted file mode 100644
index 8cf7d5e..0000000
--- a/include/smarty/plugins/modifier.date_format.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-/**
- * Include the {@link shared.make_timestamp.php} plugin
- */
-require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
-/**
- * Smarty date_format modifier plugin
- *
- * Type:     modifier<br>
- * Name:     date_format<br>
- * Purpose:  format datestamps via strftime<br>
- * Input:<br>
- *         - string: input date string
- *         - format: strftime format for output
- *         - default_date: default date if $string is empty
- * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
- *          date_format (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @param string
- * @return string|void
- * @uses smarty_make_timestamp()
- */
-function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
-{
-    if ($string != '') {
-        $timestamp = smarty_make_timestamp($string);
-    } elseif ($default_date != '') {
-        $timestamp = smarty_make_timestamp($default_date);
-    } else {
-        return;
-    }
-    if (DIRECTORY_SEPARATOR == '\\') {
-        $_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);
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.debug_print_var.php b/include/smarty/plugins/modifier.debug_print_var.php
deleted file mode 100644
index e4f7bc0..0000000
--- a/include/smarty/plugins/modifier.debug_print_var.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty debug_print_var modifier plugin
- *
- * Type:     modifier<br>
- * Name:     debug_print_var<br>
- * Purpose:  formats variable contents for display in the console
- * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
- *          debug_print_var (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param array|object
- * @param integer
- * @param integer
- * @return string
- */
-function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
-{
-    $_replace = array(
-        "\n" => '<i>\n</i>',
-        "\r" => '<i>\r</i>',
-        "\t" => '<i>\t</i>'
-    );
-
-    switch (gettype($var)) {
-        case 'array' :
-            $results = '<b>Array (' . count($var) . ')</b>';
-            foreach ($var as $curr_key => $curr_val) {
-                $results .= '<br>' . str_repeat(' ', $depth * 2)
-                    . '<b>' . strtr($curr_key, $_replace) . '</b> => '
-                    . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
-                    $depth--;
-            }
-            break;
-        case 'object' :
-            $object_vars = get_object_vars($var);
-            $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
-            foreach ($object_vars as $curr_key => $curr_val) {
-                $results .= '<br>' . str_repeat(' ', $depth * 2)
-                    . '<b> ->' . strtr($curr_key, $_replace) . '</b> = '
-                    . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
-                    $depth--;
-            }
-            break;
-        case 'boolean' :
-        case 'NULL' :
-        case 'resource' :
-            if (true === $var) {
-                $results = 'true';
-            } elseif (false === $var) {
-                $results = 'false';
-            } elseif (null === $var) {
-                $results = 'null';
-            } else {
-                $results = htmlspecialchars((string) $var);
-            }
-            $results = '<i>' . $results . '</i>';
-            break;
-        case 'integer' :
-        case 'float' :
-            $results = htmlspecialchars((string) $var);
-            break;
-        case 'string' :
-            $results = strtr($var, $_replace);
-            if (strlen($var) > $length ) {
-                $results = substr($var, 0, $length - 3) . '...';
-            }
-            $results = htmlspecialchars('"' . $results . '"');
-            break;
-        case 'unknown type' :
-        default :
-            $results = strtr((string) $var, $_replace);
-            if (strlen($results) > $length ) {
-                $results = substr($results, 0, $length - 3) . '...';
-            }
-            $results = htmlspecialchars($results);
-    }
-
-    return $results;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.default.php b/include/smarty/plugins/modifier.default.php
deleted file mode 100644
index 70011fd..0000000
--- a/include/smarty/plugins/modifier.default.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
-
-
-/**
- * Smarty default modifier plugin
- *
- * Type:     modifier<br>
- * Name:     default<br>
- * Purpose:  designate default value for empty variables
- * @link http://smarty.php.net/manual/en/language.modifier.default.php
- *          default (Smarty online manual)
- * @author   Monte Ohrt <monte at ohrt dot com>
- * @param string
- * @param string
- * @return string
- */
-function smarty_modifier_default($string, $default = '')
-{
-    if (!isset($string) || $string === '')
-        return $default;
-    else
-        return $string;
-}
-
-/* vim: set expandtab: */
-
-?>
diff --git a/include/smarty/plugins/modifier.escape.php b/include/smarty/plugins/modifier.escape.php
deleted file mode 100644
index a2f52b2..0000000
--- a/include/smarty/plugins/modifier.escape.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins


Commit: 3ff4a1b01eb5cd3d9c21a2bc9698c0e3383c614c
    https://github.com/scummvm/scummvm-web/commit/3ff4a1b01eb5cd3d9c21a2bc9698c0e3383c614c
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Remove broken getImage method from news articles

Changed paths:
  A templates/components/box.tpl
    data/news/20020214.xml
    data/news/20020308.xml
    include/Objects/News.php
    templates/news.tpl


diff --git a/data/news/20020214.xml b/data/news/20020214.xml
index f241045..e08fbc9 100644
--- a/data/news/20020214.xml
+++ b/data/news/20020214.xml
@@ -1,10 +1,10 @@
 <NAME>Busier than a monkey with a rash</NAME>
 <DATE>Feb 14, 2002</DATE>
-<IMG><img src="/data/news/20020214.png" width="256" height="99" alt="Zak256" align="right"></IMG>
 <AUTHOR>laxdragon</AUTHOR>
 <BODY>
-	The ScummVM team is busy scratching away getting more of your
-	favorite classic LucasArts games to work. Take a gander at this
-	little screenshot to wet your appetite. More screenshots and info
-	will flow this way as it happens.
+  <img src="/data/news/20020214.png" width="256" height="99" alt="Zak256">
+  The ScummVM team is busy scratching away getting more of your
+  favorite classic LucasArts games to work. Take a gander at this
+  little screenshot to wet your appetite. More screenshots and info
+  will flow this way as it happens.
 </BODY>
diff --git a/data/news/20020308.xml b/data/news/20020308.xml
index c16cc4d..8e69b2e 100644
--- a/data/news/20020308.xml
+++ b/data/news/20020308.xml
@@ -1,17 +1,15 @@
 <NAME>Some Fairly Major Updates</NAME>
 <DATE>Mar 8, 2002</DATE>
-<IMG><a href="http://www.scummvm.org/screenshots.php?cat1=0&cat2=9&view=-1"><img
-src="/data/news/20020308.png" width="256" height="192" border="0"
-alt="Full Throttle" align="right"></a></IMG>
 <AUTHOR>laxdragon</AUTHOR>
 <BODY>
-	BBrox, Endy and Yazoo have been in major crunch mode this week (Kudos guys!). Here is what's new in the development of ScummVM:
-	<ul>
-		<li>Sam and Max is now completable!</li>
-		<li><i>inSane</i> video engine working. Used in Dig and Full Throttle</li>
-		<li>More command line options for control. See the readme.txt</li>
-		<li>Preliminary work has begun on Curse of Monkey Island</li>
-		<li>Mutle has committed the Mac port to the CVS tree</li>
-		<li>Many many bugs have been fixed.</li>
-	</ul>
+  <img src="/data/news/20020308.png" width="256" height="192" border="0" alt="Full Throttle">
+  BBrox, Endy and Yazoo have been in major crunch mode this week (Kudos guys!). Here is what's new in the development of ScummVM:
+  <ul>
+    <li>Sam and Max is now completable!</li>
+    <li><i>inSane</i> video engine working. Used in Dig and Full Throttle</li>
+    <li>More command line options for control. See the readme.txt</li>
+    <li>Preliminary work has begun on Curse of Monkey Island</li>
+    <li>Mutle has committed the Mac port to the CVS tree</li>
+    <li>Many many bugs have been fixed.</li>
+  </ul>
 </BODY>
diff --git a/include/Objects/News.php b/include/Objects/News.php
index 8942e29..8f423e5 100644
--- a/include/Objects/News.php
+++ b/include/Objects/News.php
@@ -18,27 +18,23 @@ class News extends BasicObject {
 	 * <NAME>Schwag</NAME>
 	 * <DATE>1st january, 1770</DATE>
 	 * <AUTHOR>Guybrush Threepwood</AUTHOR>
-	 * <IMG>path/to/treasure.jpg</IMG>
 	 * <BODY>All I got was this lousy t-shirt!</BODY>
 	 *
 	 *
-	 * FIXME: It currently fails at grabbing the image (see 20020214.xml)
 	 */
 	public function __construct($data, $filename, $processContent = false) {
 		$vars = array();
 		preg_match("/<NAME>(.*)<\/NAME>.*		# Grab the title
 					<DATE>(.*)<\/DATE>.*		# Grab the date
 					<AUTHOR>(.*)<\/AUTHOR>.*	# Grab the author
-					(?:<IMG>(.*)<\/IMG>.*)?		# image if set (only once)
 					<BODY>(.*)<\/BODY>			# Grab the body
 					/sUx", $data, $vars);
-		if (count($vars) == 6) {
+		if (count($vars) == 5) {
 			$this->_title = $processContent ? $this->processText($vars[1]) : $vars[1];
 			/* Store the date as an unix timestamp*/
 			$this->_date = date_timestamp_get(date_create_from_format("M d, Y", $vars[2]));
 			$this->_author = $vars[3];
-			$this->_image = $vars[4];
-			$this->_content = $processContent ? $this->processText($vars[5]) : $vars[5];
+			$this->_content = $processContent ? $this->processText($vars[4]) : $vars[4];
 		}
 		$this->_filename = basename($filename);
 	}
@@ -71,11 +67,6 @@ class News extends BasicObject {
 		return $this->_author;
 	}
 
-	/* Get the optional image. */
-	public function getImage() {
-		return $this->_image;
-	}
-
 	/* Get the content. */
 	public function getContent() {
 		return $this->_content;
diff --git a/templates/components/box.tpl b/templates/components/box.tpl
new file mode 100644
index 0000000..003c7f0
--- /dev/null
+++ b/templates/components/box.tpl
@@ -0,0 +1,8 @@
+<div class="box">
+	<div class="head" id="{$id}">
+    {$head}
+	</div>
+	<div class="content">
+		{$content}
+	</div>
+</div>
diff --git a/templates/news.tpl b/templates/news.tpl
index 27c440a..559432d 100644
--- a/templates/news.tpl
+++ b/templates/news.tpl
@@ -20,9 +20,6 @@
 		<div class="news-author">
 			{#newsPostedBy#} {$news->getAuthor()}
 		</div>
-		{if $news->getImage() != null}
-  			{$news->getImage()}
-  		{/if}
 		{$news->getContent()}
 		<div class="spacing"></div>
 	</div>


Commit: 904f4494ca2ef57a93e8e5fb14037b6d5261ad7e
    https://github.com/scummvm/scummvm-web/commit/904f4494ca2ef57a93e8e5fb14037b6d5261ad7e
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Add a method to generate News links in HTML and feeds

Changed paths:
    include/Objects/News.php
    templates/feed_atom.tpl
    templates/feed_rss.tpl
    templates/news.tpl


diff --git a/include/Objects/News.php b/include/Objects/News.php
index 8f423e5..b3846f6 100644
--- a/include/Objects/News.php
+++ b/include/Objects/News.php
@@ -75,6 +75,11 @@ class News extends BasicObject {
 	/* Get the filename. */
 	public function getFilename() {
 		return $this->_filename;
-	}
+  }
+
+  /* Get the News link. */
+  public function getLink() {
+    return URL_BASE . 'news/' . rtrim($this->_filename, "a..z.");
+  }
 }
 ?>
diff --git a/templates/feed_atom.tpl b/templates/feed_atom.tpl
index ebc8a90..a130b45 100644
--- a/templates/feed_atom.tpl
+++ b/templates/feed_atom.tpl
@@ -21,7 +21,7 @@
 
 		<entry xml:lang="en">
 			<id>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</id>
-			<link rel="alternate" href="{$baseurl}news/{$news_filename}/" />
+			<link rel="alternate" href="{$news->getLink()}" />
 			<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
 			<published>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</published>
 			<title type="html">{$n->getTitle()}</title>
diff --git a/templates/feed_rss.tpl b/templates/feed_rss.tpl
index 57a030a..a32e11e 100644
--- a/templates/feed_rss.tpl
+++ b/templates/feed_rss.tpl
@@ -16,7 +16,7 @@
 			<author>nospam at scummvm.org ({$n->getAuthor()})</author>
 			{/if}
 			<guid isPermaLink='true'>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</guid>
-			<link>{$baseurl}news/{$news_filename}/</link>
+			<link>{$news->getLink()}/</link>
 		</item>
 		{/foreach}
 	</channel>
diff --git a/templates/news.tpl b/templates/news.tpl
index 559432d..b4b3a18 100644
--- a/templates/news.tpl
+++ b/templates/news.tpl
@@ -1,29 +1,20 @@
 {foreach from=$news_items item=news}
-{assign var='news_date' value=$news->getDate()|date_format:"%Y%m%d"}
-{assign var='news_filename' value=$news->getFilename()|substr:'0':'-4'}
-{if !empty($date) && ($date == 'archive' || strlen($date) == 8)}
-	{if strlen($news_filename) == 9}
-		{assign var='news_date' value=$news_filename|substr:'0':'-1'}
-	{else}
-		{assign var='news_date' value=$news_filename}
-	{/if}
-{/if}
-
-<div class="box">
-	<div class="head" id="{$news->getDate()|date_format:"%Y-%m-%d"}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}">
-		<a href="{$baseurl}news/{$news_date}/">
-			<span class="news-date">{$news->getDate()|date_localized:#dateformat#}</span>:
-			{$news->getTitle()}
-		</a>
-	</div>
-	<div class="news content">
-		<div class="news-author">
-			{#newsPostedBy#} {$news->getAuthor()}
-		</div>
-		{$news->getContent()}
-		<div class="spacing"></div>
-	</div>
-</div>
+  {$news_filename=$news->getFilename()|substr:'0':'-4'}
+  <div class="box">
+    <div class="head" id="{$news->getDate()|date_format:"%Y-%m-%d"}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}">
+      <a href="{$news->getLink()}/">
+        <span class="news-date">{$news->getDate()|date_localized:#dateformat#}</span>:
+        {$news->getTitle()}
+      </a>
+    </div>
+    <div class="news content">
+      <div class="news-author">
+        {#newsPostedBy#} {$news->getAuthor()}
+      </div>
+      {$news->getContent()}
+      <div class="spacing"></div>
+    </div>
+  </div>
 {/foreach}
 
 {* Only show the 'more news' link if we're on the main page *}


Commit: 157f71a271d0d5a8bd95958801c1af87e99623dc
    https://github.com/scummvm/scummvm-web/commit/157f71a271d0d5a8bd95958801c1af87e99623dc
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Move templates to subfolders

Changed paths:
  A templates/base/base.tpl
  A templates/components/banners.tpl
  A templates/components/compatibility_details.tpl
  A templates/components/credits_entry.tpl
  A templates/components/exception.tpl
  A templates/components/lang_menu.tpl
  A templates/components/menu_group.tpl
  A templates/components/subhead.tpl
  A templates/layout/footer.tpl
  A templates/layout/header.tpl
  A templates/layout/menu.tpl
  A templates/pages/_index.tpl
  A templates/pages/compatibility.tpl
  A templates/pages/contact.tpl
  A templates/pages/credits.tpl
  A templates/pages/documentation.tpl
  A templates/pages/downloads.tpl
  A templates/pages/faq.tpl
  A templates/pages/feed_atom.tpl
  A templates/pages/feed_rss.tpl
  A templates/pages/game_demos.tpl
  A templates/pages/games.tpl
  A templates/pages/links.tpl
  A templates/pages/news.tpl
  A templates/pages/press.tpl
  A templates/pages/press_snowberry.tpl
  A templates/pages/screenshots.tpl
  A templates/pages/screenshots_category.tpl
  A templates/pages/subprojects.tpl
  R templates/banners.tpl
  R templates/compatibility.tpl
  R templates/compatibility_details.tpl
  R templates/contact.tpl
  R templates/credits.tpl
  R templates/credits_entry.tpl
  R templates/documentation.tpl
  R templates/downloads.tpl
  R templates/exception.tpl
  R templates/faq.tpl
  R templates/feed_atom.tpl
  R templates/feed_rss.tpl
  R templates/game_demos.tpl
  R templates/games.tpl
  R templates/lang_menu.tpl
  R templates/links.tpl
  R templates/menu_group.tpl
  R templates/news.tpl
  R templates/press.tpl
  R templates/press_snowberry.tpl
  R templates/screenshots.tpl
  R templates/screenshots_category.tpl
  R templates/subhead.tpl
  R templates/subprojects.tpl
    include/Pages/CompatibilityPage.php
    include/Pages/ContactPage.php
    include/Pages/CreditsPage.php
    include/Pages/DemosPage.php
    include/Pages/DocumentationPage.php
    include/Pages/DownloadsPage.php
    include/Pages/ExceptionsPage.php
    include/Pages/FAQPage.php
    include/Pages/FeedsPage.php
    include/Pages/GamesPage.php
    include/Pages/LinksPage.php
    include/Pages/NewsPage.php
    include/Pages/PressPage.php
    include/Pages/ScreenshotsPage.php
    include/Pages/SubprojectsPage.php
    templates/index.tpl


diff --git a/include/Pages/CompatibilityPage.php b/include/Pages/CompatibilityPage.php
index c68ea26..6a54f0e 100644
--- a/include/Pages/CompatibilityPage.php
+++ b/include/Pages/CompatibilityPage.php
@@ -16,7 +16,7 @@ class CompatibilityPage extends Controller {
 	public function __construct() {
 		parent::__construct();
 		global $Smarty;
-		$this->_template = 'compatibility.tpl';
+		$this->_template = 'pages/compatibility.tpl';
 		$this->_template_details = 'compatibility_details.tpl';
 		$this->_supportLevelDesc = array(
 			'untested' => $Smarty->getConfigVars('compatibilityUntested'),
diff --git a/include/Pages/ContactPage.php b/include/Pages/ContactPage.php
index bcce003..d76bb8c 100644
--- a/include/Pages/ContactPage.php
+++ b/include/Pages/ContactPage.php
@@ -7,7 +7,7 @@ class ContactPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'contact.tpl';
+		$this->_template = 'pages/contact.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/CreditsPage.php b/include/Pages/CreditsPage.php
index 9b873b9..b1053a9 100644
--- a/include/Pages/CreditsPage.php
+++ b/include/Pages/CreditsPage.php
@@ -8,7 +8,7 @@ class CreditsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'credits.tpl';
+		$this->_template = 'pages/credits.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/DemosPage.php b/include/Pages/DemosPage.php
index 0376022..2d978a4 100644
--- a/include/Pages/DemosPage.php
+++ b/include/Pages/DemosPage.php
@@ -8,7 +8,7 @@ class DemosPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'game_demos.tpl';
+		$this->_template = 'pages/game_demos.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/DocumentationPage.php b/include/Pages/DocumentationPage.php
index 7b23b4b..a7cbb9b 100644
--- a/include/Pages/DocumentationPage.php
+++ b/include/Pages/DocumentationPage.php
@@ -8,7 +8,7 @@ class DocumentationPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'documentation.tpl';
+		$this->_template = 'pages/documentation.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/DownloadsPage.php b/include/Pages/DownloadsPage.php
index f7a1a8d..1e1cb1f 100644
--- a/include/Pages/DownloadsPage.php
+++ b/include/Pages/DownloadsPage.php
@@ -8,7 +8,7 @@ class DownloadsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'downloads.tpl';
+		$this->_template = 'pages/downloads.tpl';
 	}
 
 	function getRecommendedDownloadsJS(&$downloads) {
diff --git a/include/Pages/ExceptionsPage.php b/include/Pages/ExceptionsPage.php
index 3c8ecf4..b5963fd 100644
--- a/include/Pages/ExceptionsPage.php
+++ b/include/Pages/ExceptionsPage.php
@@ -7,7 +7,7 @@ class ExceptionsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'exceptions.tpl';
+		$this->_template = 'components/exception.tpl';
 	}
 
 	/* Display the index page. */
@@ -20,7 +20,7 @@ class ExceptionsPage extends Controller {
 				'content_title' => $Smarty->getConfigVars('exceptionsContentTitle'),
 				'exception' => $exception,
 			),
-			'exception.tpl'
+			$this->_template
 		);
 	}
 }
diff --git a/include/Pages/FAQPage.php b/include/Pages/FAQPage.php
index 5d9f29d..a4485e4 100644
--- a/include/Pages/FAQPage.php
+++ b/include/Pages/FAQPage.php
@@ -8,7 +8,7 @@ class FAQPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'faq.tpl';
+		$this->_template = 'pages/faq.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/FeedsPage.php b/include/Pages/FeedsPage.php
index 934c30f..9edfaa5 100644
--- a/include/Pages/FeedsPage.php
+++ b/include/Pages/FeedsPage.php
@@ -9,8 +9,8 @@ class FeedsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template_rss = 'feed_rss.tpl';
-		$this->_template_atom = 'feed_atom.tpl';
+		$this->_template_rss = 'pages/feed_rss.tpl';
+		$this->_template_atom = 'pages/feed_atom.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/GamesPage.php b/include/Pages/GamesPage.php
index 00f5727..2b18d51 100644
--- a/include/Pages/GamesPage.php
+++ b/include/Pages/GamesPage.php
@@ -8,7 +8,7 @@ class GamesPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'games.tpl';
+		$this->_template = 'pages/games.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/LinksPage.php b/include/Pages/LinksPage.php
index 153d848..de8b991 100644
--- a/include/Pages/LinksPage.php
+++ b/include/Pages/LinksPage.php
@@ -8,7 +8,7 @@ class LinksPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'links.tpl';
+		$this->_template = 'pages/links.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/NewsPage.php b/include/Pages/NewsPage.php
index af29c32..e0ff5ef 100644
--- a/include/Pages/NewsPage.php
+++ b/include/Pages/NewsPage.php
@@ -9,7 +9,7 @@ class NewsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'news.tpl';
+		$this->_template = 'pages/news.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/PressPage.php b/include/Pages/PressPage.php
index 9b95feb..b6e0697 100644
--- a/include/Pages/PressPage.php
+++ b/include/Pages/PressPage.php
@@ -8,7 +8,7 @@ class PressPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'press.tpl';
+		$this->_template = 'pages/press.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/include/Pages/ScreenshotsPage.php b/include/Pages/ScreenshotsPage.php
index c076e14..ca2d166 100644
--- a/include/Pages/ScreenshotsPage.php
+++ b/include/Pages/ScreenshotsPage.php
@@ -9,8 +9,8 @@ class ScreenshotsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'screenshots.tpl';
-		$this->_template_category = 'screenshots_category.tpl';
+		$this->_template = 'pages/screenshots.tpl';
+		$this->_template_category = 'pages/screenshots_category.tpl';
 		$this->_template_viewer = 'screenshots_viewer.tpl';
 	}
 
diff --git a/include/Pages/SubprojectsPage.php b/include/Pages/SubprojectsPage.php
index 425d171..fb0e03a 100644
--- a/include/Pages/SubprojectsPage.php
+++ b/include/Pages/SubprojectsPage.php
@@ -8,7 +8,7 @@ class SubprojectsPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'subprojects.tpl';
+		$this->_template = 'pages/subprojects.tpl';
 	}
 
 	/* Display the index page. */
diff --git a/templates/banners.tpl b/templates/banners.tpl
deleted file mode 100644
index f6e20d6..0000000
--- a/templates/banners.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-<div class="banners">
-    <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
-        <input type="hidden" name="cmd" value="_s-xclick">
-        <input type="hidden" name="hosted_button_id" value="U6E6SLL7E8MAS">
-        <input type="image" src="/images/ppdonate.png" style="width: 88px; height: 35px; border: 0 none;" name="submit" alt="{#indexSupport#}">
-        <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
-    </form>
-
-    <a href="http://www.easyname.com/">
-        <img src="/images/easyname-logo-big.png" width="88" height="32" alt="{#indexEasyname#}">
-    </a>
-
-    <a href="https://www.gog.com/?pp=22d200f8670dbdb3e253a90eee5098477c95c23d">
-        <img src="/images/GOG_button_small.png" width="88" height="32" alt="{#indexGOG#}">
-    </a>
-    <a href="https://github.com/scummvm">
-        <img src="/images/github-logo.png" alt="{#indexGithub#}" width="88" height="32">
-    </a>
-
-    <a href="https://www.facebook.com/pages/ScummVM/7328341409">
-        <img src="/images/facebook.png" width="88" height="32" alt="{#indexFacebook#}">
-    </a>
-
-    <a href="https://twitter.com/ScummVM">
-        <img src="/images/twitter.png" width="88" height="32" alt="{#indexTwitter#}">
-    </a>
-</div>
diff --git a/templates/base/base.tpl b/templates/base/base.tpl
new file mode 100644
index 0000000..aecd60b
--- /dev/null
+++ b/templates/base/base.tpl
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<base href="{$baseurl}">
+	<link rel="stylesheet" href="{$baseurl}css/main.css">	
+	<link rel="alternate" type="application/atom+xml" title="{#indexAtomFeed#}" href="{$baseurl}feeds/atom/">
+	<link rel="alternate" type="application/rss+xml" title="{#indexRSSFeed#}" href="{$baseurl}feeds/rss/">
+	<link rel="apple-touch-icon" href="/images/scummvm.png">
+	<title>ScummVM :: {block name=title}{/block}</title>
+</head>
+<body>
+	<input type="checkbox" autocomplete="off" id="nav-trigger" class="nav-trigger" />
+	<label for="nav-trigger"></label>
+
+	<div class="site-wrap">
+    
+    {block name=header}{/block}
+
+		<div class="container row">
+			<div class="col-4-5">
+        {block name=content}{/block}        
+			</div>
+
+			<div class="col-1-5">
+        {block name=menu}{/block}				
+			</div>
+		</div>
+		
+    {block name=footer}{/block}
+	</div>
+
+{foreach from=$js_files item=script}
+	<script src="/javascripts/{$script}"></script>
+{/foreach}
+{
+	<script>
+		document.querySelector('.nav-trigger').addEventListener('change', function() {
+			if (this.checked)
+				document.body.classList.add('no-scroll');
+			else
+				document.body.classList.remove('no-scroll');
+		});
+	</script>
+}
+</body>
+</html>
diff --git a/templates/compatibility.tpl b/templates/compatibility.tpl
deleted file mode 100644
index 963ba09..0000000
--- a/templates/compatibility.tpl
+++ /dev/null
@@ -1,108 +0,0 @@
-<div class="box">
-	<div class="intro">
-		<p>
-			{#compatibilityIntro#}
-		</p>
-		<p>
-			{#compatibilityIntroExplanation#}
-		</p>
-		{if $version == 'DEV'}
-			<p>
-				{#compatibilityDevContent#}
-				{foreach from=$versions item=ver name=versions_loop}
-					{if $smarty.foreach.versions_loop.last}
-						{assign var='last' value=')'}
-					{/if}
-					<a href="/compatibility/{$ver}/">{$ver}</a>{$last}
-				{/foreach}
-			</p>
-			<p>
-				{#compatibilityDevDisclaimer#}
-			</p>
-		{else}
-			<p>
-				{'/\x7bversion\x7d/'|preg_replace:$version:#compatibilityStableContent#}
-			</p>
-			<p>
-				{#compatibilityStableReleases#}
-			{foreach from=$versions item=ver}
-				<a href="/compatibility/{$ver}/">{$ver}</a>
-			{/foreach}
-			</p>
-		{/if}
-		<p>
-			<small>{#compatiblityLastUpdated#} {$last_updated}</small>
-		</p>
-	</div>
-	<div class="content">
-		<table class="chart color4 colorKeyTable">
-			<caption>{#compatibilityLegendTitle#}</caption>
-			<tbody>
-				<tr class="color2">
-					{if $old_layout == 'no'}
-						{foreach from=$support_level_desc key=level item=desc}
-							<td class={$support_level_class.$level} align='center'>{$desc}</td>
-						{/foreach}
-					{else}
-						<td class="pct0"> 0</td>
-						<td class="pct5"> 5</td>
-						<td class="pct10">10</td>
-						<td class="pct15">15</td>
-						<td class="pct20">20</td>
-						<td class="pct25">25</td>
-						<td class="pct30">30</td>
-						<td class="pct35">35</td>
-						<td class="pct40">40</td>
-						<td class="pct45">45</td>
-						<td class="pct50">50</td>
-						<td class="pct55">55</td>
-						<td class="pct60">60</td>
-						<td class="pct65">65</td>
-						<td class="pct70">70</td>
-						<td class="pct75">75</td>
-						<td class="pct80">80</td>
-						<td class="pct85">85</td>
-						<td class="pct90">90</td>
-						<td class="pct95">95</td>
-						<td class="pct100">100</td>
-					{/if}
-				</tr>
-			</tbody>
-		</table>
-
-		{foreach from=$compat_data key=company item=games name=compat_loop}
-			<table class="chart color4">
-				<caption>{'/\x7bcompany\x7d/'|preg_replace:$company:#compatibilitySectionTitle#}</caption>
-				<thead>
-					<tr class="color4">
-						<th class="gameFullName">{#compatibilityDetailsChartCol1#}</th>
-						<th class="gameShortName">{#compatibilityDetailsChartCol2#}</th>
-						{if $old_layout == 'no'}
-							<th class="gameSupportLevel">{#compatibilityDetailsChartCol3a#}</th>
-						{else}
-							<th class="gameSupportLevel">{#compatibilityDetailsChartCol3b#}</th>
-						{/if}
-					</tr>
-				</thead>
-				<tbody>
-				{foreach from=$games item=game}
-					{if $old_layout == 'no'}
-						{assign var="x" value=$game->getSupportLevel()}
-						{assign var="pct_class" value=$support_level_class.$x}
-						{assign var="support_level" value=$support_level_desc.$x}
-					{else}
-						{math equation="x - (x % 5)" x=$game->getSupportLevel() assign='pct_class'}
-						{assign var="pct_class" value="pct"|cat:$pct_class}
-						{assign var="support_level" value=$game->getSupportLevel()|cat:"%"}
-					{/if}
-					<tr class="color{cycle values='2,0'}">
-						<td class="gameFullName"><a href="/compatibility/{$version}/{$game->getTarget()}/">{$game->getName()}</a></td>
-						<td class="gameShortName">{$game->getTarget()}</td>
-						<td class="gameSupportLevel {$pct_class}">{$support_level}</td>
-					</tr>
-				{/foreach}
-				</tbody>
-			</table>
-		{/foreach}
-	</div>
-</div>
diff --git a/templates/compatibility_details.tpl b/templates/compatibility_details.tpl
deleted file mode 100644
index 7e3afb8..0000000
--- a/templates/compatibility_details.tpl
+++ /dev/null
@@ -1,48 +0,0 @@
-{if $old_layout == 'no'}
-	{assign var="x" value=$game->getSupportLevel()}
-	{assign var="pct_class" value=$support_level_class.$x}
-	{assign var="support_level" value=$support_level_desc.$x}
-{else}
-	{math equation="x - (x % 5)" x=$game->getSupportLevel() assign='pct_class'}
-	{assign var="pct_class" value="pct"|cat:$pct_class}
-	{assign var="support_level" value=$game->getSupportLevel()|cat:"%"}
-{/if}
-
-<div class="box">
-	<div class="intro">
-		<p>
-			{#compatibilityDetailsInto#}
-		</p>
-	</div>
-	<div class="content">
-		<table class="chart color4">
-			<caption>{#compatibilityDetailsChartTitle#}</caption>
-			<thead>
-				<tr class="color4">
-					<th>{#compatibilityDetailsChartCol1#}</th>
-					<th>{#compatibilityDetailsChartCol2#}</th>
-					{if $old_layout == 'no'}
-						<th>{#compatibilityDetailsChartCol3a#}</th>
-					{else}
-						<th>{#compatibilityDetailsChartCol3b#}</th>
-					{/if}
-				</tr>
-			</thead>
-			<tbody>
-				<tr class="color0">
-					<td>{$game->getName()}</td>
-					<td>{$game->getTarget()}</td>
-					<td align="center" class="{$pct_class}">{$support_level}</td>
-				</tr>
-				<tr class="color2">
-					<td colspan="3" class="details">
-						{$game->getNotes()}
-					</td>
-				</tr>
-			</tbody>
-		</table>
-		<p class="bottom-link">
-			<a href="/compatibility/{$version}/">{#compatibilityDetailsBack#}</a>
-		</p>
-	</div>
-</div>
diff --git a/templates/components/banners.tpl b/templates/components/banners.tpl
new file mode 100644
index 0000000..f6e20d6
--- /dev/null
+++ b/templates/components/banners.tpl
@@ -0,0 +1,27 @@
+<div class="banners">
+    <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
+        <input type="hidden" name="cmd" value="_s-xclick">
+        <input type="hidden" name="hosted_button_id" value="U6E6SLL7E8MAS">
+        <input type="image" src="/images/ppdonate.png" style="width: 88px; height: 35px; border: 0 none;" name="submit" alt="{#indexSupport#}">
+        <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
+    </form>
+
+    <a href="http://www.easyname.com/">
+        <img src="/images/easyname-logo-big.png" width="88" height="32" alt="{#indexEasyname#}">
+    </a>
+
+    <a href="https://www.gog.com/?pp=22d200f8670dbdb3e253a90eee5098477c95c23d">
+        <img src="/images/GOG_button_small.png" width="88" height="32" alt="{#indexGOG#}">
+    </a>
+    <a href="https://github.com/scummvm">
+        <img src="/images/github-logo.png" alt="{#indexGithub#}" width="88" height="32">
+    </a>
+
+    <a href="https://www.facebook.com/pages/ScummVM/7328341409">
+        <img src="/images/facebook.png" width="88" height="32" alt="{#indexFacebook#}">
+    </a>
+
+    <a href="https://twitter.com/ScummVM">
+        <img src="/images/twitter.png" width="88" height="32" alt="{#indexTwitter#}">
+    </a>
+</div>
diff --git a/templates/components/compatibility_details.tpl b/templates/components/compatibility_details.tpl
new file mode 100644
index 0000000..7e3afb8
--- /dev/null
+++ b/templates/components/compatibility_details.tpl
@@ -0,0 +1,48 @@
+{if $old_layout == 'no'}
+	{assign var="x" value=$game->getSupportLevel()}
+	{assign var="pct_class" value=$support_level_class.$x}
+	{assign var="support_level" value=$support_level_desc.$x}
+{else}
+	{math equation="x - (x % 5)" x=$game->getSupportLevel() assign='pct_class'}
+	{assign var="pct_class" value="pct"|cat:$pct_class}
+	{assign var="support_level" value=$game->getSupportLevel()|cat:"%"}
+{/if}
+
+<div class="box">
+	<div class="intro">
+		<p>
+			{#compatibilityDetailsInto#}
+		</p>
+	</div>
+	<div class="content">
+		<table class="chart color4">
+			<caption>{#compatibilityDetailsChartTitle#}</caption>
+			<thead>
+				<tr class="color4">
+					<th>{#compatibilityDetailsChartCol1#}</th>
+					<th>{#compatibilityDetailsChartCol2#}</th>
+					{if $old_layout == 'no'}
+						<th>{#compatibilityDetailsChartCol3a#}</th>
+					{else}
+						<th>{#compatibilityDetailsChartCol3b#}</th>
+					{/if}
+				</tr>
+			</thead>
+			<tbody>
+				<tr class="color0">
+					<td>{$game->getName()}</td>
+					<td>{$game->getTarget()}</td>
+					<td align="center" class="{$pct_class}">{$support_level}</td>
+				</tr>
+				<tr class="color2">
+					<td colspan="3" class="details">
+						{$game->getNotes()}
+					</td>
+				</tr>
+			</tbody>
+		</table>
+		<p class="bottom-link">
+			<a href="/compatibility/{$version}/">{#compatibilityDetailsBack#}</a>
+		</p>
+	</div>
+</div>
diff --git a/templates/components/credits_entry.tpl b/templates/components/credits_entry.tpl
new file mode 100644
index 0000000..c81792d
--- /dev/null
+++ b/templates/components/credits_entry.tpl
@@ -0,0 +1,24 @@
+{if is_array($groups) && $groups|@count > 0}
+	{foreach from=$groups item=group}
+	<table class="credits">
+		{if $group.name != null}
+		<caption>{$group.name}:</caption>
+		{/if}
+		<tbody>
+		{foreach from=$group.persons item=person}
+			<tr>
+				<td class="name">{$person->getName()}</td>
+				<td class="alias">{$person->getAlias()}</td>
+				<td>{$person->getDescription()}</td>
+			</tr>
+		{/foreach}
+		</tbody>
+	</table>
+	{/foreach}
+{/if}
+
+{if is_array($paragraphs) && $paragraphs|@count > 0}
+	{foreach from=$paragraphs item=paragraph}
+	<p class="credits">{$paragraph}</p>
+	{/foreach}
+{/if}
diff --git a/templates/components/exception.tpl b/templates/components/exception.tpl
new file mode 100644
index 0000000..7b70815
--- /dev/null
+++ b/templates/components/exception.tpl
@@ -0,0 +1,12 @@
+<div class="box">
+	<div class="head">{#exceptionHeading#}</div>
+	<div class="intro">
+		<h2>{#exceptionIntro#}</h2>
+	</div>
+	<div class="content">
+		<img src="/images/three-headed-monkey.png" alt="{#exceptionAlt#}" class="float_right" style="margin-bottom: 5px;">
+		<h3>{#exceptionContent#}</h3>
+		<p>{$exception->getMessage()|nl2br:false}</p>
+	</div>
+	<div class="spacing"> </div>
+</div>
diff --git a/templates/components/lang_menu.tpl b/templates/components/lang_menu.tpl
new file mode 100644
index 0000000..429b92f
--- /dev/null
+++ b/templates/components/lang_menu.tpl
@@ -0,0 +1,11 @@
+<dl>
+    <input type="checkbox" autocomplete="off" id="menu-lang" class="menu-trigger" />
+    <dt>
+        <label for="menu-lang">Language</label>
+    </dt>
+    {foreach from=$available_languages key=key item=item}
+    <dd>
+        <a href="{$pageurl}?lang={$key}">{$item|escape}</a>
+    </dd>
+    {/foreach}
+</dl>
diff --git a/templates/components/menu_group.tpl b/templates/components/menu_group.tpl
new file mode 100644
index 0000000..31bce7c
--- /dev/null
+++ b/templates/components/menu_group.tpl
@@ -0,0 +1,9 @@
+<dl>
+	<input type="checkbox" autocomplete="off" id="{$menu->getClass()}" class="menu-trigger" />
+	<dt>
+		<label for="{$menu->getClass()}">{$menu->getName()}</label>
+	</dt>
+	{foreach from=$menu->getEntries() key=text item=url}
+		<dd><a href="{eval var=$url}">{$text}</a></dd>
+	{/foreach}
+</dl>
diff --git a/templates/components/subhead.tpl b/templates/components/subhead.tpl
new file mode 100644
index 0000000..19eab35
--- /dev/null
+++ b/templates/components/subhead.tpl
@@ -0,0 +1,9 @@
+<div class="subhead">{$subhead}</div>
+{*
+<div class="par-subhead">
+	{$subhead}
+</div>
+<div class="par-subhead-dots">
+	 
+</div>
+*}
diff --git a/templates/contact.tpl b/templates/contact.tpl
deleted file mode 100644
index 4aad3d4..0000000
--- a/templates/contact.tpl
+++ /dev/null
@@ -1,27 +0,0 @@
-<div class="box">
-	<div class="intro">
-		{#contactIntro#}
-	</div>
-
-	<div class="content">
-		{include file='subhead.tpl' subhead=#contactIRCHeader#}
-		<div class="subhead-content">
-			{#contactIRC#}
-		</div>
-
-		{include file='subhead.tpl' subhead=#contactForumsHeader#}
-		<div class="subhead-content">
-			{#contactForums#}
-		</div>
-
-		{include file='subhead.tpl' subhead=#contactTrackersHeader#}
-		<div class="subhead-content">
-			{#contactTrackers#}
-		</div>
-
-		{include file='subhead.tpl' subhead=#contactListsHeader#}
-		<div class="subhead-content">
-			{#contactLists#}
-		</div>
-	</div>
-</div>
diff --git a/templates/credits.tpl b/templates/credits.tpl
deleted file mode 100644
index 184694e..0000000
--- a/templates/credits.tpl
+++ /dev/null
@@ -1,30 +0,0 @@
-{foreach from=$credits item=csection}
-<div class="box">
-	<div class="head">{$csection->getTitle()}</div>
-	<div class="content">
-		{if $csection->getSubsections()|@count > 0}
-			{foreach from=$csection->getSubsections() item=subcsection}
-				<div class="subhead">{$subcsection->getTitle()}</div>
-				<div class="subhead-content">
-					{include
-						file='credits_entry.tpl'
-						groups=$subcsection->getGroups()
-						paragraphs=$subcsection->getParagraphs()
-					}
-				</div>
-			{/foreach}
-			{* If the section itself has paragraphs, we must process them here. *}
-			{include
-				file='credits_entry.tpl'
-				paragraphs=$csection->getParagraphs()
-			}
-		{else}
-			{include
-				file='credits_entry.tpl'
-				groups=$csection->getGroups()
-				paragraphs=$csection->getParagraphs()
-			}
-		{/if}
-	</div>
-</div>
-{/foreach}
diff --git a/templates/credits_entry.tpl b/templates/credits_entry.tpl
deleted file mode 100644
index c81792d..0000000
--- a/templates/credits_entry.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{if is_array($groups) && $groups|@count > 0}
-	{foreach from=$groups item=group}
-	<table class="credits">
-		{if $group.name != null}
-		<caption>{$group.name}:</caption>
-		{/if}
-		<tbody>
-		{foreach from=$group.persons item=person}
-			<tr>
-				<td class="name">{$person->getName()}</td>
-				<td class="alias">{$person->getAlias()}</td>
-				<td>{$person->getDescription()}</td>
-			</tr>
-		{/foreach}
-		</tbody>
-	</table>
-	{/foreach}
-{/if}
-
-{if is_array($paragraphs) && $paragraphs|@count > 0}
-	{foreach from=$paragraphs item=paragraph}
-	<p class="credits">{$paragraph}</p>
-	{/foreach}
-{/if}
diff --git a/templates/documentation.tpl b/templates/documentation.tpl
deleted file mode 100644
index b98969e..0000000
--- a/templates/documentation.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="box">
-	<div class="intro">
-		<p>{#documentationIntro#}</p>
-	</div>
-	<div class="content">
-		{foreach from=$documents item=document}
-		<p>
-			<a href="{eval var=$document->getURL()}">{eval var=$document->getName()}</a><br>
-			{eval var=$document->getDescription()}
-		</p>
-		{/foreach}
-	</div>
-</div>
diff --git a/templates/downloads.tpl b/templates/downloads.tpl
deleted file mode 100644
index 396638b..0000000
--- a/templates/downloads.tpl
+++ /dev/null
@@ -1,64 +0,0 @@
-{foreach from=$downloads item=dsection name=downloads_loop}
-<div class="box" id="{if $dsection->getAnchor() != 'a'}{$dsection->getAnchor()}{/if}">
-	<div class="head">{eval var=$dsection->getTitle()}</div>
-	{if $smarty.foreach.downloads_loop.first}
-	<div class="intro row">
-		<div class="navigation col-1-2">
-			<h4>{#downloadsHeader#}</h4>
-			<ul>
-				{foreach from=$sections item=arr}
-				<li>
-					<a href="/downloads/#{$arr.anchor}">{eval var=$arr.title}</a>
-				</li>
-				{/foreach}
-			</ul>
-		</div>
-		<div class="text col-1-2">
-			<p>{'/\x7brelease\x7d/'|preg_replace:$release:#downloadsContentP1#}</p>
-			<ul>
-				<li>{'/\x7brelease\x7d/'|preg_replace:$release:#downloadsContentP2#}</li>
-				<li>{#downloadsContentP3#}</li>
-				<li>{#downloadsContentP4#}</li>
-			</ul>
-		</div>
-	</div>
-
-	<div class="content">
-		<!-- Recommended download - start -->
-		<div id="recommended-download" class="hidden">
-			<div class="subhead">{#downloadsBadge#}</div>
-			<div class="subhead-content">
-
-				<div id="downloadContainer">
-					<a id="downloadButton">
-						<img src="images/scummvm.png" alt="Download ScummVM icon">
-						<div class="downloadText">Download ScummVM</div>
-						<div id="downloadDetails"></div>
-					</a>
-				</div>
-			</div>
-		</div>
-		<br>
-
-		<script>{$recommendedDownloadsJS}</script>
-		<script src="/javascripts/recommended_dl.js"></script>
-		<!-- Recommended download - end -->
-	{else}
-	<div class="content">
-	{/if}
-
-	{foreach from=$dsection->getSubSections() item=dsubsection}
-	{if $dsubsection->getTitle() != ''}
-		<div class="subhead" id="{if $dsubsection->getAnchor() != ''}{$dsubsection->getAnchor()}{/if}">{eval var=$dsubsection->getTitle()}</div>
-	{/if}
-
-		<div class="subhead-content">
-			{if $dsubsection->getNotes() != ''} {eval var=$dsubsection->getNotes()} {/if} {include file='list_items.tpl' list=$dsubsection->getItems() type='platforms'}
-			{if !is_null($dsubsection->getFooter())}
-			<p>{$dsubsection->getFooter()}</p>
-			{/if}
-		</div>
-	{/foreach}
-	</div>
-</div>
-{/foreach}
diff --git a/templates/exception.tpl b/templates/exception.tpl
deleted file mode 100644
index 7b70815..0000000
--- a/templates/exception.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="box">
-	<div class="head">{#exceptionHeading#}</div>
-	<div class="intro">
-		<h2>{#exceptionIntro#}</h2>
-	</div>
-	<div class="content">
-		<img src="/images/three-headed-monkey.png" alt="{#exceptionAlt#}" class="float_right" style="margin-bottom: 5px;">
-		<h3>{#exceptionContent#}</h3>
-		<p>{$exception->getMessage()|nl2br:false}</p>
-	</div>
-	<div class="spacing"> </div>
-</div>
diff --git a/templates/faq.tpl b/templates/faq.tpl
deleted file mode 100644
index f020255..0000000
--- a/templates/faq.tpl
+++ /dev/null
@@ -1,41 +0,0 @@
-<div class="box">
-	<div class="head">
-		{#faqHeading#}
-	</div>
-	<div class="content">
-	<div class="news-author">{#faqLastUpdated#} {$modified}</div>
-		<dl>
-			{foreach from=$contents item=section name='toc_loop'}
-				{assign var='toc_num' value=$smarty.foreach.toc_loop.iteration}
-				<dt>{$toc_num}. <a href="/faq/#{$toc_num}">{$section->getTitle()}</a></dt>
-				<dd>
-					<dl>
-					{foreach from=$section->getTOC() key=href item=name name='toc_section_loop'}
-						{assign var='toc_section_num' value=$smarty.foreach.toc_section_loop.iteration}
-						<dt>{$toc_num}.{$toc_section_num}. <a href="/faq/#{$toc_num}_{$toc_section_num}">{$name}</a></dt>
-					{/foreach}
-					</dl>
-				</dd>
-			{/foreach}
-		</dl>
-
-		{foreach from=$contents item=section name='section_loop'}
-			{assign var='section_num' value=$smarty.foreach.section_loop.iteration}
-			<div class="section">
-				<h3 class="title" id="{$section_num}">{$section_num}. {$section->getTitle()}</h3>
-				<dl>
-					{foreach from=$section->getTOC() key=href item=name name='question_loop'}
-						{assign var='question_num' value=$smarty.foreach.question_loop.iteration}
-						<dt>{$section_num}.{$question_num}. <a href="/faq/#{$section_num}_{$question_num}">{$name}</a></dt>
-					{/foreach}
-				</dl>
-				{foreach from=$section->getEntries() item=entry name='entry_loop'}
-					{assign var='entry_num' value=$smarty.foreach.entry_loop.iteration}
-					<div class="question" id="{$section_num}_{$entry_num}">{$section_num}.{$entry_num}.
-						{$entry->getQuestion()}</div>
-					<div class="answer">{$entry->getAnswer()}</div>
-				{/foreach}
-			</div>
-		{/foreach}
-	</div>
-</div>
diff --git a/templates/feed_atom.tpl b/templates/feed_atom.tpl
deleted file mode 100644
index a130b45..0000000
--- a/templates/feed_atom.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{* Published date. *}
-{assign var='timezone_offset' value=$news[0]->getDate()|date_f:'Z'}
-{assign var='updated' value=$news[0]->getDate()-$timezone_offset}
-<?xml version="1.0" encoding="UTF-8" ?>
-<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom">
-	<id>{$baseurl}</id>
-	<link rel="alternate" type="text/html" href="http://www.scummvm.org" />
-	<link rel="self" type="application/atom+xml" href="{$baseurl}feeds/atom/" />
-	<title type="text">{#feedAtomTitle#}</title>
-	<subtitle type="html"><![CDATA[{#feedAtomDescription#}]]></subtitle>
-	<icon>{$baseurl}favicon.ico</icon>
-	<author>
-		<name>ScummVM team</name>
-		<uri>http://www.scummvm.org/</uri>
-	</author>
-	<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
-	{foreach from=$news item=n}
-		{assign var='timezone_offset' value=$n->getDate()|date_f:'Z'}
-		{assign var='updated' value=$n->getDate()-$timezone_offset}
-		{assign var='news_filename' value=$n->getFilename()|substr:'0':'-4'}
-
-		<entry xml:lang="en">
-			<id>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</id>
-			<link rel="alternate" href="{$news->getLink()}" />
-			<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
-			<published>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</published>
-			<title type="html">{$n->getTitle()}</title>
-			<content type="html" xml:base="http://www.scummvm.org"><![CDATA[{$n->getContent()}]]></content>
-			{if $n->getAuthor() != ''}
-			<author><name>{$n->getAuthor()}</name></author>
-			{/if}
-		</entry>
-	{/foreach}
-</feed>
diff --git a/templates/feed_rss.tpl b/templates/feed_rss.tpl
deleted file mode 100644
index a32e11e..0000000
--- a/templates/feed_rss.tpl
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version='1.0' encoding='UTF-8' ?>
-<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
-	<channel>
-		<title>{#feedRSSTitle#}</title>
-		<link>http://www.scummvm.org/</link>
-		<atom:link rel="self" type="application/rss+xml" href="{$baseurl}feeds/rss/" />
-		<description>{#feedRSSDescription#}</description>
-		<language>en</language>
-		{foreach from=$news item=n}
-		{assign var='news_filename' value=$n->getFilename()|substr:'0':'-4'}
-		<item>
-			<title>{$n->getTitle()}</title>
-			<description><![CDATA[{$n->getContent()}]]></description>
-			<pubDate>{$n->getDate()|date_f:'r'}</pubDate>
-			{if $n->getAuthor() != ''}
-			<author>nospam at scummvm.org ({$n->getAuthor()})</author>
-			{/if}
-			<guid isPermaLink='true'>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</guid>
-			<link>{$news->getLink()}/</link>
-		</item>
-		{/foreach}
-	</channel>
-</rss>
diff --git a/templates/game_demos.tpl b/templates/game_demos.tpl
deleted file mode 100644
index 8346632..0000000
--- a/templates/game_demos.tpl
+++ /dev/null
@@ -1,46 +0,0 @@
-<script type="text/javascript" src="/javascripts/jquery-1.3.2.min.js"></script>
-<script type="text/javascript" src="/javascripts/game_demos.js"></script>
-
-<div class="box">
-	<div class="intro row">
-		<div class="navigation col-1-2">
-			<h4>{#gamesDemosHeading#}</h4>
-			<ul>
-			{foreach from=$demos item=group}
-				<li><a href="/demos/#{$group.href}">{$group.name}</a></li>
-			{/foreach}
-			</ul>
-		</div>
-		<div class="text col-1-2">
-			<p>
-				{#gamesDemosContentP1#}
-			</p>
-			<p>
-				{#gamesDemosContentP2#}
-			</p>
-		</div>
-	</div>
-	<div class="content">
-		{foreach from=$demos item=group}
-		<table class="chart color4 gameDemos" id="{$group.href}">
-			<caption>{$group.name}</caption>
-			<thead>
-				<tr class="color4">
-					<th>{#gamesDemosH1#}</th>
-					<th class="gameTarget">{#gamesDemosH2#}</th>
-				</tr>
-			</thead>
-			<tbody>
-			{foreach from=$group.demos item=demo}
-				<tr class="{cycle values="color2, color0"}">
-					<td>						
-						<a href="{$demo->getURL()}">{$demo->getName()}</a>
-					</td>
-					<td class="gameTarget">{$demo->getTarget()}</td>
-				</tr>
-			{/foreach}
-			</tbody>
-		</table>
-		{/foreach}
-	</div>
-</div>
diff --git a/templates/games.tpl b/templates/games.tpl
deleted file mode 100644
index 95a5d3c..0000000
--- a/templates/games.tpl
+++ /dev/null
@@ -1,45 +0,0 @@
-{foreach from=$downloads item=dsection name=downloads_loop}
-	<div class="box" id="{if $dsection->getAnchor() != ''}{$dsection->getAnchor()}{/if}">
-		<div class="head">{eval var=$dsection->getTitle()}</div>
-
-		{if $smarty.foreach.downloads_loop.first}
-		<div class="intro row">
-			<div class="navigation col-1-2">
-				<h4>{#gamesHeader#}</h4>
-				<ul>
-				{foreach from=$sections item=arr}
-					<li><a href="/games/#{$arr.anchor}">{eval var=$arr.title}</a></li>
-				{/foreach}
-				</ul>
-			</div>
-			<div class="text col-1-2">
-				<ul>
-					<li>{#gamesContentP1#}</li>
-					<li>{#gamesContentP2#}</li>
-				</ul>
-			</div>
-		</div>
-		<div class="content">
-		{else}
-		<div class="content">
-		{/if}
-
-		{foreach from=$dsection->getSubSections() item=dsubsection}
-			{if $dsubsection->getTitle() != ''}
-				<div class="subhead" id="{if $dsubsection->getAnchor() != ''}{$dsubsection->getAnchor()}{/if}">{eval var=$dsubsection->getTitle()}</div>
-			{/if}
-
-			<div class="subhead-content">
-				{if $dsubsection->getNotes() != ''}
-					{eval var=$dsubsection->getNotes()}
-				{/if}
-
-				{include file='list_items.tpl' list=$dsubsection->getItems() type='games'}
-				{if !is_null($dsubsection->getFooter())}
-					<p>{$dsubsection->getFooter()}</p>
-				{/if}
-			</div>
-		{/foreach}
-		</div>
-	</div>
-{/foreach}
diff --git a/templates/index.tpl b/templates/index.tpl
index 10648ee..7635735 100644
--- a/templates/index.tpl
+++ b/templates/index.tpl
@@ -55,7 +55,7 @@
 							{$content}
 						</div>
 
-						{include file='banners.tpl'}
+						{include file='components/banners.tpl'}
 					</div>
 				</div>
 			</div>
@@ -64,15 +64,15 @@
 			<div class="col-1-5">
 				<nav>
 					{foreach from=$menus item=menu}
-						{include file='menu_group.tpl' menu=$menu}
+						{include file='components/menu_group.tpl' menu=$menu}
 					{/foreach}
 
-					{include file='lang_menu.tpl'}
+					{include file='components/lang_menu.tpl'}
 				</nav>
 
 				<div class="monkey hide-small">
 					<img src="/images/hangmonk.gif" alt="monkey" width="55" height="57" class="float_right">
-					{include file='banners.tpl'}
+					{include file='components/banners.tpl'}
 				</div>
 			</div>
 		</div>
diff --git a/templates/lang_menu.tpl b/templates/lang_menu.tpl
deleted file mode 100644
index 429b92f..0000000
--- a/templates/lang_menu.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-<dl>
-    <input type="checkbox" autocomplete="off" id="menu-lang" class="menu-trigger" />
-    <dt>
-        <label for="menu-lang">Language</label>
-    </dt>
-    {foreach from=$available_languages key=key item=item}
-    <dd>
-        <a href="{$pageurl}?lang={$key}">{$item|escape}</a>
-    </dd>
-    {/foreach}
-</dl>
diff --git a/templates/layout/footer.tpl b/templates/layout/footer.tpl
new file mode 100644
index 0000000..74180cd
--- /dev/null
+++ b/templates/layout/footer.tpl
@@ -0,0 +1,10 @@
+<footer class="row">
+  <div class="col-4-5">
+    {#indexLegal#}
+  </div>
+  <div class="col-1-5 hide-small">
+    <div class="tentacle">
+      <img src="/images/tentacle.svg" alt="Tentacle">
+    </div>
+  </div>
+</footer>
diff --git a/templates/layout/header.tpl b/templates/layout/header.tpl
new file mode 100644
index 0000000..7fc6116
--- /dev/null
+++ b/templates/layout/header.tpl
@@ -0,0 +1,16 @@
+<header>
+  <div class="row hide-small">
+    <div class="col-1-1 top">
+      <img class="header-image" src="/images/heroes{$heroes_num|rand:0}.png" alt="{#indexCharacters#}">
+    </div>
+  </div>
+  <div class="row topper">
+    <div class="col-1-2">
+      <img class="logo maniac hide-small" src="/images/maniac-half.png" alt="Maniac Mansion kids">
+      <a href="{$baseurl}"><img class="logo" src="/images/scummvm_logo.png" alt="{#indexLogo#}"></a>
+    </div>
+    <div class="col-1-2 hide-small float_right">
+      <span class="scummvm float_right">Script Creation Utility for Maniac Mansion Virtual Machine</span>
+    </div>
+  </div>
+</header>
diff --git a/templates/layout/menu.tpl b/templates/layout/menu.tpl
new file mode 100644
index 0000000..b27187c
--- /dev/null
+++ b/templates/layout/menu.tpl
@@ -0,0 +1,12 @@
+<nav>
+  {foreach from=$menus item=menu}
+    {include file='menu_group.tpl' menu=$menu}
+  {/foreach}
+
+  {include file='lang_menu.tpl'}
+</nav>
+
+<div class="monkey hide-small">
+  <img src="/images/hangmonk.gif" alt="monkey" width="55" height="57" class="float_right">
+  {include file='banners.tpl'}
+</div>
diff --git a/templates/links.tpl b/templates/links.tpl
deleted file mode 100644
index 119c334..0000000
--- a/templates/links.tpl
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="box">
-	<div class="head">
-		{#linksHeading#}
-	</div>
-	<div class="intro">
-		<img src="/images/scummvm-link.png" width="88" height="31" alt="ScummVM">
-		{#linksIntro#}
-	</div>
-	<div class="content">
-		{foreach from=$links item=group}
-		{include file='subhead.tpl' subhead=$group.name}
-		<div class="subhead-content">
-			<p>{$group.description}</p>
-			<div class="linklist">
-				{foreach from=$group.links item=link}
-				<div class="linkentry">
-					<div class="linkhead">
-						<a href="{$link->getURL()}">{$link->getName()}</a>
-					</div>
-					<div class="linkbody">
-						{$link->getDescription()}
-					</div>
-				</div>
-				{/foreach}
-			</div>
-		</div>
-    	{/foreach}
-	</div>
-</div>
diff --git a/templates/menu_group.tpl b/templates/menu_group.tpl
deleted file mode 100644
index 31bce7c..0000000
--- a/templates/menu_group.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<dl>
-	<input type="checkbox" autocomplete="off" id="{$menu->getClass()}" class="menu-trigger" />
-	<dt>
-		<label for="{$menu->getClass()}">{$menu->getName()}</label>
-	</dt>
-	{foreach from=$menu->getEntries() key=text item=url}
-		<dd><a href="{eval var=$url}">{$text}</a></dd>
-	{/foreach}
-</dl>
diff --git a/templates/news.tpl b/templates/news.tpl
deleted file mode 100644
index b4b3a18..0000000
--- a/templates/news.tpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{foreach from=$news_items item=news}
-  {$news_filename=$news->getFilename()|substr:'0':'-4'}
-  <div class="box">
-    <div class="head" id="{$news->getDate()|date_format:"%Y-%m-%d"}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}">
-      <a href="{$news->getLink()}/">
-        <span class="news-date">{$news->getDate()|date_localized:#dateformat#}</span>:
-        {$news->getTitle()}
-      </a>
-    </div>
-    <div class="news content">
-      <div class="news-author">
-        {#newsPostedBy#} {$news->getAuthor()}
-      </div>
-      {$news->getContent()}
-      <div class="spacing"></div>
-    </div>
-  </div>
-{/foreach}
-
-{* Only show the 'more news' link if we're on the main page *}
-{if is_bool($news_archive_link) && $news_archive_link}
-<p class="bottom-link">
-	<span class="feeds float_left">
-		<a href="/feeds/atom/">Atom</a> |
-		<a href="/feeds/rss/">RSS</a>
-	</span>
-	<a href="/news/archive/" class="float_right">{#newsMoreNews#}</a>
-</p>
-{/if}
diff --git a/templates/pages/_index.tpl b/templates/pages/_index.tpl
new file mode 100644
index 0000000..a2bec86
--- /dev/null
+++ b/templates/pages/_index.tpl
@@ -0,0 +1,18 @@
+<div class="content">
+  {* Introduction text and screenshot viewer. *}
+  {if isset($show_intro) && $show_intro}
+    {include file='intro_header.tpl'}
+  {/if}
+
+  {* The actual content. *}
+  <div class="round-box">
+    <div class="round-box-header">
+      {$content_title}
+    </div>
+    <div class="round-box-content">
+      {$content}
+    </div>
+
+    {include file='banners.tpl'}
+  </div>
+</div>
diff --git a/templates/pages/compatibility.tpl b/templates/pages/compatibility.tpl
new file mode 100644
index 0000000..963ba09
--- /dev/null
+++ b/templates/pages/compatibility.tpl
@@ -0,0 +1,108 @@
+<div class="box">
+	<div class="intro">
+		<p>
+			{#compatibilityIntro#}
+		</p>
+		<p>
+			{#compatibilityIntroExplanation#}
+		</p>
+		{if $version == 'DEV'}
+			<p>
+				{#compatibilityDevContent#}
+				{foreach from=$versions item=ver name=versions_loop}
+					{if $smarty.foreach.versions_loop.last}
+						{assign var='last' value=')'}
+					{/if}
+					<a href="/compatibility/{$ver}/">{$ver}</a>{$last}
+				{/foreach}
+			</p>
+			<p>
+				{#compatibilityDevDisclaimer#}
+			</p>
+		{else}
+			<p>
+				{'/\x7bversion\x7d/'|preg_replace:$version:#compatibilityStableContent#}
+			</p>
+			<p>
+				{#compatibilityStableReleases#}
+			{foreach from=$versions item=ver}
+				<a href="/compatibility/{$ver}/">{$ver}</a>
+			{/foreach}
+			</p>
+		{/if}
+		<p>
+			<small>{#compatiblityLastUpdated#} {$last_updated}</small>
+		</p>
+	</div>
+	<div class="content">
+		<table class="chart color4 colorKeyTable">
+			<caption>{#compatibilityLegendTitle#}</caption>
+			<tbody>
+				<tr class="color2">
+					{if $old_layout == 'no'}
+						{foreach from=$support_level_desc key=level item=desc}
+							<td class={$support_level_class.$level} align='center'>{$desc}</td>
+						{/foreach}
+					{else}
+						<td class="pct0"> 0</td>
+						<td class="pct5"> 5</td>
+						<td class="pct10">10</td>
+						<td class="pct15">15</td>
+						<td class="pct20">20</td>
+						<td class="pct25">25</td>
+						<td class="pct30">30</td>
+						<td class="pct35">35</td>
+						<td class="pct40">40</td>
+						<td class="pct45">45</td>
+						<td class="pct50">50</td>
+						<td class="pct55">55</td>
+						<td class="pct60">60</td>
+						<td class="pct65">65</td>
+						<td class="pct70">70</td>
+						<td class="pct75">75</td>
+						<td class="pct80">80</td>
+						<td class="pct85">85</td>
+						<td class="pct90">90</td>
+						<td class="pct95">95</td>
+						<td class="pct100">100</td>
+					{/if}
+				</tr>
+			</tbody>
+		</table>
+
+		{foreach from=$compat_data key=company item=games name=compat_loop}
+			<table class="chart color4">
+				<caption>{'/\x7bcompany\x7d/'|preg_replace:$company:#compatibilitySectionTitle#}</caption>
+				<thead>
+					<tr class="color4">
+						<th class="gameFullName">{#compatibilityDetailsChartCol1#}</th>
+						<th class="gameShortName">{#compatibilityDetailsChartCol2#}</th>
+						{if $old_layout == 'no'}
+							<th class="gameSupportLevel">{#compatibilityDetailsChartCol3a#}</th>
+						{else}
+							<th class="gameSupportLevel">{#compatibilityDetailsChartCol3b#}</th>
+						{/if}
+					</tr>
+				</thead>
+				<tbody>
+				{foreach from=$games item=game}
+					{if $old_layout == 'no'}
+						{assign var="x" value=$game->getSupportLevel()}
+						{assign var="pct_class" value=$support_level_class.$x}
+						{assign var="support_level" value=$support_level_desc.$x}
+					{else}
+						{math equation="x - (x % 5)" x=$game->getSupportLevel() assign='pct_class'}
+						{assign var="pct_class" value="pct"|cat:$pct_class}
+						{assign var="support_level" value=$game->getSupportLevel()|cat:"%"}
+					{/if}
+					<tr class="color{cycle values='2,0'}">
+						<td class="gameFullName"><a href="/compatibility/{$version}/{$game->getTarget()}/">{$game->getName()}</a></td>
+						<td class="gameShortName">{$game->getTarget()}</td>
+						<td class="gameSupportLevel {$pct_class}">{$support_level}</td>
+					</tr>
+				{/foreach}
+				</tbody>
+			</table>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/contact.tpl b/templates/pages/contact.tpl
new file mode 100644
index 0000000..4aad3d4
--- /dev/null
+++ b/templates/pages/contact.tpl
@@ -0,0 +1,27 @@
+<div class="box">
+	<div class="intro">
+		{#contactIntro#}
+	</div>
+
+	<div class="content">
+		{include file='subhead.tpl' subhead=#contactIRCHeader#}
+		<div class="subhead-content">
+			{#contactIRC#}
+		</div>
+
+		{include file='subhead.tpl' subhead=#contactForumsHeader#}
+		<div class="subhead-content">
+			{#contactForums#}
+		</div>
+
+		{include file='subhead.tpl' subhead=#contactTrackersHeader#}
+		<div class="subhead-content">
+			{#contactTrackers#}
+		</div>
+
+		{include file='subhead.tpl' subhead=#contactListsHeader#}
+		<div class="subhead-content">
+			{#contactLists#}
+		</div>
+	</div>
+</div>
diff --git a/templates/pages/credits.tpl b/templates/pages/credits.tpl
new file mode 100644
index 0000000..184694e
--- /dev/null
+++ b/templates/pages/credits.tpl
@@ -0,0 +1,30 @@
+{foreach from=$credits item=csection}
+<div class="box">
+	<div class="head">{$csection->getTitle()}</div>
+	<div class="content">
+		{if $csection->getSubsections()|@count > 0}
+			{foreach from=$csection->getSubsections() item=subcsection}
+				<div class="subhead">{$subcsection->getTitle()}</div>
+				<div class="subhead-content">
+					{include
+						file='credits_entry.tpl'
+						groups=$subcsection->getGroups()
+						paragraphs=$subcsection->getParagraphs()
+					}
+				</div>
+			{/foreach}
+			{* If the section itself has paragraphs, we must process them here. *}
+			{include
+				file='credits_entry.tpl'
+				paragraphs=$csection->getParagraphs()
+			}
+		{else}
+			{include
+				file='credits_entry.tpl'
+				groups=$csection->getGroups()
+				paragraphs=$csection->getParagraphs()
+			}
+		{/if}
+	</div>
+</div>
+{/foreach}
diff --git a/templates/pages/documentation.tpl b/templates/pages/documentation.tpl
new file mode 100644
index 0000000..b98969e
--- /dev/null
+++ b/templates/pages/documentation.tpl
@@ -0,0 +1,13 @@
+<div class="box">
+	<div class="intro">
+		<p>{#documentationIntro#}</p>
+	</div>
+	<div class="content">
+		{foreach from=$documents item=document}
+		<p>
+			<a href="{eval var=$document->getURL()}">{eval var=$document->getName()}</a><br>
+			{eval var=$document->getDescription()}
+		</p>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/downloads.tpl b/templates/pages/downloads.tpl
new file mode 100644
index 0000000..396638b
--- /dev/null
+++ b/templates/pages/downloads.tpl
@@ -0,0 +1,64 @@
+{foreach from=$downloads item=dsection name=downloads_loop}
+<div class="box" id="{if $dsection->getAnchor() != 'a'}{$dsection->getAnchor()}{/if}">
+	<div class="head">{eval var=$dsection->getTitle()}</div>
+	{if $smarty.foreach.downloads_loop.first}
+	<div class="intro row">
+		<div class="navigation col-1-2">
+			<h4>{#downloadsHeader#}</h4>
+			<ul>
+				{foreach from=$sections item=arr}
+				<li>
+					<a href="/downloads/#{$arr.anchor}">{eval var=$arr.title}</a>
+				</li>
+				{/foreach}
+			</ul>
+		</div>
+		<div class="text col-1-2">
+			<p>{'/\x7brelease\x7d/'|preg_replace:$release:#downloadsContentP1#}</p>
+			<ul>
+				<li>{'/\x7brelease\x7d/'|preg_replace:$release:#downloadsContentP2#}</li>
+				<li>{#downloadsContentP3#}</li>
+				<li>{#downloadsContentP4#}</li>
+			</ul>
+		</div>
+	</div>
+
+	<div class="content">
+		<!-- Recommended download - start -->
+		<div id="recommended-download" class="hidden">
+			<div class="subhead">{#downloadsBadge#}</div>
+			<div class="subhead-content">
+
+				<div id="downloadContainer">
+					<a id="downloadButton">
+						<img src="images/scummvm.png" alt="Download ScummVM icon">
+						<div class="downloadText">Download ScummVM</div>
+						<div id="downloadDetails"></div>
+					</a>
+				</div>
+			</div>
+		</div>
+		<br>
+
+		<script>{$recommendedDownloadsJS}</script>
+		<script src="/javascripts/recommended_dl.js"></script>
+		<!-- Recommended download - end -->
+	{else}
+	<div class="content">
+	{/if}
+
+	{foreach from=$dsection->getSubSections() item=dsubsection}
+	{if $dsubsection->getTitle() != ''}
+		<div class="subhead" id="{if $dsubsection->getAnchor() != ''}{$dsubsection->getAnchor()}{/if}">{eval var=$dsubsection->getTitle()}</div>
+	{/if}
+
+		<div class="subhead-content">
+			{if $dsubsection->getNotes() != ''} {eval var=$dsubsection->getNotes()} {/if} {include file='list_items.tpl' list=$dsubsection->getItems() type='platforms'}
+			{if !is_null($dsubsection->getFooter())}
+			<p>{$dsubsection->getFooter()}</p>
+			{/if}
+		</div>
+	{/foreach}
+	</div>
+</div>
+{/foreach}
diff --git a/templates/pages/faq.tpl b/templates/pages/faq.tpl
new file mode 100644
index 0000000..f020255
--- /dev/null
+++ b/templates/pages/faq.tpl
@@ -0,0 +1,41 @@
+<div class="box">
+	<div class="head">
+		{#faqHeading#}
+	</div>
+	<div class="content">
+	<div class="news-author">{#faqLastUpdated#} {$modified}</div>
+		<dl>
+			{foreach from=$contents item=section name='toc_loop'}
+				{assign var='toc_num' value=$smarty.foreach.toc_loop.iteration}
+				<dt>{$toc_num}. <a href="/faq/#{$toc_num}">{$section->getTitle()}</a></dt>
+				<dd>
+					<dl>
+					{foreach from=$section->getTOC() key=href item=name name='toc_section_loop'}
+						{assign var='toc_section_num' value=$smarty.foreach.toc_section_loop.iteration}
+						<dt>{$toc_num}.{$toc_section_num}. <a href="/faq/#{$toc_num}_{$toc_section_num}">{$name}</a></dt>
+					{/foreach}
+					</dl>
+				</dd>
+			{/foreach}
+		</dl>
+
+		{foreach from=$contents item=section name='section_loop'}
+			{assign var='section_num' value=$smarty.foreach.section_loop.iteration}
+			<div class="section">
+				<h3 class="title" id="{$section_num}">{$section_num}. {$section->getTitle()}</h3>
+				<dl>
+					{foreach from=$section->getTOC() key=href item=name name='question_loop'}
+						{assign var='question_num' value=$smarty.foreach.question_loop.iteration}
+						<dt>{$section_num}.{$question_num}. <a href="/faq/#{$section_num}_{$question_num}">{$name}</a></dt>
+					{/foreach}
+				</dl>
+				{foreach from=$section->getEntries() item=entry name='entry_loop'}
+					{assign var='entry_num' value=$smarty.foreach.entry_loop.iteration}
+					<div class="question" id="{$section_num}_{$entry_num}">{$section_num}.{$entry_num}.
+						{$entry->getQuestion()}</div>
+					<div class="answer">{$entry->getAnswer()}</div>
+				{/foreach}
+			</div>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/feed_atom.tpl b/templates/pages/feed_atom.tpl
new file mode 100644
index 0000000..a130b45
--- /dev/null
+++ b/templates/pages/feed_atom.tpl
@@ -0,0 +1,34 @@
+{* Published date. *}
+{assign var='timezone_offset' value=$news[0]->getDate()|date_f:'Z'}
+{assign var='updated' value=$news[0]->getDate()-$timezone_offset}
+<?xml version="1.0" encoding="UTF-8" ?>
+<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom">
+	<id>{$baseurl}</id>
+	<link rel="alternate" type="text/html" href="http://www.scummvm.org" />
+	<link rel="self" type="application/atom+xml" href="{$baseurl}feeds/atom/" />
+	<title type="text">{#feedAtomTitle#}</title>
+	<subtitle type="html"><![CDATA[{#feedAtomDescription#}]]></subtitle>
+	<icon>{$baseurl}favicon.ico</icon>
+	<author>
+		<name>ScummVM team</name>
+		<uri>http://www.scummvm.org/</uri>
+	</author>
+	<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
+	{foreach from=$news item=n}
+		{assign var='timezone_offset' value=$n->getDate()|date_f:'Z'}
+		{assign var='updated' value=$n->getDate()-$timezone_offset}
+		{assign var='news_filename' value=$n->getFilename()|substr:'0':'-4'}
+
+		<entry xml:lang="en">
+			<id>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</id>
+			<link rel="alternate" href="{$news->getLink()}" />
+			<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
+			<published>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</published>
+			<title type="html">{$n->getTitle()}</title>
+			<content type="html" xml:base="http://www.scummvm.org"><![CDATA[{$n->getContent()}]]></content>
+			{if $n->getAuthor() != ''}
+			<author><name>{$n->getAuthor()}</name></author>
+			{/if}
+		</entry>
+	{/foreach}
+</feed>
diff --git a/templates/pages/feed_rss.tpl b/templates/pages/feed_rss.tpl
new file mode 100644
index 0000000..a32e11e
--- /dev/null
+++ b/templates/pages/feed_rss.tpl
@@ -0,0 +1,23 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
+	<channel>
+		<title>{#feedRSSTitle#}</title>
+		<link>http://www.scummvm.org/</link>
+		<atom:link rel="self" type="application/rss+xml" href="{$baseurl}feeds/rss/" />
+		<description>{#feedRSSDescription#}</description>
+		<language>en</language>
+		{foreach from=$news item=n}
+		{assign var='news_filename' value=$n->getFilename()|substr:'0':'-4'}
+		<item>
+			<title>{$n->getTitle()}</title>
+			<description><![CDATA[{$n->getContent()}]]></description>
+			<pubDate>{$n->getDate()|date_f:'r'}</pubDate>
+			{if $n->getAuthor() != ''}
+			<author>nospam at scummvm.org ({$n->getAuthor()})</author>
+			{/if}
+			<guid isPermaLink='true'>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</guid>
+			<link>{$news->getLink()}/</link>
+		</item>
+		{/foreach}
+	</channel>
+</rss>
diff --git a/templates/pages/game_demos.tpl b/templates/pages/game_demos.tpl
new file mode 100644
index 0000000..8346632
--- /dev/null
+++ b/templates/pages/game_demos.tpl
@@ -0,0 +1,46 @@
+<script type="text/javascript" src="/javascripts/jquery-1.3.2.min.js"></script>
+<script type="text/javascript" src="/javascripts/game_demos.js"></script>
+
+<div class="box">
+	<div class="intro row">
+		<div class="navigation col-1-2">
+			<h4>{#gamesDemosHeading#}</h4>
+			<ul>
+			{foreach from=$demos item=group}
+				<li><a href="/demos/#{$group.href}">{$group.name}</a></li>
+			{/foreach}
+			</ul>
+		</div>
+		<div class="text col-1-2">
+			<p>
+				{#gamesDemosContentP1#}
+			</p>
+			<p>
+				{#gamesDemosContentP2#}
+			</p>
+		</div>
+	</div>
+	<div class="content">
+		{foreach from=$demos item=group}
+		<table class="chart color4 gameDemos" id="{$group.href}">
+			<caption>{$group.name}</caption>
+			<thead>
+				<tr class="color4">
+					<th>{#gamesDemosH1#}</th>
+					<th class="gameTarget">{#gamesDemosH2#}</th>
+				</tr>
+			</thead>
+			<tbody>
+			{foreach from=$group.demos item=demo}
+				<tr class="{cycle values="color2, color0"}">
+					<td>						
+						<a href="{$demo->getURL()}">{$demo->getName()}</a>
+					</td>
+					<td class="gameTarget">{$demo->getTarget()}</td>
+				</tr>
+			{/foreach}
+			</tbody>
+		</table>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/games.tpl b/templates/pages/games.tpl
new file mode 100644
index 0000000..95a5d3c
--- /dev/null
+++ b/templates/pages/games.tpl
@@ -0,0 +1,45 @@
+{foreach from=$downloads item=dsection name=downloads_loop}
+	<div class="box" id="{if $dsection->getAnchor() != ''}{$dsection->getAnchor()}{/if}">
+		<div class="head">{eval var=$dsection->getTitle()}</div>
+
+		{if $smarty.foreach.downloads_loop.first}
+		<div class="intro row">
+			<div class="navigation col-1-2">
+				<h4>{#gamesHeader#}</h4>
+				<ul>
+				{foreach from=$sections item=arr}
+					<li><a href="/games/#{$arr.anchor}">{eval var=$arr.title}</a></li>
+				{/foreach}
+				</ul>
+			</div>
+			<div class="text col-1-2">
+				<ul>
+					<li>{#gamesContentP1#}</li>
+					<li>{#gamesContentP2#}</li>
+				</ul>
+			</div>
+		</div>
+		<div class="content">
+		{else}
+		<div class="content">
+		{/if}
+
+		{foreach from=$dsection->getSubSections() item=dsubsection}
+			{if $dsubsection->getTitle() != ''}
+				<div class="subhead" id="{if $dsubsection->getAnchor() != ''}{$dsubsection->getAnchor()}{/if}">{eval var=$dsubsection->getTitle()}</div>
+			{/if}
+
+			<div class="subhead-content">
+				{if $dsubsection->getNotes() != ''}
+					{eval var=$dsubsection->getNotes()}
+				{/if}
+
+				{include file='list_items.tpl' list=$dsubsection->getItems() type='games'}
+				{if !is_null($dsubsection->getFooter())}
+					<p>{$dsubsection->getFooter()}</p>
+				{/if}
+			</div>
+		{/foreach}
+		</div>
+	</div>
+{/foreach}
diff --git a/templates/pages/links.tpl b/templates/pages/links.tpl
new file mode 100644
index 0000000..119c334
--- /dev/null
+++ b/templates/pages/links.tpl
@@ -0,0 +1,29 @@
+<div class="box">
+	<div class="head">
+		{#linksHeading#}
+	</div>
+	<div class="intro">
+		<img src="/images/scummvm-link.png" width="88" height="31" alt="ScummVM">
+		{#linksIntro#}
+	</div>
+	<div class="content">
+		{foreach from=$links item=group}
+		{include file='subhead.tpl' subhead=$group.name}
+		<div class="subhead-content">
+			<p>{$group.description}</p>
+			<div class="linklist">
+				{foreach from=$group.links item=link}
+				<div class="linkentry">
+					<div class="linkhead">
+						<a href="{$link->getURL()}">{$link->getName()}</a>
+					</div>
+					<div class="linkbody">
+						{$link->getDescription()}
+					</div>
+				</div>
+				{/foreach}
+			</div>
+		</div>
+    	{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/news.tpl b/templates/pages/news.tpl
new file mode 100644
index 0000000..b4b3a18
--- /dev/null
+++ b/templates/pages/news.tpl
@@ -0,0 +1,29 @@
+{foreach from=$news_items item=news}
+  {$news_filename=$news->getFilename()|substr:'0':'-4'}
+  <div class="box">
+    <div class="head" id="{$news->getDate()|date_format:"%Y-%m-%d"}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}">
+      <a href="{$news->getLink()}/">
+        <span class="news-date">{$news->getDate()|date_localized:#dateformat#}</span>:
+        {$news->getTitle()}
+      </a>
+    </div>
+    <div class="news content">
+      <div class="news-author">
+        {#newsPostedBy#} {$news->getAuthor()}
+      </div>
+      {$news->getContent()}
+      <div class="spacing"></div>
+    </div>
+  </div>
+{/foreach}
+
+{* Only show the 'more news' link if we're on the main page *}
+{if is_bool($news_archive_link) && $news_archive_link}
+<p class="bottom-link">
+	<span class="feeds float_left">
+		<a href="/feeds/atom/">Atom</a> |
+		<a href="/feeds/rss/">RSS</a>
+	</span>
+	<a href="/news/archive/" class="float_right">{#newsMoreNews#}</a>
+</p>
+{/if}
diff --git a/templates/pages/press.tpl b/templates/pages/press.tpl
new file mode 100644
index 0000000..5194b72
--- /dev/null
+++ b/templates/pages/press.tpl
@@ -0,0 +1,15 @@
+<div class="box">
+	<div class="head">{#pressHeading#}</div>
+	<div class="content">
+		<small>{#pressIntro#}</small>
+		{foreach from=$articles item=article}
+		<p>
+			{if $article->getLanguage() != null}
+				<a href="{$article->getURL()}"><b>{$article->getName()}</b></a> ({$article->getLanguage()}), {$article->getPosted()}
+			{else}
+				<a href="{$article->getURL()}"><b>{$article->getName()}</b></a>, {$article->getPosted()}
+			{/if}
+		</p>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/pages/press_snowberry.tpl b/templates/pages/press_snowberry.tpl
new file mode 100644
index 0000000..6d51962
--- /dev/null
+++ b/templates/pages/press_snowberry.tpl
@@ -0,0 +1,67 @@
+<div class="par-item">
+	<div class="par-head"></div>
+	<div class="par-content">
+
+<p>June 24, 2009</p>
+
+<p>
+Wonderful news for all the fans of classical adventure games: Snowberry Connection and Société Pollene announce that the first three games in the legendary Goblins series are now available to every customer of Gobliiins 4 as a free bonus (only via digital distribution channels: Gamersgate and Impulse).
+</p>
+
+<p>
+Playing these games on modern operating systems is made possible by the ScummVM program — the easiest way to enjoy the greatest adventure hits of the past.
+</p>
+
+<p>
+Alexander Souslov (Snowberry Connection):
+"Thanks to ScummVM, thousands of gamers around the world can enjoy the good old Goblins without any compatibility problems and headache"
+</p>
+
+<p>
+Max Horn (ScummVM):
+"Playing the Gobliiins games has been fun over a decade ago, and stil is. ScummVM allows you to enjoy them (and other classics) again on modern hardware, like your smartphone — if you are lucky enough to own them. That's why we at ScummVM are excited to see these gems being
+re-released to the public, together with the latest installment of this wonderful series. Thanks, Snowberry!"
+</p>
+
+<h4>About ScummVM</h4>
+
+<p>
+ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!
+</p>
+
+<p>
+More information is available here: <a href="/">http://www.scummvm.org/</a>
+</p>
+
+<h4>About Gobliiins 4</h4>
+
+<p>
+Designer: Pierre Gilhodes<br>
+Developer: Société Pollene<br>
+Int'l publisher: Snowberry Connection<br>
+Genre: Quest<br>
+Release: Spring 2009<br>
+Languages: English, French, Italian, German, Spanish,
+Russian, Polish, Czech, Hungarian<br>
+Official site: <a href="http://www.goblins4.ru/">http://www.goblins4.ru/</a><br>
+Format: DVD-ROM (PC Windows)<br>
+Also available via digital distribution systems: Impulse and Gamersgate
+</p>
+
+<p>
+Designed by original Gobliiins co-creator Pierre Gilhodes and developed by Societe Pollene, Gobliiins 4 brings back the beloved three original main characters in a zany adventure you won't be able to put down. Gobliiins 4 blends elements of adventure and puzzle gaming: the player must find a solution to each level in order to progress to the next. The race through this colorful adventure-land spans more than 30 hours, including a secret bonus level.
+</p>
+
+<h4>About Gobliiins</h4>
+
+<p>
+Characters & universe originally created by Muriel Tramis and Pierre Gilhodes. Gobliiins 4 designed by Pierre Gilhodes, developed by Société Pollene. © by Société Pollene & Snowberry Connection LRM Inc. Original music: Didier Sallustro. All rights reserved. To find more about Gobliiins and its creators, visit official websites at <a href="http://www.goblins4.com">www.goblins4.com</a> and <a href="http://www.goblins4.ru">www.goblins4.ru</a>.
+</p>
+
+<p>
+<font size=-2>Snowberry press release <a href="http://news.snowball.ru/?id=1684">in Russian</a>.</font>
+</p>
+
+	</div>
+
+</div>
diff --git a/templates/pages/screenshots.tpl b/templates/pages/screenshots.tpl
new file mode 100644
index 0000000..34ddd92
--- /dev/null
+++ b/templates/pages/screenshots.tpl
@@ -0,0 +1,48 @@
+{* Random screenshot. *}
+{assign var='rand_files' value=$random_shot.screenshot->getFiles()}
+{assign var='rand_max' value=$rand_files|@count}
+{assign var='rand_pos' value=0|rand:$rand_max-1}
+{assign var='rand_file' value=$rand_files[$rand_pos]}
+
+{* List the available categories. *}
+<div class="box">
+	<div class="head">{#screenshotsHeading#}</div>
+	<div class="intro row">
+		<div class="navigation col-1-2">
+			<h4>{#screenshotsNavigation#}</h4>
+			<ul>
+			{foreach from=$screenshots item=arr}
+				<li><a href="/screenshots/#{$arr.category}">{eval var=$arr.title}</a></li>
+			{/foreach}
+			</ul>
+		</div>
+		<div class="text col-1-2">
+			<div class="round-box">
+				<div class="round-box-content gallery bg-yellow">
+					<a href="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" title="{$rand_file.caption}">
+						<img class="random-screenshot" src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" alt="{$rand_file.caption}">
+					</a>
+				</div>
+			</div>
+		</div>
+	</div>
+
+	<div class="content">
+		{foreach from=$screenshots item=arr}
+		<div class="subhead" id="{$arr.category}">
+			<a href="/screenshots/{$arr.category}/">{$arr.title}</a>
+		</div>
+		<div class="scr-content scr-content-{$arr.category}">
+      {include file='list_items.tpl' list=$arr.games type='games'}
+		</div>
+		{/foreach}
+	</div>
+</div>
+
+{literal}
+<script>
+	window.addEventListener('DOMContentLoaded', function() {
+		baguetteBox.run('.gallery');
+	});
+</script>
+{/literal}
diff --git a/templates/pages/screenshots_category.tpl b/templates/pages/screenshots_category.tpl
new file mode 100644
index 0000000..1539c0c
--- /dev/null
+++ b/templates/pages/screenshots_category.tpl
@@ -0,0 +1,55 @@
+{* List all screenshots for an entry. *}
+
+{* A single game (target) was selected. *}
+{if !empty($game)}
+	<div class="box">
+		<div class="head">{#screenshotsCategoryHeading#}</div>
+		<div class="content gallery">
+			{foreach from=$screenshots.games item=g name=cat_loop}
+				{if $game == $g->getCategory()}
+					<h3 class="subhead">{$g->getName()}</h3>
+					{foreach from=$g->getFiles() item=fdata name=game_loop}
+						<div class="screenshot">
+							<a href="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}-full.png" title="{$fdata.caption}">
+								<img src="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}.jpg" alt="{$g->getName()} screenshot #{$smarty.foreach.cat_loop.iteration}">
+							</a>
+							<div class="caption">{$fdata.caption}</div>
+						</div>
+					{/foreach}
+				{/if}
+			{/foreach}
+		</div>
+	</div>
+	<a href="/screenshots/{$category}/">{#screenshotsCategoryBack#}</a>
+
+{else}
+
+	{* No game selected, but the complete category. *}
+	<div class="box">
+		<div class="head">{#screenshotsCategoryHeading#}</div>
+		<div class="content">
+		{foreach from=$screenshots.games item=g name=cat_loop}
+			<div class="gallery">
+				<h3 class="subhead"><a href="/screenshots/{$category}/{$g->getCategory()}/">{$g->getName()}</a></h3>
+				{foreach from=$g->getFiles() item=fdata name=game_loop}
+					<div class="screenshot">
+						<a href="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}-full.png" title="{$fdata.caption}">
+							<img src="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}.jpg" alt="{$g->getName()} screenshot #{$smarty.foreach.cat_loop.iteration}">
+						</a>
+						<div class="caption">{$fdata.caption}</div>
+					</div>
+				{/foreach}
+			</div>
+		{/foreach}
+		</div>
+	</div>
+	<a href="/screenshots/">{#screenshotsCategoryBack#}</a>
+{/if}
+
+{literal}
+<script>
+	document.addEventListener('DOMContentLoaded', function() {
+		baguetteBox.run('.gallery');
+	});
+</script>
+{/literal}
diff --git a/templates/pages/subprojects.tpl b/templates/pages/subprojects.tpl
new file mode 100644
index 0000000..3c2a987
--- /dev/null
+++ b/templates/pages/subprojects.tpl
@@ -0,0 +1,20 @@
+<div class="box">
+	<div class="intro">
+		<p>
+			{#subprojectsIntroP1#}
+		</p>
+		<p>
+			{#subprojectsIntroP2#}
+		</p>
+	</div>
+
+	<div class="content">
+		{foreach from=$subprojects item=project}
+		{include file='subhead.tpl' subhead=$project->getName()}
+		<div class="subhead-content">
+			{$project->getInfo()}
+			{include file='list_items.tpl' list=$project->getDownloads() type='platforms'}
+		</div>
+		{/foreach}
+	</div>
+</div>
diff --git a/templates/press.tpl b/templates/press.tpl
deleted file mode 100644
index 5194b72..0000000
--- a/templates/press.tpl
+++ /dev/null
@@ -1,15 +0,0 @@
-<div class="box">
-	<div class="head">{#pressHeading#}</div>
-	<div class="content">
-		<small>{#pressIntro#}</small>
-		{foreach from=$articles item=article}
-		<p>
-			{if $article->getLanguage() != null}
-				<a href="{$article->getURL()}"><b>{$article->getName()}</b></a> ({$article->getLanguage()}), {$article->getPosted()}
-			{else}
-				<a href="{$article->getURL()}"><b>{$article->getName()}</b></a>, {$article->getPosted()}
-			{/if}
-		</p>
-		{/foreach}
-	</div>
-</div>
diff --git a/templates/press_snowberry.tpl b/templates/press_snowberry.tpl
deleted file mode 100644
index 6d51962..0000000
--- a/templates/press_snowberry.tpl
+++ /dev/null
@@ -1,67 +0,0 @@
-<div class="par-item">
-	<div class="par-head"></div>
-	<div class="par-content">
-
-<p>June 24, 2009</p>
-
-<p>
-Wonderful news for all the fans of classical adventure games: Snowberry Connection and Société Pollene announce that the first three games in the legendary Goblins series are now available to every customer of Gobliiins 4 as a free bonus (only via digital distribution channels: Gamersgate and Impulse).
-</p>
-
-<p>
-Playing these games on modern operating systems is made possible by the ScummVM program — the easiest way to enjoy the greatest adventure hits of the past.
-</p>
-
-<p>
-Alexander Souslov (Snowberry Connection):
-"Thanks to ScummVM, thousands of gamers around the world can enjoy the good old Goblins without any compatibility problems and headache"
-</p>
-
-<p>
-Max Horn (ScummVM):
-"Playing the Gobliiins games has been fun over a decade ago, and stil is. ScummVM allows you to enjoy them (and other classics) again on modern hardware, like your smartphone — if you are lucky enough to own them. That's why we at ScummVM are excited to see these gems being
-re-released to the public, together with the latest installment of this wonderful series. Thanks, Snowberry!"
-</p>
-
-<h4>About ScummVM</h4>
-
-<p>
-ScummVM is a program which allows you to run certain classic graphical point-and-click adventure games, provided you already have their data files. The clever part about this: ScummVM just replaces the executables shipped with the games, allowing you to play them on systems for which they were never designed!
-</p>
-
-<p>
-More information is available here: <a href="/">http://www.scummvm.org/</a>
-</p>
-
-<h4>About Gobliiins 4</h4>
-
-<p>
-Designer: Pierre Gilhodes<br>
-Developer: Société Pollene<br>
-Int'l publisher: Snowberry Connection<br>
-Genre: Quest<br>
-Release: Spring 2009<br>
-Languages: English, French, Italian, German, Spanish,
-Russian, Polish, Czech, Hungarian<br>
-Official site: <a href="http://www.goblins4.ru/">http://www.goblins4.ru/</a><br>
-Format: DVD-ROM (PC Windows)<br>
-Also available via digital distribution systems: Impulse and Gamersgate
-</p>
-
-<p>
-Designed by original Gobliiins co-creator Pierre Gilhodes and developed by Societe Pollene, Gobliiins 4 brings back the beloved three original main characters in a zany adventure you won't be able to put down. Gobliiins 4 blends elements of adventure and puzzle gaming: the player must find a solution to each level in order to progress to the next. The race through this colorful adventure-land spans more than 30 hours, including a secret bonus level.
-</p>
-
-<h4>About Gobliiins</h4>
-
-<p>
-Characters & universe originally created by Muriel Tramis and Pierre Gilhodes. Gobliiins 4 designed by Pierre Gilhodes, developed by Société Pollene. © by Société Pollene & Snowberry Connection LRM Inc. Original music: Didier Sallustro. All rights reserved. To find more about Gobliiins and its creators, visit official websites at <a href="http://www.goblins4.com">www.goblins4.com</a> and <a href="http://www.goblins4.ru">www.goblins4.ru</a>.
-</p>
-
-<p>
-<font size=-2>Snowberry press release <a href="http://news.snowball.ru/?id=1684">in Russian</a>.</font>
-</p>
-
-	</div>
-
-</div>
diff --git a/templates/screenshots.tpl b/templates/screenshots.tpl
deleted file mode 100644
index 34ddd92..0000000
--- a/templates/screenshots.tpl
+++ /dev/null
@@ -1,48 +0,0 @@
-{* Random screenshot. *}
-{assign var='rand_files' value=$random_shot.screenshot->getFiles()}
-{assign var='rand_max' value=$rand_files|@count}
-{assign var='rand_pos' value=0|rand:$rand_max-1}
-{assign var='rand_file' value=$rand_files[$rand_pos]}
-
-{* List the available categories. *}
-<div class="box">
-	<div class="head">{#screenshotsHeading#}</div>
-	<div class="intro row">
-		<div class="navigation col-1-2">
-			<h4>{#screenshotsNavigation#}</h4>
-			<ul>
-			{foreach from=$screenshots item=arr}
-				<li><a href="/screenshots/#{$arr.category}">{eval var=$arr.title}</a></li>
-			{/foreach}
-			</ul>
-		</div>
-		<div class="text col-1-2">
-			<div class="round-box">
-				<div class="round-box-content gallery bg-yellow">
-					<a href="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" title="{$rand_file.caption}">
-						<img class="random-screenshot" src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" alt="{$rand_file.caption}">
-					</a>
-				</div>
-			</div>
-		</div>
-	</div>
-
-	<div class="content">
-		{foreach from=$screenshots item=arr}
-		<div class="subhead" id="{$arr.category}">
-			<a href="/screenshots/{$arr.category}/">{$arr.title}</a>
-		</div>
-		<div class="scr-content scr-content-{$arr.category}">
-      {include file='list_items.tpl' list=$arr.games type='games'}
-		</div>
-		{/foreach}
-	</div>
-</div>
-
-{literal}
-<script>
-	window.addEventListener('DOMContentLoaded', function() {
-		baguetteBox.run('.gallery');
-	});
-</script>
-{/literal}
diff --git a/templates/screenshots_category.tpl b/templates/screenshots_category.tpl
deleted file mode 100644
index 1539c0c..0000000
--- a/templates/screenshots_category.tpl
+++ /dev/null
@@ -1,55 +0,0 @@
-{* List all screenshots for an entry. *}
-
-{* A single game (target) was selected. *}
-{if !empty($game)}
-	<div class="box">
-		<div class="head">{#screenshotsCategoryHeading#}</div>
-		<div class="content gallery">
-			{foreach from=$screenshots.games item=g name=cat_loop}
-				{if $game == $g->getCategory()}
-					<h3 class="subhead">{$g->getName()}</h3>
-					{foreach from=$g->getFiles() item=fdata name=game_loop}
-						<div class="screenshot">
-							<a href="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}-full.png" title="{$fdata.caption}">
-								<img src="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}.jpg" alt="{$g->getName()} screenshot #{$smarty.foreach.cat_loop.iteration}">
-							</a>
-							<div class="caption">{$fdata.caption}</div>
-						</div>
-					{/foreach}
-				{/if}
-			{/foreach}
-		</div>
-	</div>
-	<a href="/screenshots/{$category}/">{#screenshotsCategoryBack#}</a>
-
-{else}
-
-	{* No game selected, but the complete category. *}
-	<div class="box">
-		<div class="head">{#screenshotsCategoryHeading#}</div>
-		<div class="content">
-		{foreach from=$screenshots.games item=g name=cat_loop}
-			<div class="gallery">
-				<h3 class="subhead"><a href="/screenshots/{$category}/{$g->getCategory()}/">{$g->getName()}</a></h3>
-				{foreach from=$g->getFiles() item=fdata name=game_loop}
-					<div class="screenshot">
-						<a href="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}-full.png" title="{$fdata.caption}">
-							<img src="{$smarty.const.DIR_SCREENSHOTS}/{$fdata.filename}.jpg" alt="{$g->getName()} screenshot #{$smarty.foreach.cat_loop.iteration}">
-						</a>
-						<div class="caption">{$fdata.caption}</div>
-					</div>
-				{/foreach}
-			</div>
-		{/foreach}
-		</div>
-	</div>
-	<a href="/screenshots/">{#screenshotsCategoryBack#}</a>
-{/if}
-
-{literal}
-<script>
-	document.addEventListener('DOMContentLoaded', function() {
-		baguetteBox.run('.gallery');
-	});
-</script>
-{/literal}
diff --git a/templates/subhead.tpl b/templates/subhead.tpl
deleted file mode 100644
index 19eab35..0000000
--- a/templates/subhead.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<div class="subhead">{$subhead}</div>
-{*
-<div class="par-subhead">
-	{$subhead}
-</div>
-<div class="par-subhead-dots">
-	 
-</div>
-*}
diff --git a/templates/subprojects.tpl b/templates/subprojects.tpl
deleted file mode 100644
index 3c2a987..0000000
--- a/templates/subprojects.tpl
+++ /dev/null
@@ -1,20 +0,0 @@
-<div class="box">
-	<div class="intro">
-		<p>
-			{#subprojectsIntroP1#}
-		</p>
-		<p>
-			{#subprojectsIntroP2#}
-		</p>
-	</div>
-
-	<div class="content">
-		{foreach from=$subprojects item=project}
-		{include file='subhead.tpl' subhead=$project->getName()}
-		<div class="subhead-content">
-			{$project->getInfo()}
-			{include file='list_items.tpl' list=$project->getDownloads() type='platforms'}
-		</div>
-		{/foreach}
-	</div>
-</div>


Commit: f3cbfb6b5c70f53525a694b3c3763d1ce5f738de
    https://github.com/scummvm/scummvm-web/commit/f3cbfb6b5c70f53525a694b3c3763d1ce5f738de
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Prevent access to node related files

Changed paths:
    .htaccess


diff --git a/.htaccess b/.htaccess
index 776ace4..3aca5ba 100644
--- a/.htaccess
+++ b/.htaccess
@@ -139,5 +139,10 @@ RewriteRule		^(screenshots)(/([a-z]+)(/([-_a-z0-9]+)(/([0-9]+))?)?)?/?		?p=$1&ca
 
 ##
 # Composer
-#
+##
 RewriteRule ^(vendor/|composer\.json|composer\.lock) - [F,L,NC]
+
+##
+# node
+##
+RewriteRule ^(node_modules/|package\.json|package-lock\.json) - [F,L,NC]


Commit: f0be08f8dc0cf5164669c07dab9542e0572feca6
    https://github.com/scummvm/scummvm-web/commit/f0be08f8dc0cf5164669c07dab9542e0572feca6
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: update templates includes to use the new folder structure

Changed paths:
  A templates/components/intro_header.tpl
  A templates/components/list_items.tpl
  A templates/pages/index.tpl
  R templates/index.tpl
  R templates/intro_header.tpl
  R templates/list_items.tpl
    include/Controller.php
    templates/layout/menu.tpl
    templates/pages/contact.tpl
    templates/pages/credits.tpl
    templates/pages/downloads.tpl
    templates/pages/games.tpl
    templates/pages/links.tpl
    templates/pages/screenshots.tpl
    templates/pages/subprojects.tpl


diff --git a/include/Controller.php b/include/Controller.php
index b9defdf..48e8cd7 100644
--- a/include/Controller.php
+++ b/include/Controller.php
@@ -133,7 +133,7 @@ class Controller {
 			'content' => $content,
 		);
 		$this->_smarty->assign($vars);
-		return $this->_smarty->display('index.tpl');
+		return $this->_smarty->display('pages/index.tpl');
 	}
 
 	/* Render the HTML using the template and any set variables and returns it. */
diff --git a/templates/components/intro_header.tpl b/templates/components/intro_header.tpl
new file mode 100644
index 0000000..0aa195e
--- /dev/null
+++ b/templates/components/intro_header.tpl
@@ -0,0 +1,63 @@
+{* Random screenshot. *}
+{assign var='rand_files' value=$random_shot.screenshot->getFiles()}
+{assign var='rand_max' value=$rand_files|@count}
+{assign var='rand_pos' value=0|rand:$rand_max-1}
+{assign var='rand_file' value=$rand_files[$rand_pos]}
+
+{* Introduction header, included from index.tpl *}
+<div id="intro_header">
+	{* Introduction text. *}
+	<div class="round-box">
+		<div class="round-box-header">
+			{#introHeaderWhatIs#}
+		</div>
+		<div class="round-box-content text row">
+			<div class="col-2-3 col-md-1">
+				<p>{#introHeaderContentP1#}</p>
+				<p>{#introHeaderContentP2#}</p>
+				<p>{#introHeaderContentP3#}</p>
+				<p>{#introHeaderContentP4#}</p>
+				<form class="float_right" id="donate-header" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
+					<input type="hidden" name="cmd" value="_s-xclick">
+					<input type="hidden" name="hosted_button_id" value="U6E6SLL7E8MAS">
+					<input type="image" src="/images/ppdonate.png" style="width: 63px; height: 25px; border: 0 none;" align="right" name="submit" alt="{#indexSupport#}">
+					<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
+				</form>
+				<p>{#introHeaderContentP5#}</p>
+			</div>
+			<div class="col-1-3 col-md-1">
+			<div class="round-box">
+				<div class="round-box-content gallery bg-yellow">
+					<a href="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" title="{$rand_file.caption}">
+						<img class="random-screenshot" src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" alt="{$rand_file.caption}">
+					</a>
+				</div>
+			</div>
+			</div>
+
+		</div>
+	</div>
+
+	{* Screenshots.
+	<div class="sshots">
+		<div class="round-box">
+			<div class="round-box-header">
+				{#introHeaderScreenshots#}
+			</div>
+			<div class="round-box-content">
+				<a href="/screenshots/{$random_shot.category}/{$random_shot.screenshot->getCategory()}/{$rand_pos+1}" id="screenshots_random">
+					<img src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}.jpg" width="128" height="96" title="{#introHeaderFullsize#}" alt="{#introHeaderRandom#}">
+				</a>
+			</div>
+		</div>
+	</div>
+	 *}
+</div>
+
+{literal}
+<script>
+	window.addEventListener('DOMContentLoaded', function() {
+		baguetteBox.run('.gallery');
+	});
+</script>
+{/literal}
diff --git a/templates/components/list_items.tpl b/templates/components/list_items.tpl
new file mode 100644
index 0000000..0bd36a1
--- /dev/null
+++ b/templates/components/list_items.tpl
@@ -0,0 +1,46 @@
+{if is_array($list) && $list|@count > 0}
+	<ul class="downloads">  
+  {foreach from=$list item=item}  
+    {if $item instanceof File}        
+			{assign var='data' value=$item->getExtraInfo()}
+			<li class="file">
+				<span class="sprite-{$type}-{$item->getCategoryIcon()} sprite"></span>
+				<a href="{eval var=$item->getURL()}">{$item->getName()}</a>
+				{strip}
+				<span class="download-extras">
+					{if is_array($data)}
+						(
+							{if $item->getType() == 'daily'}{#listItemsBuildFromRepo#} {/if}
+							{$data.size} {if $data.ext == '.exe'}Win32 {/if}{$data.ext}{if $data.date != ""}{#listItemsDate#} {$data.date}{/if}
+						)  {if $data.msg != ""}{$data.msg}{/if}
+					{else}
+						{if $item->getType() != 'daily'}
+							{eval var=$data|default:' '}
+						{/if}
+					{/if}
+				</span>
+				{if $item->getType() == 'daily'}
+					<span class="daily_provider">
+						{if is_array($data)}
+							{$data.info}
+						{else}
+							{$data}
+						{/if}
+					</span>
+				{/if}
+				{/strip}
+			</li>
+		{elseif $item instanceof WebLink}
+			<li class="link">
+				<a href="{$item->getURL()}">{$item->getName()}</a>{$item->getDescription()}
+      </li>
+    {elseif $item instanceof Screenshot}
+      <li class="file">
+        <span class="sprite-games-{$item->getCategory()} sprite"></span>
+				<a href="/screenshots/{$arr.category}/{$item->getCategory()}/">{$item->getName()}</a>
+        <span class="green">({$item->getFiles()|@count} shots)</span>
+      </li>
+    {/if}
+	{/foreach}
+	</ul>
+{/if}
diff --git a/templates/index.tpl b/templates/index.tpl
deleted file mode 100644
index 7635735..0000000
--- a/templates/index.tpl
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-	<meta name="viewport" content="width=device-width, initial-scale=1">
-	<base href="{$baseurl}">
-	<link rel="stylesheet" href="{$baseurl}css/main.css">	
-	{* Page specific, or other extra CSS rules. *}
-	{foreach from=$css_files item=filename}
-	<link rel="stylesheet" href="{$baseurl}css/{$filename}">
-	{/foreach}
-	<link rel="alternate" type="application/atom+xml" title="{#indexAtomFeed#}" href="{$baseurl}feeds/atom/">
-	<link rel="alternate" type="application/rss+xml" title="{#indexRSSFeed#}" href="{$baseurl}feeds/rss/">
-	<link rel="apple-touch-icon" href="/images/scummvm.png">
-	<title>ScummVM :: {$title}</title>
-</head>
-<body>
-	<input type="checkbox" autocomplete="off" id="nav-trigger" class="nav-trigger" />
-	<label for="nav-trigger"></label>
-
-	<div class="site-wrap">
-		{* Header. *}
-		<header>
-			<div class="row hide-small">
-				<div class="col-1-1 top">
-					<img class="header-image" src="/images/heroes{$heroes_num|rand:0}.png" alt="{#indexCharacters#}">
-				</div>
-			</div>
-			<div class="row topper">
-				<div class="col-1-2">
-					<img class="logo maniac hide-small" src="/images/maniac-half.png" alt="Maniac Mansion kids">
-					<a href="{$baseurl}"><img class="logo" src="/images/scummvm_logo.png" alt="{#indexLogo#}"></a>
-				</div>
-				<div class="col-1-2 hide-small float_right">
-					<span class="scummvm float_right">Script Creation Utility for Maniac Mansion Virtual Machine</span>
-				</div>
-			</div>
-		</header>
-
-		{* Content *}
-		<div class="container row">
-			<div class="col-4-5">
-                <div class="content">
-					{* Introduction text and screenshot viewer. *}
-					{if isset($show_intro) && $show_intro}
-						{include file='intro_header.tpl'}
-					{/if}
-
-					{* The actual content. *}
-					<div class="round-box">
-						<div class="round-box-header">
-							{$content_title}
-						</div>
-						<div class="round-box-content">
-							{$content}
-						</div>
-
-						{include file='components/banners.tpl'}
-					</div>
-				</div>
-			</div>
-
-			{* Menu. *}
-			<div class="col-1-5">
-				<nav>
-					{foreach from=$menus item=menu}
-						{include file='components/menu_group.tpl' menu=$menu}
-					{/foreach}
-
-					{include file='components/lang_menu.tpl'}
-				</nav>
-
-				<div class="monkey hide-small">
-					<img src="/images/hangmonk.gif" alt="monkey" width="55" height="57" class="float_right">
-					{include file='components/banners.tpl'}
-				</div>
-			</div>
-		</div>
-		<footer class="row">
-			<div class="col-4-5">
-				{#indexLegal#}
-			</div>
-			<div class="col-1-5 hide-small">
-				<div class="tentacle">
-					<img src="/images/tentacle.svg" alt="Tentacle">
-				</div>
-			</div>
-		</footer>
-	</div>
-
-{foreach from=$js_files item=script}
-	<script src="/javascripts/{$script}"></script>
-{/foreach}
-{* Google analytics javascript. *}
-	<script src="https://www.google-analytics.com/urchin.js" type="text/javascript"></script>
-	<script type="text/javascript">
-		_uacct = "UA-1455743-1";
-		_udn = "scummvm.org";
-		urchinTracker();
-	</script>
-{* End Google analytics javascript. *}
-{literal}
-	<script>
-		document.querySelector('.nav-trigger').addEventListener('change', function() {
-			if (this.checked)
-				document.body.classList.add('no-scroll');
-			else
-				document.body.classList.remove('no-scroll');
-		});
-	</script>
-{/literal}
-</body>
-</html>
diff --git a/templates/intro_header.tpl b/templates/intro_header.tpl
deleted file mode 100644
index 0aa195e..0000000
--- a/templates/intro_header.tpl
+++ /dev/null
@@ -1,63 +0,0 @@
-{* Random screenshot. *}
-{assign var='rand_files' value=$random_shot.screenshot->getFiles()}
-{assign var='rand_max' value=$rand_files|@count}
-{assign var='rand_pos' value=0|rand:$rand_max-1}
-{assign var='rand_file' value=$rand_files[$rand_pos]}
-
-{* Introduction header, included from index.tpl *}
-<div id="intro_header">
-	{* Introduction text. *}
-	<div class="round-box">
-		<div class="round-box-header">
-			{#introHeaderWhatIs#}
-		</div>
-		<div class="round-box-content text row">
-			<div class="col-2-3 col-md-1">
-				<p>{#introHeaderContentP1#}</p>
-				<p>{#introHeaderContentP2#}</p>
-				<p>{#introHeaderContentP3#}</p>
-				<p>{#introHeaderContentP4#}</p>
-				<form class="float_right" id="donate-header" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
-					<input type="hidden" name="cmd" value="_s-xclick">
-					<input type="hidden" name="hosted_button_id" value="U6E6SLL7E8MAS">
-					<input type="image" src="/images/ppdonate.png" style="width: 63px; height: 25px; border: 0 none;" align="right" name="submit" alt="{#indexSupport#}">
-					<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
-				</form>
-				<p>{#introHeaderContentP5#}</p>
-			</div>
-			<div class="col-1-3 col-md-1">
-			<div class="round-box">
-				<div class="round-box-content gallery bg-yellow">
-					<a href="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" title="{$rand_file.caption}">
-						<img class="random-screenshot" src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}-full.png" alt="{$rand_file.caption}">
-					</a>
-				</div>
-			</div>
-			</div>
-
-		</div>
-	</div>
-
-	{* Screenshots.
-	<div class="sshots">
-		<div class="round-box">
-			<div class="round-box-header">
-				{#introHeaderScreenshots#}
-			</div>
-			<div class="round-box-content">
-				<a href="/screenshots/{$random_shot.category}/{$random_shot.screenshot->getCategory()}/{$rand_pos+1}" id="screenshots_random">
-					<img src="{$smarty.const.DIR_SCREENSHOTS}/{$rand_file.filename}.jpg" width="128" height="96" title="{#introHeaderFullsize#}" alt="{#introHeaderRandom#}">
-				</a>
-			</div>
-		</div>
-	</div>
-	 *}
-</div>
-
-{literal}
-<script>
-	window.addEventListener('DOMContentLoaded', function() {
-		baguetteBox.run('.gallery');
-	});
-</script>
-{/literal}
diff --git a/templates/layout/menu.tpl b/templates/layout/menu.tpl
index b27187c..b2a26f3 100644
--- a/templates/layout/menu.tpl
+++ b/templates/layout/menu.tpl
@@ -1,12 +1,12 @@
 <nav>
   {foreach from=$menus item=menu}
-    {include file='menu_group.tpl' menu=$menu}
+    {include file='components/menu_group.tpl' menu=$menu}
   {/foreach}
 
-  {include file='lang_menu.tpl'}
+  {include file=components/'lang_menu.tpl'}
 </nav>
 
 <div class="monkey hide-small">
   <img src="/images/hangmonk.gif" alt="monkey" width="55" height="57" class="float_right">
-  {include file='banners.tpl'}
+  {include file='components/banners.tpl'}
 </div>
diff --git a/templates/list_items.tpl b/templates/list_items.tpl
deleted file mode 100644
index 0bd36a1..0000000
--- a/templates/list_items.tpl
+++ /dev/null
@@ -1,46 +0,0 @@
-{if is_array($list) && $list|@count > 0}
-	<ul class="downloads">  
-  {foreach from=$list item=item}  
-    {if $item instanceof File}        
-			{assign var='data' value=$item->getExtraInfo()}
-			<li class="file">
-				<span class="sprite-{$type}-{$item->getCategoryIcon()} sprite"></span>
-				<a href="{eval var=$item->getURL()}">{$item->getName()}</a>
-				{strip}
-				<span class="download-extras">
-					{if is_array($data)}
-						(
-							{if $item->getType() == 'daily'}{#listItemsBuildFromRepo#} {/if}
-							{$data.size} {if $data.ext == '.exe'}Win32 {/if}{$data.ext}{if $data.date != ""}{#listItemsDate#} {$data.date}{/if}
-						)  {if $data.msg != ""}{$data.msg}{/if}
-					{else}
-						{if $item->getType() != 'daily'}
-							{eval var=$data|default:' '}
-						{/if}
-					{/if}
-				</span>
-				{if $item->getType() == 'daily'}
-					<span class="daily_provider">
-						{if is_array($data)}
-							{$data.info}
-						{else}
-							{$data}
-						{/if}
-					</span>
-				{/if}
-				{/strip}
-			</li>
-		{elseif $item instanceof WebLink}
-			<li class="link">
-				<a href="{$item->getURL()}">{$item->getName()}</a>{$item->getDescription()}
-      </li>
-    {elseif $item instanceof Screenshot}
-      <li class="file">
-        <span class="sprite-games-{$item->getCategory()} sprite"></span>
-				<a href="/screenshots/{$arr.category}/{$item->getCategory()}/">{$item->getName()}</a>
-        <span class="green">({$item->getFiles()|@count} shots)</span>
-      </li>
-    {/if}
-	{/foreach}
-	</ul>
-{/if}
diff --git a/templates/pages/contact.tpl b/templates/pages/contact.tpl
index 4aad3d4..680a206 100644
--- a/templates/pages/contact.tpl
+++ b/templates/pages/contact.tpl
@@ -4,22 +4,22 @@
 	</div>
 
 	<div class="content">
-		{include file='subhead.tpl' subhead=#contactIRCHeader#}
+		{include file='components/subhead.tpl' subhead=#contactIRCHeader#}
 		<div class="subhead-content">
 			{#contactIRC#}
 		</div>
 
-		{include file='subhead.tpl' subhead=#contactForumsHeader#}
+		{include file='components/subhead.tpl' subhead=#contactForumsHeader#}
 		<div class="subhead-content">
 			{#contactForums#}
 		</div>
 
-		{include file='subhead.tpl' subhead=#contactTrackersHeader#}
+		{include file='components/subhead.tpl' subhead=#contactTrackersHeader#}
 		<div class="subhead-content">
 			{#contactTrackers#}
 		</div>
 
-		{include file='subhead.tpl' subhead=#contactListsHeader#}
+		{include file='components/subhead.tpl' subhead=#contactListsHeader#}
 		<div class="subhead-content">
 			{#contactLists#}
 		</div>
diff --git a/templates/pages/credits.tpl b/templates/pages/credits.tpl
index 184694e..08708c1 100644
--- a/templates/pages/credits.tpl
+++ b/templates/pages/credits.tpl
@@ -7,7 +7,7 @@
 				<div class="subhead">{$subcsection->getTitle()}</div>
 				<div class="subhead-content">
 					{include
-						file='credits_entry.tpl'
+						file='components/credits_entry.tpl'
 						groups=$subcsection->getGroups()
 						paragraphs=$subcsection->getParagraphs()
 					}
@@ -15,12 +15,12 @@
 			{/foreach}
 			{* If the section itself has paragraphs, we must process them here. *}
 			{include
-				file='credits_entry.tpl'
+				file='components/credits_entry.tpl'
 				paragraphs=$csection->getParagraphs()
 			}
 		{else}
 			{include
-				file='credits_entry.tpl'
+				file='components/credits_entry.tpl'
 				groups=$csection->getGroups()
 				paragraphs=$csection->getParagraphs()
 			}
diff --git a/templates/pages/downloads.tpl b/templates/pages/downloads.tpl
index 396638b..3a8d1e4 100644
--- a/templates/pages/downloads.tpl
+++ b/templates/pages/downloads.tpl
@@ -53,7 +53,7 @@
 	{/if}
 
 		<div class="subhead-content">
-			{if $dsubsection->getNotes() != ''} {eval var=$dsubsection->getNotes()} {/if} {include file='list_items.tpl' list=$dsubsection->getItems() type='platforms'}
+			{if $dsubsection->getNotes() != ''} {eval var=$dsubsection->getNotes()} {/if} {include file='components/list_items.tpl' list=$dsubsection->getItems() type='platforms'}
 			{if !is_null($dsubsection->getFooter())}
 			<p>{$dsubsection->getFooter()}</p>
 			{/if}
diff --git a/templates/pages/games.tpl b/templates/pages/games.tpl
index 95a5d3c..75a95de 100644
--- a/templates/pages/games.tpl
+++ b/templates/pages/games.tpl
@@ -34,7 +34,7 @@
 					{eval var=$dsubsection->getNotes()}
 				{/if}
 
-				{include file='list_items.tpl' list=$dsubsection->getItems() type='games'}
+				{include file='components/list_items.tpl' list=$dsubsection->getItems() type='games'}
 				{if !is_null($dsubsection->getFooter())}
 					<p>{$dsubsection->getFooter()}</p>
 				{/if}
diff --git a/templates/pages/index.tpl b/templates/pages/index.tpl
new file mode 100644
index 0000000..dfaa60f
--- /dev/null
+++ b/templates/pages/index.tpl
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<base href="{$baseurl}">
+	<link rel="stylesheet" href="{$baseurl}css/main.css">	
+	{* Page specific, or other extra CSS rules. *}
+	{foreach from=$css_files item=filename}
+	<link rel="stylesheet" href="{$baseurl}css/{$filename}">
+	{/foreach}
+	<link rel="alternate" type="application/atom+xml" title="{#indexAtomFeed#}" href="{$baseurl}feeds/atom/">
+	<link rel="alternate" type="application/rss+xml" title="{#indexRSSFeed#}" href="{$baseurl}feeds/rss/">
+	<link rel="apple-touch-icon" href="/images/scummvm.png">
+	<title>ScummVM :: {$title}</title>
+</head>
+<body>
+	<input type="checkbox" autocomplete="off" id="nav-trigger" class="nav-trigger" />
+	<label for="nav-trigger"></label>
+
+	<div class="site-wrap">
+		{* Header. *}
+		<header>
+			<div class="row hide-small">
+				<div class="col-1-1 top">
+					<img class="header-image" src="/images/heroes{$heroes_num|rand:0}.png" alt="{#indexCharacters#}">
+				</div>
+			</div>
+			<div class="row topper">
+				<div class="col-1-2">
+					<img class="logo maniac hide-small" src="/images/maniac-half.png" alt="Maniac Mansion kids">
+					<a href="{$baseurl}"><img class="logo" src="/images/scummvm_logo.png" alt="{#indexLogo#}"></a>
+				</div>
+				<div class="col-1-2 hide-small float_right">
+					<span class="scummvm float_right">Script Creation Utility for Maniac Mansion Virtual Machine</span>
+				</div>
+			</div>
+		</header>
+
+		{* Content *}
+		<div class="container row">
+			<div class="col-4-5">
+                <div class="content">
+					{* Introduction text and screenshot viewer. *}
+					{if isset($show_intro) && $show_intro}
+						{include file='components/intro_header.tpl'}
+					{/if}
+
+					{* The actual content. *}
+					<div class="round-box">
+						<div class="round-box-header">
+							{$content_title}
+						</div>
+						<div class="round-box-content">
+							{$content}
+						</div>
+
+						{include file='components/banners.tpl'}
+					</div>
+				</div>
+			</div>
+
+			{* Menu. *}
+			<div class="col-1-5">
+				<nav>
+					{foreach from=$menus item=menu}
+						{include file='components/menu_group.tpl' menu=$menu}
+					{/foreach}
+
+					{include file='components/lang_menu.tpl'}
+				</nav>
+
+				<div class="monkey hide-small">
+					<img src="/images/hangmonk.gif" alt="monkey" width="55" height="57" class="float_right">
+					{include file='components/banners.tpl'}
+				</div>
+			</div>
+		</div>
+		<footer class="row">
+			<div class="col-4-5">
+				{#indexLegal#}
+			</div>
+			<div class="col-1-5 hide-small">
+				<div class="tentacle">
+					<img src="/images/tentacle.svg" alt="Tentacle">
+				</div>
+			</div>
+		</footer>
+	</div>
+
+{foreach from=$js_files item=script}
+	<script src="/javascripts/{$script}"></script>
+{/foreach}
+{* Google analytics javascript. *}
+	<script src="https://www.google-analytics.com/urchin.js" type="text/javascript"></script>
+	<script type="text/javascript">
+		_uacct = "UA-1455743-1";
+		_udn = "scummvm.org";
+		urchinTracker();
+	</script>
+{* End Google analytics javascript. *}
+{literal}
+	<script>
+		document.querySelector('.nav-trigger').addEventListener('change', function() {
+			if (this.checked)
+				document.body.classList.add('no-scroll');
+			else
+				document.body.classList.remove('no-scroll');
+		});
+	</script>
+{/literal}
+</body>
+</html>
diff --git a/templates/pages/links.tpl b/templates/pages/links.tpl
index 119c334..ee7663c 100644
--- a/templates/pages/links.tpl
+++ b/templates/pages/links.tpl
@@ -8,7 +8,7 @@
 	</div>
 	<div class="content">
 		{foreach from=$links item=group}
-		{include file='subhead.tpl' subhead=$group.name}
+		{include file='components/subhead.tpl' subhead=$group.name}
 		<div class="subhead-content">
 			<p>{$group.description}</p>
 			<div class="linklist">
diff --git a/templates/pages/screenshots.tpl b/templates/pages/screenshots.tpl
index 34ddd92..c418481 100644
--- a/templates/pages/screenshots.tpl
+++ b/templates/pages/screenshots.tpl
@@ -33,7 +33,7 @@
 			<a href="/screenshots/{$arr.category}/">{$arr.title}</a>
 		</div>
 		<div class="scr-content scr-content-{$arr.category}">
-      {include file='list_items.tpl' list=$arr.games type='games'}
+      {include file='components/list_items.tpl' list=$arr.games type='games'}
 		</div>
 		{/foreach}
 	</div>
diff --git a/templates/pages/subprojects.tpl b/templates/pages/subprojects.tpl
index 3c2a987..c0623f1 100644
--- a/templates/pages/subprojects.tpl
+++ b/templates/pages/subprojects.tpl
@@ -10,10 +10,10 @@
 
 	<div class="content">
 		{foreach from=$subprojects item=project}
-		{include file='subhead.tpl' subhead=$project->getName()}
+		{include file='components/subhead.tpl' subhead=$project->getName()}
 		<div class="subhead-content">
 			{$project->getInfo()}
-			{include file='list_items.tpl' list=$project->getDownloads() type='platforms'}
+			{include file='components/list_items.tpl' list=$project->getDownloads() type='platforms'}
 		</div>
 		{/foreach}
 	</div>


Commit: ef0a23594be81b3c7e34fc23fe79519181c9aed8
    https://github.com/scummvm/scummvm-web/commit/ef0a23594be81b3c7e34fc23fe79519181c9aed8
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Fix feed templates

Changed paths:
    templates/pages/feed_atom.tpl
    templates/pages/feed_rss.tpl


diff --git a/templates/pages/feed_atom.tpl b/templates/pages/feed_atom.tpl
index a130b45..c253dd4 100644
--- a/templates/pages/feed_atom.tpl
+++ b/templates/pages/feed_atom.tpl
@@ -18,10 +18,11 @@
 		{assign var='timezone_offset' value=$n->getDate()|date_f:'Z'}
 		{assign var='updated' value=$n->getDate()-$timezone_offset}
 		{assign var='news_filename' value=$n->getFilename()|substr:'0':'-4'}
+    {assign var='link' value=$n->getLink()}
 
 		<entry xml:lang="en">
 			<id>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</id>
-			<link rel="alternate" href="{$news->getLink()}" />
+			<link rel="alternate" href="{$link}" />
 			<updated>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</updated>
 			<published>{$updated|date_f:'Y-m-d\Th:i:s\Z'}</published>
 			<title type="html">{$n->getTitle()}</title>
diff --git a/templates/pages/feed_rss.tpl b/templates/pages/feed_rss.tpl
index a32e11e..be4e329 100644
--- a/templates/pages/feed_rss.tpl
+++ b/templates/pages/feed_rss.tpl
@@ -16,7 +16,7 @@
 			<author>nospam at scummvm.org ({$n->getAuthor()})</author>
 			{/if}
 			<guid isPermaLink='true'>{$baseurl}news/archive/#{$n->getDate()|date_f:'Y-m-d'}{if $news_filename|strlen == 9}{$news_filename|substr:'-1'}{/if}</guid>
-			<link>{$news->getLink()}/</link>
+			<link>{$n->getLink()}/</link>
 		</item>
 		{/foreach}
 	</channel>


Commit: 8f4f769f9edcda30ec81b836b70280e5b68b29dd
    https://github.com/scummvm/scummvm-web/commit/8f4f769f9edcda30ec81b836b70280e5b68b29dd
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Update gitignore

Changed paths:
    .gitignore


diff --git a/.gitignore b/.gitignore
index b4f0242..05b0f3f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,16 +1,22 @@
-/include/smarty/template_c
-/vendor
-/templates_c
+# Platform specific files
 .DS_Store
+
+# Node
+/node_modules
+
+# Composer
+/vendor
+
+# CSS / SCSS
 /css
 .sass-cache/
 *.css.map
 *.sass.map
 *.scss.map
-/vendor
 /scss/sprites
+
+# Generated images
 /images/platforms.png
 /images/games.png
 /images/platforms at 2x.png
 /images/games at 2x.png
-/node_modules


Commit: 7809a83d5644e2e8b5009f3d24081dd52354c744
    https://github.com/scummvm/scummvm-web/commit/7809a83d5644e2e8b5009f3d24081dd52354c744
Author: Matan Bareket (mataniko at gmail.com)
Date: 2018-07-26T07:17:40-04:00

Commit Message:
WEB: Fix the snowberry PR page

Changed paths:
    include/Pages/PressSnowberryPage.php


diff --git a/include/Pages/PressSnowberryPage.php b/include/Pages/PressSnowberryPage.php
index be278a0..f7129fe 100644
--- a/include/Pages/PressSnowberryPage.php
+++ b/include/Pages/PressSnowberryPage.php
@@ -8,7 +8,7 @@ class PressSnowberryPage extends Controller {
 	/* Constructor. */
 	public function __construct() {
 		parent::__construct();
-		$this->_template = 'press_snowberry.tpl';
+		$this->_template = 'pages/press_snowberry.tpl';
 	}
 
 	/* Display the index page. */





More information about the Scummvm-git-logs mailing list