From 16b7404d9bc2f9ba264f140310948897689fe3ca Mon Sep 17 00:00:00 2001
From: goatchurch
Date: Sun, 28 Jun 2009 21:26:35 +0100
Subject: [PATCH] [svn] horrid .svns copied accidentally
---
media/CodeMirror-0.62/LICENSE | 23 +
media/CodeMirror-0.62/contrib/lua/LICENSE | 32 +
.../contrib/lua/css/luacolors.css | 59 +
media/CodeMirror-0.62/contrib/lua/index.html | 68 +
.../contrib/lua/js/parselua.js | 253 ++++
media/CodeMirror-0.62/contrib/php/LICENSE | 37 +
.../contrib/php/css/phpcolors.css | 110 ++
media/CodeMirror-0.62/contrib/php/index.html | 292 ++++
.../contrib/php/js/parsephp.js | 371 +++++
.../contrib/php/js/parsephphtmlmixed.js | 90 ++
.../contrib/php/js/tokenizephp.js | 1007 +++++++++++++
media/CodeMirror-0.62/contrib/python/LICENSE | 32 +
.../contrib/python/css/pythoncolors.css | 54 +
.../CodeMirror-0.62/contrib/python/index.html | 141 ++
.../contrib/python/js/parsepython.js | 544 +++++++
media/CodeMirror-0.62/css/csscolors.css | 47 +
media/CodeMirror-0.62/css/docs.css | 46 +
media/CodeMirror-0.62/css/jscolors.css | 55 +
media/CodeMirror-0.62/css/people.jpg | Bin 0 -> 14122 bytes
media/CodeMirror-0.62/css/sparqlcolors.css | 39 +
media/CodeMirror-0.62/css/survexcolors.css | 70 +
media/CodeMirror-0.62/css/xmlcolors.css | 51 +
media/CodeMirror-0.62/csstest.html | 60 +
media/CodeMirror-0.62/highlight.html | 82 ++
media/CodeMirror-0.62/js/codemirror.js | 298 ++++
media/CodeMirror-0.62/js/editor.js | 1303 +++++++++++++++++
media/CodeMirror-0.62/js/highlight.js | 68 +
media/CodeMirror-0.62/js/mirrorframe.js | 81 +
media/CodeMirror-0.62/js/parsecss.js | 155 ++
media/CodeMirror-0.62/js/parsedummy.js | 32 +
media/CodeMirror-0.62/js/parsehtmlmixed.js | 74 +
media/CodeMirror-0.62/js/parsejavascript.js | 341 +++++
media/CodeMirror-0.62/js/parsesparql.js | 162 ++
media/CodeMirror-0.62/js/parsesurvex.js | 107 ++
media/CodeMirror-0.62/js/parsexml.js | 292 ++++
media/CodeMirror-0.62/js/select.js | 583 ++++++++
media/CodeMirror-0.62/js/stringstream.js | 140 ++
media/CodeMirror-0.62/js/tokenize.js | 57 +
.../CodeMirror-0.62/js/tokenizejavascript.js | 175 +++
media/CodeMirror-0.62/js/undo.js | 403 +++++
media/CodeMirror-0.62/js/util.js | 115 ++
media/CodeMirror-0.62/jstest.html | 56 +
media/CodeMirror-0.62/mixedtest.html | 52 +
media/CodeMirror-0.62/sparqltest.html | 41 +
media/CodeMirror-0.62/story.html | 652 +++++++++
45 files changed, 8750 insertions(+)
create mode 100644 media/CodeMirror-0.62/LICENSE
create mode 100644 media/CodeMirror-0.62/contrib/lua/LICENSE
create mode 100644 media/CodeMirror-0.62/contrib/lua/css/luacolors.css
create mode 100644 media/CodeMirror-0.62/contrib/lua/index.html
create mode 100644 media/CodeMirror-0.62/contrib/lua/js/parselua.js
create mode 100644 media/CodeMirror-0.62/contrib/php/LICENSE
create mode 100644 media/CodeMirror-0.62/contrib/php/css/phpcolors.css
create mode 100644 media/CodeMirror-0.62/contrib/php/index.html
create mode 100644 media/CodeMirror-0.62/contrib/php/js/parsephp.js
create mode 100644 media/CodeMirror-0.62/contrib/php/js/parsephphtmlmixed.js
create mode 100644 media/CodeMirror-0.62/contrib/php/js/tokenizephp.js
create mode 100644 media/CodeMirror-0.62/contrib/python/LICENSE
create mode 100644 media/CodeMirror-0.62/contrib/python/css/pythoncolors.css
create mode 100644 media/CodeMirror-0.62/contrib/python/index.html
create mode 100644 media/CodeMirror-0.62/contrib/python/js/parsepython.js
create mode 100644 media/CodeMirror-0.62/css/csscolors.css
create mode 100644 media/CodeMirror-0.62/css/docs.css
create mode 100644 media/CodeMirror-0.62/css/jscolors.css
create mode 100644 media/CodeMirror-0.62/css/people.jpg
create mode 100644 media/CodeMirror-0.62/css/sparqlcolors.css
create mode 100644 media/CodeMirror-0.62/css/survexcolors.css
create mode 100644 media/CodeMirror-0.62/css/xmlcolors.css
create mode 100644 media/CodeMirror-0.62/csstest.html
create mode 100644 media/CodeMirror-0.62/highlight.html
create mode 100644 media/CodeMirror-0.62/js/codemirror.js
create mode 100644 media/CodeMirror-0.62/js/editor.js
create mode 100644 media/CodeMirror-0.62/js/highlight.js
create mode 100644 media/CodeMirror-0.62/js/mirrorframe.js
create mode 100644 media/CodeMirror-0.62/js/parsecss.js
create mode 100644 media/CodeMirror-0.62/js/parsedummy.js
create mode 100644 media/CodeMirror-0.62/js/parsehtmlmixed.js
create mode 100644 media/CodeMirror-0.62/js/parsejavascript.js
create mode 100644 media/CodeMirror-0.62/js/parsesparql.js
create mode 100644 media/CodeMirror-0.62/js/parsesurvex.js
create mode 100644 media/CodeMirror-0.62/js/parsexml.js
create mode 100644 media/CodeMirror-0.62/js/select.js
create mode 100644 media/CodeMirror-0.62/js/stringstream.js
create mode 100644 media/CodeMirror-0.62/js/tokenize.js
create mode 100644 media/CodeMirror-0.62/js/tokenizejavascript.js
create mode 100644 media/CodeMirror-0.62/js/undo.js
create mode 100644 media/CodeMirror-0.62/js/util.js
create mode 100644 media/CodeMirror-0.62/jstest.html
create mode 100644 media/CodeMirror-0.62/mixedtest.html
create mode 100644 media/CodeMirror-0.62/sparqltest.html
create mode 100644 media/CodeMirror-0.62/story.html
diff --git a/media/CodeMirror-0.62/LICENSE b/media/CodeMirror-0.62/LICENSE
new file mode 100644
index 0000000..44ceed6
--- /dev/null
+++ b/media/CodeMirror-0.62/LICENSE
@@ -0,0 +1,23 @@
+ Copyright (c) 2007-2009 Marijn Haverbeke
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any
+ damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it and
+ redistribute it freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source
+ distribution.
+
+ Marijn Haverbeke
+ marijnh at gmail
diff --git a/media/CodeMirror-0.62/contrib/lua/LICENSE b/media/CodeMirror-0.62/contrib/lua/LICENSE
new file mode 100644
index 0000000..1af1908
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/lua/LICENSE
@@ -0,0 +1,32 @@
+Copyright (c) 2009, Franciszek Wawrzak
+All rights reserved.
+
+This software is provided for use in connection with the
+CodeMirror suite of modules and utilities, hosted and maintained
+at http://marijn.haverbeke.nl/codemirror/.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/media/CodeMirror-0.62/contrib/lua/css/luacolors.css b/media/CodeMirror-0.62/contrib/lua/css/luacolors.css
new file mode 100644
index 0000000..6df44b5
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/lua/css/luacolors.css
@@ -0,0 +1,59 @@
+.editbox {
+ margin: .4em;
+ padding: 0;
+ font-family: monospace;
+ font-size: 10pt;
+ color: black;
+}
+
+pre.code, .editbox {
+ color: #666666;
+}
+
+.editbox p {
+ margin: 0;
+}
+
+span.lua-comment {
+ color: #BB9977;
+}
+
+span.lua-keyword {
+ font-weight: bold;
+ color: blue;
+}
+
+span.lua-string {
+ color: #AA2222;
+}
+
+span.lua-stdfunc {
+ font-weight: bold;
+ color: #077;
+}
+span.lua-customfunc {
+ font-weight: bold;
+ color: #0AA;
+}
+
+
+span.lua-identifier {
+ color: black;
+}
+
+span.lua-number {
+ color: #3A3;
+}
+
+span.lua-token {
+ color: #151;
+}
+
+span.lua-error {
+ color: #FFF;
+ background-color: #F00;
+}
+
+
+
+
diff --git a/media/CodeMirror-0.62/contrib/lua/index.html b/media/CodeMirror-0.62/contrib/lua/index.html
new file mode 100644
index 0000000..03a3229
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/lua/index.html
@@ -0,0 +1,68 @@
+
+
+
+ CodeMirror: Lua demonstration
+
+
+
+This page demonstrates CodeMirror 's
+Lua parser. Written by Franciszek
+Wawrzak , released under a BSD-style license .
+
+
+
+
+
+
+
+
diff --git a/media/CodeMirror-0.62/contrib/lua/js/parselua.js b/media/CodeMirror-0.62/contrib/lua/js/parselua.js
new file mode 100644
index 0000000..2bc891b
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/lua/js/parselua.js
@@ -0,0 +1,253 @@
+/*
+ Simple parser for LUA
+ Written for Lua 5.1, based on parsecss and other parsers.
+ features: highlights keywords, strings, comments (no leveling supported! ("[==[")),tokens, basic indenting
+
+ to make this parser highlight your special functions pass table with this functions names to parserConfig argument of creator,
+
+ parserConfig: ["myfunction1","myfunction2"],
+ */
+
+
+function findFirstRegexp(words) {
+ return new RegExp("^(?:" + words.join("|") + ")", "i");
+}
+
+function matchRegexp(words) {
+ return new RegExp("^(?:" + words.join("|") + ")$", "i");
+}
+
+
+
+var luaCustomFunctions= matchRegexp([]);
+
+function configureLUA(parserConfig){
+ if(parserConfig)
+ luaCustomFunctions= matchRegexp(parserConfig);
+}
+
+
+//long list of standard functions from lua manual
+var luaStdFunctions = matchRegexp([
+"_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load","loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require","select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall",
+
+"coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield",
+
+"debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable","debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable","debug.setupvalue","debug.traceback",
+
+"close","flush","lines","read","seek","setvbuf","write",
+
+"io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin","io.stdout","io.tmpfile","io.type","io.write",
+
+"math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg","math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max","math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh","math.sqrt","math.tan","math.tanh",
+
+"os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale","os.time","os.tmpname",
+
+"package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload","package.seeall",
+
+"string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub","string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper",
+
+"table.concat","table.insert","table.maxn","table.remove","table.sort"
+]);
+
+
+
+ var luaKeywords = matchRegexp(["and","break","elseif","false","nil","not","or","return",
+ "true","function", "end", "if", "then", "else", "do",
+ "while", "repeat", "until", "for", "in", "local" ]);
+
+ var luaIndentKeys = matchRegexp(["function", "if","repeat","for","while", "[\(]", "{"]);
+ var luaUnindentKeys = matchRegexp(["end", "until", "[\)]", "}"]);
+
+ var luaUnindentKeys2 = findFirstRegexp(["end", "until", "[\)]", "}"]);
+ var luaMiddleKeys = findFirstRegexp(["else","elseif"]);
+
+
+
+var LUAParser = Editor.Parser = (function() {
+ var tokenizeLUA = (function() {
+ function normal(source, setState) {
+ var ch = source.next();
+
+ if (ch == "-" && source.equals("-")) {
+ source.next();
+ setState(inSLComment);
+ return null;
+ }
+ else if (ch == "\"" || ch == "'") {
+ setState(inString(ch));
+ return null;
+ }
+ if (ch == "[" && (source.equals("[") || source.equals("="))) {
+ var level = 0;
+ while(source.equals("=")){
+ level ++;
+ source.next();
+ }
+ if(! source.equals("[") )
+ return "lua-error";
+ setState(inMLSomething(level,"lua-string"));
+ return null;
+ }
+
+ else if (ch == "=") {
+ if (source.equals("="))
+ source.next();
+ return "lua-token";
+ }
+
+ else if (ch == ".") {
+ if (source.equals("."))
+ source.next();
+ if (source.equals("."))
+ source.next();
+ return "lua-token";
+ }
+
+ else if (ch == "+" || ch == "-" || ch == "*" || ch == "/" || ch == "%" || ch == "^" || ch == "#" ) {
+ return "lua-token";
+ }
+ else if (ch == ">" || ch == "<" || ch == "(" || ch == ")" || ch == "{" || ch == "}" || ch == "[" ) {
+ return "lua-token";
+ }
+ else if (ch == "]" || ch == ";" || ch == ":" || ch == ",") {
+ return "lua-token";
+ }
+ else if (source.equals("=") && (ch == "~" || ch == "<" || ch == ">")) {
+ source.next();
+ return "lua-token";
+ }
+
+ else if (/\d/.test(ch)) {
+ source.nextWhileMatches(/[\w.%]/);
+ return "lua-number";
+ }
+ else {
+ source.nextWhileMatches(/[\w\\\-_.]/);
+ return "lua-identifier";
+ }
+ }
+
+function inSLComment(source, setState) {
+ var start = true;
+ var count=0;
+ while (!source.endOfLine()) {
+ var ch = source.next();
+ var level = 0;
+ if ((ch =="[") && start)
+ while(source.equals("=")){
+ source.next();
+ level++;
+ }
+ if (source.equals("[")){
+ setState(inMLSomething(level,"lua-comment"));
+ return null;
+ }
+ start = false;
+ }
+ setState(normal);
+ return "lua-comment";
+
+ }
+
+ function inMLSomething(level,what) {
+ //wat sholud be "lua-string" or "lua-comment", level is the number of "=" in opening mark.
+ return function(source, setState){
+ var dashes = 0;
+ while (!source.endOfLine()) {
+ var ch = source.next();
+ if (dashes == level+1 && ch == "]" ) {
+ setState(normal);
+ break;
+ }
+ if (dashes == 0)
+ dashes = (ch == "]") ? 1:0;
+ else
+ dashes = (ch == "=") ? dashes + 1 : 0;
+ }
+ return what;
+ }
+ }
+
+
+ function inString(quote) {
+ return function(source, setState) {
+ var escaped = false;
+ while (!source.endOfLine()) {
+ var ch = source.next();
+ if (ch == quote && !escaped)
+ break;
+ escaped = !escaped && ch == "\\";
+ }
+ if (!escaped)
+ setState(normal);
+ return "lua-string";
+ };
+ }
+
+ return function(source, startState) {
+ return tokenizer(source, startState || normal);
+ };
+ })();
+
+ function indentLUA(indentDepth, base) {
+ return function(nextChars) {
+
+ var closing = (luaUnindentKeys2.test(nextChars) || luaMiddleKeys.test(nextChars));
+
+
+ return base + ( indentUnit * (indentDepth - (closing?1:0)) );
+ };
+ }
+
+
+function parseLUA(source,basecolumn) {
+ basecolumn = basecolumn || 0;
+
+ var tokens = tokenizeLUA(source);
+ var indentDepth = 0;
+
+ var iter = {
+ next: function() {
+ var token = tokens.next(), style = token.style, content = token.content;
+
+
+
+ if (style == "lua-identifier" && luaKeywords.test(content)){
+ token.style = "lua-keyword";
+ }
+ if (style == "lua-identifier" && luaStdFunctions.test(content)){
+ token.style = "lua-stdfunc";
+ }
+ if (style == "lua-identifier" && luaCustomFunctions.test(content)){
+ token.style = "lua-customfunc";
+ }
+
+ if (luaIndentKeys.test(content))
+ indentDepth++;
+ else if (luaUnindentKeys.test(content))
+ indentDepth--;
+
+
+ if (content == "\n")
+ token.indentation = indentLUA( indentDepth, basecolumn);
+
+ return token;
+ },
+
+ copy: function() {
+ var _tokenState = tokens.state, _indentDepth = indentDepth;
+ return function(source) {
+ tokens = tokenizeLUA(source, _tokenState);
+
+ indentDepth = _indentDepth;
+ return iter;
+ };
+ }
+ };
+ return iter;
+ }
+
+ return {make: parseLUA, configure:configureLUA, electricChars: "delf})"}; //en[d] els[e] unti[l] elsei[f] // this should be taken from Keys keywords
+})();
+
diff --git a/media/CodeMirror-0.62/contrib/php/LICENSE b/media/CodeMirror-0.62/contrib/php/LICENSE
new file mode 100644
index 0000000..ce4c5e4
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/php/LICENSE
@@ -0,0 +1,37 @@
+Copyright (c) 2008-2009, Yahoo! Inc.
+All rights reserved.
+
+This software is provided for use in connection with the
+CodeMirror suite of modules and utilities, hosted and maintained
+at http://marijn.haverbeke.nl/codemirror/.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of Yahoo! Inc. nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of Yahoo! Inc.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/media/CodeMirror-0.62/contrib/php/css/phpcolors.css b/media/CodeMirror-0.62/contrib/php/css/phpcolors.css
new file mode 100644
index 0000000..1dd1aec
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/php/css/phpcolors.css
@@ -0,0 +1,110 @@
+/*
+Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
+The copyrights embodied in the content of this file are licensed by
+Yahoo! Inc. under the BSD (revised) open source license
+
+@author Dan Vlad Dascalescu
+*/
+
+.editbox {
+ margin: .4em;
+ padding: 0;
+ font-family: monospace;
+ font-size: 10pt;
+}
+
+/*We should define specific styles for every element of the syntax.
+ the setting below will cause some annoying color to show through if we missed
+ defining a style for a token. This is also the "color" of the whitespace and
+ of the cursor.
+*/
+pre.code, .editbox {
+ color: red;
+}
+
+.editbox p {
+ margin: 0;
+}
+
+span.php-punctuation {
+ color: blue;
+}
+
+span.php-keyword {
+ color: #770088;
+ font-weight: bold;
+}
+
+span.php-operator {
+ color: blue;
+}
+
+/* __FILE__ etc.; http://php.net/manual/en/reserved.php */
+span.php-compile-time-constant {
+ color: #776088;
+ font-weight: bold;
+}
+
+/* output of get_defined_constants(). Differs from http://php.net/manual/en/reserved.constants.php */
+span.php-predefined-constant {
+ color: darkgreen;
+ font-weight: bold;
+}
+
+/* PHP reserved "language constructs"... echo() etc.; http://php.net/manual/en/reserved.php */
+span.php-reserved-language-construct {
+ color: green;
+ font-weight: bold;
+}
+
+/* PHP built-in functions: glob(), chr() etc.; output of get_defined_functions()["internal"] */
+span.php-predefined-function {
+ color: green;
+}
+
+/* PHP predefined classes: PDO, Exception etc.; output of get_declared_classes() and different from http://php.net/manual/en/reserved.classes.php */
+span.php-predefined-class {
+ color: green;
+}
+
+span.php-atom {
+ color: #228811;
+}
+
+/* class, interface, namespace or function names, but not $variables */
+span.php-t_string {
+ color: black;
+}
+
+span.php-variable {
+ color: black;
+ font-weight: bold;
+}
+
+
+span.js-localvariable {
+ color: #004499;
+}
+
+span.php-comment {
+ color: #AA7700;
+ font-stretch: condensed;
+/* font-style: italic; This causes line height to slightly change, getting line numbers out of sync */
+}
+
+span.php-string-single-quoted {
+ color: #AA2222;
+}
+/* double quoted strings allow interpolation */
+span.php-string-double-quoted {
+ color: #AA2222;
+ font-weight: bold;
+}
+
+span.syntax-error {
+ background-color: red;
+}
+
+span.deprecated {
+ font-size: smaller;
+}
diff --git a/media/CodeMirror-0.62/contrib/php/index.html b/media/CodeMirror-0.62/contrib/php/index.html
new file mode 100644
index 0000000..f35f5d2
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/php/index.html
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+ CodeMirror: PHP+HTML+JavaScript+CSS mixed-mode demonstration
+
+
+
+
+ This is a complex demonstration of the PHP+HTML+JavaScript+CSS mixed-mode
+ syntax highlight capabilities of CodeMirror .
+ <?php ... ?> tags use the PHP parser, <script> tags use the JavaScript
+ parser, and <style> tags use the CSS parser. The rest of the content is
+ parsed using the XML parser in HTML mode.
+
+ Features of the PHP parser:
+
+ special "deprecated" style for PHP4 keywords like 'var'
+ support for PHP 5.3 keywords: 'namespace', 'use'
+ 911 predefined constants, 1301 predefined functions, 105 predeclared classes
+ from a typical PHP installation in a LAMP environment
+ new feature: syntax error flagging, thus enabling strict parsing of:
+
+ function definitions with explicitly or implicitly typed arguments and default values
+ modifiers (public, static etc.) applied to method and member definitions
+ foreach(array_expression as $key [=> $value]) loops
+
+ differentiation between single-quoted strings and double-quoted interpolating strings
+
+
+
+
+
+
+
+
+
+
diff --git a/media/CodeMirror-0.62/contrib/php/js/parsephp.js b/media/CodeMirror-0.62/contrib/php/js/parsephp.js
new file mode 100644
index 0000000..92d1e27
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/php/js/parsephp.js
@@ -0,0 +1,371 @@
+/*
+Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
+The copyrights embodied in the content of this file are licensed by
+Yahoo! Inc. under the BSD (revised) open source license
+
+@author Dan Vlad Dascalescu
+
+
+Parse function for PHP. Makes use of the tokenizer from tokenizephp.js.
+Based on parsejavascript.js by Marijn Haverbeke.
+
+
+Features:
+ + special "deprecated" style for PHP4 keywords like 'var'
+ + support for PHP 5.3 keywords: 'namespace', 'use'
+ + 911 predefined constants, 1301 predefined functions, 105 predeclared classes
+ from a typical PHP installation in a LAMP environment
+ + new feature: syntax error flagging, thus enabling strict parsing of:
+ + function definitions with explicitly or implicitly typed arguments and default values
+ + modifiers (public, static etc.) applied to method and member definitions
+ + foreach(array_expression as $key [=> $value]) loops
+ + differentiation between single-quoted strings and double-quoted interpolating strings
+
+*/
+
+
+// add the Array.indexOf method for JS engines that don't support it (e.g. IE)
+// code from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Array/IndexOf
+if (!Array.prototype.indexOf)
+{
+ Array.prototype.indexOf = function(elt /*, from*/)
+ {
+ var len = this.length;
+
+ var from = Number(arguments[1]) || 0;
+ from = (from < 0)
+ ? Math.ceil(from)
+ : Math.floor(from);
+ if (from < 0)
+ from += len;
+
+ for (; from < len; from++)
+ {
+ if (from in this &&
+ this[from] === elt)
+ return from;
+ }
+ return -1;
+ };
+};
+
+
+var PHPParser = Editor.Parser = (function() {
+ // Token types that can be considered to be atoms, part of operator expressions
+ var atomicTypes = {
+ "atom": true, "number": true, "variable": true, "string": true
+ };
+ // Constructor for the lexical context objects.
+ function PHPLexical(indented, column, type, align, prev, info) {
+ // indentation at start of this line
+ this.indented = indented;
+ // column at which this scope was opened
+ this.column = column;
+ // type of scope ('stat' (statement), 'form' (special form), '[', '{', or '(')
+ this.type = type;
+ // '[', '{', or '(' blocks that have any text after their opening
+ // character are said to be 'aligned' -- any lines below are
+ // indented all the way to the opening character.
+ if (align != null)
+ this.align = align;
+ // Parent scope, if any.
+ this.prev = prev;
+ this.info = info;
+ };
+
+ // PHP indentation rules
+ function indentPHP(lexical) {
+ return function(firstChars) {
+ var firstChar = firstChars && firstChars.charAt(0), type = lexical.type;
+ var closing = firstChar == type;
+ if (type == "form" && firstChar == "{")
+ return lexical.indented;
+ else if (type == "stat" || type == "form")
+ return lexical.indented + indentUnit;
+ else if (lexical.info == "switch" && !closing)
+ return lexical.indented + (/^(?:case|default)\b/.test(firstChars) ? indentUnit : 2 * indentUnit);
+ else if (lexical.align)
+ return lexical.column - (closing ? 1 : 0);
+ else
+ return lexical.indented + (closing ? 0 : indentUnit);
+ };
+ };
+
+ // The parser-iterator-producing function itself.
+ function parsePHP(input, basecolumn) {
+ // Wrap the input in a token stream
+ var tokens = tokenizePHP(input);
+ // The parser state. cc is a stack of actions that have to be
+ // performed to finish the current statement. For example we might
+ // know that we still need to find a closing parenthesis and a
+ // semicolon. Actions at the end of the stack go first. It is
+ // initialized with an infinitely looping action that consumes
+ // whole statements.
+ var cc = [statements];
+ // The lexical scope, used mostly for indentation.
+ var lexical = new PHPLexical((basecolumn || 0) - indentUnit, 0, "block", false);
+ // Current column, and the indentation at the start of the current
+ // line. Used to create lexical scope objects.
+ var column = 0;
+ var indented = 0;
+ // Variables which are used by the mark, cont, and pass functions
+ // below to communicate with the driver loop in the 'next' function.
+ var consume, marked;
+
+ // The iterator object.
+ var parser = {next: next, copy: copy};
+
+ // parsing is accomplished by calling next() repeatedly
+ function next(){
+ // Start by performing any 'lexical' actions (adjusting the
+ // lexical variable), or the operations below will be working
+ // with the wrong lexical state.
+ while(cc[cc.length - 1].lex)
+ cc.pop()();
+
+ // Fetch the next token.
+ var token = tokens.next();
+
+ // Adjust column and indented.
+ if (token.type == "whitespace" && column == 0)
+ indented = token.value.length;
+ column += token.value.length;
+ if (token.content == "\n"){
+ indented = column = 0;
+ // If the lexical scope's align property is still undefined at
+ // the end of the line, it is an un-aligned scope.
+ if (!("align" in lexical))
+ lexical.align = false;
+ // Newline tokens get an indentation function associated with
+ // them.
+ token.indentation = indentPHP(lexical);
+ }
+ // No more processing for meaningless tokens.
+ if (token.type == "whitespace" || token.type == "comment"
+ || token.type == "string_not_terminated" )
+ return token;
+ // When a meaningful token is found and the lexical scope's
+ // align is undefined, it is an aligned scope.
+ if (!("align" in lexical))
+ lexical.align = true;
+
+ // Execute actions until one 'consumes' the token and we can
+ // return it. 'marked' is used to change the style of the current token.
+ while(true) {
+ consume = marked = false;
+ // Take and execute the topmost action.
+ var action = cc.pop();
+ action(token);
+
+ if (consume){
+ if (marked)
+ token.style = marked;
+ // Here we differentiate between local and global variables.
+ return token;
+ }
+ }
+ return 1; // Firebug workaround for http://code.google.com/p/fbug/issues/detail?id=1239#c1
+ }
+
+ // This makes a copy of the parser state. It stores all the
+ // stateful variables in a closure, and returns a function that
+ // will restore them when called with a new input stream. Note
+ // that the cc array has to be copied, because it is contantly
+ // being modified. Lexical objects are not mutated, so they can
+ // be shared between runs of the parser.
+ function copy(){
+ var _lexical = lexical, _cc = cc.concat([]), _tokenState = tokens.state;
+
+ return function copyParser(input){
+ lexical = _lexical;
+ cc = _cc.concat([]); // copies the array
+ column = indented = 0;
+ tokens = tokenizePHP(input, _tokenState);
+ return parser;
+ };
+ }
+
+ // Helper function for pushing a number of actions onto the cc
+ // stack in reverse order.
+ function push(fs){
+ for (var i = fs.length - 1; i >= 0; i--)
+ cc.push(fs[i]);
+ }
+ // cont and pass are used by the action functions to add other
+ // actions to the stack. cont will cause the current token to be
+ // consumed, pass will leave it for the next action.
+ function cont(){
+ push(arguments);
+ consume = true;
+ }
+ function pass(){
+ push(arguments);
+ consume = false;
+ }
+ // Used to change the style of the current token.
+ function mark(style){
+ marked = style;
+ }
+ // Add a lyer of style to the current token, for example syntax-error
+ function mark_add(style){
+ marked = marked + ' ' + style;
+ }
+
+ // Push a new lexical context of the given type.
+ function pushlex(type, info) {
+ var result = function pushlexing() {
+ lexical = new PHPLexical(indented, column, type, null, lexical, info)
+ };
+ result.lex = true;
+ return result;
+ }
+ // Pop off the current lexical context.
+ function poplex(){
+ lexical = lexical.prev;
+ }
+ poplex.lex = true;
+ // The 'lex' flag on these actions is used by the 'next' function
+ // to know they can (and have to) be ran before moving on to the
+ // next token.
+
+ // Creates an action that discards tokens until it finds one of
+ // the given type. This will ignore (and recover from) syntax errors.
+ function expect(wanted){
+ return function expecting(token){
+ if (token.type == wanted) cont(); // consume the token
+ else {
+ cont(arguments.callee); // continue expecting() - call itself
+ }
+ };
+ }
+
+ // Require a specific token type, or one of the tokens passed in the 'wanted' array
+ // Used to detect blatant syntax errors. 'execute' is used to pass extra code
+ // to be executed if the token is matched. For example, a '(' match could
+ // 'execute' a cont( compasep(funcarg), require(")") )
+ function require(wanted, execute){
+ return function requiring(token){
+ var ok;
+ var type = token.type;
+ if (typeof(wanted) == "string")
+ ok = (type == wanted) -1;
+ else
+ ok = wanted.indexOf(type);
+ if (ok >= 0) {
+ if (execute && typeof(execute[ok]) == "function")
+ execute[ok](token);
+ cont(); // just consume the token
+ }
+ else {
+ if (!marked) mark(token.style);
+ mark_add("syntax-error");
+ cont(arguments.callee);
+ }
+ };
+ }
+
+ // Looks for a statement, and then calls itself.
+ function statements(token){
+ return pass(statement, statements);
+ }
+ // Dispatches various types of statements based on the type of the current token.
+ function statement(token){
+ var type = token.type;
+ if (type == "keyword a") cont(pushlex("form"), expression, statement, poplex);
+ else if (type == "keyword b") cont(pushlex("form"), statement, poplex);
+ else if (type == "{") cont(pushlex("}"), block, poplex);
+ else if (type == "function") funcdef();
+ // technically, "class implode {...}" is correct, but we'll flag that as an error because it overrides a predefined function
+ else if (type == "class") cont(require("t_string"), expect("{"), pushlex("}"), block, poplex);
+ else if (type == "foreach") cont(pushlex("form"), require("("), pushlex(")"), expression, require("as"), require("variable"), /* => $value */ expect(")"), poplex, statement, poplex);
+ else if (type == "for") cont(pushlex("form"), require("("), pushlex(")"), expression, require(";"), expression, require(";"), expression, require(")"), poplex, statement, poplex);
+ // public final function foo(), protected static $bar;
+ else if (type == "modifier") cont(require(["modifier", "variable", "function"], [null, null, funcdef]));
+ else if (type == "switch") cont(pushlex("form"), require("("), expression, require(")"), pushlex("}", "switch"), require([":", "{"]), block, poplex, poplex);
+ else if (type == "case") cont(expression, require(":"));
+ else if (type == "default") cont(require(":"));
+ else if (type == "catch") cont(pushlex("form"), require("("), require("t_string"), require("variable"), require(")"), statement, poplex);
+ else if (type == "const") cont(require("t_string")); // 'const static x=5' is a syntax error
+ // technically, "namespace implode {...}" is correct, but we'll flag that as an error because it overrides a predefined function
+ else if (type == "namespace") cont(namespacedef, require(";"));
+ // $variables may be followed by operators, () for variable function calls, or [] subscripts
+ else pass(pushlex("stat"), expression, require(";"), poplex);
+ }
+ // Dispatch expression types.
+ function expression(token){
+ var type = token.type;
+ if (atomicTypes.hasOwnProperty(type)) cont(maybeoperator);
+ else if (type == "<<<") cont(require("string"), maybeoperator); // heredoc/nowdoc
+ else if (type == "t_string") cont(maybe_double_colon, maybeoperator);
+ else if (type == "keyword c") cont(expression);
+ // function call or parenthesized expression: $a = ($b + 1) * 2;
+ else if (type == "(") cont(pushlex(")"), commasep(expression), require(")"), poplex, maybeoperator);
+ else if (type == "operator") cont(expression);
+ }
+ // Called for places where operators, function calls, or subscripts are
+ // valid. Will skip on to the next action if none is found.
+ function maybeoperator(token){
+ var type = token.type;
+ if (type == "operator") {
+ if (token.content == "?") cont(expression, require(":"), expression); // ternary operator
+ else cont(expression);
+ }
+ else if (type == "(") cont(pushlex(")"), expression, commasep(expression), require(")"), poplex, maybeoperator /* $varfunc() + 3 */);
+ else if (type == "[") cont(pushlex("]"), expression, require("]"), maybeoperator /* for multidimensional arrays, or $func[$i]() */, poplex);
+ }
+ // A regular use of the double colon to specify a class, as in self::func() or myclass::$var;
+ // Differs from `namespace` or `use` in that only one class can be the parent; chains (A::B::$var) are a syntax error.
+ function maybe_double_colon(token) {
+ if (token.type == "t_double_colon")
+ // A::$var, A::func(), A::const
+ cont(require(["t_string", "variable"]), maybeoperator);
+ else {
+ // a t_string wasn't followed by ::, such as in a function call: foo()
+ pass(expression)
+ }
+ }
+ // the declaration or definition of a function
+ function funcdef() {
+ cont(require("t_string"), require("("), pushlex(")"), commasep(funcarg), require(")"), poplex, block);
+ }
+ // Parses a comma-separated list of the things that are recognized
+ // by the 'what' argument.
+ function commasep(what){
+ function proceed(token) {
+ if (token.type == ",") cont(what, proceed);
+ };
+ return function commaSeparated() {
+ pass(what, proceed);
+ };
+ }
+ // Look for statements until a closing brace is found.
+ function block(token) {
+ if (token.type == "}") cont();
+ else pass(statement, block);
+ }
+ function maybedefaultparameter(token){
+ if (token.content == "=") cont(expression);
+ }
+ // support for default arguments: http://us.php.net/manual/en/functions.arguments.php#functions.arguments.default
+ function funcarg(token){
+ // function foo(myclass $obj) {...}
+ if (token.type == "t_string") cont(require("variable"), maybedefaultparameter);
+ // function foo($string) {...}
+ else if (token.type == "variable") cont(maybedefaultparameter);
+ }
+
+ // A namespace definition or use
+ function maybe_double_colon_def(token) {
+ if (token.type == "t_double_colon")
+ cont(namespacedef);
+ }
+ function namespacedef(token) {
+ pass(require("t_string"), maybe_double_colon_def);
+ }
+
+ return parser;
+ }
+
+ return {make: parsePHP, electricChars: "{}:"};
+
+})();
diff --git a/media/CodeMirror-0.62/contrib/php/js/parsephphtmlmixed.js b/media/CodeMirror-0.62/contrib/php/js/parsephphtmlmixed.js
new file mode 100644
index 0000000..ee4418d
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/php/js/parsephphtmlmixed.js
@@ -0,0 +1,90 @@
+/*
+Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
+The copyrights embodied in the content of this file are licensed by
+Yahoo! Inc. under the BSD (revised) open source license
+
+@author Dan Vlad Dascalescu
+
+Based on parsehtmlmixed.js by Marijn Haverbeke.
+*/
+
+var PHPHTMLMixedParser = Editor.Parser = (function() {
+ if (!(PHPParser && CSSParser && JSParser && XMLParser))
+ throw new Error("PHP, CSS, JS, and XML parsers must be loaded for PHP+HTML mixed mode to work.");
+ XMLParser.configure({useHTMLKludges: true});
+
+ function parseMixed(stream) {
+ var htmlParser = XMLParser.make(stream), localParser = null, inTag = false;
+ var iter = {next: top, copy: copy};
+
+ function top() {
+ var token = htmlParser.next();
+ if (token.content == "<")
+ inTag = true;
+ else if (token.style == "xml-tagname" && inTag === true)
+ inTag = token.content.toLowerCase();
+ else if (token.type == "xml-processing") {
+ // dispatch on PHP
+ if (token.content == "");
+ }
+ // "xml-processing" tokens are ignored, because they should be handled by a specific local parser
+ else if (token.content == ">") {
+ if (inTag == "script")
+ iter.next = local(JSParser, "
+
+
+Tokenizer for PHP code
+
+References:
+ + http://php.net/manual/en/reserved.php
+ + http://php.net/tokens
+ + get_defined_constants(), get_defined_functions(), get_declared_classes()
+ executed on a realistic (not vanilla) PHP installation with typical LAMP modules.
+ Specifically, the PHP bundled with the Uniform Web Server (www.uniformserver.com).
+
+*/
+
+
+// add the forEach method for JS engines that don't support it (e.g. IE)
+// code from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:forEach
+if (!Array.prototype.forEach)
+{
+ Array.prototype.forEach = function(fun /*, thisp*/)
+ {
+ var len = this.length;
+ if (typeof fun != "function")
+ throw new TypeError();
+
+ var thisp = arguments[1];
+ for (var i = 0; i < len; i++)
+ {
+ if (i in this)
+ fun.call(thisp, this[i], i, this);
+ }
+ };
+}
+
+
+var tokenizePHP = (function() {
+ /* A map of PHP's reserved words (keywords, predefined classes, functions and
+ constants. Each token has a type ('keyword', 'operator' etc.) and a style.
+ The style corresponds to the CSS span class in phpcolors.css.
+
+ Keywords can be of three types:
+ a - takes an expression and forms a statement - e.g. if
+ b - takes just a statement - e.g. else
+ c - takes an optinoal expression, but no statement - e.g. return
+ This distinction gives the parser enough information to parse
+ correct code correctly (we don't care that much how we parse
+ incorrect code).
+
+ Reference: http://us.php.net/manual/en/reserved.php
+ */
+ var keywords = function(){
+ function token(type, style){
+ return {type: type, style: style};
+ }
+ var result = {};
+
+ // for each(var element in ["...", "..."]) can pick up elements added to
+ // Array.prototype, so we'll use the loop structure below. See also
+ // http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for_each...in
+
+ // keywords that take an expression and form a statement
+ ["if", "elseif", "while", "declare"].forEach(function(element, index, array) {
+ result[element] = token("keyword a", "php-keyword");
+ });
+
+ // keywords that take just a statement
+ ["do", "else", "try" ].forEach(function(element, index, array) {
+ result[element] = token("keyword b", "php-keyword");
+ });
+
+ // keywords that take an optional expression, but no statement
+ ["return", "break", "continue", // the expression is optional
+ "new", "clone", "throw" // the expression is mandatory
+ ].forEach(function(element, index, array) {
+ result[element] = token("keyword c", "php-keyword");
+ });
+
+ ["__CLASS__", "__DIR__", "__FILE__", "__FUNCTION__", "__METHOD__", "__NAMESPACE__"].forEach(function(element, index, array) {
+ result[element] = token("atom", "php-compile-time-constant");
+ });
+
+ ["true", "false", "null"].forEach(function(element, index, array) {
+ result[element] = token("atom", "php-atom");
+ });
+
+ ["and", "or", "xor", "instanceof"].forEach(function(element, index, array) {
+ result[element] = token("operator", "php-keyword php-operator");
+ });
+
+ ["class", "interface"].forEach(function(element, index, array) {
+ result[element] = token("class", "php-keyword");
+ });
+ ["namespace", "use", "extends", "implements"].forEach(function(element, index, array) {
+ result[element] = token("namespace", "php-keyword");
+ });
+
+ // reserved "language constructs"... http://php.net/manual/en/reserved.php
+ [ "die", "echo", "empty", "exit", "eval", "include", "include_once", "isset",
+ "list", "require", "require_once", "return", "print", "unset",
+ "array" // a keyword rather, but mandates a parenthesized parameter list
+ ].forEach(function(element, index, array) {
+ result[element] = token("t_string", "php-reserved-language-construct");
+ });
+
+ result["switch"] = token("switch", "php-keyword");
+ result["case"] = token("case", "php-keyword");
+ result["default"] = token("default", "php-keyword");
+ result["catch"] = token("catch", "php-keyword");
+ result["function"] = token("function", "php-keyword");
+
+ // http://php.net/manual/en/control-structures.alternative-syntax.php must be followed by a ':'
+ ["endif", "endwhile", "endfor", "endforeach", "endswitch", "enddeclare"].forEach(function(element, index, array) {
+ result[element] = token("default", "php-keyword");
+ });
+
+ result["const"] = token("const", "php-keyword");
+
+ ["abstract", "final", "private", "protected", "public", "global", "static"].forEach(function(element, index, array) {
+ result[element] = token("modifier", "php-keyword");
+ });
+ result["var"] = token("modifier", "php-keyword deprecated");
+
+ result["foreach"] = token("foreach", "php-keyword");
+ result["as"] = token("as", "php-keyword");
+ result["for"] = token("for", "php-keyword");
+
+ // PHP built-in functions - output of get_defined_functions()["internal"]
+ [ "zend_version", "func_num_args", "func_get_arg", "func_get_args", "strlen",
+ "strcmp", "strncmp", "strcasecmp", "strncasecmp", "each", "error_reporting",
+ "define", "defined", "get_class", "get_parent_class", "method_exists",
+ "property_exists", "class_exists", "interface_exists", "function_exists",
+ "get_included_files", "get_required_files", "is_subclass_of", "is_a",
+ "get_class_vars", "get_object_vars", "get_class_methods", "trigger_error",
+ "user_error", "set_error_handler", "restore_error_handler",
+ "set_exception_handler", "restore_exception_handler", "get_declared_classes",
+ "get_declared_interfaces", "get_defined_functions", "get_defined_vars",
+ "create_function", "get_resource_type", "get_loaded_extensions",
+ "extension_loaded", "get_extension_funcs", "get_defined_constants",
+ "debug_backtrace", "debug_print_backtrace", "bcadd", "bcsub", "bcmul", "bcdiv",
+ "bcmod", "bcpow", "bcsqrt", "bcscale", "bccomp", "bcpowmod", "jdtogregorian",
+ "gregoriantojd", "jdtojulian", "juliantojd", "jdtojewish", "jewishtojd",
+ "jdtofrench", "frenchtojd", "jddayofweek", "jdmonthname", "easter_date",
+ "easter_days", "unixtojd", "jdtounix", "cal_to_jd", "cal_from_jd",
+ "cal_days_in_month", "cal_info", "variant_set", "variant_add", "variant_cat",
+ "variant_sub", "variant_mul", "variant_and", "variant_div", "variant_eqv",
+ "variant_idiv", "variant_imp", "variant_mod", "variant_or", "variant_pow",
+ "variant_xor", "variant_abs", "variant_fix", "variant_int", "variant_neg",
+ "variant_not", "variant_round", "variant_cmp", "variant_date_to_timestamp",
+ "variant_date_from_timestamp", "variant_get_type", "variant_set_type",
+ "variant_cast", "com_create_guid", "com_event_sink", "com_print_typeinfo",
+ "com_message_pump", "com_load_typelib", "com_get_active_object", "ctype_alnum",
+ "ctype_alpha", "ctype_cntrl", "ctype_digit", "ctype_lower", "ctype_graph",
+ "ctype_print", "ctype_punct", "ctype_space", "ctype_upper", "ctype_xdigit",
+ "strtotime", "date", "idate", "gmdate", "mktime", "gmmktime", "checkdate",
+ "strftime", "gmstrftime", "time", "localtime", "getdate", "date_create",
+ "date_parse", "date_format", "date_modify", "date_timezone_get",
+ "date_timezone_set", "date_offset_get", "date_time_set", "date_date_set",
+ "date_isodate_set", "timezone_open", "timezone_name_get",
+ "timezone_name_from_abbr", "timezone_offset_get", "timezone_transitions_get",
+ "timezone_identifiers_list", "timezone_abbreviations_list",
+ "date_default_timezone_set", "date_default_timezone_get", "date_sunrise",
+ "date_sunset", "date_sun_info", "filter_input", "filter_var",
+ "filter_input_array", "filter_var_array", "filter_list", "filter_has_var",
+ "filter_id", "ftp_connect", "ftp_login", "ftp_pwd", "ftp_cdup", "ftp_chdir",
+ "ftp_exec", "ftp_raw", "ftp_mkdir", "ftp_rmdir", "ftp_chmod", "ftp_alloc",
+ "ftp_nlist", "ftp_rawlist", "ftp_systype", "ftp_pasv", "ftp_get", "ftp_fget",
+ "ftp_put", "ftp_fput", "ftp_size", "ftp_mdtm", "ftp_rename", "ftp_delete",
+ "ftp_site", "ftp_close", "ftp_set_option", "ftp_get_option", "ftp_nb_fget",
+ "ftp_nb_get", "ftp_nb_continue", "ftp_nb_put", "ftp_nb_fput", "ftp_quit",
+ "hash", "hash_file", "hash_hmac", "hash_hmac_file", "hash_init", "hash_update",
+ "hash_update_stream", "hash_update_file", "hash_final", "hash_algos", "iconv",
+ "ob_iconv_handler", "iconv_get_encoding", "iconv_set_encoding", "iconv_strlen",
+ "iconv_substr", "iconv_strpos", "iconv_strrpos", "iconv_mime_encode",
+ "iconv_mime_decode", "iconv_mime_decode_headers", "json_encode", "json_decode",
+ "odbc_autocommit", "odbc_binmode", "odbc_close", "odbc_close_all",
+ "odbc_columns", "odbc_commit", "odbc_connect", "odbc_cursor",
+ "odbc_data_source", "odbc_execute", "odbc_error", "odbc_errormsg", "odbc_exec",
+ "odbc_fetch_array", "odbc_fetch_object", "odbc_fetch_row", "odbc_fetch_into",
+ "odbc_field_len", "odbc_field_scale", "odbc_field_name", "odbc_field_type",
+ "odbc_field_num", "odbc_free_result", "odbc_gettypeinfo", "odbc_longreadlen",
+ "odbc_next_result", "odbc_num_fields", "odbc_num_rows", "odbc_pconnect",
+ "odbc_prepare", "odbc_result", "odbc_result_all", "odbc_rollback",
+ "odbc_setoption", "odbc_specialcolumns", "odbc_statistics", "odbc_tables",
+ "odbc_primarykeys", "odbc_columnprivileges", "odbc_tableprivileges",
+ "odbc_foreignkeys", "odbc_procedures", "odbc_procedurecolumns", "odbc_do",
+ "odbc_field_precision", "preg_match", "preg_match_all", "preg_replace",
+ "preg_replace_callback", "preg_split", "preg_quote", "preg_grep",
+ "preg_last_error", "session_name", "session_module_name", "session_save_path",
+ "session_id", "session_regenerate_id", "session_decode", "session_register",
+ "session_unregister", "session_is_registered", "session_encode",
+ "session_start", "session_destroy", "session_unset",
+ "session_set_save_handler", "session_cache_limiter", "session_cache_expire",
+ "session_set_cookie_params", "session_get_cookie_params",
+ "session_write_close", "session_commit", "spl_classes", "spl_autoload",
+ "spl_autoload_extensions", "spl_autoload_register", "spl_autoload_unregister",
+ "spl_autoload_functions", "spl_autoload_call", "class_parents",
+ "class_implements", "spl_object_hash", "iterator_to_array", "iterator_count",
+ "iterator_apply", "constant", "bin2hex", "sleep", "usleep", "flush",
+ "wordwrap", "htmlspecialchars", "htmlentities", "html_entity_decode",
+ "htmlspecialchars_decode", "get_html_translation_table", "sha1", "sha1_file",
+ "md5", "md5_file", "crc32", "iptcparse", "iptcembed", "getimagesize",
+ "image_type_to_mime_type", "image_type_to_extension", "phpinfo", "phpversion",
+ "phpcredits", "php_logo_guid", "php_real_logo_guid", "php_egg_logo_guid",
+ "zend_logo_guid", "php_sapi_name", "php_uname", "php_ini_scanned_files",
+ "strnatcmp", "strnatcasecmp", "substr_count", "strspn", "strcspn", "strtok",
+ "strtoupper", "strtolower", "strpos", "stripos", "strrpos", "strripos",
+ "strrev", "hebrev", "hebrevc", "nl2br", "basename", "dirname", "pathinfo",
+ "stripslashes", "stripcslashes", "strstr", "stristr", "strrchr", "str_shuffle",
+ "str_word_count", "str_split", "strpbrk", "substr_compare", "strcoll",
+ "substr", "substr_replace", "quotemeta", "ucfirst", "ucwords", "strtr",
+ "addslashes", "addcslashes", "rtrim", "str_replace", "str_ireplace",
+ "str_repeat", "count_chars", "chunk_split", "trim", "ltrim", "strip_tags",
+ "similar_text", "explode", "implode", "setlocale", "localeconv", "soundex",
+ "levenshtein", "chr", "ord", "parse_str", "str_pad", "chop", "strchr",
+ "sprintf", "printf", "vprintf", "vsprintf", "fprintf", "vfprintf", "sscanf",
+ "fscanf", "parse_url", "urlencode", "urldecode", "rawurlencode",
+ "rawurldecode", "http_build_query", "unlink", "exec", "system",
+ "escapeshellcmd", "escapeshellarg", "passthru", "shell_exec", "proc_open",
+ "proc_close", "proc_terminate", "proc_get_status", "rand", "srand",
+ "getrandmax", "mt_rand", "mt_srand", "mt_getrandmax", "getservbyname",
+ "getservbyport", "getprotobyname", "getprotobynumber", "getmyuid", "getmygid",
+ "getmypid", "getmyinode", "getlastmod", "base64_decode", "base64_encode",
+ "convert_uuencode", "convert_uudecode", "abs", "ceil", "floor", "round", "sin",
+ "cos", "tan", "asin", "acos", "atan", "atan2", "sinh", "cosh", "tanh", "pi",
+ "is_finite", "is_nan", "is_infinite", "pow", "exp", "log", "log10", "sqrt",
+ "hypot", "deg2rad", "rad2deg", "bindec", "hexdec", "octdec", "decbin",
+ "decoct", "dechex", "base_convert", "number_format", "fmod", "ip2long",
+ "long2ip", "getenv", "putenv", "microtime", "gettimeofday", "uniqid",
+ "quoted_printable_decode", "convert_cyr_string", "get_current_user",
+ "set_time_limit", "get_cfg_var", "magic_quotes_runtime",
+ "set_magic_quotes_runtime", "get_magic_quotes_gpc", "get_magic_quotes_runtime",
+ "import_request_variables", "error_log", "error_get_last", "call_user_func",
+ "call_user_func_array", "call_user_method", "call_user_method_array",
+ "serialize", "unserialize", "var_dump", "var_export", "debug_zval_dump",
+ "print_r", "memory_get_usage", "memory_get_peak_usage",
+ "register_shutdown_function", "register_tick_function",
+ "unregister_tick_function", "highlight_file", "show_source",
+ "highlight_string", "php_strip_whitespace", "ini_get", "ini_get_all",
+ "ini_set", "ini_alter", "ini_restore", "get_include_path", "set_include_path",
+ "restore_include_path", "setcookie", "setrawcookie", "header", "headers_sent",
+ "headers_list", "connection_aborted", "connection_status", "ignore_user_abort",
+ "parse_ini_file", "is_uploaded_file", "move_uploaded_file", "gethostbyaddr",
+ "gethostbyname", "gethostbynamel", "intval", "floatval", "doubleval", "strval",
+ "gettype", "settype", "is_null", "is_resource", "is_bool", "is_long",
+ "is_float", "is_int", "is_integer", "is_double", "is_real", "is_numeric",
+ "is_string", "is_array", "is_object", "is_scalar", "is_callable", "ereg",
+ "ereg_replace", "eregi", "eregi_replace", "split", "spliti", "join",
+ "sql_regcase", "dl", "pclose", "popen", "readfile", "rewind", "rmdir", "umask",
+ "fclose", "feof", "fgetc", "fgets", "fgetss", "fread", "fopen", "fpassthru",
+ "ftruncate", "fstat", "fseek", "ftell", "fflush", "fwrite", "fputs", "mkdir",
+ "rename", "copy", "tempnam", "tmpfile", "file", "file_get_contents",
+ "file_put_contents", "stream_select", "stream_context_create",
+ "stream_context_set_params", "stream_context_set_option",
+ "stream_context_get_options", "stream_context_get_default",
+ "stream_filter_prepend", "stream_filter_append", "stream_filter_remove",
+ "stream_socket_client", "stream_socket_server", "stream_socket_accept",
+ "stream_socket_get_name", "stream_socket_recvfrom", "stream_socket_sendto",
+ "stream_socket_enable_crypto", "stream_socket_shutdown",
+ "stream_copy_to_stream", "stream_get_contents", "fgetcsv", "fputcsv", "flock",
+ "get_meta_tags", "stream_set_write_buffer", "set_file_buffer",
+ "set_socket_blocking", "stream_set_blocking", "socket_set_blocking",
+ "stream_get_meta_data", "stream_get_line", "stream_wrapper_register",
+ "stream_register_wrapper", "stream_wrapper_unregister",
+ "stream_wrapper_restore", "stream_get_wrappers", "stream_get_transports",
+ "get_headers", "stream_set_timeout", "socket_set_timeout", "socket_get_status",
+ "realpath", "fsockopen", "pfsockopen", "pack", "unpack", "get_browser",
+ "crypt", "opendir", "closedir", "chdir", "getcwd", "rewinddir", "readdir",
+ "dir", "scandir", "glob", "fileatime", "filectime", "filegroup", "fileinode",
+ "filemtime", "fileowner", "fileperms", "filesize", "filetype", "file_exists",
+ "is_writable", "is_writeable", "is_readable", "is_executable", "is_file",
+ "is_dir", "is_link", "stat", "lstat", "chown", "chgrp", "chmod", "touch",
+ "clearstatcache", "disk_total_space", "disk_free_space", "diskfreespace",
+ "mail", "ezmlm_hash", "openlog", "syslog", "closelog",
+ "define_syslog_variables", "lcg_value", "metaphone", "ob_start", "ob_flush",
+ "ob_clean", "ob_end_flush", "ob_end_clean", "ob_get_flush", "ob_get_clean",
+ "ob_get_length", "ob_get_level", "ob_get_status", "ob_get_contents",
+ "ob_implicit_flush", "ob_list_handlers", "ksort", "krsort", "natsort",
+ "natcasesort", "asort", "arsort", "sort", "rsort", "usort", "uasort", "uksort",
+ "shuffle", "array_walk", "array_walk_recursive", "count", "end", "prev",
+ "next", "reset", "current", "key", "min", "max", "in_array", "array_search",
+ "extract", "compact", "array_fill", "array_fill_keys", "range",
+ "array_multisort", "array_push", "array_pop", "array_shift", "array_unshift",
+ "array_splice", "array_slice", "array_merge", "array_merge_recursive",
+ "array_keys", "array_values", "array_count_values", "array_reverse",
+ "array_reduce", "array_pad", "array_flip", "array_change_key_case",
+ "array_rand", "array_unique", "array_intersect", "array_intersect_key",
+ "array_intersect_ukey", "array_uintersect", "array_intersect_assoc",
+ "array_uintersect_assoc", "array_intersect_uassoc", "array_uintersect_uassoc",
+ "array_diff", "array_diff_key", "array_diff_ukey", "array_udiff",
+ "array_diff_assoc", "array_udiff_assoc", "array_diff_uassoc",
+ "array_udiff_uassoc", "array_sum", "array_product", "array_filter",
+ "array_map", "array_chunk", "array_combine", "array_key_exists", "pos",
+ "sizeof", "key_exists", "assert", "assert_options", "version_compare",
+ "str_rot13", "stream_get_filters", "stream_filter_register",
+ "stream_bucket_make_writeable", "stream_bucket_prepend",
+ "stream_bucket_append", "stream_bucket_new", "output_add_rewrite_var",
+ "output_reset_rewrite_vars", "sys_get_temp_dir", "token_get_all", "token_name",
+ "readgzfile", "gzrewind", "gzclose", "gzeof", "gzgetc", "gzgets", "gzgetss",
+ "gzread", "gzopen", "gzpassthru", "gzseek", "gztell", "gzwrite", "gzputs",
+ "gzfile", "gzcompress", "gzuncompress", "gzdeflate", "gzinflate", "gzencode",
+ "ob_gzhandler", "zlib_get_coding_type", "libxml_set_streams_context",
+ "libxml_use_internal_errors", "libxml_get_last_error", "libxml_clear_errors",
+ "libxml_get_errors", "dom_import_simplexml", "simplexml_load_file",
+ "simplexml_load_string", "simplexml_import_dom", "wddx_serialize_value",
+ "wddx_serialize_vars", "wddx_packet_start", "wddx_packet_end", "wddx_add_vars",
+ "wddx_deserialize", "xml_parser_create", "xml_parser_create_ns",
+ "xml_set_object", "xml_set_element_handler", "xml_set_character_data_handler",
+ "xml_set_processing_instruction_handler", "xml_set_default_handler",
+ "xml_set_unparsed_entity_decl_handler", "xml_set_notation_decl_handler",
+ "xml_set_external_entity_ref_handler", "xml_set_start_namespace_decl_handler",
+ "xml_set_end_namespace_decl_handler", "xml_parse", "xml_parse_into_struct",
+ "xml_get_error_code", "xml_error_string", "xml_get_current_line_number",
+ "xml_get_current_column_number", "xml_get_current_byte_index",
+ "xml_parser_free", "xml_parser_set_option", "xml_parser_get_option",
+ "utf8_encode", "utf8_decode", "xmlwriter_open_uri", "xmlwriter_open_memory",
+ "xmlwriter_set_indent", "xmlwriter_set_indent_string",
+ "xmlwriter_start_comment", "xmlwriter_end_comment",
+ "xmlwriter_start_attribute", "xmlwriter_end_attribute",
+ "xmlwriter_write_attribute", "xmlwriter_start_attribute_ns",
+ "xmlwriter_write_attribute_ns", "xmlwriter_start_element",
+ "xmlwriter_end_element", "xmlwriter_full_end_element",
+ "xmlwriter_start_element_ns", "xmlwriter_write_element",
+ "xmlwriter_write_element_ns", "xmlwriter_start_pi", "xmlwriter_end_pi",
+ "xmlwriter_write_pi", "xmlwriter_start_cdata", "xmlwriter_end_cdata",
+ "xmlwriter_write_cdata", "xmlwriter_text", "xmlwriter_write_raw",
+ "xmlwriter_start_document", "xmlwriter_end_document",
+ "xmlwriter_write_comment", "xmlwriter_start_dtd", "xmlwriter_end_dtd",
+ "xmlwriter_write_dtd", "xmlwriter_start_dtd_element",
+ "xmlwriter_end_dtd_element", "xmlwriter_write_dtd_element",
+ "xmlwriter_start_dtd_attlist", "xmlwriter_end_dtd_attlist",
+ "xmlwriter_write_dtd_attlist", "xmlwriter_start_dtd_entity",
+ "xmlwriter_end_dtd_entity", "xmlwriter_write_dtd_entity",
+ "xmlwriter_output_memory", "xmlwriter_flush", "gd_info", "imagearc",
+ "imageellipse", "imagechar", "imagecharup", "imagecolorat",
+ "imagecolorallocate", "imagepalettecopy", "imagecreatefromstring",
+ "imagecolorclosest", "imagecolordeallocate", "imagecolorresolve",
+ "imagecolorexact", "imagecolorset", "imagecolortransparent",
+ "imagecolorstotal", "imagecolorsforindex", "imagecopy", "imagecopymerge",
+ "imagecopymergegray", "imagecopyresized", "imagecreate",
+ "imagecreatetruecolor", "imageistruecolor", "imagetruecolortopalette",
+ "imagesetthickness", "imagefilledarc", "imagefilledellipse",
+ "imagealphablending", "imagesavealpha", "imagecolorallocatealpha",
+ "imagecolorresolvealpha", "imagecolorclosestalpha", "imagecolorexactalpha",
+ "imagecopyresampled", "imagegrabwindow", "imagegrabscreen", "imagerotate",
+ "imageantialias", "imagesettile", "imagesetbrush", "imagesetstyle",
+ "imagecreatefrompng", "imagecreatefromgif", "imagecreatefromjpeg",
+ "imagecreatefromwbmp", "imagecreatefromxbm", "imagecreatefromgd",
+ "imagecreatefromgd2", "imagecreatefromgd2part", "imagepng", "imagegif",
+ "imagejpeg", "imagewbmp", "imagegd", "imagegd2", "imagedestroy",
+ "imagegammacorrect", "imagefill", "imagefilledpolygon", "imagefilledrectangle",
+ "imagefilltoborder", "imagefontwidth", "imagefontheight", "imageinterlace",
+ "imageline", "imageloadfont", "imagepolygon", "imagerectangle",
+ "imagesetpixel", "imagestring", "imagestringup", "imagesx", "imagesy",
+ "imagedashedline", "imagettfbbox", "imagettftext", "imageftbbox",
+ "imagefttext", "imagepsloadfont", "imagepsfreefont", "imagepsencodefont",
+ "imagepsextendfont", "imagepsslantfont", "imagepstext", "imagepsbbox",
+ "imagetypes", "jpeg2wbmp", "png2wbmp", "image2wbmp", "imagelayereffect",
+ "imagecolormatch", "imagexbm", "imagefilter", "imageconvolution",
+ "mb_convert_case", "mb_strtoupper", "mb_strtolower", "mb_language",
+ "mb_internal_encoding", "mb_http_input", "mb_http_output", "mb_detect_order",
+ "mb_substitute_character", "mb_parse_str", "mb_output_handler",
+ "mb_preferred_mime_name", "mb_strlen", "mb_strpos", "mb_strrpos", "mb_stripos",
+ "mb_strripos", "mb_strstr", "mb_strrchr", "mb_stristr", "mb_strrichr",
+ "mb_substr_count", "mb_substr", "mb_strcut", "mb_strwidth", "mb_strimwidth",
+ "mb_convert_encoding", "mb_detect_encoding", "mb_list_encodings",
+ "mb_convert_kana", "mb_encode_mimeheader", "mb_decode_mimeheader",
+ "mb_convert_variables", "mb_encode_numericentity", "mb_decode_numericentity",
+ "mb_send_mail", "mb_get_info", "mb_check_encoding", "mb_regex_encoding",
+ "mb_regex_set_options", "mb_ereg", "mb_eregi", "mb_ereg_replace",
+ "mb_eregi_replace", "mb_split", "mb_ereg_match", "mb_ereg_search",
+ "mb_ereg_search_pos", "mb_ereg_search_regs", "mb_ereg_search_init",
+ "mb_ereg_search_getregs", "mb_ereg_search_getpos", "mb_ereg_search_setpos",
+ "mbregex_encoding", "mbereg", "mberegi", "mbereg_replace", "mberegi_replace",
+ "mbsplit", "mbereg_match", "mbereg_search", "mbereg_search_pos",
+ "mbereg_search_regs", "mbereg_search_init", "mbereg_search_getregs",
+ "mbereg_search_getpos", "mbereg_search_setpos", "mysql_connect",
+ "mysql_pconnect", "mysql_close", "mysql_select_db", "mysql_query",
+ "mysql_unbuffered_query", "mysql_db_query", "mysql_list_dbs",
+ "mysql_list_tables", "mysql_list_fields", "mysql_list_processes",
+ "mysql_error", "mysql_errno", "mysql_affected_rows", "mysql_insert_id",
+ "mysql_result", "mysql_num_rows", "mysql_num_fields", "mysql_fetch_row",
+ "mysql_fetch_array", "mysql_fetch_assoc", "mysql_fetch_object",
+ "mysql_data_seek", "mysql_fetch_lengths", "mysql_fetch_field",
+ "mysql_field_seek", "mysql_free_result", "mysql_field_name",
+ "mysql_field_table", "mysql_field_len", "mysql_field_type",
+ "mysql_field_flags", "mysql_escape_string", "mysql_real_escape_string",
+ "mysql_stat", "mysql_thread_id", "mysql_client_encoding", "mysql_ping",
+ "mysql_get_client_info", "mysql_get_host_info", "mysql_get_proto_info",
+ "mysql_get_server_info", "mysql_info", "mysql_set_charset", "mysql",
+ "mysql_fieldname", "mysql_fieldtable", "mysql_fieldlen", "mysql_fieldtype",
+ "mysql_fieldflags", "mysql_selectdb", "mysql_freeresult", "mysql_numfields",
+ "mysql_numrows", "mysql_listdbs", "mysql_listtables", "mysql_listfields",
+ "mysql_db_name", "mysql_dbname", "mysql_tablename", "mysql_table_name",
+ "mysqli_affected_rows", "mysqli_autocommit", "mysqli_change_user",
+ "mysqli_character_set_name", "mysqli_close", "mysqli_commit", "mysqli_connect",
+ "mysqli_connect_errno", "mysqli_connect_error", "mysqli_data_seek",
+ "mysqli_debug", "mysqli_disable_reads_from_master", "mysqli_disable_rpl_parse",
+ "mysqli_dump_debug_info", "mysqli_enable_reads_from_master",
+ "mysqli_enable_rpl_parse", "mysqli_embedded_server_end",
+ "mysqli_embedded_server_start", "mysqli_errno", "mysqli_error",
+ "mysqli_stmt_execute", "mysqli_execute", "mysqli_fetch_field",
+ "mysqli_fetch_fields", "mysqli_fetch_field_direct", "mysqli_fetch_lengths",
+ "mysqli_fetch_array", "mysqli_fetch_assoc", "mysqli_fetch_object",
+ "mysqli_fetch_row", "mysqli_field_count", "mysqli_field_seek",
+ "mysqli_field_tell", "mysqli_free_result", "mysqli_get_charset",
+ "mysqli_get_client_info", "mysqli_get_client_version", "mysqli_get_host_info",
+ "mysqli_get_proto_info", "mysqli_get_server_info", "mysqli_get_server_version",
+ "mysqli_get_warnings", "mysqli_init", "mysqli_info", "mysqli_insert_id",
+ "mysqli_kill", "mysqli_set_local_infile_default",
+ "mysqli_set_local_infile_handler", "mysqli_master_query",
+ "mysqli_more_results", "mysqli_multi_query", "mysqli_next_result",
+ "mysqli_num_fields", "mysqli_num_rows", "mysqli_options", "mysqli_ping",
+ "mysqli_prepare", "mysqli_report", "mysqli_query", "mysqli_real_connect",
+ "mysqli_real_escape_string", "mysqli_real_query", "mysqli_rollback",
+ "mysqli_rpl_parse_enabled", "mysqli_rpl_probe", "mysqli_rpl_query_type",
+ "mysqli_select_db", "mysqli_set_charset", "mysqli_stmt_attr_get",
+ "mysqli_stmt_attr_set", "mysqli_stmt_field_count", "mysqli_stmt_init",
+ "mysqli_stmt_prepare", "mysqli_stmt_result_metadata",
+ "mysqli_stmt_send_long_data", "mysqli_stmt_bind_param",
+ "mysqli_stmt_bind_result", "mysqli_stmt_fetch", "mysqli_stmt_free_result",
+ "mysqli_stmt_get_warnings", "mysqli_stmt_insert_id", "mysqli_stmt_reset",
+ "mysqli_stmt_param_count", "mysqli_send_query", "mysqli_slave_query",
+ "mysqli_sqlstate", "mysqli_ssl_set", "mysqli_stat",
+ "mysqli_stmt_affected_rows", "mysqli_stmt_close", "mysqli_stmt_data_seek",
+ "mysqli_stmt_errno", "mysqli_stmt_error", "mysqli_stmt_num_rows",
+ "mysqli_stmt_sqlstate", "mysqli_store_result", "mysqli_stmt_store_result",
+ "mysqli_thread_id", "mysqli_thread_safe", "mysqli_use_result",
+ "mysqli_warning_count", "mysqli_bind_param", "mysqli_bind_result",
+ "mysqli_client_encoding", "mysqli_escape_string", "mysqli_fetch",
+ "mysqli_param_count", "mysqli_get_metadata", "mysqli_send_long_data",
+ "mysqli_set_opt", "pdo_drivers", "socket_select", "socket_create",
+ "socket_create_listen", "socket_accept", "socket_set_nonblock",
+ "socket_set_block", "socket_listen", "socket_close", "socket_write",
+ "socket_read", "socket_getsockname", "socket_getpeername", "socket_connect",
+ "socket_strerror", "socket_bind", "socket_recv", "socket_send",
+ "socket_recvfrom", "socket_sendto", "socket_get_option", "socket_set_option",
+ "socket_shutdown", "socket_last_error", "socket_clear_error", "socket_getopt",
+ "socket_setopt", "eaccelerator_put", "eaccelerator_get", "eaccelerator_rm",
+ "eaccelerator_gc", "eaccelerator_lock", "eaccelerator_unlock",
+ "eaccelerator_caching", "eaccelerator_optimizer", "eaccelerator_clear",
+ "eaccelerator_clean", "eaccelerator_info", "eaccelerator_purge",
+ "eaccelerator_cached_scripts", "eaccelerator_removed_scripts",
+ "eaccelerator_list_keys", "eaccelerator_encode", "eaccelerator_load",
+ "_eaccelerator_loader_file", "_eaccelerator_loader_line",
+ "eaccelerator_set_session_handlers", "_eaccelerator_output_handler",
+ "eaccelerator_cache_page", "eaccelerator_rm_page", "eaccelerator_cache_output",
+ "eaccelerator_cache_result", "xdebug_get_stack_depth",
+ "xdebug_get_function_stack", "xdebug_print_function_stack",
+ "xdebug_get_declared_vars", "xdebug_call_class", "xdebug_call_function",
+ "xdebug_call_file", "xdebug_call_line", "xdebug_var_dump", "xdebug_debug_zval",
+ "xdebug_debug_zval_stdout", "xdebug_enable", "xdebug_disable",
+ "xdebug_is_enabled", "xdebug_break", "xdebug_start_trace", "xdebug_stop_trace",
+ "xdebug_get_tracefile_name", "xdebug_get_profiler_filename",
+ "xdebug_dump_aggr_profiling_data", "xdebug_clear_aggr_profiling_data",
+ "xdebug_memory_usage", "xdebug_peak_memory_usage", "xdebug_time_index",
+ "xdebug_start_error_collection", "xdebug_stop_error_collection",
+ "xdebug_get_collected_errors", "xdebug_start_code_coverage",
+ "xdebug_stop_code_coverage", "xdebug_get_code_coverage",
+ "xdebug_get_function_count", "xdebug_dump_superglobals",
+ "_" // alias for gettext()
+ ].forEach(function(element, index, array) {
+ result[element] = token("t_string", "php-predefined-function");
+ });
+
+ // output of get_defined_constants(). Differs significantly from http://php.net/manual/en/reserved.constants.php
+ [ "E_ERROR", "E_RECOVERABLE_ERROR", "E_WARNING", "E_PARSE", "E_NOTICE",
+ "E_STRICT", "E_CORE_ERROR", "E_CORE_WARNING", "E_COMPILE_ERROR",
+ "E_COMPILE_WARNING", "E_USER_ERROR", "E_USER_WARNING", "E_USER_NOTICE",
+ "E_ALL", "TRUE", "FALSE", "NULL", "ZEND_THREAD_SAFE", "PHP_VERSION", "PHP_OS",
+ "PHP_SAPI", "DEFAULT_INCLUDE_PATH", "PEAR_INSTALL_DIR", "PEAR_EXTENSION_DIR",
+ "PHP_EXTENSION_DIR", "PHP_PREFIX", "PHP_BINDIR", "PHP_LIBDIR", "PHP_DATADIR",
+ "PHP_SYSCONFDIR", "PHP_LOCALSTATEDIR", "PHP_CONFIG_FILE_PATH",
+ "PHP_CONFIG_FILE_SCAN_DIR", "PHP_SHLIB_SUFFIX", "PHP_EOL", "PHP_EOL",
+ "PHP_INT_MAX", "PHP_INT_SIZE", "PHP_OUTPUT_HANDLER_START",
+ "PHP_OUTPUT_HANDLER_CONT", "PHP_OUTPUT_HANDLER_END", "UPLOAD_ERR_OK",
+ "UPLOAD_ERR_INI_SIZE", "UPLOAD_ERR_FORM_SIZE", "UPLOAD_ERR_PARTIAL",
+ "UPLOAD_ERR_NO_FILE", "UPLOAD_ERR_NO_TMP_DIR", "UPLOAD_ERR_CANT_WRITE",
+ "UPLOAD_ERR_EXTENSION", "CAL_GREGORIAN", "CAL_JULIAN", "CAL_JEWISH",
+ "CAL_FRENCH", "CAL_NUM_CALS", "CAL_DOW_DAYNO", "CAL_DOW_SHORT", "CAL_DOW_LONG",
+ "CAL_MONTH_GREGORIAN_SHORT", "CAL_MONTH_GREGORIAN_LONG",
+ "CAL_MONTH_JULIAN_SHORT", "CAL_MONTH_JULIAN_LONG", "CAL_MONTH_JEWISH",
+ "CAL_MONTH_FRENCH", "CAL_EASTER_DEFAULT", "CAL_EASTER_ROMAN",
+ "CAL_EASTER_ALWAYS_GREGORIAN", "CAL_EASTER_ALWAYS_JULIAN",
+ "CAL_JEWISH_ADD_ALAFIM_GERESH", "CAL_JEWISH_ADD_ALAFIM",
+ "CAL_JEWISH_ADD_GERESHAYIM", "CLSCTX_INPROC_SERVER", "CLSCTX_INPROC_HANDLER",
+ "CLSCTX_LOCAL_SERVER", "CLSCTX_REMOTE_SERVER", "CLSCTX_SERVER", "CLSCTX_ALL",
+ "VT_NULL", "VT_EMPTY", "VT_UI1", "VT_I1", "VT_UI2", "VT_I2", "VT_UI4", "VT_I4",
+ "VT_R4", "VT_R8", "VT_BOOL", "VT_ERROR", "VT_CY", "VT_DATE", "VT_BSTR",
+ "VT_DECIMAL", "VT_UNKNOWN", "VT_DISPATCH", "VT_VARIANT", "VT_INT", "VT_UINT",
+ "VT_ARRAY", "VT_BYREF", "CP_ACP", "CP_MACCP", "CP_OEMCP", "CP_UTF7", "CP_UTF8",
+ "CP_SYMBOL", "CP_THREAD_ACP", "VARCMP_LT", "VARCMP_EQ", "VARCMP_GT",
+ "VARCMP_NULL", "NORM_IGNORECASE", "NORM_IGNORENONSPACE", "NORM_IGNORESYMBOLS",
+ "NORM_IGNOREWIDTH", "NORM_IGNOREKANATYPE", "DISP_E_DIVBYZERO",
+ "DISP_E_OVERFLOW", "DISP_E_BADINDEX", "MK_E_UNAVAILABLE", "INPUT_POST",
+ "INPUT_GET", "INPUT_COOKIE", "INPUT_ENV", "INPUT_SERVER", "INPUT_SESSION",
+ "INPUT_REQUEST", "FILTER_FLAG_NONE", "FILTER_REQUIRE_SCALAR",
+ "FILTER_REQUIRE_ARRAY", "FILTER_FORCE_ARRAY", "FILTER_NULL_ON_FAILURE",
+ "FILTER_VALIDATE_INT", "FILTER_VALIDATE_BOOLEAN", "FILTER_VALIDATE_FLOAT",
+ "FILTER_VALIDATE_REGEXP", "FILTER_VALIDATE_URL", "FILTER_VALIDATE_EMAIL",
+ "FILTER_VALIDATE_IP", "FILTER_DEFAULT", "FILTER_UNSAFE_RAW",
+ "FILTER_SANITIZE_STRING", "FILTER_SANITIZE_STRIPPED",
+ "FILTER_SANITIZE_ENCODED", "FILTER_SANITIZE_SPECIAL_CHARS",
+ "FILTER_SANITIZE_EMAIL", "FILTER_SANITIZE_URL", "FILTER_SANITIZE_NUMBER_INT",
+ "FILTER_SANITIZE_NUMBER_FLOAT", "FILTER_SANITIZE_MAGIC_QUOTES",
+ "FILTER_CALLBACK", "FILTER_FLAG_ALLOW_OCTAL", "FILTER_FLAG_ALLOW_HEX",
+ "FILTER_FLAG_STRIP_LOW", "FILTER_FLAG_STRIP_HIGH", "FILTER_FLAG_ENCODE_LOW",
+ "FILTER_FLAG_ENCODE_HIGH", "FILTER_FLAG_ENCODE_AMP",
+ "FILTER_FLAG_NO_ENCODE_QUOTES", "FILTER_FLAG_EMPTY_STRING_NULL",
+ "FILTER_FLAG_ALLOW_FRACTION", "FILTER_FLAG_ALLOW_THOUSAND",
+ "FILTER_FLAG_ALLOW_SCIENTIFIC", "FILTER_FLAG_SCHEME_REQUIRED",
+ "FILTER_FLAG_HOST_REQUIRED", "FILTER_FLAG_PATH_REQUIRED",
+ "FILTER_FLAG_QUERY_REQUIRED", "FILTER_FLAG_IPV4", "FILTER_FLAG_IPV6",
+ "FILTER_FLAG_NO_RES_RANGE", "FILTER_FLAG_NO_PRIV_RANGE", "FTP_ASCII",
+ "FTP_TEXT", "FTP_BINARY", "FTP_IMAGE", "FTP_AUTORESUME", "FTP_TIMEOUT_SEC",
+ "FTP_AUTOSEEK", "FTP_FAILED", "FTP_FINISHED", "FTP_MOREDATA", "HASH_HMAC",
+ "ICONV_IMPL", "ICONV_VERSION", "ICONV_MIME_DECODE_STRICT",
+ "ICONV_MIME_DECODE_CONTINUE_ON_ERROR", "ODBC_TYPE", "ODBC_BINMODE_PASSTHRU",
+ "ODBC_BINMODE_RETURN", "ODBC_BINMODE_CONVERT", "SQL_ODBC_CURSORS",
+ "SQL_CUR_USE_DRIVER", "SQL_CUR_USE_IF_NEEDED", "SQL_CUR_USE_ODBC",
+ "SQL_CONCURRENCY", "SQL_CONCUR_READ_ONLY", "SQL_CONCUR_LOCK",
+ "SQL_CONCUR_ROWVER", "SQL_CONCUR_VALUES", "SQL_CURSOR_TYPE",
+ "SQL_CURSOR_FORWARD_ONLY", "SQL_CURSOR_KEYSET_DRIVEN", "SQL_CURSOR_DYNAMIC",
+ "SQL_CURSOR_STATIC", "SQL_KEYSET_SIZE", "SQL_FETCH_FIRST", "SQL_FETCH_NEXT",
+ "SQL_CHAR", "SQL_VARCHAR", "SQL_LONGVARCHAR", "SQL_DECIMAL", "SQL_NUMERIC",
+ "SQL_BIT", "SQL_TINYINT", "SQL_SMALLINT", "SQL_INTEGER", "SQL_BIGINT",
+ "SQL_REAL", "SQL_FLOAT", "SQL_DOUBLE", "SQL_BINARY", "SQL_VARBINARY",
+ "SQL_LONGVARBINARY", "SQL_DATE", "SQL_TIME", "SQL_TIMESTAMP",
+ "PREG_PATTERN_ORDER", "PREG_SET_ORDER", "PREG_OFFSET_CAPTURE",
+ "PREG_SPLIT_NO_EMPTY", "PREG_SPLIT_DELIM_CAPTURE", "PREG_SPLIT_OFFSET_CAPTURE",
+ "PREG_GREP_INVERT", "PREG_NO_ERROR", "PREG_INTERNAL_ERROR",
+ "PREG_BACKTRACK_LIMIT_ERROR", "PREG_RECURSION_LIMIT_ERROR",
+ "PREG_BAD_UTF8_ERROR", "DATE_ATOM", "DATE_COOKIE", "DATE_ISO8601",
+ "DATE_RFC822", "DATE_RFC850", "DATE_RFC1036", "DATE_RFC1123", "DATE_RFC2822",
+ "DATE_RFC3339", "DATE_RSS", "DATE_W3C", "SUNFUNCS_RET_TIMESTAMP",
+ "SUNFUNCS_RET_STRING", "SUNFUNCS_RET_DOUBLE", "LIBXML_VERSION",
+ "LIBXML_DOTTED_VERSION", "LIBXML_NOENT", "LIBXML_DTDLOAD", "LIBXML_DTDATTR",
+ "LIBXML_DTDVALID", "LIBXML_NOERROR", "LIBXML_NOWARNING", "LIBXML_NOBLANKS",
+ "LIBXML_XINCLUDE", "LIBXML_NSCLEAN", "LIBXML_NOCDATA", "LIBXML_NONET",
+ "LIBXML_COMPACT", "LIBXML_NOXMLDECL", "LIBXML_NOEMPTYTAG", "LIBXML_ERR_NONE",
+ "LIBXML_ERR_WARNING", "LIBXML_ERR_ERROR", "LIBXML_ERR_FATAL",
+ "CONNECTION_ABORTED", "CONNECTION_NORMAL", "CONNECTION_TIMEOUT", "INI_USER",
+ "INI_PERDIR", "INI_SYSTEM", "INI_ALL", "PHP_URL_SCHEME", "PHP_URL_HOST",
+ "PHP_URL_PORT", "PHP_URL_USER", "PHP_URL_PASS", "PHP_URL_PATH",
+ "PHP_URL_QUERY", "PHP_URL_FRAGMENT", "M_E", "M_LOG2E", "M_LOG10E", "M_LN2",
+ "M_LN10", "M_PI", "M_PI_2", "M_PI_4", "M_1_PI", "M_2_PI", "M_SQRTPI",
+ "M_2_SQRTPI", "M_LNPI", "M_EULER", "M_SQRT2", "M_SQRT1_2", "M_SQRT3", "INF",
+ "NAN", "INFO_GENERAL", "INFO_CREDITS", "INFO_CONFIGURATION", "INFO_MODULES",
+ "INFO_ENVIRONMENT", "INFO_VARIABLES", "INFO_LICENSE", "INFO_ALL",
+ "CREDITS_GROUP", "CREDITS_GENERAL", "CREDITS_SAPI", "CREDITS_MODULES",
+ "CREDITS_DOCS", "CREDITS_FULLPAGE", "CREDITS_QA", "CREDITS_ALL",
+ "HTML_SPECIALCHARS", "HTML_ENTITIES", "ENT_COMPAT", "ENT_QUOTES",
+ "ENT_NOQUOTES", "STR_PAD_LEFT", "STR_PAD_RIGHT", "STR_PAD_BOTH",
+ "PATHINFO_DIRNAME", "PATHINFO_BASENAME", "PATHINFO_EXTENSION",
+ "PATHINFO_FILENAME", "CHAR_MAX", "LC_CTYPE", "LC_NUMERIC", "LC_TIME",
+ "LC_COLLATE", "LC_MONETARY", "LC_ALL", "SEEK_SET", "SEEK_CUR", "SEEK_END",
+ "LOCK_SH", "LOCK_EX", "LOCK_UN", "LOCK_NB", "STREAM_NOTIFY_CONNECT",
+ "STREAM_NOTIFY_AUTH_REQUIRED", "STREAM_NOTIFY_AUTH_RESULT",
+ "STREAM_NOTIFY_MIME_TYPE_IS", "STREAM_NOTIFY_FILE_SIZE_IS",
+ "STREAM_NOTIFY_REDIRECTED", "STREAM_NOTIFY_PROGRESS", "STREAM_NOTIFY_FAILURE",
+ "STREAM_NOTIFY_COMPLETED", "STREAM_NOTIFY_RESOLVE",
+ "STREAM_NOTIFY_SEVERITY_INFO", "STREAM_NOTIFY_SEVERITY_WARN",
+ "STREAM_NOTIFY_SEVERITY_ERR", "STREAM_FILTER_READ", "STREAM_FILTER_WRITE",
+ "STREAM_FILTER_ALL", "STREAM_CLIENT_PERSISTENT", "STREAM_CLIENT_ASYNC_CONNECT",
+ "STREAM_CLIENT_CONNECT", "STREAM_CRYPTO_METHOD_SSLv2_CLIENT",
+ "STREAM_CRYPTO_METHOD_SSLv3_CLIENT", "STREAM_CRYPTO_METHOD_SSLv23_CLIENT",
+ "STREAM_CRYPTO_METHOD_TLS_CLIENT", "STREAM_CRYPTO_METHOD_SSLv2_SERVER",
+ "STREAM_CRYPTO_METHOD_SSLv3_SERVER", "STREAM_CRYPTO_METHOD_SSLv23_SERVER",
+ "STREAM_CRYPTO_METHOD_TLS_SERVER", "STREAM_SHUT_RD", "STREAM_SHUT_WR",
+ "STREAM_SHUT_RDWR", "STREAM_PF_INET", "STREAM_PF_INET6", "STREAM_PF_UNIX",
+ "STREAM_IPPROTO_IP", "STREAM_IPPROTO_TCP", "STREAM_IPPROTO_UDP",
+ "STREAM_IPPROTO_ICMP", "STREAM_IPPROTO_RAW", "STREAM_SOCK_STREAM",
+ "STREAM_SOCK_DGRAM", "STREAM_SOCK_RAW", "STREAM_SOCK_SEQPACKET",
+ "STREAM_SOCK_RDM", "STREAM_PEEK", "STREAM_OOB", "STREAM_SERVER_BIND",
+ "STREAM_SERVER_LISTEN", "FILE_USE_INCLUDE_PATH", "FILE_IGNORE_NEW_LINES",
+ "FILE_SKIP_EMPTY_LINES", "FILE_APPEND", "FILE_NO_DEFAULT_CONTEXT",
+ "PSFS_PASS_ON", "PSFS_FEED_ME", "PSFS_ERR_FATAL", "PSFS_FLAG_NORMAL",
+ "PSFS_FLAG_FLUSH_INC", "PSFS_FLAG_FLUSH_CLOSE", "CRYPT_SALT_LENGTH",
+ "CRYPT_STD_DES", "CRYPT_EXT_DES", "CRYPT_MD5", "CRYPT_BLOWFISH",
+ "DIRECTORY_SEPARATOR", "PATH_SEPARATOR", "GLOB_BRACE", "GLOB_MARK",
+ "GLOB_NOSORT", "GLOB_NOCHECK", "GLOB_NOESCAPE", "GLOB_ERR", "GLOB_ONLYDIR",
+ "LOG_EMERG", "LOG_ALERT", "LOG_CRIT", "LOG_ERR", "LOG_WARNING", "LOG_NOTICE",
+ "LOG_INFO", "LOG_DEBUG", "LOG_KERN", "LOG_USER", "LOG_MAIL", "LOG_DAEMON",
+ "LOG_AUTH", "LOG_SYSLOG", "LOG_LPR", "LOG_NEWS", "LOG_UUCP", "LOG_CRON",
+ "LOG_AUTHPRIV", "LOG_PID", "LOG_CONS", "LOG_ODELAY", "LOG_NDELAY",
+ "LOG_NOWAIT", "LOG_PERROR", "EXTR_OVERWRITE", "EXTR_SKIP", "EXTR_PREFIX_SAME",
+ "EXTR_PREFIX_ALL", "EXTR_PREFIX_INVALID", "EXTR_PREFIX_IF_EXISTS",
+ "EXTR_IF_EXISTS", "EXTR_REFS", "SORT_ASC", "SORT_DESC", "SORT_REGULAR",
+ "SORT_NUMERIC", "SORT_STRING", "SORT_LOCALE_STRING", "CASE_LOWER",
+ "CASE_UPPER", "COUNT_NORMAL", "COUNT_RECURSIVE", "ASSERT_ACTIVE",
+ "ASSERT_CALLBACK", "ASSERT_BAIL", "ASSERT_WARNING", "ASSERT_QUIET_EVAL",
+ "STREAM_USE_PATH", "STREAM_IGNORE_URL", "STREAM_ENFORCE_SAFE_MODE",
+ "STREAM_REPORT_ERRORS", "STREAM_MUST_SEEK", "STREAM_URL_STAT_LINK",
+ "STREAM_URL_STAT_QUIET", "STREAM_MKDIR_RECURSIVE", "IMAGETYPE_GIF",
+ "IMAGETYPE_JPEG", "IMAGETYPE_PNG", "IMAGETYPE_SWF", "IMAGETYPE_PSD",
+ "IMAGETYPE_BMP", "IMAGETYPE_TIFF_II", "IMAGETYPE_TIFF_MM", "IMAGETYPE_JPC",
+ "IMAGETYPE_JP2", "IMAGETYPE_JPX", "IMAGETYPE_JB2", "IMAGETYPE_SWC",
+ "IMAGETYPE_IFF", "IMAGETYPE_WBMP", "IMAGETYPE_JPEG2000", "IMAGETYPE_XBM",
+ "T_INCLUDE", "T_INCLUDE_ONCE", "T_EVAL", "T_REQUIRE", "T_REQUIRE_ONCE",
+ "T_LOGICAL_OR", "T_LOGICAL_XOR", "T_LOGICAL_AND", "T_PRINT", "T_PLUS_EQUAL",
+ "T_MINUS_EQUAL", "T_MUL_EQUAL", "T_DIV_EQUAL", "T_CONCAT_EQUAL", "T_MOD_EQUAL",
+ "T_AND_EQUAL", "T_OR_EQUAL", "T_XOR_EQUAL", "T_SL_EQUAL", "T_SR_EQUAL",
+ "T_BOOLEAN_OR", "T_BOOLEAN_AND", "T_IS_EQUAL", "T_IS_NOT_EQUAL",
+ "T_IS_IDENTICAL", "T_IS_NOT_IDENTICAL", "T_IS_SMALLER_OR_EQUAL",
+ "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "T_INC", "T_DEC", "T_INT_CAST",
+ "T_DOUBLE_CAST", "T_STRING_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST",
+ "T_BOOL_CAST", "T_UNSET_CAST", "T_NEW", "T_EXIT", "T_IF", "T_ELSEIF", "T_ELSE",
+ "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", "T_STRING_VARNAME",
+ "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", "T_CHARACTER",
+ "T_BAD_CHARACTER", "T_ENCAPSED_AND_WHITESPACE", "T_CONSTANT_ENCAPSED_STRING",
+ "T_ECHO", "T_DO", "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH",
+ "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", "T_ENDSWITCH",
+ "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_FUNCTION", "T_CONST",
+ "T_RETURN", "T_USE", "T_GLOBAL", "T_STATIC", "T_VAR", "T_UNSET", "T_ISSET",
+ "T_EMPTY", "T_CLASS", "T_EXTENDS", "T_INTERFACE", "T_IMPLEMENTS",
+ "T_OBJECT_OPERATOR", "T_DOUBLE_ARROW", "T_LIST", "T_ARRAY", "T_CLASS_C",
+ "T_FUNC_C", "T_METHOD_C", "T_LINE", "T_FILE", "T_COMMENT", "T_DOC_COMMENT",
+ "T_OPEN_TAG", "T_OPEN_TAG_WITH_ECHO", "T_CLOSE_TAG", "T_WHITESPACE",
+ "T_START_HEREDOC", "T_END_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES",
+ "T_CURLY_OPEN", "T_PAAMAYIM_NEKUDOTAYIM", "T_DOUBLE_COLON", "T_ABSTRACT",
+ "T_CATCH", "T_FINAL", "T_INSTANCEOF", "T_PRIVATE", "T_PROTECTED", "T_PUBLIC",
+ "T_THROW", "T_TRY", "T_CLONE", "T_HALT_COMPILER", "FORCE_GZIP",
+ "FORCE_DEFLATE", "XML_ELEMENT_NODE", "XML_ATTRIBUTE_NODE", "XML_TEXT_NODE",
+ "XML_CDATA_SECTION_NODE", "XML_ENTITY_REF_NODE", "XML_ENTITY_NODE",
+ "XML_PI_NODE", "XML_COMMENT_NODE", "XML_DOCUMENT_NODE",
+ "XML_DOCUMENT_TYPE_NODE", "XML_DOCUMENT_FRAG_NODE", "XML_NOTATION_NODE",
+ "XML_HTML_DOCUMENT_NODE", "XML_DTD_NODE", "XML_ELEMENT_DECL_NODE",
+ "XML_ATTRIBUTE_DECL_NODE", "XML_ENTITY_DECL_NODE", "XML_NAMESPACE_DECL_NODE",
+ "XML_LOCAL_NAMESPACE", "XML_ATTRIBUTE_CDATA", "XML_ATTRIBUTE_ID",
+ "XML_ATTRIBUTE_IDREF", "XML_ATTRIBUTE_IDREFS", "XML_ATTRIBUTE_ENTITY",
+ "XML_ATTRIBUTE_NMTOKEN", "XML_ATTRIBUTE_NMTOKENS", "XML_ATTRIBUTE_ENUMERATION",
+ "XML_ATTRIBUTE_NOTATION", "DOM_PHP_ERR", "DOM_INDEX_SIZE_ERR",
+ "DOMSTRING_SIZE_ERR", "DOM_HIERARCHY_REQUEST_ERR", "DOM_WRONG_DOCUMENT_ERR",
+ "DOM_INVALID_CHARACTER_ERR", "DOM_NO_DATA_ALLOWED_ERR",
+ "DOM_NO_MODIFICATION_ALLOWED_ERR", "DOM_NOT_FOUND_ERR",
+ "DOM_NOT_SUPPORTED_ERR", "DOM_INUSE_ATTRIBUTE_ERR", "DOM_INVALID_STATE_ERR",
+ "DOM_SYNTAX_ERR", "DOM_INVALID_MODIFICATION_ERR", "DOM_NAMESPACE_ERR",
+ "DOM_INVALID_ACCESS_ERR", "DOM_VALIDATION_ERR", "XML_ERROR_NONE",
+ "XML_ERROR_NO_MEMORY", "XML_ERROR_SYNTAX", "XML_ERROR_NO_ELEMENTS",
+ "XML_ERROR_INVALID_TOKEN", "XML_ERROR_UNCLOSED_TOKEN",
+ "XML_ERROR_PARTIAL_CHAR", "XML_ERROR_TAG_MISMATCH",
+ "XML_ERROR_DUPLICATE_ATTRIBUTE", "XML_ERROR_JUNK_AFTER_DOC_ELEMENT",
+ "XML_ERROR_PARAM_ENTITY_REF", "XML_ERROR_UNDEFINED_ENTITY",
+ "XML_ERROR_RECURSIVE_ENTITY_REF", "XML_ERROR_ASYNC_ENTITY",
+ "XML_ERROR_BAD_CHAR_REF", "XML_ERROR_BINARY_ENTITY_REF",
+ "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF", "XML_ERROR_MISPLACED_XML_PI",
+ "XML_ERROR_UNKNOWN_ENCODING", "XML_ERROR_INCORRECT_ENCODING",
+ "XML_ERROR_UNCLOSED_CDATA_SECTION", "XML_ERROR_EXTERNAL_ENTITY_HANDLING",
+ "XML_OPTION_CASE_FOLDING", "XML_OPTION_TARGET_ENCODING",
+ "XML_OPTION_SKIP_TAGSTART", "XML_OPTION_SKIP_WHITE", "XML_SAX_IMPL", "IMG_GIF",
+ "IMG_JPG", "IMG_JPEG", "IMG_PNG", "IMG_WBMP", "IMG_XPM", "IMG_COLOR_TILED",
+ "IMG_COLOR_STYLED", "IMG_COLOR_BRUSHED", "IMG_COLOR_STYLEDBRUSHED",
+ "IMG_COLOR_TRANSPARENT", "IMG_ARC_ROUNDED", "IMG_ARC_PIE", "IMG_ARC_CHORD",
+ "IMG_ARC_NOFILL", "IMG_ARC_EDGED", "IMG_GD2_RAW", "IMG_GD2_COMPRESSED",
+ "IMG_EFFECT_REPLACE", "IMG_EFFECT_ALPHABLEND", "IMG_EFFECT_NORMAL",
+ "IMG_EFFECT_OVERLAY", "GD_BUNDLED", "IMG_FILTER_NEGATE",
+ "IMG_FILTER_GRAYSCALE", "IMG_FILTER_BRIGHTNESS", "IMG_FILTER_CONTRAST",
+ "IMG_FILTER_COLORIZE", "IMG_FILTER_EDGEDETECT", "IMG_FILTER_GAUSSIAN_BLUR",
+ "IMG_FILTER_SELECTIVE_BLUR", "IMG_FILTER_EMBOSS", "IMG_FILTER_MEAN_REMOVAL",
+ "IMG_FILTER_SMOOTH", "PNG_NO_FILTER", "PNG_FILTER_NONE", "PNG_FILTER_SUB",
+ "PNG_FILTER_UP", "PNG_FILTER_AVG", "PNG_FILTER_PAETH", "PNG_ALL_FILTERS",
+ "MB_OVERLOAD_MAIL", "MB_OVERLOAD_STRING", "MB_OVERLOAD_REGEX", "MB_CASE_UPPER",
+ "MB_CASE_LOWER", "MB_CASE_TITLE", "MYSQL_ASSOC", "MYSQL_NUM", "MYSQL_BOTH",
+ "MYSQL_CLIENT_COMPRESS", "MYSQL_CLIENT_SSL", "MYSQL_CLIENT_INTERACTIVE",
+ "MYSQL_CLIENT_IGNORE_SPACE", "MYSQLI_READ_DEFAULT_GROUP",
+ "MYSQLI_READ_DEFAULT_FILE", "MYSQLI_OPT_CONNECT_TIMEOUT",
+ "MYSQLI_OPT_LOCAL_INFILE", "MYSQLI_INIT_COMMAND", "MYSQLI_CLIENT_SSL",
+ "MYSQLI_CLIENT_COMPRESS", "MYSQLI_CLIENT_INTERACTIVE",
+ "MYSQLI_CLIENT_IGNORE_SPACE", "MYSQLI_CLIENT_NO_SCHEMA",
+ "MYSQLI_CLIENT_FOUND_ROWS", "MYSQLI_STORE_RESULT", "MYSQLI_USE_RESULT",
+ "MYSQLI_ASSOC", "MYSQLI_NUM", "MYSQLI_BOTH",
+ "MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH", "MYSQLI_STMT_ATTR_CURSOR_TYPE",
+ "MYSQLI_CURSOR_TYPE_NO_CURSOR", "MYSQLI_CURSOR_TYPE_READ_ONLY",
+ "MYSQLI_CURSOR_TYPE_FOR_UPDATE", "MYSQLI_CURSOR_TYPE_SCROLLABLE",
+ "MYSQLI_STMT_ATTR_PREFETCH_ROWS", "MYSQLI_NOT_NULL_FLAG",
+ "MYSQLI_PRI_KEY_FLAG", "MYSQLI_UNIQUE_KEY_FLAG", "MYSQLI_MULTIPLE_KEY_FLAG",
+ "MYSQLI_BLOB_FLAG", "MYSQLI_UNSIGNED_FLAG", "MYSQLI_ZEROFILL_FLAG",
+ "MYSQLI_AUTO_INCREMENT_FLAG", "MYSQLI_TIMESTAMP_FLAG", "MYSQLI_SET_FLAG",
+ "MYSQLI_NUM_FLAG", "MYSQLI_PART_KEY_FLAG", "MYSQLI_GROUP_FLAG",
+ "MYSQLI_TYPE_DECIMAL", "MYSQLI_TYPE_TINY", "MYSQLI_TYPE_SHORT",
+ "MYSQLI_TYPE_LONG", "MYSQLI_TYPE_FLOAT", "MYSQLI_TYPE_DOUBLE",
+ "MYSQLI_TYPE_NULL", "MYSQLI_TYPE_TIMESTAMP", "MYSQLI_TYPE_LONGLONG",
+ "MYSQLI_TYPE_INT24", "MYSQLI_TYPE_DATE", "MYSQLI_TYPE_TIME",
+ "MYSQLI_TYPE_DATETIME", "MYSQLI_TYPE_YEAR", "MYSQLI_TYPE_NEWDATE",
+ "MYSQLI_TYPE_ENUM", "MYSQLI_TYPE_SET", "MYSQLI_TYPE_TINY_BLOB",
+ "MYSQLI_TYPE_MEDIUM_BLOB", "MYSQLI_TYPE_LONG_BLOB", "MYSQLI_TYPE_BLOB",
+ "MYSQLI_TYPE_VAR_STRING", "MYSQLI_TYPE_STRING", "MYSQLI_TYPE_CHAR",
+ "MYSQLI_TYPE_INTERVAL", "MYSQLI_TYPE_GEOMETRY", "MYSQLI_TYPE_NEWDECIMAL",
+ "MYSQLI_TYPE_BIT", "MYSQLI_RPL_MASTER", "MYSQLI_RPL_SLAVE", "MYSQLI_RPL_ADMIN",
+ "MYSQLI_NO_DATA", "MYSQLI_DATA_TRUNCATED", "MYSQLI_REPORT_INDEX",
+ "MYSQLI_REPORT_ERROR", "MYSQLI_REPORT_STRICT", "MYSQLI_REPORT_ALL",
+ "MYSQLI_REPORT_OFF", "AF_UNIX", "AF_INET", "AF_INET6", "SOCK_STREAM",
+ "SOCK_DGRAM", "SOCK_RAW", "SOCK_SEQPACKET", "SOCK_RDM", "MSG_OOB",
+ "MSG_WAITALL", "MSG_PEEK", "MSG_DONTROUTE", "SO_DEBUG", "SO_REUSEADDR",
+ "SO_KEEPALIVE", "SO_DONTROUTE", "SO_LINGER", "SO_BROADCAST", "SO_OOBINLINE",
+ "SO_SNDBUF", "SO_RCVBUF", "SO_SNDLOWAT", "SO_RCVLOWAT", "SO_SNDTIMEO",
+ "SO_RCVTIMEO", "SO_TYPE", "SO_ERROR", "SOL_SOCKET", "SOMAXCONN",
+ "PHP_NORMAL_READ", "PHP_BINARY_READ", "SOCKET_EINTR", "SOCKET_EBADF",
+ "SOCKET_EACCES", "SOCKET_EFAULT", "SOCKET_EINVAL", "SOCKET_EMFILE",
+ "SOCKET_EWOULDBLOCK", "SOCKET_EINPROGRESS", "SOCKET_EALREADY",
+ "SOCKET_ENOTSOCK", "SOCKET_EDESTADDRREQ", "SOCKET_EMSGSIZE",
+ "SOCKET_EPROTOTYPE", "SOCKET_ENOPROTOOPT", "SOCKET_EPROTONOSUPPORT",
+ "SOCKET_ESOCKTNOSUPPORT", "SOCKET_EOPNOTSUPP", "SOCKET_EPFNOSUPPORT",
+ "SOCKET_EAFNOSUPPORT", "SOCKET_EADDRINUSE", "SOCKET_EADDRNOTAVAIL",
+ "SOCKET_ENETDOWN", "SOCKET_ENETUNREACH", "SOCKET_ENETRESET",
+ "SOCKET_ECONNABORTED", "SOCKET_ECONNRESET", "SOCKET_ENOBUFS", "SOCKET_EISCONN",
+ "SOCKET_ENOTCONN", "SOCKET_ESHUTDOWN", "SOCKET_ETOOMANYREFS",
+ "SOCKET_ETIMEDOUT", "SOCKET_ECONNREFUSED", "SOCKET_ELOOP",
+ "SOCKET_ENAMETOOLONG", "SOCKET_EHOSTDOWN", "SOCKET_EHOSTUNREACH",
+ "SOCKET_ENOTEMPTY", "SOCKET_EPROCLIM", "SOCKET_EUSERS", "SOCKET_EDQUOT",
+ "SOCKET_ESTALE", "SOCKET_EREMOTE", "SOCKET_EDISCON", "SOCKET_SYSNOTREADY",
+ "SOCKET_VERNOTSUPPORTED", "SOCKET_NOTINITIALISED", "SOCKET_HOST_NOT_FOUND",
+ "SOCKET_TRY_AGAIN", "SOCKET_NO_RECOVERY", "SOCKET_NO_DATA",
+ "SOCKET_NO_ADDRESS", "SOL_TCP", "SOL_UDP", "EACCELERATOR_VERSION",
+ "EACCELERATOR_SHM_AND_DISK", "EACCELERATOR_SHM", "EACCELERATOR_SHM_ONLY",
+ "EACCELERATOR_DISK_ONLY", "EACCELERATOR_NONE", "XDEBUG_TRACE_APPEND",
+ "XDEBUG_TRACE_COMPUTERIZED", "XDEBUG_TRACE_HTML", "XDEBUG_CC_UNUSED",
+ "XDEBUG_CC_DEAD_CODE", "STDIN", "STDOUT", "STDERR",
+ ].forEach(function(element, index, array) {
+ result[element] = token("atom", "php-predefined-constant");
+ });
+
+ // PHP declared classes - output of get_declared_classes(). Differs from http://php.net/manual/en/reserved.classes.php
+ [ "stdClass", "Exception", "ErrorException", "COMPersistHelper", "com_exception",
+ "com_safearray_proxy", "variant", "com", "dotnet", "ReflectionException",
+ "Reflection", "ReflectionFunctionAbstract", "ReflectionFunction",
+ "ReflectionParameter", "ReflectionMethod", "ReflectionClass",
+ "ReflectionObject", "ReflectionProperty", "ReflectionExtension", "DateTime",
+ "DateTimeZone", "LibXMLError", "__PHP_Incomplete_Class", "php_user_filter",
+ "Directory", "SimpleXMLElement", "DOMException", "DOMStringList",
+ "DOMNameList", "DOMImplementationList", "DOMImplementationSource",
+ "DOMImplementation", "DOMNode", "DOMNameSpaceNode", "DOMDocumentFragment",
+ "DOMDocument", "DOMNodeList", "DOMNamedNodeMap", "DOMCharacterData", "DOMAttr",
+ "DOMElement", "DOMText", "DOMComment", "DOMTypeinfo", "DOMUserDataHandler",
+ "DOMDomError", "DOMErrorHandler", "DOMLocator", "DOMConfiguration",
+ "DOMCdataSection", "DOMDocumentType", "DOMNotation", "DOMEntity",
+ "DOMEntityReference", "DOMProcessingInstruction", "DOMStringExtend",
+ "DOMXPath", "RecursiveIteratorIterator", "IteratorIterator", "FilterIterator",
+ "RecursiveFilterIterator", "ParentIterator", "LimitIterator",
+ "CachingIterator", "RecursiveCachingIterator", "NoRewindIterator",
+ "AppendIterator", "InfiniteIterator", "RegexIterator",
+ "RecursiveRegexIterator", "EmptyIterator", "ArrayObject", "ArrayIterator",
+ "RecursiveArrayIterator", "SplFileInfo", "DirectoryIterator",
+ "RecursiveDirectoryIterator", "SplFileObject", "SplTempFileObject",
+ "SimpleXMLIterator", "LogicException", "BadFunctionCallException",
+ "BadMethodCallException", "DomainException", "InvalidArgumentException",
+ "LengthException", "OutOfRangeException", "RuntimeException",
+ "OutOfBoundsException", "OverflowException", "RangeException",
+ "UnderflowException", "UnexpectedValueException", "SplObjectStorage",
+ "XMLReader", "XMLWriter", "mysqli_sql_exception", "mysqli_driver", "mysqli",
+ "mysqli_warning", "mysqli_result", "mysqli_stmt", "PDOException", "PDO",
+ "PDOStatement", "PDORow"
+ ].forEach(function(element, index, array) {
+ result[element] = token("t_string", "php-predefined-class");
+ });
+
+ return result;
+
+ }();
+
+ // Helper regexps
+ var isOperatorChar = /[+*&%\/=<>!?.|-]/;
+ var isHexDigit = /[0-9A-Fa-f]/;
+ var isWordChar = /[\w\$_]/;
+
+ // Wrapper around phpToken that helps maintain parser state (whether
+ // we are inside of a multi-line comment)
+ function phpTokenState(inside) {
+ return function(source, setState) {
+ var newInside = inside;
+ var type = phpToken(inside, source, function(c) {newInside = c;});
+ if (newInside != inside)
+ setState(phpTokenState(newInside));
+ return type;
+ };
+ }
+
+ // The token reader, inteded to be used by the tokenizer from
+ // tokenize.js (through phpTokenState). Advances the source stream
+ // over a token, and returns an object containing the type and style
+ // of that token.
+ function phpToken(inside, source, setInside) {
+ function readHexNumber(){
+ source.next(); // skip the 'x'
+ source.nextWhileMatches(isHexDigit);
+ return {type: "number", style: "php-atom"};
+ }
+
+ function readNumber() {
+ source.nextWhileMatches(/[0-9]/);
+ if (source.equals(".")){
+ source.next();
+ source.nextWhileMatches(/[0-9]/);
+ }
+ if (source.equals("e") || source.equals("E")){
+ source.next();
+ if (source.equals("-"))
+ source.next();
+ source.nextWhileMatches(/[0-9]/);
+ }
+ return {type: "number", style: "php-atom"};
+ }
+ // Read a word and look it up in the keywords array. If found, it's a
+ // keyword of that type; otherwise it's a PHP T_STRING.
+ function readWord() {
+ source.nextWhileMatches(isWordChar);
+ var word = source.get();
+ var known = keywords.hasOwnProperty(word) && keywords.propertyIsEnumerable(word) && keywords[word];
+ // since we called get(), tokenize::take won't get() anything. Thus, we must set token.content
+ return known ? {type: known.type, style: known.style, content: word} :
+ {type: "t_string", style: "php-t_string", content: word};
+ }
+ function readVariable() {
+ source.nextWhileMatches(isWordChar);
+ var word = source.get();
+ // in PHP, '$this' is a reserved word, but 'this' isn't. You can have function this() {...}
+ if (word == "$this")
+ return {type: "variable", style: "php-keyword", content: word};
+ else
+ return {type: "variable", style: "php-variable", content: word};
+ }
+
+ // Advance the stream until the given character (not preceded by a
+ // backslash) is encountered, or the end of the line is reached.
+ function nextUntilUnescaped(source, end) {
+ var escaped = false;
+ var next;
+ while(!source.endOfLine()){
+ var next = source.next();
+ if (next == end && !escaped)
+ return false;
+ escaped = next == "\\";
+ }
+ return escaped;
+ }
+
+ function readSingleLineComment() {
+ // read until the end of the line or until ?>, which terminates single-line comments
+ // ` foo` will display "1 foo"
+ while(!source.lookAhead("?>") && !source.endOfLine())
+ source.next();
+ return {type: "comment", style: "php-comment"};
+ }
+ /* For multi-line comments, we want to return a comment token for
+ every line of the comment, but we also want to return the newlines
+ in them as regular newline tokens. We therefore need to save a
+ state variable ("inside") to indicate whether we are inside a
+ multi-line comment.
+ */
+
+ function readMultilineComment(start){
+ var newInside = "/*";
+ var maybeEnd = (start == "*");
+ while (true) {
+ if (source.endOfLine())
+ break;
+ var next = source.next();
+ if (next == "/" && maybeEnd){
+ newInside = null;
+ break;
+ }
+ maybeEnd = (next == "*");
+ }
+ setInside(newInside);
+ return {type: "comment", style: "php-comment"};
+ }
+
+ // similar to readMultilineComment and nextUntilUnescaped
+ // unlike comments, strings are not stopped by ?>
+ function readMultilineString(start){
+ var newInside = start;
+ var escaped = false;
+ while (true) {
+ if (source.endOfLine())
+ break;
+ var next = source.next();
+ if (next == start && !escaped){
+ newInside = null; // we're outside of the string now
+ break;
+ }
+ escaped = (next == "\\");
+ }
+ setInside(newInside);
+ return {
+ type: newInside == null? "string" : "string_not_terminated",
+ style: (start == "'"? "php-string-single-quoted" : "php-string-double-quoted")
+ };
+ }
+
+ // http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
+ // See also 'nowdoc' on the page. Heredocs are not interrupted by the '?>' token.
+ function readHeredoc(identifier){
+ var token = {};
+ if (identifier == "<<<") {
+ // on our first invocation after reading the <<<, we must determine the closing identifier
+ if (source.equals("'")) {
+ // nowdoc
+ source.nextWhileMatches(isWordChar);
+ identifier = "'" + source.get() + "'";
+ source.next(); // consume the closing "'"
+ } else if (source.matches(/[A-Za-z_]/)) {
+ // heredoc
+ source.nextWhileMatches(isWordChar);
+ identifier = source.get();
+ } else {
+ // syntax error
+ setInside(null);
+ return { type: "error", style: "syntax-error" };
+ }
+ setInside(identifier);
+ token.type = "string_not_terminated";
+ token.style = identifier.charAt(0) == "'"? "php-string-single-quoted" : "php-string-double-quoted";
+ token.content = identifier;
+ } else {
+ token.style = identifier.charAt(0) == "'"? "php-string-single-quoted" : "php-string-double-quoted";
+ // consume a line of heredoc and check if it equals the closing identifier plus an optional semicolon
+ if (source.lookAhead(identifier, true) && (source.lookAhead(";\n") || source.endOfLine())) {
+ // the closing identifier can only appear at the beginning of the line
+ // note that even whitespace after the ";" is forbidden by the PHP heredoc syntax
+ token.type = "string";
+ token.content = source.get(); // don't get the ";" if there is one
+ setInside(null);
+ } else {
+ token.type = "string_not_terminated";
+ source.nextWhileMatches(/[^\n]/);
+ token.content = source.get();
+ }
+ }
+ return token;
+ }
+
+ function readOperator() {
+ source.nextWhileMatches(isOperatorChar);
+ return {type: "operator", style: "php-operator"};
+ }
+ function readStringSingleQuoted() {
+ var endBackSlash = nextUntilUnescaped(source, "'", false);
+ setInside(endBackSlash ? "'" : null);
+ return {type: "string", style: "php-string-single-quoted"};
+ }
+ function readStringDoubleQuoted() {
+ var endBackSlash = nextUntilUnescaped(source, "\"", false);
+ setInside(endBackSlash ? "\"": null);
+ return {type: "string", style: "php-string-double-quoted"};
+ }
+
+ // Fetch the next token. Dispatches on first character in the
+ // stream, or first two characters when the first is a slash.
+ switch (inside) {
+ case null:
+ case false: break;
+ case "'":
+ case "\"": return readMultilineString(inside);
+ case "/*": return readMultilineComment(source.next());
+ default: return readHeredoc(inside);
+ }
+ var ch = source.next();
+ if (ch == "'" || ch == "\"")
+ return readMultilineString(ch)
+ else if (ch == "#")
+ return readSingleLineComment();
+ else if (ch == "$")
+ return readVariable();
+ else if (ch == ":" && source.equals(":")) {
+ source.next();
+ // the T_DOUBLE_COLON can only follow a T_STRING (class name)
+ return {type: "t_double_colon", style: "php-operator"}
+ }
+ // with punctuation, the type of the token is the symbol itself
+ else if (/[\[\]{}\(\),;:]/.test(ch)) {
+ return {type: ch, style: "php-punctuation"};
+ }
+ else if (ch == "0" && (source.equals("x") || source.equals("X")))
+ return readHexNumber();
+ else if (/[0-9]/.test(ch))
+ return readNumber();
+ else if (ch == "/") {
+ if (source.equals("*"))
+ { source.next(); return readMultilineComment(ch); }
+ else if (source.equals("/"))
+ return readSingleLineComment();
+ else
+ return readOperator();
+ }
+ else if (ch == "<") {
+ if (source.lookAhead("<<", true)) {
+ setInside("<<<");
+ return {type: "<<<", style: "php-punctuation"};
+ }
+ else
+ return readOperator();
+ }
+ else if (isOperatorChar.test(ch))
+ return readOperator();
+ else
+ return readWord();
+ }
+
+ // The external interface to the tokenizer.
+ return function(source, startState) {
+ return tokenizer(source, startState || phpTokenState(false, true));
+ };
+})();
diff --git a/media/CodeMirror-0.62/contrib/python/LICENSE b/media/CodeMirror-0.62/contrib/python/LICENSE
new file mode 100644
index 0000000..c237889
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/python/LICENSE
@@ -0,0 +1,32 @@
+Copyright (c) 2009, Timothy Farrell
+All rights reserved.
+
+This software is provided for use in connection with the
+CodeMirror suite of modules and utilities, hosted and maintained
+at http://marijn.haverbeke.nl/codemirror/.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/media/CodeMirror-0.62/contrib/python/css/pythoncolors.css b/media/CodeMirror-0.62/contrib/python/css/pythoncolors.css
new file mode 100644
index 0000000..a642a6a
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/python/css/pythoncolors.css
@@ -0,0 +1,54 @@
+.editbox {
+ padding: .4em;
+ margin: 0;
+ font-family: monospace;
+ font-size: 10pt;
+ line-height: 1.1em;
+ color: black;
+}
+
+pre.code, .editbox {
+ color: #666666;
+}
+
+.editbox p {
+ margin: 0;
+}
+
+span.py-delimiter, span.py-special {
+ color: #666666;
+}
+
+span.py-operator {
+ color: #666666;
+}
+
+span.py-error {
+ background-color: #660000;
+ color: #FFFFFF;
+}
+
+span.py-keyword {
+ color: #770088;
+ font-weight: bold;
+}
+
+span.py-literal {
+ color: #228811;
+}
+
+span.py-identifier, span.py-func {
+ color: black;
+}
+
+span.py-type, span.py-decorator {
+ color: #0000FF;
+}
+
+span.py-comment {
+ color: #AA7700;
+}
+
+span.py-string, span.py-bytes, span.py-raw, span.py-unicode {
+ color: #AA2222;
+}
diff --git a/media/CodeMirror-0.62/contrib/python/index.html b/media/CodeMirror-0.62/contrib/python/index.html
new file mode 100644
index 0000000..31d2f0a
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/python/index.html
@@ -0,0 +1,141 @@
+
+
+
+ CodeMirror: Python demonstration
+
+
+
+
+ This is a simple demonstration of the Python syntax highlighting module
+ for CodeMirror .
+
+
+ Features of this parser include:
+
+
+ Token-based syntax highlighting - currently very little lexical analysis happens. Few lexical errors will be detected.
+ Use the normal indentation mode to enforce regular indentation, otherwise the "shift" indentation mode will give you more flexibility.
+ Parser Options:
+
+ pythonVersion (Integer) - 2 or 3 to indicate which version of Python to parse. Default = 2
+ strictErrors (Bool) - true to highlight errors that may not be Python errors but cause confusion for this parser. Default = true
+
+
+
+Written by Timothy Farrell (license ). Special
+thanks to Adam Brand and Marijn Haverbeke for their help in debugging
+and providing for this parser.
+
+
+
+
+
+
+
+
diff --git a/media/CodeMirror-0.62/contrib/python/js/parsepython.js b/media/CodeMirror-0.62/contrib/python/js/parsepython.js
new file mode 100644
index 0000000..4847c76
--- /dev/null
+++ b/media/CodeMirror-0.62/contrib/python/js/parsepython.js
@@ -0,0 +1,544 @@
+var PythonParser = Editor.Parser = (function() {
+ function wordRegexp(words) {
+ return new RegExp("^(?:" + words.join("|") + ")$");
+ }
+ var DELIMITERCLASS = 'py-delimiter';
+ var LITERALCLASS = 'py-literal';
+ var ERRORCLASS = 'py-error';
+ var OPERATORCLASS = 'py-operator';
+ var IDENTIFIERCLASS = 'py-identifier';
+ var STRINGCLASS = 'py-string';
+ var BYTESCLASS = 'py-bytes';
+ var UNICODECLASS = 'py-unicode';
+ var RAWCLASS = 'py-raw';
+ var NORMALCONTEXT = 'normal';
+ var STRINGCONTEXT = 'string';
+ var singleOperators = '+-*/%&|^~<>';
+ var doubleOperators = wordRegexp(['==', '!=', '\\<=', '\\>=', '\\<\\>',
+ '\\<\\<', '\\>\\>', '\\/\\/', '\\*\\*']);
+ var singleDelimiters = '()[]{}@,:.`=;';
+ var doubleDelimiters = ['\\+=', '\\-=', '\\*=', '/=', '%=', '&=', '\\|=',
+ '\\^='];
+ var tripleDelimiters = wordRegexp(['//=','\\>\\>=','\\<\\<=','\\*\\*=']);
+ var singleStarters = singleOperators + singleDelimiters + '=!';
+ var doubleStarters = '=<>*/';
+ var identifierStarters = /[_A-Za-z]/;
+
+ var wordOperators = wordRegexp(['and', 'or', 'not', 'is', 'in']);
+ var commonkeywords = ['as', 'assert', 'break', 'class', 'continue',
+ 'def', 'del', 'elif', 'else', 'except', 'finally',
+ 'for', 'from', 'global', 'if', 'import',
+ 'lambda', 'pass', 'raise', 'return',
+ 'try', 'while', 'with', 'yield'];
+ var commontypes = ['bool', 'classmethod', 'complex', 'dict', 'enumerate',
+ 'float', 'frozenset', 'int', 'list', 'object',
+ 'property', 'reversed', 'set', 'slice', 'staticmethod',
+ 'str', 'super', 'tuple', 'type'];
+ var py2 = {'types': ['basestring', 'buffer', 'file', 'long', 'unicode',
+ 'xrange'],
+ 'keywords': ['exec', 'print'],
+ 'version': 2 };
+ var py3 = {'types': ['bytearray', 'bytes', 'filter', 'map', 'memoryview',
+ 'open', 'range', 'zip'],
+ 'keywords': ['nonlocal'],
+ 'version': 3};
+
+ var py, keywords, types, stringStarters, stringTypes, config;
+
+ function configure(conf) {
+ if (!conf.hasOwnProperty('pythonVersion')) {
+ conf.pythonVersion = 2;
+ }
+ if (!conf.hasOwnProperty('strictErrors')) {
+ conf.strictErrors = true;
+ }
+ if (conf.pythonVersion != 2 && conf.pythonVersion != 3) {
+ alert('CodeMirror: Unknown Python Version "' +
+ conf.pythonVersion +
+ '", defaulting to Python 2.x.');
+ conf.pythonVersion = 2;
+ }
+ if (conf.pythonVersion == 3) {
+ py = py3;
+ stringStarters = /[\'\"rbRB]/;
+ stringTypes = /[rb]/;
+ doubleDelimiters.push('\\-\\>');
+ } else {
+ py = py2;
+ stringStarters = /['"RUru]/;
+ stringTypes = /[ru]/;
+ }
+ config = conf;
+ keywords = wordRegexp(commonkeywords.concat(py.keywords));
+ types = wordRegexp(commontypes.concat(py.types));
+ doubleDelimiters = wordRegexp(doubleDelimiters);
+ }
+
+ var tokenizePython = (function() {
+ function normal(source, setState) {
+ var stringDelim, threeStr, temp, type, word, possible = {};
+ var ch = source.next();
+
+ function filterPossible(token, styleIfPossible) {
+ if (!possible.style && !possible.content) {
+ return token;
+ } else if (typeof(token) == STRINGCONTEXT) {
+ token = {content: source.get(), style: token};
+ }
+ if (possible.style || styleIfPossible) {
+ token.style = styleIfPossible ? styleIfPossible : possible.style;
+ }
+ if (possible.content) {
+ token.content = possible.content + token.content;
+ }
+ possible = {};
+ return token;
+ }
+
+ // Handle comments
+ if (ch == '#') {
+ while (!source.endOfLine()) {
+ source.next();
+ }
+ return 'py-comment';
+ }
+ // Handle special chars
+ if (ch == '\\') {
+ if (source.peek() != '\n') {
+ var whitespace = true;
+ while (!source.endOfLine()) {
+ if(!(/\s/.test(source.next()))) {
+ whitespace = false;
+ }
+ }
+ if (!whitespace) {
+ return ERRORCLASS;
+ }
+ }
+ return 'py-special';
+ }
+ // Handle operators and delimiters
+ if (singleStarters.indexOf(ch) != -1) {
+ if (doubleStarters.indexOf(source.peek()) != -1) {
+ temp = ch + source.peek();
+ // It must be a double delimiter or operator or triple delimiter
+ if (doubleOperators.test(temp)) {
+ source.next();
+ if (tripleDelimiters.test(temp + source.peek())) {
+ source.next();
+ return DELIMITERCLASS;
+ } else {
+ return OPERATORCLASS;
+ }
+ } else if (doubleDelimiters.test(temp)) {
+ source.next();
+ return DELIMITERCLASS;
+ }
+ }
+ // It must be a single delimiter or operator
+ if (singleOperators.indexOf(ch) != -1) {
+ return OPERATORCLASS;
+ } else if (singleDelimiters.indexOf(ch) != -1) {
+ if (ch == '@' && /\w/.test(source.peek())) {
+ possible = {style:'py-decorator',
+ content: source.get()};
+ ch = source.next();
+ } else if (ch == '.' && /\d/.test(source.peek())) {
+ possible = {style:LITERALCLASS,
+ content: source.get()};
+ ch = source.next();
+ } else {
+ return DELIMITERCLASS;
+ }
+ } else {
+ return ERRORCLASS;
+ }
+ }
+ // Handle number literals
+ if (/\d/.test(ch)) {
+ if (ch === '0' && !source.endOfLine()) {
+ switch (source.peek()) {
+ case 'o':
+ case 'O':
+ source.next();
+ source.nextWhileMatches(/[0-7]/);
+ return filterPossible(LITERALCLASS, ERRORCLASS);
+ case 'x':
+ case 'X':
+ source.next();
+ source.nextWhileMatches(/[0-9A-Fa-f]/);
+ return filterPossible(LITERALCLASS, ERRORCLASS);
+ case 'b':
+ case 'B':
+ source.next();
+ source.nextWhileMatches(/[01]/);
+ return filterPossible(LITERALCLASS, ERRORCLASS);
+ }
+ }
+ source.nextWhileMatches(/\d/);
+ if (source.peek() == '.') {
+ source.next();
+ source.nextWhileMatches(/\d/);
+ }
+ // Grab an exponent
+ if (source.peek().toLowerCase() == 'e') {
+ source.next();
+ if (source.peek() == '+' || source.peek() == '-') {
+ source.next();
+ }
+ if (/\d/.test(source.peek())) {
+ source.nextWhileMatches(/\d/);
+ } else {
+ return filterPossible(ERRORCLASS);
+ }
+ }
+ // Grab a complex number
+ if (source.peek().toLowerCase() == 'j') {
+ source.next();
+ }
+
+ return filterPossible(LITERALCLASS);
+ }
+ // Handle strings
+ if (stringStarters.test(ch)) {
+ var peek = source.peek();
+ var stringType = STRINGCLASS;
+ if ((stringTypes.test(ch)) && (peek == '"' || peek == "'")) {
+ switch (ch.toLowerCase()) {
+ case 'b':
+ stringType = BYTESCLASS;
+ break;
+ case 'r':
+ stringType = RAWCLASS;
+ break;
+ case 'u':
+ stringType = UNICODECLASS;
+ break;
+ }
+ ch = source.next();
+ stringDelim = ch;
+ if (source.peek() != stringDelim) {
+ setState(inString(stringType, stringDelim));
+ return null;
+ } else {
+ source.next();
+ if (source.peek() == stringDelim) {
+ source.next();
+ threeStr = stringDelim + stringDelim + stringDelim;
+ setState(inString(stringType, threeStr));
+ return null;
+ } else {
+ return stringType;
+ }
+ }
+ } else if (ch == "'" || ch == '"') {
+ stringDelim = ch;
+ if (source.peek() != stringDelim) {
+ setState(inString(stringType, stringDelim));
+ return null;
+ } else {
+ source.next();
+ if (source.peek() == stringDelim) {
+ source.next();
+ threeStr = stringDelim + stringDelim + stringDelim;
+ setState(inString(stringType, threeStr));
+ return null;
+ } else {
+ return stringType;
+ }
+ }
+ }
+ }
+ // Handle Identifier
+ if (identifierStarters.test(ch)) {
+ source.nextWhileMatches(/[\w\d]/);
+ word = source.get();
+ if (wordOperators.test(word)) {
+ type = OPERATORCLASS;
+ } else if (keywords.test(word)) {
+ type = 'py-keyword';
+ } else if (types.test(word)) {
+ type = 'py-type';
+ } else {
+ type = IDENTIFIERCLASS;
+ while (source.peek() == '.') {
+ source.next();
+ if (identifierStarters.test(source.peek())) {
+ source.nextWhileMatches(/[\w\d]/);
+ } else {
+ type = ERRORCLASS;
+ break;
+ }
+ }
+ word = word + source.get();
+ }
+ return filterPossible({style: type, content: word});
+ }
+
+ // Register Dollar sign and Question mark as errors. Always!
+ if (/\$\?/.test(ch)) {
+ return filterPossible(ERRORCLASS);
+ }
+
+ return filterPossible(ERRORCLASS);
+ }
+
+ function inString(style, terminator) {
+ return function(source, setState) {
+ var matches = [];
+ var found = false;
+ while (!found && !source.endOfLine()) {
+ var ch = source.next(), newMatches = [];
+ // Skip escaped characters
+ if (ch == '\\') {
+ if (source.peek() == '\n') {
+ break;
+ }
+ ch = source.next();
+ ch = source.next();
+ }
+ if (ch == terminator.charAt(0)) {
+ matches.push(terminator);
+ }
+ for (var i = 0; i < matches.length; i++) {
+ var match = matches[i];
+ if (match.charAt(0) == ch) {
+ if (match.length == 1) {
+ setState(normal);
+ found = true;
+ break;
+ } else {
+ newMatches.push(match.slice(1));
+ }
+ }
+ }
+ matches = newMatches;
+ }
+ return style;
+ };
+ }
+
+ return function(source, startState) {
+ return tokenizer(source, startState || normal);
+ };
+ })();
+
+ function parsePython(source) {
+ if (!keywords) {
+ configure({});
+ }
+
+ var tokens = tokenizePython(source);
+ var lastToken = null;
+ var column = 0;
+ var context = {prev: null,
+ endOfScope: false,
+ startNewScope: false,
+ level: 0,
+ next: null,
+ type: NORMALCONTEXT
+ };
+
+ function pushContext(level, type) {
+ type = type ? type : NORMALCONTEXT;
+ context = {prev: context,
+ endOfScope: false,
+ startNewScope: false,
+ level: level,
+ next: null,
+ type: type
+ };
+ }
+
+ function popContext(remove) {
+ remove = remove ? remove : false;
+ if (context.prev) {
+ if (remove) {
+ context = context.prev;
+ context.next = null;
+ } else {
+ context.prev.next = context;
+ context = context.prev;
+ }
+ }
+ }
+
+ function indentPython(context) {
+ var temp;
+ return function(nextChars, currentLevel, direction) {
+ if (direction === null || direction === undefined) {
+ if (nextChars) {
+ while (context.next) {
+ context = context.next;
+ }
+ }
+ return context.level;
+ }
+ else if (direction === true) {
+ if (currentLevel == context.level) {
+ if (context.next) {
+ return context.next.level;
+ } else {
+ return context.level;
+ }
+ } else {
+ temp = context;
+ while (temp.prev && temp.prev.level > currentLevel) {
+ temp = temp.prev;
+ }
+ return temp.level;
+ }
+ } else if (direction === false) {
+ if (currentLevel > context.level) {
+ return context.level;
+ } else if (context.prev) {
+ temp = context;
+ while (temp.prev && temp.prev.level >= currentLevel) {
+ temp = temp.prev;
+ }
+ if (temp.prev) {
+ return temp.prev.level;
+ } else {
+ return temp.level;
+ }
+ }
+ }
+ return context.level;
+ };
+ }
+
+ var iter = {
+ next: function() {
+ var token = tokens.next();
+ var type = token.style;
+ var content = token.content;
+
+ if (lastToken) {
+ if (lastToken.content == 'def' && type == IDENTIFIERCLASS) {
+ token.style = 'py-func';
+ }
+ if (lastToken.content == '\n') {
+ var tempCtx = context;
+ // Check for a different scope
+ if (type == 'whitespace' && context.type == NORMALCONTEXT) {
+ if (token.value.length < context.level) {
+ while (token.value.length < context.level) {
+ popContext();
+ }
+
+ if (token.value.length != context.level) {
+ context = tempCtx;
+ if (config.strictErrors) {
+ token.style = ERRORCLASS;
+ }
+ } else {
+ context.next = null;
+ }
+ }
+ } else if (context.level !== 0 &&
+ context.type == NORMALCONTEXT) {
+ while (0 !== context.level) {
+ popContext();
+ }
+
+ if (context.level !== 0) {
+ context = tempCtx;
+ if (config.strictErrors) {
+ token.style = ERRORCLASS;
+ }
+ }
+ }
+ }
+ }
+
+ // Handle Scope Changes
+ switch(type) {
+ case STRINGCLASS:
+ case BYTESCLASS:
+ case RAWCLASS:
+ case UNICODECLASS:
+ if (context.type !== STRINGCONTEXT) {
+ pushContext(context.level + 1, STRINGCONTEXT);
+ }
+ break;
+ default:
+ if (context.type === STRINGCONTEXT) {
+ popContext(true);
+ }
+ break;
+ }
+ switch(content) {
+ case '.':
+ case '@':
+ // These delimiters don't appear by themselves
+ if (content !== token.value) {
+ token.style = ERRORCLASS;
+ }
+ break;
+ case ':':
+ // Colons only delimit scope inside a normal scope
+ if (context.type === NORMALCONTEXT) {
+ context.startNewScope = context.level+indentUnit;
+ }
+ break;
+ case '(':
+ case '[':
+ case '{':
+ // These start a sequence scope
+ pushContext(column + content.length, 'sequence');
+ break;
+ case ')':
+ case ']':
+ case '}':
+ // These end a sequence scope
+ popContext(true);
+ break;
+ case 'pass':
+ case 'return':
+ // These end a normal scope
+ if (context.type === NORMALCONTEXT) {
+ context.endOfScope = true;
+ }
+ break;
+ case '\n':
+ // Reset our column
+ column = 0;
+ // Make any scope changes
+ if (context.endOfScope) {
+ context.endOfScope = false;
+ popContext();
+ } else if (context.startNewScope !== false) {
+ var temp = context.startNewScope;
+ context.startNewScope = false;
+ pushContext(temp, NORMALCONTEXT);
+ }
+ // Newlines require an indentation function wrapped in a closure for proper context.
+ token.indentation = indentPython(context);
+ break;
+ }
+
+ // Keep track of current column for certain scopes.
+ if (content != '\n') {
+ column += token.value.length;
+ }
+
+ lastToken = token;
+ return token;
+ },
+
+ copy: function() {
+ var _context = context, _tokenState = tokens.state;
+ return function(source) {
+ tokens = tokenizePython(source, _tokenState);
+ context = _context;
+ return iter;
+ };
+ }
+ };
+ return iter;
+ }
+
+ return {make: parsePython,
+ electricChars: "",
+ configure: configure};
+})();
diff --git a/media/CodeMirror-0.62/css/csscolors.css b/media/CodeMirror-0.62/css/csscolors.css
new file mode 100644
index 0000000..100c93f
--- /dev/null
+++ b/media/CodeMirror-0.62/css/csscolors.css
@@ -0,0 +1,47 @@
+.editbox {
+ margin: .4em;
+ padding: 0;
+ font-family: monospace;
+ font-size: 10pt;
+ color: black;
+}
+
+pre.code, .editbox {
+ color: #666666;
+}
+
+.editbox p {
+ margin: 0;
+}
+
+span.css-at {
+ color: #770088;
+}
+
+span.css-unit {
+ color: #228811;
+}
+
+span.css-value {
+ color: #770088;
+}
+
+span.css-identifier {
+ color: black;
+}
+
+span.css-important {
+ color: #0000FF;
+}
+
+span.css-colorcode {
+ color: #004499;
+}
+
+span.css-comment {
+ color: #AA7700;
+}
+
+span.css-string {
+ color: #AA2222;
+}
diff --git a/media/CodeMirror-0.62/css/docs.css b/media/CodeMirror-0.62/css/docs.css
new file mode 100644
index 0000000..c86b7d7
--- /dev/null
+++ b/media/CodeMirror-0.62/css/docs.css
@@ -0,0 +1,46 @@
+body {
+ margin: 0;
+ padding: 3em 6em;
+ color: black;
+ max-width: 50em;
+}
+
+h1 {
+ font-size: 22pt;
+}
+
+.underline {
+ border-bottom: 3px solid #C44;
+}
+
+h2 {
+ font-size: 14pt;
+}
+
+p.rel {
+ padding-left: 2em;
+ text-indent: -2em;
+}
+
+div.border {
+ border: 1px solid black;
+ padding: 3px;
+}
+
+code {
+ font-family: courier, monospace;
+ font-size: 90%;
+ color: #144;
+}
+
+pre.code {
+ margin: 1.1em 12px;
+ border: 1px solid #CCCCCC;
+ color: black;
+ padding: .4em;
+ font-family: courier, monospace;
+}
+
+.warn {
+ color: #C00;
+}
diff --git a/media/CodeMirror-0.62/css/jscolors.css b/media/CodeMirror-0.62/css/jscolors.css
new file mode 100644
index 0000000..3067628
--- /dev/null
+++ b/media/CodeMirror-0.62/css/jscolors.css
@@ -0,0 +1,55 @@
+.editbox {
+ margin: .4em;
+ padding: 0;
+ font-family: monospace;
+ font-size: 10pt;
+ color: black;
+}
+
+pre.code, .editbox {
+ color: #666666;
+}
+
+.editbox p {
+ margin: 0;
+}
+
+span.js-punctuation {
+ color: #666666;
+}
+
+span.js-operator {
+ color: #666666;
+}
+
+span.js-keyword {
+ color: #770088;
+}
+
+span.js-atom {
+ color: #228811;
+}
+
+span.js-variable {
+ color: black;
+}
+
+span.js-variabledef {
+ color: #0000FF;
+}
+
+span.js-localvariable {
+ color: #004499;
+}
+
+span.js-property {
+ color: black;
+}
+
+span.js-comment {
+ color: #AA7700;
+}
+
+span.js-string {
+ color: #AA2222;
+}
diff --git a/media/CodeMirror-0.62/css/people.jpg b/media/CodeMirror-0.62/css/people.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..734789542b3533f464c3eb18908f06e48f44e55d
GIT binary patch
literal 14122
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
+
+
+ CodeMirror: CSS demonstration
+
+
+
+
+Demonstration of CodeMirror 's CSS
+highlighter.
+
+
+
+
+
+
+
+
+