This GitLab instance reached the end of its service life. It won't be possible to create new users or projects.

Please read the deprecation notice for more information concerning the deprecation timeline

Visit migration.git.tu-berlin.de (internal network only) to import your old projects to the new GitLab platform 📥

en-wiki-formulae-error.json 89.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
[
  {
    "inputhash": "0270c7af664da7afddcac31d7ac3ad0f",
    "input": "\\begin{alignat}2\n  \\cos(2x) &= (\\cos{x})^2 +((\\cos{x})^2-1) &&= 2(\\cos{x})^2-1\\\\\n  \\sin(2x) &= 2(\\sin{x})(\\cos{x})\\\\\n  \\cos(3x) &= (\\cos{x})^3 +3\\cos{x}((\\cos{x})^2-1) &&= 4(\\cos{x})^3-3\\cos{x}\\\\\n  \\sin(3x) &= 3(\\cos{x})^2(\\sin{x})-(\\sin{x})^3 &&= 3\\sin{x}-4(\\sin{x})^3.\\\\\n\\end{alignat}"
  },
  {
    "inputhash": "0448c022977e58b500445d3c92a6579a",
    "input": \\colon P \\to N"
  },
  {
    "inputhash": "0e7c8b2fe70a6310bb546f3506e8c2ae",
    "input": "a>b\"=\"\\&lt;<"
  },
  {
    "inputhash": "15212ec94e20fb0a97994cdee3b47dd8",
    "input": "\\begin{alignat}2\n   x &= 0.333333\\ldots\\\\\n 10x &= 3.333333\\ldots&\\quad&\\text{(multiplying each side of the above line by 10)}\\\\\n  9x &= 3          &&\\text{(subtracting the 1st line from the 2nd)}\\\\\n   x &= 3/9 = 1/3   &&\\text{(reducing to lowest terms)}\\\\\n\\end{alignat}"
  },
  {
    "inputhash": "17a71941f66112018c433832caa51851",
    "input": "U(0)=−1"
  },
  {
    "inputhash": "1aded4342fe9d330c576dc01a4b4bab4",
    "input": "\\definecolor{gray}{RGB}{249,249,249}\\pagecolor{gray} g \\mapsto g\\circ h"
  },
  {
    "inputhash": "208676c3b9c6c696f4640d0e2be00a1c",
    "input": "i ≠ 0"
  },
  {
    "inputhash": "267b6df35d46a8a5ef4b910298d1bb16",
    "input": "\\ln N! ≈ N \\ln N - N"
  },
  {
    "inputhash": "34cd4915dc9878e6a836e546a1725c86",
    "input": "P_{\\text{new link to class $[k]$}} \\propto k f(k)"
  },
  {
    "inputhash": "3d9052d87c15592c7d4f0bdf832a4f22",
    "input": "\n--------------------------------------------------------------\n--HISTORY:\n--13Jul2005 Created.\n--11Dec2008 Narrowed by website URL in both columns (colspan=2)\n--11Dec2008 New parameter marginleft=0.2em.\n--11Dec2008 New parameter image_district_width=160px.\n--11Dec2008 Put NOTES comments to explain template markup.\n--11Dec2008 Put HISTORY comments to log major changes (not typos).\n--12Dec2008 Shortened \"Official Website\" as \"Website\".\n--12Dec2008 New parameter \"website_prenote\" to wrap URL.\n--12Dec2008 New parameter image_coat_width to resize coat-of-arms.\n--08Mar2011 Replaced by using Template:Infobox_settlement.\n--26Sep2011 Set population by {Metadata population AT-9|...}.\n--26Sep2011 New parameter again \"website_prenote\" to wrap URL.\n--26Sep2011 New parameter \"website_out\" to wrap URL.\n--26Sep2011 Set as one line: {nowrap|Second Deputy}.\n--26Sep2011 Removed \"includeonly\" to show live infobox format.\n</noinclude>"
  },
  {
    "inputhash": "465b6086e24083387f88c34b62bf901d",
    "input": "\n    <mrow>\n      <mi>a</mi>\n      <mo>&InvisibleTimes;</mo>\n      <msup>\n        <mi>x</mi>\n        <mn>2</mn>\n      </msup>\n      <mo>+</mo>\n      <mi>b</mi>\n      <mo>&InvisibleTimes; </mo>\n      <mi>x</mi>\n      <mo>+</mo>\n      <mi>c</mi>\n    </mrow>\n  "
  },
  {
    "inputhash": "56bacea25f9704ee4d1294f222236f32",
    "input": "5--6++h;[d]gtuh[tr\nukj\\-=tyui\np?9=8~\n/gl[re"
  },
  {
    "inputhash": "6007c325e853ca12cfb61f00f9d36109",
    "input": "|\\pm\\rangle=\\frac{1}{\\sqrt{2}}\\left(\\begin{array}[l]{c}\n    1\\\\\n    \\pm i\n    \\end{array}\\right)."
  },
  {
    "inputhash": "629979cd7de132f3d6884d3c48064c76",
    "input": "CCAI=D-140.7 \\\n (\\log (V+0.85))-80.6-483.5 \\log \\left (\\frac{t+273}{323} \\right )"
  },
  {
    "inputhash": "63ac33a39f3f0f86fd10f2fad9560b1f",
    "input": " Part of WikiProject Law.  Most of this is ripped off from [[Template:Intellectual prop\n|-\n|[[Image:Scale of justice 2.svg|100px|]]\n|- collusion is the sale of hot nuts - Eoin \"balls\" Devlin\n! style=\"padding: 0 7px 0 7px; background:#00FA9A\" align=\"center\" | [[Competition law]]\n|-\n! style=\" font-size: 95%; padding: 0 7px 0 7px; background:#98FB98\" align=\"center\" | Basic concepts \n|-\n| style=\" font-size: 90%; padding: 0 5px 0 5px; text-align: left;\" |\n\n* [[History of competition law]]\n* [[Monopoly]]\n** [[Coercive monopoly]]\n** [[Natural monopoly]]\n* [[Barriers to entry]]\n* [[Herfindahl index|Herfindahl–Hirschman Index]]\n* [[Market concentration]]\n* [[Market power]]\n* [[Small but significant and non-transitory increase in price|SSNIP test]]\n* [[Relevant market]]\n* [[Merger control]]\n* [[Hot Nuts control]]\n* [[ Eoin Devlin's Dildo Theory]]\n|-\n! style=\"font-size: 95%; padding: 0 4px 0 4px; background:#98FB98\" align=\"center\" | [[Anti-competitive practices]] \n|-\n| style=\" font-size: 90%; padding: 0 5px 0 5px; text-align: left;\" |\n\n* [[Monopolization]]\n* [[Collusion]]\n** Formation of [[cartel]]s\n** [[Price fixing]]\n** [[Bid rigging]]\n* [[Product bundling]] and [[Tying (commerce)|tying]]\n* [[Refusal to deal]]\n** [[Group boycott]]\n** [[Essential facilities doctrine|Essential facilities]]\n* [[Exclusive dealing]]\n* [[Dividing territories]]\n* [[Conscious parallelism]]\n* [[Predatory pricing]]\n* [[Patent misuse|Misuse of patents]] and [[Copyright misuse|copyrights]]\n\n|-\n! style=\"font-size: 95%; padding: 0 4px 0 4px; background:#98FB98\" align=\"center\" | Enforcement authorities and organizations\n|-\n| style=\" font-size: 90%; padding: 0 5px 0 5px; text-align: left;\" |\n\n* [[International Competition Network]]\n* [[Competition regulator|List of competition regulators]]\n\n|-\n| style=\"padding:0 5px;\" align=\"right\"| <small class=\"editlink noprint plainlinksneverexpand\"> {{navbar|Competition law}}</small>\n|-\n|}<noinclude>\n\n[[Category:Law navigational boxes|{{PAGENAME}}]]\n</noinclude>"
  },
  {
    "inputhash": "658f88ad3ea4ff14e7b35b0efda8535e",
    "input": "Don't forget to include the code for artist infobox (template:infobox artist)--!>\n\n<noinclude>\nUse the following:\n\nSummary goes here\n\n==Background==\nBio\n\n==Career==\nCareer\n\n==Artist Statement==\n\"Statement\"\n\n==Notable Works==\n===Work 1===\nMedia1\nDescription1\n===Work 2===\nMedia2\nDescription2\n===Work 3===\nMedia3\nDescription3\n==References==\n\n==External Links==\nAfrica Centre Page\nWikiAfrica tag\n\n</noinclude>\n\n{{{Summary}}}\n\n==Background==\n{{{Background}}}\n\n==Career==\n{{{Career}}}\n\n==Artist Statement==\n{{{Statement}}}\n\n==Notable Works==\n==={{{Work 1}}}===\n{{{Media1}}}\n{{{Description1}}}\n==={{{Work 2}}}===\n{{{Media2}}}\n{{{Description2}}}\n==={{{Work 3}}}===\n{{{Media3}}}\n{{{Description3}}}\n==References==\n\n==External Links==\n{{{Africa Centre Page}}}\nWikiAfrica tag"
  },
  {
    "inputhash": "665cf2ffe7708e3cae870b92deddfb6d",
    "input": "\\left<|v|\\right>"
  },
  {
    "inputhash": "6865264da42490a9f5f3a91919586727",
    "input": "\n\n\n[[Category:WikiProject Military history template instructions|Campaignbox]]\n</noinclude><includeonly>\n[[Category:Campaignbox templates| ]]\n{{#ifeq:{{{noheader|}}}|yes | |[[Category:Navigational box wrapper templates]][[Category:Military navigational boxes|Campaignbox]]}}\n[[Category:Exclude in print]]\n</includeonly>"
  },
  {
    "inputhash": "6a844321d746ca110ed895f82c622684",
    "input": "\\begin{alignat}2\n e_1 &= p_1,\\\\\n e_2 &= \\textstyle\\frac12p_1^2 - \\frac12p_2 &&= \\textstyle\\frac12 ( p_1^2 - p_2 ),\\\\\n e_3 &= \\textstyle\\frac16p_1^3 - \\frac12p_1 p_2 + \\frac13p_3 &&= \\textstyle\\frac{1}{6} ( p_1^3 - 3 p_1 p_2 + 2 p_3 ),\\\\\n e_4 &= \\textstyle\\frac1{24}p_1^4 - \\frac14p_1^2 p_2 + \\frac18p_2^2 + \\frac13p_1 p_3 - \\frac14p_4 \n       &&= \\textstyle\\frac1{24} ( p_1^4 - 6 p_1^2 p_2 + 3 p_2^2 + 8 p_1 p_3 - 6 p_4 ),\\\\\n\\end{alignat}"
  },
  {
    "inputhash": "6e2ea999c31f52054218db930bd4803d",
    "input": "\n\\begin{align}\n[K_c] & = \\frac{\\prod_{j=1}^p [ {\\rm mol \\; dm^{{-3}} ]^{{y_j}}{\\prod_{i=1}^r [ {\\rm mol \\; dm^{{-3}} ]^{x_i} }  \\\\\n & = \\frac{[ {\\rm mol \\; dm^{{-3}} ]^{y_1} [ {\\rm mol \\; dm^{{-3}} ]^{y_2} \\cdots [ {\\rm mol \\; dm^{{-3}} ]^{{y_p}}{[ {\\rm mol \\; dm^{{-3}} ]^{x_1} [ {\\rm mol \\; dm^{{-3}} ]^{x_2} \\cdots [ {\\rm mol \\; dm^{{-3}} ]^{x_r} }  \\\\\n & = \\frac{[ {\\rm mol \\; dm^{{-3}} ]^{\\sum_{j=1}^p y_j}}{[ {\\rm mol \\; dm^{{-3}} ]^{\\sum_{i=1}^r x_i} }  \\\\\n & = [ {\\rm mol \\; dm^{{-3}} ]^{\\sum_{j=1}^p y_j - \\sum_{i=1}^r x_i}\n\\end{align}\n"
  },
  {
    "inputhash": "71f8fc328a525f1c47b27aeba6bfcdf5",
    "input": "\\definecolor{red}{RGB}{255,0,0}\\pagecolor{red}e^{i \\pi} + 1 = 0\\,\\!"
  },
  {
    "inputhash": "740162aa0b844cc286c4a59c0c81fdfe",
    "input": "\n\\begin{array}{|l|l|}\n\\hline\n\\alpha_i & \\beta_{ij} \\\\[8pt]\n\\hline\n\\alpha_1 = 0 & \\beta_{21} = \\frac{1}{2} \\\\[8pt]\n\\alpha_2 = \\frac{1}{2} & \\beta_{32} = \\frac{1}{2} \\\\[8pt]\n\\alpha_3 = \\frac{1}{2} & \\beta_{43} = 1 \\\\[8pt]\n\\alpha_4 = 1 & \\\\[8pt]\n\\hline\n\\end{array}\n"
  },
  {
    "inputhash": "7419bdfbb162d8787f942ab5db3c0622",
    "input": "  {{#ifeq: {{{hide}}} | yes |}}"
  },
  {
    "inputhash": "7d75d44265d5c5e5f3c8bc4cf017f5f4",
    "input": " [[Category:Akō Line| {{PAGENAME}}]]*->\n\n</noinclude>"
  },
  {
    "inputhash": "84a4ff0236d881b0f8319bb776afdf42",
    "input": "\n  <mrow>\n    <mi>x</mi>\n    <mo>=</mo>\n    <mfrac>\n      <mrow>\n        <mo form=\"prefix\">&#x2212;</mo>\n        <mi>b</mi>\n        <mo>&#x00B1;</mo>\n        <msqrt>\n          <msup>\n            <mi>b</mi>\n            <mn>2</mn>\n          </msup>\n          <mo>&#x2212;</mo>\n          <mn>4</mn>\n          <mo>&#x2062;</mo>\n          <mi>a</mi>\n          <mo>&#x2062;</mo>\n          <mi>c</mi>\n        </msqrt>\n      </mrow>\n      <mrow>\n        <mn>2</mn>\n        <mo>&#x2062;</mo>\n        <mi>a</mi>\n      </mrow>\n    </mfrac>\n  </mrow>\n  <annotation encoding=\"TeX\">\n     x=\\frac{-b\\pm\\sqrt{b^2-4ac}}{2a}\n  </annotation>\n  <annotation encoding=\"StarMath 5.0\">\n     x={-b plusminus sqrt {b^2 - 4 ac}} over {2 a}\n  </annotation>\n"
  },
  {
    "inputhash": "851d5397903761d087cbd6ef7d7f34e3",
    "input": " {{URL|example.com}}\n}}</pre>\n\n* Any of the fields can be safely left blank.\n** You may include an image with no caption, but a caption will not be shown if there is no image.\n** When including an image, use the full image syntax.\n* Wiki links [[]] are fine in any of the fields.\n\n==Microformat==\n{{UF-hcard-org}}\n\n<includeonly>\n[[Category:Education infobox templates|High school marching band]]\n[[Category:Music infobox templates|High school marching band]]\n</includeonly>"
  },
  {
    "inputhash": "866f63344780c4751fe344d954023fc9",
    "input": " p_\\pi(\\boldsymbol\\eta|\\boldsymbol\\chi,\\nu) &= f(\\boldsymbol\\chi,\\nu) g(\\boldsymbol\\eta)^\\nu \\exp(\\boldsymbol\\eta^{\\rm T} \\boldsymbol\\chi) \\propto g(\\boldsymbol\\eta)^\\nu \\exp(\\boldsymbol\\eta^{\\rm T} \\boldsymbol\\chi)"
  },
  {
    "inputhash": "87d00edc79289bf18876a311a4bf6678",
    "input": "\n * - Full support for <nowiki>\n * - Parser-based (as opposed to RegExp-based) inline wikicode handling (make it one-pass and bullet-proof)\n * - Support for templates (through AJAX)\n * - Support for coloured links (AJAX)\n */\n\n\nvar Insta = {};\n\nfunction setupLivePreview() {\n\n\t// options\n\tInsta.conf =\n\t{\n\t\tbaseUrl: '',\n\n\t\tuser: {},\n\n\t\twiki: {\n\t\tlang: pg.wiki.lang,\n\t\tinterwiki: pg.wiki.interwiki,\n\t\tdefault_thumb_width: 180\n\t\t},\n\n\t\tpaths: {\n\t\tarticles: pg.wiki.articlePath + '/',\n\t\t// Only used for Insta previews with images. (not in popups)\n\t\tmath: '/math/',\n\t\timages: '//upload.wikimedia.org/wikipedia/en/', // FIXME ( window.getImageUrlStart ? getImageUrlStart(pg.wiki.hostname) : ''),\n\t\timages_fallback: '//upload.wikimedia.org/wikipedia/commons/',\n\t\tmagnify_icon: 'skins/common/images/magnify-clip.png'\n\t\t},\n\n\t\tlocale: {\n\t\tuser: mw.config.get('wgFormattedNamespaces')[pg.nsUserId],\n\t\timage: mw.config.get('wgFormattedNamespaces')[pg.nsImageId],\n\t\tcategory: mw.config.get('wgFormattedNamespaces')[pg.nsCategoryId],\n\t\t// shouldn't be used in popup previews, i think\n\t\tmonths: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']\n\t\t}\n\t};\n\n\t// options with default values or backreferences\n\twith (Insta.conf) {\n\tuser.name = user.name || 'Wikipedian';\n\tuser.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]';\n\t//paths.images = '//upload.wikimedia.org/wikipedia/' + wiki.lang + '/';\n\t}\n\n\t// define constants\n\tInsta.BLOCK_IMAGE = new RegExp('^\\\\[\\\\[(?:File|Image|'+Insta.conf.locale.image+\n        '):.*?\\\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i');\n\n}\n\n\nInsta.dump = function(from, to)\n{\n\tif (typeof from == 'string') { from = document.getElementById(from); }\n\tif (typeof to == 'string') { to = document.getElementById(to); }\n\tto.innerHTML = this.convert(from.value);\n};\n\nInsta.convert = function(wiki)\n{\n\tvar ll = (typeof wiki == 'string')? wiki.replace(/\\r/g,'').split(/\\n/): wiki, // lines of wikicode\n\t\to  = '', // output\n\t\tp  = 0,\t // para flag\n\t\t$r;\t // result of passing a regexp to $()\n\n\t// some shorthands\n\tfunction remain() { return ll.length; }\n\tfunction sh() { return ll.shift(); } // shift\n\tfunction ps(s) { o += s; } // push\n\n\t// similar to C's printf, uses ? as placeholders, ?? to escape question marks\n\tfunction f()\n\t{\n\t\tvar i=1, a=arguments,  f=a[0], o='', c, p;\n\t\tfor (; i<a.length; i++) {\n\t\t\tif ((p=f.indexOf('?'))+1) {\n\t\t\t\t// allow character escaping\n\t\t\t\ti -= c = f.charAt(p+1)=='?' ? 1 : 0;\n\t\t\t\to += f.substring(0,p) + (c ? '?' : a[i]);\n\t\t\t\tf = f.substr(p+1+c);\n\t\t\t} else { break; }\n\t\t}\n\t\treturn o+f;\n\t}\n\n\tfunction html_entities(s) {\n\t\treturn s.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\");\n\t}\n\t\n\t// Wiki text parsing to html is a nightmare.\n\t// The below functions deliberately don't escape the ampersand since this would make it more difficult,\n\t// and we don't absolutely need to for how we need it.\n\t// This means that any unescaped ampersands in wikitext will remain unescaped and can cause invalid HTML.\n\t// Browsers should all be able to handle it though.\n\t// We also escape significant wikimarkup characters to prevent further matching on the processed text\n\tfunction htmlescape_text(s) {\n\t\treturn s.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/:/g,\"&#58;\").replace(/\\[/g,\"&#91;\").replace(/]/g,\"&#93;\");\n\t}\n\tfunction htmlescape_attr(s) {\n\t\treturn htmlescape_text(s).replace(/'/g,\"&#39;\").replace(/\"/g,\"&quot;\");\n\t}\n\n\tfunction max(a,b) { return (a>b)?a:b; }\n\tfunction min(a,b) { return (a<b)?a:b; }\n\n\t// return the first non matching character position between two strings\n\tfunction str_imatch(a, b)\n\t{\n\t\tfor (var i=0, l=min(a.length, b.length); i<l; i++) {\n\t\t\tif (a.charAt(i)!=b.charAt(i)) { break; }\n\t\t}\n\t\treturn i;\n\t}\n\n\t// compare current line against a string or regexp\n\t// if passed a string it will compare only the first string.length characters\n\t// if passed a regexp the result is stored in $r\n\tfunction $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)); }\n\n\tfunction $$(c) { return ll[0]==c; } // compare current line against a string\n\tfunction _(p) { return ll[0].charAt(p); } // return char at pos p\n\n\tfunction endl(s) { ps(s); sh(); }\n\n\tfunction parse_list()\n\t{\n\t\tvar prev='';\n\n\t\twhile (remain() && $(/^([*#:;]+)(.*)$/)) {\n\n\t\t\tvar l_match = $r;\n\n\t\t\tsh();\n\n\t\t\tvar ipos = str_imatch(prev, l_match[1]);\n\n\t\t\t// close uncontinued lists\n\t\t\tfor (var i=prev.length-1; i >= ipos; i--) {\n\n\t\t\t\tvar pi = prev.charAt(i);\n\n\t\t\t\tif (pi=='*') { ps('</ul>'); }\n\t\t\t\telse if (pi=='#') { ps('</ol>'); }\n\t\t\t\t// close a dl only if the new item is not a dl item (:, ; or empty)\n\t\t\t\telse switch (l_match[1].charAt(i)) { case'':case'*':case'#': ps('</dl>') }\n\t\t\t}\n\n\t\t\t// open new lists\n\t\t\tfor (var i=ipos; i<l_match[1].length; i++) {\n\n\t\t\t\tvar li = l_match[1].charAt(i);\n\n\t\t\t\tif (li=='*') { ps('<ul>'); }\n\t\t\t\telse if (li=='#') { ps('<ol>'); }\n\t\t\t\t// open a new dl only if the prev item is not a dl item (:, ; or empty)\n\t\t\t\telse { switch(prev.charAt(i)) { case'':case'*':case'#': ps('<dl>') } }\n\t\t\t}\n\n\t\t\tswitch (l_match[1].charAt(l_match[1].length-1)) {\n\n\t\t\t\tcase '*': case '#':\n\t\t\t\t\tps('<li>' + parse_inline_nowiki(l_match[2])); break\n\n\t\t\t\tcase ';':\n\t\t\t\t\tps('<dt>');\n\n\t\t\t\t\tvar dt_match;\n\n\t\t\t\t\t// handle ;dt :dd format\n\t\t\t\t\tif (dt_match = l_match[2].match(/(.*?)(:.*?)$/)) {\n\n\t\t\t\t\t\tps(parse_inline_nowiki(dt_match[1]))\n\t\t\t\t\t\tll.unshift(dt_match[2])\n\n\t\t\t\t\t} else ps(parse_inline_nowiki(l_match[2]))\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ':':\n\t\t\t\t\tps('<dd>' + parse_inline_nowiki(l_match[2]))\n\t\t\t}\n\n\t\t\tprev=l_match[1]\n\t\t}\n\n\t\t// close remaining lists\n\t\tfor (var i=prev.length-1; i>=0; i--)\n\t\t\tps(f('</?>', (prev.charAt(i)=='*')? 'ul': ((prev.charAt(i)=='#')? 'ol': 'dl')))\n\t}\n\n\tfunction parse_table()\n\t{\n\t\tendl(f('<table>', $(/^\\{\\|( .*)$/)? $r[1]: ''))\n\n\t\tfor (;remain();) if ($('|')) switch (_(1)) {\n\t\t\tcase '}': endl('</table>'); return\n\t\t\tcase '-': endl(f('<tr>', $(/\\|-*(.*)/)[1])); break\n\t\t\tdefault: parse_table_data()\n\t\t}\n\t\telse if ($('!')) parse_table_data()\n\t\telse sh()\n\t}\n\n\tfunction parse_table_data()\n\t{\n\t\tvar td_line, match_i\n\n\t\t// 1: \"|+\", '|' or '+'\n\t\t// 2: ??\n\t\t// 3: attributes ??\n\t\t// TODO: finish commenting this regexp\n\t\tvar td_match = sh().match(/^(\\|\\+|\\||!)((?:([^[|]*?)\\|(?!\\|))?(.*))$/)\n\n\t\tif (td_match[1] == '|+') ps('<caption');\n\t\telse ps('<t' + ((td_match[1]=='|')?'d':'h'))\n\n\t\tif (typeof td_match[3] != 'undefined') {\n\n\t\t\t//ps(' ' + td_match[3])\n\t\t\tmatch_i = 4\n\n\t\t} else match_i = 2\n\n\t\tps('>')\n\n\t\tif (td_match[1] != '|+') {\n\n\t\t\t// use || or !! as a cell separator depending on context\n\t\t\t// NOTE: when split() is passed a regexp make sure to use non-capturing brackets\n\t\t\ttd_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\\|\\||!!)/)\n\n\t\t\tps(parse_inline_nowiki(td_line.shift()))\n\n\t\t\twhile (td_line.length) ll.unshift(td_match[1] + td_line.pop())\n\n\t\t} else ps(td_match[match_i])\n\n\t\tvar tc = 0, td = []\n\n\t\tfor (;remain(); td.push(sh()))\n\t\tif ($('|')) {\n\t\t\tif (!tc) break // we're at the outer-most level (no nested tables), skip to td parse\n\t\t\telse if (_(1)=='}') tc--\n\t\t}\n\t\telse if (!tc && $('!')) break\n\t\telse if ($('{|')) tc++\n\n\t\tif (td.length) ps(Insta.convert(td))\n\t}\n\n\tfunction parse_pre()\n\t{\n\t\tps('<pre>')\n\t\tdo endl(parse_inline_nowiki(ll[0].substring(1)) + \"\\n\"); while (remain() && $(' '))\n\t\tps('</pre>')\n\t}\n\n\tfunction parse_block_image()\n\t{\n\t\tps(parse_image(sh()))\n\t}\n\n\tfunction parse_image(str)\n\t{\n//<NOLITE>\n\t\t// get what's in between \"[[Image:\" and \"]]\"\n\t\tvar tag = str.substring(str.indexOf(':') + 1, str.length - 2);\n\n\t\tvar width;\n\t\tvar attr = [], filename, caption = '';\n\t\tvar thumb=0, frame=0, center=0;\n\t\tvar align='';\n\n\t\tif (tag.match(/\\|/)) {\n\t\t\t// manage nested links\n\t\t\tvar nesting = 0;\n\t\t\tvar last_attr;\n\t\t\tfor (var i = tag.length-1; i > 0; i--) {\n\t\t\t\tif (tag.charAt(i) == '|' && !nesting) {\n\t\t\t\t\tlast_attr = tag.substr(i+1);\n\t\t\t\t\ttag = tag.substring(0, i);\n\t\t\t\t\tbreak;\n\t\t\t\t} else switch (tag.substr(i-1, 2)) {\n\t\t\t\t\tcase ']]':\n\t\t\t\t\t\tnesting++;\n\t\t\t\t\t\ti--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '[[':\n\t\t\t\t\t\tnesting--;\n\t\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tattr = tag.split(/\\s*\\|\\s*/);\n\t\t\tattr.push(last_attr);\n\t\t\tfilename = attr.shift();\n\n\t\t\tvar w_match;\n\n\t\t\tfor (;attr.length; attr.shift())\n\t\t\tif (w_match = attr[0].match(/^(\\d*)(?:[px]*\\d*)?px$/)) width = w_match[1]\n\t\t\telse switch(attr[0]) {\n\t\t\t\tcase 'thumb':\n\t\t\t\tcase 'thumbnail':\n\t\t\t\t\tthumb=true;\n\t\t\t\tcase 'frame':\n\t\t\t\t\tframe=true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'none':\n\t\t\t\tcase 'right':\n\t\t\t\tcase 'left':\n\t\t\t\t\tcenter=false;\n\t\t\t\t\talign=attr[0];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'center':\n\t\t\t\t\tcenter=true;\n\t\t\t\t\talign='none';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif (attr.length == 1) caption = attr[0];\n\t\t\t}\n\n\t\t} else filename = tag;\n\n\n\t\tvar o='';\n\n\t\tif (frame) {\n\n\t\t\tif (align=='') align = 'right';\n\n\t\t\to += f(\"<div class='thumb t?'>\", align);\n\n\t\t\tif (thumb) {\n\t\t\t\tif (!width) width = Insta.conf.wiki.default_thumb_width;\n\n\t\t\t\to += f(\"<div style='width:?px;'>?\", 2+width*1, make_image(filename, caption, width)) +\n\t\t\t\t\tf(\"<div class='thumbcaption'><div class='magnify' style='float:right'><a href='?' class='internal' title='Enlarge'><img src='?'></a></div>?</div>\",\n\t\t\t\t\t\thtmlescape_attr(Insta.conf.paths.articles + Insta.conf.locale.image + ':' + filename),\n\t\t\t\t\t\tInsta.conf.paths.magnify_icon,\n\t\t\t\t\t\tparse_inline_nowiki(caption)\n\t\t\t\t\t)\n\t\t\t} else {\n\t\t\t\to += '<div>' + make_image(filename, caption) + f(\"<div class='thumbcaption'>?</div>\", parse_inline_nowiki(caption))\n\t\t\t}\n\n\t\t\to += '</div></div>';\n\n\t\t} else if (align != '') {\n\t\t\to += f(\"<div class='float?'><span>?</span></div>\", align, make_image(filename, caption, width));\n\t\t} else {\n\t\t\treturn make_image(filename, caption, width);\n\t\t}\n\n\t\treturn center? f(\"<div class='center'>?</div>\", o): o;\n//</NOLITE>\n\t}\n\n\tfunction parse_inline_nowiki(str)\n\t{\n\t\tvar start, lastend=0\n\t\tvar substart=0, nestlev=0, open, close, subloop;\n\t\tvar html='';\n\n\t\twhile (-1 != (start = str.indexOf('<nowiki>', substart))) {\n\t\t\thtml += parse_inline_wiki(str.substring(lastend, start));\n\t\t\tstart += 8;\n\t\t\tsubstart = start;\n\t\t\tsubloop = true;\n\t\t\tdo {\n\t\t\t\topen = str.indexOf('<nowiki>', substart);\n\t\t\t\tclose = str.indexOf('</nowiki>', substart);\n\t\t\t\tif (close<=open || open==-1) {\n\t\t\t\t\tif (close==-1) {\n\t\t\t\t\t\treturn html + html_entities(str.substr(start));\n\t\t\t\t\t}\n\t\t\t\t\tsubstart = close+9;\n\t\t\t\t\tif (nestlev) {\n\t\t\t\t\t\tnestlev--;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastend = substart;\n\t\t\t\t\t\thtml += html_entities(str.substring(start, lastend-9));\n\t\t\t\t\t\tsubloop = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsubstart = open+8;\n\t\t\t\t\tnestlev++;\n\t\t\t\t}\n\t\t\t} while (subloop)\n\t\t}\n\n\t\treturn html + parse_inline_wiki(str.substr(lastend));\n\t}\n\n\tfunction make_image(filename, caption, width)\n\t{\n//<NOLITE>\n\t\t// uppercase first letter in file name\n\t\tfilename = filename.charAt(0).toUpperCase() + filename.substr(1);\n\t\t// replace spaces with underscores\n\t\tfilename = filename.replace(/ /g, '_');\n\n\t\tcaption = strip_inline_wiki(caption);\n\n\t\tvar md5 = hex_md5(filename);\n\n\t\tvar source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename;\n\n\t\tif (width) width = \"width='\" + width + \"px'\";\n\n\t\tvar img = \"<img onerror=\\\"\"+pg.escapeQuotesHTML(\"this.onerror=null;this.src='\"+pg.jsescape(Insta.conf.paths.images_fallback + source)+\"'\")+\"\\\" src=\\\"\"+pg.escapeQuotesHTML(Insta.conf.paths.images + source)+\"\\\" \"+(caption!='' ? \"alt=\\\"\" + pg.escapeQuotesHTML(caption) + \"\\\"\" : '')+\" \"+width+\">\";\n\n\t\treturn f(\"<a class='image' ? href=\\\"?\\\">?</a>\", (caption!='')? \"title=\\\"\" + pg.escapeQuotesHTML(caption) + \"\\\"\" : '', pg.escapeQuotesHTML(Insta.conf.paths.articles + Insta.conf.locale.image + ':' + filename), img);\n//</NOLITE>\n\t}\n\n\tfunction parse_inline_images(str)\n\t{\n//<NOLITE>\n\t\tvar start, substart=0, nestlev=0;\n\t\tvar loop, close, open, wiki, html;\n\n\t\twhile (-1 != (start=str.indexOf('[[', substart))) {\n\t\t\tif(str.substr(start+2).match(RegExp('^(Image|File|' + Insta.conf.locale.image + '):','i'))) {\n\t\t\t\tloop=true;\n\t\t\t\tsubstart=start;\n\t\t\t\tdo {\n\t\t\t\t\tsubstart+=2;\n\t\t\t\t\tclose=str.indexOf(']]',substart);\n\t\t\t\t\topen=str.indexOf('[[',substart);\n\t\t\t\t\tif (close<=open||open==-1) {\n\t\t\t\t\t\tif (close==-1) return str;\n\t\t\t\t\t\tsubstart=close;\n\t\t\t\t\t\tif (nestlev) {\n\t\t\t\t\t\t\tnestlev--;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twiki=str.substring(start,close+2);\n\t\t\t\t\t\t\thtml=parse_image(wiki);\n\t\t\t\t\t\t\tstr=str.replace(wiki,html);\n\t\t\t\t\t\t\tsubstart=start+html.length;\n\t\t\t\t\t\t\tloop=false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubstart=open;\n\t\t\t\t\t\tnestlev++;\n\t\t\t\t\t}\n\t\t\t\t} while (loop)\n\n\t\t\t} else break;\n\t\t}\n\n//</NOLITE>\n\t\treturn str;\n\t}\n\n\t// the output of this function doesn't respect the FILO structure of HTML\n\t// but since most browsers can handle it I'll save myself the hassle\n\tfunction parse_inline_formatting(str)\n\t{\n\t\tvar em,st,i,li,o='';\n\t\twhile ((i=str.indexOf(\"''\",li))+1) {\n\t\t\to += str.substring(li,i);\n\t\t\tli=i+2;\n\t\t\tif (str.charAt(i+2)==\"'\") {\n\t\t\t\tli++;\n\t\t\t\tst=!st;\n\t\t\t\to+=st?'<strong>':'</strong>';\n\t\t\t} else {\n\t\t\t\tem=!em;\n\t\t\t\to+=em?'<em>':'</em>';\n\t\t\t}\n\t\t}\n\t\treturn o+str.substr(li);\n\t}\n\n\tfunction parse_inline_wiki(str)\n\t{\n\t\tvar aux_match;\n\n\t\tstr = parse_inline_images(str);\n\t\tstr = parse_inline_formatting(str);\n\n\t\t// math\n\t\twhile (aux_match = str.match(/<(?:)math>(.*?)<\\/math>/i)) {\n\t\t\tvar math_md5 = hex_md5(aux_match[1]);\n\t\t\tstr = str.replace(aux_match[0], f(\"<img src='?.png'>\", Insta.conf.paths.math+math_md5));\n\t\t}\n\n\t\t// Build a Mediawiki-formatted date string\n\t\tvar date = new Date;\n\t\tvar minutes = date.getUTCMinutes();\n\t\tif (minutes < 10) minutes = '0' + minutes;\n\t\tvar date = f(\"?:?, ? ? ? (UTC)\", date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());\n\n\t\t// text formatting\n\t\treturn str.\n\t\t\t// signatures\n\t\t\treplace(/~{5}(?!~)/g, date).\n\t\t\treplace(/~{4}(?!~)/g, Insta.conf.user.name+' '+date).\n\t\t\treplace(/~{3}(?!~)/g, Insta.conf.user.name).\n\n\t\t\t// [[:Category:...]], [[:Image:...]], etc...\n\t\t\treplace(RegExp('\\\\[\\\\[:((?:'+Insta.conf.locale.category+'|Image|File|'+Insta.conf.locale.image+'|'+Insta.conf.wiki.interwiki+'):[^|]*?)\\\\]\\\\](\\w*)','gi'), function($0,$1,$2){return f(\"<a href='?'>?</a>\", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));}).\n\t\t\t// remove straight category and interwiki tags\n\t\t\treplace(RegExp('\\\\[\\\\[(?:'+Insta.conf.locale.category+'|'+Insta.conf.wiki.interwiki+'):.*?\\\\]\\\\]','gi'),'').\n\n\t\t\t// [[:Category:...|Links]], [[:Image:...|Links]], etc...\n\t\t\treplace(RegExp('\\\\[\\\\[:((?:'+Insta.conf.locale.category+'|Image|File|'+Insta.conf.locale.image+'|'+Insta.conf.wiki.interwiki+'):.*?)\\\\|([^\\\\]]+?)\\\\]\\\\](\\\\w*)','gi'), function($0,$1,$2,$3){return f(\"<a href='?'>?</a>\", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));}).\n\n\t\t\t// [[/Relative links]]\n\t\t\treplace(/\\[\\[(\\/[^|]*?)\\]\\]/g, function($0,$1){return f(\"<a href='?'>?</a>\", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($1)); }).\n\n\t\t\t// [[/Replaced|Relative links]]\n\t\t\treplace(/\\[\\[(\\/.*?)\\|(.+?)\\]\\]/g, function($0,$1,$2){return f(\"<a href='?'>?</a>\", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($2)); }).\n\n\t\t\t// [[Common links]]\n\t\t\treplace(/\\[\\[([^|]*?)\\]\\](\\w*)/g, function($0,$1,$2){return f(\"<a href='?'>?</a>\", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2)); }).\n\n\t\t\t// [[Replaced|Links]]\n\t\t\treplace(/\\[\\[(.*?)\\|([^\\]]+?)\\]\\](\\w*)/g, function($0,$1,$2,$3){return f(\"<a href='?'>?</a>\", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3)); }).\n\n\t\t\t// [[Stripped:Namespace|Namespace]]\n\t\t\treplace(/\\[\\[([^\\]]*?:)?(.*?)( *\\(.*?\\))?\\|\\]\\]/g, function($0,$1,$2,$3){return f(\"<a href='?'>?</a>\", Insta.conf.paths.articles + htmlescape_attr($1) + htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($2)); }).\n\n\t\t\t// External links\n\t\t\treplace(/\\[(https?|news|ftp|mailto|gopher|irc):(\\/*)([^\\]]*?) (.*?)\\]/g, function($0,$1,$2,$3,$4){return f(\"<a class='external' href='?:?'>?</a>\", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($4)); }).\n\t\t\treplace(/\\[http:\\/\\/(.*?)\\]/g, function($0,$1){return f(\"<a class='external' href='http://?'>[#]</a>\", htmlescape_attr($1)); }).\n\t\t\treplace(/\\[(news|ftp|mailto|gopher|irc):(\\/*)(.*?)\\]/g, function($0,$1,$2,$3,$4){return f(\"<a class='external' href='?:?'>?:?</a>\", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($1), htmlescape_text($2) + htmlescape_text($3)); }).\n\t\t\treplace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\\/*)([^ $]*[^.,!?;: $])/g, function($0,$1,$2,$3,$4){return f(\"?<a class='external' href='?:?'>?:?</a>\", htmlescape_text($1), htmlescape_attr($2), htmlescape_attr($3) + htmlescape_attr($4), htmlescape_text($2), htmlescape_text($3) + htmlescape_text($4)); }).\n\n\t\t\treplace('__NOTOC__','').\n\t\t\treplace('__NOEDITSECTION__','');\n\t}\n/*\n*/\n\tfunction strip_inline_wiki(str)\n\t{\n\t\treturn str\n\t\t\t.replace(/\\[\\[[^\\]]*\\|(.*?)\\]\\]/g,'$1')\n\t\t\t.replace(/\\[\\[(.*?)\\]\\]/g,'$1')\n\t\t\t.replace(/''(.*?)''/g,'$1');\n\t}\n\n\t// begin parsing\n\tfor (;remain();) if ($(/^(={1,6})(.*)\\1(.*)$/)) {\n\t\tp=0\n\t\tendl(f('<h?>?</h?>?', $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3]))\n\n\t} else if ($(/^[*#:;]/)) {\n\t\tp=0\n\t\tparse_list()\n\n\t} else if ($(' ')) {\n\t\tp=0\n\t\tparse_pre()\n\n\t} else if ($('{|')) {\n\t\tp=0\n\t\tparse_table()\n\n\t} else if ($(/^----+$/)) {\n\t\tp=0\n\t\tendl('<hr>')\n\n\t} else if ($(Insta.BLOCK_IMAGE)) {\n\t\tp=0\n\t\tparse_block_image()\n\n\t} else {\n\n\t\t// handle paragraphs\n\t\tif ($$('')) {\n\t\t\tif (p = (remain()>1 && ll[1]==(''))) endl('<p><br>')\n\t\t} else {\n\t\t\tif(!p) {\n\t\t\t\tps('<p>')\n\t\t\t\tp=1\n\t\t\t}\n\t\t\tps(parse_inline_nowiki(ll[0]) + ' ')\n\t\t}\n\n\t\tsh();\n\t}\n\n\treturn o\n};\n\nwindow.wiki2html=function(txt,baseurl) {\n\tInsta.conf.baseUrl=baseurl;\n\treturn Insta.convert(txt);\n};\n// ENDFILE: livepreview.js\n// STARTFILE: pageinfo.js\n//<NOLITE>\nfunction popupFilterPageSize(data) {\n\treturn formatBytes(data.length);\n}\n\nfunction popupFilterCountLinks(data) {\n\tvar num=countLinks(data);\n\treturn String(num) + '&nbsp;' + ((num!=1)?popupString('wikiLinks'):popupString('wikiLink'));\n}\n\nfunction popupFilterCountImages(data) {\n\tvar num=countImages(data);\n\treturn String(num) + '&nbsp;' + ((num!=1)?popupString('images'):popupString('image'));\n}\n\nfunction popupFilterCountCategories(data) {\n\tvar num=countCategories(data);\n\treturn String(num) + '&nbsp;' + ((num!=1)?popupString('categories'):popupString('category'));\n}\n\n\nfunction popupFilterLastModified(data,download) {\n\tvar lastmod=download.lastModified;\n\tvar now=new Date();\n\tvar age=now-lastmod;\n\tif (lastmod && getValueOf('popupLastModified')) {\n\t\treturn (tprintf('%s old', [formatAge(age)])).replace(RegExp(' ','g'), '&nbsp;');\n\t}\n\treturn '';\n}\n\nfunction formatAge(age) {\n\t// coerce into a number\n\tvar a=0+age, aa=a;\n\n\tvar seclen  = 1000;\n\tvar minlen  = 60*seclen;\n\tvar hourlen = 60*minlen;\n\tvar daylen  = 24*hourlen;\n\tvar weeklen = 7*daylen;\n\n\tvar numweeks = (a-a%weeklen)/weeklen; a = a-numweeks*weeklen; var sweeks = addunit(numweeks, 'week');\n\tvar numdays  = (a-a%daylen)/daylen;   a = a-numdays*daylen;   var sdays  = addunit(numdays, 'day');\n\tvar numhours = (a-a%hourlen)/hourlen; a = a-numhours*hourlen; var shours = addunit(numhours,'hour');\n\tvar nummins  = (a-a%minlen)/minlen;   a = a-nummins*minlen;   var smins  = addunit(nummins, 'minute');\n\tvar numsecs  = (a-a%seclen)/seclen;   a = a-numsecs*seclen;   var ssecs  = addunit(numsecs, 'second');\n\n\tif (aa > 4*weeklen) { return sweeks; }\n\tif (aa > weeklen)   { return sweeks + ' ' + sdays; }\n\tif (aa > daylen)\t{ return sdays  + ' ' + shours; }\n\tif (aa > 6*hourlen) { return shours; }\n\tif (aa > hourlen)   { return shours + ' ' + smins; }\n\tif (aa > 10*minlen) { return smins; }\n\tif (aa > minlen)\t{ return smins  + ' ' + ssecs; }\n\treturn ssecs;\n}\n\nfunction addunit(num,str) { return '' + num + ' ' + ((num!=1) ? popupString(str+'s') : popupString(str)) ;}\n\nfunction runPopupFilters(list, data, download) {\n\tvar ret=[];\n\tfor (var i=0; i<list.length; ++i) {\n\t\tif (list[i] && typeof list[i] == 'function') {\n\t\t\tvar s=list[i](data, download, download.owner.article);\n\t\t\tif (s) { ret.push(s); }\n\t\t}\n\t}\n\treturn ret;\n}\n\nfunction getPageInfo(data, download) {\n\tif (!data || data.length === 0) { return popupString('Empty page'); }\n\n\tvar popupFilters=getValueOf('popupFilters') || [];\n\tvar extraPopupFilters = getValueOf('extraPopupFilters') || [];\n\tvar pageInfoArray = runPopupFilters(popupFilters.concat(extraPopupFilters), data, download);\n\n\tvar pageInfo=pageInfoArray.join(', ');\n\tif (pageInfo !== '' ) { pageInfo = upcaseFirst(pageInfo); }\n\treturn pageInfo;\n}\n\n\n// this could be improved!\nfunction countLinks(wikiText) { return wikiText.split('[[').length - 1; }\n\n// if N = # matches, n = # brackets, then\n// String.parenSplit(regex) intersperses the N+1 split elements\n// with Nn other elements. So total length is\n// L= N+1 + Nn = N(n+1)+1. So N=(L-1)/(n+1).\n\nfunction countImages(wikiText) {\n\treturn (wikiText.parenSplit(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1);\n}\n\nfunction countCategories(wikiText) {\n\treturn (wikiText.parenSplit(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1);\n}\n\nfunction popupFilterStubDetect(data, download, article)\t {\n\tvar counts=stubCount(data, article);\n\tif (counts.real) { return popupString('stub'); }\n\tif (counts.sect) { return popupString('section stub'); }\n\treturn '';\n}\n\nfunction popupFilterDisambigDetect(data, download, article) {\n\tif (getValueOf('popupOnlyArticleDabStub') && article.namespace()) { return ''; }\n\treturn (isDisambig(data, article)) ? popupString('disambig') : '';\n}\n\nfunction formatBytes(num) {\n\treturn (num > 949) ? (Math.round(num/100)/10+popupString('kB')) : (num +'&nbsp;' + popupString('bytes')) ;\n}\n//</NOLITE>\n// ENDFILE: pageinfo.js\n// STARTFILE: titles.js\n/**\n   @fileoverview Defines the {@link Title} class, and associated crufty functions.\n\n   <code>Title</code> deals with article titles and their various\n   forms.  {@link Stringwrapper} is the parent class of\n   <code>Title</code>, which exists simply to make things a little\n   neater.\n\n*/\n\n/**\n   Creates a new Stringwrapper.\n   @constructor\n\n   @class the Stringwrapper class. This base class is not really\n   useful on its own; it just wraps various common string operations.\n*/\nfunction Stringwrapper() {\n\t/**\n\t   Wrapper for this.toString().indexOf()\n\t   @param {String} x\n\t   @type integer\n\t*/\n\tthis.indexOf=function(x){return this.toString().indexOf(x);};\n\t/**\n\t   Returns this.value.\n\t   @type String\n\t*/\n\tthis.toString=function(){return this.value;};\n\t/**\n\t   Wrapper for {@link String#parenSplit} applied to this.toString()\n\t   @param {RegExp} x\n\t   @type Array\n\t*/\n\tthis.parenSplit=function(x){return this.toString().parenSplit(x);};\n\t/**\n\t   Wrapper for this.toString().substring()\n\t   @param {String} x\n\t   @param {String} y (optional)\n\t   @type String\n\t*/\n\tthis.substring=function(x,y){\n\t\tif (typeof y=='undefined') { return this.toString().substring(x); }\n\t\treturn this.toString().substring(x,y);\n\t};\n\t/**\n\t   Wrapper for this.toString().split()\n\t   @param {String} x\n\t   @type Array\n\t*/\n\tthis.split=function(x){return this.toString().split(x);};\n\t/**\n\t   Wrapper for this.toString().replace()\n\t   @param {String} x\n\t   @param {String} y\n\t   @type String\n\t*/\n\tthis.replace=function(x,y){ return this.toString().replace(x,y); };\n}\n\n\n/**\n   Creates a new <code>Title</code>.\n   @constructor\n\n   @class The Title class. Holds article titles and converts them into\n   various forms. Also deals with anchors, by which we mean the bits\n   of the article URL after a # character, representing locations\n   within an article.\n\n   @param {String} value The initial value to assign to the\n   article. This must be the canonical title (see {@link\n   Title#value}. Omit this in the constructor and use another function\n   to set the title if this is unavailable.\n*/\nfunction Title(val) {\n\t/**\n\t   The canonical article title. This must be in UTF-8 with no\n\t   entities, escaping or nasties. Also, underscores should be\n\t   replaced with spaces.\n\t   @type String\n\t   @private\n\t*/\n\tthis.value=null;\n\t/**\n\t   The canonical form of the anchor. This should be exactly as\n\t   it appears in the URL, i.e. with the .C3.0A bits in.\n\t   @type String\n\t*/\n\tthis.anchor='';\n\n\tthis.setUtf(val);\n}\nTitle.prototype=new Stringwrapper();\n/**\n   Returns the canonical representation of the article title, optionally without anchor.\n   @param {boolean} omitAnchor\n   @fixme Decide specs for anchor\n   @return String The article title and the anchor.\n*/\nTitle.prototype.toString=function(omitAnchor) {\n\treturn this.value + ( (!omitAnchor && this.anchor) ? '#' + this.anchorString() : '' );\n};\nTitle.prototype.anchorString=function() {\n\tif (!this.anchor) { return ''; }\n\tvar split=this.anchor.parenSplit(/((?:[.][0-9A-F]{2})+)/);\n\tvar len=split.length;\n\tfor (var j=1; j<len; j+=2) {\n\t\t// FIXME s/decodeURI/decodeURIComponent/g ?\n\t\tsplit[j]=decodeURIComponent(split[j].split('.').join('%')).split('_').join(' ');\n\t}\n\treturn split.join('');\n};\nTitle.prototype.urlAnchor=function() {\n\tvar split=this.anchor.parenSplit('/((?:[%][0-9A-F]{2})+)/');\n\tvar len=split.length;\n\tfor (var j=1; j<len; j+=2) {\n\t\tsplit[j]=split[j].split('%').join('.');\n\t}\n\treturn split.join('');\n};\nTitle.prototype.anchorFromUtf=function(str) {\n\tthis.anchor=encodeURIComponent(str.split(' ').join('_'))\n\t.split('%3A').join(':').split(\"'\").join('%27').split('%').join('.');\n};\nTitle.fromURL=function(h) {\n\treturn new Title().fromURL(h);\n};\nTitle.prototype.fromURL=function(h) {\n\tif (typeof h != 'string') {\n\t\tthis.value=null;\n\t\treturn this;\n\t}\n\n\t// NOTE : playing with decodeURI, encodeURI, escape, unescape,\n\t// we seem to be able to replicate the IE borked encoding\n\n\t// IE doesn't do this new-fangled utf-8 thing.\n\t// and it's worse than that.\n\t// IE seems to treat the query string differently to the rest of the url\n\t// the query is treated as bona-fide utf8, but the first bit of the url is pissed around with\n\n\t// we fix up & for all browsers, just in case.\n\tvar splitted=h.split('?');\n\tsplitted[0]=splitted[0].split('&').join('%26');\n\n\tif (pg.flag.linksLikeIE6) {\n\t\tsplitted[0]=encodeURI(decode_utf8(splitted[0]));\n\t}\n\n\th=splitted.join('?');\n\n\tvar contribs=pg.re.contribs.exec(h);\n\tif (contribs !== null) {\n\t\tif (contribs[1]=='title=') { contribs[3]=contribs[3].split('+').join(' '); }\n\t\tvar u=new Title(contribs[3]);\n\t\tthis.setUtf(this.decodeNasties(mw.config.get('wgFormattedNamespaces')[pg.nsUserId] + ':' + u.stripNamespace()));\n\t\treturn this;\n\t}\n\n\tvar email=pg.re.email.exec(h);\n\tif (email !== null) {\n\t\tthis.setUtf(this.decodeNasties(mw.config.get('wgFormattedNamespaces')[pg.nsUserId] + ':' + new Title(email[3]).stripNamespace()));\n\t\treturn this;\n\t}\n\n\tvar backlinks=pg.re.backlinks.exec(h);\n\tif (backlinks) {\n\t\tthis.setUtf(this.decodeNasties(new Title(backlinks[3])));\n\t\treturn this;\n\t}\n\n\t// no more special cases to check --\n\t// hopefully it's not a disguised user-related or specially treated special page\n\tvar m=pg.re.main.exec(h);\n\tif(m===null) { this.value=null; }\n\telse {\n\t\tvar fromBotInterface = /[?](.+[&])?title=/.test(h);\n\t\tif (fromBotInterface) {\n\t\t\tm[2]=m[2].split('+').join('_');\n\t\t}\n\t\tvar extracted = m[2] + (m[3] ? '#' + m[3] : '');\n\t\tif (pg.flag.isSafari && /%25[0-9A-Fa-f]{2}/.test(extracted)) {\n\t\t\t// Fix Safari issue\n\t\t\t// Safari sometimes encodes % as %25 in UTF-8 encoded strings like %E5%A3 -> %25E5%25A3.\n\t\t\tthis.setUtf(decodeURIComponent(unescape(extracted)));\n\t\t} else {\n\t\t\tthis.setUtf(this.decodeNasties(extracted));\n\t\t}\n\t}\n\treturn this;\n};\nTitle.prototype.decodeNasties=function(txt) {\n\tvar ret= this.decodeEscapes(decodeURI(txt));\n\tret = ret.replace(/[_ ]*$/, '');\n\treturn ret;\n};\nTitle.prototype.decodeEscapes=function(txt) {\n\tvar split=txt.parenSplit(/((?:[%][0-9A-Fa-f]{2})+)/);\n\tvar len=split.length;\n\tfor (var i=1; i<len; i=i+2) {\n\t\t// FIXME is decodeURIComponent better?\n\t\tsplit[i]=unescape(split[i]);\n\t}\n\treturn split.join('');\n};\nTitle.fromAnchor=function(a) {\n\treturn new Title().fromAnchor(a);\n};\nTitle.prototype.fromAnchor=function(a) {\n\tif (!a) { this.value=null; return this; }\n\treturn this.fromURL(a.href);\n};\nTitle.fromWikiText=function(txt) {\n\treturn new Title().fromWikiText(txt);\n};\nTitle.prototype.fromWikiText=function(txt) {\n\t// FIXME - testing needed\n\tif (!pg.flag.linksLikeIE6) { txt=myDecodeURI(txt); }\n\tthis.setUtf(txt);\n\treturn this;\n};\nTitle.prototype.hintValue=function(){\n\tif(!this.value) { return ''; }\n\treturn safeDecodeURI(this.value);\n};\n//<NOLITE>\nTitle.prototype.toUserName=function(withNs) {\n\tif (this.namespaceId() != pg.nsUserId && this.namespaceId() != pg.nsUsertalkId) {\n\t\tthis.value=null;\n\t\treturn;\n\t}\n\tthis.value = (withNs ? mw.config.get('wgFormattedNamespaces')[pg.nsUserId] + ':' : '') + this.stripNamespace().split('/')[0];\n};\nTitle.prototype.userName=function(withNs) {\n\tvar t=(new Title(this.value));\n\tt.toUserName(withNs);\n\tif (t.value) { return t; }\n\treturn null;\n};\nTitle.prototype.toTalkPage=function() {\n\t// convert article to a talk page, or if we can't, return null\n\t// In other words: return null if this ALREADY IS a talk page\n\t// and return the corresponding talk page otherwise\n\t//\n\t// Per http://www.mediawiki.org/wiki/Manual:Namespace#Subject_and_talk_namespaces\n\t// * All discussion namespaces have odd-integer indices\n\t// * The discussion namespace index for a specific namespace with index n is n + 1\n\tif (this.value===null) { return null; }\n\t\n\tvar namespaceId = this.namespaceId();\n\tif (namespaceId>=0 && namespaceId % 2 == 0) //non-special and subject namespace\n\t{\n\t\tvar localizedNamespace = mw.config.get('wgFormattedNamespaces')[namespaceId+1];\n\t\tif (typeof localizedNamespace!=='undefined')\n\t\t{\n\t\t\tif (localizedNamespace==='') return this.value = this.stripNamespace();\n\t\t\tthis.value = localizedNamespace.split(' ').join('_') + ':' + this.stripNamespace();\n\t\t\treturn this.value;\n\t\t}\n\t}\n\n\tthis.value=null;\n\treturn null;\n};\n//</NOLITE>\n// Return canonical, localized namespace\nTitle.prototype.namespace=function() {\n\treturn mw.config.get('wgFormattedNamespaces')[this.namespaceId()];\n};\nTitle.prototype.namespaceId=function() {\n\tvar n=this.value.indexOf(':');\n\tif (n<0) { return 0; } //mainspace\n\tvar namespaceId = mw.config.get('wgNamespaceIds')[this.value.substring(0,n).split(' ').join('_').toLowerCase()];\n\tif (typeof namespaceId=='undefined') return 0; //mainspace\n\treturn namespaceId;\n};\n//<NOLITE>\nTitle.prototype.talkPage=function() {\n\tvar t=new Title(this.value);\n\tt.toTalkPage();\n\tif (t.value) { return t; }\n\treturn null;\n};\nTitle.prototype.isTalkPage=function() {\n\tif (this.talkPage()===null) { return true; }\n\treturn false;\n};\nTitle.prototype.toArticleFromTalkPage=function() {\n\t//largely copy/paste from toTalkPage above.\n\tif (this.value===null) { return null; }\n\t\n\tvar namespaceId = this.namespaceId();\n\tif (namespaceId>=0 && namespaceId % 2 == 1) //non-special and talk namespace\n\t{\n\t\tvar localizedNamespace = mw.config.get('wgFormattedNamespaces')[namespaceId-1];\n\t\tif (typeof localizedNamespace!=='undefined')\n\t\t{\n\t\t\tif (localizedNamespace==='') return this.value = this.stripNamespace();\n\t\t\tthis.value = localizedNamespace.split(' ').join('_') + ':' + this.stripNamespace();\n\t\t\treturn this.value;\n\t\t}\n\t}\n\n\tthis.value=null;\n\treturn null;\n};\nTitle.prototype.articleFromTalkPage=function() {\n\tvar t=new Title(this.value);\n\tt.toArticleFromTalkPage();\n\tif (t.value) { return t; }\n\treturn null;\n};\nTitle.prototype.articleFromTalkOrArticle=function() {\n\tvar t=new Title(this.value);\n\tif ( t.toArticleFromTalkPage() ) { return t; }\n\treturn this;\n};\nTitle.prototype.isIpUser=function() {\n\treturn pg.re.ipUser.test(this.userName());\n};\n//</NOLITE>\nTitle.prototype.stripNamespace=function(){ // returns a string, not a Title\n\tvar n=this.value.indexOf(':');\n\tif (n<0) { return this.value; }\n\tvar namespaceId = this.namespaceId();\n\tif (namespaceId===pg.nsMainspaceId) return this.value;\n\treturn this.value.substring(n+1);\n};\nTitle.prototype.setUtf=function(value){\n\tif (!value) { this.value=''; return; }\n\tvar anch=value.indexOf('#');\n\tif(anch < 0) { this.value=value.split('_').join(' '); this.anchor=''; return; }\n\tthis.value=value.substring(0,anch).split('_').join(' ');\n\tthis.anchor=value.substring(anch+1);\n\tthis.ns=null; // wait until namespace() is called\n};\nTitle.prototype.setUrl=function(urlfrag) {\n\tvar anch=urlfrag.indexOf('#');\n\tthis.value=safeDecodeURI(urlfrag.substring(0,anch));\n\tthis.anchor=value.substring(anch+1);\n};\nTitle.prototype.append=function(x){\n\tthis.setUtf(this.value + x);\n};\nTitle.prototype.urlString=function(x) {\n\tx || ( x={} );\n\tvar v=this.toString(true);\n\tif (!x.omitAnchor && this.anchor) { v+= '#' + this.urlAnchor(); }\n\tif (!x.keepSpaces) { v=v.split(' ').join('_'); }\n\treturn encodeURI(v).split('&').join('%26').split('?').join('%3F').split('+').join('%2B');\n};\nTitle.prototype.removeAnchor=function() {\n\treturn new Title(this.toString(true));\n};\nTitle.prototype.toUrl=function() {\n\treturn pg.wiki.titlebase + this.urlString();\n};\n\n\nfunction paramValue(param, url) {\n\tvar s=url.parenSplit(RegExp('[?&]' + literalizeRegex(param) + '=([^?&]*)'));\n\tif (!url) { return null; }\n\treturn s[1] || null;\n}\n\nfunction parseParams(url) {\n\tvar ret={};\n\tif (url.indexOf('?')==-1) { return ret; }\n\tvar s=url.split('?').slice(1).join();\n\tvar t=s.split('&');\n\tfor (var i=0; i<t.length; ++i) {\n\t\tvar z=t[i].split('=');\n\t\tz.push(null);\n\t\tret[z[0]]=z[1];\n\t}\n\treturn ret;\n}\n\n// all sorts of stuff here\n// FIXME almost everything needs to be rewritten\n\nfunction oldidFromAnchor(a) { return paramValue('oldid', a.href); }\n//function diffFromAnchor(a) { return paramValue('diff', a.href); }\n\n\nfunction wikiMarkupToAddressFragment (str) { // for images\n\tvar ret = safeDecodeURI(str);\n\tret = ret.split(' ').join('_');\n\tret = encodeURI(ret);\n\treturn ret;\n}\n\n// (a) myDecodeURI (first standard decodeURI, then pg.re.urlNoPopup)\n// (b) change spaces to underscores\n// (c) encodeURI (just the straight one, no pg.re.urlNoPopup)\n\nfunction myDecodeURI (str) {\n\tvar ret;\n\t// FIXME decodeURIComponent??\n\ttry { ret=decodeURI(str.toString()); }\n\tcatch (summat) { return str; }\n\tfor (var i=0; i<pg.misc.decodeExtras.length; ++i) {\n\t\tvar from=pg.misc.decodeExtras[i].from;\n\t\tvar to=pg.misc.decodeExtras[i].to;\n\t\tret=ret.split(from).join(to);\n\t}\n\treturn ret;\n}\n\nfunction safeDecodeURI(str) { var ret=myDecodeURI(str); return ret || str; }\n\n///////////\n// TESTS //\n///////////\n\n//<NOLITE>\nfunction isIpUser(user) {return pg.re.ipUser.test(user);}\n\nfunction isDisambig(data, article) {\n\tif (!getValueOf('popupAllDabsStubs') && article.namespace()) { return false; }\n\treturn ! article.isTalkPage() && pg.re.disambig.test(data);\n}\n\nfunction stubCount(data, article) {\n\tif (!getValueOf('popupAllDabsStubs') && article.namespace()) { return false; }\n\tvar sectStub=0;\n\tvar realStub=0;\n\tif (pg.re.stub.test(data)) {\n\t\tvar s=data.parenSplit(pg.re.stub);\n\t\tfor (var i=1; i<s.length; i=i+2) {\n\t\t\tif (s[i]) { ++sectStub; }\n\t\t\telse { ++realStub; }\n\t\t}\n\t}\n\treturn { real: realStub, sect: sectStub };\n}\n\nfunction isValidImageName(str){ // extend as needed...\n\treturn ( str.indexOf('{') == -1 );\n}\n\nfunction isInStrippableNamespace(article) {\n\t//I believe that this method means to return whether the given article is in a namspace without subpages. Meaning, it's broken.\n\treturn ( article.namespace() !== '' );\n}\n\nfunction isInMainNamespace(article) { return !isInStrippableNamespace(article); }\n\nfunction anchorContainsImage(a) {\n\t// iterate over children of anchor a\n\t// see if any are images\n\tif (a===null) { return false; }\n\tkids=a.childNodes;\n\tfor (var i=0; i<kids.length; ++i) { if (kids[i].nodeName=='IMG') { return true; } }\n\treturn false;\n}\n//</NOLITE>\nfunction isPopupLink(a) {\n\t// NB for performance reasons, TOC links generally return true\n\t// they should be stripped out later\n\n\tif (!markNopopupSpanLinks.done) { markNopopupSpanLinks(); }\n\tif (a.inNopopupSpan) { return false; }\n\n\t// FIXME is this faster inline?\n\tif (a.onmousedown || a.getAttribute('nopopup')) { return false; }\n\tvar h=a.href;\n\tif (h===document.location.href+'#') { return false; }\n\tif (!pg.re.basenames.test(h)) { return false; }\n\tif (!pg.re.urlNoPopup.test(h)) { return true;\t}\n\treturn (\n\t\t(pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h)) &&\n\t\th.indexOf('&limit=') == -1 );\n}\n\nfunction markNopopupSpanLinks() {\n\tif( !getValueOf('popupOnlyArticleLinks'))\n\t\tfixVectorMenuPopups();\n\n\tvar s = $('.nopopups').toArray();\n\tfor (var i=0; i<s.length; ++i) {\n\t\tvar as=s[i].getElementsByTagName('a');\n\t\tfor (var j=0; j<as.length; ++j) {\n\t\t\tas[j].inNopopupSpan=true;\n\t\t}\n\t}\n\t\n\tmarkNopopupSpanLinks.done=true;\n}\n\nfunction fixVectorMenuPopups() {\n\t$('div.vectorMenu h3:first a:first').prop('inNopopupSpan', true);\n}\n// ENDFILE: titles.js\n// STARTFILE: cookies.js\n//<NOLITE>\n//////////////////////////////////////////////////\n// Cookie handling\n// from http://www.quirksmode.org/js/cookies.html\n\nvar Cookie= {\n\tcreate: function(name,value,days)\n\t{\n\t\tvar expires;\n\t\tif (days)\n\t\t{\n\t\t\tvar date = new Date();\n\t\t\tdate.setTime(date.getTime()+(days*24*60*60*1000));\n\t\t\texpires = \"; expires=\"+date.toGMTString();\n\t\t}\n\t\telse { expires = \"\"; }\n\t\tdocument.cookie = name+\"=\"+value+expires+\"; path=/\";\n\t},\n\n\tread: function(name)\n\t{\n\t\tvar nameEQ = name + \"=\";\n\t\tvar ca = document.cookie.split(';');\n\t\tfor(var i=0;i < ca.length;i++)\n\t\t{\n\t\t\tvar c = ca[i];\n\t\t\twhile (c.charAt(0)==' ') { c = c.substring(1,c.length); }\n\t\t\tif (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }\n\t\t}\n\t\treturn null;\n\t},\n\n\terase: function(name)\n\t{\n\t\tCookie.create(name,\"\",-1);\n\t}\n};\n//</NOLITE>\n// ENDFILE: cookies.js\n// STARTFILE: getpage.js\n//////////////////////////////////////////////////\n// Wiki-specific downloading\n//\n\n// Schematic for a getWiki call\n//\n//   getWiki->-getPageWithCaching\n//\t\t\t\t\t|\n//\t   false\t\t|\t\t  true\n// getPage<-[findPictureInCache]->-onComplete(a fake download)\n//   \\.\n//\t (async)->addPageToCache(download)->-onComplete(download)\n\n\n/** @todo {document}\n\t@param {Title} article\n\t@param {Function} onComplete\n\t@param {integer} oldid\n\t@param {Navapopup} owner\n*/\nfunction getWiki(article, onComplete, oldid, owner) {\n\t// set ctype=text/css to get around opera gzip bug\n\tvar url = pg.wiki.titlebase + article.removeAnchor().urlString() +\n\t\t'&action=raw&ctype=text/css';\n\tif (oldid || oldid===0 || oldid==='0') { url += '&oldid='+oldid; }\n\turl += '&maxage=0&smaxage=0';\n\n\tgetPageWithCaching(url, onComplete, owner);\n}\n\n// check cache to see if page exists\n\nfunction getPageWithCaching(url, onComplete, owner) {\n\tlog('getPageWithCaching, url='+url);\n\tvar i=findInPageCache(url);\n\tif (i > -1) {\n\t\tvar d=fakeDownload(url, owner.idNumber, onComplete,\n\t\t\t\t   pg.cache.pages[i].data, pg.cache.pages[i].lastModified,\n\t\t\t\t   owner);\n\t} else {\n\t\tvar d=getPage(url, onComplete, owner);\n\t\tif (d && owner && owner.addDownload) {\n\t\t\towner.addDownload(d);\n\t\t\td.owner=owner;\n\t\t}\n\t}\n}\n\nfunction getPage(url, onComplete, owner) {\n\tlog('getPage');\n\tvar callback= function (d) { if (!d.aborted) {addPageToCache(d); onComplete(d);} };\n\treturn startDownload(url, owner.idNumber, callback);\n}\n\nfunction findInPageCache(url) {\n\tfor (var i=0; i<pg.cache.pages.length; ++i) {\n\t\tif (url==pg.cache.pages[i].url) { return i; }\n\t}\n\treturn -1;\n}\n\nfunction addPageToCache(download) {\n\tlog('addPageToCache '+download.url);\n\tvar page = {url: download.url, data: download.data, lastModified: download.lastModified};\n\treturn pg.cache.pages.push(page);\n}\n// ENDFILE: getpage.js\n// STARTFILE: md5-2.2alpha.js\n//<NOLITE>\n/*\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\n\n/*\n * Configurable variables. You may need to tweak these to be compatible with\n * the server-side, but the defaults work in most cases.\n */\nvar hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase\t\t */\nvar b64pad  = \"\"; /* base-64 pad character. \"=\" for strict RFC compliance   */\n\n/*\n * These are the functions you'll usually want to call\n * They take string arguments and return either hex or base-64 encoded strings\n */\nfunction hex_md5(s)\t{ return rstr2hex(rstr_md5(str2rstr_utf8(s))); }\nfunction b64_md5(s)\t{ return rstr2b64(rstr_md5(str2rstr_utf8(s))); }\nfunction any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }\nfunction hex_hmac_md5(k, d)\n  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }\nfunction b64_hmac_md5(k, d)\n  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }\nfunction any_hmac_md5(k, d, e)\n  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }\n\n/*\n * Perform a simple self-test to see if the VM is working\n */\nfunction md5_vm_test()\n{\n  return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\";\n}\n\n/*\n * Calculate the MD5 of a raw string\n */\nfunction rstr_md5(s)\n{\n  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));\n}\n\n/*\n * Calculate the HMAC-MD5, of a key and some data (raw strings)\n */\nfunction rstr_hmac_md5(key, data)\n{\n  var bkey = rstr2binl(key);\n  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);\n\n  var ipad = Array(16), opad = Array(16);\n  for(var i = 0; i < 16; i++)\n  {\n\tipad[i] = bkey[i] ^ 0x36363636;\n\topad[i] = bkey[i] ^ 0x5C5C5C5C;\n  }\n\n  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);\n  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));\n}\n\n/*\n * Convert a raw string to a hex string\n */\nfunction rstr2hex(input)\n{\n  var hex_tab = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\n  var output = \"\";\n  var x;\n  for(var i = 0; i < input.length; i++)\n  {\n\tx = input.charCodeAt(i);\n\toutput += hex_tab.charAt((x >>> 4) & 0x0F)\n\t   +  hex_tab.charAt( x\t\t   & 0x0F);\n  }\n  return output;\n}\n\n/*\n * Convert a raw string to a base-64 string\n */\nfunction rstr2b64(input)\n{\n  var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n  var output = \"\";\n  var len = input.length;\n  for(var i = 0; i < len; i += 3)\n  {\n\tvar triplet = (input.charCodeAt(i) << 16)\n\t\t| (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)\n\t\t| (i + 2 < len ? input.charCodeAt(i+2)\t\t: 0);\n\tfor(var j = 0; j < 4; j++)\n\t{\n\t  if(i * 8 + j * 6 > input.length * 8) output += b64pad;\n\t  else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);\n\t}\n  }\n  return output;\n}\n\n/*\n * Convert a raw string to an arbitrary string encoding\n */\nfunction rstr2any(input, encoding)\n{\n  var divisor = encoding.length;\n  var remainders = Array();\n  var i, q, x, quotient;\n\n  /* Convert to an array of 16-bit big-endian values, forming the dividend */\n  var dividend = Array(input.length / 2);\n  for(i = 0; i < dividend.length; i++)\n  {\n\tdividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);\n  }\n\n  /*\n   * Repeatedly perform a long division. The binary array forms the dividend,\n   * the length of the encoding is the divisor. Once computed, the quotient\n   * forms the dividend for the next step. We stop when the dividend is zero.\n   * All remainders are stored for later use.\n   */\n  while(dividend.length > 0)\n  {\n\tquotient = Array();\n\tx = 0;\n\tfor(i = 0; i < dividend.length; i++)\n\t{\n\t  x = (x << 16) + dividend[i];\n\t  q = Math.floor(x / divisor);\n\t  x -= q * divisor;\n\t  if(quotient.length > 0 || q > 0)\n\tquotient[quotient.length] = q;\n\t}\n\tremainders[remainders.length] = x;\n\tdividend = quotient;\n  }\n\n  /* Convert the remainders to the output string */\n  var output = \"\";\n  for(i = remainders.length - 1; i >= 0; i--)\n\toutput += encoding.charAt(remainders[i]);\n\n  return output;\n}\n\n/*\n * Encode a string as utf-8.\n * For efficiency, this assumes the input is valid utf-16.\n */\nfunction str2rstr_utf8(input)\n{\n  var output = \"\";\n  var i = -1;\n  var x, y;\n\n  while(++i < input.length)\n  {\n\t/* Decode utf-16 surrogate pairs */\n\tx = input.charCodeAt(i);\n\ty = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;\n\tif(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)\n\t{\n\t  x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);\n\t  i++;\n\t}\n\n\t/* Encode output as utf-8 */\n\tif(x <= 0x7F)\n\t  output += String.fromCharCode(x);\n\telse if(x <= 0x7FF)\n\t  output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),\n\t\t\t\t\t0x80 | ( x\t\t   & 0x3F));\n\telse if(x <= 0xFFFF)\n\t  output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),\n\t\t\t\t\t0x80 | ((x >>> 6 ) & 0x3F),\n\t\t\t\t\t0x80 | ( x\t\t   & 0x3F));\n\telse if(x <= 0x1FFFFF)\n\t  output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),\n\t\t\t\t\t0x80 | ((x >>> 12) & 0x3F),\n\t\t\t\t\t0x80 | ((x >>> 6 ) & 0x3F),\n\t\t\t\t\t0x80 | ( x\t\t   & 0x3F));\n  }\n  return output;\n}\n\n/*\n * Encode a string as utf-16\n */\nfunction str2rstr_utf16le(input)\n{\n  var output = \"\";\n  for(var i = 0; i < input.length; i++)\n\toutput += String.fromCharCode( input.charCodeAt(i)\t\t  & 0xFF,\n\t\t\t\t  (input.charCodeAt(i) >>> 8) & 0xFF);\n  return output;\n}\n\nfunction str2rstr_utf16be(input)\n{\n  var output = \"\";\n  for(var i = 0; i < input.length; i++)\n\toutput += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,\n\t\t\t\t   input.charCodeAt(i)\t\t  & 0xFF);\n  return output;\n}\n\n/*\n * Convert a raw string to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\nfunction rstr2binl(input)\n{\n  var output = Array(input.length >> 2);\n  for(var i = 0; i < output.length; i++)\n\toutput[i] = 0;\n  for(var i = 0; i < input.length * 8; i += 8)\n\toutput[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);\n  return output;\n}\n\n/*\n * Convert an array of little-endian words to a string\n */\nfunction binl2rstr(input)\n{\n  var output = \"\";\n  for(var i = 0; i < input.length * 32; i += 8)\n\toutput += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);\n  return output;\n}\n\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\nfunction binl_md5(x, len)\n{\n  /* append padding */\n  x[len >> 5] |= 0x80 << ((len) % 32);\n  x[(((len + 64) >>> 9) << 4) + 14] = len;\n\n  var a =  1732584193;\n  var b = -271733879;\n  var c = -1732584194;\n  var d =  271733878;\n\n  for(var i = 0; i < x.length; i += 16)\n  {\n\tvar olda = a;\n\tvar oldb = b;\n\tvar oldc = c;\n\tvar oldd = d;\n\n\ta = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);\n\td = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);\n\tc = md5_ff(c, d, a, b, x[i+ 2], 17,\t 606105819);\n\tb = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);\n\ta = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);\n\td = md5_ff(d, a, b, c, x[i+ 5], 12,\t 1200080426);\n\tc = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);\n\tb = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);\n\ta = md5_ff(a, b, c, d, x[i+ 8], 7 ,\t 1770035416);\n\td = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);\n\tc = md5_ff(c, d, a, b, x[i+10], 17, -42063);\n\tb = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);\n\ta = md5_ff(a, b, c, d, x[i+12], 7 ,\t 1804603682);\n\td = md5_ff(d, a, b, c, x[i+13], 12, -40341101);\n\tc = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);\n\tb = md5_ff(b, c, d, a, x[i+15], 22,\t 1236535329);\n\n\ta = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);\n\td = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);\n\tc = md5_gg(c, d, a, b, x[i+11], 14,\t 643717713);\n\tb = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);\n\ta = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);\n\td = md5_gg(d, a, b, c, x[i+10], 9 ,\t 38016083);\n\tc = md5_gg(c, d, a, b, x[i+15], 14, -660478335);\n\tb = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);\n\ta = md5_gg(a, b, c, d, x[i+ 9], 5 ,\t 568446438);\n\td = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);\n\tc = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);\n\tb = md5_gg(b, c, d, a, x[i+ 8], 20,\t 1163531501);\n\ta = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);\n\td = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);\n\tc = md5_gg(c, d, a, b, x[i+ 7], 14,\t 1735328473);\n\tb = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);\n\n\ta = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);\n\td = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);\n\tc = md5_hh(c, d, a, b, x[i+11], 16,\t 1839030562);\n\tb = md5_hh(b, c, d, a, x[i+14], 23, -35309556);\n\ta = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);\n\td = md5_hh(d, a, b, c, x[i+ 4], 11,\t 1272893353);\n\tc = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);\n\tb = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);\n\ta = md5_hh(a, b, c, d, x[i+13], 4 ,\t 681279174);\n\td = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);\n\tc = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);\n\tb = md5_hh(b, c, d, a, x[i+ 6], 23,\t 76029189);\n\ta = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);\n\td = md5_hh(d, a, b, c, x[i+12], 11, -421815835);\n\tc = md5_hh(c, d, a, b, x[i+15], 16,\t 530742520);\n\tb = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);\n\n\ta = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);\n\td = md5_ii(d, a, b, c, x[i+ 7], 10,\t 1126891415);\n\tc = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);\n\tb = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);\n\ta = md5_ii(a, b, c, d, x[i+12], 6 ,\t 1700485571);\n\td = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);\n\tc = md5_ii(c, d, a, b, x[i+10], 15, -1051523);\n\tb = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);\n\ta = md5_ii(a, b, c, d, x[i+ 8], 6 ,\t 1873313359);\n\td = md5_ii(d, a, b, c, x[i+15], 10, -30611744);\n\tc = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);\n\tb = md5_ii(b, c, d, a, x[i+13], 21,\t 1309151649);\n\ta = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);\n\td = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);\n\tc = md5_ii(c, d, a, b, x[i+ 2], 15,\t 718787259);\n\tb = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);\n\n\ta = safe_add(a, olda);\n\tb = safe_add(b, oldb);\n\tc = safe_add(c, oldc);\n\td = safe_add(d, oldd);\n  }\n  return Array(a, b, c, d);\n}\n\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\nfunction md5_cmn(q, a, b, x, s, t)\n{\n  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);\n}\nfunction md5_ff(a, b, c, d, x, s, t)\n{\n  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\n}\nfunction md5_gg(a, b, c, d, x, s, t)\n{\n  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\n}\nfunction md5_hh(a, b, c, d, x, s, t)\n{\n  return md5_cmn(b ^ c ^ d, a, b, x, s, t);\n}\nfunction md5_ii(a, b, c, d, x, s, t)\n{\n  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add(x, y)\n{\n  var lsw = (x & 0xFFFF) + (y & 0xFFFF);\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n  return (msw << 16) | (lsw & 0xFFFF);\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction bit_rol(num, cnt)\n{\n  return (num << cnt) | (num >>> (32 - cnt));\n}\n//</NOLITE>\n// ENDFILE: md5-2.2alpha.js\n// STARTFILE: parensplit.js\n//////////////////////////////////////////////////\n// parenSplit\n\n// String.prototype.parenSplit should do what ECMAscript says String.prototype.split does,\n// interspersing paren matches (regex capturing groups) between the split elements.\n// i.e. 'abc'.split(/(b)/)) should return ['a','b','c'], not ['a','c']\n\nif (String('abc'.split(/(b)/))!='a,b,c') {\n\t// broken String.split, e.g. konq, IE\n\tString.prototype.parenSplit=function (re) {\n\t\tre=nonGlobalRegex(re);\n\t\tvar s=this;\n\t\tvar m=re.exec(s);\n\t\tvar ret=[];\n\t\twhile (m && s) {\n\t\t\t// without the following loop, we have\n\t\t\t// 'ab'.parenSplit(/a|(b)/) != 'ab'.split(/a|(b)/)\n\t\t\tfor(var i=0; i<m.length; ++i) {\n\t\t\t\tif (typeof m[i]=='undefined') m[i]='';\n\t\t\t}\n\t\t\tret.push(s.substring(0,m.index));\n\t\t\tret = ret.concat(m.slice(1));\n\t\t\ts=s.substring(m.index + m[0].length);\n\t\t\tm=re.exec(s);\n\t\t}\n\t\tret.push(s);\n\t\treturn ret;\n\t};\n} else {\n\tString.prototype.parenSplit=function (re) { return this.split(re); };\n\tString.prototype.parenSplit.isNative=true;\n}\n\nfunction nonGlobalRegex(re) {\n\tvar s=re.toString();\n\tflags='';\n\tfor (var j=s.length; s.charAt(j) != '/'; --j) {\n\t\tif (s.charAt(j) != 'g') { flags += s.charAt(j); }\n\t}\n\tvar t=s.substring(1,j);\n\treturn RegExp(t,flags);\n}\n// ENDFILE: parensplit.js\n// STARTFILE: tools.js\n// IE madness with encoding\n// ========================\n//\n// suppose throughout that the page is in utf8, like wikipedia\n//\n// if a is an anchor DOM element and a.href should consist of\n//\n// http://host.name.here/wiki/foo?bar=baz\n//\n// then IE gives foo as \"latin1-encoded\" utf8; we have foo = decode_utf8(decodeURI(foo_ie))\n// but IE gives bar=baz correctly as plain utf8\n//\n// ---------------------------------\n//\n// IE's xmlhttp doesn't understand utf8 urls. Have to use encodeURI here.\n//\n// ---------------------------------\n//\n// summat else\n\n// Source: http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/utf8.htm\n\n//<NOLITE>\nfunction encode_utf8(rohtext) {\n\t// dient der Normalisierung des Zeilenumbruchs\n\trohtext = rohtext.replace(/\\r\\n/g,\"\\n\");\n\tvar utftext = \"\";\n\tfor(var n=0; n<rohtext.length; n++)\n\t{\n\t\t// ermitteln des Unicodes des  aktuellen Zeichens\n\t\tvar c=rohtext.charCodeAt(n);\n\t\t// alle Zeichen von 0-127 => 1byte\n\t\tif (c<128)\n\t\t\tutftext += String.fromCharCode(c);\n\t\t// alle Zeichen von 127 bis 2047 => 2byte\n\t\telse if((c>127) && (c<2048)) {\n\t\t\tutftext += String.fromCharCode((c>>6)|192);\n\t\t\tutftext += String.fromCharCode((c&63)|128);}\n\t\t// alle Zeichen von 2048 bis 66536 => 3byte\n\t\telse {\n\t\t\tutftext += String.fromCharCode((c>>12)|224);\n\t\t\tutftext += String.fromCharCode(((c>>6)&63)|128);\n\t\t\tutftext += String.fromCharCode((c&63)|128);}\n\t}\n\treturn utftext;\n}\n\nfunction getJsObj(json) {\n\ttry {\n\t\tvar json_ret = eval('(' + json + ')');\n\t} catch (someError) {\n\t\terrlog('Something went wrong with getJsobj, json='+json);\n\t\treturn 1;\n\t}\n\tif( json_ret['warnings'] ) {\n\t\tfor( var w=0; w < json_ret['warnings'].length; w++ ) {\n\t\t\tlog( json_ret['warnings'][w]['*'] );\n\t\t}\n\t} else if ( json_ret['error'] ) {\n\t\terrlog( json_ret['error'].code + ': ' + json_ret['error'].info );\n\t}\n\treturn json_ret;\n}\n\nfunction anyChild(obj) {\n\tfor (var p in obj) {\n\t\treturn obj[p];\n\t}\n\treturn null;\n}\n\n//</NOLITE>\n\nfunction decode_utf8(utftext) {\n\tvar plaintext = \"\"; var i=0, c=0, c1=0, c2=0;\n\t// while-Schleife, weil einige Zeichen uebersprungen werden\n\twhile(i<utftext.length)\n\t{\n\t\tc = utftext.charCodeAt(i);\n\t\tif (c<128) {\n\t\t\tplaintext += String.fromCharCode(c);\n\t\t\ti++;}\n\t\telse if((c>191) && (c<224)) {\n\t\t\tc2 = utftext.charCodeAt(i+1);\n\t\t\tplaintext += String.fromCharCode(((c&31)<<6) | (c2&63));\n\t\t\ti+=2;}\n\t\telse {\n\t\t\tc2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2);\n\t\t\tplaintext += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63));\n\t\t\ti+=3;}\n\t}\n\treturn plaintext;\n}\n\n\nfunction upcaseFirst(str) {\n\tif (typeof str != typeof '' || str=='') return '';\n\treturn str.charAt(0).toUpperCase() + str.substring(1);\n}\n\n\nfunction findInArray(arr, foo) {\n\tif (!arr || !arr.length) { return -1; }\n\tvar len=arr.length;\n\tfor (var i=0; i<len; ++i) { if (arr[i]==foo) { return i; } }\n\treturn -1;\n}\n\nfunction nextOne (array, value) {\n\t// NB if the array has two consecutive entries equal\n\t//\tthen this will loop on successive calls\n\tvar i=findInArray(array, value);\n\tif (i<0) { return null; }\n\treturn array[i+1];\n}\n\nfunction literalizeRegex(str){\n\treturn str.replace(RegExp('([-.|()\\\\\\\\+?*^${}\\\\[\\\\]])', 'g'), '\\\\$1');\n}\n\nString.prototype.entify=function() {\n\t//var shy='&shy;';\n\treturn this.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;'/*+shy*/).split('\"').join('&quot;');\n};\n\nfunction findThis(array, value) {\n\tif (typeof array.length == 'undefined') { return null; }\n\tfor (var i=0; i<array.length; ++i) {\n\t\tif (array[i]==value) { return i; }\n\t}\n\treturn null;\n}\n\nfunction removeNulls(list) {\n\tvar ret=[];\n\tfor (var i=0; i<list.length; ++i) {\n\t\tif (list[i]) {\n\t\t\tret.push(list[i]);\n\t\t}\n\t}\n\treturn ret;\n}\nfunction joinPath(list) {\n\treturn removeNulls(list).join('/');\n}\n\n\nfunction simplePrintf(str, subs) {\n\tif (!str || !subs) { return str; }\n\tvar ret=[];\n\tvar s=str.parenSplit(/(%s|\\$[0-9]+)/);\n\tvar i=0;\n\tdo {\n\t\tret.push(s.shift());\n\t\tif ( !s.length ) { break; }\n\t\tvar cmd=s.shift();\n\t\tif (cmd == '%s') {\n\t\t\tif ( i < subs.length ) { ret.push(subs[i]); } else { ret.push(cmd); }\n\t\t\t++i;\n\t\t} else {\n\t\t\tvar j=parseInt( cmd.replace('$', ''), 10 ) - 1;\n\t\t\tif ( j > -1 && j < subs.length ) { ret.push(subs[j]); } else { ret.push(cmd); }\n\t\t}\n\t} while (s.length > 0);\n\treturn ret.join('');\n}\n\nfunction max(a,b){return a<b ? b : a;}\nfunction min(a,b){return a>b ? b : a;}\n\nfunction isString(x) { return (typeof x === 'string' || x instanceof String); }\n//function isNumber(x) { return (typeof x === 'number' || x instanceof Number); }\nfunction isRegExp(x) { return x instanceof RegExp; }\nfunction isArray (x) { return x instanceof Array; }\nfunction isObject(x) { return x instanceof Object; }\nfunction isFunction(x) {\n\treturn !isRegExp(x) && (typeof x === 'function' || x instanceof Function);\n}\n\nfunction repeatString(s,mult) {\n\tvar ret='';\n\tfor (var i=0; i<mult; ++i) { ret += s; }\n\treturn ret;\n}\n\nfunction zeroFill(s, min) {\n\tmin = min || 2;\n\tvar t=s.toString();\n\treturn repeatString('0', min - t.length) + t;\n}\n\nfunction map(f, o) {\n\tif (isArray(o)) { return map_array(f,o); }\n\treturn map_object(f,o);\n}\nfunction map_array(f,o) {\n\tvar ret=[];\n\tfor (var i=0; i<o.length; ++i) {\n\t\tret.push(f(o[i]));\n\t}\n\treturn ret;\n}\nfunction map_object(f,o) {\n\tvar ret={};\n\tfor (var i in o) { ret[o]=f(o[i]); }\n\treturn ret;\n}\n\npg.escapeQuotesHTML = function ( text ) {\tvar re = new RegExp( '&', \"g\" );\ttext = text.replace( re, \"&amp;\" );\tre = new RegExp( '\"', \"g\" );\ttext = text.replace( re, \"&quot;\" );\tre = new RegExp( '<', \"g\" );\ttext = text.replace( re, \"&lt;\" );\tre = new RegExp( '>', \"g\" );\ttext = text.replace( re, \"&gt;\" );\treturn text;}\n\npg.jsescape = function(s)\n{\n\tif (typeof s !== \"string\") throw \"Invalid type in pg.jsescape\";\n\tvar res = \"\";\n\t//this can be optimized by copying substrings instead of char by char!\n\tfor (var i=0; i<s.length; i++)\n\t{\n\t\tvar c = s[i];\n\tswitch (c)\n\t{\n\t  case '\\b': res += '\\\\b'; continue;\n\t  case '\\f': res += '\\\\f'; continue;\n\t  case '\\n': res += '\\\\n'; continue;\n\t  case '\\0': res += '\\\\0'; continue;\n\t  case '\\r': res += '\\\\r'; continue;\n\t  case '\\t': res += '\\\\t'; continue;\n\t  case '\\v': res += '\\\\v'; continue;\n\t  case '\\\\': res += '\\\\\\\\'; continue;\n\t  case '\\\"':  res += '\\\\\\\"'; continue;\n\t  case '\\'':  res += '\\\\\\''; continue;\n\t\t   continue;\n\t  default:\n\t\t\tif (c < ' ' || c==='<' || c==='>' || c===\"'\")\n\t\t\t{\n\t\t\t\t\tvar unicodeChar = c.charCodeAt(0).toString(16).toUpperCase();\n\t\t\t\t\tres += \"\\\\u\" + (unicodeChar.length>1?\"00\":\"000\") + unicodeChar;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tres += c;\n\t\t\t}\n\t}\n  }\n  return res;\n}\n\n// ENDFILE: tools.js\n// STARTFILE: dab.js\n//<NOLITE>\n//////////////////////////////////////////////////\n// Dab-fixing code\n//\n\n\nfunction retargetDab(newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) {\n\tlog('retargetDab: newTarget='+newTarget + ' oldTarget=' + oldTarget);\n\treturn changeLinkTargetLink(\n\t{newTarget: newTarget,\n\t\t\ttext: newTarget.split(' ').join('&nbsp;'),\n\t\t\thint: tprintf('disambigHint', [newTarget]),\n\t\t\tsummary: simplePrintf(\n\t\t\t\t\tgetValueOf('popupFixDabsSummary'), [friendlyCurrentArticleName, newTarget ]),\n\t\t\tclickButton: 'wpDiff', minor: true, oldTarget: oldTarget,\n\t\t\twatch: getValueOf('popupWatchDisambiggedPages'),\n\t\t\ttitle: titleToEdit});\n}\n\nfunction listLinks(wikitext, oldTarget, titleToEdit) {\n\t// mediawiki strips trailing spaces, so we do the same\n\t// testcase: http://en.wikipedia.org/w/index.php?title=Radial&oldid=97365633\n\tvar reg=RegExp('\\\\[\\\\[([^|]*?) *(\\\\||\\\\]\\\\])', 'gi');\n\tvar ret=[];\n\tvar splitted=wikitext.parenSplit(reg);\n\t// ^[a-z]+ should match interwiki links, hopefully (case-insensitive)\n\t// and ^[a-z]* should match those and [[:Category...]] style links too\n\tvar omitRegex=RegExp('^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory');\n\tvar friendlyCurrentArticleName= oldTarget.toString();\n\tvar wikPos = getValueOf('popupDabWiktionary');\n\n\tfor (var i=1; i<splitted.length; i=i+3) {\n\t\tif (typeof splitted[i] == typeof 'string' && splitted[i].length>0 && !omitRegex.test(splitted[i])) {\n\t\t\tret.push( retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit) );\n\t\t} /* if */\n\t} /* for loop */\n\n\tret = rmDupesFromSortedList(ret.sort());\n\n\tif (wikPos) {\n\t\tvar wikTarget='wiktionary:' +\n\t\t\tfriendlyCurrentArticleName.replace( RegExp('^(.+)\\\\s+[(][^)]+[)]\\\\s*$'), '$1' );\n\n\t\tvar meth;\n\t\tif (wikPos.toLowerCase() == 'first') { meth = 'unshift'; }\n\t\telse { meth = 'push'; }\n\n\t\tret[meth]( retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) );\n\t}\n\n\tret.push(changeLinkTargetLink(\n\t{ newTarget: null,\n\t\t\ttext: popupString('remove this link').split(' ').join('&nbsp;'),\n\t\t\thint: popupString(\"remove all links to this disambig page from this article\"),\n\t\t\tclickButton: \"wpDiff\", oldTarget: oldTarget,\n\t\t\tsummary: simplePrintf(getValueOf('popupRmDabLinkSummary'), [friendlyCurrentArticleName]),\n\t\t\twatch: getValueOf('popupWatchDisambiggedPages'),\n\t\t\ttitle: titleToEdit\n\t\t\t}));\n\treturn ret;\n}\n\nfunction rmDupesFromSortedList(list) {\n\tvar ret=[];\n\tfor (var i=0; i<list.length; ++i) {\n\t\tif (ret.length===0 || list[i]!=ret[ret.length-1]) { ret.push(list[i]); }\n\t}\n\treturn ret;\n}\n\nfunction makeFixDab(data, navpop) {\n\t// grab title from parent popup if there is one; default exists in changeLinkTargetLink\n\tvar titleToEdit=(navpop.parentPopup && navpop.parentPopup.article.toString());\n\tvar list=listLinks(data, navpop.originalArticle, titleToEdit);\n\tif (list.length===0) { log('listLinks returned empty list'); return null; }\n\tvar html='<hr>' + popupString('Click to disambiguate this link to:') + '<br>';\n\thtml+=list.join(', ');\n\treturn html;\n}\n\n\nfunction makeFixDabs(wikiText, navpop) {\n\tif (getValueOf('popupFixDabs') && isDisambig(wikiText, navpop.article) &&\n\t\tTitle.fromURL(location.href).namespaceId() != pg.nsSpecialId &&\n\t\tnavpop.article.talkPage() ) {\n\t\tsetPopupHTML(makeFixDab(wikiText, navpop), 'popupFixDab', navpop.idNumber);\n\t}\n}\n\nfunction popupRedlinkHTML(article) {\n\treturn changeLinkTargetLink(\n\t\t{ newTarget: null, text: popupString('remove this link').split(' ').join('&nbsp;'),\n\t\t\thint: popupString(\"remove all links to this page from this article\"),\n\t\t\tclickButton: \"wpDiff\",\n\t\t\toldTarget: article.toString(),\n\t\t\tsummary: simplePrintf(getValueOf('popupRedlinkSummary'), [article.toString()])});\n}\n//</NOLITE>\n// ENDFILE: dab.js\n// STARTFILE: htmloutput.js\n\nfunction appendPopupContent(obj, elementId, popupId, onSuccess) {\n\treturn setPopupHTML(obj, elementId, popupId, onSuccess, true);\n}\n\n// this has to use a timer loop as we don't know if the DOM element exists when we want to set the text\nfunction setPopupHTML (str, elementId, popupId, onSuccess, append) {\n\tif (elementId=='popupPreview') {\n\t}\n\tif (typeof popupId === 'undefined') {\n\t\t//console.error('popupId is not defined in setPopupHTML, html='+str.substring(0,100));\n\t\tpopupId = pg.idNumber;\n\t}\n\n\tvar popupElement=document.getElementById(elementId+popupId);\n\tif (popupElement) {\n\t\tif (!append) { popupElement.innerHTML=''; }\n\t\tif (isString(str)) {\n\t\t\tpopupElement.innerHTML+=str;\n\t\t} else {\n\t\t\tpopupElement.appendChild(str);\n\t\t}\n\t\tif (onSuccess) { onSuccess(); }\n\t\tsetTimeout(checkPopupPosition, 100);\n\t\treturn true;\n\t} else {\n\t\t// call this function again in a little while...\n\t\tsetTimeout(function(){\n\t\t\t\tsetPopupHTML(str,elementId,popupId,onSuccess);\n\t\t\t}, 600);\n\t}\n\treturn null;\n}\n\n//<NOLITE>\nfunction setPopupTrailer(str,id) {return setPopupHTML(str, 'popupData', id);}\n//</NOLITE>\n\n\nfunction fillEmptySpans(args) { return fillEmptySpans2(args); }\n\n// args.navpopup is mandatory\n// optional: args.redir, args.redirTarget\n// FIXME: ye gods, this is ugly stuff\nfunction fillEmptySpans2(args) { // if redir is present and true then redirTarget is mandatory\n\tvar redir=true;\n\tif (typeof args != 'object' || typeof args.redir == 'undefined' || !args.redir) { redir=false; }\n\tvar a=args.navpopup.parentAnchor;\n\n\tvar article, hint=null, oldid=null, params={};\n\tif (redir && typeof args.redirTarget == typeof {}) {\n\t\tarticle=args.redirTarget;\n\t\t//hint=article.hintValue();\n\t} else {\n\t\tarticle=(new Title()).fromAnchor(a);\n\t\thint=a.originalTitle || article.hintValue();\n\t\tparams=parseParams(a.href);\n\t\toldid=(getValueOf('popupHistoricalLinks')) ? params.oldid : null;\n\t\trcid=params.rcid;\n\t}\n\tvar x={ article:article, hint: hint, oldid: oldid, rcid: rcid, navpop:args.navpopup, params:params };\n\n\tvar structure=pg.structures[getValueOf('popupStructure')];\n\tif (typeof structure != 'object') {\n\t\tsetPopupHTML('popupError', 'Unknown structure (this should never happen): '+\n\t\t\t\t pg.option.popupStructure, args.navpopup.idNumber);\n\t\treturn;\n\t}\n\tvar spans=flatten(pg.misc.layout);\n\tvar numspans = spans.length;\n\tvar redirs=pg.misc.redirSpans;\n\n\tfor (var i=0; i<numspans; ++i) {\n\t\tvar f=findThis(redirs, spans[i]);\n\t\t//log('redir='+redir+', f='+f+', spans[i]='+spans[i]);\n\t\tif ( (f!==null && !redir) || (f===null && redir) ) {\n\t\t\t//log('skipping this set of the loop');\n\t\t\tcontinue;\n\t\t}\n\t\tvar structurefn=structure[spans[i]];\n\t\tvar setfn = setPopupHTML;\n\t\tif (getValueOf('popupActiveNavlinks') && \n\t\t\t(spans[i].indexOf('popupTopLinks')==0 || spans[i].indexOf('popupRedirTopLinks')==0)\n\t\t\t\t) {\n\t\t\tsetfn = setPopupTipsAndHTML;\n\t\t}\n\t\tswitch (typeof structurefn) {\n\t\tcase 'function':\n\t\t\t//log('running '+spans[i]+'({article:'+x.article+', hint:'+x.hint+', oldid: '+x.oldid+'})');\n\t\t\tsetfn(structurefn(x), spans[i], args.navpopup.idNumber);\n\t\t\tbreak;\n\t\tcase 'string':\n\t\t\tsetfn(structurefn, spans[i], args.navpopup.idNumber);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\terrlog('unknown thing with label '+spans[i]);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n// flatten an array\nfunction flatten(list, start) {\n\tvar ret=[];\n\tif (typeof start == 'undefined') { start=0; }\n\tfor (var i=start; i<list.length; ++i) {\n\t\tif (typeof list[i] == typeof []) {\n\t\t\treturn ret.concat(flatten(list[i])).concat(flatten(list, i+1));\n\t\t}\n\t\telse { ret.push(list[i]); }\n\t}\n\treturn ret;\n}\n\n// Generate html for whole popup\nfunction popupHTML (a) {\n\tgetValueOf('popupStructure');\n\tvar structure=pg.structures[pg.option.popupStructure];\n\tif (typeof structure != 'object') {\n\t\t//return 'Unknown structure: '+pg.option.popupStructure;\n\t\t// ove"
  },
  {
    "inputhash": "960cf2f7a6a5b4a03beba84473829eb3",
    "input": "\\begin{alignat}2\n h_1 &= p_1,\\\\\n h_2 &= \\textstyle\\frac12p_1^2 + \\frac12p_2 &&= \\textstyle\\frac12 ( p_1^2 + p_2 ),\\\\\n h_3 &= \\textstyle\\frac16p_1^3 + \\frac12p_1 p_2 + \\frac13p_3 &&= \\textstyle\\frac{1}{6} ( p_1^3 + 3 p_1 p_2 + 2 p_3 ),\\\\\n h_4 &= \\textstyle\\frac1{24}p_1^4 + \\frac14p_1^2 p_2 + \\frac18p_2^2 + \\frac13p_1 p_3 + \\frac14p_4 \n       &&= \\textstyle\\frac1{24} ( p_1^4 + 6 p_1^2 p_2 + 3 p_2^2 + 8 p_1 p_3 + 6 p_4 ),\\\\\n\\end{alignat}"
  },
  {
    "inputhash": "962548e7a2255a587363c376c0dfc94c",
    "input": "  \n\n                   Please do not edit above this line unless you are a DYK volunteer who is closing the discussion.\n\n\n\n | article         = Banawali\n |    article2     = \n | hook            = ... that [[Banawali]] located in Haryana, India was a Pre-Harappan settlement belonging to [[Indus Valley Civilisation]],where fire alters were found in houses?\n | author          = Rayabhari\n |    author2      = \n | image           = \n |    caption      = \n | comment         = \n | reviewed        = If you reviewed another article before listing this DYK nomination, put it here. Otherwise leave this blank.\n}}"
  },
  {
    "inputhash": "9b4d2a885e7b1844887015037d349bb4",
    "input": " format.\",\n\"params\": {\n  \"1\": {\n    \"label\": \"formula\",\n    \"description\": \"wrap an inline formula in wikitext.\",\n    \"type\": \"string\",\n    \"required\": true\n  },\n  \"big\": {\n    \"label\": \"bigger font size\",\n    \"description\": \"if set to ‘1’, this will render the formula in a bigger font size, increased to 165%\",\n    \"type\": \"string\",\n    \"required\": false\n  },\n  \"size\": {\n    \"label\": \"custom font size\",\n    \"description\": \"use this to specify your own font size\",\n    \"type\": \"string\",\n    \"required\": false\n  }\n}}</templatedata>\n\n== Notes ==\n\nThe font and fontsize used for <code>texhtml</code>, as defined in [[MediaWiki:Common.css]], was determined by comparing common default fonts found on Windows, OS X and Linux and is scaled to 118% to match their [[x-height]]. However, not everyone uses the default fonts. If you find that the rendered math is not of the same size as the surrounding text, you can adjust this in your personal CSS. For instance, the DejaVu Sans and DejaVu Serif fonts do ''not'' need scaling, in which case <code>span.texhtml { font-size: 100%; }</code> will restore proper display.\n\nThe <code>texhtml</code> classname is a remnant from the {{TeX}} renderer, which had a user preference to render {{TeX}}-written formulae in \"HTML when simple\". That option has been removed some time ago, but the classname continues to be used for formulae written in HTML.\n\n== See also ==\n\n;Help and information\n\n* [[Help: Displaying a formula]]\n* [[WP:«math»]], a comparison of different representation of mathematical expressions\n\n;Related templates\n{{Math templates}}\n\n<includeonly>\n[[Category:Mathematical formatting templates]]\n\n</includeonly>"
  },
  {
    "inputhash": "9c8492839453496fce8fc4b60b876bbd",
    "input": "This userbox shows preference for endonymic proper nouns. That is, when the user is discussing a person or place that is known by different names in multiple languages, preference is (usually) given to the name taken from the language most closely linked to the given noun. This occurs regardless of the native language of the user, nor of the language in which the user is writing, except when overwhelming convention demands otherwise.\n\ne.g.: \"Turino, Italy\" (not \"Turin\"); but \"Rome, Italy\" (not \"Roma, Italia,\" because of overwhelming convention). The endonymic/exonymic debate is most commonly a factor when referring to places and people.>\n</noinclude>"
  },
  {
    "inputhash": "9cd7310f8613eeebb28046da004bc237",
    "input": "\\left[\\begin{array}{l,l}  s&t\\\\u&v \\end{array}\\right ]"
  },
  {
    "inputhash": "a4ea9f5a0905c1e1cb9511b8d2111c08",
    "input": "\\gamma\\,\\pi\\,\\sec\\^2(\\pi\\,(p-\\tfrac{1}{2}))\\!"
  },
  {
    "inputhash": "a61626300c4de2192cd6ae3154ff2d6b",
    "input": "<small>† bcsc Tournament winner\n\n<noinclude>\n[[Category:Big Central Soccer Conference standings templates]]\n</noinclude>"
  },
  {
    "inputhash": "a7fe1d7521ea19407abfeb670f84220c",
    "input": "{\\textstyle \n  <semantics xml:id=\"math.1.0.1a\" xref=\"math.1.0.1.cmml\">\n    <mrow xml:id=\"math.1.0.1.4\" xref=\"math.1.0.1.4.cmml\">\n      <mi xml:id=\"math.1.0.1.1\" xref=\"math.1.0.1.1.cmml\">sin</mi>\n      <mo xml:id=\"math.1.0.1.4a\" xref=\"math.1.0.1.4.cmml\">⁡</mo>\n      <msup xml:id=\"math.1.0.1.4.1\" xref=\"math.1.0.1.4.1.cmml\">\n        <mi xml:id=\"math.1.0.1.2\" xref=\"math.1.0.1.2.cmml\">x</mi>\n        <mn xml:id=\"math.1.0.1.3.1\" xref=\"math.1.0.1.3.1.cmml\">2</mn>\n      </msup>\n    </mrow>\n    <annotation-xml encoding=\"MathML-Content\" xml:id=\"math.1.0.1.cmml\" xref=\"math.1.0.1\">\n      <apply xml:id=\"math.1.0.1.4.cmml\" xref=\"math.1.0.1.4\">\n        <sin xml:id=\"math.1.0.1.1.cmml\" xref=\"math.1.0.1.1\"/>\n        <apply xml:id=\"math.1.0.1.4.1.cmml\" xref=\"math.1.0.1.4.1\">\n          <csymbol cd=\"ambiguous\" xml:id=\"math.1.0.1.4.1.1.cmml\">superscript</csymbol>\n          <ci xml:id=\"math.1.0.1.2.cmml\" xref=\"math.1.0.1.2\">x</ci>\n          <cn type=\"integer\" xml:id=\"math.1.0.1.3.1.cmml\" xref=\"math.1.0.1.3.1\">2</cn>\n        </apply>\n      </apply>\n    </annotation-xml>\n    <annotation encoding=\"application/x-tex\" xml:id=\"math.1.0.1b\" xref=\"math.1.0.1.cmml\">{\\displaystyle\\sin x^{2}}</annotation>\n  </semantics>\n}"
  },
  {
    "inputhash": "ab3321ac1f28e565bf37ed75145ad754",
    "input": " {{documentación}}</noinclude>"
  },
  {
    "inputhash": "b019dc5b370cd6c7f710a2f146cc0154",
    "input": "<small>† Southland Tournament winner:<nowiki>\n\n[[Category:Southland Conference men's basketball standings templates]][[Category:2013–14 American college basketball standings templates|Southland Conference]]\n</noinclude>"
  },
  {
    "inputhash": "b093a1b323256dd38bcf7319601f68fe",
    "input": "ckl@ckl"
  },
  {
    "inputhash": "b4d6750841d33ff2462b302eebc15b7f",
    "input": "\n        <mi>&#x03C0;</mi>\n        <mo>&#x2062;</mo>\n        <msup>\n          <mi>r</mi>\n          <mn>2</mn>\n        </msup>\n      "
  },
  {
    "inputhash": "b7187b6940a1e789cae1efd776153fbc",
    "input": "\n        <mi>&pi;</mi>\n        <mo>&#x2062;</mo>\n        <msup>\n          <mi>r</mi>\n          <mn>2</mn>\n        </msup>\n      "
  },
  {
    "inputhash": "bdecb934ac33bcc28e202754085f7c4b",
    "input": "\\definecolor{gray}{RGB}{249,249,249}\\pagecolor{gray} g \\mapsto f\\circ g"
  },
  {
    "inputhash": "bf76a4641adb9a399d70feec04d37660",
    "input": "A_iR_j \\subseteq A_{i+j} ⊇ R_iA_j"
  },
  {
    "inputhash": "c159c37865e286fab2b505de11ad4ce9",
    "input": "P_{\\text{new link to $i$}} \\propto k_i "
  },
  {
    "inputhash": "c78b9c1f5782f92408115fa6f6390331",
    "input": "\n\n[[da:Skabelon:Fodboldtabel slut]]\n[[hu:Sablon:Bajnokság-tabellalábléc]]\n[[id:Templat:Fb cl footer]]\n[[ka:თარგი:Fb cl footer]]\n[[th:แม่แบบ:Fb cl footer]]\n[[uk:Шаблон:Fb cl footer]]\n[[zh-yue:Template:Fb cl footer]]\n</noinclude>"
  },
  {
    "inputhash": "d3152d83fd1079191e4cbd3995470ddf",
    "input": " { P_{rad} }   =    { R_0 \\left<|v|\\right>^2 } "
  },
  {
    "inputhash": "d71bc131df1093246af4b2cab8a3be6a",
    "input": "This userbox shows preference for exonymic proper nouns. That is, when the user is discussing a person or place that is known by different names in multiple languages, preference is (usually) given to the English name. The endonymic/exonymic debate is most commonly a factor when referring to places and people.\n\ne.g.: \"Turin, Italy\" (not \"Turino\"); \"Montreal, Quebec\" (not \"Montréal, Québec\").>\n</noinclude>"
  },
  {
    "inputhash": "e0199f5a37a0ab1813cfd0628f826f80",
    "input": "\nS = \\left[ N\\ln V\\right] + \\left[\\frac 32 N\\ln\\left(2\\pi e m T\\right)\\right] + \\left[ -3N\\ln h\\right] + \\left[-\\ln N! \\right]\n  ≈ N \\ln \\left[\\frac{V}{N} \\left(\\frac{2\\pi m T}{h^2}\\right)^{\\frac 32}\\right]  +  \\frac 52 N\n"
  },
  {
    "inputhash": "e3cc368e634d90cee0694fa0834b39b2",
    "input": "\\left[\\begin{array}{l,l}  s&t\\\\u&v \\end{array}\\right ] \\left[\\begin{array}{l}  a\\\\b \\end{array}\\right ]\n= \\left[\\begin{array}{c}  \\gcd(a,b)\\\\0 \\end{array}\\right ]. "
  },
  {
    "inputhash": "e5e470bd2eaad8eaa35708534f5927f7",
    "input": " \n<noinclude>\n|}\n[[Category:University Athletic Association of the Philippines templates|{{PAGENAME}}]]\n[[Category:Philippine Basketball Association templates|{{PAGENAME}}]]</noinclude>"
  },
  {
    "inputhash": "e9f6be4c2ba14f4866fe4263bf5c6a0f",
    "input": "\\mathcal{G} × \\mathcal{H}"
  },
  {
    "inputhash": "f2cd2466543377aa3ebbc197e2a53636",
    "input": "\\definecolor{orange}{RGB}{255,165,0}\\pagecolor{orange}e^{i \\pi} + 1 = 0"
  },
  {
    "inputhash": "f31d13eca12a0db895b7062491b44886",
    "input": " for imagestyle yes|bold|normal ->>\n\n|header1  = \n|data1    = \n|header2  = \n|data2    = \n|header3  = \n|data3    = \n|header4  = \n|data4    = \n|header5  = \n|data5    = \n|header6  = \n|data6    = \n|header7  = \n|data7    = \n|header8  = \n|data8    = \n|header9  = \n|data9    = \n|header10 = \n|data10   = \n|header11 = \n|data11   = \n|header12 = \n|data12   = \n|header13 = \n|data13   = \n|header14 = \n|data14   = \n|header15 = \n|data15   = \n\n|header35 = \n|data35   = \n}}\n</pre>\n\n=== See also ===\n<includeonly>\n[[Category:Sidebar templates]]\n\n</includeonly>"
  },
  {
    "inputhash": "f338c7dea84103c7be9626def39d1c7f",
    "input": "Z^{X × Y}"
  }
]