<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.freecapitalists.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=0.0.0.0</id>
	<title>The Austrian Economics Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.freecapitalists.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=0.0.0.0"/>
	<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/wiki/Special:Contributions/0.0.0.0"/>
	<updated>2026-08-09T18:46:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Infobox_website/doc&amp;diff=23881</id>
		<title>Template:Infobox website/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Infobox_website/doc&amp;diff=23881"/>
		<updated>2014-01-22T18:11:15Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: typo - undo doubled brackets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
&amp;lt;!-- EDIT TEMPLATE DOCUMENTATION AFTER THIS LINE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox website&lt;br /&gt;
| name                 = &lt;br /&gt;
| logo                 = &lt;br /&gt;
| logocaption          = &lt;br /&gt;
| screenshot           = &lt;br /&gt;
| collapsible          = &lt;br /&gt;
| collapsetext         = &lt;br /&gt;
| caption              = &lt;br /&gt;
| url                  = &amp;lt;!-- {{URL|www.example.com}} --&amp;gt;&lt;br /&gt;
| slogan               = &lt;br /&gt;
| commercial           = &lt;br /&gt;
| type                 = &lt;br /&gt;
| registration         = &lt;br /&gt;
| language             = &lt;br /&gt;
| num_users            = &lt;br /&gt;
| content_license      = &lt;br /&gt;
| programming language = &lt;br /&gt;
| owner                = &lt;br /&gt;
| author               = &lt;br /&gt;
| editor               = &lt;br /&gt;
| launch_date          = &amp;lt;!-- {{Start date and age|YYYY|MM|DD|df=yes/no}} --&amp;gt;&lt;br /&gt;
| revenue              = &lt;br /&gt;
| alexa                = &amp;lt;!-- {{increase}} {{steady]} {{decrease}} [http://www.alexa.com/siteinfo/example.com ##] (US/Global, MM/YYYY) --&amp;gt;&lt;br /&gt;
| ip                   = &lt;br /&gt;
| current_status       = &lt;br /&gt;
| footnotes            = &lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
All parameters are optional. Avoid linking to an article more than once within the infobox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;An infobox for articles about website&amp;quot;,&lt;br /&gt;
  &amp;quot;params&amp;quot;: {&lt;br /&gt;
   &amp;quot;logo&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The website logo.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Logo&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;logocaption&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Caption for the logo.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Logo Caption&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;screenshot&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;A screen photo of the homepage; see: [[:File:EnglishWikipediaMainPage3rdAugust2007.PNG|Example 1]].&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Screenshot&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;collapsible&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Whether the screenshot should be collapsed / visible at page load. (Yes / No)&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Collapsible&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;collapsetext&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Text for the header of the collapsed section, defaults to &#039;&#039;Screenshot&#039;&#039;.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Collapse Text&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;caption&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Caption saying screenshot of &amp;lt;nowiki&amp;gt;&amp;lt;website name&amp;gt;&amp;lt;/nowiki&amp;gt; as of &amp;lt;nowiki&amp;gt;&amp;lt;date&amp;gt;&amp;lt;/nowiki&amp;gt;.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Caption&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;url&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The most used [[URL]] of the website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Url&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;slogan&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The slogan of the website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Slogan&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;commercial&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Is the site commercially run / owned? (Yes / No)&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Commercial&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;type&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The type of website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Type&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;registration&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Is there registration? (None / Optional / Required)&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Registration&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;language&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The language(s) the website is available in.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Language&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;num_users&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The number of registered users the website has.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Num Users&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;content_license&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The license of the content of the site. Works same as content_licence.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Content License&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;content_licence&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The license of the content of the site. Works same as content_license.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Content Licence&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;programming language&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Programming language written or coding done for the website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Programming Language&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;owner&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The current owner, company name / persons name / alias, etc.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Owner&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;author&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The person or entity that writes for the website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Author&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;editor&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The person or entity that edits the website.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Editor&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;launch_date&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;When the website was launched, check the [[Whois|WHOIS]] database, if needed.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Launch Date&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;revenue&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The approximate revenue of the site.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Revenue&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;alexa&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The website&#039;s current [[Alexa Internet|Alexa]] ranking (find on [http://www.alexa.com Alexa.com]; make sure to cite Alexa&#039;s page for this info.)&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Alexa&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
{{Infobox website&lt;br /&gt;
| name            = Wikipedia&lt;br /&gt;
| logo            = [[File:Wikipedia-v2-logo.svg|frameless|150px|alt=A white sphere made of large jigsaw pieces. Letters from several alphabets are shown on the pieces.]] &amp;lt;br /&amp;gt;[[File:Wikipedia wordmark.svg|150px|Wikipedia wordmark]]&lt;br /&gt;
| logocaption     = The [[logo of Wikipedia]], a globe featuring [[glyph]]s from several writing systems&lt;br /&gt;
| screenshot      = [[File:Www.wikipedia.org screenshot 2013.png|border|300px|alt=Wikipedia&#039;s homepage with links to many languages.]]&lt;br /&gt;
| collapsible     = yes&lt;br /&gt;
| caption         = Screenshot of Wikipedia&#039;s multilingual portal.&lt;br /&gt;
| url             = {{URL|http://www.wikipedia.org}}&lt;br /&gt;
| slogan          = The Free Encyclopedia&lt;br /&gt;
| commercial      = No&lt;br /&gt;
| type            = [[Internet encyclopedia]]&lt;br /&gt;
| registration    = Optional, but is required for certain tasks such as editing protected pages, creating pages in English Wikipedia and uploading files&lt;br /&gt;
| language        = 275 active editions (285 in total)&lt;br /&gt;
| num_users       = 35 million (total registered in all editions)&amp;lt;ref&amp;gt;[[meta:List of Wikipedias#Grand Total|Grand Total]]. Wikimedia. June 10, 2012. Retrieved June 11, 2012.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| content license = {{nobr|[[Creative Commons licenses|Creative Commons Attribution / Share-Alike]] 3.0}} (most text also dual-licensed under [[GFDL]]) &amp;lt;br /&amp;gt;Media licensing varies&lt;br /&gt;
| owner           = [[Wikimedia Foundation]] (non-profit)&lt;br /&gt;
| author          = [[Jimmy Wales]], [[Larry Sanger]]&amp;lt;ref name=&amp;quot;Sidener&amp;quot;&amp;gt;&lt;br /&gt;
{{cite news&lt;br /&gt;
| first = Jonathan&lt;br /&gt;
| last = Sidener&lt;br /&gt;
| title = Wikipedia co-founder looks to add accountability, end anarchy&lt;br /&gt;
| url = http://www.signonsandiego.com/uniontrib/20060923/news_lz1n23wiki.html&lt;br /&gt;
| publisher = [[The San Diego Union-Tribune]]&lt;br /&gt;
| date = September 23, 2006&lt;br /&gt;
| accessdate = 2007-03-25&lt;br /&gt;
| quote = The origins of Wikipedia date to 2000, when Sanger was finishing his doctoral thesis in philosophy and had an idea for a Web site.&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| launch date     = {{Start date and years ago|mf=yes|2001|1|15}}&lt;br /&gt;
| current status  = Online&lt;br /&gt;
| alexa           = {{steady}}[http://www.alexa.com/siteinfo/wikipedia.org 6] (Global, January 2014)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox website&lt;br /&gt;
| name            = Wikipedia&lt;br /&gt;
| logo            = [[File:Wikipedia-v2-logo.svg|frameless|150px|alt=A white sphere made of large jigsaw pieces. Letters from several alphabets are shown on the pieces.]] &amp;lt;br /&amp;gt;[[File:Wikipedia wordmark.svg|150px|Wikipedia wordmark]]&lt;br /&gt;
| logocaption     = The [[logo of Wikipedia]], a globe featuring [[glyph]]s from several writing systems&lt;br /&gt;
| screenshot      = [[File:Www.wikipedia.org screenshot 2013.png|border|300px|alt=Wikipedia&#039;s homepage with links to many languages.]]&lt;br /&gt;
| collapsible     = yes&lt;br /&gt;
| caption         = Screenshot of Wikipedia&#039;s multilingual portal.&lt;br /&gt;
| url             = {{URL|http://www.wikipedia.org}}&lt;br /&gt;
| slogan          = The Free Encyclopedia&lt;br /&gt;
| commercial      = No&lt;br /&gt;
| type            = [[Internet encyclopedia]]&lt;br /&gt;
| registration    = Optional, but is required for certain tasks such as editing protected pages, creating pages in English Wikipedia and uploading files&lt;br /&gt;
| language        = 275 active editions (285 in total)&lt;br /&gt;
| num_users       = 35 million (total registered in all editions)&amp;lt;ref&amp;gt;[[meta:List of Wikipedias#Grand Total|Grand Total]]. Wikimedia. June 10, 2012. Retrieved June 11, 2012.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| content license = {{nobr|[[Creative Commons licenses|Creative Commons Attribution / Share-Alike]] 3.0}} (most text also dual-licensed under [[GFDL]]) &amp;lt;br /&amp;gt;Media licensing varies&lt;br /&gt;
| owner           = [[Wikimedia Foundation]] (non-profit)&lt;br /&gt;
| author          = [[Jimmy Wales]], [[Larry Sanger]]&amp;lt;ref name=&amp;quot;Sidener&amp;quot; /&amp;gt;&lt;br /&gt;
| launch date     = {{Start date and years ago|mf=yes|2001|1|15}}&lt;br /&gt;
| current status  = Online&lt;br /&gt;
| alexa           = {{steady}}[http://www.alexa.com/siteinfo/wikipedia.org 6] (Global, January 2014)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Wikipedia:Notability (web)]]&lt;br /&gt;
* [[Wikipedia:WikiProject Websites]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
{{Organization infoboxes}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;!-- ADD CATEGORIES AFTER THIS LINE --&amp;gt;&lt;br /&gt;
[[Category:Computing infobox templates|Website]]&lt;br /&gt;
[[Category:Websites templates| ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ADD INTERWIKIS LINKS AFTER THIS LINE --&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Pp-meta/pagetype&amp;diff=22923</id>
		<title>Template:Pp-meta/pagetype</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Pp-meta/pagetype&amp;diff=22923"/>
		<updated>2014-01-14T20:14:25Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Added NODOC documentation (generates protection icon)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{TALKSPACE}}|{{NAMESPACE}}|talk page|&lt;br /&gt;
{{#switch:{{NAMESPACE}}&lt;br /&gt;
 |{{ns:}}              = article&lt;br /&gt;
 |{{ns:File}}          = file&lt;br /&gt;
 |{{ns:Template}}      = template&lt;br /&gt;
 |{{ns:Category}}      = category&lt;br /&gt;
 |{{ns:Module}}        = module&lt;br /&gt;
 |#default             = page}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc|content={{NODOC}}}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:InfoboxImage&amp;diff=23861</id>
		<title>Module:InfoboxImage</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:InfoboxImage&amp;diff=23861"/>
		<updated>2014-01-14T19:08:45Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: change as per request by User:Nullzero to make file &amp;amp; image prefixes work with other languages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Inputs:&lt;br /&gt;
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link&lt;br /&gt;
--    size - size to display the image&lt;br /&gt;
--    maxsize - maximum size for image&lt;br /&gt;
--    sizedefault - default size to display the image if size param is blank&lt;br /&gt;
--    alt - alt text for image&lt;br /&gt;
--    title - title text for image&lt;br /&gt;
--    border - set to yes if border&lt;br /&gt;
--    center - set to yes, if the image has to be centered&lt;br /&gt;
--    upright - upright image param&lt;br /&gt;
--    suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it&lt;br /&gt;
--    link - page to visit when clicking on image&lt;br /&gt;
-- Outputs:&lt;br /&gt;
--    Formatted image.&lt;br /&gt;
-- More details available at the &amp;quot;Module:InfoboxImage/doc&amp;quot; page&lt;br /&gt;
&lt;br /&gt;
local i = {};&lt;br /&gt;
&lt;br /&gt;
local placeholder_image = {&lt;br /&gt;
    &amp;quot;Blue - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Blue - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Female no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None (square).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Location map of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Male no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Missing flag.png&amp;quot;,&lt;br /&gt;
    &amp;quot;No flag.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No free portrait.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (female).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (male).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image male.svg&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function i.IsPlaceholder(image)&lt;br /&gt;
    -- change underscores to spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
    -- if image starts with [[ then remove that and anything after |&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        image = mw.ustring.sub(image,3);&lt;br /&gt;
        image = mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    -- remove prefix if exists&lt;br /&gt;
    local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
    for i, name in ipairs(allNames) do&lt;br /&gt;
        if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
            image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &#039;^[ ]*(.-)[ ]*$&#039;, &#039;%1&#039;);&lt;br /&gt;
    -- capitalise first letter&lt;br /&gt;
    image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);&lt;br /&gt;
&lt;br /&gt;
    for i,j in pairs(placeholder_image) do&lt;br /&gt;
        if image == j then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function i.InfoboxImage(frame)&lt;br /&gt;
    local image = frame.args[&amp;quot;image&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    if image == &amp;quot;&amp;quot; or image == nil then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if image == &amp;quot;&amp;amp;nbsp;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    end&lt;br /&gt;
    if frame.args[&amp;quot;suppressplaceholder&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
        if i.IsPlaceholder(image) == true then&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,5)) == &amp;quot;http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,8)) == &amp;quot;[[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        -- search for thumbnail images and add to tracking cat if found&lt;br /&gt;
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, &amp;quot;|%s*thumb%s*[|%]]&amp;quot;) or mw.ustring.find(image, &amp;quot;|%s*thumbnail%s*[|%]]&amp;quot;)) then&lt;br /&gt;
            return image .. &amp;quot;[[Category:Pages using infoboxes with thumbnail images]]&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            return image;&lt;br /&gt;
        end&lt;br /&gt;
    elseif mw.ustring.sub(image,1,2) == &amp;quot;{{&amp;quot; and mw.ustring.sub(image,1,3) ~= &amp;quot;{{{&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,1) == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,5) == mw.ustring.char(127)..&amp;quot;UNIQ&amp;quot; then&lt;br /&gt;
        -- Found strip marker at begining, so pass don&#039;t process at all&lt;br /&gt;
        return image;&lt;br /&gt;
    else&lt;br /&gt;
        local result = &amp;quot;&amp;quot;;&lt;br /&gt;
        local size = frame.args[&amp;quot;size&amp;quot;];&lt;br /&gt;
        local maxsize = frame.args[&amp;quot;maxsize&amp;quot;];&lt;br /&gt;
        local sizedefault = frame.args[&amp;quot;sizedefault&amp;quot;];&lt;br /&gt;
        local alt = frame.args[&amp;quot;alt&amp;quot;];&lt;br /&gt;
        local link = frame.args[&amp;quot;link&amp;quot;];&lt;br /&gt;
        local title = frame.args[&amp;quot;title&amp;quot;];&lt;br /&gt;
        local border = frame.args[&amp;quot;border&amp;quot;];&lt;br /&gt;
        local upright = frame.args[&amp;quot;upright&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local thumbtime = frame.args[&amp;quot;thumbtime&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local center= frame.args[&amp;quot;center&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        -- remove prefix if exists&lt;br /&gt;
        local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
        for i, name in ipairs(allNames) do&lt;br /&gt;
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if maxsize ~= &amp;quot;&amp;quot; and maxsize ~= nil then&lt;br /&gt;
            -- if no sizedefault then set to maxsize&lt;br /&gt;
            if sizedefault == &amp;quot;&amp;quot; or sizedefault == nil then&lt;br /&gt;
                sizedefault = maxsize&lt;br /&gt;
            end&lt;br /&gt;
            -- check to see if size bigger than maxsize&lt;br /&gt;
            if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
                local sizenumber = tonumber(mw.ustring.match(size,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize,&amp;quot;%d*&amp;quot;));&lt;br /&gt;
                if sizenumber&amp;gt;maxsizenumber and maxsizenumber&amp;gt;0 then&lt;br /&gt;
                    size = maxsize;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to size if just a number&lt;br /&gt;
        if (tonumber(size) or 0) &amp;gt; 0 then&lt;br /&gt;
            size = size .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        result = &amp;quot;[[File:&amp;quot; .. image;&lt;br /&gt;
        if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. size;&lt;br /&gt;
        elseif sizedefault ~= &amp;quot;&amp;quot; and sizedefault ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. sizedefault;&lt;br /&gt;
        else&lt;br /&gt;
            result = result .. &amp;quot;|frameless&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if center == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|center&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|alt=&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; and link ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|link=&amp;quot; .. link;&lt;br /&gt;
        end&lt;br /&gt;
        if border == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|border&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if upright ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright=&amp;quot; .. upright;&lt;br /&gt;
        end&lt;br /&gt;
        if thumbtime ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|thumbtime=&amp;quot; .. thumbtime;&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. title;&lt;br /&gt;
        elseif alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return i;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Pp-meta&amp;diff=17414</id>
		<title>Template:Pp-meta</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Pp-meta&amp;diff=17414"/>
		<updated>2014-01-14T17:40:37Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Undid revision 590680125 by Wbm1058 (talk) - second thoughts on this. maybe better to just manually clear the clutter. I see that at least one bot does that.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
  |move=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:move}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |sysop|yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |create=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:create}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |template=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |templateeditor |template      = templateeditor&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:edit}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |pc1 =&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |pc1                           = autoconfirmed &amp;lt;!-- this is the value that the PENDINGCHANGELEVEL magic word returns for pc1 --&amp;gt;&lt;br /&gt;
        |undefined                     = {{PENDINGCHANGELEVEL}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |autoconfirmed&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |pc2 =&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |pc2                           = review &amp;lt;!-- this is the value that the PENDINGCHANGELEVEL magic word returns for pc2 --&amp;gt;&lt;br /&gt;
        |undefined                     = {{PENDINGCHANGELEVEL}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |review&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
|#default&amp;lt;!--includes all other types--&amp;gt;=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:edit}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |{{#ifeq:{{#switch:{{lc:{{{disallowlevel|}}}}}&lt;br /&gt;
                 |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
                 |administrator |full |sysop    = sysop&lt;br /&gt;
                 |#default                      = &amp;lt;!--fallback value: null--&amp;gt;}}&lt;br /&gt;
         |{{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
            |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
            |administrator |full |sysop    = sysop&lt;br /&gt;
            |undefined                     = {{PROTECTIONLEVEL:edit}}&lt;br /&gt;
            |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
       --&amp;gt;}}&lt;br /&gt;
         |no|yes&lt;br /&gt;
       }}&lt;br /&gt;
   |no}}&lt;br /&gt;
}}|yes|{{#ifeq:{{lc:{{{small|}}}}}|yes|&lt;br /&gt;
&amp;lt;div class=&amp;quot;metadata topicon nopopups&amp;quot; id=&amp;quot;protected-icon&amp;quot; style=&amp;quot;display:none; right:{{#if:{{{right|}}}|{{{right}}}|55px}};&amp;quot;&amp;gt;[[Image:{{{image|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=Padlock.svg&lt;br /&gt;
 |semi=Padlock-silver.svg&lt;br /&gt;
 |template=Padlock-pink.svg&lt;br /&gt;
 |pc1=Padlock-silver-light.svg&lt;br /&gt;
 |pc2=Padlock-orange.svg&lt;br /&gt;
 |move=Padlock-olive.svg&lt;br /&gt;
 |indef=Padlock-red.svg&lt;br /&gt;
 |office=Padlock-black.svg&lt;br /&gt;
 |create=Padlock-skyblue.svg&lt;br /&gt;
 |#default=Transparent.gif&lt;br /&gt;
}}}}}|20px|link={{{icon-link|Wikipedia:Protection policy#{{lc:{{{type}}}}}}}}|{{{icon-text|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
|pc1 = All edits by unregistered and new users are subject to review&lt;br /&gt;
|pc2 = All edits by users who are not reviewers or administrators are subject to review&lt;br /&gt;
|template = This is a permanently protected {{pp-meta/pagetype}}&lt;br /&gt;
|#default = This {{pp-meta/pagetype}} is {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
  |semi=semi-&lt;br /&gt;
  |move=move-&lt;br /&gt;
  |indef=permanently&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  |create=creation-&lt;br /&gt;
  |office=&amp;lt;!--null, but should this have a special tag?--&amp;gt;&lt;br /&gt;
  |full&lt;br /&gt;
  |#default=&amp;lt;!--null--&amp;gt;&lt;br /&gt;
  }}protected&lt;br /&gt;
}}{{#ifeq:{{lc:{{{type}}}}}|indef||{{#if:{{{expiry|}}}|&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;until {{#time:F j, Y|{{{expiry}}}}}{{#if:{{{icon-reason|}}}|,}}}}}}{{#if:{{{icon-reason|}}}|&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;{{{icon-reason}}}}}.}}}|alt={{#ifeq:{{lc:{{{type}}}}}|template&lt;br /&gt;
 |{{#switch:{{NAMESPACENUMBER}}&lt;br /&gt;
   |10|828=Permanently protected {{pp-meta/pagetype}}&lt;br /&gt;
   |#default=Page permanently protected&lt;br /&gt;
  }}&lt;br /&gt;
 |Page {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
          |pc1=protected with pending changes level 1&lt;br /&gt;
          |pc2=protected with pending changes level 2&lt;br /&gt;
          |semi=semi-protected&lt;br /&gt;
          |move=move-protected&lt;br /&gt;
          |indef=permanently protected&lt;br /&gt;
          |create=creation-protected&lt;br /&gt;
          |office=&amp;lt;!--null, but should this have a special tag?--&amp;gt;&lt;br /&gt;
          |full&lt;br /&gt;
          |#default=protected&lt;br /&gt;
       }}&lt;br /&gt;
}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|&amp;lt;!-- else, not small --&amp;gt;&lt;br /&gt;
{{mbox &lt;br /&gt;
| name = {{{name|Pp-meta}}}&lt;br /&gt;
| subst = {{{subst|}}}&lt;br /&gt;
| demospace = {{{demospace|}}}&lt;br /&gt;
| type = protection&lt;br /&gt;
| image = [[Image:{{{image|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=Padlock.svg&lt;br /&gt;
 |semi=Padlock-silver.svg&lt;br /&gt;
 |pc1=Padlock-silver-light.svg&lt;br /&gt;
 |pc2=Padlock-orange.svg&lt;br /&gt;
 |move=Padlock-olive.svg&lt;br /&gt;
 |template=Padlock-pink.svg&lt;br /&gt;
 |indef=Padlock-red.svg&lt;br /&gt;
 |office=Padlock-black.svg&lt;br /&gt;
 |create=Padlock-skyblue.svg&lt;br /&gt;
 |#default=Transparent.gif&lt;br /&gt;
}}}}}|40px|{{{icon-text|{{#ifeq:{{lc:{{{type}}}}}|template&lt;br /&gt;
                         |{{#switch:{{NAMESPACENUMBER}}&lt;br /&gt;
                           |10|828=This is a permanently protected {{pp-meta/pagetype}}&lt;br /&gt;
                           |#default=This page is permanently protected&lt;br /&gt;
                          }}&lt;br /&gt;
                         |This page is {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
                                        |pc1=protected with pending changes level 1&lt;br /&gt;
                                        |pc2=protected with pending changes level 2&lt;br /&gt;
                                        |semi=semi-protected&lt;br /&gt;
                                        |move=move-protected&lt;br /&gt;
                                        |indef=permanently protected&lt;br /&gt;
                                        |create=creation-protected&lt;br /&gt;
                                        |office=protected&amp;lt;!--should this have a special tag?--&amp;gt;&lt;br /&gt;
                                        |full&lt;br /&gt;
                                        |#default=protected&lt;br /&gt;
                                       }}&lt;br /&gt;
                        }}.}}}]]&lt;br /&gt;
| text = &#039;&#039;&#039;{{{reason-text|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=This page is currently [[Help:Protection|protected]] from editing&lt;br /&gt;
 |semi=Editing of this {{pp-meta/pagetype}} by [[Wikipedia:User access levels#Autoconfirmed_users|new]] or [[Wikipedia:User access levels#Anonymous_users|unregistered]] users is currently [[Wikipedia:Protection policy|disabled]]&lt;br /&gt;
 |pc1=All edits made to this {{pp-meta/pagetype}} by [[Wikipedia:User access levels#Autoconfirmed_users|new]] or [[Wikipedia:User access levels#Anonymous_users|unregistered]] users are currently [[Wikipedia:Pending changes|subject to review]]&lt;br /&gt;
 |pc2=All edits made to this {{pp-meta/pagetype}} by users who are not [[Wikipedia:Reviewing|reviewers]] or [[Wikipedia:Administrators|administrators]] are currently [[Wikipedia:Pending changes|subject to review]]&lt;br /&gt;
 |move=This {{pp-meta/pagetype}} is currently [[Help:Protection|protected]] from [[Help:Moving a page|page moves]]&lt;br /&gt;
 |template=This is a permanently [[Help:Protection|protected]] {{pp-meta/pagetype}}, as it is [[Wikipedia:High-risk templates|high-risk]]&lt;br /&gt;
 |indef=This page is [[Help:Protection|protected]] from editing &#039;&#039;indefinitely&#039;&#039;&lt;br /&gt;
 |office=This {{pp-meta/pagetype}} is currently [[Help:Protection|protected]] from editing&lt;br /&gt;
 |create=[[Help:Starting a new page|Recreation]] of this {{pp-meta/pagetype}} [[Help:Protection|has been disabled]]&lt;br /&gt;
}}{{#ifeq:{{lc:{{{type}}}}}|indef||{{#if:{{{expiry|}}}|&amp;amp;#32;until {{#time:F j, Y|{{{expiry}}}}}{{#if:{{{reason|}}}|,}}}}}}{{{reason&amp;lt;includeonly&amp;gt;|&amp;lt;/includeonly&amp;gt;}}}.}}}&#039;&#039;&#039;&amp;lt;br /&amp;gt; {{{explanation-text|{{#ifeq:{{lc:{{{dispute}}}}}|yes|This protection is &#039;&#039;&#039;not&#039;&#039;&#039; an endorsement of the {{#ifeq:{{{type}}}|move|[{{fullurl:Special:Log|type=move&amp;amp;page={{FULLPAGENAMEE}}}} current title]|[{{fullurl:{{FULLPAGENAMEE}}|action=history}} current version]}}.}} See the [[Wikipedia:Protection policy|protection policy]] and [{{fullurl:Special:Log|type={{#switch:{{lc:{{{type}}}}} | pc1 | pc2 = stable | #default = protect }}&amp;amp;page={{FULLPAGENAMEE}}}} {{#switch:{{lc:{{{type}}}}} | pc1 | pc2 = pending changes | #default = protection }} log] for more details. {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full|indef=Please discuss any changes on the [[{{TALKPAGENAME}}#{{#if:{{{section|}}}|{{{section}}}|top}}|talk page]]; you may use the {{tlx|edit protected}} template to ask an [[Wikipedia:Administrators|administrator]] to make an edit if it is supported by [[Wikipedia:Consensus|consensus]]. {{#ifeq:{{NAMESPACE}}|{{ns:8}}&amp;lt;!--MediaWiki--&amp;gt;||You may also [[Wikipedia:Requests for page protection|request]] that this page be unprotected.}}&lt;br /&gt;
 |semi=If you cannot edit this {{pp-meta/pagetype}} and you wish to make a change, you can {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}||[[Template:Editsemiprotected|request an edit]], [[{{TALKPAGENAME}}|discuss changes on the talk page]],}} [[Wikipedia:Requests for page protection#Current requests for unprotection|request unprotection]], [[Special:Userlogin|log in]], or [[Special:UserLogin/signup|create an account]].&lt;br /&gt;
 |move=The page may still be edited but cannot be moved until unprotected. Please discuss any suggested moves on the [[{{TALKPAGENAME}}|talk page]] or at [[Wikipedia:Requested moves]].  You can also [[Wikipedia:Requests for page protection|request]] that the page be unprotected.  &lt;br /&gt;
 |template=Please discuss any changes on the [[{{TALKPAGENAME}}#{{#if:{{{section|}}}|{{{section}}}|top}}|talk page]]; you may use the {{tlx|edit protected}} template to ask an [[Wikipedia:Administrators|administrator]] or [[Wikipedia:Template editor|template editor]] to make an edit if it is supported by [[Wikipedia:Consensus|consensus]]. {{#ifeq:{{NAMESPACE}}|{{ns:8}}&amp;lt;!--MediaWiki--&amp;gt;||You may also [[Wikipedia:Requests for page protection|request]] that this page be unprotected.}}&lt;br /&gt;
 |office=If you can edit this page, please discuss all changes and additions on the [[{{TALKPAGENAME}}|talk page]] first. &#039;&#039;&#039;Do not remove protection from this page unless you are authorized by the Wikimedia Foundation to do so.&#039;&#039;&#039;&lt;br /&gt;
 |create=Please see the {{#if:{{{xfd|}}}|&#039;&#039;&#039;[[{{{xfd}}}|deletion discussion]]&#039;&#039;&#039; or the}} [{{fullurl:Special:Log|type=delete&amp;amp;page={{FULLPAGENAMEE}}}} deletion log] for details of why this page was deleted. If you would like to create a page at this title, you must first [[Wikipedia:Requests for page protection|request]] for it to be unprotected, or contact the administrator who deleted the page for the deleted material to be restored. If unsuccessful, you can use [[Wikipedia:Deletion review|deletion review]].&lt;br /&gt;
}}}}}&lt;br /&gt;
}}&lt;br /&gt;
}}|&amp;lt;includeonly&amp;gt;[[Category:Wikipedia pages with incorrect protection templates]]&amp;lt;/includeonly&amp;gt;}}&amp;lt;!--End if small--&amp;gt;&amp;lt;includeonly&amp;gt;{{#ifeq:{{lc:{{{categories|no}}}}}|no||{{{categories|}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23891</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23891"/>
		<updated>2014-01-13T05:40:58Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: tweak one of the comments and make some beautification fixes, now that this is in the job queue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from #invoke.&lt;br /&gt;
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	-- Get the arguments from the frame object if available. If the frame object is not available, we are being called&lt;br /&gt;
	-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if not options.parentOnly then&lt;br /&gt;
			fargs = frame.args&lt;br /&gt;
		end&lt;br /&gt;
		if not options.frameOnly then&lt;br /&gt;
			pargs = frame:getParent().args&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.&lt;br /&gt;
	-- The metatable connects the two together.&lt;br /&gt;
	local args, metaArgs, metatable = {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions&lt;br /&gt;
	-- depending on the options chosen. This is so that we don&#039;t have to call the options table every time the function is called.&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&amp;quot;bad value assigned to option &#039;valueFunc&#039; (function expected, got &amp;quot; .. type(tidyVal) .. &#039;)&#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(iterator, tables)&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.&lt;br /&gt;
		-- If a value is already present it is not overwritten; tables listed earlier have precedence.&lt;br /&gt;
		-- We are also memoizing nil values, but those values can be overwritten.&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in iterator(t) do&lt;br /&gt;
				local metaArgsVal = metaArgs[key]&lt;br /&gt;
				if metaArgsVal == nil or metaArgsVal == nilArg then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						metaArgs[key] = nilArg&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,&lt;br /&gt;
	-- which is how we avoid clashes between the frame/parent args and the Lua args.	&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the&lt;br /&gt;
	-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase&lt;br /&gt;
	-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we&lt;br /&gt;
	-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and&lt;br /&gt;
	-- pargs if pairs has already been run, as all the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			if val == nilArg then&lt;br /&gt;
				return nil&lt;br /&gt;
			else&lt;br /&gt;
				return val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal == nil then&lt;br /&gt;
				metaArgs[key] = nilArg&lt;br /&gt;
			else&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&#039;could not write to argument table key &amp;quot;&#039; .. tostring(key) .. &#039;&amp;quot;; the table is read-only&#039;, 2)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&#039;could not write to argument table key &amp;quot;&#039; .. tostring(key) .. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;, 2)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			metaArgs[key] = nilArg -- Memoize nils.&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(pairs, argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
			metatable.doneIpairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return function (t, k)&lt;br /&gt;
			local nk, val = next(metaArgs, k)&lt;br /&gt;
			if val == nilArg then&lt;br /&gt;
				val = nil&lt;br /&gt;
			end&lt;br /&gt;
			return nk, val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function ()&lt;br /&gt;
		if not metatable.doneIpairs then&lt;br /&gt;
			mergeArgs(ipairs, argTables)&lt;br /&gt;
			metatable.doneIpairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return function (t, i)&lt;br /&gt;
			local val = metaArgs[i + 1]&lt;br /&gt;
			if val == nil then&lt;br /&gt;
				return nil&lt;br /&gt;
			elseif val == nilArg then&lt;br /&gt;
				val = nil&lt;br /&gt;
			end&lt;br /&gt;
			return i + 1, val&lt;br /&gt;
		end, nil, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:TimeAgo&amp;diff=23899</id>
		<title>Module:TimeAgo</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:TimeAgo&amp;diff=23899"/>
		<updated>2014-01-13T05:12:48Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: allow blank values of |ago=&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Replacement for [[Template:Time ago]]&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
	local args = getArgs( frame, {&lt;br /&gt;
		valueFunc = function( k, v )&lt;br /&gt;
			if v then&lt;br /&gt;
				v = v:match( &#039;^%s*(.-)%s*$&#039; ) -- Trim whitespace.&lt;br /&gt;
				if k == &#039;ago&#039; or v ~= &#039;&#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main( args )&lt;br /&gt;
	-- Initialize variables&lt;br /&gt;
	local lang = mw.language.getContentLanguage()&lt;br /&gt;
	local ago&lt;br /&gt;
	local auto_magnitude_num&lt;br /&gt;
	local min_magnitude_num&lt;br /&gt;
	local result&lt;br /&gt;
	local result_unit&lt;br /&gt;
	local magnitude = args.magnitude&lt;br /&gt;
	local min_magnitude = args.min_magnitude&lt;br /&gt;
	local purge = args.purge&lt;br /&gt;
	&lt;br /&gt;
	-- Generate the &amp;quot;ago&amp;quot; string. If ago is the blank string, do nothing - this allows overriding of args.ago&lt;br /&gt;
	-- in cases where the module is used to generate something like &amp;quot;where he has worked for the past 20 years.&amp;quot;&lt;br /&gt;
	ago = args.ago&lt;br /&gt;
	if ago and ago ~= &#039;&#039; then&lt;br /&gt;
		ago = &#039; &#039; .. ago&lt;br /&gt;
	elseif not ago then&lt;br /&gt;
		ago = &#039; ago&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add a purge link if something (usually &amp;quot;yes&amp;quot;) is entered into the purge parameter&lt;br /&gt;
	if purge then&lt;br /&gt;
		purge = &#039; &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;([&#039; .. mw.title.getCurrentTitle():fullUrl(&#039;action=purge&#039;) .. &#039; purge])&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	else&lt;br /&gt;
		purge = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check that the entered timestamp is valid. If it isn&#039;t, then give an error message.&lt;br /&gt;
	local noError, inputTime = pcall( lang.formatDate, lang, &#039;U&#039;, args[1] )&lt;br /&gt;
	if not noError then&lt;br /&gt;
		return &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error: first parameter cannot be parsed as a date or time.&amp;lt;/strong&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Store the difference between the current time and the inputted time, as well as its absolute value.&lt;br /&gt;
	local timeDiff = lang:formatDate( &#039;U&#039; ) - inputTime&lt;br /&gt;
	local absTimeDiff = math.abs( timeDiff )&lt;br /&gt;
&lt;br /&gt;
	if magnitude then&lt;br /&gt;
		auto_magnitude_num = 0&lt;br /&gt;
		min_magnitude_num = timeText[magnitude]&lt;br /&gt;
	else&lt;br /&gt;
		-- Calculate the appropriate unit of time if it was not specified as an argument.&lt;br /&gt;
		local autoMagnitudeData = {&lt;br /&gt;
			{denom = 63115200, amn = 31557600},&lt;br /&gt;
			{denom = 5356800, amn = 2678400},&lt;br /&gt;
			{denom = 172800, amn = 86400},&lt;br /&gt;
			{denom = 7200, amn = 3600},&lt;br /&gt;
			{denom = 120, amn = 60}&lt;br /&gt;
		}&lt;br /&gt;
		for i, t in ipairs(autoMagnitudeData) do&lt;br /&gt;
			if absTimeDiff / t.denom &amp;gt;= 1 then&lt;br /&gt;
				auto_magnitude_num = t.amn&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		auto_magnitude_num = auto_magnitude_num or 1&lt;br /&gt;
		if min_magnitude then&lt;br /&gt;
			min_magnitude_num = timeText[min_magnitude]&lt;br /&gt;
		else&lt;br /&gt;
			min_magnitude_num = -1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not min_magnitude_num then&lt;br /&gt;
		-- Default to seconds if an invalid magnitude is entered.&lt;br /&gt;
		min_magnitude_num = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )&lt;br /&gt;
	local result_num = math.floor ( absTimeDiff / magnitude_num )&lt;br /&gt;
&lt;br /&gt;
	if timeDiff &amp;gt;= 0 then -- Past&lt;br /&gt;
		if result_num == 1 then&lt;br /&gt;
			result_unit = timeUnits[ magnitude_num ][1]&lt;br /&gt;
		else&lt;br /&gt;
			result_unit = timeUnits[ magnitude_num ][2]&lt;br /&gt;
		end&lt;br /&gt;
		result = result_num .. &#039; &#039; .. result_unit .. ago -- Spaces for &amp;quot;ago&amp;quot; are added earlier.&lt;br /&gt;
	else -- Future&lt;br /&gt;
		if result_num == 1 then&lt;br /&gt;
			result_unit = timeUnits[ magnitude_num ][3]&lt;br /&gt;
		else&lt;br /&gt;
			result_unit = timeUnits[ magnitude_num ][4]&lt;br /&gt;
		end&lt;br /&gt;
		result = result_num .. &#039; &#039; .. result_unit .. &#039; time&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result .. purge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Table to convert entered text values to numeric values.&lt;br /&gt;
timeText = {&lt;br /&gt;
	[&#039;seconds&#039;] = 1,&lt;br /&gt;
	[&#039;minutes&#039;] = 60,&lt;br /&gt;
	[&#039;hours&#039;] = 3600,&lt;br /&gt;
	[&#039;days&#039;] = 86400,&lt;br /&gt;
	[&#039;weeks&#039;] = 604800,&lt;br /&gt;
	[&#039;months&#039;] = 2678400,&lt;br /&gt;
	[&#039;years&#039;] = 31557600&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Table containing tables of possible units to use in output.&lt;br /&gt;
timeUnits = {&lt;br /&gt;
	[1] = { &#039;second&#039;, &#039;seconds&#039;, &amp;quot;second&#039;s&amp;quot;, &amp;quot;seconds&#039;&amp;quot; },&lt;br /&gt;
	[60] = { &#039;minute&#039;, &#039;minutes&#039;, &amp;quot;minutes&#039;&amp;quot;, &amp;quot;minutes&#039;&amp;quot; },&lt;br /&gt;
	[3600] = { &#039;hour&#039;, &#039;hours&#039;, &amp;quot;hour&#039;s&amp;quot;, &amp;quot;hours&#039;&amp;quot; },&lt;br /&gt;
	[86400] = { &#039;day&#039;, &#039;days&#039;, &amp;quot;day&#039;s&amp;quot;, &amp;quot;days&#039;&amp;quot; },&lt;br /&gt;
	[604800] = { &#039;week&#039;, &#039;weeks&#039;, &amp;quot;week&#039;s&amp;quot;, &amp;quot;weeks&#039;&amp;quot; },&lt;br /&gt;
	[2678400] = { &#039;month&#039;, &#039;months&#039;, &amp;quot;month&#039;s&amp;quot;, &amp;quot;months&#039;&amp;quot; },&lt;br /&gt;
	[31557600] = { &#039;year&#039;, &#039;years&#039;, &amp;quot;year&#039;s&amp;quot;, &amp;quot;years&#039;&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Infobox_person&amp;diff=13772</id>
		<title>Template:Infobox person</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Infobox_person&amp;diff=13772"/>
		<updated>2014-01-11T04:59:27Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: per edit request on talk page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox|child={{{child|}}}&lt;br /&gt;
| bodyclass  = biography vcard&lt;br /&gt;
| bodystyle  = {{#if:{{{box_width|}}}|width:{{{box_width}}};}}&lt;br /&gt;
| above      = {{#if:{{{honorific prefix|{{{honorific_prefix|}}}}}}|&amp;lt;span class=&amp;quot;honorific-prefix&amp;quot; style=&amp;quot;font-size: small&amp;quot;&amp;gt;{{{honorific prefix|{{{honorific_prefix|}}}}}}&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;}}&amp;lt;includeonly&amp;gt;&amp;lt;span class=&amp;quot;fn&amp;quot;&amp;gt;{{{name|{{PAGENAME}}}}}&amp;lt;/span&amp;gt;&amp;lt;/includeonly&amp;gt;{{#if:{{{honorific suffix|{{{honorific_suffix|}}}}}}|&amp;lt;br /&amp;gt;&amp;lt;span class=&amp;quot;honorific-suffix&amp;quot; style=&amp;quot;font-size: small&amp;quot;&amp;gt;{{{honorific suffix|{{{honorific_suffix|}}}}}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
| image      = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image size|{{{image_size|{{{imagesize|}}}}}}}}}|sizedefault=frameless|alt={{{alt|}}}|suppressplaceholder=yes}}&lt;br /&gt;
| caption    = {{{image caption|{{{caption|{{{image_caption|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label1     = Native&amp;amp;nbsp;name&lt;br /&gt;
| data1      = {{#if:{{{native_name|}}}|&amp;lt;span class=&amp;quot;nickname&amp;quot; {{#if:{{{native_name_lang|}}}|lang=&amp;quot;{{{native_name_lang}}}&amp;quot; xml:lang=&amp;quot;{{{native_name_lang}}}&amp;quot;}}&amp;gt;{{{native_name}}}&amp;lt;/span&amp;gt; }}&lt;br /&gt;
&lt;br /&gt;
| label10     = Born&lt;br /&gt;
| data10      = {{br separated entries|1={{#if:{{{birth_name|{{{birthname|}}}}}}|&amp;lt;span class=&amp;quot;nickname&amp;quot;&amp;gt;{{{birth_name|{{{birthname|}}}}}}&amp;lt;/span&amp;gt;}}|2={{{birth_date|}}}|3={{#if:{{{birth_place|}}}|&amp;lt;span class=&amp;quot;birthplace&amp;quot;&amp;gt;{{{birth_place|}}}&amp;lt;/span&amp;gt;}}}}&lt;br /&gt;
&lt;br /&gt;
| label11     = Baptised&lt;br /&gt;
| data11      = {{#if:{{{birth_date|}}}||{{{baptised|}}}}}&lt;br /&gt;
&lt;br /&gt;
| label12     = Disappeared&lt;br /&gt;
| data12      = {{br separated entries|{{{disappeared_date|}}}|{{{disappeared_place|}}} }}&lt;br /&gt;
&lt;br /&gt;
| label13     = Status&lt;br /&gt;
| data13      = {{{disappeared_status|}}}&lt;br /&gt;
&lt;br /&gt;
| label14     = Died&lt;br /&gt;
| data14      = {{br separated entries|1={{{death_date|}}}|2={{#if:{{{death_place|}}}|&amp;lt;span class=&amp;quot;deathplace&amp;quot;&amp;gt;{{{death_place|}}}&amp;lt;/span&amp;gt;}}}}&lt;br /&gt;
&lt;br /&gt;
| label15     = {{Longitem|Cause&amp;amp;nbsp;of death}}&lt;br /&gt;
| data15      = {{{death cause|{{{death_cause|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label16     = {{Longitem|Body discovered}}&lt;br /&gt;
| data16      = {{{body discovered|{{{body_discovered|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label17     = {{Longitem|Resting place}}&lt;br /&gt;
| class17     = label&lt;br /&gt;
| data17      = {{br separated entries|{{{resting place|{{{resting_place|{{{restingplace|}}}}}}}}}|{{{resting place coordinates|{{{resting_place_coordinates|{{{restingplacecoordinates|}}}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label18     = Monuments&lt;br /&gt;
| data18      = {{{monuments|}}}&lt;br /&gt;
&lt;br /&gt;
| label19     = Residence&lt;br /&gt;
| class19     = {{#if:{{{death_date|}}}{{{death_place|}}}||label}}&lt;br /&gt;
| data19      = {{{residence|}}}&lt;br /&gt;
&lt;br /&gt;
| class20    = category&lt;br /&gt;
| label20    = Nationality&lt;br /&gt;
| data20     = {{{nationality|}}}&lt;br /&gt;
&lt;br /&gt;
| label21    = Other&amp;amp;nbsp;names&lt;br /&gt;
| class21    = nickname&lt;br /&gt;
| data21     = {{{other names|{{{other_names|{{{othername|{{{alias|}}}}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| class22    = category&lt;br /&gt;
| label22    = Ethnicity&lt;br /&gt;
| data22     = {{{ethnicity|}}}&lt;br /&gt;
&lt;br /&gt;
| class23    = category&lt;br /&gt;
| label23    = Citizenship&lt;br /&gt;
| data23     = {{{citizenship|}}}&lt;br /&gt;
&lt;br /&gt;
| label24    = Education&lt;br /&gt;
| data24     = {{{education|}}}&lt;br /&gt;
&lt;br /&gt;
| label25    = Alma&amp;amp;nbsp;mater&lt;br /&gt;
| data25     = {{{alma mater|{{{alma_mater|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label26    = Occupation&lt;br /&gt;
| class26    = role&lt;br /&gt;
| data26     = {{{occupation|}}}&lt;br /&gt;
&lt;br /&gt;
| label27    = Years&amp;amp;nbsp;active&lt;br /&gt;
| data27     = {{{years active|{{{years_active|{{{yearsactive|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label28    = Employer&lt;br /&gt;
| data28     = {{{employer|}}}&lt;br /&gt;
| class28    = org&lt;br /&gt;
&lt;br /&gt;
| label29    = Organization&lt;br /&gt;
| data29     = {{{organization|{{{organizations|}}}}}}&lt;br /&gt;
| class29    = org&lt;br /&gt;
&lt;br /&gt;
| label30    = Agent&lt;br /&gt;
| data30     = {{{agent|}}}&lt;br /&gt;
| class30    = agent&lt;br /&gt;
&lt;br /&gt;
| label31    = Known&amp;amp;nbsp;for&lt;br /&gt;
| data31     = {{{known for|{{{known_for|{{{known|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label32    = &amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;{{#if:{{{credits|}}}|Notable credit(s)|Notable work(s)}}&amp;lt;/span&amp;gt;&lt;br /&gt;
| data32     = {{#if:{{{credits|}}}|{{{credits}}}|{{{notable works|{{{notable_works|}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label33    = Style&lt;br /&gt;
| data33     = {{{style|}}}&lt;br /&gt;
| class33    = category&lt;br /&gt;
&lt;br /&gt;
| label36    = Home&amp;amp;nbsp;town&lt;br /&gt;
| data36     = {{{home town|{{{home_town|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label37    = Salary&lt;br /&gt;
| data37     = {{{salary|}}}&lt;br /&gt;
&lt;br /&gt;
| label38    = Net&amp;amp;nbsp;worth&lt;br /&gt;
| data38     = {{{net worth|{{{net_worth|{{{networth|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label39    = Height&lt;br /&gt;
| data39     = {{{height|}}}&lt;br /&gt;
&lt;br /&gt;
| label40    = Weight&lt;br /&gt;
| data40     = {{{weight|}}}&lt;br /&gt;
&lt;br /&gt;
| label41    = Television&lt;br /&gt;
| data41     = {{{television|}}}&lt;br /&gt;
&lt;br /&gt;
| label42    = Title&lt;br /&gt;
| data42     = {{{title|}}}&lt;br /&gt;
| class42    = title&lt;br /&gt;
&lt;br /&gt;
| label43    = Term&lt;br /&gt;
| data43     = {{{term|}}}&lt;br /&gt;
&lt;br /&gt;
| label44    = Predecessor&lt;br /&gt;
| data44     = {{{predecessor|}}}&lt;br /&gt;
&lt;br /&gt;
| label45    = Successor&lt;br /&gt;
| data45     = {{{successor|}}}&lt;br /&gt;
&lt;br /&gt;
| label46    = {{Longitem|Political party}}&lt;br /&gt;
| data46     = {{{party|}}}&lt;br /&gt;
| class46    = org&lt;br /&gt;
&lt;br /&gt;
| label47    = {{Longitem|Political movement}}&lt;br /&gt;
| data47     = {{{movement|}}}&lt;br /&gt;
| class47    = category&lt;br /&gt;
&lt;br /&gt;
| label48    = &amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;Opponent(s)&amp;lt;/span&amp;gt;&lt;br /&gt;
| data48     = {{{opponents|}}}&lt;br /&gt;
&lt;br /&gt;
| label49    = {{Longitem|Board member&amp;amp;nbsp;of}}&lt;br /&gt;
| data49     = {{{boards|}}}&lt;br /&gt;
&lt;br /&gt;
| label50    = Religion&lt;br /&gt;
| data50     = {{{religion|}}}&lt;br /&gt;
| class50    = category&lt;br /&gt;
&lt;br /&gt;
| label51    = Denomination&lt;br /&gt;
| data51     = {{{denomination|}}}&lt;br /&gt;
| class51    = category&lt;br /&gt;
&lt;br /&gt;
| label52    = {{Longitem|Criminal charge}}&lt;br /&gt;
| data52     = {{{criminal charge|{{{criminal_charge|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label53    = {{Longitem|Criminal penalty}}&lt;br /&gt;
| data53     = {{{criminal penalty|{{{criminal_penalty|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label54    = {{Longitem|Criminal status}}&lt;br /&gt;
| data54     = {{{criminal status|{{{criminal_status|}}}}}}&lt;br /&gt;
| class54    = category&lt;br /&gt;
&lt;br /&gt;
| label55    = &amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;Spouse(s)&amp;lt;/span&amp;gt;&lt;br /&gt;
| data55     = {{{spouse|}}}&lt;br /&gt;
&lt;br /&gt;
| label56    = &amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;Partner(s)&amp;lt;/span&amp;gt;&lt;br /&gt;
| data56     = {{{partner|{{{domesticpartner|{{{domestic_partner|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label57    = Children&lt;br /&gt;
| data57     = {{{children|}}}&lt;br /&gt;
&lt;br /&gt;
| label58    = Parents&lt;br /&gt;
| data58     = {{{parents|}}}&lt;br /&gt;
&lt;br /&gt;
| label59    = Relatives&lt;br /&gt;
| data59     = {{{relations|{{{relatives|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| label60    = Family&lt;br /&gt;
| data60     = {{{family|}}}&lt;br /&gt;
&lt;br /&gt;
| label61    = Call-sign&lt;br /&gt;
| data61     = {{{callsign|}}}&lt;br /&gt;
&lt;br /&gt;
| label62    = Awards&lt;br /&gt;
| data62     = {{{awards|}}}&lt;br /&gt;
&lt;br /&gt;
| label63    = {{#if:{{{honours|}}}|Honours|Honors}}&lt;br /&gt;
| data63     = {{#if:{{{honours|}}}|{{{honours}}}|{{{honors|}}}}}&lt;br /&gt;
&lt;br /&gt;
| label64    = Signature&lt;br /&gt;
| data64     = {{#if:{{{signature|}}}|{{#invoke:InfoboxImage|InfoboxImage|image={{{signature|}}}|size={{{signature_size|}}}|sizedefault=150px|alt={{{signature alt|{{{signature_alt|}}}}}}}} }}&lt;br /&gt;
&lt;br /&gt;
| data65     = {{{misc|{{{module|}}}}}}&lt;br /&gt;
| data66     = {{{misc2|{{{module2|}}}}}}&lt;br /&gt;
| data67     = {{{misc3|{{{module3|}}}}}}&lt;br /&gt;
| data68     = {{{misc4|{{{module4|}}}}}}&lt;br /&gt;
| data69     = {{{misc5|{{{module5|}}}}}}&lt;br /&gt;
| data70     = {{{misc6|{{{module6|}}}}}}&lt;br /&gt;
&lt;br /&gt;
| header71   = {{#if:{{{website|{{{homepage|{{{URL|}}}}}}}}}|Website}}&lt;br /&gt;
| data72     = {{{website|{{{homepage|{{{URL|}}}}}}}}}&lt;br /&gt;
&lt;br /&gt;
| below      = {{#if:{{{footnotes|}}}|&#039;&#039;&#039;Notes&#039;&#039;&#039;&amp;lt;div style=&amp;quot;line-height:1.2em;&amp;quot;&amp;gt;{{{footnotes}}}&amp;lt;/div&amp;gt;}}&lt;br /&gt;
| belowstyle = border-top:1px solid #aaaaaa; text-align:left&lt;br /&gt;
&lt;br /&gt;
}}{{main other|&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{1|}}}|{{#ifeq:{{NAMESPACE}}|{{ns:0}}|[[Category:Infobox person using numbered parameter]]}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{box_width|}}}|[[Category:Infobox person using boxwidth parameter]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{death_date|}}}{{{death_place|}}}|{{#if:{{{salary|}}}{{{net worth|{{{net_worth|{{{networth|}}}}}}}}}|[[Category:Infobox person using certain parameters when dead]]}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{influences|}}}{{{influenced|}}}|[[Category:Infobox person using influence]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{pronunciation|}}}|[[Category:Biography template using pronunciation]]}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{signature|}}}|[[Category:Biography with signature]]}}[[Category:Articles with hCards]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!---Please add categories to the &amp;lt;includeonly&amp;gt; section at the bottom of the /doc subpage---&amp;gt;&lt;br /&gt;
{{documentation}} &lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Flatlist/microformat&amp;diff=23847</id>
		<title>Template:Flatlist/microformat</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Flatlist/microformat&amp;diff=23847"/>
		<updated>2014-01-11T02:01:02Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Protected Template:Flatlist/microformat: Highly visible template ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;hlist&amp;quot;&amp;gt;{{{1}}}&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|content=A separate version of the flatlist template for use on the microformat documentation pages.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Infobox&amp;diff=5432</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Infobox&amp;diff=5432"/>
		<updated>2014-01-10T23:01:27Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Undid revision 590143379 by Kaldari (talk); breaks everything&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Infobox|infobox}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box&amp;diff=15633</id>
		<title>Template:Documentation/end box</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box&amp;diff=15633"/>
		<updated>2014-01-07T18:59:02Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Changed protection level of Template:Documentation/end box: Allowing Protected Template editors ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
  Link box below for the doc meta-data:&lt;br /&gt;
--&amp;gt;{{#if: &lt;br /&gt;
  &amp;lt;!--Check if we should show the link box--&amp;gt;&lt;br /&gt;
  {{#ifeq: {{{link box|}}} | off&lt;br /&gt;
  |&lt;br /&gt;
  | {{{doc exist|yes}}}{{&lt;br /&gt;
    #switch: {{SUBJECTSPACE}}&lt;br /&gt;
    | {{ns:User}}&lt;br /&gt;
    | {{ns:Module}}&lt;br /&gt;
    | {{ns:Template}} = yes&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| {{fmbox&lt;br /&gt;
  | id = documentation-meta-data&lt;br /&gt;
  | image = none&lt;br /&gt;
  | style = background-color: #ecfcf4;&lt;br /&gt;
  | textstyle = font-style: italic;&lt;br /&gt;
  | text = &lt;br /&gt;
    {{#if: {{{link box|}}}&lt;br /&gt;
    | {{{link box}}}   &amp;lt;!--Use custom link box content--&amp;gt;&lt;br /&gt;
    | {{#if: {{{doc exist|yes}}}&lt;br /&gt;
      | &amp;lt;!--/doc exists, link to it--&amp;gt;&lt;br /&gt;
        The above [[Wikipedia:Template documentation|documentation]] is [[Wikipedia:Transclusion|transcluded]] from [[{{{docpage|{{FULLPAGENAME}}/doc}}}]]. &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=edit}} edit] &amp;amp;#124; [{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=history}} history])&amp;lt;/small&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
      |&amp;lt;!-- /doc does not exist, ask to create one?&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
         | {{ns:Module}} = You might want to [{{fullurl: {{{docpage| {{FULLPAGENAME}}/doc }}} | action=edit&amp;amp;preload=Template:Documentation/preload-module-doc }} create] a documentation page for this [[Wikipedia:Lua|Scribunto module]]&amp;lt;br&amp;gt;&lt;br /&gt;
         | #default =&lt;br /&gt;
          }}&lt;br /&gt;
      }}&amp;lt;!-- &lt;br /&gt;
        Add links to /sandbox and /testcases when appropriate:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:User}}&lt;br /&gt;
      | {{ns:Module}}&lt;br /&gt;
      | {{ns:Template}} = &lt;br /&gt;
        Editors can experiment in this {{#switch: {{SUBJECTSPACE}} | {{ns:module}} = module&#039;s | #default = template&#039;s}} {{&lt;br /&gt;
        #ifexist: {{{sandbox| {{FULLPAGENAME}}/sandbox }}}&lt;br /&gt;
        | [[{{{sandbox| {{FULLPAGENAME}}/sandbox }}}|sandbox]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit }} edit] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl:Special:ComparePages | page1={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;page2={{urlencode:{{{sandbox|{{FULLPAGENAME}}/sandbox}}}}}}} diff])&amp;lt;/small&amp;gt; &lt;br /&gt;
        | sandbox &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload=Template:Documentation/preload-{{#ifeq: {{SUBJECTSPACE}}|{{ns:Module}}|module-}}sandbox }} create] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;summary={{urlencode:Create sandbox version of [[{{{template page|{{FULLPAGENAME}}}}}]]}} }} mirror])&amp;lt;/small&amp;gt;&lt;br /&gt;
        }} and {{&lt;br /&gt;
        #ifexist: {{{testcases| {{FULLPAGENAME}}/testcases }}}&lt;br /&gt;
        | [[{{{testcases| {{FULLPAGENAME}}/testcases }}}|testcases]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit }} edit])&amp;lt;/small&amp;gt;&lt;br /&gt;
        | testcases &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit&amp;amp;preload=Template:Documentation/preload-{{#ifeq: {{SUBJECTSPACE}}|{{ns:Module}}|module-}}testcases }} create])&amp;lt;/small&amp;gt;&lt;br /&gt;
        }} pages. &amp;lt;br /&amp;gt;&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the cats text, but not &lt;br /&gt;
        if &amp;quot;content&amp;quot; fed or &amp;quot;docname fed&amp;quot; since then it is &lt;br /&gt;
        unclear where to add the cats.&lt;br /&gt;
   --&amp;gt;{{#if: {{{content|}}} {{{docname fed|}}}&lt;br /&gt;
      | &lt;br /&gt;
      | Please add categories to the [[{{{docpage|{{FULLPAGENAME}}/doc}}}|/doc]] subpage.&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the &amp;quot;Subpages&amp;quot; link:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:File}} =   &amp;lt;!--Don&#039;t show it--&amp;gt;&lt;br /&gt;
      | {{ns:Module}} = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this module]].&lt;br /&gt;
      | {{ns:Template}} = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this template]].&lt;br /&gt;
      | #default = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this page]].&lt;br /&gt;
      }}&lt;br /&gt;
    }}{{#ifexist:{{FULLPAGENAME}}/Print&lt;br /&gt;
     |&amp;lt;br /&amp;gt;A [[Help:Books/for experts#Improving the book layout|print version]] of this template exists at [[/Print]]. If you make a change to this template, please update the print version as well.[[Category:Templates with print versions]]&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;!--End link box--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
  Detect and report strange usage:&lt;br /&gt;
--&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!--Check if {{documentation}} is transcluded &lt;br /&gt;
      on a /doc or /testcases page--&amp;gt;&lt;br /&gt;
  {{#switch: {{SUBPAGENAME}}&lt;br /&gt;
  | doc&lt;br /&gt;
  | testcases = strange&lt;br /&gt;
  }}&lt;br /&gt;
  &amp;lt;!--More checks can be added here, just return anything&lt;br /&gt;
      to make the surrounding if-case trigger--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;includeonly&amp;gt;[[Category:Wikipedia pages with strange ((documentation)) usage|{{main other|Main:}}{{FULLPAGENAME}}]]&amp;lt;!-- Sort on namespace --&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Start_date_and_age&amp;diff=23885</id>
		<title>Template:Start date and age</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Start_date_and_age&amp;diff=23885"/>
		<updated>2014-01-04T16:20:46Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Undid revision 589155435 by Rezonansowy (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
     IMPLEMENTATION OF DATE&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if: {{{1|}}}&amp;lt;!--&lt;br /&gt;
  --&amp;gt;|{{#if: {{{2|}}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;|{{#if: {{{3|}}}&amp;lt;!--&lt;br /&gt;
        --&amp;gt;|{{#ifeq:{{yesno|{{{df|no}}}}}|yes&amp;lt;!--&lt;br /&gt;
           --&amp;gt;|{{#expr:{{{3}}}}}&amp;amp;nbsp;{{MONTHNAME|{{{2}}}}}&amp;lt;!--&lt;br /&gt;
           --&amp;gt;|{{MONTHNAME|{{{2}}}}}&amp;amp;nbsp;{{#expr:{{{3}}}}},&amp;lt;!--&lt;br /&gt;
           --&amp;gt;}} {{{1}}}&amp;lt;!--&lt;br /&gt;
        --&amp;gt;|{{MONTHNAME|{{{2}}}}}&amp;amp;nbsp;{{{1}}}&amp;lt;!--&lt;br /&gt;
        --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;|{{{1}}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;&amp;lt;span class=&amp;quot;noprint&amp;quot;&amp;gt;{{#ifeq:{{yesno|{{{paren|{{{p|no}}}}}}}}|yes||&amp;amp;#059;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#ifeq:{{yesno|{{{br|no}}}}}|yes|&amp;lt;br/&amp;gt;|&amp;amp;#032;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#ifeq:{{yesno|{{{paren|{{{p|no}}}}}}}}|yes|(}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if: {{{2|}}}&amp;lt;!--&lt;br /&gt;
       --&amp;gt;|{{#if: {{{3|}}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;|{{time ago|{{{1}}}-{{{2}}}-{{{3}}}|min_magnitude=days}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;|{{years or months ago|{{{1}}}|{{#time:n|1-{{{2}}}-1}}}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
       --&amp;gt;|{{#iferror:{{#expr:{{{1}}}}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;|{{time ago|{{{1}}}|min_magnitude=days}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;|{{years or months ago|{{{1}}}}}&amp;lt;!--&lt;br /&gt;
          --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
       --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#ifeq:{{yesno|{{{paren|{{{p|no}}}}}}}}|yes|)}}&amp;lt;/span&amp;gt;&amp;lt;!--&lt;br /&gt;
  --&amp;gt;|&#039;&#039;&#039;{{color|red|Error: first parameter is missing.}}&#039;&#039;&#039;&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
     IMPLEMENTATION OF microformat date classes&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;span style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;amp;#160;(&amp;lt;span class=&amp;quot;{{#ifeq:{{yesno|{{{end|no}}}}}|yes|dtend|bday dtstart published updated}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if: {{{1|}}}&amp;lt;!--&lt;br /&gt;
  --&amp;gt;|{{{1}}}&amp;lt;!--&lt;br /&gt;
   --&amp;gt;{{#if: {{{2|}}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;| -{{#time:m|1-{{{2}}}-1}}&amp;lt;!--&lt;br /&gt;
       --&amp;gt;{{#if: {{{3|}}}&amp;lt;!--&lt;br /&gt;
         --&amp;gt;| -{{padleft:{{{3}}}|2|0}}&amp;lt;!--&lt;br /&gt;
         --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
  --&amp;gt;}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:High-risk&amp;diff=22917</id>
		<title>Template:High-risk</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:High-risk&amp;diff=22917"/>
		<updated>2014-01-01T08:59:01Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: make this work properly on sandbox pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ombox&lt;br /&gt;
| type = content&lt;br /&gt;
| text = &lt;br /&gt;
&#039;&#039;&#039;This {{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=Lua module&lt;br /&gt;
|#default=template&lt;br /&gt;
}} is used on [[Wikipedia:Database reports/Templates transcluded on the most pages|{{#if:{{{1|}}}|{{{1}}}|a very large number of}} pages]].&#039;&#039;&#039;&amp;lt;br /&amp;gt;To avoid large-scale disruption and unnecessary server load, any changes to this {{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=module&lt;br /&gt;
|#default=template&lt;br /&gt;
}} should first be tested in its [[{{&lt;br /&gt;
#switch: {{SUBPAGENAME}}&lt;br /&gt;
| doc | sandbox = {{SUBJECTSPACE}}:{{BASEPAGENAME}}&lt;br /&gt;
| #default      = {{SUBJECTPAGENAME}}&lt;br /&gt;
}}/sandbox|/sandbox]] or [[{{&lt;br /&gt;
#switch: {{SUBPAGENAME}}&lt;br /&gt;
| doc | sandbox = {{SUBJECTSPACE}}:{{BASEPAGENAME}}&lt;br /&gt;
| #default      = {{SUBJECTPAGENAME}}&lt;br /&gt;
}}/testcases|/testcases]] subpages{{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=.&lt;br /&gt;
|#default=, or in your own [[Wikipedia:Subpages#How to create user subpages|user space]].&lt;br /&gt;
}} The tested changes can then be added to this page in one single edit. Please consider discussing any changes on {{#if:{{{2|}}}|[[{{{2}}}]]|the [[{{&lt;br /&gt;
#switch: {{SUBPAGENAME}}&lt;br /&gt;
| doc | sandbox = {{TALKSPACE}}:{{BASEPAGENAME}}&lt;br /&gt;
| #default      = {{TALKPAGENAME}}&lt;br /&gt;
}}|talk page]]}} before implementing them.&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21865</id>
		<title>MediaWiki:InterwikiMapBackup</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21865"/>
		<updated>2013-12-29T08:07:47Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Robot: add: dramatica; delete: encyclopediadramatica&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Do not edit this page. It will be automatically revised by the maintenance script when the interwiki table is updated.&lt;br /&gt;
--&amp;gt;{{MediaWiki:interwikimap-backup-desc}}&lt;br /&gt;
&lt;br /&gt;
==Current interwiki map==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;plainlinks&amp;quot;&lt;br /&gt;
!Prefix&lt;br /&gt;
!URL&lt;br /&gt;
!Forward&lt;br /&gt;
!Transclude&lt;br /&gt;
!API URL&lt;br /&gt;
!Wiki ID&lt;br /&gt;
|-&lt;br /&gt;
| aa || https://aa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ab || https://ab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| abbenormal || http://johnabbe.wagn.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ace || https://ace.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| acronym || http://www.acronymfinder.com/af-query.asp?String=exact&amp;amp;Acronym=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advisory || https://advisory.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advogato || http://www.advogato.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aew || http://wiki.arabeyes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| af || https://af.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ak || https://ak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| als || https://als.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| am || https://am.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| an || https://an.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ang || https://ang.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| appropedia || http://www.appropedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aquariumwiki || http://www.theaquariumwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ar || https://ar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arborwiki || http://arborwiki.org/city/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arc || https://arc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arxiv || http://arxiv.org/abs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arz || https://arz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| as || https://as.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ast || https://ast.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| atmwiki || http://www.otterstedt.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| av || https://av.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ay || https://ay.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| az || https://az.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| b || https://en.wikibooks.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ba || https://ba.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bar || https://bar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bat-smg || https://bat-smg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| battlestarwiki || http://en.battlestarwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcl || https://bcl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcnbio || http://historiapolitica.bcn.cl/resenas_parlamentarias/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be || https://be.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be-x-old || https://be-x-old.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| beacha || http://www.beachapedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawikiversity || https://beta.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bg || https://bg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bh || https://bh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bi || https://bi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| biblewiki || http://bible.tmtm.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bjn || https://bjn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bluwiki || http://bluwiki.com/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| blw || http://britainloveswikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bm || https://bm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bn || https://bn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bo || https://bo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| botwiki || http://botwiki.sno.cc/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| boxrec || http://www.boxrec.com/media/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bpy || https://bpy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| br || https://br.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| brickwiki || http://www.brickwiki.info/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bs || https://bs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bug || https://bug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bugzilla || https://bugzilla.wikimedia.org/show_bug.cgi?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bulba || http://bulbapedia.bulbagarden.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buzztard || http://buzztard.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bxr || https://bxr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bytesmiths || http://www.Bytesmiths.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2 || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2find || http://c2.com/cgi/wiki?FindPage&amp;amp;value=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ca || https://ca.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cache || https://www.google.com/search?q=cache:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cbk-zam || https://cbk-zam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cdo || https://cdo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ce || https://ce.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ceb || https://ceb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cellwiki || http://cell.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| centralwikia || http://community.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ch || https://ch.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chapter || https://en.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cho || https://cho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| choralwiki || http://www.cpdl.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chr || https://chr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chy || https://chy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| citizendium || http://en.citizendium.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckb || https://ckb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckwiss || http://www.ck-wissen.de/ckwiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| co || https://co.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comixpedia || http://www.comixpedia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| commons || https://commons.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communityscheme || http://community.schemewiki.org/?c=s&amp;amp;key=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communitywiki || http://www.communitywiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comune || http://rete.comuni-italiani.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| corpknowpedia || http://corpknowpedia.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cr || https://cr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crazyhacks || http://www.crazy-hacks.org/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommons || https://creativecommons.org/licenses/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommonswiki || http://wiki.creativecommons.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creatureswiki || http://creatures.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crh || https://crh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cs || https://cs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| csb || https://csb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cu || https://cu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cv || https://cv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cxej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cy || https://cy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cz || https://cz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| d || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| da || https://da.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dbdump || http://download.wikimedia.org/$1/latest/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcc || http://www.dccwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcdatabase || http://dc.wikia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcma || http://christian-morgenstern.de/dcma/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| de || https://de.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dejanews || http://www.deja.com/=dnc/getdoc.xp?AN=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| delicious || https://www.delicious.com/tag/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| devmo || https://developer.mozilla.org/en/docs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dict || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dictionary || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| diq || https://diq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| disinfopedia || http://www.sourcewatch.org/wiki.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreaders || http://www.pgdp.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreadersca || http://www.pgdpcanada.net/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dk || https://dk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmoz || http://www.dmoz.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmozs || http://www.dmoz.org/cgi-bin/search?search=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| docbook || http://wiki.docbook.org/topic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doi || http://dx.doi.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| donate || https://donate.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doom_wiki || http://doom.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| download || http://download.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drae || http://lema.rae.es/drae/?val=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dramatica || https://encyclopediadramatica.es/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dreamhost || http://wiki.dreamhost.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drumcorpswiki || http://www.drumcorpswiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dsb || https://dsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dv || https://dv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dwjwiki || http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dz || https://dz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecoreality || http://www.EcoReality.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecxei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ee || https://ee.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| el || https://el.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| elibre || http://enciclopedia.us.es/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emacswiki || http://www.emacswiki.org/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eml || https://eml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| en || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyc || http://encyc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| energiewiki || http://www.netzwerk-energieberater.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| englyphwiki || http://en.glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eo || https://eo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eokulturcentro || http://esperanto.toulouse.free.fr/nova/wikini/wakka.php?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| epo || https://epo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| es || https://es.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| et || https://et.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| etherpad || https://etherpad.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologue || https://www.ethnologue.com/show_language.asp?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologuefamily || https://www.ethnologue.com/show_family.asp?subid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eu || https://eu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| evowiki || http://wiki.cotch.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| exotica || http://www.exotica.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ext || https://ext.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eĉei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fa || https://fa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fanimutationwiki || http://wiki.animutationportal.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ff || https://ff.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fi || https://fi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalempire || http://final-empire.sourceforge.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalfantasy || http://finalfantasy.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finnix || http://www.finnix.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fiu-vro || https://fiu-vro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fj || https://fj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickrphoto || http://www.flickr.com/photo.gne?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickruser || http://www.flickr.com/people/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| floralwiki || http://www.floralwiki.co.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flyerwiki-de || http://de.flyerwiki.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fo || https://fo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foldoc || http://foldoc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| forthfreak || http://wiki.forthfreak.net/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foundation || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foxwiki || http://fox.wikis.com/wc.dll?Wiki~$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fr || https://fr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebio || http://freebiology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebsdman || http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;amp;query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freeculturewiki || http://wiki.freeculture.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freedomdefined || http://freedomdefined.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freefeel || http://freefeel.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freekiwiki || http://wiki.freegeek.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freenode || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frp || https://frp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frr || https://frr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fur || https://fur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fy || https://fy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ga || https://ga.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gag || https://gag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gan || https://gan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ganfyd || http://ganfyd.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gardenology || http://www.gardenology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gausswiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gd || https://gd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gentoo-wiki || http://gentoo-wiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| genwiki || http://wiki.genealogy.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gerrit || https://gerrit.wikimedia.org/r/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| git || https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/$1;a=log;h=refs/heads/master || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gl || https://gl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glk || https://glk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| globalvoices || http://cyber.law.harvard.edu/dyn/globalvoices/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarwiki || http://glossar.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarywiki || http://glossary.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gn || https://gn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| google || https://www.google.com/search?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googledefine || https://www.google.com/search?q=define:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googlegroups || https://groups.google.com/groups?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| got || https://got.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gotamac || http://www.got-a-mac.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| greatlakeswiki || http://greatlakeswiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gu || https://gu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwarswiki || http://wiki.guildwars.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwiki || http://guildwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenberg || http://www.gutenberg.org/etext/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenbergwiki || http://www.gutenberg.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gv || https://gv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| h2wiki || http://halowiki.net/p/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ha || https://ha.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hackerspaces || http://hackerspaces.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hak || https://hak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hammondwiki || http://www.dairiki.org/HammondWiki/index.php3?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| haw || https://haw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| he || https://he.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| heroeswiki || http://heroeswiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hi || https://hi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hif || https://hif.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ho || https://ho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hr || https://hr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrfwiki || http://fanstuff.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrwiki || http://www.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hsb || https://hsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ht || https://ht.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hu || https://hu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hupwiki || http://wiki.hup.hu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hy || https://hy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hz || https://hz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ia || https://ia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iarchive || https://archive.org/details/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| id || https://id.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ie || https://ie.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ig || https://ig.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ii || https://ii.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ik || https://ik.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ilo || https://ilo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcharacter || http://www.imdb.com/character/ch$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcompany || http://www.imdb.com/company/co$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbname || http://www.imdb.com/name/nm$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbtitle || http://www.imdb.com/title/tt$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| incubator || https://incubator.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infoanarchy || http://www.infoanarchy.org/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosecpedia || http://infosecpedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosphere || http://theinfosphere.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| io || https://io.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| irc || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ircrc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| is || https://is.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iso639-3 || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| issn || http://www.worldcat.org/issn/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| it || https://it.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iu || https://iu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iuridictum || http://iuridictum.pecina.cz/w/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ja || https://ja.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jaglyphwiki || http://glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jameshoward || http://jameshoward.us/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javanet || http://wiki.java.net/bin/view/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javapedia || http://wiki.java.net/bin/view/Javapedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jbo || https://jbo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jefo || http://esperanto-jeunes.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jiniwiki || http://www.cdegroot.com/cgi-bin/jini?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jira || https://jira.toolserver.org/browse/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jp || https://jp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jspwiki || http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jstor || http://www.jstor.org/journals/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jv || https://jv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ka || https://ka.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kaa || https://kaa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kab || https://kab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kamelo || http://kamelopedia.mormo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| karlsruhe || http://ka.stadtwiki.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kbd || https://kbd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kerimwiki || http://wiki.oxus.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kg || https://kg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ki || https://ki.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kinowiki || http://kino.skripov.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kj || https://kj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kk || https://kk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kl || https://kl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| km || https://km.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kmwiki || https://kmwiki.wikispaces.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kn || https://kn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ko || https://ko.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koi || https://koi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kontuwiki || http://kontu.merri.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koslarwiki || http://wiki.koslar.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kpopwiki || http://www.kpopwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kr || https://kr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| krc || https://krc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ks || https://ks.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ksh || https://ksh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ku || https://ku.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kv || https://kv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kw || https://kw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ky || https://ky.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| la || https://la.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| labsconsole || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lad || https://lad.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lb || https://lb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lbe || https://lbe.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lez || https://lez.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lg || https://lg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| li || https://li.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| libreplanet || https://libreplanet.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lij || https://lij.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linguistlist || https://linguistlist.org/forms/langs/LLDescription.cfm?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwiki || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwikide || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| liswiki || http://liswiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| literateprograms || http://en.literateprograms.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| livepedia || http://www.livepedia.gr/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lmo || https://lmo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ln || https://ln.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lo || https://lo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lojban || http://www.lojban.org/tiki/tiki-index.php?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lostpedia || http://lostpedia.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lqwiki || http://wiki.linuxquestions.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lt || https://lt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ltg || https://ltg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lugkr || http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| luxo || https://tools.wmflabs.org/guc/?user=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lv || https://lv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| m || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mail || https://lists.wikimedia.org/mailman/listinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mailarchive || http://lists.wikimedia.org/pipermail/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| map-bms || https://map-bms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mariowiki || http://www.mariowiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| marveldatabase || http://www.marveldatabase.com/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mdf || https://mdf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meatball || http://meatballwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediawikiwiki || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediazilla || https://bugzilla.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| memoryalpha || http://memory-alpha.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meta || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawiki || http://sunir.org/apps/meta.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawikipedia || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mg || https://mg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mh || https://mh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mhr || https://mhr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mi || https://mi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| min || https://min.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mineralienatlas || http://www.mineralienatlas.de/lexikon/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| minnan || https://minnan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mk || https://mk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ml || https://ml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mn || https://mn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mo || https://mo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| moinmoin || http://moinmo.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| monstropedia || http://www.monstropedia.org/?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mosapedia || http://mosapedia.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozcom || http://mozilla.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillawiki || https://wiki.mozilla.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillazinekb || http://kb.mozillazine.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mr || https://mr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mrj || https://mrj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ms || https://ms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mt || https://mt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mus || https://mus.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| musicbrainz || http://musicbrainz.org/doc/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mw || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwl || https://mwl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwod || http://www.merriam-webster.com/cgi-bin/dictionary?book=Dictionary&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwot || http://www.merriam-webster.com/cgi-bin/thesaurus?book=Thesaurus&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| my || https://my.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| myv || https://myv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mzn || https://mzn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| n || https://en.wikinews.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| na || https://na.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nah || https://nah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nan || https://nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nap || https://nap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nara || http://research.archives.gov/description/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nb || https://nb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds || https://nds.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds-nl || https://nds-nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ne || https://ne.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| new || https://new.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ng || https://ng.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nkcells || http://www.nkcells.info/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nl || https://nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nn || https://nn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| no || https://no.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nosmoke || http://no-smok.net/nsmk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nost || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nostalgia || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nov || https://nov.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nrm || https://nrm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nso || https://nso.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nv || https://nv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ny || https://ny.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oc || https://oc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oeis || https://oeis.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oldwikisource || https://wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| olpc || http://wiki.laptop.org/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| om || https://om.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| onelook || http://www.onelook.com/?ls=b&amp;amp;w=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openfacts || http://openfacts.berlios.de/index-en.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openlibrary || http://openlibrary.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openstreetmap || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwetware || http://openwetware.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwiki || http://openwiki.com/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| opera7wiki || http://operawiki.info/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| or || https://or.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| organicdesign || http://www.organicdesign.co.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| orthodoxwiki || http://orthodoxwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| os || https://os.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osi_reference_model || http://wiki.tigma.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osmwiki || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrs || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketID=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrswiki || https://otrs-wiki.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ourmedia || https://www.socialtext.net/ourmedia/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreach || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreachwiki || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pa || https://pa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pag || https://pag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pam || https://pam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| panawiki || http://wiki.alairelibre.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pap || https://pap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| patwiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pcd || https://pcd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pdc || https://pdc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| perlnet || http://perl.net.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| personaltelco || http://www.personaltelco.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pfl || https://pfl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phpwiki || http://phpwiki.sourceforge.net/phpwiki/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phwiki || http://www.pocketheaven.com/ph/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pi || https://pi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pih || https://pih.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pl || https://pl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| planetmath || http://planetmath.org/node/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pmeg || http://www.bertilow.com/pmeg/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pms || https://pms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnb || https://pnb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnt || https://pnt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ps || https://ps.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| psycle || http://psycle.sourceforge.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pt || https://pt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pyrev || https://www.mediawiki.org/wiki/Special:Code/pywikipedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythoninfo || http://www.python.org/cgi-bin/moinmoin/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythonwiki || http://www.pythonwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pywiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| q || https://en.wikiquote.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| qu || https://qu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| quality || https://quality.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rationalwiki || http://rationalwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rcirc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| reuterswiki || http://glossary.reuters.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rev || https://www.mediawiki.org/wiki/Special:Code/MediaWiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| revo || http://purl.org/NET/voko/revo/art/$1.html || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rfc || https://tools.ietf.org/html/rfc$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rheinneckar || http://rhein-neckar-wiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rm || https://rm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rmy || https://rmy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rn || https://rn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ro || https://ro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-rup || https://roa-rup.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-tara || https://roa-tara.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| robowiki || http://robowiki.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rowiki || http://wiki.rennkuckuck.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rt || https://rt.wikimedia.org/Ticket/Display.html?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rtfm || ftp://rtfm.mit.edu/pub/faqs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ru || https://ru.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rue || https://rue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rw || https://rw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s || https://en.wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s23wiki || http://s23.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sa || https://sa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sah || https://sah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sc || https://sc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scholar || http://scholar.google.com/scholar?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| schoolswp || http://schools-wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scn || https://scn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sco || https://sco.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scores || http://imslp.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scoutwiki || http://en.scoutwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scramble || http://www.scramble.nl/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sd || https://sd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| se || https://se.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seapig || http://www.seapig.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewiki || http://seattlewiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewireless || http://seattlewireless.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| securewikidc || https://secure.wikidc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| semantic-mw || https://www.semantic-mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| senseislibrary || http://senseis.xmp.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sep11 || https://sep11.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sg || https://sg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sh || https://sh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharemap || http://sharemap.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| si || https://si.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| silcode || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| simple || https://simple.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sk || https://sk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sl || https://sl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slashdot || http://slashdot.org/article.pl?sid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slwiki || http://wiki.secondlife.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sm || https://sm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| smikipedia || http://www.smiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sn || https://sn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| so || https://so.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sourceforge || http://sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| spcom || https://spcom.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| species || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sq || https://sq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| squeak || http://wiki.squeak.org/squeak/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sr || https://sr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| srn || https://srn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ss || https://ss.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| st || https://st.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stats || http://stats.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stewardry || https://toolserver.org/~pathoschild/stewardry/?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stq || https://stq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategy || https://strategy.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategywiki || http://strategywiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| su || https://su.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sulutil || https://toolserver.org/~quentinv57/sulinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sv || https://sv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svgwiki || http://wiki.svg.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svn || https://svn.wikimedia.org/viewvc/mediawiki/$1?view=log || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sw || https://sw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swinbrain || http://mercury.it.swin.edu.au/swinbrain/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swingwiki || http://www.swingwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swtrain || http://train.spottingworld.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| szl || https://szl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ta || https://ta.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tabwiki || http://www.tabwiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tavi || http://tavi.sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tclerswiki || http://wiki.tcl.tk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| te || https://te.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| technorati || http://www.technorati.com/search/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tenwiki || https://ten.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tesoltaiwan || http://www.tesol-taiwan.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| test2wiki || https://test2.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwiki || https://test.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwikidata || https://test.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tet || https://tet.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tg || https://tg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| th || https://th.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thelemapedia || http://www.thelemapedia.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| theopedia || http://www.theopedia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thinkwiki || http://www.thinkwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ti || https://ti.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tibiawiki || http://tibia.erig.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ticket || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketNumber=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tk || https://tk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tl || https://tl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmbw || http://tmbw.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmnet || http://www.technomanifestos.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmwiki || http://www.EasyTopicMaps.com/?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tn || https://tn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| to || https://to.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| toollabs || https://tools.wmflabs.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tools || https://toolserver.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tpi || https://tpi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tr || https://tr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| translatewiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ts || https://ts.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tswiki || https://wiki.toolserver.org/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tt || https://tt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tum || https://tum.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tviv || http://tviv.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tvtropes || http://www.tvtropes.org/pmwiki/pmwiki.php/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tw || https://tw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| twiki || http://twiki.org/cgi-bin/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ty || https://ty.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyv || https://tyv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyvawiki || http://www.tyvawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| udm || https://udm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ug || https://ug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uk || https://uk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unihan || http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unreal || http://wiki.beyondunreal.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ur || https://ur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| urbandict || http://www.urbandictionary.com/define.php?term=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usability || https://usability.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usej || http://www.tejo.org/usej/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usemod || http://www.usemod.com/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uz || https://uz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| v || https://en.wikiversity.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ve || https://ve.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vec || https://vec.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vep || https://vep.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vi || https://vi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viaf || http://viaf.org/viaf/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vinismo || http://vinismo.com/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vkol || http://kol.coldfront.net/thekolwiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vlos || http://www.thuvienkhoahoc.com/tusach/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vls || https://vls.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vo || https://vo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voipinfo || http://www.voip-info.org/wiki/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voy || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| w || https://en.wikipedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wa || https://wa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| war || https://war.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| webisodes || http://www.webisodes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| werelate || http://www.werelate.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wg || http://wg.en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikia || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiapiary || http://wikiapiary.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiasite || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikibooks || https://en.wikibooks.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichat || http://www.wikichat.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichristian || http://www.wikichristian.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicities || http://www.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicity || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikidata || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikif1 || http://www.wikif1.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikifur || http://en.wikifur.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikihow || http://www.wikihow.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiindex || http://wikiindex.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilemon || http://wiki.illemonati.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilivres || http://wikilivres.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimac-de || http://apfelwiki.de/wiki/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimedia || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinews || https://en.wikinews.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinfo || http://www.wikinfo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinvest || http://www.wikinvest.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiotics || https://wikiotics.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipaltz || http://www.wikipaltz.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipedia || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipediawikipedia || https://en.wikipedia.org/wiki/Wikipedia:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiquote || https://en.wikiquote.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikischool || http://www.wikischool.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiskripta || http://www.wikiskripta.eu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisophia || http://wikisophia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisource || https://en.wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispecies || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispot || http://wikispot.org/?action=gotowikipage&amp;amp;v=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitech || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiti || http://wikiti.denglend.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitree || http://wikitree.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiversity || https://en.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikivoyage || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiweet || http://wikiweet.nl/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiwikiweb || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikt || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiktionary || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wipipedia || http://www.londonfetishscene.com/wipi/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wlug || http://www.wlug.org.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2005 || https://wikimania2005.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2006 || https://wikimania2006.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2007 || https://wikimania2007.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2008 || https://wikimania2008.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2009 || https://wikimania2009.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2010 || https://wikimania2010.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2011 || https://wikimania2011.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2012 || https://wikimania2012.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2013 || https://wikimania2013.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2014 || https://wikimania2014.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmania || https://wikimania.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmar || http://www.wikimedia.org.ar/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmau || http://wikimedia.org.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbd || https://bd.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbe || https://be.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbr || https://br.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmca || http://wikimedia.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmch || http://www.wikimedia.ch/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcl || http://www.wikimediachile.cl/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmco || https://co.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcz || https://meta.wikimedia.org/wiki/Wikimedia_Czech_Republic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdc || http://wikimediadc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmde || https://wikimedia.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdeblog || https://blog.wikimedia.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdk || https://dk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmee || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmes || http://www.wikimedia.org.es/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmet || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmf || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfblog || https://blog.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfi || https://fi.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfr || http://wikimedia.fr/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhk || http://wikimedia.hk/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhu || http://wikimedia.hu/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmid || http://www.wikimedia.or.id/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmil || http://www.wikimedia.org.il/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmin || http://wiki.wikimedia.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmit || http://wiki.wikimedia.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmke || http://wikimedia.or.ke/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmk || https://mk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmx || https://mx.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnl || https://nl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmno || https://no.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnyc || https://nyc.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpa-us || https://pa-us.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmph || http://wikimedia.org.ph/wmph/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpl || https://pl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpt || http://wikimedia.pt/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmrs || https://rs.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmru || https://ru.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmse || https://se.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmsk || http://wikimedia.sk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmteam || https://wikimaniateam.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtr || https://tr.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtw || http://wikimedia.tw/wiki/index.php5/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmua || https://ua.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmuk || https://wiki.wikimedia.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmve || http://wikimedia.org.ve/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmza || http://wikimedia.org.za/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wo || https://wo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wookieepedia || http://starwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wowwiki || http://www.wowwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wqy || http://wqy.sourceforge.net/cgi-bin/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wurmpedia || http://wurmpedia.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wuu || https://wuu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xal || https://xal.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xh || https://xh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xmf || https://xmf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yi || https://yi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yo || https://yo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| za || https://za.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zea || https://zea.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cfr || https://zh-cfr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-classical || https://zh-classical.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cn || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-min-nan || https://zh-min-nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-tw || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-yue || https://zh-yue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zrhwiki || http://www.zrhwiki.ch/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zu || https://zu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zum || http://wiki.zum.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zwiki || http://www.zwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zzz_wiki || http://wiki.zzz.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ĉej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21864</id>
		<title>MediaWiki:InterwikiMapBackup</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21864"/>
		<updated>2013-12-28T22:33:43Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Robot: add: rationalwiki, encyclopediadramatica, wikiapiary; modify: b, m, meta, n, oldwikisource, q, s, v, w&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Do not edit this page. It will be automatically revised by the maintenance script when the interwiki table is updated.&lt;br /&gt;
--&amp;gt;{{MediaWiki:interwikimap-backup-desc}}&lt;br /&gt;
&lt;br /&gt;
==Current interwiki map==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;plainlinks&amp;quot;&lt;br /&gt;
!Prefix&lt;br /&gt;
!URL&lt;br /&gt;
!Forward&lt;br /&gt;
!Transclude&lt;br /&gt;
!API URL&lt;br /&gt;
!Wiki ID&lt;br /&gt;
|-&lt;br /&gt;
| aa || https://aa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ab || https://ab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| abbenormal || http://johnabbe.wagn.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ace || https://ace.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| acronym || http://www.acronymfinder.com/af-query.asp?String=exact&amp;amp;Acronym=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advisory || https://advisory.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advogato || http://www.advogato.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aew || http://wiki.arabeyes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| af || https://af.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ak || https://ak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| als || https://als.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| am || https://am.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| an || https://an.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ang || https://ang.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| appropedia || http://www.appropedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aquariumwiki || http://www.theaquariumwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ar || https://ar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arborwiki || http://arborwiki.org/city/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arc || https://arc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arxiv || http://arxiv.org/abs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arz || https://arz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| as || https://as.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ast || https://ast.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| atmwiki || http://www.otterstedt.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| av || https://av.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ay || https://ay.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| az || https://az.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| b || https://en.wikibooks.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ba || https://ba.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bar || https://bar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bat-smg || https://bat-smg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| battlestarwiki || http://en.battlestarwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcl || https://bcl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcnbio || http://historiapolitica.bcn.cl/resenas_parlamentarias/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be || https://be.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be-x-old || https://be-x-old.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| beacha || http://www.beachapedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawikiversity || https://beta.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bg || https://bg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bh || https://bh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bi || https://bi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| biblewiki || http://bible.tmtm.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bjn || https://bjn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bluwiki || http://bluwiki.com/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| blw || http://britainloveswikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bm || https://bm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bn || https://bn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bo || https://bo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| botwiki || http://botwiki.sno.cc/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| boxrec || http://www.boxrec.com/media/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bpy || https://bpy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| br || https://br.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| brickwiki || http://www.brickwiki.info/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bs || https://bs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bug || https://bug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bugzilla || https://bugzilla.wikimedia.org/show_bug.cgi?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bulba || http://bulbapedia.bulbagarden.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buzztard || http://buzztard.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bxr || https://bxr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bytesmiths || http://www.Bytesmiths.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2 || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2find || http://c2.com/cgi/wiki?FindPage&amp;amp;value=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ca || https://ca.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cache || https://www.google.com/search?q=cache:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cbk-zam || https://cbk-zam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cdo || https://cdo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ce || https://ce.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ceb || https://ceb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cellwiki || http://cell.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| centralwikia || http://community.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ch || https://ch.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chapter || https://en.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cho || https://cho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| choralwiki || http://www.cpdl.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chr || https://chr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chy || https://chy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| citizendium || http://en.citizendium.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckb || https://ckb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckwiss || http://www.ck-wissen.de/ckwiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| co || https://co.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comixpedia || http://www.comixpedia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| commons || https://commons.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communityscheme || http://community.schemewiki.org/?c=s&amp;amp;key=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communitywiki || http://www.communitywiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comune || http://rete.comuni-italiani.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| corpknowpedia || http://corpknowpedia.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cr || https://cr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crazyhacks || http://www.crazy-hacks.org/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommons || https://creativecommons.org/licenses/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommonswiki || http://wiki.creativecommons.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creatureswiki || http://creatures.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crh || https://crh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cs || https://cs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| csb || https://csb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cu || https://cu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cv || https://cv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cxej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cy || https://cy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cz || https://cz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| d || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| da || https://da.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dbdump || http://download.wikimedia.org/$1/latest/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcc || http://www.dccwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcdatabase || http://dc.wikia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcma || http://christian-morgenstern.de/dcma/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| de || https://de.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dejanews || http://www.deja.com/=dnc/getdoc.xp?AN=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| delicious || https://www.delicious.com/tag/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| devmo || https://developer.mozilla.org/en/docs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dict || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dictionary || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| diq || https://diq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| disinfopedia || http://www.sourcewatch.org/wiki.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreaders || http://www.pgdp.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreadersca || http://www.pgdpcanada.net/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dk || https://dk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmoz || http://www.dmoz.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmozs || http://www.dmoz.org/cgi-bin/search?search=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| docbook || http://wiki.docbook.org/topic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doi || http://dx.doi.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| donate || https://donate.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doom_wiki || http://doom.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| download || http://download.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drae || http://lema.rae.es/drae/?val=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dreamhost || http://wiki.dreamhost.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drumcorpswiki || http://www.drumcorpswiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dsb || https://dsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dv || https://dv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dwjwiki || http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dz || https://dz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecoreality || http://www.EcoReality.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecxei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ee || https://ee.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| el || https://el.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| elibre || http://enciclopedia.us.es/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emacswiki || http://www.emacswiki.org/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eml || https://eml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| en || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyc || http://encyc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyclopediadramatica || https://encyclopediadramatica.es/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| energiewiki || http://www.netzwerk-energieberater.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| englyphwiki || http://en.glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eo || https://eo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eokulturcentro || http://esperanto.toulouse.free.fr/nova/wikini/wakka.php?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| epo || https://epo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| es || https://es.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| et || https://et.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| etherpad || https://etherpad.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologue || https://www.ethnologue.com/show_language.asp?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologuefamily || https://www.ethnologue.com/show_family.asp?subid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eu || https://eu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| evowiki || http://wiki.cotch.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| exotica || http://www.exotica.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ext || https://ext.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eĉei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fa || https://fa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fanimutationwiki || http://wiki.animutationportal.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ff || https://ff.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fi || https://fi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalempire || http://final-empire.sourceforge.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalfantasy || http://finalfantasy.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finnix || http://www.finnix.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fiu-vro || https://fiu-vro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fj || https://fj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickrphoto || http://www.flickr.com/photo.gne?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickruser || http://www.flickr.com/people/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| floralwiki || http://www.floralwiki.co.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flyerwiki-de || http://de.flyerwiki.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fo || https://fo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foldoc || http://foldoc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| forthfreak || http://wiki.forthfreak.net/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foundation || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foxwiki || http://fox.wikis.com/wc.dll?Wiki~$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fr || https://fr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebio || http://freebiology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebsdman || http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;amp;query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freeculturewiki || http://wiki.freeculture.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freedomdefined || http://freedomdefined.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freefeel || http://freefeel.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freekiwiki || http://wiki.freegeek.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freenode || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frp || https://frp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frr || https://frr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fur || https://fur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fy || https://fy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ga || https://ga.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gag || https://gag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gan || https://gan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ganfyd || http://ganfyd.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gardenology || http://www.gardenology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gausswiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gd || https://gd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gentoo-wiki || http://gentoo-wiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| genwiki || http://wiki.genealogy.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gerrit || https://gerrit.wikimedia.org/r/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| git || https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/$1;a=log;h=refs/heads/master || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gl || https://gl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glk || https://glk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| globalvoices || http://cyber.law.harvard.edu/dyn/globalvoices/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarwiki || http://glossar.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarywiki || http://glossary.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gn || https://gn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| google || https://www.google.com/search?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googledefine || https://www.google.com/search?q=define:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googlegroups || https://groups.google.com/groups?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| got || https://got.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gotamac || http://www.got-a-mac.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| greatlakeswiki || http://greatlakeswiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gu || https://gu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwarswiki || http://wiki.guildwars.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwiki || http://guildwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenberg || http://www.gutenberg.org/etext/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenbergwiki || http://www.gutenberg.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gv || https://gv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| h2wiki || http://halowiki.net/p/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ha || https://ha.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hackerspaces || http://hackerspaces.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hak || https://hak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hammondwiki || http://www.dairiki.org/HammondWiki/index.php3?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| haw || https://haw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| he || https://he.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| heroeswiki || http://heroeswiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hi || https://hi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hif || https://hif.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ho || https://ho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hr || https://hr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrfwiki || http://fanstuff.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrwiki || http://www.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hsb || https://hsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ht || https://ht.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hu || https://hu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hupwiki || http://wiki.hup.hu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hy || https://hy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hz || https://hz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ia || https://ia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iarchive || https://archive.org/details/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| id || https://id.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ie || https://ie.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ig || https://ig.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ii || https://ii.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ik || https://ik.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ilo || https://ilo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcharacter || http://www.imdb.com/character/ch$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcompany || http://www.imdb.com/company/co$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbname || http://www.imdb.com/name/nm$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbtitle || http://www.imdb.com/title/tt$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| incubator || https://incubator.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infoanarchy || http://www.infoanarchy.org/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosecpedia || http://infosecpedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosphere || http://theinfosphere.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| io || https://io.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| irc || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ircrc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| is || https://is.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iso639-3 || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| issn || http://www.worldcat.org/issn/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| it || https://it.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iu || https://iu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iuridictum || http://iuridictum.pecina.cz/w/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ja || https://ja.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jaglyphwiki || http://glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jameshoward || http://jameshoward.us/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javanet || http://wiki.java.net/bin/view/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javapedia || http://wiki.java.net/bin/view/Javapedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jbo || https://jbo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jefo || http://esperanto-jeunes.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jiniwiki || http://www.cdegroot.com/cgi-bin/jini?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jira || https://jira.toolserver.org/browse/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jp || https://jp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jspwiki || http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jstor || http://www.jstor.org/journals/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jv || https://jv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ka || https://ka.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kaa || https://kaa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kab || https://kab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kamelo || http://kamelopedia.mormo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| karlsruhe || http://ka.stadtwiki.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kbd || https://kbd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kerimwiki || http://wiki.oxus.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kg || https://kg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ki || https://ki.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kinowiki || http://kino.skripov.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kj || https://kj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kk || https://kk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kl || https://kl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| km || https://km.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kmwiki || https://kmwiki.wikispaces.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kn || https://kn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ko || https://ko.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koi || https://koi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kontuwiki || http://kontu.merri.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koslarwiki || http://wiki.koslar.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kpopwiki || http://www.kpopwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kr || https://kr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| krc || https://krc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ks || https://ks.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ksh || https://ksh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ku || https://ku.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kv || https://kv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kw || https://kw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ky || https://ky.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| la || https://la.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| labsconsole || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lad || https://lad.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lb || https://lb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lbe || https://lbe.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lez || https://lez.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lg || https://lg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| li || https://li.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| libreplanet || https://libreplanet.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lij || https://lij.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linguistlist || https://linguistlist.org/forms/langs/LLDescription.cfm?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwiki || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwikide || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| liswiki || http://liswiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| literateprograms || http://en.literateprograms.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| livepedia || http://www.livepedia.gr/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lmo || https://lmo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ln || https://ln.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lo || https://lo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lojban || http://www.lojban.org/tiki/tiki-index.php?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lostpedia || http://lostpedia.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lqwiki || http://wiki.linuxquestions.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lt || https://lt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ltg || https://ltg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lugkr || http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| luxo || https://tools.wmflabs.org/guc/?user=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lv || https://lv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| m || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mail || https://lists.wikimedia.org/mailman/listinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mailarchive || http://lists.wikimedia.org/pipermail/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| map-bms || https://map-bms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mariowiki || http://www.mariowiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| marveldatabase || http://www.marveldatabase.com/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mdf || https://mdf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meatball || http://meatballwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediawikiwiki || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediazilla || https://bugzilla.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| memoryalpha || http://memory-alpha.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meta || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawiki || http://sunir.org/apps/meta.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawikipedia || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mg || https://mg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mh || https://mh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mhr || https://mhr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mi || https://mi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| min || https://min.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mineralienatlas || http://www.mineralienatlas.de/lexikon/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| minnan || https://minnan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mk || https://mk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ml || https://ml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mn || https://mn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mo || https://mo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| moinmoin || http://moinmo.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| monstropedia || http://www.monstropedia.org/?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mosapedia || http://mosapedia.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozcom || http://mozilla.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillawiki || https://wiki.mozilla.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillazinekb || http://kb.mozillazine.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mr || https://mr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mrj || https://mrj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ms || https://ms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mt || https://mt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mus || https://mus.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| musicbrainz || http://musicbrainz.org/doc/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mw || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwl || https://mwl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwod || http://www.merriam-webster.com/cgi-bin/dictionary?book=Dictionary&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwot || http://www.merriam-webster.com/cgi-bin/thesaurus?book=Thesaurus&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| my || https://my.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| myv || https://myv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mzn || https://mzn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| n || https://en.wikinews.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| na || https://na.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nah || https://nah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nan || https://nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nap || https://nap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nara || http://research.archives.gov/description/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nb || https://nb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds || https://nds.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds-nl || https://nds-nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ne || https://ne.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| new || https://new.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ng || https://ng.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nkcells || http://www.nkcells.info/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nl || https://nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nn || https://nn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| no || https://no.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nosmoke || http://no-smok.net/nsmk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nost || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nostalgia || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nov || https://nov.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nrm || https://nrm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nso || https://nso.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nv || https://nv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ny || https://ny.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oc || https://oc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oeis || https://oeis.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oldwikisource || https://wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| olpc || http://wiki.laptop.org/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| om || https://om.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| onelook || http://www.onelook.com/?ls=b&amp;amp;w=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openfacts || http://openfacts.berlios.de/index-en.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openlibrary || http://openlibrary.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openstreetmap || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwetware || http://openwetware.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwiki || http://openwiki.com/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| opera7wiki || http://operawiki.info/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| or || https://or.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| organicdesign || http://www.organicdesign.co.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| orthodoxwiki || http://orthodoxwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| os || https://os.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osi_reference_model || http://wiki.tigma.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osmwiki || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrs || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketID=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrswiki || https://otrs-wiki.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ourmedia || https://www.socialtext.net/ourmedia/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreach || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreachwiki || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pa || https://pa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pag || https://pag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pam || https://pam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| panawiki || http://wiki.alairelibre.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pap || https://pap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| patwiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pcd || https://pcd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pdc || https://pdc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| perlnet || http://perl.net.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| personaltelco || http://www.personaltelco.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pfl || https://pfl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phpwiki || http://phpwiki.sourceforge.net/phpwiki/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phwiki || http://www.pocketheaven.com/ph/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pi || https://pi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pih || https://pih.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pl || https://pl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| planetmath || http://planetmath.org/node/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pmeg || http://www.bertilow.com/pmeg/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pms || https://pms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnb || https://pnb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnt || https://pnt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ps || https://ps.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| psycle || http://psycle.sourceforge.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pt || https://pt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pyrev || https://www.mediawiki.org/wiki/Special:Code/pywikipedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythoninfo || http://www.python.org/cgi-bin/moinmoin/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythonwiki || http://www.pythonwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pywiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| q || https://en.wikiquote.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| qu || https://qu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| quality || https://quality.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rationalwiki || http://rationalwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rcirc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| reuterswiki || http://glossary.reuters.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rev || https://www.mediawiki.org/wiki/Special:Code/MediaWiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| revo || http://purl.org/NET/voko/revo/art/$1.html || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rfc || https://tools.ietf.org/html/rfc$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rheinneckar || http://rhein-neckar-wiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rm || https://rm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rmy || https://rmy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rn || https://rn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ro || https://ro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-rup || https://roa-rup.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-tara || https://roa-tara.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| robowiki || http://robowiki.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rowiki || http://wiki.rennkuckuck.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rt || https://rt.wikimedia.org/Ticket/Display.html?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rtfm || ftp://rtfm.mit.edu/pub/faqs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ru || https://ru.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rue || https://rue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rw || https://rw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s || https://en.wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s23wiki || http://s23.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sa || https://sa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sah || https://sah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sc || https://sc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scholar || http://scholar.google.com/scholar?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| schoolswp || http://schools-wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scn || https://scn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sco || https://sco.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scores || http://imslp.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scoutwiki || http://en.scoutwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scramble || http://www.scramble.nl/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sd || https://sd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| se || https://se.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seapig || http://www.seapig.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewiki || http://seattlewiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewireless || http://seattlewireless.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| securewikidc || https://secure.wikidc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| semantic-mw || https://www.semantic-mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| senseislibrary || http://senseis.xmp.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sep11 || https://sep11.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sg || https://sg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sh || https://sh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharemap || http://sharemap.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| si || https://si.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| silcode || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| simple || https://simple.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sk || https://sk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sl || https://sl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slashdot || http://slashdot.org/article.pl?sid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slwiki || http://wiki.secondlife.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sm || https://sm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| smikipedia || http://www.smiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sn || https://sn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| so || https://so.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sourceforge || http://sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| spcom || https://spcom.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| species || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sq || https://sq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| squeak || http://wiki.squeak.org/squeak/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sr || https://sr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| srn || https://srn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ss || https://ss.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| st || https://st.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stats || http://stats.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stewardry || https://toolserver.org/~pathoschild/stewardry/?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stq || https://stq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategy || https://strategy.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategywiki || http://strategywiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| su || https://su.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sulutil || https://toolserver.org/~quentinv57/sulinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sv || https://sv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svgwiki || http://wiki.svg.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svn || https://svn.wikimedia.org/viewvc/mediawiki/$1?view=log || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sw || https://sw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swinbrain || http://mercury.it.swin.edu.au/swinbrain/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swingwiki || http://www.swingwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swtrain || http://train.spottingworld.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| szl || https://szl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ta || https://ta.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tabwiki || http://www.tabwiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tavi || http://tavi.sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tclerswiki || http://wiki.tcl.tk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| te || https://te.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| technorati || http://www.technorati.com/search/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tenwiki || https://ten.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tesoltaiwan || http://www.tesol-taiwan.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| test2wiki || https://test2.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwiki || https://test.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwikidata || https://test.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tet || https://tet.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tg || https://tg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| th || https://th.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thelemapedia || http://www.thelemapedia.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| theopedia || http://www.theopedia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thinkwiki || http://www.thinkwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ti || https://ti.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tibiawiki || http://tibia.erig.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ticket || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketNumber=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tk || https://tk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tl || https://tl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmbw || http://tmbw.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmnet || http://www.technomanifestos.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmwiki || http://www.EasyTopicMaps.com/?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tn || https://tn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| to || https://to.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| toollabs || https://tools.wmflabs.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tools || https://toolserver.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tpi || https://tpi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tr || https://tr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| translatewiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ts || https://ts.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tswiki || https://wiki.toolserver.org/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tt || https://tt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tum || https://tum.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tviv || http://tviv.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tvtropes || http://www.tvtropes.org/pmwiki/pmwiki.php/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tw || https://tw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| twiki || http://twiki.org/cgi-bin/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ty || https://ty.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyv || https://tyv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyvawiki || http://www.tyvawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| udm || https://udm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ug || https://ug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uk || https://uk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unihan || http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unreal || http://wiki.beyondunreal.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ur || https://ur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| urbandict || http://www.urbandictionary.com/define.php?term=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usability || https://usability.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usej || http://www.tejo.org/usej/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usemod || http://www.usemod.com/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uz || https://uz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| v || https://en.wikiversity.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ve || https://ve.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vec || https://vec.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vep || https://vep.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vi || https://vi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viaf || http://viaf.org/viaf/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vinismo || http://vinismo.com/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vkol || http://kol.coldfront.net/thekolwiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vlos || http://www.thuvienkhoahoc.com/tusach/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vls || https://vls.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vo || https://vo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voipinfo || http://www.voip-info.org/wiki/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voy || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| w || https://en.wikipedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wa || https://wa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| war || https://war.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| webisodes || http://www.webisodes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| werelate || http://www.werelate.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wg || http://wg.en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikia || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiapiary || http://wikiapiary.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiasite || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikibooks || https://en.wikibooks.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichat || http://www.wikichat.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichristian || http://www.wikichristian.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicities || http://www.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicity || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikidata || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikif1 || http://www.wikif1.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikifur || http://en.wikifur.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikihow || http://www.wikihow.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiindex || http://wikiindex.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilemon || http://wiki.illemonati.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilivres || http://wikilivres.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimac-de || http://apfelwiki.de/wiki/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimedia || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinews || https://en.wikinews.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinfo || http://www.wikinfo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinvest || http://www.wikinvest.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiotics || https://wikiotics.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipaltz || http://www.wikipaltz.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipedia || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipediawikipedia || https://en.wikipedia.org/wiki/Wikipedia:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiquote || https://en.wikiquote.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikischool || http://www.wikischool.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiskripta || http://www.wikiskripta.eu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisophia || http://wikisophia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisource || https://en.wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispecies || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispot || http://wikispot.org/?action=gotowikipage&amp;amp;v=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitech || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiti || http://wikiti.denglend.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitree || http://wikitree.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiversity || https://en.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikivoyage || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiweet || http://wikiweet.nl/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiwikiweb || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikt || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiktionary || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wipipedia || http://www.londonfetishscene.com/wipi/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wlug || http://www.wlug.org.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2005 || https://wikimania2005.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2006 || https://wikimania2006.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2007 || https://wikimania2007.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2008 || https://wikimania2008.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2009 || https://wikimania2009.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2010 || https://wikimania2010.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2011 || https://wikimania2011.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2012 || https://wikimania2012.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2013 || https://wikimania2013.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2014 || https://wikimania2014.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmania || https://wikimania.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmar || http://www.wikimedia.org.ar/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmau || http://wikimedia.org.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbd || https://bd.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbe || https://be.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbr || https://br.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmca || http://wikimedia.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmch || http://www.wikimedia.ch/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcl || http://www.wikimediachile.cl/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmco || https://co.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcz || https://meta.wikimedia.org/wiki/Wikimedia_Czech_Republic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdc || http://wikimediadc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmde || https://wikimedia.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdeblog || https://blog.wikimedia.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdk || https://dk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmee || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmes || http://www.wikimedia.org.es/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmet || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmf || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfblog || https://blog.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfi || https://fi.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfr || http://wikimedia.fr/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhk || http://wikimedia.hk/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhu || http://wikimedia.hu/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmid || http://www.wikimedia.or.id/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmil || http://www.wikimedia.org.il/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmin || http://wiki.wikimedia.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmit || http://wiki.wikimedia.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmke || http://wikimedia.or.ke/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmk || https://mk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmx || https://mx.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnl || https://nl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmno || https://no.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnyc || https://nyc.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpa-us || https://pa-us.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmph || http://wikimedia.org.ph/wmph/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpl || https://pl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpt || http://wikimedia.pt/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmrs || https://rs.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmru || https://ru.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmse || https://se.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmsk || http://wikimedia.sk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmteam || https://wikimaniateam.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtr || https://tr.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtw || http://wikimedia.tw/wiki/index.php5/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmua || https://ua.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmuk || https://wiki.wikimedia.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmve || http://wikimedia.org.ve/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmza || http://wikimedia.org.za/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wo || https://wo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wookieepedia || http://starwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wowwiki || http://www.wowwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wqy || http://wqy.sourceforge.net/cgi-bin/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wurmpedia || http://wurmpedia.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wuu || https://wuu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xal || https://xal.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xh || https://xh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xmf || https://xmf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yi || https://yi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yo || https://yo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| za || https://za.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zea || https://zea.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cfr || https://zh-cfr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-classical || https://zh-classical.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cn || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-min-nan || https://zh-min-nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-tw || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-yue || https://zh-yue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zrhwiki || http://www.zrhwiki.ch/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zu || https://zu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zum || http://wiki.zum.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zwiki || http://www.zwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zzz_wiki || http://wiki.zzz.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ĉej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Infobox_person/doc&amp;diff=23849</id>
		<title>Template:Infobox person/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Infobox_person/doc&amp;diff=23849"/>
		<updated>2013-12-28T22:23:50Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: s&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{for|an infobox for fictional characters|Template:Infobox character}}&lt;br /&gt;
{{documentation subpage}}&lt;br /&gt;
{{Person infobox header}}&lt;br /&gt;
{{high-risk|130,000+}}&lt;br /&gt;
&amp;lt;!-- EDIT TEMPLATE DOCUMENTATION BELOW THIS LINE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tl|Infobox person}} may be used to summarize information about a particular person, usually at the top of an article. &lt;br /&gt;
&lt;br /&gt;
== Redirects and calls ==&lt;br /&gt;
At least {{PAGESINCATEGORY:Templates calling Infobox person}} other [[:Category:Templates calling Infobox person|templates call this one]] and [{{fullurl:index.php|title=Special:WhatLinksHere/Template:Infobox_person&amp;amp;namespace=10&amp;amp;hidetrans=1&amp;amp;hidelinks=1}} many templates redirect here].&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
The infobox may be added by pasting the template as shown below into an article and then filling in the desired fields. Any parameters left blank or omitted will not be displayed.&lt;br /&gt;
&lt;br /&gt;
=== Blank template with basic parameters ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox person&lt;br /&gt;
| name        = &amp;lt;!-- include middle initial, if not specified in birth_name --&amp;gt;&lt;br /&gt;
| image       = &amp;lt;!-- just the filename, without the File: or Image: prefix or enclosing [[brackets]] --&amp;gt;&lt;br /&gt;
| alt         = &lt;br /&gt;
| caption     = &lt;br /&gt;
| birth_name  = &lt;br /&gt;
| birth_date  = &amp;lt;!-- {{Birth date and age|YYYY|MM|DD}} or {{Birth-date and age|Month DD, YYYY}} --&amp;gt;&lt;br /&gt;
| birth_place = &lt;br /&gt;
| death_date  = &amp;lt;!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} or {{Death-date and age|Month DD, YYYY|Month DD, YYYY}} (death date then birth date) --&amp;gt;&lt;br /&gt;
| death_place = &lt;br /&gt;
| nationality = &lt;br /&gt;
| other_names = &lt;br /&gt;
| occupation  = &lt;br /&gt;
| known_for   = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blank template with all parameters ===&lt;br /&gt;
{{Infobox person&lt;br /&gt;
| honorific_prefix          = &#039;&#039;honorific_prefix&#039;&#039;&lt;br /&gt;
| name                      = &#039;&#039;name&#039;&#039;&lt;br /&gt;
| honorific_suffix          = &#039;&#039;honorific_suffix&#039;&#039;&lt;br /&gt;
| native_name               = &#039;&#039;native_name&#039;&#039;&lt;br /&gt;
| native_name_lang          = &#039;&#039;native_name_lang&#039;&#039;&lt;br /&gt;
| image                     = Example.jpg&lt;br /&gt;
| image_size                = &lt;br /&gt;
| alt                       = &lt;br /&gt;
| caption                   = &#039;&#039;caption&#039;&#039;&lt;br /&gt;
| birth_name                = &#039;&#039;birth_name&#039;&#039;&lt;br /&gt;
| birth_date                = &#039;&#039;birth_date&#039;&#039;&lt;br /&gt;
| baptism_date              = &#039;&#039;baptism_date&#039;&#039;&lt;br /&gt;
| birth_place               = &#039;&#039;birth_place&#039;&#039;&lt;br /&gt;
| disappeared_date          = &#039;&#039;disappeared_date&#039;&#039;&lt;br /&gt;
| disappeared_place         = &#039;&#039;disappeared_place&#039;&#039;&lt;br /&gt;
| disappeared_status        = &#039;&#039;disappeared_status&#039;&#039;&lt;br /&gt;
| death_date                = &#039;&#039;death_date&#039;&#039;&lt;br /&gt;
| death_place               = &#039;&#039;death_place&#039;&#039;&lt;br /&gt;
| death_cause               = &#039;&#039;death_cause&#039;&#039;&lt;br /&gt;
| body_discovered           = &#039;&#039;body_discovered&#039;&#039;&lt;br /&gt;
| resting_place             = &#039;&#039;resting_place&#039;&#039;&lt;br /&gt;
| resting_place_coordinates = &#039;&#039;resting_place_coordinates&#039;&#039;&lt;br /&gt;
| monuments                 = &#039;&#039;monuments&#039;&#039;&lt;br /&gt;
| residence                 = &#039;&#039;residence&#039;&#039;&lt;br /&gt;
| nationality               = &#039;&#039;natonality&#039;&#039;&lt;br /&gt;
| other_names               = &#039;&#039;other_names&#039;&#039;&lt;br /&gt;
| ethnicity                 = &#039;&#039;ethnicity&#039;&#039;&lt;br /&gt;
| citizenship               = &#039;&#039;citizenship&#039;&#039;&lt;br /&gt;
| education                 = &#039;&#039;education&#039;&#039;&lt;br /&gt;
| alma_mater                = &#039;&#039;alma_mater&#039;&#039;&lt;br /&gt;
| occupation                = &#039;&#039;occupation&#039;&#039;&lt;br /&gt;
| years_active              = &#039;&#039;years_active&#039;&#039;&lt;br /&gt;
| employer                  = &#039;&#039;employer&#039;&#039;&lt;br /&gt;
| organization              = &#039;&#039;organization&#039;&#039;&lt;br /&gt;
| agent                     = &#039;&#039;agent&#039;&#039;&lt;br /&gt;
| known_for                 = &#039;&#039;known_for&#039;&#039;&lt;br /&gt;
| notable_works             = &#039;&#039;notable_works&#039;&#039;&lt;br /&gt;
| style                     = &#039;&#039;style&#039;&#039;&lt;br /&gt;
| home_town                 = &#039;&#039;home_town&#039;&#039;&lt;br /&gt;
| salary                    = &#039;&#039;salary&#039;&#039;&lt;br /&gt;
| net_worth                 = &#039;&#039;net_worth&#039;&#039;&lt;br /&gt;
| height                    = &#039;&#039;height&#039;&#039;&lt;br /&gt;
| weight                    = &#039;&#039;weight&#039;&#039;&lt;br /&gt;
| television                = &#039;&#039;television&#039;&#039;&lt;br /&gt;
| title                     = &#039;&#039;title&#039;&#039;&lt;br /&gt;
| term                      = &#039;&#039;term&#039;&#039;&lt;br /&gt;
| predecessor               = &#039;&#039;predecessor&#039;&#039;&lt;br /&gt;
| successor                 = &#039;&#039;successor&#039;&#039;&lt;br /&gt;
| party                     = &#039;&#039;party&#039;&#039;&lt;br /&gt;
| movement                  = &#039;&#039;movement&#039;&#039;&lt;br /&gt;
| opponents                 = &#039;&#039;opponents&#039;&#039;&lt;br /&gt;
| boards                    = &#039;&#039;boards&#039;&#039;&lt;br /&gt;
| religion                  = &#039;&#039;religion&#039;&#039;&lt;br /&gt;
| denomination              = &#039;&#039;denomination&#039;&#039;&lt;br /&gt;
| criminal_charge           = &#039;&#039;criminal_charge&#039;&#039;&lt;br /&gt;
| criminal_penalty          = &#039;&#039;criminal_penalty&#039;&#039;&lt;br /&gt;
| criminal_status           = &#039;&#039;criminal_status&#039;&#039;&lt;br /&gt;
| spouse                    = &#039;&#039;spouse&#039;&#039;&lt;br /&gt;
| partner                   = &#039;&#039;partner&#039;&#039;&lt;br /&gt;
| children                  = &#039;&#039;children&#039;&#039;&lt;br /&gt;
| parents                   = &#039;&#039;parents&#039;&#039;&lt;br /&gt;
| relatives                 = &#039;&#039;relatives&#039;&#039;&lt;br /&gt;
| callsign                  = &#039;&#039;callsign&#039;&#039;&lt;br /&gt;
| awards                    = &#039;&#039;awards&#039;&#039;&lt;br /&gt;
| signature                 = Example.jpg&lt;br /&gt;
| signature_alt             =&lt;br /&gt;
| signature_size            = &lt;br /&gt;
| module                    = &#039;&#039;module&#039;&#039;&lt;br /&gt;
| module2                   = &#039;&#039;module2&#039;&#039;&lt;br /&gt;
| module3                   = &#039;&#039;module3&#039;&#039;&lt;br /&gt;
| module4                   = &#039;&#039;module4&#039;&#039;&lt;br /&gt;
| module5                   = &#039;&#039;module5&#039;&#039;&lt;br /&gt;
| module6                   = &#039;&#039;module6&#039;&#039;&lt;br /&gt;
| website                   = &#039;&#039;website&#039;&#039;&lt;br /&gt;
| footnotes                 = &#039;&#039;footnotes&#039;&#039;&lt;br /&gt;
| box_width                 = &#039;&#039;box_width&#039;&#039;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox person&lt;br /&gt;
| honorific_prefix          = &lt;br /&gt;
| name                      = &amp;lt;!-- include middle initial, if not specified in birth_name --&amp;gt;&lt;br /&gt;
| honorific_suffix          = &lt;br /&gt;
| native_name               = &lt;br /&gt;
| native_name_lang          = &lt;br /&gt;
| image                     = &amp;lt;!-- just the name, without the File: or Image: prefix or enclosing [[brackets]] --&amp;gt;&lt;br /&gt;
| image_size                = &lt;br /&gt;
| alt                       = &lt;br /&gt;
| caption                   = &lt;br /&gt;
| birth_name                = &lt;br /&gt;
| birth_date                = &amp;lt;!-- {{Birth date and age|YYYY|MM|DD}} --&amp;gt;&lt;br /&gt;
| baptism_date              = &lt;br /&gt;
| birth_place               = &lt;br /&gt;
| disappeared_date          = &amp;lt;!-- {{Disappeared date and age|YYYY|MM|DD|YYYY|MM|DD}} (disappeared date then birth date) --&amp;gt;&lt;br /&gt;
| disappeared_place         = &lt;br /&gt;
| disappeared_status        = &lt;br /&gt;
| death_date                = &amp;lt;!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} (death date then birth date) --&amp;gt;&lt;br /&gt;
| death_place               = &lt;br /&gt;
| death_cause               = &lt;br /&gt;
| body_discovered           = &lt;br /&gt;
| resting_place             = &lt;br /&gt;
| resting_place_coordinates = &amp;lt;!-- {{Coord|LAT|LONG|type:landmark|display=inline}} --&amp;gt;&lt;br /&gt;
| monuments                 = &lt;br /&gt;
| residence                 = &lt;br /&gt;
| nationality               = &lt;br /&gt;
| other_names               = &lt;br /&gt;
| ethnicity                 = &amp;lt;!-- Ethnicity should be supported with a citation from a reliable source --&amp;gt;&lt;br /&gt;
| citizenship               = &lt;br /&gt;
| education                 = &lt;br /&gt;
| alma_mater                = &lt;br /&gt;
| occupation                = &lt;br /&gt;
| years_active              = &lt;br /&gt;
| employer                  = &lt;br /&gt;
| organization              = &lt;br /&gt;
| agent                     = &lt;br /&gt;
| known_for                 = &lt;br /&gt;
| notable_works             = &lt;br /&gt;
| style                     = &lt;br /&gt;
| home_town                 = &lt;br /&gt;
| salary                    = &lt;br /&gt;
| net_worth                 = &amp;lt;!-- Net worth should be supported with a citation from a reliable source --&amp;gt;&lt;br /&gt;
| height                    = &amp;lt;!-- {{height|m=}} --&amp;gt;&lt;br /&gt;
| weight                    = &amp;lt;!-- {{convert|weight in kg|kg|lb}} --&amp;gt;&lt;br /&gt;
| television                = &lt;br /&gt;
| title                     = &lt;br /&gt;
| term                      = &lt;br /&gt;
| predecessor               = &lt;br /&gt;
| successor                 = &lt;br /&gt;
| party                     = &lt;br /&gt;
| movement                  = &lt;br /&gt;
| opponents                 = &lt;br /&gt;
| boards                    = &lt;br /&gt;
| religion                  = &amp;lt;!-- Religion should be supported with a citation from a reliable source --&amp;gt;&lt;br /&gt;
| denomination              = &amp;lt;!-- Denomination should be supported with a citation from a reliable source --&amp;gt;&lt;br /&gt;
| criminal_charge           = &amp;lt;!-- Criminality parameters should be supported with citations from reliable sources --&amp;gt;&lt;br /&gt;
| criminal_penalty          = &lt;br /&gt;
| criminal_status           = &lt;br /&gt;
| spouse                    = &lt;br /&gt;
| partner                   = &amp;lt;!-- unmarried life partner; use &#039;&#039;Name (1950–present)&#039;&#039; --&amp;gt;&lt;br /&gt;
| children                  = &lt;br /&gt;
| parents                   = &lt;br /&gt;
| relatives                 = &lt;br /&gt;
| callsign                  = &lt;br /&gt;
| awards                    = &lt;br /&gt;
| signature                 = &lt;br /&gt;
| signature_alt             = &lt;br /&gt;
| signature_size            = &lt;br /&gt;
| module                    = &lt;br /&gt;
| module2                   = &lt;br /&gt;
| module3                   = &lt;br /&gt;
| module4                   = &lt;br /&gt;
| module5                   = &lt;br /&gt;
| module6                   = &lt;br /&gt;
| website                   = &amp;lt;!-- {{URL|Example.com}} --&amp;gt;&lt;br /&gt;
| footnotes                 = &lt;br /&gt;
| box_width                 = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
Do not use all these parameters for any one person. The list is long to cover a wide range of people. Only use those parameters that convey essential or notable information about the subject. Any parameters left blank or omitted will not be displayed. If a data field has more than one parameter name which can be used, the preferred name is listed first in &#039;&#039;&#039;bold&#039;&#039;&#039; print.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: left&amp;quot; | Parameter&lt;br /&gt;
! style=&amp;quot;text-align: left&amp;quot; | Explanation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;honorific_prefix&#039;&#039;&#039;&lt;br /&gt;
| To appear on the line above the person&#039;s name&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;name&#039;&#039;&#039;&lt;br /&gt;
| Common name of person (defaults to article name if left blank; provide &#039;&#039;&#039;birth_name&#039;&#039;&#039; (below) if different from &#039;&#039;&#039;name&#039;&#039;&#039;). If middle initials are specified (or implied) by the lede of the article, and are not specified separately in the &#039;&#039;&#039;birth_name&#039;&#039;&#039; field, include them here.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;honorific_suffix&#039;&#039;&#039;&lt;br /&gt;
| To appear on the line below the person&#039;s name&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;native_name&#039;&#039;&#039;&lt;br /&gt;
| The person&#039;s name in their own language, if different.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;native_name_lang&#039;&#039;&#039;&lt;br /&gt;
| [[ISO 639-1]] code e.g. &amp;quot;fr&amp;quot; for French. If more than one, use {{tl|lang}} in {{para|native_name}} instead.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;image&#039;&#039;&#039;&lt;br /&gt;
| Image name: abc.jpg, xpz.png, 123.gif, etc. If an image is desired but not available, one may add &amp;quot;yes&amp;quot; to the &amp;quot;needs-photo&amp;quot; section of the [[:Template:WPBiography]] on the talkpage. If no image is available yet, [[Wikipedia:Centralized discussion/Image placeholders|do not use an image placeholder]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;image_size&#039;&#039;&#039;&amp;lt;br /&amp;gt; (&#039;&#039;imagesize&#039;&#039;)&lt;br /&gt;
| Size to display image: &#039;&#039;200px&#039;&#039; (set width), &#039;&#039;x300px&#039;&#039; (set height), or &#039;&#039;200x300px&#039;&#039; (max width &amp;amp; max height). This defaults to &#039;&#039;frameless&#039;&#039; (default is 220px, but logged in users can change this by clicking on &amp;quot;my preferences&amp;quot; and adjusting thumbnail size) if empty or omitted. This parameter should not normally need to be set.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;alt&#039;&#039;&#039;&lt;br /&gt;
| Alt text for image, for visually impaired readers. One word (such as &amp;quot;photograph&amp;quot;) is rarely sufficient. See [[WP:ALT]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;caption&#039;&#039;&#039;&lt;br /&gt;
| Caption for image, if needed. Try to include date of photo and the photographer.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;birth_name&#039;&#039;&#039;&lt;br /&gt;
| Name at birth; only use if different from &#039;&#039;&#039;name&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;birth_date&#039;&#039;&#039;&lt;br /&gt;
| Date of birth: {{tl|birth date and age}} (if living) or {{tl|birth date}} (if dead).  See [[Template:Birth date and age/doc]] for details on usage. If only a year of birth is known, or age as of a certain date, consider using {{tl|birth year and age}} or {{tl|birth based on age as of date}}.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;baptism_date&#039;&#039;&#039;&lt;br /&gt;
| Date of baptism: &#039;&#039;&#039;Only&#039;&#039;&#039; for use when birth date is not known (e.g. for [[Beethoven]]). Will not display if a birth date is entered. Do not use subtemplates.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;birth_place&#039;&#039;&#039;&lt;br /&gt;
| Place of birth: city, administrative region, sovereign state. Use the name of the birthplace at the time of birth, e.g.: Saigon (prior to 1976), Ho Chi Minh City (post 1976). [[Wikipedia:Manual of Style (icons)#Do not use flags to indicate locations of birth, residence, or death|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;disappeared_date&#039;&#039;&#039;&lt;br /&gt;
| (For missing people) Date of disappearance: {{tl|disappeared date and age}} (if birth date is known) or {{tl|disappeared date}} (if birth date unknown).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;disappeared_place&#039;&#039;&#039;&lt;br /&gt;
| (For missing people) Place of disappearance: city, administrative region, sovereign state. [[Wikipedia:Manual of Style (icons)#Do not use flags to indicate locations of birth, residence, or death|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;disappeared_status&#039;&#039;&#039;&lt;br /&gt;
| (For missing people) Current status for the person, e.g. if the person is still regarded as missing (using {{tl|missing for}} to calculate the time since disappearance), or if the person has been [[declared death in absentia|declared dead &#039;&#039;in absentia&#039;&#039;]], with a date for such a ruling.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;death_date&#039;&#039;&#039;&lt;br /&gt;
| Date of death: {{tl|death date and age}} (if birth date is known) or {{tl|death date}} (if birth date unknown). See [[Template:Death date/doc]] for details on usage. If exact dates are unknown, consider using {{tl|death year and age}}.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;death_place&#039;&#039;&#039;&lt;br /&gt;
| Place of death: city, administrative region, sovereign state. Note: [[Wikipedia:Manual of Style (icons)#Do not use flags to indicate locations of birth, residence, or death|Do not use a flag template]]. Use the name of the deathplace at the time of death, e.g.: Saigon (prior to 1976), Ho Chi Minh City (post 1976)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;death_cause&#039;&#039;&#039;&lt;br /&gt;
| Cause of death.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;body_discovered&#039;&#039;&#039;&lt;br /&gt;
| Place where the body was discovered (if different from place of death).  [[Wikipedia:Manual of Style (icons)#Do not use flags to indicate locations of birth, residence, or death|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;resting_place&#039;&#039;&#039;&lt;br /&gt;
| Place of burial, ash-scattering, etc. [[Wikipedia:Manual of Style (icons)#Do not use flags to indicate locations of birth, residence, or death|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;resting_place_coordinates&#039;&#039;&#039;&lt;br /&gt;
| Coordinates for place of burial, ash-scattering etc. Use {{tl|coord}} template.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;monuments&#039;&#039;&#039;&lt;br /&gt;
| Significant monuments erected, buildings named, etc., in honour of the subject. If many, link to an appropriate section of the article instead.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;residence&#039;&#039;&#039;&lt;br /&gt;
| Location(s) where the person notably resides/resided, if different from birth place. [[Wikipedia:Manual of Style (icons)#Avoid flag icons in infoboxes|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;nationality&#039;&#039;&#039;&lt;br /&gt;
| Nationality. May be used instead of citizenship (below) or vice versa in cases where any confusion could result. Should only be used {{em|with}} citizenship when they somehow differ. Should only be used if nationality cannot be inferred from the birthplace. [[Wikipedia:Manual of Style (icons)#Biographical use|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;other_names&#039;&#039;&#039;&lt;br /&gt;
| Other notable names for the person, if different from &#039;&#039;&#039;name&#039;&#039;&#039; and &#039;&#039;&#039;birth_name&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ethnicity&#039;&#039;&#039;&lt;br /&gt;
| Ethnicity.  Please be sure to support with a citation from a reliable source, in the article body.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;citizenship&#039;&#039;&#039;&lt;br /&gt;
| Country of legal citizenship, if different from nationality. Rarely needed. &#039;&#039;See usage notes for nationality above.&#039;&#039; Should only be used if citizenship cannot be inferred from the birthplace. [[Wikipedia:Manual of Style (icons)#Avoid flag icons in infoboxes|Do not use a flag template]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;education&#039;&#039;&#039;&lt;br /&gt;
| Education, e.g. degree, institution and graduation year, if relevant. If very little information is available or relevant, the {{para|alma_mater}} parameter may be more appropriate.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;alma_mater&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;[[Alma mater]]&#039;&#039;. This parameter is a more concise alternative to {{para|education}}, and will most often simply consist of the linked name of the last-attended higher education institution.  It is usually not relevant to included either parameter for non-graduates, but article talk page consensus may conclude otherwise, as at [[Bill Gates]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;occupation&#039;&#039;&#039;&lt;br /&gt;
| Occupation(s) as given in the lead. Please observe sentence case and capitalise only the first letter of the first item (e.g. Musician, actor, singer-songwriter).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;years_active&#039;&#039;&#039;&lt;br /&gt;
| Date range in years during which the subject was active in their principal occupation(s) and/or other activity for which they are notable. Use the format &amp;lt;code&amp;gt;1950–2000&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;1970–present&amp;lt;/code&amp;gt; if still active (note the use of an [[WP:ENDASH|en dash]], not hyphen). If no dates of birth and/or death are known for the subject, only a &#039;&#039;[[floruit]]&#039;&#039; date range, as is common with ancient subjects, this parameter can be used for it. If approximate (&#039;&#039;[[circa]]&#039;&#039;) dates are known for either or both, put them in the &amp;lt;code&amp;gt;birth_date&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;death_date&amp;lt;/code&amp;gt; parameters.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;employer&#039;&#039;&#039;&lt;br /&gt;
| Employer(s), if relevant.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;organization&#039;&#039;&#039;&lt;br /&gt;
| Non-employing organization(s), if relevant.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;agent&#039;&#039;&#039;&lt;br /&gt;
| The subject&#039;s agent (individual and/or agency), if relevant.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;known_for&#039;&#039;&#039;&amp;lt;/br&amp;gt; (&#039;&#039;known&#039;&#039;)&lt;br /&gt;
| A brief description of why the person is notable.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;notable_works&#039;&#039;&#039;&lt;br /&gt;
| Title(s) of notable work(s) (publications, compositions, sculptures, films, etc.) by the subject, if any.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;style&#039;&#039;&#039;&lt;br /&gt;
| The style in which the subject works, if applicable.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;influences&#039;&#039;&#039;&lt;br /&gt;
| No longer supported.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;influenced&#039;&#039;&#039;&lt;br /&gt;
| No longer supported.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;home_town&#039;&#039;&#039;&lt;br /&gt;
| The place where the person was raised and matured, if different from birth place and residence.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;salary&#039;&#039;&#039;&lt;br /&gt;
| Annual salary or compensation, if relevant.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;net_worth&#039;&#039;&#039;&lt;br /&gt;
| Current estimated net worth, if relevant. Please be sure to support with a citation from a reliable source, in the article body.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;height&#039;&#039;&#039;&lt;br /&gt;
| If person was notable for their height, or if height is relevant. If used, this should also include the year of the measurement if the person had not reached full adulthood when this stat was published. &#039;&#039;See documentation of this parameter at [[Template:Infobox sportsperson]] for more information.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;weight&#039;&#039;&#039;&lt;br /&gt;
| If person was notable for their weight, or if weight is relevant. If used, this should also include the year of the measurement.  &#039;&#039;See documentation of this parameter at [[Template:Infobox sportsperson]] for more information.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;television&#039;&#039;&#039;&lt;br /&gt;
| Television programmes presented by or &#039;&#039;closely&#039;&#039; associated with the subject.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;title&#039;&#039;&#039;&lt;br /&gt;
| Multiple uses:&lt;br /&gt;
* Formal title, such as &#039;&#039;First Lady of Japan&#039;&#039; for [[Akie Abe]].&lt;br /&gt;
* Awarded title, such as &#039;&#039;Mr. Olympia&#039;&#039; for [[Arnold Schwarzenegger]].&lt;br /&gt;
* Job title, such as &#039;&#039;President of Calvin College&#039;&#039; for [[Anthony Diekema]].&lt;br /&gt;
* A combination of the above, such as &#039;&#039;Professor of Mathematics&#039;&#039; and &#039;&#039;[[Fellow of the Royal Society]]&#039;&#039; for [[Bill Parry (mathematician)|Bill Parry]]&lt;br /&gt;
&#039;&#039;See also &amp;quot;awards&amp;quot; parameter, below, for awarded honors that are not really titles. A single award should not use both parameters.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;term&#039;&#039;&#039;&lt;br /&gt;
| Years the person held the &#039;&#039;&#039;title&#039;&#039;&#039; listed above.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;predecessor&#039;&#039;&#039;&lt;br /&gt;
| Person who previously held the &#039;&#039;&#039;title&#039;&#039;&#039; listed above.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;successor&#039;&#039;&#039;&lt;br /&gt;
| Person who subsequently held the &#039;&#039;&#039;title&#039;&#039;&#039; listed above.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;party&#039;&#039;&#039;&lt;br /&gt;
| If relevant. Field labelled &#039;&#039;&#039;Political party&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;movement&#039;&#039;&#039;&lt;br /&gt;
| If relevant; non party-political.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;opponents&#039;&#039;&#039;&lt;br /&gt;
| Notable relevant opponents (e.g. for major political office).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;boards&#039;&#039;&#039;&lt;br /&gt;
| For [[board of directors]] membership(s), if relevant. Field labeled &#039;&#039;&#039;Board member&amp;amp;nbsp;of&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;religion&#039;&#039;&#039;&lt;br /&gt;
| If relevant. For living persons please refer to [[WP:BLPCAT]]. Please be sure to support with a citation from a reliable source, in the article body.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;denomination&#039;&#039;&#039;&lt;br /&gt;
| Denomination of religion, if relevant.  Please be sure to support with a citation from a reliable source, in the article body.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;criminal_charge&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;criminal_penalty&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;criminal_status&#039;&#039;&#039;&lt;br /&gt;
| For convicted criminals only.  Please be certain to support these parameters with citations from reliable sources, in the article body.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;spouse(s)&#039;&#039;&#039;&lt;br /&gt;
| Name of spouse(s), followed by years of marriage. Use the format &#039;&#039;Name (married 1950–present)&#039;&#039; for a current spouse, and &#039;&#039;Name (married 1970–1999)&#039;&#039; for former spouse(s). Separate entries using {{Tl|Plainlist}} or {{Tl|Unbulleted list}}. For deceased persons still married at time of death, close the date range with death year.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;partner(s)&#039;&#039;&#039;&lt;br /&gt;
| For unmarried [[life partner]]s (of any gender or sexual preference), not business partners. Use the format &#039;&#039;Name (1950–present)&#039;&#039; for current partner and &#039;&#039;Name (1970–1999)&#039;&#039; for former partner(s).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;children&#039;&#039;&#039;&lt;br /&gt;
| Number of children (e.g. three or 3), or list of names, in which case, separate entries using {{Tl|Plainlist}} or {{Tl|Unbulleted list}}. For privacy reasons, consider omitting the names of children of living persons, unless the children are independently notable.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;parents&#039;&#039;&#039;&lt;br /&gt;
| Names of parents. Separate entries using {{Tl|Plainlist}} or {{Tl|Unbulleted list}}.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;relatives&#039;&#039;&#039;&amp;lt;br /&amp;gt; (&#039;&#039;relations&#039;&#039;)&lt;br /&gt;
| Names of siblings or other relatives. Include the relationship in parentheses after the name (sister, uncle, etc). Separate entries using {{Tl|Plainlist}} or {{Tl|Unbulleted list}}.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;callsign&#039;&#039;&#039;	&lt;br /&gt;
| Amateur radio [[call sign]], if relevant.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;awards&#039;&#039;&#039;&lt;br /&gt;
| Notable awards. If many, link to an appropriate section of the article instead. &#039;&#039;See also &amp;quot;title&amp;quot; parameter, above, for awarded titles. A single award should not use both parameters.&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;signature&#039;&#039;&#039;&lt;br /&gt;
| An image of the person&#039;s signature. Please use image name: abc.jpg, xpz.png, 123.gif, etc.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;signature_alt&#039;&#039;&#039;&lt;br /&gt;
| Alt text for the signature image. For example, for [[:File:Thomas Jefferson Signature.svg]], the alt text might be &amp;lt;code&amp;gt;|signature_alt= Th: Jefferson&amp;lt;/code&amp;gt;, spelling out the signature exactly as it appears in the image.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;signature_size&#039;&#039;&#039;&lt;br /&gt;
| Default is &#039;&#039;150px&#039;&#039;. If necessary, a signature can be resized manually as per the &amp;quot;image_size&amp;quot; parameter.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;module&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;module2&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;module3&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;module4&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;module5&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;module6&#039;&#039;&#039;&lt;br /&gt;
| Used for embedding other infoboxes into this one.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;website&#039;&#039;&#039;&lt;br /&gt;
| Official website only. Unofficial websites should be placed under &amp;lt;nowiki&amp;gt;==External links==&amp;lt;/nowiki&amp;gt; in the body of the article. Use {{tl|URL}} as in &amp;lt;nowiki&amp;gt;{{URL|Example.com}}&amp;lt;/nowiki&amp;gt;. Do not include the &amp;lt;code&amp;gt;www.&amp;lt;/code&amp;gt; part unless the server requires it. Use [[camel case]] capitalization to make multiword domain names easier to read.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;footnotes&#039;&#039;&#039;&lt;br /&gt;
| Notes about any of the infobox data.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;box_width&#039;&#039;&#039;&lt;br /&gt;
| The infobox width, such as: box_width=220px (default: 22em). A space character between the number and the unit of measurement breaks the parameter. This parameter should not normally need to be set.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
{{Infobox person&lt;br /&gt;
| name              = Bill Gates&lt;br /&gt;
| image             = Bill Gates in WEF ,2007.jpg&lt;br /&gt;
| caption           = Bill Gates at the [[World Economic Forum]] in [[Davos]], 2007&lt;br /&gt;
| birth_name        = William Henry Gates III&lt;br /&gt;
| birth_date        = {{birth date and age|1955|10|28}}&lt;br /&gt;
| birth_place       = [[Seattle]], Washington, US&lt;br /&gt;
| occupation        = Chairman of [[Microsoft]] (non-executive)&amp;lt;br /&amp;gt;Co-chair of [[Bill &amp;amp; Melinda Gates Foundation]]&amp;lt;br /&amp;gt;Director of [[Berkshire Hathaway]]&amp;lt;br /&amp;gt;CEO of [[Cascade Investment]]&lt;br /&gt;
| networth          = {{increase}}[[United States dollar|US$]]53 [[1,000,000,000 (number)|billion]] (2010)&amp;lt;ref&amp;gt;[http://www.forbes.com/profile/bill-gates/ Bill Gates profile]. Forbes.com. Retrieved April 2010.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| spouse            = Melinda Gates (married 1994)&lt;br /&gt;
| children          = 3&lt;br /&gt;
| residence         = [[Medina, Washington|Medina]], Washington&lt;br /&gt;
| alma_mater        = Harvard University (dropped out in 1975)&lt;br /&gt;
| website           = {{URL|microsoft.com/presspass/exec/billg}}&lt;br /&gt;
| signature         = BillGates Signature.svg&lt;br /&gt;
| parents           = [[William H. Gates, Sr.]]&amp;lt;br /&amp;gt;[[Mary Maxwell Gates]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow: auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Infobox person&lt;br /&gt;
| name              = Bill Gates&lt;br /&gt;
| image             = Bill Gates in WEF ,2007.jpg&lt;br /&gt;
| caption           = Bill Gates at the [[World Economic Forum]] in [[Davos]], 2007&lt;br /&gt;
| birth_name        = William Henry Gates III&lt;br /&gt;
| birth_date        = {{birth date and age|1955|10|28}}&lt;br /&gt;
| birth_place       = [[Seattle]], Washington, US&lt;br /&gt;
| occupation        = Chairman of [[Microsoft]] (non-executive)&amp;lt;br /&amp;gt;Co-chair of [[Bill &amp;amp; Melinda Gates Foundation]]&amp;lt;br /&amp;gt;Director of [[Berkshire Hathaway]]&amp;lt;br /&amp;gt;CEO of [[Cascade Investment]]&lt;br /&gt;
| networth          = {{increase}}[[United States dollar|US$]]53 [[1,000,000,000 (number)|billion]] (2010)&amp;lt;ref&amp;gt;[http://www.forbes.com/profile/bill-gates/ Bill Gates profile]. Forbes.com. Retrieved April 2010.&amp;lt;/ref&amp;gt;&lt;br /&gt;
| spouse            = Melinda Gates (married 1994)&lt;br /&gt;
| children          = 3&lt;br /&gt;
| residence         = [[Medina, Washington|Medina]], Washington&lt;br /&gt;
| alma_mater        = Harvard University (dropped out in 1975)&lt;br /&gt;
| website           = {{URL|microsoft.com/presspass/exec/billg}}&lt;br /&gt;
| signature         = BillGates Signature.svg&lt;br /&gt;
| parents           = [[William H. Gates, Sr.]]&amp;lt;br /&amp;gt;[[Mary Maxwell Gates]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Microformat ==&lt;br /&gt;
{{UF-hcard-person}}&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
{{TemplateDataHeader}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;description&amp;quot;: &amp;quot;An infobox for articles about people&amp;quot;,&lt;br /&gt;
  &amp;quot;params&amp;quot;: {&lt;br /&gt;
   &amp;quot;agent&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The subject&#039;s agent (individual and/or agency), if relevant.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Agent&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;alma_mater&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Alma mater. This parameter is a more concise alternative to `education`, and will most often simply consist of the linked name of the last-attended higher education institution. It is usually not relevant to included either parameter for non-graduates, but article talk page consensus may conclude otherwise, as at Bill Gates.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Alma Mater&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;alt&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Alt text for image, for visually impaired readers. One word (such as \&amp;quot;photograph\&amp;quot;) is rarely sufficient. See WP:ALT.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Alt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;awards&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Notable awards. If many, link to an appropriate section of the article instead. See also \&amp;quot;title\&amp;quot; parameter, above, for awarded titles. A single award should not use both parameters.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Awards&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;birth_date&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Date of birth: Template:birth date and age (if living) or Template:birth date (if dead). See Template:Birth date and age/doc for details on usage. If only a year of birth is known, or age as of a certain date, consider using Template:birth year and age or Template:birth based on age as of date.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Birth Date&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;birth_name&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Name at birth; only use if different from name.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Birth Name&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;birth_place&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Place of birth: city, administrative region, sovereign state. Use the name of the birthplace at the time of birth, e.g.: Saigon (prior to 1976), Ho Chi Minh City (post 1976). Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Birth Place&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;boards&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;For board of directors membership(s), if relevant. Field labeled Board member of.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Boards&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;body_discovered&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Place where the body was discovered (if different from place of death). Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Body Discovered&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;callsign&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Amateur radio call sign, if relevant.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Callsign&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;caption&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Caption for image, if needed. Try to include date of photo and the photographer.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Caption&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;children&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Number of children (e.g. three or 3), or list of names, in which case, separate entries using Template:Plainlist or Template:Unbulleted list. For privacy reasons, consider omitting the names of children of living persons, unless the children are independently notable.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Children&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;citizenship&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Country of legal citizenship, if different from nationality. Rarely needed. See usage notes for nationality above. Should only be used if citizenship cannot be inferred from the birthplace. Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Citizenship&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;criminal_charge&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;For convicted criminals only. Please be certain to support these parameters with citations from reliable sources, in the article body.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Criminal Charge&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;death_cause&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Cause of death.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Death Cause&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;death_date&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Date of death: Template:death date and age (if birth date is known) or Template:death date (if birth date unknown). See Template:Death date/doc for details on usage. If exact dates are unknown, consider using Template:death year and age.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Death Date&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;death_place&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Place of death: city, administrative region, sovereign state. Note: Do not use a flag template. Use the name of the deathplace at the time of death, e.g.: Saigon (prior to 1976), Ho Chi Minh City (post 1976)&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Death Place&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;denomination&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Denomination of religion, if relevant. Please be sure to support with a citation from a reliable source, in the article body.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Denomination&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;disappeared_date&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;(For missing people) Date of disappearance: Template:disappeared date and age (if birth date is known) or Template:disappeared date (if birth date unknown).&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Disappeared Date&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;disappeared_place&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;(For missing people) Place of disappearance: city, administrative region, sovereign state. Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Disappeared Place&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;disappeared_status&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;(For missing people) Current status for the person, e.g. if the person is still regarded as missing (using Template:missing for to calculate the time since disappearance), or if the person has been declared dead in absentia, with a date for such a ruling.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Disappeared Status&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;education&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Education, e.g. degree, institution and graduation year, if relevant. If very little information is available or relevant, the `alma_mater` parameter may be more appropriate.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Education&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;employer&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Employer(s), if relevant.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Employer&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;ethnicity&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Ethnicity. Please be sure to support with a citation from a reliable source, in the article body.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Ethnicity&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;footnotes&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Notes about any of the infobox data.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Footnotes&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;height&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;If person was notable for their height, or if height is relevant. If used, this should also include the year of the measurement if the person had not reached full adulthood when this stat was published. See documentation of this parameter at Template:Infobox sportsperson for more information.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Height&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;home_town&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The place where the person was raised and matured, if different from birth place and residence.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Home Town&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;honorific_prefix&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;To appear on the line above the person&#039;s name&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Honorific Prefix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;honorific_suffix&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;To appear on the line below the person&#039;s name&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Honorific Suffix&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;image&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Image name: abc.jpg, xpz.png, 123.gif, etc. If an image is desired but not available, one may add \&amp;quot;yes\&amp;quot; to the \&amp;quot;needs-photo\&amp;quot; section of the :Template:WPBiography on the talkpage. If no image is available yet, do not use an image placeholder.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Image&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;image_size&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Size to display image: 200px (set width), x300px (set height), or 200x300px (max width &amp;amp; max height). This defaults to frameless (default is 220px, but logged in users can change this by clicking on \&amp;quot;my preferences\&amp;quot; and adjusting thumbnail size) if empty or omitted. This parameter should not normally need to be set.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Image Size&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;known_for&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;A brief description of why the person is notable.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Known For&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;module&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Used for embedding other infoboxes into this one.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Module&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;monuments&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Significant monuments erected, buildings named, etc., in honour of the subject. If many, link to an appropriate section of the article instead.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Monuments&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;movement&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;If relevant; non party-political.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Movement&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;name&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Common name of person (defaults to article name if left blank; provide birth_name (below) if different from name). If middle initials are specified (or implied) by the lede of the article, and are not specified separately in the birth_name field, include them here.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Name&amp;quot;,&lt;br /&gt;
      &amp;quot;required&amp;quot;: true&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;nationality&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Nationality. May be used instead of citizenship (below) or vice versa in cases where any confusion could result. Should only be used &#039;with&#039; citizenship when they somehow differ. Should only be used if nationality cannot be inferred from the birthplace. Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Nationality&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;native_name&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The person&#039;s name in their own language, if different.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Native Name&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;native_name_lang&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;ISO 639-1 code e.g. \&amp;quot;fr\&amp;quot; for French. If more than one, use Template:lang in `native_name` instead.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Native Name Lang&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;net_worth&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Current estimated net worth, if relevant. Please be sure to support with a citation from a reliable source, in the article body.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Net Worth&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;notable_works&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Title(s) of notable work(s) (publications, compositions, sculptures, films, etc.) by the subject, if any.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Notable Works&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;occupation&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Occupation(s) as given in the lead.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Occupation&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;opponents&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Notable relevant opponents (e.g. for major political office).&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Opponents&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;organization&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Non-employing organization(s), if relevant.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Organization&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;other_names&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Other notable names for the person, if different from name and birth_name.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Other Names&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;parents&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Names of parents. Separate entries using Template:Plainlist or Template:Unbulleted list.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Parents&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;partner(s)&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;For unmarried life partners (of any gender or sexual preference), not business partners. Use the format Name (1950–present) for current partner and Name (1970–1999) for former partner(s).&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Partner(s)&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;party&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;If relevant. Field labelled Political party.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Party&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;predecessor&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Person who previously held the title listed above.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Predecessor&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;relatives&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Names of siblings or other relatives. Include the relationship in parentheses after the name (sister, uncle, etc). Separate entries using Template:Plainlist or Template:Unbulleted list.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Relatives&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;religion&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;If relevant. For living persons please refer to WP:BLPCAT. Please be sure to support with a citation from a reliable source, in the article body.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Religion&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;residence&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Location(s) where the person notably resides/resided, if different from birth place. Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Residence&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;resting_place&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Place of burial, ash-scattering, etc. Do not use a flag template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Resting Place&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;resting_place_coordinates&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Coordinates for place of burial, ash-scattering etc. Use Template:coord template.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Resting Place Coordinates&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;salary&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Annual salary or compensation, if relevant.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Salary&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;signature&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;An image of the person&#039;s signature. Please use image name: abc.jpg, xpz.png, 123.gif, etc.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Signature&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;signature_alt&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Alt text for the signature image. For example, for :File:Thomas Jefferson Signature.svg, the alt text might be |signature_alt= Th: Jefferson, spelling out the signature exactly as it appears in the image.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Signature Alt&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;signature_size&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Default is 150px. If necessary, a signature can be resized manually as per the \&amp;quot;image_size\&amp;quot; parameter.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Signature Size&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;spouse(s)&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Name of spouse(s), followed by years of marriage. Use the format Name (married 1950–present) for a current spouse, and Name (married 1970–1999) for former spouse(s). Separate entries using Template:Plainlist or Template:Unbulleted list. For deceased persons still married at time of death, close the date range with death year.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Spouse(s)&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;style&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;The style in which the subject works, if applicable.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Style&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;successor&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Person who subsequently held the title listed above.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Successor&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;television&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Television programmes presented by or closely associated with the subject.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Television&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;term&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Years the person held the title listed above.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Term&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;title&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Multiple uses: Formal title, such as First Lady of Japan for Akie Abe.; Awarded title, such as Mr. Olympia for Arnold Schwarzenegger.; Job title, such as President of Calvin College for Anthony Diekema.; A combination of the above, such as Professor of Mathematics and Fellow of the Royal Society for Bill Parry See also \&amp;quot;awards\&amp;quot; parameter, below, for awarded honors that are not really titles. A single award should not use both parameters.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Title&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;website&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Official website only. Unofficial websites should be placed under ==External links== in the body of the article. Use Template:URL as in Example.com . Do not include the www. part unless the server requires it. Use camel case capitalization to make multiword domain names easier to read.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Website&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;weight&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;If person was notable for their weight, or if weight is relevant. If used, this should also include the year of the measurement. See documentation of this parameter at Template:Infobox sportsperson for more information.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Weight&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;years_active&amp;quot; : {&lt;br /&gt;
      &amp;quot;description&amp;quot; : &amp;quot;Date range in years during which the subject was active in their principal occupation(s) and/or other activity for which they are notable. Use the format 1950–2000, or 1970–present if still active (note the use of an en dash, not hyphen). If no dates of birth and/or death are known for the subject, only a floruit date range, as is common with ancient subjects, this parameter can be used for it. If approximate (circa) dates are known for either or both, put them in the birth_date and death_date parameters.&amp;quot;,&lt;br /&gt;
      &amp;quot;label&amp;quot; : &amp;quot;Years Active&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
Alternative templates are listed at [[Wikipedia:WikiProject Biography/Infoboxes|WikiProject Biography/Infoboxes]] and within the [[:Category:People infobox templates|people infobox templates category]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: none&amp;quot;&amp;gt;{{reflist}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{Basepage subpage|&lt;br /&gt;
[[Category:People infobox templates| ]]&lt;br /&gt;
[[Category:Infobox templates with module parameter|Person]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Start_date_and_years_ago&amp;diff=19902</id>
		<title>Template:Start date and years ago</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Start_date_and_years_ago&amp;diff=19902"/>
		<updated>2013-12-27T21:01:08Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Merged to Template:Start date and age per TfD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Start date and age]]{{R from merge}}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Time_ago&amp;diff=23887</id>
		<title>Template:Time ago</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Time_ago&amp;diff=23887"/>
		<updated>2013-12-24T03:14:24Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: switch to Module:TimeAgo, written by User:FunPika&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TimeAgo|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go in the /doc subpage and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate.js&amp;diff=23431</id>
		<title>MediaWiki:Gadget-SidebarTranslate.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate.js&amp;diff=23431"/>
		<updated>2013-12-16T19:11:24Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Fix for main page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*  _____________________________________________________________________________&lt;br /&gt;
 * |                                                                             |&lt;br /&gt;
 * |                    === WARNING: GLOBAL GADGET FILE ===                      |&lt;br /&gt;
 * |                  Changes to this page affect many users.                    |&lt;br /&gt;
 * | Please discuss changes on the talk page or on [[WT:Gadget]] before editing. |&lt;br /&gt;
 * |_____________________________________________________________________________|&lt;br /&gt;
 *&lt;br /&gt;
 * Imported from [[User:Equazcion/SidebarTranslate.js]] on 2013-11-27&lt;br /&gt;
 * See [[User:Equazcion/SidebarTranslate]]&lt;br /&gt;
 * Note that when syncing to disable the importStylesheet call.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var plang = $(&#039;#p-lang&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
$(document).ready( function() {&lt;br /&gt;
	function sort( a, b ) {&lt;br /&gt;
		return ( $(b).text() ) &amp;lt; ( $(a).text() ) ? 1 : -1;&lt;br /&gt;
	}&lt;br /&gt;
	var plangUL = plang.find(&#039;ul&#039;);&lt;br /&gt;
	var interwikis = plangUL.find(&#039;li[class^=&amp;quot;interlanguage-link&amp;quot;]&#039;).detach();&lt;br /&gt;
	if ( interwikis.length &amp;gt; 0 ) {&lt;br /&gt;
		// importStylesheet(&#039;User:Equazcion/SidebarTranslate.css&#039;); // loaded separately in gadget&lt;br /&gt;
		var langReg = /(.*? – )?(.*)/;&lt;br /&gt;
		var gtPre = &#039;http://translate.google.com/translate?hl=en&amp;amp;sl=auto&amp;amp;tl=en&amp;amp;u=&#039;;&lt;br /&gt;
		var hardLangs = {&lt;br /&gt;
			&#039;lumbaart&#039;: &#039;Lombard&#039;, &lt;br /&gt;
			&#039;tarandíne&#039;: &#039;Tarantino&#039;, &lt;br /&gt;
			&#039;vèneto&#039;: &#039;Venetian&#039;, &lt;br /&gt;
			&#039;Беларуская (тарашкевіца)&#039;: &#039;Belarusian (Taraškievica)&#039;,&lt;br /&gt;
			&#039;буряад&#039;: &#039;Buryat&#039;, &lt;br /&gt;
			&#039;лакку&#039;: &#039;Lak&#039;&lt;br /&gt;
		};&lt;br /&gt;
		var googleSupported = [&#039;Afrikaans&#039;, &#039;Albanian&#039;, &#039;Arabic&#039;, &#039;Armenian&#039;, &#039;Azerbaijani&#039;, &#039;Basque&#039;, &#039;Belarusian&#039;, &#039;Bengali&#039;, &#039;Bulgarian&#039;,&lt;br /&gt;
			&#039;Catalan&#039;, &#039;Chinese&#039;, &#039;Croatian&#039;, &#039;Czech&#039;, &#039;Danish&#039;, &#039;Dutch&#039;, &#039;English&#039;, &#039;Esperanto&#039;, &#039;Estonian&#039;, &#039;Filipino&#039;, &#039;Finnish&#039;,&lt;br /&gt;
			&#039;French&#039;, &#039;Galician&#039;, &#039;Georgian&#039;, &#039;German&#039;, &#039;Greek&#039;, &#039;Haitian&#039;, &#039;Creole&#039;, &#039;Hebrew&#039;, &#039;Hindi&#039;, &#039;Hungarian&#039;, &#039;Icelandic&#039;,&lt;br /&gt;
			&#039;Indonesian&#039;, &#039;Irish&#039;, &#039;Italian&#039;, &#039;Japanese&#039;, &#039;Javanese&#039;, &#039;Kannada&#039;, &#039;Korean&#039;, &#039;Khmer&#039;, &#039;Latin&#039;, &#039;Latvian&#039;, &#039;Lithuanian&#039;,&lt;br /&gt;
			&#039;Macedonian&#039;, &#039;Malay&#039;, &#039;Maltese&#039;, &#039;Marathi&#039;, &#039;Norwegian&#039;, &#039;Norwegian (bokmål)&#039;, &#039;Norwegian Nynorsk&#039;, &#039;Persian&#039;, &#039;Polish&#039;,&lt;br /&gt;
			&#039;Portuguese&#039;, &#039;Romanian&#039;, &#039;Russian&#039;, &#039;Serbian&#039;, &#039;Slovak&#039;, &#039;Slovenian&#039;, &#039;Spanish&#039;, &#039;Swahili&#039;, &#039;Swedish&#039;, &#039;Tamil&#039;,&lt;br /&gt;
			&#039;Telugu&#039;, &#039;Thai&#039;, &#039;Turkish&#039;, &#039;Ukrainian&#039;, &#039;Urdu&#039;, &#039;Vietnamese&#039;, &#039;Welsh&#039;, &#039;Yiddish&#039;];&lt;br /&gt;
		&lt;br /&gt;
		interwikis.find(&#039;a&#039;).each( function() {&lt;br /&gt;
			var $this = $(this);&lt;br /&gt;
			var origLangName = $this.text();&lt;br /&gt;
			var langMatches = langReg.exec( $this.attr(&#039;title&#039;) );&lt;br /&gt;
			if ( langMatches != null ) {&lt;br /&gt;
				var newLangName = (langMatches[2] in hardLangs) ? hardLangs[ langMatches[2] ] : langMatches[2];&lt;br /&gt;
					if ( $this.attr(&#039;hreflang&#039;) == &#039;be-x-old&#039; ) newLangName = &#039;Belarusian (Taraškievica)&#039;; // Doesn&#039;t match object key for some reason&lt;br /&gt;
				var hrefs = $this.attr(&#039;href&#039;);&lt;br /&gt;
				$this.text( newLangName ).removeAttr(&#039;lang style&#039;).attr( &#039;title&#039;, &#039;Original language name: &#039; + origLangName );&lt;br /&gt;
				var unsup = ( googleSupported.indexOf(langMatches[2]) &amp;lt; 0 ) ? &#039;#FA8540&#039; : &#039;#4085FA&#039;;&lt;br /&gt;
				$(&#039;&amp;lt;a/&amp;gt;&#039;, {&lt;br /&gt;
					&#039;text&#039;: &#039;G&#039;,&lt;br /&gt;
					&#039;class&#039;: &#039;external gTrans&#039;,&lt;br /&gt;
					&#039;target&#039;: &#039;_blank&#039;,&lt;br /&gt;
					&#039;href&#039;: gtPre + hrefs,&lt;br /&gt;
					&#039;title&#039;: &#039;Google Translate: &#039; + newLangName + &#039; to English&#039;,&lt;br /&gt;
					&#039;style&#039;: &#039;color:&#039; + unsup + &#039;;&#039;&lt;br /&gt;
				}).insertAfter( $this ).before(&#039; &#039;);&lt;br /&gt;
				if ( $this.text().length &amp;gt; 17 )  $this.html( $this.html().replace(&#039;-&#039;,&#039;- &#039;).replace(&#039; &#039;, &#039;&amp;lt;br /&amp;gt;&#039;) );&lt;br /&gt;
				$this.siblings(&#039;.gTrans&#039;).hover(&lt;br /&gt;
					function() { $(this).css( {&#039;background-color&#039;: unsup, &#039;color&#039;: &#039;white&#039;} ) },&lt;br /&gt;
					function() { $(this).css( {&#039;background-color&#039;: &#039;transparent&#039;, &#039;color&#039;: unsup} ) }&lt;br /&gt;
				);&lt;br /&gt;
				$this.parent(&#039;li&#039;).hover(&lt;br /&gt;
					function() { $(this).find(&#039;.gTrans&#039;).fadeIn(200).css(&#039;margin-left&#039;,&#039;0&#039;) },&lt;br /&gt;
					function() { $(this).find(&#039;.gTrans&#039;).fadeOut(100).css(&#039;margin-left&#039;,&#039;5px&#039;) }&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		plangUL.prepend( interwikis.sort(sort) );&lt;br /&gt;
	}&lt;br /&gt;
	plang.show();&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-popups.js&amp;diff=23487</id>
		<title>MediaWiki:Gadget-popups.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-popups.js&amp;diff=23487"/>
		<updated>2013-12-15T21:16:51Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: toolserver tools were moved to labs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// STARTFILE: main.js&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **             changes to this file affect many users.              **&lt;br /&gt;
// **           please discuss on the talk page before editing         **&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// ** if you do edit this file, be sure that your editor recognizes it **&lt;br /&gt;
// ** as utf8, or the weird and wonderful characters in the namespaces **&lt;br /&gt;
// **   below will be completely broken. You can check with the show   **&lt;br /&gt;
// **            changes button before submitting the edit.            **&lt;br /&gt;
// **                      test: مدیا מיוחד Мэдыя                      **&lt;br /&gt;
// **                                                                  **&lt;br /&gt;
// **********************************************************************&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Globals&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Trying to shove as many of these as possible into the pg (popup globals) object&lt;br /&gt;
function pg(){} // dummy to stop errors&lt;br /&gt;
window.pg = {&lt;br /&gt;
	re: {},               // regexps&lt;br /&gt;
	ns: {},               // namespaces&lt;br /&gt;
	string: {},           // translatable strings&lt;br /&gt;
	wiki: {},             // local site info&lt;br /&gt;
	misc: {},             // YUCK PHOOEY&lt;br /&gt;
	option: {},           // options, see newOption etc&lt;br /&gt;
	optionDefault: {},    // default option values&lt;br /&gt;
	flag: {},             // misc flags&lt;br /&gt;
	cache: {},            // page and image cache&lt;br /&gt;
	structures: {},       // navlink structures&lt;br /&gt;
	timer: {},            // all sorts of timers (too damn many)&lt;br /&gt;
	counter: {},          // .. and all sorts of counters&lt;br /&gt;
	current: {},          // state info&lt;br /&gt;
	endoflist: null&lt;br /&gt;
};&lt;br /&gt;
window.pop = {	              // wrap various functions in here&lt;br /&gt;
	init: {},&lt;br /&gt;
	util: {},&lt;br /&gt;
	endoflist: null&lt;br /&gt;
};&lt;br /&gt;
function popupsReady() {&lt;br /&gt;
	if (!window.pg) { return false; }&lt;br /&gt;
	if (!pg.flag) { return false; }&lt;br /&gt;
	if (!pg.flag.finishedLoading) { return false; }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/// Local Variables: ///&lt;br /&gt;
/// mode:c ///&lt;br /&gt;
/// End: ///&lt;br /&gt;
// ENDFILE: main.js&lt;br /&gt;
// STARTFILE: actions.js&lt;br /&gt;
function setupTooltips(container, remove, force, popData) {&lt;br /&gt;
	log(&#039;setupTooltips, container=&#039;+container+&#039;, remove=&#039;+remove);&lt;br /&gt;
	if (!container) {&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// the main initial call&lt;br /&gt;
		if (getValueOf(&#039;popupOnEditSelection&#039;) &amp;amp;&amp;amp; window.doSelectionPopup &amp;amp;&amp;amp; document &amp;amp;&amp;amp; document.editform &amp;amp;&amp;amp; document.editform.wpTextbox1) {&lt;br /&gt;
			document.editform.wpTextbox1.onmouseup=doSelectionPopup;&lt;br /&gt;
		}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		// article/content is a structure-dependent thing&lt;br /&gt;
		container = defaultPopupsContainer();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!remove &amp;amp;&amp;amp; !force &amp;amp;&amp;amp; container.ranSetupTooltipsAlready) { return; }&lt;br /&gt;
	container.ranSetupTooltipsAlready = !remove;&lt;br /&gt;
&lt;br /&gt;
	var anchors;&lt;br /&gt;
	anchors=container.getElementsByTagName(&#039;A&#039;);&lt;br /&gt;
	setupTooltipsLoop(anchors, 0, 250, 100, remove, popData);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function defaultPopupsContainer() {&lt;br /&gt;
	if (getValueOf(&#039;popupOnlyArticleLinks&#039;)) {&lt;br /&gt;
		return document.getElementById(&#039;mw_content&#039;) || &lt;br /&gt;
			document.getElementById(&#039;content&#039;) ||&lt;br /&gt;
			document.getElementById(&#039;article&#039;) || document;&lt;br /&gt;
	}&lt;br /&gt;
	return  document;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setupTooltipsLoop(anchors,begin,howmany,sleep, remove, popData) {&lt;br /&gt;
	log(simplePrintf(&#039;setupTooltipsLoop(%s,%s,%s,%s,%s)&#039;, arguments));&lt;br /&gt;
	var finish=begin+howmany;&lt;br /&gt;
	var loopend = min(finish, anchors.length);&lt;br /&gt;
	var j=loopend - begin;&lt;br /&gt;
	log (&#039;setupTooltips: anchors.length=&#039; + anchors.length + &#039;, begin=&#039; + begin +&lt;br /&gt;
		 &#039;, howmany=&#039; + howmany + &#039;, loopend=&#039; + loopend + &#039;, remove=&#039; + remove);&lt;br /&gt;
	var doTooltip= remove ? removeTooltip : addTooltip;&lt;br /&gt;
	// try a faster (?) loop construct&lt;br /&gt;
	if (j &amp;gt; 0) {&lt;br /&gt;
		do {&lt;br /&gt;
			var a=anchors[loopend - j];&lt;br /&gt;
			if (typeof a===&#039;undefined&#039; || !a || !a.href) {&lt;br /&gt;
				log(&#039;got null anchor at index &#039; + loopend - j);&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			doTooltip(a, popData);&lt;br /&gt;
		} while (--j);&lt;br /&gt;
	}&lt;br /&gt;
	if (finish &amp;lt; anchors.length) {&lt;br /&gt;
		setTimeout(function() {&lt;br /&gt;
				setupTooltipsLoop(anchors,finish,howmany,sleep,remove,popData);},&lt;br /&gt;
			sleep);&lt;br /&gt;
	} else {&lt;br /&gt;
		if ( !remove &amp;amp;&amp;amp; ! getValueOf(&#039;popupTocLinks&#039;)) { rmTocTooltips(); }&lt;br /&gt;
		pg.flag.finishedLoading=true;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// eliminate popups from the TOC&lt;br /&gt;
// This also kills any onclick stuff that used to be going on in the toc&lt;br /&gt;
function rmTocTooltips() {&lt;br /&gt;
	var toc=document.getElementById(&#039;toc&#039;);&lt;br /&gt;
	if (toc) {&lt;br /&gt;
		var tocLinks=toc.getElementsByTagName(&#039;A&#039;);&lt;br /&gt;
		var tocLen = tocLinks.length;&lt;br /&gt;
		for (j=0; j&amp;lt;tocLen; ++j) {&lt;br /&gt;
			removeTooltip(tocLinks[j], true);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addTooltip(a, popData) {&lt;br /&gt;
	if ( !isPopupLink(a) ) { return; }&lt;br /&gt;
	a.onmouseover=mouseOverWikiLink;&lt;br /&gt;
	a.onmouseout= mouseOutWikiLink;&lt;br /&gt;
	a.onmousedown = killPopup;&lt;br /&gt;
	a.hasPopup = true;&lt;br /&gt;
	a.popData = popData;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function removeTooltip(a) {&lt;br /&gt;
	if ( !a.hasPopup ) { return; }&lt;br /&gt;
	a.onmouseover = null;&lt;br /&gt;
	a.onmouseout = null;&lt;br /&gt;
	if (a.originalTitle) { a.title = a.originalTitle; }&lt;br /&gt;
	a.hasPopup=false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function removeTitle(a) {&lt;br /&gt;
	if (!a.originalTitle) {&lt;br /&gt;
		a.originalTitle=a.title;&lt;br /&gt;
	}&lt;br /&gt;
		a.title=&#039;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function restoreTitle(a) {&lt;br /&gt;
	if ( a.title || !a.originalTitle ) { return; }&lt;br /&gt;
	a.title = a.originalTitle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function registerHooks(np) {&lt;br /&gt;
	var popupMaxWidth=getValueOf(&#039;popupMaxWidth&#039;);&lt;br /&gt;
&lt;br /&gt;
	if (typeof popupMaxWidth === &#039;number&#039;) {&lt;br /&gt;
		var setMaxWidth = function () {&lt;br /&gt;
			np.mainDiv.style.maxWidth = popupMaxWidth + &#039;px&#039;;&lt;br /&gt;
			np.maxWidth = popupMaxWidth;&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				// hack for IE&lt;br /&gt;
				// see http://www.svendtofte.com/code/max_width_in_ie/&lt;br /&gt;
				// use setExpression as documented here on msdn: http://tinyurl dot com/dqljn&lt;br /&gt;
	&lt;br /&gt;
				if (np.mainDiv.style.setExpression) {&lt;br /&gt;
					np.mainDiv.style.setExpression(&lt;br /&gt;
						&#039;width&#039;, &#039;document.body.clientWidth &amp;gt; &#039; +&lt;br /&gt;
						popupMaxWidth + &#039; ? &amp;quot;&#039; +popupMaxWidth + &#039;px&amp;quot;: &amp;quot;auto&amp;quot;&#039;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			catch (errors) {&lt;br /&gt;
				errlog( &amp;quot;Running on IE8 are we not?: &amp;quot; + errors );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
		np.addHook(setMaxWidth, &#039;unhide&#039;, &#039;before&#039;);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.addPopupShortcuts &amp;amp;&amp;amp; window.rmPopupShortcuts) {&lt;br /&gt;
		np.addHook(addPopupShortcuts, &#039;unhide&#039;, &#039;after&#039;);&lt;br /&gt;
		np.addHook(rmPopupShortcuts, &#039;hide&#039;, &#039;before&#039;);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function mouseOverWikiLink(evt) {&lt;br /&gt;
	if (!window.popupsReady || !window.popupsReady()) { return; }&lt;br /&gt;
	if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event;}&lt;br /&gt;
	return mouseOverWikiLink2(this, evt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function footnoteTarget(a) {&lt;br /&gt;
	var aTitle=Title.fromAnchor(a);&lt;br /&gt;
	// We want &amp;quot;.3A&amp;quot; rather than &amp;quot;%3A&amp;quot; or &amp;quot;?&amp;quot; here, so use the anchor property directly&lt;br /&gt;
	var anch = aTitle.anchor;&lt;br /&gt;
	if ( ! /^(cite_note-|_note-|endnote)/.test(anch) ) { return false; }&lt;br /&gt;
&lt;br /&gt;
	var lTitle=Title.fromURL(location.href);&lt;br /&gt;
	if ( lTitle.toString(true) !== aTitle.toString(true) ) { return false; }&lt;br /&gt;
&lt;br /&gt;
	var el=document.getElementById(anch);&lt;br /&gt;
	while ( el &amp;amp;&amp;amp; typeof el.nodeName === &#039;string&#039;) {&lt;br /&gt;
		var nt = el.nodeName.toLowerCase();&lt;br /&gt;
		if ( nt === &#039;li&#039; ) { return el; }&lt;br /&gt;
		else if ( nt === &#039;body&#039; ) { return false; }&lt;br /&gt;
		else if ( el.parentNode ) { el=el.parentNode; }&lt;br /&gt;
		else { return false; }&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function footnotePreview(x, navpop) {&lt;br /&gt;
	setPopupHTML(&#039;&amp;lt;hr&amp;gt;&#039; + x.innerHTML, &#039;popupPreview&#039;,  navpop.idNumber, getValueOf(&#039;popupSubpopups&#039;)&lt;br /&gt;
		? function() { setupTooltips(document.getElementById(&#039;popupPreview&#039; + navpop.idNumber)); }&lt;br /&gt;
		: null);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// var modid=0;&lt;br /&gt;
// if(!window.opera) { window.opera={postError: console.log}; }&lt;br /&gt;
&lt;br /&gt;
function modifierKeyHandler(a) {&lt;br /&gt;
	return function(evt) {&lt;br /&gt;
		//		opera.postError(&#039;modifierKeyHandler called&#039; + (++modid));&lt;br /&gt;
		//		opera.postError(&#039;&#039;+evt + modid);&lt;br /&gt;
		//		for (var i in evt) {&lt;br /&gt;
		//			opera.postError(&#039;&#039; + modid + &#039; &#039; + i + &#039; &#039; + evt[i]);&lt;br /&gt;
		//		}&lt;br /&gt;
		//		opera.postError(&#039;&#039;+evt.ctrlKey + modid);&lt;br /&gt;
		var mod=getValueOf(&#039;popupModifier&#039;);&lt;br /&gt;
		if (!mod) { return true; }&lt;br /&gt;
&lt;br /&gt;
		if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event;}&lt;br /&gt;
		//		opera.postError(&#039;And now....&#039;+modid);&lt;br /&gt;
		//		opera.postError(&#039;&#039;+evt+modid);&lt;br /&gt;
		//		opera.postError(&#039;&#039;+evt.ctrlKey+modid);&lt;br /&gt;
&lt;br /&gt;
		var modPressed = modifierPressed(evt);&lt;br /&gt;
		var action = getValueOf(&#039;popupModifierAction&#039;);&lt;br /&gt;
&lt;br /&gt;
		// FIXME: probable bug - modifierPressed should be modPressed below?&lt;br /&gt;
		if ( action === &#039;disable&#039; &amp;amp;&amp;amp; modifierPressed ) { return true; }&lt;br /&gt;
		if ( action === &#039;enable&#039; &amp;amp;&amp;amp; !modifierPressed ) { return true; }&lt;br /&gt;
&lt;br /&gt;
		mouseOverWikiLink2(a, evt);&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function modifierPressed(evt) {&lt;br /&gt;
		var mod=getValueOf(&#039;popupModifier&#039;);&lt;br /&gt;
		if (!mod) { return false; }&lt;br /&gt;
&lt;br /&gt;
		if (!evt &amp;amp;&amp;amp; window.event) {evt=window.event;}&lt;br /&gt;
//		opera.postError(&#039;And now....&#039;+modid);&lt;br /&gt;
//		opera.postError(&#039;&#039;+evt+modid);&lt;br /&gt;
//		opera.postError(&#039;&#039;+evt.ctrlKey+modid);&lt;br /&gt;
&lt;br /&gt;
		return ( evt &amp;amp;&amp;amp; mod &amp;amp;&amp;amp; evt[mod.toLowerCase() + &#039;Key&#039;] );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dealWithModifier(a,evt) {&lt;br /&gt;
	if (!getValueOf(&#039;popupModifier&#039;)) { return false; }&lt;br /&gt;
	var action = getValueOf(&#039;popupModifierAction&#039;);&lt;br /&gt;
	if ( action ==  &#039;enable&#039; &amp;amp;&amp;amp; !modifierPressed(evt) ||&lt;br /&gt;
	     action == &#039;disable&#039; &amp;amp;&amp;amp;  modifierPressed(evt) ) {&lt;br /&gt;
		// if the modifier is needed and not pressed, listen for it until&lt;br /&gt;
		// we mouseout of this link.&lt;br /&gt;
		restoreTitle(a);&lt;br /&gt;
		var addHandler=&#039;addEventListener&#039;;&lt;br /&gt;
		var rmHandler=&#039;removeEventListener&#039;;&lt;br /&gt;
		var on=&#039;&#039;;&lt;br /&gt;
		if (!document.addEventListener) {&lt;br /&gt;
			addHandler=&#039;attachEvent&#039;;&lt;br /&gt;
			rmHandler=&#039;detachEvent&#039;;&lt;br /&gt;
			on=&#039;on&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (!document[addHandler]) { // forget it&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		a.modifierKeyHandler=modifierKeyHandler(a);&lt;br /&gt;
&lt;br /&gt;
		switch (action) {&lt;br /&gt;
		case &#039;enable&#039;:&lt;br /&gt;
			document[addHandler](on+&#039;keydown&#039;, a.modifierKeyHandler, false);&lt;br /&gt;
			a[addHandler](on+&#039;mouseout&#039;, function() {&lt;br /&gt;
					document[rmHandler](on+&#039;keydown&#039;,&lt;br /&gt;
								a.modifierKeyHandler, false);&lt;br /&gt;
				}, true);&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;disable&#039;:&lt;br /&gt;
			document[addHandler](on+&#039;keyup&#039;, a.modifierKeyHandler, false);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function mouseOverWikiLink2(a, evt) {&lt;br /&gt;
	if (dealWithModifier(a,evt)) { return; }&lt;br /&gt;
	if ( getValueOf(&#039;removeTitles&#039;) ) { removeTitle(a); }&lt;br /&gt;
	if ( a==pg.current.link &amp;amp;&amp;amp; a.navpopup &amp;amp;&amp;amp; a.navpopup.isVisible() ) { return; }&lt;br /&gt;
	pg.current.link=a;&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;simplePopups&#039;) &amp;amp;&amp;amp; pg.option.popupStructure===null) {&lt;br /&gt;
		// reset *default value* of popupStructure&lt;br /&gt;
		setDefault(&#039;popupStructure&#039;, &#039;original&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var article=(new Title()).fromAnchor(a);&lt;br /&gt;
	// set global variable (ugh) to hold article (wikipage)&lt;br /&gt;
	pg.current.article = article;&lt;br /&gt;
&lt;br /&gt;
	if (!a.navpopup) {&lt;br /&gt;
		// FIXME: this doesn&#039;t behave well if you mouse out of a popup&lt;br /&gt;
		// directly into a link with the same href&lt;br /&gt;
		if (pg.current.linksHash[a.href] &amp;amp;&amp;amp; false) {&lt;br /&gt;
			a.navpopup = pg.current.linksHash[a.href];&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			a.navpopup=newNavpopup(a, article);&lt;br /&gt;
			pg.current.linksHash[a.href] = a.navpopup;&lt;br /&gt;
			pg.current.links.push(a);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (a.navpopup.pending===null || a.navpopup.pending!==0) {&lt;br /&gt;
		// either fresh popups or those with unfinshed business are redone from scratch&lt;br /&gt;
		simplePopupContent(a, article);&lt;br /&gt;
	}&lt;br /&gt;
	a.navpopup.showSoonIfStable(a.navpopup.delay);&lt;br /&gt;
&lt;br /&gt;
	getValueOf(&#039;popupInitialWidth&#039;);&lt;br /&gt;
&lt;br /&gt;
	clearInterval(pg.timer.checkPopupPosition);&lt;br /&gt;
	pg.timer.checkPopupPosition=setInterval(checkPopupPosition, 600);&lt;br /&gt;
&lt;br /&gt;
	if(getValueOf(&#039;simplePopups&#039;)) {&lt;br /&gt;
		if (getValueOf(&#039;popupPreviewButton&#039;) &amp;amp;&amp;amp; !a.simpleNoMore) {&lt;br /&gt;
			var d=document.createElement(&#039;div&#039;);&lt;br /&gt;
			d.className=&#039;popupPreviewButtonDiv&#039;;&lt;br /&gt;
			var s=document.createElement(&#039;span&#039;);&lt;br /&gt;
			d.appendChild(s);&lt;br /&gt;
			s.className=&#039;popupPreviewButton&#039;;&lt;br /&gt;
			s[&#039;on&#039; + getValueOf(&#039;popupPreviewButtonEvent&#039;)] = function() {&lt;br /&gt;
				a.simpleNoMore=true;&lt;br /&gt;
				nonsimplePopupContent(a,article);&lt;br /&gt;
			};&lt;br /&gt;
			s.innerHTML=popupString(&#039;show preview&#039;);&lt;br /&gt;
			setPopupHTML(d, &#039;popupPreview&#039;, a.navpopup.idNumber);&lt;br /&gt;
		}&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (a.navpopup.pending!==0 ) {&lt;br /&gt;
		nonsimplePopupContent(a, article);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// simplePopupContent: the content that is shown even when simplePopups is true&lt;br /&gt;
function simplePopupContent(a, article) {&lt;br /&gt;
	/* FIXME hack */ a.navpopup.hasPopupMenu=false;&lt;br /&gt;
	a.navpopup.setInnerHTML(popupHTML(a));&lt;br /&gt;
	fillEmptySpans({navpopup:a.navpopup});&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;popupDraggable&#039;))&lt;br /&gt;
	{&lt;br /&gt;
		var dragHandle = getValueOf(&#039;popupDragHandle&#039;) || null;&lt;br /&gt;
		if (dragHandle &amp;amp;&amp;amp; dragHandle != &#039;all&#039;) {&lt;br /&gt;
			dragHandle += a.navpopup.idNumber;&lt;br /&gt;
		}&lt;br /&gt;
		setTimeout(function(){a.navpopup.makeDraggable(dragHandle);}, 150);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (getValueOf(&#039;popupRedlinkRemoval&#039;) &amp;amp;&amp;amp; a.className==&#039;new&#039;) {&lt;br /&gt;
		setPopupHTML(&#039;&amp;lt;br&amp;gt;&#039;+popupRedlinkHTML(article), &#039;popupRedlink&#039;, a.navpopup.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function debugData(navpopup) {&lt;br /&gt;
	if(getValueOf(&#039;popupDebugging&#039;) &amp;amp;&amp;amp; navpopup.idNumber) {&lt;br /&gt;
		setPopupHTML(&#039;idNumber=&#039;+navpopup.idNumber + &#039;, pending=&#039; + navpopup.pending,&lt;br /&gt;
				 &#039;popupError&#039;, navpopup.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function newNavpopup(a, article) {&lt;br /&gt;
	var navpopup = new Navpopup();&lt;br /&gt;
	navpopup.fuzz=5;&lt;br /&gt;
	navpopup.delay=getValueOf(&#039;popupDelay&#039;)*1000;&lt;br /&gt;
	// increment global counter now&lt;br /&gt;
	navpopup.idNumber = ++pg.idNumber;&lt;br /&gt;
	navpopup.parentAnchor = a;&lt;br /&gt;
	navpopup.parentPopup = (a.popData &amp;amp;&amp;amp; a.popData.owner);&lt;br /&gt;
	navpopup.article = article;&lt;br /&gt;
	registerHooks(navpopup);&lt;br /&gt;
	return navpopup;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function nonsimplePopupContent(a, article) {&lt;br /&gt;
	var diff=null, history=null;&lt;br /&gt;
	var params=parseParams(a.href);&lt;br /&gt;
	var oldid=(typeof params.oldid==&#039;undefined&#039; ? null : params.oldid);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if(getValueOf(&#039;popupPreviewDiffs&#039;) &amp;amp;&amp;amp; window.loadDiff) {&lt;br /&gt;
		diff=params.diff;&lt;br /&gt;
	}&lt;br /&gt;
	if(getValueOf(&#039;popupPreviewHistory&#039;)) {&lt;br /&gt;
		history=(params.action==&#039;history&#039;);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	a.navpopup.pending=0;&lt;br /&gt;
	var x;&lt;br /&gt;
	&lt;br /&gt;
	if (x=footnoteTarget(a)) {&lt;br /&gt;
		footnotePreview(x, a.navpopup);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	} else if ( diff || diff === 0 ) {&lt;br /&gt;
		loadDiff(article, oldid, diff, a.navpopup);&lt;br /&gt;
	} else if ( history ) {&lt;br /&gt;
		loadAPIPreview(&#039;history&#039;, article, a.navpopup);&lt;br /&gt;
	} else if ( pg.re.contribs.test(a.href) ) {&lt;br /&gt;
		loadAPIPreview(&#039;contribs&#039;, article, a.navpopup);&lt;br /&gt;
	} else if ( pg.re.backlinks.test(a.href) ) {&lt;br /&gt;
		loadAPIPreview(&#039;backlinks&#039;, article, a.navpopup);&lt;br /&gt;
	} else if ( // FIXME should be able to get all preview combinations with options&lt;br /&gt;
		article.namespaceId()==pg.nsImageId &amp;amp;&amp;amp;&lt;br /&gt;
		( getValueOf(&#039;imagePopupsForImages&#039;) || ! anchorContainsImage(a) )&lt;br /&gt;
		) {&lt;br /&gt;
		loadAPIPreview(&#039;imagepagepreview&#039;, article, a.navpopup);&lt;br /&gt;
		loadImage(article, a.navpopup);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	} else {&lt;br /&gt;
		if (article.namespaceId() == pg.nsCategoryId &amp;amp;&amp;amp;&lt;br /&gt;
				getValueOf(&#039;popupCategoryMembers&#039;)) {&lt;br /&gt;
			loadAPIPreview(&#039;category&#039;, article, a.navpopup);&lt;br /&gt;
		} else if ((article.namespaceId() == pg.nsUserId || article.namespaceId() == pg.nsUsertalkId) &amp;amp;&amp;amp;&lt;br /&gt;
				getValueOf(&#039;popupUserInfo&#039;)) {&lt;br /&gt;
			loadAPIPreview(&#039;userinfo&#039;, article, a.navpopup);&lt;br /&gt;
		}&lt;br /&gt;
		startArticlePreview(article, oldid, a.navpopup);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function pendingNavpopTask(navpop) {&lt;br /&gt;
	if (navpop &amp;amp;&amp;amp; navpop.pending===null) { navpop.pending=0; }&lt;br /&gt;
	++navpop.pending;&lt;br /&gt;
	debugData(navpop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function completedNavpopTask(navpop) {&lt;br /&gt;
	if (navpop &amp;amp;&amp;amp; navpop.pending) { --navpop.pending; }&lt;br /&gt;
	debugData(navpop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startArticlePreview(article, oldid, navpop) {&lt;br /&gt;
	navpop.redir=0;&lt;br /&gt;
	loadPreview(article, oldid, navpop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loadPreview(article, oldid, navpop) {&lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	if (!navpop.redir) { navpop.originalArticle=article; }&lt;br /&gt;
	if (!navpop.visible &amp;amp;&amp;amp; getValueOf(&#039;popupLazyDownloads&#039;)) {&lt;br /&gt;
		var id=(navpop.redir) ? &#039;DOWNLOAD_PREVIEW_REDIR_HOOK&#039; : &#039;DOWNLOAD_PREVIEW_HOOK&#039;;&lt;br /&gt;
		navpop.addHook(function() {&lt;br /&gt;
				getWiki(article, insertPreview, oldid, navpop);&lt;br /&gt;
				return true; }, &#039;unhide&#039;, &#039;before&#039;, id);&lt;br /&gt;
	} else {&lt;br /&gt;
		getWiki(article, insertPreview, oldid, navpop);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loadPreviewFromRedir(redirMatch, navpop) {&lt;br /&gt;
	// redirMatch is a regex match&lt;br /&gt;
	var target = new Title().fromWikiText(redirMatch[2]);&lt;br /&gt;
	// overwrite (or add) anchor from original target&lt;br /&gt;
	// mediawiki does overwrite; eg [[User:Lupin/foo3#Done]]&lt;br /&gt;
	if ( navpop.article.anchor ) { target.anchor = navpop.article.anchor; }&lt;br /&gt;
	var trailingRubbish=redirMatch[4];&lt;br /&gt;
	navpop.redir++;&lt;br /&gt;
	navpop.redirTarget=target;&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.redirLink) {&lt;br /&gt;
		var warnRedir = redirLink(target, navpop.article);&lt;br /&gt;
		setPopupHTML(warnRedir, &#039;popupWarnRedir&#039;, navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	navpop.article=target;&lt;br /&gt;
	fillEmptySpans({redir: true, redirTarget: target, navpopup:navpop});&lt;br /&gt;
	return loadPreview(target, null,  navpop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function insertPreview(download) {&lt;br /&gt;
	if (!download.owner) { return; }&lt;br /&gt;
&lt;br /&gt;
	var redirMatch = pg.re.redirect.exec(download.data);&lt;br /&gt;
	if (download.owner.redir===0 &amp;amp;&amp;amp; redirMatch) {&lt;br /&gt;
		completedNavpopTask(download.owner);&lt;br /&gt;
		loadPreviewFromRedir(redirMatch, download.owner);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (download.owner.visible || !getValueOf(&#039;popupLazyPreviews&#039;)) {&lt;br /&gt;
		insertPreviewNow(download);&lt;br /&gt;
	} else {&lt;br /&gt;
		var id=(download.owner.redir) ? &#039;PREVIEW_REDIR_HOOK&#039; : &#039;PREVIEW_HOOK&#039;;&lt;br /&gt;
		download.owner.addHook( function(){insertPreviewNow(download); return true;},&lt;br /&gt;
					&#039;unhide&#039;, &#039;after&#039;, id );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function insertPreviewNow(download) {&lt;br /&gt;
	if (!download.owner) { return; }&lt;br /&gt;
	var wikiText=download.data;&lt;br /&gt;
	var navpop=download.owner;&lt;br /&gt;
	completedNavpopTask(navpop);&lt;br /&gt;
	var art=navpop.redirTarget || navpop.originalArticle;&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	makeFixDabs(wikiText, navpop);&lt;br /&gt;
	if (getValueOf(&#039;popupSummaryData&#039;) &amp;amp;&amp;amp; window.getPageInfo) {&lt;br /&gt;
		var info=getPageInfo(wikiText, download);&lt;br /&gt;
		setPopupTrailer(getPageInfo(wikiText, download), navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var imagePage=&#039;&#039;;&lt;br /&gt;
	if (art.namespaceId()==pg.nsImageId) { imagePage=art.toString(); }&lt;br /&gt;
	else { imagePage=getValidImageFromWikiText(wikiText); }&lt;br /&gt;
	if(imagePage) { loadImage(Title.fromWikiText(imagePage), navpop); }&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;popupPreviews&#039;)) { insertArticlePreview(download, art, navpop); }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function insertArticlePreview(download, art, navpop) {&lt;br /&gt;
	if (download &amp;amp;&amp;amp; typeof download.data == typeof &#039;&#039;){&lt;br /&gt;
		if (art.namespaceId()==pg.nsTemplateId &amp;amp;&amp;amp; getValueOf(&#039;popupPreviewRawTemplates&#039;)) {&lt;br /&gt;
			// FIXME compare/consolidate with diff escaping code for wikitext&lt;br /&gt;
			var h=&#039;&amp;lt;hr&amp;gt;&amp;lt;tt&amp;gt;&#039; + download.data.entify().split(&#039;\\n&#039;).join(&#039;&amp;lt;br&amp;gt;\\n&#039;) + &#039;&amp;lt;/tt&amp;gt;&#039;;&lt;br /&gt;
			setPopupHTML(h, &#039;popupPreview&#039;, navpop.idNumber);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			var p=prepPreviewmaker(download.data, art, navpop);&lt;br /&gt;
			p.showPreview();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function prepPreviewmaker(data, article, navpop) {&lt;br /&gt;
	// deal with tricksy anchors&lt;br /&gt;
	var d=anchorize(data, article.anchorString());&lt;br /&gt;
	var urlBase=joinPath([pg.wiki.articlebase, article.urlString()]);&lt;br /&gt;
	var p=new Previewmaker(d, urlBase, navpop);&lt;br /&gt;
	return p;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Try to imitate the way mediawiki generates HTML anchors from section titles&lt;br /&gt;
function anchorize(d, anch) {&lt;br /&gt;
	if (!anch) { return d; }&lt;br /&gt;
	var anchRe=RegExp(&#039;(?:=+\\s*&#039; + literalizeRegex(anch).replace(/[_ ]/g, &#039;[_ ]&#039;) + &#039;\\s*=+|\\{\\{\\s*&#039;+getValueOf(&#039;popupAnchorRegexp&#039;)+&#039;\\s*(?:\\|[^|}]*)*?\\s*&#039;+literalizeRegex(anch)+&#039;\\s*(?:\\|[^}]*)?\}\})&#039;);&lt;br /&gt;
	var match=d.match(anchRe);&lt;br /&gt;
	if(match &amp;amp;&amp;amp; match.length &amp;gt; 0 &amp;amp;&amp;amp; match[0]) { return d.substring(d.indexOf(match[0])); }&lt;br /&gt;
&lt;br /&gt;
	// now try to deal with == foo [[bar|baz]] boom == -&amp;gt; #foo_baz_boom&lt;br /&gt;
	var lines=d.split(&#039;\n&#039;);&lt;br /&gt;
	for (var i=0; i&amp;lt;lines.length; ++i) {&lt;br /&gt;
		lines[i]=lines[i].replace(RegExp(&#039;[[]{2}([^|\\]]*?[|])?(.*?)[\\]]{2}&#039;, &#039;g&#039;), &#039;$2&#039;)&lt;br /&gt;
			.replace(/&#039;&#039;&#039;([^&#039;])/g, &#039;$1&#039;).replace(RegExp(&amp;quot;&#039;&#039;([^&#039;])&amp;quot;, &#039;g&#039;), &#039;$1&#039;);&lt;br /&gt;
		if (lines[i].match(anchRe)) {&lt;br /&gt;
			return d.split(&#039;\n&#039;).slice(i).join(&#039;\n&#039;).replace(RegExp(&#039;^[^=]*&#039;), &#039;&#039;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function killPopup() {&lt;br /&gt;
	if (getValueOf(&#039;popupShortcutKeys&#039;) &amp;amp;&amp;amp; window.rmPopupShortcuts) { rmPopupShortcuts(); }&lt;br /&gt;
	if (!pg) { return; }&lt;br /&gt;
	pg.current.link &amp;amp;&amp;amp; pg.current.link.navpopup &amp;amp;&amp;amp; pg.current.link.navpopup.banish();&lt;br /&gt;
	pg.current.link=null;&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
	if (pg.timer.checkPopupPosition !== null) {&lt;br /&gt;
		clearInterval(pg.timer.checkPopupPosition);&lt;br /&gt;
		pg.timer.checkPopupPosition=null;&lt;br /&gt;
	}&lt;br /&gt;
	return true; // preserve default action&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: actions.js&lt;br /&gt;
// STARTFILE: domdrag.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   The {@link Drag} object, which enables objects to be dragged around.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;pre&amp;gt;&lt;br /&gt;
   *************************************************&lt;br /&gt;
   dom-drag.js&lt;br /&gt;
   09.25.2001&lt;br /&gt;
   www.youngpup.net&lt;br /&gt;
   **************************************************&lt;br /&gt;
   10.28.2001 - fixed minor bug where events&lt;br /&gt;
   sometimes fired off the handle, not the root.&lt;br /&gt;
   *************************************************&lt;br /&gt;
   Pared down, some hooks added by [[User:Lupin]]&lt;br /&gt;
&lt;br /&gt;
   Copyright Aaron Boodman.&lt;br /&gt;
   Saying stupid things daily since March 2001.&lt;br /&gt;
   &amp;lt;/pre&amp;gt;&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Drag object. This is used to make various DOM elements draggable.&lt;br /&gt;
   @constructor&lt;br /&gt;
*/&lt;br /&gt;
function Drag () {&lt;br /&gt;
	/**&lt;br /&gt;
	   Condition to determine whether or not to drag. This function should take one parameter, an Event.&lt;br /&gt;
	   To disable this, set it to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
	   @type Function&lt;br /&gt;
	*/&lt;br /&gt;
	this.startCondition = null;&lt;br /&gt;
	/**&lt;br /&gt;
	   Hook to be run when the drag finishes. This is passed the final coordinates of&lt;br /&gt;
	   the dragged object (two integers, x and y). To disables this, set it to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
	   @type Function&lt;br /&gt;
	*/&lt;br /&gt;
	this.endHook = null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Gets an event in a cross-browser manner.&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.fixE = function(e) {&lt;br /&gt;
	if (typeof e == &#039;undefined&#039;) { e = window.event; }&lt;br /&gt;
	if (typeof e.layerX == &#039;undefined&#039;) { e.layerX = e.offsetX; }&lt;br /&gt;
	if (typeof e.layerY == &#039;undefined&#039;) { e.layerY = e.offsetY; }&lt;br /&gt;
	return e;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Initialises the Drag instance by telling it which object you want to be draggable, and what you want to drag it by.&lt;br /&gt;
   @param {DOMElement} o The &amp;quot;handle&amp;quot; by which &amp;lt;code&amp;gt;oRoot&amp;lt;/code&amp;gt; is dragged.&lt;br /&gt;
   @param {DOMElement} oRoot The object which moves when &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; is dragged, or &amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; if omitted.&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.init = function(o, oRoot) {&lt;br /&gt;
	var dragObj	  = this;&lt;br /&gt;
	this.obj = o;&lt;br /&gt;
	o.onmousedown	= function(e) { dragObj.start.apply( dragObj, [e]); };&lt;br /&gt;
	o.dragging	   = false;&lt;br /&gt;
	o.popups_draggable	  = true;&lt;br /&gt;
	o.hmode		  = true;&lt;br /&gt;
	o.vmode		  = true;&lt;br /&gt;
&lt;br /&gt;
	o.root = oRoot &amp;amp;&amp;amp; oRoot !== null ? oRoot : o ;&lt;br /&gt;
&lt;br /&gt;
	if (isNaN(parseInt(o.root.style.left, 10))) { o.root.style.left   = &amp;quot;0px&amp;quot;; }&lt;br /&gt;
	if (isNaN(parseInt(o.root.style.top,  10))) { o.root.style.top	= &amp;quot;0px&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
	o.root.onthisStart  = function(){};&lt;br /&gt;
	o.root.onthisEnd	= function(){};&lt;br /&gt;
	o.root.onthis	   = function(){};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Starts the drag.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.start = function(e) {&lt;br /&gt;
	var o = this.obj; // = this;&lt;br /&gt;
	e = this.fixE(e);&lt;br /&gt;
	if (this.startCondition &amp;amp;&amp;amp; !this.startCondition(e)) { return; }&lt;br /&gt;
	var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom, 10);&lt;br /&gt;
	var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right,  10);&lt;br /&gt;
	o.root.onthisStart(x, y);&lt;br /&gt;
&lt;br /&gt;
	o.lastMouseX	= e.clientX;&lt;br /&gt;
	o.lastMouseY	= e.clientY;&lt;br /&gt;
&lt;br /&gt;
	var dragObj	  = this;&lt;br /&gt;
	o.onmousemoveDefault	= document.onmousemove;&lt;br /&gt;
	o.dragging			  = true;&lt;br /&gt;
	document.onmousemove	= function(e) { dragObj.drag.apply( dragObj, [e] ); };&lt;br /&gt;
	document.onmouseup	  = function(e) { dragObj.end.apply( dragObj, [e] ); };&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Does the drag.&lt;br /&gt;
   @param {Event} e&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.drag = function(e) {&lt;br /&gt;
	e = this.fixE(e);&lt;br /&gt;
	var o = this.obj;&lt;br /&gt;
&lt;br /&gt;
	var ey	= e.clientY;&lt;br /&gt;
	var ex	= e.clientX;&lt;br /&gt;
	var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom, 10);&lt;br /&gt;
	var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right,  10 );&lt;br /&gt;
	var nx, ny;&lt;br /&gt;
&lt;br /&gt;
	nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));&lt;br /&gt;
	ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));&lt;br /&gt;
&lt;br /&gt;
	this.obj.root.style[o.hmode ? &amp;quot;left&amp;quot; : &amp;quot;right&amp;quot;] = nx + &amp;quot;px&amp;quot;;&lt;br /&gt;
	this.obj.root.style[o.vmode ? &amp;quot;top&amp;quot; : &amp;quot;bottom&amp;quot;] = ny + &amp;quot;px&amp;quot;;&lt;br /&gt;
	this.obj.lastMouseX	= ex;&lt;br /&gt;
	this.obj.lastMouseY	= ey;&lt;br /&gt;
&lt;br /&gt;
	this.obj.root.onthis(nx, ny);&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Ends the drag.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Drag.prototype.end = function()  {&lt;br /&gt;
	document.onmousemove=this.obj.onmousemoveDefault;&lt;br /&gt;
	document.onmouseup   = null;&lt;br /&gt;
	this.obj.dragging	= false;&lt;br /&gt;
	if (this.endHook) {&lt;br /&gt;
		this.endHook( parseInt(this.obj.root.style[this.obj.hmode ? &amp;quot;left&amp;quot; : &amp;quot;right&amp;quot;], 10),&lt;br /&gt;
				  parseInt(this.obj.root.style[this.obj.vmode ? &amp;quot;top&amp;quot; : &amp;quot;bottom&amp;quot;], 10));&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: domdrag.js&lt;br /&gt;
// STARTFILE: structures.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
pg.structures.original={};&lt;br /&gt;
pg.structures.original.popupLayout=function () {&lt;br /&gt;
	return [&#039;popupError&#039;, &#039;popupImage&#039;, &#039;popupTopLinks&#039;, &#039;popupTitle&#039;,&lt;br /&gt;
		&#039;popupData&#039;, &#039;popupOtherLinks&#039;,&lt;br /&gt;
		&#039;popupRedir&#039;, [&#039;popupWarnRedir&#039;, &#039;popupRedirTopLinks&#039;,&lt;br /&gt;
				   &#039;popupRedirTitle&#039;, &#039;popupRedirData&#039;, &#039;popupRedirOtherLinks&#039;],&lt;br /&gt;
		&#039;popupMiscTools&#039;, [&#039;popupRedlink&#039;],&lt;br /&gt;
		&#039;popupPrePreviewSep&#039;, &#039;popupPreview&#039;, &#039;popupSecondPreview&#039;, &#039;popupPreviewMore&#039;, &#039;popupPostPreview&#039;, &#039;popupFixDab&#039;];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupRedirSpans=function () {&lt;br /&gt;
	return [&#039;popupRedir&#039;, &#039;popupWarnRedir&#039;, &#039;popupRedirTopLinks&#039;,&lt;br /&gt;
		&#039;popupRedirTitle&#039;, &#039;popupRedirData&#039;, &#039;popupRedirOtherLinks&#039;];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupTitle=function (x) {&lt;br /&gt;
	log (&#039;defaultstructure.popupTitle&#039;);&lt;br /&gt;
	if (!getValueOf(&#039;popupNavLinks&#039;)) {&lt;br /&gt;
		return navlinkStringToHTML(&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;&#039;,x.article,x.params);&lt;br /&gt;
	}&lt;br /&gt;
	return &#039;&#039;;&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupTopLinks=function (x) {&lt;br /&gt;
	log (&#039;defaultstructure.popupTopLinks&#039;);&lt;br /&gt;
	if (getValueOf(&#039;popupNavLinks&#039;)) { return navLinksHTML(x.article, x.hint, x.params); }&lt;br /&gt;
	return &#039;&#039;;&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupImage=function(x) {&lt;br /&gt;
	log (&#039;original.popupImage, x.article=&#039;+x.article+&#039;, x.navpop.idNumber=&#039;+x.navpop.idNumber);&lt;br /&gt;
	return imageHTML(x.article, x.navpop.idNumber);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.original.popupRedirTitle=pg.structures.original.popupTitle;&lt;br /&gt;
pg.structures.original.popupRedirTopLinks=pg.structures.original.popupTopLinks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function copyStructure(oldStructure, newStructure) {&lt;br /&gt;
	pg.structures[newStructure]={};&lt;br /&gt;
	for (var prop in pg.structures[oldStructure]) {&lt;br /&gt;
		pg.structures[newStructure][prop]=pg.structures[oldStructure][prop];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
copyStructure(&#039;original&#039;, &#039;nostalgia&#039;);&lt;br /&gt;
pg.structures.nostalgia.popupTopLinks=function(x)  {&lt;br /&gt;
	var str=&#039;&#039;;&lt;br /&gt;
	str += &#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink|shortcut= &amp;gt;&amp;gt;&amp;lt;/b&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	// user links&lt;br /&gt;
	// contribs - log - count - email - block&lt;br /&gt;
	// count only if applicable; block only if popupAdminLinks&lt;br /&gt;
	str += &#039;if(user){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	str+=&#039;if(wikimedia){*&amp;lt;&amp;lt;count|shortcut=#&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	str+=&#039;if(ipuser){}else{*&amp;lt;&amp;lt;email|shortcut=E&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;}}&#039;;&lt;br /&gt;
&lt;br /&gt;
	// editing links&lt;br /&gt;
	// talkpage   -&amp;gt; edit|new - history - un|watch - article|edit&lt;br /&gt;
	// other page -&amp;gt; edit - history - un|watch - talk|edit|new&lt;br /&gt;
	var editstr=&#039;&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var editOldidStr=&#039;if(oldid){&amp;lt;&amp;lt;editOld|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;revert|shortcut=v|rv&amp;gt;&amp;gt;|&amp;lt;&amp;lt;edit|cur&amp;gt;&amp;gt;}else{&#039;&lt;br /&gt;
	+ editstr + &#039;}&#039;;&lt;br /&gt;
	var historystr=&#039;&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var watchstr=&#039;&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	str+=&#039;&amp;lt;br&amp;gt;if(talk){&#039; +&lt;br /&gt;
		editOldidStr+&#039;|&amp;lt;&amp;lt;new|shortcut=+&amp;gt;&amp;gt;&#039; + &#039;*&#039; + historystr+&#039;*&#039;+watchstr + &#039;*&#039; +&lt;br /&gt;
		&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;&#039; +&lt;br /&gt;
		&#039;}else{&#039; + // not a talk page&lt;br /&gt;
		editOldidStr + &#039;*&#039; + historystr + &#039;*&#039; + watchstr + &#039;*&#039; +&lt;br /&gt;
		&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;talk|shortcut=t&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;&#039;&lt;br /&gt;
		+ &#039;}&#039;;&lt;br /&gt;
&lt;br /&gt;
	// misc links&lt;br /&gt;
	str += &#039;&amp;lt;br&amp;gt;&amp;lt;&amp;lt;whatLinksHere|shortcut=l&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	str += &#039;if(admin){&amp;lt;br&amp;gt;}else{*}&amp;lt;&amp;lt;move|shortcut=m&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	// admin links&lt;br /&gt;
	str += &#039;if(admin){*&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;*&#039; +&lt;br /&gt;
	&#039;&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	return navlinkStringToHTML(str, x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.nostalgia.popupRedirTopLinks=pg.structures.nostalgia.popupTopLinks;&lt;br /&gt;
&lt;br /&gt;
/** -- fancy -- **/&lt;br /&gt;
copyStructure(&#039;original&#039;, &#039;fancy&#039;);&lt;br /&gt;
pg.structures.fancy.popupTitle=function (x) {&lt;br /&gt;
	return navlinkStringToHTML(&#039;&amp;lt;font size=+0&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/font&amp;gt;&#039;,x.article,x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupTopLinks=function(x) {&lt;br /&gt;
	var hist=&#039;&amp;lt;&amp;lt;history|shortcut=h|hist&amp;gt;&amp;gt;|&amp;lt;&amp;lt;lastEdit|shortcut=/|last&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E|eds&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	var watch=&#039;&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var move=&#039;&amp;lt;&amp;lt;move|shortcut=m|move&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	return navlinkStringToHTML(&#039;if(talk){&#039; +&lt;br /&gt;
				   &#039;&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;new|shortcut=+|+&amp;gt;&amp;gt;*&#039; + hist + &#039;*&#039; +&lt;br /&gt;
				   &#039;&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;&#039; + &#039;*&#039; + watch + &#039;*&#039; + move +&lt;br /&gt;
				   &#039;}else{&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;*&#039; + hist +&lt;br /&gt;
				   &#039;*&amp;lt;&amp;lt;talk|shortcut=t|&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;&#039; +&lt;br /&gt;
				   &#039;*&#039; + watch + &#039;*&#039; + move+&#039;}&amp;lt;br&amp;gt;&#039;, x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupOtherLinks=function(x) {&lt;br /&gt;
	var admin=&#039;&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;*&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d|del&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var user=&#039;&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;if(wikimedia){|&amp;lt;&amp;lt;count|shortcut=#|#&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	user+=&#039;if(ipuser){|&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}else{*&amp;lt;&amp;lt;email|shortcut=E|&#039;+&lt;br /&gt;
	popupString(&#039;email&#039;)+&#039;&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
&lt;br /&gt;
	var normal=&#039;&amp;lt;&amp;lt;whatLinksHere|shortcut=l|links here&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r|related&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	return navlinkStringToHTML(&#039;&amp;lt;br&amp;gt;if(user){&#039; + user + &#039;*}if(admin){&#039;+admin+&#039;if(user){&amp;lt;br&amp;gt;}else{*}}&#039; + normal,&lt;br /&gt;
				   x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy.popupRedirTitle=pg.structures.fancy.popupTitle;&lt;br /&gt;
pg.structures.fancy.popupRedirTopLinks=pg.structures.fancy.popupTopLinks;&lt;br /&gt;
pg.structures.fancy.popupRedirOtherLinks=pg.structures.fancy.popupOtherLinks;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** -- fancy2 -- **/&lt;br /&gt;
// hack for [[User:MacGyverMagic]]&lt;br /&gt;
copyStructure(&#039;fancy&#039;, &#039;fancy2&#039;);&lt;br /&gt;
pg.structures.fancy2.popupTopLinks=function(x) { // hack out the &amp;lt;br&amp;gt; at the end and put one at the beginning&lt;br /&gt;
	return &#039;&amp;lt;br&amp;gt;&#039;+pg.structures.fancy.popupTopLinks(x).replace(RegExp(&#039;&amp;lt;br&amp;gt;$&#039;,&#039;i&#039;),&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.fancy2.popupLayout=function () { // move toplinks to after the title&lt;br /&gt;
	return [&#039;popupError&#039;, &#039;popupImage&#039;, &#039;popupTitle&#039;, &#039;popupData&#039;, &#039;popupTopLinks&#039;, &#039;popupOtherLinks&#039;,&lt;br /&gt;
		&#039;popupRedir&#039;, [&#039;popupWarnRedir&#039;, &#039;popupRedirTopLinks&#039;, &#039;popupRedirTitle&#039;, &#039;popupRedirData&#039;, &#039;popupRedirOtherLinks&#039;],&lt;br /&gt;
		&#039;popupMiscTools&#039;, [&#039;popupRedlink&#039;],&lt;br /&gt;
		&#039;popupPrePreviewSep&#039;, &#039;popupPreview&#039;, &#039;popupSecondPreview&#039;, &#039;popupPreviewMore&#039;, &#039;popupPostPreview&#039;, &#039;popupFixDab&#039;];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/** -- menus -- **/&lt;br /&gt;
copyStructure(&#039;original&#039;, &#039;menus&#039;);&lt;br /&gt;
pg.structures.menus.popupLayout=function () {&lt;br /&gt;
	return [&#039;popupError&#039;, &#039;popupImage&#039;, &#039;popupTopLinks&#039;, &#039;popupTitle&#039;, &#039;popupOtherLinks&#039;,&lt;br /&gt;
		&#039;popupRedir&#039;, [&#039;popupWarnRedir&#039;, &#039;popupRedirTopLinks&#039;, &#039;popupRedirTitle&#039;, &#039;popupRedirData&#039;, &#039;popupRedirOtherLinks&#039;],&lt;br /&gt;
		&#039;popupData&#039;, &#039;popupMiscTools&#039;, [&#039;popupRedlink&#039;],&lt;br /&gt;
		&#039;popupPrePreviewSep&#039;, &#039;popupPreview&#039;, &#039;popupSecondPreview&#039;, &#039;popupPreviewMore&#039;, &#039;popupPostPreview&#039;, &#039;popupFixDab&#039;];&lt;br /&gt;
};&lt;br /&gt;
function toggleSticky(uid) {&lt;br /&gt;
	var popDiv=document.getElementById(&#039;navpopup_maindiv&#039;+uid);&lt;br /&gt;
	if (!popDiv) { return; }&lt;br /&gt;
	if (!popDiv.navpopup.sticky) { popDiv.navpopup.stick(); }&lt;br /&gt;
	else {&lt;br /&gt;
		popDiv.navpopup.unstick();&lt;br /&gt;
		popDiv.navpopup.hide();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
pg.structures.menus.popupTopLinks = function (x, shorter) {&lt;br /&gt;
	// FIXME maybe this stuff should be cached&lt;br /&gt;
	var s=[];&lt;br /&gt;
	var dropdiv=&#039;&amp;lt;div class=&amp;quot;popup_drop&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
	var enddiv=&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	var endspan=&#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	var hist=&#039;&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	if (!shorter) { hist = &#039;&amp;lt;menurow&amp;gt;&#039; + hist +&lt;br /&gt;
			&#039;|&amp;lt;&amp;lt;historyfeed|rss&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E&amp;gt;&amp;gt;}&amp;lt;/menurow&amp;gt;&#039;; }&lt;br /&gt;
	var lastedit=&#039;&amp;lt;&amp;lt;lastEdit|shortcut=/|show last edit&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var jsHistory=&#039;&amp;lt;&amp;lt;lastContrib|last set of edits&amp;gt;&amp;gt;&amp;lt;&amp;lt;sinceMe|changes since mine&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var linkshere=&#039;&amp;lt;&amp;lt;whatLinksHere|shortcut=l|what links here&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var related=&#039;&amp;lt;&amp;lt;relatedChanges|shortcut=r|related changes&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var search=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;search|shortcut=s&amp;gt;&amp;gt;if(wikimedia){|&amp;lt;&amp;lt;globalsearch|shortcut=g|global&amp;gt;&amp;gt;}&#039; +&lt;br /&gt;
	&#039;|&amp;lt;&amp;lt;google|shortcut=G|web&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var watch=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var protect=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&#039; +&lt;br /&gt;
	&#039;&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protectlog|log&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var del=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;|&#039; +&lt;br /&gt;
	&#039;&amp;lt;&amp;lt;deletelog|log&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var move=&#039;&amp;lt;&amp;lt;move|shortcut=m|move page&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var nullPurge=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;nullEdit|shortcut=n|null edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;purge|shortcut=P&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var viewOptions=&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;view|shortcut=v&amp;gt;&amp;gt;|&amp;lt;&amp;lt;render|shortcut=S&amp;gt;&amp;gt;|&amp;lt;&amp;lt;raw&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;;&lt;br /&gt;
	var editRow=&#039;if(oldid){&#039; +&lt;br /&gt;
	&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;editOld|shortcut=e|this&amp;amp;nbsp;revision&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039; +&lt;br /&gt;
	&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;revert|shortcut=v&amp;gt;&amp;gt;|&amp;lt;&amp;lt;undo&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039; + &#039;}else{&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	var markPatrolled=&#039;if(rcid){&amp;lt;&amp;lt;markpatrolled|mark patrolled&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	var newTopic=&#039;if(talk){&amp;lt;&amp;lt;new|shortcut=+|new topic&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	var protectDelete=&#039;if(admin){&#039; + protect + del + &#039;}&#039;;&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;popupActionsMenu&#039;)) {&lt;br /&gt;
		s.push( &#039;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;*&#039; + dropdiv + menuTitle(&#039;actions&#039;));&lt;br /&gt;
	} else {&lt;br /&gt;
		s.push( dropdiv + &#039;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	s.push( &#039;&amp;lt;menu&amp;gt;&#039;);&lt;br /&gt;
	s.push( editRow + markPatrolled + newTopic + hist + lastedit );&lt;br /&gt;
	if (!shorter) { s.push(jsHistory); }&lt;br /&gt;
	s.push( move + linkshere + related);&lt;br /&gt;
	if (!shorter) { s.push(nullPurge + search); }&lt;br /&gt;
	if (!shorter) { s.push(viewOptions); }&lt;br /&gt;
	s.push(&#039;&amp;lt;hr&amp;gt;&#039; + watch + protectDelete);&lt;br /&gt;
	s.push(&#039;&amp;lt;hr&amp;gt;&#039; +&lt;br /&gt;
		   &#039;if(talk){&amp;lt;&amp;lt;article|shortcut=a|view article&amp;gt;&amp;gt;&amp;lt;&amp;lt;editArticle|edit article&amp;gt;&amp;gt;}&#039; +&lt;br /&gt;
		   &#039;else{&amp;lt;&amp;lt;talk|shortcut=t|talk page&amp;gt;&amp;gt;&amp;lt;&amp;lt;editTalk|edit talk&amp;gt;&amp;gt;&#039; +&lt;br /&gt;
		   &#039;&amp;lt;&amp;lt;newTalk|shortcut=+|new topic&amp;gt;&amp;gt;}&amp;lt;/menu&amp;gt;&#039; + enddiv);&lt;br /&gt;
&lt;br /&gt;
	// user menu starts here&lt;br /&gt;
	var email=&#039;&amp;lt;&amp;lt;email|shortcut=E|email user&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var contribs=	&#039;if(wikimedia){&amp;lt;menurow&amp;gt;}&amp;lt;&amp;lt;contribs|shortcut=c|contributions&amp;gt;&amp;gt;if(wikimedia){&amp;lt;/menurow&amp;gt;}&#039; +&lt;br /&gt;
	&#039;if(admin){&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;deletedContribs&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;}&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	s.push(&#039;if(user){*&#039; + dropdiv + menuTitle(&#039;user&#039;));&lt;br /&gt;
	s.push(&#039;&amp;lt;menu&amp;gt;&#039;); +&lt;br /&gt;
	s.push(&#039;&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;userPage|shortcut=u|user&amp;amp;nbsp;page&amp;gt;&amp;gt;|&amp;lt;&amp;lt;userSpace|space&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;&#039;);&lt;br /&gt;
	s.push(&#039;&amp;lt;&amp;lt;userTalk|shortcut=t|user talk&amp;gt;&amp;gt;&amp;lt;&amp;lt;editUserTalk|edit user talk&amp;gt;&amp;gt;&#039; +&lt;br /&gt;
		   &#039;&amp;lt;&amp;lt;newUserTalk|shortcut=+|leave comment&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
	if(!shorter) { s.push( &#039;if(ipuser){&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}else{&#039; + email + &#039;}&#039; ); }&lt;br /&gt;
	else { s.push( &#039;if(ipuser){}else{&#039; + email + &#039;}&#039; ); }&lt;br /&gt;
	s.push(&#039;&amp;lt;hr&amp;gt;&#039; + contribs + &#039;&amp;lt;&amp;lt;userlog|shortcut=L|user log&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
	s.push(&#039;if(wikimedia){&amp;lt;&amp;lt;count|shortcut=#|edit counter&amp;gt;&amp;gt;}&#039;);&lt;br /&gt;
	s.push(&#039;if(admin){&amp;lt;menurow&amp;gt;&amp;lt;&amp;lt;unblock|unblockShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;block|shortcut=b|block user&amp;gt;&amp;gt;&amp;lt;/menurow&amp;gt;}&#039;);&lt;br /&gt;
	s.push(&#039;&amp;lt;&amp;lt;blocklog|shortcut=B|block log&amp;gt;&amp;gt;&#039; + getValueOf(&#039;popupExtraUserMenu&#039;));&lt;br /&gt;
	s.push(&#039;&amp;lt;/menu&amp;gt;&#039;  + enddiv + &#039;}&#039;);&lt;br /&gt;
&lt;br /&gt;
	// popups menu starts here&lt;br /&gt;
	if (getValueOf(&#039;popupSetupMenu&#039;) &amp;amp;&amp;amp; !x.navpop.hasPopupMenu /* FIXME: hack */) {&lt;br /&gt;
		x.navpop.hasPopupMenu=true;&lt;br /&gt;
		s.push(&#039;*&#039; + dropdiv + menuTitle(&#039;popupsMenu&#039;) + &#039;&amp;lt;menu&amp;gt;&#039;);&lt;br /&gt;
		s.push(&#039;&amp;lt;&amp;lt;togglePreviews|toggle previews&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
		s.push(&#039;&amp;lt;&amp;lt;purgePopups|reset&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
		s.push(&#039;&amp;lt;&amp;lt;disablePopups|disable&amp;gt;&amp;gt;&#039;);&lt;br /&gt;
		s.push(&#039;&amp;lt;/menu&amp;gt;&#039;+enddiv);&lt;br /&gt;
	}&lt;br /&gt;
	return navlinkStringToHTML(s.join(&#039;&#039;), x.article, x.params);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function menuTitle(s) {&lt;br /&gt;
	return &#039;&amp;lt;a href=&amp;quot;#&amp;quot; noPopup=1&amp;gt;&#039; + popupString(s) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pg.structures.menus.popupRedirTitle=pg.structures.menus.popupTitle;&lt;br /&gt;
pg.structures.menus.popupRedirTopLinks=pg.structures.menus.popupTopLinks;&lt;br /&gt;
&lt;br /&gt;
copyStructure(&#039;menus&#039;, &#039;shortmenus&#039;);&lt;br /&gt;
pg.structures.shortmenus.popupTopLinks=function(x) {&lt;br /&gt;
	return pg.structures.menus.popupTopLinks(x,true);&lt;br /&gt;
};&lt;br /&gt;
pg.structures.shortmenus.popupRedirTopLinks=pg.structures.shortmenus.popupTopLinks;&lt;br /&gt;
&lt;br /&gt;
copyStructure(&#039;shortmenus&#039;, &#039;dabshortmenus&#039;);&lt;br /&gt;
pg.structures.dabshortmenus.popupLayout=function () {&lt;br /&gt;
	return [&#039;popupError&#039;, &#039;popupImage&#039;, &#039;popupTopLinks&#039;, &#039;popupTitle&#039;, &#039;popupOtherLinks&#039;,&lt;br /&gt;
		&#039;popupRedir&#039;, [&#039;popupWarnRedir&#039;, &#039;popupRedirTopLinks&#039;, &#039;popupRedirTitle&#039;, &#039;popupRedirData&#039;, &#039;popupRedirOtherLinks&#039;],&lt;br /&gt;
		&#039;popupData&#039;, &#039;popupMiscTools&#039;, [&#039;popupRedlink&#039;], &#039;popupFixDab&#039;,&lt;br /&gt;
		&#039;popupPrePreviewSep&#039;, &#039;popupPreview&#039;, &#039;popupSecondPreview&#039;, &#039;popupPreviewMore&#039;, &#039;popupPostPreview&#039;];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
copyStructure(&#039;menus&#039;, &#039;dabmenus&#039;);&lt;br /&gt;
pg.structures.dabmenus.popupLayout=pg.structures.dabshortmenus.popupLayout;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
pg.structures.lite={};&lt;br /&gt;
pg.structures.lite.popupLayout=function () {&lt;br /&gt;
	return [&#039;popupTitle&#039;, &#039;popupPreview&#039; ];&lt;br /&gt;
};&lt;br /&gt;
pg.structures.lite.popupTitle=function (x) {&lt;br /&gt;
	log (x.article + &#039;: structures.lite.popupTitle&#039;);&lt;br /&gt;
	//return navlinkStringToHTML(&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;&#039;,x.article,x.params);&lt;br /&gt;
	return &#039;&amp;lt;div&amp;gt;&amp;lt;span class=&amp;quot;popup_mainlink&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + x.article.toString() + &#039;&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: structures.js&lt;br /&gt;
// STARTFILE: autoedit.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function getParamValue(paramName, h) {&lt;br /&gt;
	if (typeof h == &#039;undefined&#039; ) { h = document.location.href; }&lt;br /&gt;
	var cmdRe=RegExp(&#039;[&amp;amp;?]&#039;+paramName+&#039;=([^&amp;amp;]*)&#039;);&lt;br /&gt;
	var m=cmdRe.exec(h);&lt;br /&gt;
	if (m) {&lt;br /&gt;
		try {&lt;br /&gt;
			return decodeURIComponent(m[1]);&lt;br /&gt;
		} catch (someError) {}&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function substitute(data,cmdBody) {&lt;br /&gt;
	// alert(&#039;sub\nfrom: &#039;+cmdBody.from+&#039;\nto: &#039;+cmdBody.to+&#039;\nflags: &#039;+cmdBody.flags);&lt;br /&gt;
	var fromRe=RegExp(cmdBody.from, cmdBody.flags);&lt;br /&gt;
	return data.replace(fromRe, cmdBody.to);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function execCmds(data, cmdList) {&lt;br /&gt;
	for (var i=0; i&amp;lt;cmdList.length; ++i) {&lt;br /&gt;
		data=cmdList[i].action(data, cmdList[i]);&lt;br /&gt;
	}&lt;br /&gt;
	return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function parseCmd(str) {&lt;br /&gt;
	// returns a list of commands&lt;br /&gt;
	if (!str.length) { return []; }&lt;br /&gt;
	var p=false;&lt;br /&gt;
	switch (str.charAt(0)) {&lt;br /&gt;
	case &#039;s&#039;:&lt;br /&gt;
		p=parseSubstitute(str);&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	if (p) { return [p].concat(parseCmd(p.remainder)); }&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function unEscape(str, sep) {&lt;br /&gt;
	return str.split(&#039;\\\\&#039;).join(&#039;\\&#039;).split(&#039;\\&#039;+sep).join(sep).split(&#039;\\n&#039;).join(&#039;\n&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function parseSubstitute(str) {&lt;br /&gt;
	// takes a string like s/a/b/flags;othercmds and parses it&lt;br /&gt;
&lt;br /&gt;
	var from,to,flags,tmp;&lt;br /&gt;
&lt;br /&gt;
	if (str.length&amp;lt;4) { return false; }&lt;br /&gt;
	var sep=str.charAt(1);&lt;br /&gt;
	str=str.substring(2);&lt;br /&gt;
&lt;br /&gt;
	tmp=skipOver(str,sep);&lt;br /&gt;
	if (tmp) { from=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	else { return false; }&lt;br /&gt;
&lt;br /&gt;
	tmp=skipOver(str,sep);&lt;br /&gt;
	if (tmp) { to=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	else { return false; }&lt;br /&gt;
&lt;br /&gt;
	flags=&#039;&#039;;&lt;br /&gt;
	if (str.length) {&lt;br /&gt;
		tmp=skipOver(str,&#039;;&#039;) || skipToEnd(str, &#039;;&#039;);&lt;br /&gt;
		if (tmp) {flags=tmp.segment; str=tmp.remainder; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return {action: substitute, from: from, to: to, flags: flags, remainder: str};&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function skipOver(str,sep) {&lt;br /&gt;
	var endSegment=findNext(str,sep);&lt;br /&gt;
	if (endSegment&amp;lt;0) { return false; }&lt;br /&gt;
	var segment=unEscape(str.substring(0,endSegment), sep);&lt;br /&gt;
	return {segment: segment, remainder: str.substring(endSegment+1)};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function skipToEnd(str,sep) {&lt;br /&gt;
	return {segment: str, remainder: &#039;&#039;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function findNext(str, ch) {&lt;br /&gt;
	for (var i=0; i&amp;lt;str.length; ++i) {&lt;br /&gt;
		if (str.charAt(i)==&#039;\\&#039;) { i+=2; }&lt;br /&gt;
		if (str.charAt(i)==ch) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setCheckbox(param, box) {&lt;br /&gt;
	var val=getParamValue(param);&lt;br /&gt;
	if (val!==null) {&lt;br /&gt;
		switch (val) {&lt;br /&gt;
		case &#039;1&#039;: case &#039;yes&#039;: case &#039;true&#039;:&lt;br /&gt;
			box.checked=true;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;0&#039;: case &#039;no&#039;:  case &#039;false&#039;:&lt;br /&gt;
			box.checked=false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function autoEdit() {&lt;br /&gt;
	if (!setupPopups.completed) { setupPopups(); }&lt;br /&gt;
	if (!window.wgEnableAPI || !wgEnableAPI ) { return false; }&lt;br /&gt;
	if (getParamValue(&#039;autowatchlist&#039;) &amp;amp;&amp;amp; getParamValue(&#039;actoken&#039;)===autoClickToken()) {&lt;br /&gt;
		modifyWatchlist(getParamValue(&#039;title&#039;), getParamValue(&#039;action&#039;));&lt;br /&gt;
	}&lt;br /&gt;
	if (!document.editform) { return false; }&lt;br /&gt;
	if (window.autoEdit.alreadyRan) { return false; }&lt;br /&gt;
	window.autoEdit.alreadyRan=true;&lt;br /&gt;
	var cmdString=getParamValue(&#039;autoedit&#039;);&lt;br /&gt;
	if (cmdString) {&lt;br /&gt;
		try {&lt;br /&gt;
			var editbox=document.editform.wpTextbox1;&lt;br /&gt;
		} catch (dang) { return; }&lt;br /&gt;
		var cmdList=parseCmd(cmdString);&lt;br /&gt;
		var input=editbox.value;&lt;br /&gt;
		var output=execCmds(input, cmdList);&lt;br /&gt;
		editbox.value=output;&lt;br /&gt;
		// wikEd user script compatibility&lt;br /&gt;
		if (typeof(wikEdUseWikEd) != &#039;undefined&#039;) {&lt;br /&gt;
			if (wikEdUseWikEd === true) {&lt;br /&gt;
				WikEdUpdateFrame();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	setCheckbox(&#039;autominor&#039;, document.editform.wpMinoredit);&lt;br /&gt;
	setCheckbox(&#039;autowatch&#039;, document.editform.wpWatchthis);&lt;br /&gt;
&lt;br /&gt;
	var rvid = getParamValue(&#039;autorv&#039;);&lt;br /&gt;
	if (rvid) {&lt;br /&gt;
		var url=pg.wiki.apiwikibase + &#039;?action=query&amp;amp;format=json&amp;amp;prop=revisions&amp;amp;revids=&#039;+rvid;&lt;br /&gt;
		startDownload(url, null, autoEdit2);&lt;br /&gt;
	} else { autoEdit2(); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function autoEdit2(d) {&lt;br /&gt;
	var summary=getParamValue(&#039;autosummary&#039;);&lt;br /&gt;
	var summaryprompt=getParamValue(&#039;autosummaryprompt&#039;);&lt;br /&gt;
	var summarynotice=&#039;&#039;;&lt;br /&gt;
	if (d &amp;amp;&amp;amp; d.data &amp;amp;&amp;amp; getParamValue(&#039;autorv&#039;)) {&lt;br /&gt;
		var s = getRvSummary(summary, d.data);&lt;br /&gt;
		if (s===false) {&lt;br /&gt;
			summaryprompt=true;&lt;br /&gt;
			summarynotice=popupString(&#039;Failed to get revision information, please edit manually.\n\n&#039;);&lt;br /&gt;
			summary = simplePrintf(summary, [getParamValue(&#039;autorv&#039;), &#039;(unknown)&#039;, &#039;(unknown)&#039;]);&lt;br /&gt;
		} else { summary = s; }&lt;br /&gt;
	}&lt;br /&gt;
	if (summaryprompt) {&lt;br /&gt;
		var txt= summarynotice +&lt;br /&gt;
			popupString(&#039;Enter a non-empty edit summary or press cancel to abort&#039;);&lt;br /&gt;
		var response=prompt(txt, summary);&lt;br /&gt;
		if (response) { summary=response; }&lt;br /&gt;
		else { return; }&lt;br /&gt;
	}&lt;br /&gt;
	if (summary) { document.editform.wpSummary.value=summary; }&lt;br /&gt;
	// Attempt to avoid possible premature clicking of the save button&lt;br /&gt;
	// (maybe delays in updates to the DOM are to blame?? or a red herring)&lt;br /&gt;
	setTimeout(autoEdit3, 100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function autoClickToken() {&lt;br /&gt;
	return mw.user.sessionId();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function autoEdit3() {&lt;br /&gt;
	if( getParamValue(&#039;actoken&#039;) != autoClickToken()) { return; }&lt;br /&gt;
&lt;br /&gt;
	var btn=getParamValue(&#039;autoclick&#039;);&lt;br /&gt;
	if (btn) {&lt;br /&gt;
		if (document.editform &amp;amp;&amp;amp; document.editform[btn]) {&lt;br /&gt;
			var button=document.editform[btn];&lt;br /&gt;
			var msg=tprintf(&#039;The %s button has been automatically clicked. Please wait for the next page to load.&#039;,&lt;br /&gt;
					[ button.value ]);&lt;br /&gt;
			bannerMessage(msg);&lt;br /&gt;
			document.title=&#039;(&#039;+document.title+&#039;)&#039;;&lt;br /&gt;
			button.click();&lt;br /&gt;
		} else {&lt;br /&gt;
			alert(tprintf(&#039;Could not find button %s. Please check the settings in your javascript file.&#039;,&lt;br /&gt;
					  [ btn ]));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function bannerMessage(s) {&lt;br /&gt;
	var headings=document.getElementsByTagName(&#039;h1&#039;);&lt;br /&gt;
	if (headings) {&lt;br /&gt;
		var div=document.createElement(&#039;div&#039;);&lt;br /&gt;
		div.innerHTML=&#039;&amp;lt;font size=+1&amp;gt;&amp;lt;b&amp;gt;&#039; + s + &#039;&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&#039;;&lt;br /&gt;
		headings[0].parentNode.insertBefore(div, headings[0]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getRvSummary(template, json) {&lt;br /&gt;
	try {&lt;br /&gt;
		var o=getJsObj(json);&lt;br /&gt;
		var edit = anyChild(o.query.pages).revisions[0];&lt;br /&gt;
	} catch (badness) {return false;}&lt;br /&gt;
	var timestamp = edit.timestamp.split(/[A-Z]/g).join(&#039; &#039;).replace(/^ *| *$/g, &#039;&#039;);&lt;br /&gt;
	return simplePrintf(template, [edit.revid, timestamp, edit.user]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: autoedit.js&lt;br /&gt;
// STARTFILE: downloader.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   {@link Downloader}, a xmlhttprequest wrapper, and helper functions.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Downloader&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Downloader class. Create a new instance of this class to download stuff.&lt;br /&gt;
   @param {String} url The url to download. This can be omitted and supplied later.&lt;br /&gt;
*/&lt;br /&gt;
function Downloader(url) {&lt;br /&gt;
	// Source: http://jibbering.com/2002/4/httprequest.html&lt;br /&gt;
	/** xmlhttprequest object which we&#039;re wrapping */&lt;br /&gt;
	this.http = false;&lt;br /&gt;
&lt;br /&gt;
	/*@cc_on @*/&lt;br /&gt;
	/*@if (@_jscript_version &amp;gt;= 5)&lt;br /&gt;
	// JScript gives us Conditional compilation,&lt;br /&gt;
	// we can cope with old IE versions.&lt;br /&gt;
	// and security blocked creation of the objects.&lt;br /&gt;
	try {&lt;br /&gt;
	this.http = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;
	} catch (e) {&lt;br /&gt;
	try {&lt;br /&gt;
	this.http = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
	} catch (E) {&lt;br /&gt;
	// this.http = false;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	@end @*/&lt;br /&gt;
&lt;br /&gt;
	if (! this.http &amp;amp;&amp;amp; typeof XMLHttpRequest!=&#039;undefined&#039;) { this.http = new XMLHttpRequest(); }&lt;br /&gt;
	/**&lt;br /&gt;
		The url to download&lt;br /&gt;
		@type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.url = url;&lt;br /&gt;
	/**&lt;br /&gt;
		A universally unique ID number&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.id=null;&lt;br /&gt;
	/**&lt;br /&gt;
		Modification date, to be culled from the incoming headers&lt;br /&gt;
		@type Date&lt;br /&gt;
		@private&lt;br /&gt;
	*/&lt;br /&gt;
	this.lastModified = null;&lt;br /&gt;
	/**&lt;br /&gt;
		What to do when the download completes successfully&lt;br /&gt;
		@type Function&lt;br /&gt;
		@private&lt;br /&gt;
	*/&lt;br /&gt;
	this.callbackFunction = null;&lt;br /&gt;
	/**&lt;br /&gt;
		What to do on failure&lt;br /&gt;
		@type Function&lt;br /&gt;
		@private&lt;br /&gt;
	*/&lt;br /&gt;
	this.onFailure = null;&lt;br /&gt;
	/**&lt;br /&gt;
		Flag set on &amp;lt;code&amp;gt;abort&amp;lt;/code&amp;gt;&lt;br /&gt;
		@type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.aborted = false;&lt;br /&gt;
	/**&lt;br /&gt;
	   HTTP method. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html for possibilities.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.method=&#039;GET&#039;;&lt;br /&gt;
	/**&lt;br /&gt;
		Async flag.&lt;br /&gt;
		@type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.async=true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
new Downloader();&lt;br /&gt;
&lt;br /&gt;
/** Submits the http request. */&lt;br /&gt;
Downloader.prototype.send = function (x) {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	return this.http.send(x);&lt;br /&gt;
};&lt;br /&gt;
/** Aborts the download, setting the &amp;lt;code&amp;gt;aborted&amp;lt;/code&amp;gt; field to true.  */&lt;br /&gt;
Downloader.prototype.abort = function () {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	this.aborted=true;&lt;br /&gt;
	return this.http.abort();&lt;br /&gt;
};&lt;br /&gt;
/** Returns the downloaded data. */&lt;br /&gt;
Downloader.prototype.getData = function () {if (!this.http) { return null; } return this.http.responseText;};&lt;br /&gt;
/** Prepares the download. */&lt;br /&gt;
Downloader.prototype.setTarget = function () {&lt;br /&gt;
	if (!this.http) { return null; }&lt;br /&gt;
	this.http.open(this.method, this.url, this.async);&lt;br /&gt;
};&lt;br /&gt;
/** Gets the state of the download. */&lt;br /&gt;
Downloader.prototype.getReadyState=function () {if (!this.http) { return null; } return this.http.readyState;};&lt;br /&gt;
&lt;br /&gt;
pg.misc.downloadsInProgress = { };&lt;br /&gt;
&lt;br /&gt;
/** Starts the download.&lt;br /&gt;
	Note that setTarget {@link Downloader#setTarget} must be run first&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.start=function () {&lt;br /&gt;
	if (!this.http) { return; }&lt;br /&gt;
	pg.misc.downloadsInProgress[this.id] = this;&lt;br /&gt;
	this.http.send(null);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/** Gets the &#039;Last-Modified&#039; date from the download headers.&lt;br /&gt;
	Should be run after the download completes.&lt;br /&gt;
	Returns &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; on failure.&lt;br /&gt;
	@return {Date}&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.getLastModifiedDate=function () {&lt;br /&gt;
	if(!this.http) { return null; }&lt;br /&gt;
	var lastmod=null;&lt;br /&gt;
	try {&lt;br /&gt;
		lastmod=this.http.getResponseHeader(&#039;Last-Modified&#039;);&lt;br /&gt;
	} catch (err) {}&lt;br /&gt;
	if (lastmod) { return new Date(lastmod); }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/** Sets the callback function.&lt;br /&gt;
	@param {Function} f callback function, called as &amp;lt;code&amp;gt;f(this)&amp;lt;/code&amp;gt; on success&lt;br /&gt;
*/&lt;br /&gt;
Downloader.prototype.setCallback = function (f) {&lt;br /&gt;
	if(!this.http) { return; }&lt;br /&gt;
	this.http.onreadystatechange = f;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Downloader.prototype.getStatus = function() { if (!this.http) { return null; } return this.http.status; };&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// helper functions&lt;br /&gt;
&lt;br /&gt;
/** Creates a new {@link Downloader} and prepares it for action.&lt;br /&gt;
	@param {String} url The url to download&lt;br /&gt;
	@param {integer} id The ID of the {@link Downloader} object&lt;br /&gt;
	@param {Function} callback The callback function invoked on success&lt;br /&gt;
	@return {String/Downloader} the {@link Downloader} object created, or &#039;ohdear&#039; if an unsupported browser&lt;br /&gt;
*/&lt;br /&gt;
function newDownload(url, id, callback, onfailure) {&lt;br /&gt;
	var d=new Downloader(url);&lt;br /&gt;
	if (!d.http) { return &#039;ohdear&#039;; }&lt;br /&gt;
	d.id=id;&lt;br /&gt;
	d.setTarget();&lt;br /&gt;
	if (!onfailure) {&lt;br /&gt;
		onfailure=2;&lt;br /&gt;
	}&lt;br /&gt;
	var f = function () {&lt;br /&gt;
		if (d.getReadyState() == 4) {&lt;br /&gt;
			delete pg.misc.downloadsInProgress[this.id];&lt;br /&gt;
			try {&lt;br /&gt;
				if ( d.getStatus() == 200 ) {&lt;br /&gt;
					d.data=d.getData();&lt;br /&gt;
					d.lastModified=d.getLastModifiedDate();&lt;br /&gt;
					callback(d);&lt;br /&gt;
				} else if (typeof onfailure == typeof 1) {&lt;br /&gt;
					if (onfailure &amp;gt; 0) {&lt;br /&gt;
						// retry&lt;br /&gt;
						newDownload(url, id, callback, onfailure - 1);&lt;br /&gt;
					}&lt;br /&gt;
				} else if (typeof onfailure == &#039;function&#039;) {&lt;br /&gt;
					onfailure(d,url,id,callback);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (somerr) { /* ignore it */ }&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	d.setCallback(f);&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
/** Simulates a download from cached data.&lt;br /&gt;
	The supplied data is put into a {@link Downloader} as if it had downloaded it.&lt;br /&gt;
	@param {String} url The url.&lt;br /&gt;
	@param {integer} id The ID.&lt;br /&gt;
	@param {Function} callback The callback, which is invoked immediately as &amp;lt;code&amp;gt;callback(d)&amp;lt;/code&amp;gt;,&lt;br /&gt;
	where &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; is the new {@link Downloader}.&lt;br /&gt;
	@param {String} data The (cached) data.&lt;br /&gt;
	@param {Date} lastModified The (cached) last modified date.&lt;br /&gt;
*/&lt;br /&gt;
function fakeDownload(url, id, callback, data, lastModified, owner) {&lt;br /&gt;
	var d=newDownload(url,callback);&lt;br /&gt;
	d.owner=owner;&lt;br /&gt;
	d.id=id; d.data=data;&lt;br /&gt;
	d.lastModified=lastModified;&lt;br /&gt;
	return callback(d);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Starts a download.&lt;br /&gt;
   @param {String} url The url to download&lt;br /&gt;
   @param {integer} id The ID of the {@link Downloader} object&lt;br /&gt;
   @param {Function} callback The callback function invoked on success&lt;br /&gt;
   @return {String/Downloader} the {@link Downloader} object created, or &#039;ohdear&#039; if an unsupported browser&lt;br /&gt;
*/&lt;br /&gt;
function startDownload(url, id, callback) {&lt;br /&gt;
	var d=newDownload(url, id, callback);&lt;br /&gt;
	if (typeof d == typeof &#039;&#039; ) { return d; }&lt;br /&gt;
	d.start();&lt;br /&gt;
	return d;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Aborts all downloads which have been started.&lt;br /&gt;
*/&lt;br /&gt;
function abortAllDownloads() {&lt;br /&gt;
	for ( var x in pg.misc.downloadsInProgress ) {&lt;br /&gt;
		try {&lt;br /&gt;
			pg.misc.downloadsInProgress[x].aborted=true;&lt;br /&gt;
			pg.misc.downloadsInProgress[x].abort();&lt;br /&gt;
			delete pg.misc.downloadsInProgress[x];&lt;br /&gt;
		} catch (e) { }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: downloader.js&lt;br /&gt;
// STARTFILE: livepreview.js&lt;br /&gt;
// TODO: location is often not correct (eg relative links in previews)&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * InstaView - a Mediawiki to HTML converter in JavaScript&lt;br /&gt;
 * Version 0.6.1&lt;br /&gt;
 * Copyright (C) Pedro Fayolle 2005-2006&lt;br /&gt;
 * http://en.wikipedia.org/wiki/User:Pilaf&lt;br /&gt;
 * Distributed under the BSD license&lt;br /&gt;
 *&lt;br /&gt;
 * Changelog:&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6.1&lt;br /&gt;
 * - Fixed problem caused by \r characters&lt;br /&gt;
 * - Improved inline formatting parser&lt;br /&gt;
 *&lt;br /&gt;
 * 0.6&lt;br /&gt;
 * - Changed name to InstaView&lt;br /&gt;
 * - Some major code reorganizations and factored out some common functions&lt;br /&gt;
 * - Handled conversion of relative links (i.e. [[/foo]])&lt;br /&gt;
 * - Fixed misrendering of adjacent definition list items&lt;br /&gt;
 * - Fixed bug in table headings handling&lt;br /&gt;
 * - Changed date format in signatures to reflect Mediawiki&#039;s&lt;br /&gt;
 * - Fixed handling of [[:Image:...]]&lt;br /&gt;
 * - Updated MD5 function (hopefully it will work with UTF-8)&lt;br /&gt;
 * - Fixed bug in handling of links inside images&lt;br /&gt;
 *&lt;br /&gt;
 * To do:&lt;br /&gt;
 * - Better support for &amp;lt;math&amp;gt;&lt;br /&gt;
 * - Full support for &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 * - Parser-based (as opposed to RegExp-based) inline wikicode handling (make it one-pass and bullet-proof)&lt;br /&gt;
 * - Support for templates (through AJAX)&lt;br /&gt;
 * - Support for coloured links (AJAX)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var Insta = {};&lt;br /&gt;
&lt;br /&gt;
function setupLivePreview() {&lt;br /&gt;
&lt;br /&gt;
	// options&lt;br /&gt;
	Insta.conf =&lt;br /&gt;
	{&lt;br /&gt;
		baseUrl: &#039;&#039;,&lt;br /&gt;
&lt;br /&gt;
		user: {},&lt;br /&gt;
&lt;br /&gt;
		wiki: {&lt;br /&gt;
		lang: pg.wiki.lang,&lt;br /&gt;
		interwiki: pg.wiki.interwiki,&lt;br /&gt;
		default_thumb_width: 180&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		paths: {&lt;br /&gt;
		articles: pg.wiki.articlePath + &#039;/&#039;,&lt;br /&gt;
		// Only used for Insta previews with images. (not in popups)&lt;br /&gt;
		math: &#039;/math/&#039;,&lt;br /&gt;
		images: &#039;//upload.wikimedia.org/wikipedia/en/&#039;, // FIXME ( window.getImageUrlStart ? getImageUrlStart(pg.wiki.hostname) : &#039;&#039;),&lt;br /&gt;
		images_fallback: &#039;//upload.wikimedia.org/wikipedia/commons/&#039;,&lt;br /&gt;
		magnify_icon: &#039;skins/common/images/magnify-clip.png&#039;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		locale: {&lt;br /&gt;
		user: mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId],&lt;br /&gt;
		image: mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsImageId],&lt;br /&gt;
		category: mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsCategoryId],&lt;br /&gt;
		// shouldn&#039;t be used in popup previews, i think&lt;br /&gt;
		months: [&#039;Jan&#039;,&#039;Feb&#039;,&#039;Mar&#039;,&#039;Apr&#039;,&#039;May&#039;,&#039;Jun&#039;,&#039;Jul&#039;,&#039;Aug&#039;,&#039;Sep&#039;,&#039;Oct&#039;,&#039;Nov&#039;,&#039;Dec&#039;]&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// options with default values or backreferences&lt;br /&gt;
	with (Insta.conf) {&lt;br /&gt;
	user.name = user.name || &#039;Wikipedian&#039;;&lt;br /&gt;
	user.signature = &#039;[[&#039;+locale.user+&#039;:&#039;+user.name+&#039;|&#039;+user.name+&#039;]]&#039;;&lt;br /&gt;
	//paths.images = &#039;//upload.wikimedia.org/wikipedia/&#039; + wiki.lang + &#039;/&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// define constants&lt;br /&gt;
	Insta.BLOCK_IMAGE = new RegExp(&#039;^\\[\\[(?:File|Image|&#039;+Insta.conf.locale.image+&lt;br /&gt;
        &#039;):.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Insta.dump = function(from, to)&lt;br /&gt;
{&lt;br /&gt;
	if (typeof from == &#039;string&#039;) { from = document.getElementById(from); }&lt;br /&gt;
	if (typeof to == &#039;string&#039;) { to = document.getElementById(to); }&lt;br /&gt;
	to.innerHTML = this.convert(from.value);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Insta.convert = function(wiki)&lt;br /&gt;
{&lt;br /&gt;
	var ll = (typeof wiki == &#039;string&#039;)? wiki.replace(/\r/g,&#039;&#039;).split(/\n/): wiki, // lines of wikicode&lt;br /&gt;
		o  = &#039;&#039;, // output&lt;br /&gt;
		p  = 0,	 // para flag&lt;br /&gt;
		$r;	 // result of passing a regexp to $()&lt;br /&gt;
&lt;br /&gt;
	// some shorthands&lt;br /&gt;
	function remain() { return ll.length; }&lt;br /&gt;
	function sh() { return ll.shift(); } // shift&lt;br /&gt;
	function ps(s) { o += s; } // push&lt;br /&gt;
&lt;br /&gt;
	// similar to C&#039;s printf, uses ? as placeholders, ?? to escape question marks&lt;br /&gt;
	function f()&lt;br /&gt;
	{&lt;br /&gt;
		var i=1, a=arguments,  f=a[0], o=&#039;&#039;, c, p;&lt;br /&gt;
		for (; i&amp;lt;a.length; i++) {&lt;br /&gt;
			if ((p=f.indexOf(&#039;?&#039;))+1) {&lt;br /&gt;
				// allow character escaping&lt;br /&gt;
				i -= c = f.charAt(p+1)==&#039;?&#039; ? 1 : 0;&lt;br /&gt;
				o += f.substring(0,p) + (c ? &#039;?&#039; : a[i]);&lt;br /&gt;
				f = f.substr(p+1+c);&lt;br /&gt;
			} else { break; }&lt;br /&gt;
		}&lt;br /&gt;
		return o+f;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function html_entities(s) {&lt;br /&gt;
		return s.replace(/&amp;amp;/g,&amp;quot;&amp;amp;amp;&amp;quot;).replace(/&amp;lt;/g,&amp;quot;&amp;amp;lt;&amp;quot;).replace(/&amp;gt;/g,&amp;quot;&amp;amp;gt;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Wiki text parsing to html is a nightmare.&lt;br /&gt;
	// The below functions deliberately don&#039;t escape the ampersand since this would make it more difficult,&lt;br /&gt;
	// and we don&#039;t absolutely need to for how we need it.&lt;br /&gt;
	// This means that any unescaped ampersands in wikitext will remain unescaped and can cause invalid HTML.&lt;br /&gt;
	// Browsers should all be able to handle it though.&lt;br /&gt;
	// We also escape significant wikimarkup characters to prevent further matching on the processed text&lt;br /&gt;
	function htmlescape_text(s) {&lt;br /&gt;
		return s.replace(/&amp;lt;/g,&amp;quot;&amp;amp;lt;&amp;quot;).replace(/&amp;gt;/g,&amp;quot;&amp;amp;gt;&amp;quot;).replace(/:/g,&amp;quot;&amp;amp;#58;&amp;quot;).replace(/\[/g,&amp;quot;&amp;amp;#91;&amp;quot;).replace(/]/g,&amp;quot;&amp;amp;#93;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	function htmlescape_attr(s) {&lt;br /&gt;
		return htmlescape_text(s).replace(/&#039;/g,&amp;quot;&amp;amp;#39;&amp;quot;).replace(/&amp;quot;/g,&amp;quot;&amp;amp;quot;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function max(a,b) { return (a&amp;gt;b)?a:b; }&lt;br /&gt;
	function min(a,b) { return (a&amp;lt;b)?a:b; }&lt;br /&gt;
&lt;br /&gt;
	// return the first non matching character position between two strings&lt;br /&gt;
	function str_imatch(a, b)&lt;br /&gt;
	{&lt;br /&gt;
		for (var i=0, l=min(a.length, b.length); i&amp;lt;l; i++) {&lt;br /&gt;
			if (a.charAt(i)!=b.charAt(i)) { break; }&lt;br /&gt;
		}&lt;br /&gt;
		return i;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// compare current line against a string or regexp&lt;br /&gt;
	// if passed a string it will compare only the first string.length characters&lt;br /&gt;
	// if passed a regexp the result is stored in $r&lt;br /&gt;
	function $(c) { return (typeof c == &#039;string&#039;) ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)); }&lt;br /&gt;
&lt;br /&gt;
	function $$(c) { return ll[0]==c; } // compare current line against a string&lt;br /&gt;
	function _(p) { return ll[0].charAt(p); } // return char at pos p&lt;br /&gt;
&lt;br /&gt;
	function endl(s) { ps(s); sh(); }&lt;br /&gt;
&lt;br /&gt;
	function parse_list()&lt;br /&gt;
	{&lt;br /&gt;
		var prev=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		while (remain() &amp;amp;&amp;amp; $(/^([*#:;]+)(.*)$/)) {&lt;br /&gt;
&lt;br /&gt;
			var l_match = $r;&lt;br /&gt;
&lt;br /&gt;
			sh();&lt;br /&gt;
&lt;br /&gt;
			var ipos = str_imatch(prev, l_match[1]);&lt;br /&gt;
&lt;br /&gt;
			// close uncontinued lists&lt;br /&gt;
			for (var i=prev.length-1; i &amp;gt;= ipos; i--) {&lt;br /&gt;
&lt;br /&gt;
				var pi = prev.charAt(i);&lt;br /&gt;
&lt;br /&gt;
				if (pi==&#039;*&#039;) { ps(&#039;&amp;lt;/ul&amp;gt;&#039;); }&lt;br /&gt;
				else if (pi==&#039;#&#039;) { ps(&#039;&amp;lt;/ol&amp;gt;&#039;); }&lt;br /&gt;
				// close a dl only if the new item is not a dl item (:, ; or empty)&lt;br /&gt;
				else switch (l_match[1].charAt(i)) { case&#039;&#039;:case&#039;*&#039;:case&#039;#&#039;: ps(&#039;&amp;lt;/dl&amp;gt;&#039;) }&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// open new lists&lt;br /&gt;
			for (var i=ipos; i&amp;lt;l_match[1].length; i++) {&lt;br /&gt;
&lt;br /&gt;
				var li = l_match[1].charAt(i);&lt;br /&gt;
&lt;br /&gt;
				if (li==&#039;*&#039;) { ps(&#039;&amp;lt;ul&amp;gt;&#039;); }&lt;br /&gt;
				else if (li==&#039;#&#039;) { ps(&#039;&amp;lt;ol&amp;gt;&#039;); }&lt;br /&gt;
				// open a new dl only if the prev item is not a dl item (:, ; or empty)&lt;br /&gt;
				else { switch(prev.charAt(i)) { case&#039;&#039;:case&#039;*&#039;:case&#039;#&#039;: ps(&#039;&amp;lt;dl&amp;gt;&#039;) } }&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			switch (l_match[1].charAt(l_match[1].length-1)) {&lt;br /&gt;
&lt;br /&gt;
				case &#039;*&#039;: case &#039;#&#039;:&lt;br /&gt;
					ps(&#039;&amp;lt;li&amp;gt;&#039; + parse_inline_nowiki(l_match[2])); break&lt;br /&gt;
&lt;br /&gt;
				case &#039;;&#039;:&lt;br /&gt;
					ps(&#039;&amp;lt;dt&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
					var dt_match;&lt;br /&gt;
&lt;br /&gt;
					// handle ;dt :dd format&lt;br /&gt;
					if (dt_match = l_match[2].match(/(.*?)(:.*?)$/)) {&lt;br /&gt;
&lt;br /&gt;
						ps(parse_inline_nowiki(dt_match[1]))&lt;br /&gt;
						ll.unshift(dt_match[2])&lt;br /&gt;
&lt;br /&gt;
					} else ps(parse_inline_nowiki(l_match[2]))&lt;br /&gt;
&lt;br /&gt;
					break;&lt;br /&gt;
&lt;br /&gt;
				case &#039;:&#039;:&lt;br /&gt;
					ps(&#039;&amp;lt;dd&amp;gt;&#039; + parse_inline_nowiki(l_match[2]))&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			prev=l_match[1]&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close remaining lists&lt;br /&gt;
		for (var i=prev.length-1; i&amp;gt;=0; i--)&lt;br /&gt;
			ps(f(&#039;&amp;lt;/?&amp;gt;&#039;, (prev.charAt(i)==&#039;*&#039;)? &#039;ul&#039;: ((prev.charAt(i)==&#039;#&#039;)? &#039;ol&#039;: &#039;dl&#039;)))&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_table()&lt;br /&gt;
	{&lt;br /&gt;
		endl(f(&#039;&amp;lt;table&amp;gt;&#039;, $(/^\{\|( .*)$/)? $r[1]: &#039;&#039;))&lt;br /&gt;
&lt;br /&gt;
		for (;remain();) if ($(&#039;|&#039;)) switch (_(1)) {&lt;br /&gt;
			case &#039;}&#039;: endl(&#039;&amp;lt;/table&amp;gt;&#039;); return&lt;br /&gt;
			case &#039;-&#039;: endl(f(&#039;&amp;lt;tr&amp;gt;&#039;, $(/\|-*(.*)/)[1])); break&lt;br /&gt;
			default: parse_table_data()&lt;br /&gt;
		}&lt;br /&gt;
		else if ($(&#039;!&#039;)) parse_table_data()&lt;br /&gt;
		else sh()&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_table_data()&lt;br /&gt;
	{&lt;br /&gt;
		var td_line, match_i&lt;br /&gt;
&lt;br /&gt;
		// 1: &amp;quot;|+&amp;quot;, &#039;|&#039; or &#039;+&#039;&lt;br /&gt;
		// 2: ??&lt;br /&gt;
		// 3: attributes ??&lt;br /&gt;
		// TODO: finish commenting this regexp&lt;br /&gt;
		var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/)&lt;br /&gt;
&lt;br /&gt;
		if (td_match[1] == &#039;|+&#039;) ps(&#039;&amp;lt;caption&#039;);&lt;br /&gt;
		else ps(&#039;&amp;lt;t&#039; + ((td_match[1]==&#039;|&#039;)?&#039;d&#039;:&#039;h&#039;))&lt;br /&gt;
&lt;br /&gt;
		if (typeof td_match[3] != &#039;undefined&#039;) {&lt;br /&gt;
&lt;br /&gt;
			//ps(&#039; &#039; + td_match[3])&lt;br /&gt;
			match_i = 4&lt;br /&gt;
&lt;br /&gt;
		} else match_i = 2&lt;br /&gt;
&lt;br /&gt;
		ps(&#039;&amp;gt;&#039;)&lt;br /&gt;
&lt;br /&gt;
		if (td_match[1] != &#039;|+&#039;) {&lt;br /&gt;
&lt;br /&gt;
			// use || or !! as a cell separator depending on context&lt;br /&gt;
			// NOTE: when split() is passed a regexp make sure to use non-capturing brackets&lt;br /&gt;
			td_line = td_match[match_i].split((td_match[1] == &#039;|&#039;)? &#039;||&#039;: /(?:\|\||!!)/)&lt;br /&gt;
&lt;br /&gt;
			ps(parse_inline_nowiki(td_line.shift()))&lt;br /&gt;
&lt;br /&gt;
			while (td_line.length) ll.unshift(td_match[1] + td_line.pop())&lt;br /&gt;
&lt;br /&gt;
		} else ps(td_match[match_i])&lt;br /&gt;
&lt;br /&gt;
		var tc = 0, td = []&lt;br /&gt;
&lt;br /&gt;
		for (;remain(); td.push(sh()))&lt;br /&gt;
		if ($(&#039;|&#039;)) {&lt;br /&gt;
			if (!tc) break // we&#039;re at the outer-most level (no nested tables), skip to td parse&lt;br /&gt;
			else if (_(1)==&#039;}&#039;) tc--&lt;br /&gt;
		}&lt;br /&gt;
		else if (!tc &amp;amp;&amp;amp; $(&#039;!&#039;)) break&lt;br /&gt;
		else if ($(&#039;{|&#039;)) tc++&lt;br /&gt;
&lt;br /&gt;
		if (td.length) ps(Insta.convert(td))&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_pre()&lt;br /&gt;
	{&lt;br /&gt;
		ps(&#039;&amp;lt;pre&amp;gt;&#039;)&lt;br /&gt;
		do endl(parse_inline_nowiki(ll[0].substring(1)) + &amp;quot;\n&amp;quot;); while (remain() &amp;amp;&amp;amp; $(&#039; &#039;))&lt;br /&gt;
		ps(&#039;&amp;lt;/pre&amp;gt;&#039;)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_block_image()&lt;br /&gt;
	{&lt;br /&gt;
		ps(parse_image(sh()))&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_image(str)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// get what&#039;s in between &amp;quot;[[Image:&amp;quot; and &amp;quot;]]&amp;quot;&lt;br /&gt;
		var tag = str.substring(str.indexOf(&#039;:&#039;) + 1, str.length - 2);&lt;br /&gt;
&lt;br /&gt;
		var width;&lt;br /&gt;
		var attr = [], filename, caption = &#039;&#039;;&lt;br /&gt;
		var thumb=0, frame=0, center=0;&lt;br /&gt;
		var align=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		if (tag.match(/\|/)) {&lt;br /&gt;
			// manage nested links&lt;br /&gt;
			var nesting = 0;&lt;br /&gt;
			var last_attr;&lt;br /&gt;
			for (var i = tag.length-1; i &amp;gt; 0; i--) {&lt;br /&gt;
				if (tag.charAt(i) == &#039;|&#039; &amp;amp;&amp;amp; !nesting) {&lt;br /&gt;
					last_attr = tag.substr(i+1);&lt;br /&gt;
					tag = tag.substring(0, i);&lt;br /&gt;
					break;&lt;br /&gt;
				} else switch (tag.substr(i-1, 2)) {&lt;br /&gt;
					case &#039;]]&#039;:&lt;br /&gt;
						nesting++;&lt;br /&gt;
						i--;&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;[[&#039;:&lt;br /&gt;
						nesting--;&lt;br /&gt;
						i--;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			attr = tag.split(/\s*\|\s*/);&lt;br /&gt;
			attr.push(last_attr);&lt;br /&gt;
			filename = attr.shift();&lt;br /&gt;
&lt;br /&gt;
			var w_match;&lt;br /&gt;
&lt;br /&gt;
			for (;attr.length; attr.shift())&lt;br /&gt;
			if (w_match = attr[0].match(/^(\d*)(?:[px]*\d*)?px$/)) width = w_match[1]&lt;br /&gt;
			else switch(attr[0]) {&lt;br /&gt;
				case &#039;thumb&#039;:&lt;br /&gt;
				case &#039;thumbnail&#039;:&lt;br /&gt;
					thumb=true;&lt;br /&gt;
				case &#039;frame&#039;:&lt;br /&gt;
					frame=true;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;none&#039;:&lt;br /&gt;
				case &#039;right&#039;:&lt;br /&gt;
				case &#039;left&#039;:&lt;br /&gt;
					center=false;&lt;br /&gt;
					align=attr[0];&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;center&#039;:&lt;br /&gt;
					center=true;&lt;br /&gt;
					align=&#039;none&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					if (attr.length == 1) caption = attr[0];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		} else filename = tag;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		var o=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		if (frame) {&lt;br /&gt;
&lt;br /&gt;
			if (align==&#039;&#039;) align = &#039;right&#039;;&lt;br /&gt;
&lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class=&#039;thumb t?&#039;&amp;gt;&amp;quot;, align);&lt;br /&gt;
&lt;br /&gt;
			if (thumb) {&lt;br /&gt;
				if (!width) width = Insta.conf.wiki.default_thumb_width;&lt;br /&gt;
&lt;br /&gt;
				o += f(&amp;quot;&amp;lt;div style=&#039;width:?px;&#039;&amp;gt;?&amp;quot;, 2+width*1, make_image(filename, caption, width)) +&lt;br /&gt;
					f(&amp;quot;&amp;lt;div class=&#039;thumbcaption&#039;&amp;gt;&amp;lt;div class=&#039;magnify&#039; style=&#039;float:right&#039;&amp;gt;&amp;lt;a href=&#039;?&#039; class=&#039;internal&#039; title=&#039;Enlarge&#039;&amp;gt;&amp;lt;img src=&#039;?&#039;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
						htmlescape_attr(Insta.conf.paths.articles + Insta.conf.locale.image + &#039;:&#039; + filename),&lt;br /&gt;
						Insta.conf.paths.magnify_icon,&lt;br /&gt;
						parse_inline_nowiki(caption)&lt;br /&gt;
					)&lt;br /&gt;
			} else {&lt;br /&gt;
				o += &#039;&amp;lt;div&amp;gt;&#039; + make_image(filename, caption) + f(&amp;quot;&amp;lt;div class=&#039;thumbcaption&#039;&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, parse_inline_nowiki(caption))&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			o += &#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
		} else if (align != &#039;&#039;) {&lt;br /&gt;
			o += f(&amp;quot;&amp;lt;div class=&#039;float?&#039;&amp;gt;&amp;lt;span&amp;gt;?&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;, align, make_image(filename, caption, width));&lt;br /&gt;
		} else {&lt;br /&gt;
			return make_image(filename, caption, width);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return center? f(&amp;quot;&amp;lt;div class=&#039;center&#039;&amp;gt;?&amp;lt;/div&amp;gt;&amp;quot;, o): o;&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_inline_nowiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var start, lastend=0&lt;br /&gt;
		var substart=0, nestlev=0, open, close, subloop;&lt;br /&gt;
		var html=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		while (-1 != (start = str.indexOf(&#039;&amp;lt;nowiki&amp;gt;&#039;, substart))) {&lt;br /&gt;
			html += parse_inline_wiki(str.substring(lastend, start));&lt;br /&gt;
			start += 8;&lt;br /&gt;
			substart = start;&lt;br /&gt;
			subloop = true;&lt;br /&gt;
			do {&lt;br /&gt;
				open = str.indexOf(&#039;&amp;lt;nowiki&amp;gt;&#039;, substart);&lt;br /&gt;
				close = str.indexOf(&#039;&amp;lt;/nowiki&amp;gt;&#039;, substart);&lt;br /&gt;
				if (close&amp;lt;=open || open==-1) {&lt;br /&gt;
					if (close==-1) {&lt;br /&gt;
						return html + html_entities(str.substr(start));&lt;br /&gt;
					}&lt;br /&gt;
					substart = close+9;&lt;br /&gt;
					if (nestlev) {&lt;br /&gt;
						nestlev--;&lt;br /&gt;
					} else {&lt;br /&gt;
						lastend = substart;&lt;br /&gt;
						html += html_entities(str.substring(start, lastend-9));&lt;br /&gt;
						subloop = false;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					substart = open+8;&lt;br /&gt;
					nestlev++;&lt;br /&gt;
				}&lt;br /&gt;
			} while (subloop)&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return html + parse_inline_wiki(str.substr(lastend));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function make_image(filename, caption, width)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		// uppercase first letter in file name&lt;br /&gt;
		filename = filename.charAt(0).toUpperCase() + filename.substr(1);&lt;br /&gt;
		// replace spaces with underscores&lt;br /&gt;
		filename = filename.replace(/ /g, &#039;_&#039;);&lt;br /&gt;
&lt;br /&gt;
		caption = strip_inline_wiki(caption);&lt;br /&gt;
&lt;br /&gt;
		var md5 = hex_md5(filename);&lt;br /&gt;
&lt;br /&gt;
		var source = md5.charAt(0) + &#039;/&#039; + md5.substr(0,2) + &#039;/&#039; + filename;&lt;br /&gt;
&lt;br /&gt;
		if (width) width = &amp;quot;width=&#039;&amp;quot; + width + &amp;quot;px&#039;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var img = &amp;quot;&amp;lt;img onerror=\&amp;quot;&amp;quot;+pg.escapeQuotesHTML(&amp;quot;this.onerror=null;this.src=&#039;&amp;quot;+pg.jsescape(Insta.conf.paths.images_fallback + source)+&amp;quot;&#039;&amp;quot;)+&amp;quot;\&amp;quot; src=\&amp;quot;&amp;quot;+pg.escapeQuotesHTML(Insta.conf.paths.images + source)+&amp;quot;\&amp;quot; &amp;quot;+(caption!=&#039;&#039; ? &amp;quot;alt=\&amp;quot;&amp;quot; + pg.escapeQuotesHTML(caption) + &amp;quot;\&amp;quot;&amp;quot; : &#039;&#039;)+&amp;quot; &amp;quot;+width+&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		return f(&amp;quot;&amp;lt;a class=&#039;image&#039; ? href=\&amp;quot;?\&amp;quot;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, (caption!=&#039;&#039;)? &amp;quot;title=\&amp;quot;&amp;quot; + pg.escapeQuotesHTML(caption) + &amp;quot;\&amp;quot;&amp;quot; : &#039;&#039;, pg.escapeQuotesHTML(Insta.conf.paths.articles + Insta.conf.locale.image + &#039;:&#039; + filename), img);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_inline_images(str)&lt;br /&gt;
	{&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		var start, substart=0, nestlev=0;&lt;br /&gt;
		var loop, close, open, wiki, html;&lt;br /&gt;
&lt;br /&gt;
		while (-1 != (start=str.indexOf(&#039;[[&#039;, substart))) {&lt;br /&gt;
			if(str.substr(start+2).match(RegExp(&#039;^(Image|File|&#039; + Insta.conf.locale.image + &#039;):&#039;,&#039;i&#039;))) {&lt;br /&gt;
				loop=true;&lt;br /&gt;
				substart=start;&lt;br /&gt;
				do {&lt;br /&gt;
					substart+=2;&lt;br /&gt;
					close=str.indexOf(&#039;]]&#039;,substart);&lt;br /&gt;
					open=str.indexOf(&#039;[[&#039;,substart);&lt;br /&gt;
					if (close&amp;lt;=open||open==-1) {&lt;br /&gt;
						if (close==-1) return str;&lt;br /&gt;
						substart=close;&lt;br /&gt;
						if (nestlev) {&lt;br /&gt;
							nestlev--;&lt;br /&gt;
						} else {&lt;br /&gt;
							wiki=str.substring(start,close+2);&lt;br /&gt;
							html=parse_image(wiki);&lt;br /&gt;
							str=str.replace(wiki,html);&lt;br /&gt;
							substart=start+html.length;&lt;br /&gt;
							loop=false;&lt;br /&gt;
						}&lt;br /&gt;
					} else {&lt;br /&gt;
						substart=open;&lt;br /&gt;
						nestlev++;&lt;br /&gt;
					}&lt;br /&gt;
				} while (loop)&lt;br /&gt;
&lt;br /&gt;
			} else break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		return str;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// the output of this function doesn&#039;t respect the FILO structure of HTML&lt;br /&gt;
	// but since most browsers can handle it I&#039;ll save myself the hassle&lt;br /&gt;
	function parse_inline_formatting(str)&lt;br /&gt;
	{&lt;br /&gt;
		var em,st,i,li,o=&#039;&#039;;&lt;br /&gt;
		while ((i=str.indexOf(&amp;quot;&#039;&#039;&amp;quot;,li))+1) {&lt;br /&gt;
			o += str.substring(li,i);&lt;br /&gt;
			li=i+2;&lt;br /&gt;
			if (str.charAt(i+2)==&amp;quot;&#039;&amp;quot;) {&lt;br /&gt;
				li++;&lt;br /&gt;
				st=!st;&lt;br /&gt;
				o+=st?&#039;&amp;lt;strong&amp;gt;&#039;:&#039;&amp;lt;/strong&amp;gt;&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				em=!em;&lt;br /&gt;
				o+=em?&#039;&amp;lt;em&amp;gt;&#039;:&#039;&amp;lt;/em&amp;gt;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return o+str.substr(li);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function parse_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		var aux_match;&lt;br /&gt;
&lt;br /&gt;
		str = parse_inline_images(str);&lt;br /&gt;
		str = parse_inline_formatting(str);&lt;br /&gt;
&lt;br /&gt;
		// math&lt;br /&gt;
		while (aux_match = str.match(/&amp;lt;(?:)math&amp;gt;(.*?)&amp;lt;\/math&amp;gt;/i)) {&lt;br /&gt;
			var math_md5 = hex_md5(aux_match[1]);&lt;br /&gt;
			str = str.replace(aux_match[0], f(&amp;quot;&amp;lt;img src=&#039;?.png&#039;&amp;gt;&amp;quot;, Insta.conf.paths.math+math_md5));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Build a Mediawiki-formatted date string&lt;br /&gt;
		var date = new Date;&lt;br /&gt;
		var minutes = date.getUTCMinutes();&lt;br /&gt;
		if (minutes &amp;lt; 10) minutes = &#039;0&#039; + minutes;&lt;br /&gt;
		var date = f(&amp;quot;?:?, ? ? ? (UTC)&amp;quot;, date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear());&lt;br /&gt;
&lt;br /&gt;
		// text formatting&lt;br /&gt;
		return str.&lt;br /&gt;
			// signatures&lt;br /&gt;
			replace(/~{5}(?!~)/g, date).&lt;br /&gt;
			replace(/~{4}(?!~)/g, Insta.conf.user.name+&#039; &#039;+date).&lt;br /&gt;
			replace(/~{3}(?!~)/g, Insta.conf.user.name).&lt;br /&gt;
&lt;br /&gt;
			// [[:Category:...]], [[:Image:...]], etc...&lt;br /&gt;
			replace(RegExp(&#039;\\[\\[:((?:&#039;+Insta.conf.locale.category+&#039;|Image|File|&#039;+Insta.conf.locale.image+&#039;|&#039;+Insta.conf.wiki.interwiki+&#039;):[^|]*?)\\]\\](\w*)&#039;,&#039;gi&#039;), function($0,$1,$2){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2));}).&lt;br /&gt;
			// remove straight category and interwiki tags&lt;br /&gt;
			replace(RegExp(&#039;\\[\\[(?:&#039;+Insta.conf.locale.category+&#039;|&#039;+Insta.conf.wiki.interwiki+&#039;):.*?\\]\\]&#039;,&#039;gi&#039;),&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
			// [[:Category:...|Links]], [[:Image:...|Links]], etc...&lt;br /&gt;
			replace(RegExp(&#039;\\[\\[:((?:&#039;+Insta.conf.locale.category+&#039;|Image|File|&#039;+Insta.conf.locale.image+&#039;|&#039;+Insta.conf.wiki.interwiki+&#039;):.*?)\\|([^\\]]+?)\\]\\](\\w*)&#039;,&#039;gi&#039;), function($0,$1,$2,$3){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3));}).&lt;br /&gt;
&lt;br /&gt;
			// [[/Relative links]]&lt;br /&gt;
			replace(/\[\[(\/[^|]*?)\]\]/g, function($0,$1){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($1)); }).&lt;br /&gt;
&lt;br /&gt;
			// [[/Replaced|Relative links]]&lt;br /&gt;
			replace(/\[\[(\/.*?)\|(.+?)\]\]/g, function($0,$1,$2){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($2)); }).&lt;br /&gt;
&lt;br /&gt;
			// [[Common links]]&lt;br /&gt;
			replace(/\[\[([^|]*?)\]\](\w*)/g, function($0,$1,$2){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2)); }).&lt;br /&gt;
&lt;br /&gt;
			// [[Replaced|Links]]&lt;br /&gt;
			replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g, function($0,$1,$2,$3){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3)); }).&lt;br /&gt;
&lt;br /&gt;
			// [[Stripped:Namespace|Namespace]]&lt;br /&gt;
			replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, function($0,$1,$2,$3){return f(&amp;quot;&amp;lt;a href=&#039;?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, Insta.conf.paths.articles + htmlescape_attr($1) + htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($2)); }).&lt;br /&gt;
&lt;br /&gt;
			// External links&lt;br /&gt;
			replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, function($0,$1,$2,$3,$4){return f(&amp;quot;&amp;lt;a class=&#039;external&#039; href=&#039;?:?&#039;&amp;gt;?&amp;lt;/a&amp;gt;&amp;quot;, htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($4)); }).&lt;br /&gt;
			replace(/\[http:\/\/(.*?)\]/g, function($0,$1){return f(&amp;quot;&amp;lt;a class=&#039;external&#039; href=&#039;http://?&#039;&amp;gt;[#]&amp;lt;/a&amp;gt;&amp;quot;, htmlescape_attr($1)); }).&lt;br /&gt;
			replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, function($0,$1,$2,$3,$4){return f(&amp;quot;&amp;lt;a class=&#039;external&#039; href=&#039;?:?&#039;&amp;gt;?:?&amp;lt;/a&amp;gt;&amp;quot;, htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($1), htmlescape_text($2) + htmlescape_text($3)); }).&lt;br /&gt;
			replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*[^.,!?;: $])/g, function($0,$1,$2,$3,$4){return f(&amp;quot;?&amp;lt;a class=&#039;external&#039; href=&#039;?:?&#039;&amp;gt;?:?&amp;lt;/a&amp;gt;&amp;quot;, htmlescape_text($1), htmlescape_attr($2), htmlescape_attr($3) + htmlescape_attr($4), htmlescape_text($2), htmlescape_text($3) + htmlescape_text($4)); }).&lt;br /&gt;
&lt;br /&gt;
			replace(&#039;__NOTOC__&#039;,&#039;&#039;).&lt;br /&gt;
			replace(&#039;__NOEDITSECTION__&#039;,&#039;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
/*&lt;br /&gt;
*/&lt;br /&gt;
	function strip_inline_wiki(str)&lt;br /&gt;
	{&lt;br /&gt;
		return str&lt;br /&gt;
			.replace(/\[\[[^\]]*\|(.*?)\]\]/g,&#039;$1&#039;)&lt;br /&gt;
			.replace(/\[\[(.*?)\]\]/g,&#039;$1&#039;)&lt;br /&gt;
			.replace(/&#039;&#039;(.*?)&#039;&#039;/g,&#039;$1&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// begin parsing&lt;br /&gt;
	for (;remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl(f(&#039;&amp;lt;h?&amp;gt;?&amp;lt;/h?&amp;gt;?&#039;, $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3]))&lt;br /&gt;
&lt;br /&gt;
	} else if ($(/^[*#:;]/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_list()&lt;br /&gt;
&lt;br /&gt;
	} else if ($(&#039; &#039;)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_pre()&lt;br /&gt;
&lt;br /&gt;
	} else if ($(&#039;{|&#039;)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_table()&lt;br /&gt;
&lt;br /&gt;
	} else if ($(/^----+$/)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		endl(&#039;&amp;lt;hr&amp;gt;&#039;)&lt;br /&gt;
&lt;br /&gt;
	} else if ($(Insta.BLOCK_IMAGE)) {&lt;br /&gt;
		p=0&lt;br /&gt;
		parse_block_image()&lt;br /&gt;
&lt;br /&gt;
	} else {&lt;br /&gt;
&lt;br /&gt;
		// handle paragraphs&lt;br /&gt;
		if ($$(&#039;&#039;)) {&lt;br /&gt;
			if (p = (remain()&amp;gt;1 &amp;amp;&amp;amp; ll[1]==(&#039;&#039;))) endl(&#039;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&#039;)&lt;br /&gt;
		} else {&lt;br /&gt;
			if(!p) {&lt;br /&gt;
				ps(&#039;&amp;lt;p&amp;gt;&#039;)&lt;br /&gt;
				p=1&lt;br /&gt;
			}&lt;br /&gt;
			ps(parse_inline_nowiki(ll[0]) + &#039; &#039;)&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		sh();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return o&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
window.wiki2html=function(txt,baseurl) {&lt;br /&gt;
	Insta.conf.baseUrl=baseurl;&lt;br /&gt;
	return Insta.convert(txt);&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: livepreview.js&lt;br /&gt;
// STARTFILE: pageinfo.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function popupFilterPageSize(data) {&lt;br /&gt;
	return formatBytes(data.length);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupFilterCountLinks(data) {&lt;br /&gt;
	var num=countLinks(data);&lt;br /&gt;
	return String(num) + &#039;&amp;amp;nbsp;&#039; + ((num!=1)?popupString(&#039;wikiLinks&#039;):popupString(&#039;wikiLink&#039;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupFilterCountImages(data) {&lt;br /&gt;
	var num=countImages(data);&lt;br /&gt;
	return String(num) + &#039;&amp;amp;nbsp;&#039; + ((num!=1)?popupString(&#039;images&#039;):popupString(&#039;image&#039;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupFilterCountCategories(data) {&lt;br /&gt;
	var num=countCategories(data);&lt;br /&gt;
	return String(num) + &#039;&amp;amp;nbsp;&#039; + ((num!=1)?popupString(&#039;categories&#039;):popupString(&#039;category&#039;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function popupFilterLastModified(data,download) {&lt;br /&gt;
	var lastmod=download.lastModified;&lt;br /&gt;
	var now=new Date();&lt;br /&gt;
	var age=now-lastmod;&lt;br /&gt;
	if (lastmod &amp;amp;&amp;amp; getValueOf(&#039;popupLastModified&#039;)) {&lt;br /&gt;
		return (tprintf(&#039;%s old&#039;, [formatAge(age)])).replace(RegExp(&#039; &#039;,&#039;g&#039;), &#039;&amp;amp;nbsp;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return &#039;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function formatAge(age) {&lt;br /&gt;
	// coerce into a number&lt;br /&gt;
	var a=0+age, aa=a;&lt;br /&gt;
&lt;br /&gt;
	var seclen  = 1000;&lt;br /&gt;
	var minlen  = 60*seclen;&lt;br /&gt;
	var hourlen = 60*minlen;&lt;br /&gt;
	var daylen  = 24*hourlen;&lt;br /&gt;
	var weeklen = 7*daylen;&lt;br /&gt;
&lt;br /&gt;
	var numweeks = (a-a%weeklen)/weeklen; a = a-numweeks*weeklen; var sweeks = addunit(numweeks, &#039;week&#039;);&lt;br /&gt;
	var numdays  = (a-a%daylen)/daylen;   a = a-numdays*daylen;   var sdays  = addunit(numdays, &#039;day&#039;);&lt;br /&gt;
	var numhours = (a-a%hourlen)/hourlen; a = a-numhours*hourlen; var shours = addunit(numhours,&#039;hour&#039;);&lt;br /&gt;
	var nummins  = (a-a%minlen)/minlen;   a = a-nummins*minlen;   var smins  = addunit(nummins, &#039;minute&#039;);&lt;br /&gt;
	var numsecs  = (a-a%seclen)/seclen;   a = a-numsecs*seclen;   var ssecs  = addunit(numsecs, &#039;second&#039;);&lt;br /&gt;
&lt;br /&gt;
	if (aa &amp;gt; 4*weeklen) { return sweeks; }&lt;br /&gt;
	if (aa &amp;gt; weeklen)   { return sweeks + &#039; &#039; + sdays; }&lt;br /&gt;
	if (aa &amp;gt; daylen)	{ return sdays  + &#039; &#039; + shours; }&lt;br /&gt;
	if (aa &amp;gt; 6*hourlen) { return shours; }&lt;br /&gt;
	if (aa &amp;gt; hourlen)   { return shours + &#039; &#039; + smins; }&lt;br /&gt;
	if (aa &amp;gt; 10*minlen) { return smins; }&lt;br /&gt;
	if (aa &amp;gt; minlen)	{ return smins  + &#039; &#039; + ssecs; }&lt;br /&gt;
	return ssecs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addunit(num,str) { return &#039;&#039; + num + &#039; &#039; + ((num!=1) ? popupString(str+&#039;s&#039;) : popupString(str)) ;}&lt;br /&gt;
&lt;br /&gt;
function runPopupFilters(list, data, download) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (list[i] &amp;amp;&amp;amp; typeof list[i] == &#039;function&#039;) {&lt;br /&gt;
			var s=list[i](data, download, download.owner.article);&lt;br /&gt;
			if (s) { ret.push(s); }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPageInfo(data, download) {&lt;br /&gt;
	if (!data || data.length === 0) { return popupString(&#039;Empty page&#039;); }&lt;br /&gt;
&lt;br /&gt;
	var popupFilters=getValueOf(&#039;popupFilters&#039;) || [];&lt;br /&gt;
	var extraPopupFilters = getValueOf(&#039;extraPopupFilters&#039;) || [];&lt;br /&gt;
	var pageInfoArray = runPopupFilters(popupFilters.concat(extraPopupFilters), data, download);&lt;br /&gt;
&lt;br /&gt;
	var pageInfo=pageInfoArray.join(&#039;, &#039;);&lt;br /&gt;
	if (pageInfo !== &#039;&#039; ) { pageInfo = upcaseFirst(pageInfo); }&lt;br /&gt;
	return pageInfo;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// this could be improved!&lt;br /&gt;
function countLinks(wikiText) { return wikiText.split(&#039;[[&#039;).length - 1; }&lt;br /&gt;
&lt;br /&gt;
// if N = # matches, n = # brackets, then&lt;br /&gt;
// String.parenSplit(regex) intersperses the N+1 split elements&lt;br /&gt;
// with Nn other elements. So total length is&lt;br /&gt;
// L= N+1 + Nn = N(n+1)+1. So N=(L-1)/(n+1).&lt;br /&gt;
&lt;br /&gt;
function countImages(wikiText) {&lt;br /&gt;
	return (wikiText.parenSplit(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function countCategories(wikiText) {&lt;br /&gt;
	return (wikiText.parenSplit(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupFilterStubDetect(data, download, article)	 {&lt;br /&gt;
	var counts=stubCount(data, article);&lt;br /&gt;
	if (counts.real) { return popupString(&#039;stub&#039;); }&lt;br /&gt;
	if (counts.sect) { return popupString(&#039;section stub&#039;); }&lt;br /&gt;
	return &#039;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupFilterDisambigDetect(data, download, article) {&lt;br /&gt;
	if (getValueOf(&#039;popupOnlyArticleDabStub&#039;) &amp;amp;&amp;amp; article.namespace()) { return &#039;&#039;; }&lt;br /&gt;
	return (isDisambig(data, article)) ? popupString(&#039;disambig&#039;) : &#039;&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function formatBytes(num) {&lt;br /&gt;
	return (num &amp;gt; 949) ? (Math.round(num/100)/10+popupString(&#039;kB&#039;)) : (num +&#039;&amp;amp;nbsp;&#039; + popupString(&#039;bytes&#039;)) ;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: pageinfo.js&lt;br /&gt;
// STARTFILE: titles.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview Defines the {@link Title} class, and associated crufty functions.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt; deals with article titles and their various&lt;br /&gt;
   forms.  {@link Stringwrapper} is the parent class of&lt;br /&gt;
   &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;, which exists simply to make things a little&lt;br /&gt;
   neater.&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Stringwrapper.&lt;br /&gt;
   @constructor&lt;br /&gt;
&lt;br /&gt;
   @class the Stringwrapper class. This base class is not really&lt;br /&gt;
   useful on its own; it just wraps various common string operations.&lt;br /&gt;
*/&lt;br /&gt;
function Stringwrapper() {&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().indexOf()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.indexOf=function(x){return this.toString().indexOf(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Returns this.value.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.toString=function(){return this.value;};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for {@link String#parenSplit} applied to this.toString()&lt;br /&gt;
	   @param {RegExp} x&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.parenSplit=function(x){return this.toString().parenSplit(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().substring()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @param {String} y (optional)&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.substring=function(x,y){&lt;br /&gt;
		if (typeof y==&#039;undefined&#039;) { return this.toString().substring(x); }&lt;br /&gt;
		return this.toString().substring(x,y);&lt;br /&gt;
	};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().split()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.split=function(x){return this.toString().split(x);};&lt;br /&gt;
	/**&lt;br /&gt;
	   Wrapper for this.toString().replace()&lt;br /&gt;
	   @param {String} x&lt;br /&gt;
	   @param {String} y&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.replace=function(x,y){ return this.toString().replace(x,y); };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new &amp;lt;code&amp;gt;Title&amp;lt;/code&amp;gt;.&lt;br /&gt;
   @constructor&lt;br /&gt;
&lt;br /&gt;
   @class The Title class. Holds article titles and converts them into&lt;br /&gt;
   various forms. Also deals with anchors, by which we mean the bits&lt;br /&gt;
   of the article URL after a # character, representing locations&lt;br /&gt;
   within an article.&lt;br /&gt;
&lt;br /&gt;
   @param {String} value The initial value to assign to the&lt;br /&gt;
   article. This must be the canonical title (see {@link&lt;br /&gt;
   Title#value}. Omit this in the constructor and use another function&lt;br /&gt;
   to set the title if this is unavailable.&lt;br /&gt;
*/&lt;br /&gt;
function Title(val) {&lt;br /&gt;
	/**&lt;br /&gt;
	   The canonical article title. This must be in UTF-8 with no&lt;br /&gt;
	   entities, escaping or nasties. Also, underscores should be&lt;br /&gt;
	   replaced with spaces.&lt;br /&gt;
	   @type String&lt;br /&gt;
	   @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	/**&lt;br /&gt;
	   The canonical form of the anchor. This should be exactly as&lt;br /&gt;
	   it appears in the URL, i.e. with the .C3.0A bits in.&lt;br /&gt;
	   @type String&lt;br /&gt;
	*/&lt;br /&gt;
	this.anchor=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	this.setUtf(val);&lt;br /&gt;
}&lt;br /&gt;
Title.prototype=new Stringwrapper();&lt;br /&gt;
/**&lt;br /&gt;
   Returns the canonical representation of the article title, optionally without anchor.&lt;br /&gt;
   @param {boolean} omitAnchor&lt;br /&gt;
   @fixme Decide specs for anchor&lt;br /&gt;
   @return String The article title and the anchor.&lt;br /&gt;
*/&lt;br /&gt;
Title.prototype.toString=function(omitAnchor) {&lt;br /&gt;
	return this.value + ( (!omitAnchor &amp;amp;&amp;amp; this.anchor) ? &#039;#&#039; + this.anchorString() : &#039;&#039; );&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.anchorString=function() {&lt;br /&gt;
	if (!this.anchor) { return &#039;&#039;; }&lt;br /&gt;
	var split=this.anchor.parenSplit(/((?:[.][0-9A-F]{2})+)/);&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var j=1; j&amp;lt;len; j+=2) {&lt;br /&gt;
		// FIXME s/decodeURI/decodeURIComponent/g ?&lt;br /&gt;
		split[j]=decodeURIComponent(split[j].split(&#039;.&#039;).join(&#039;%&#039;)).split(&#039;_&#039;).join(&#039; &#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return split.join(&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.urlAnchor=function() {&lt;br /&gt;
	var split=this.anchor.parenSplit(&#039;/((?:[%][0-9A-F]{2})+)/&#039;);&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var j=1; j&amp;lt;len; j+=2) {&lt;br /&gt;
		split[j]=split[j].split(&#039;%&#039;).join(&#039;.&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return split.join(&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.anchorFromUtf=function(str) {&lt;br /&gt;
	this.anchor=encodeURIComponent(str.split(&#039; &#039;).join(&#039;_&#039;))&lt;br /&gt;
	.split(&#039;%3A&#039;).join(&#039;:&#039;).split(&amp;quot;&#039;&amp;quot;).join(&#039;%27&#039;).split(&#039;%&#039;).join(&#039;.&#039;);&lt;br /&gt;
};&lt;br /&gt;
Title.fromURL=function(h) {&lt;br /&gt;
	return new Title().fromURL(h);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromURL=function(h) {&lt;br /&gt;
	if (typeof h != &#039;string&#039;) {&lt;br /&gt;
		this.value=null;&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// NOTE : playing with decodeURI, encodeURI, escape, unescape,&lt;br /&gt;
	// we seem to be able to replicate the IE borked encoding&lt;br /&gt;
&lt;br /&gt;
	// IE doesn&#039;t do this new-fangled utf-8 thing.&lt;br /&gt;
	// and it&#039;s worse than that.&lt;br /&gt;
	// IE seems to treat the query string differently to the rest of the url&lt;br /&gt;
	// the query is treated as bona-fide utf8, but the first bit of the url is pissed around with&lt;br /&gt;
&lt;br /&gt;
	// we fix up &amp;amp; for all browsers, just in case.&lt;br /&gt;
	var splitted=h.split(&#039;?&#039;);&lt;br /&gt;
	splitted[0]=splitted[0].split(&#039;&amp;amp;&#039;).join(&#039;%26&#039;);&lt;br /&gt;
&lt;br /&gt;
	if (pg.flag.linksLikeIE6) {&lt;br /&gt;
		splitted[0]=encodeURI(decode_utf8(splitted[0]));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	h=splitted.join(&#039;?&#039;);&lt;br /&gt;
&lt;br /&gt;
	var contribs=pg.re.contribs.exec(h);&lt;br /&gt;
	if (contribs !== null) {&lt;br /&gt;
		if (contribs[1]==&#039;title=&#039;) { contribs[3]=contribs[3].split(&#039;+&#039;).join(&#039; &#039;); }&lt;br /&gt;
		var u=new Title(contribs[3]);&lt;br /&gt;
		this.setUtf(this.decodeNasties(mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId] + &#039;:&#039; + u.stripNamespace()));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var email=pg.re.email.exec(h);&lt;br /&gt;
	if (email !== null) {&lt;br /&gt;
		this.setUtf(this.decodeNasties(mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId] + &#039;:&#039; + new Title(email[3]).stripNamespace()));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var backlinks=pg.re.backlinks.exec(h);&lt;br /&gt;
	if (backlinks) {&lt;br /&gt;
		this.setUtf(this.decodeNasties(new Title(backlinks[3])));&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// no more special cases to check --&lt;br /&gt;
	// hopefully it&#039;s not a disguised user-related or specially treated special page&lt;br /&gt;
	var m=pg.re.main.exec(h);&lt;br /&gt;
	if(m===null) { this.value=null; }&lt;br /&gt;
	else {&lt;br /&gt;
		var fromBotInterface = /[?](.+[&amp;amp;])?title=/.test(h);&lt;br /&gt;
		if (fromBotInterface) {&lt;br /&gt;
			m[2]=m[2].split(&#039;+&#039;).join(&#039;_&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		var extracted = m[2] + (m[3] ? &#039;#&#039; + m[3] : &#039;&#039;);&lt;br /&gt;
		if (pg.flag.isSafari &amp;amp;&amp;amp; /%25[0-9A-Fa-f]{2}/.test(extracted)) {&lt;br /&gt;
			// Fix Safari issue&lt;br /&gt;
			// Safari sometimes encodes % as %25 in UTF-8 encoded strings like %E5%A3 -&amp;gt; %25E5%25A3.&lt;br /&gt;
			this.setUtf(decodeURIComponent(unescape(extracted)));&lt;br /&gt;
		} else {&lt;br /&gt;
			this.setUtf(this.decodeNasties(extracted));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.decodeNasties=function(txt) {&lt;br /&gt;
	var ret= this.decodeEscapes(decodeURI(txt));&lt;br /&gt;
	ret = ret.replace(/[_ ]*$/, &#039;&#039;);&lt;br /&gt;
	return ret;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.decodeEscapes=function(txt) {&lt;br /&gt;
	var split=txt.parenSplit(/((?:[%][0-9A-Fa-f]{2})+)/);&lt;br /&gt;
	var len=split.length;&lt;br /&gt;
	for (var i=1; i&amp;lt;len; i=i+2) {&lt;br /&gt;
		// FIXME is decodeURIComponent better?&lt;br /&gt;
		split[i]=unescape(split[i]);&lt;br /&gt;
	}&lt;br /&gt;
	return split.join(&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
Title.fromAnchor=function(a) {&lt;br /&gt;
	return new Title().fromAnchor(a);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromAnchor=function(a) {&lt;br /&gt;
	if (!a) { this.value=null; return this; }&lt;br /&gt;
	return this.fromURL(a.href);&lt;br /&gt;
};&lt;br /&gt;
Title.fromWikiText=function(txt) {&lt;br /&gt;
	return new Title().fromWikiText(txt);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.fromWikiText=function(txt) {&lt;br /&gt;
	// FIXME - testing needed&lt;br /&gt;
	if (!pg.flag.linksLikeIE6) { txt=myDecodeURI(txt); }&lt;br /&gt;
	this.setUtf(txt);&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.hintValue=function(){&lt;br /&gt;
	if(!this.value) { return &#039;&#039;; }&lt;br /&gt;
	return safeDecodeURI(this.value);&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.toUserName=function(withNs) {&lt;br /&gt;
	if (this.namespaceId() != pg.nsUserId &amp;amp;&amp;amp; this.namespaceId() != pg.nsUsertalkId) {&lt;br /&gt;
		this.value=null;&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	this.value = (withNs ? mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId] + &#039;:&#039; : &#039;&#039;) + this.stripNamespace().split(&#039;/&#039;)[0];&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.userName=function(withNs) {&lt;br /&gt;
	var t=(new Title(this.value));&lt;br /&gt;
	t.toUserName(withNs);&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toTalkPage=function() {&lt;br /&gt;
	// convert article to a talk page, or if we can&#039;t, return null&lt;br /&gt;
	// In other words: return null if this ALREADY IS a talk page&lt;br /&gt;
	// and return the corresponding talk page otherwise&lt;br /&gt;
	//&lt;br /&gt;
	// Per http://www.mediawiki.org/wiki/Manual:Namespace#Subject_and_talk_namespaces&lt;br /&gt;
	// * All discussion namespaces have odd-integer indices&lt;br /&gt;
	// * The discussion namespace index for a specific namespace with index n is n + 1&lt;br /&gt;
	if (this.value===null) { return null; }&lt;br /&gt;
	&lt;br /&gt;
	var namespaceId = this.namespaceId();&lt;br /&gt;
	if (namespaceId&amp;gt;=0 &amp;amp;&amp;amp; namespaceId % 2 == 0) //non-special and subject namespace&lt;br /&gt;
	{&lt;br /&gt;
		var localizedNamespace = mw.config.get(&#039;wgFormattedNamespaces&#039;)[namespaceId+1];&lt;br /&gt;
		if (typeof localizedNamespace!==&#039;undefined&#039;)&lt;br /&gt;
		{&lt;br /&gt;
			if (localizedNamespace===&#039;&#039;) return this.value = this.stripNamespace();&lt;br /&gt;
			this.value = localizedNamespace.split(&#039; &#039;).join(&#039;_&#039;) + &#039;:&#039; + this.stripNamespace();&lt;br /&gt;
			return this.value;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// Return canonical, localized namespace&lt;br /&gt;
Title.prototype.namespace=function() {&lt;br /&gt;
	return mw.config.get(&#039;wgFormattedNamespaces&#039;)[this.namespaceId()];&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.namespaceId=function() {&lt;br /&gt;
	var n=this.value.indexOf(&#039;:&#039;);&lt;br /&gt;
	if (n&amp;lt;0) { return 0; } //mainspace&lt;br /&gt;
	var namespaceId = mw.config.get(&#039;wgNamespaceIds&#039;)[this.value.substring(0,n).split(&#039; &#039;).join(&#039;_&#039;).toLowerCase()];&lt;br /&gt;
	if (typeof namespaceId==&#039;undefined&#039;) return 0; //mainspace&lt;br /&gt;
	return namespaceId;&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.talkPage=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	t.toTalkPage();&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.isTalkPage=function() {&lt;br /&gt;
	if (this.talkPage()===null) { return true; }&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toArticleFromTalkPage=function() {&lt;br /&gt;
	//largely copy/paste from toTalkPage above.&lt;br /&gt;
	if (this.value===null) { return null; }&lt;br /&gt;
	&lt;br /&gt;
	var namespaceId = this.namespaceId();&lt;br /&gt;
	if (namespaceId&amp;gt;=0 &amp;amp;&amp;amp; namespaceId % 2 == 1) //non-special and talk namespace&lt;br /&gt;
	{&lt;br /&gt;
		var localizedNamespace = mw.config.get(&#039;wgFormattedNamespaces&#039;)[namespaceId-1];&lt;br /&gt;
		if (typeof localizedNamespace!==&#039;undefined&#039;)&lt;br /&gt;
		{&lt;br /&gt;
			if (localizedNamespace===&#039;&#039;) return this.value = this.stripNamespace();&lt;br /&gt;
			this.value = localizedNamespace.split(&#039; &#039;).join(&#039;_&#039;) + &#039;:&#039; + this.stripNamespace();&lt;br /&gt;
			return this.value;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	this.value=null;&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.articleFromTalkPage=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	t.toArticleFromTalkPage();&lt;br /&gt;
	if (t.value) { return t; }&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.articleFromTalkOrArticle=function() {&lt;br /&gt;
	var t=new Title(this.value);&lt;br /&gt;
	if ( t.toArticleFromTalkPage() ) { return t; }&lt;br /&gt;
	return this;&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.isIpUser=function() {&lt;br /&gt;
	return pg.re.ipUser.test(this.userName());&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
Title.prototype.stripNamespace=function(){ // returns a string, not a Title&lt;br /&gt;
	var n=this.value.indexOf(&#039;:&#039;);&lt;br /&gt;
	if (n&amp;lt;0) { return this.value; }&lt;br /&gt;
	var namespaceId = this.namespaceId();&lt;br /&gt;
	if (namespaceId===pg.nsMainspaceId) return this.value;&lt;br /&gt;
	return this.value.substring(n+1);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.setUtf=function(value){&lt;br /&gt;
	if (!value) { this.value=&#039;&#039;; return; }&lt;br /&gt;
	var anch=value.indexOf(&#039;#&#039;);&lt;br /&gt;
	if(anch &amp;lt; 0) { this.value=value.split(&#039;_&#039;).join(&#039; &#039;); this.anchor=&#039;&#039;; return; }&lt;br /&gt;
	this.value=value.substring(0,anch).split(&#039;_&#039;).join(&#039; &#039;);&lt;br /&gt;
	this.anchor=value.substring(anch+1);&lt;br /&gt;
	this.ns=null; // wait until namespace() is called&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.setUrl=function(urlfrag) {&lt;br /&gt;
	var anch=urlfrag.indexOf(&#039;#&#039;);&lt;br /&gt;
	this.value=safeDecodeURI(urlfrag.substring(0,anch));&lt;br /&gt;
	this.anchor=value.substring(anch+1);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.append=function(x){&lt;br /&gt;
	this.setUtf(this.value + x);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.urlString=function(x) {&lt;br /&gt;
	x || ( x={} );&lt;br /&gt;
	var v=this.toString(true);&lt;br /&gt;
	if (!x.omitAnchor &amp;amp;&amp;amp; this.anchor) { v+= &#039;#&#039; + this.urlAnchor(); }&lt;br /&gt;
	if (!x.keepSpaces) { v=v.split(&#039; &#039;).join(&#039;_&#039;); }&lt;br /&gt;
	return encodeURI(v).split(&#039;&amp;amp;&#039;).join(&#039;%26&#039;).split(&#039;?&#039;).join(&#039;%3F&#039;).split(&#039;+&#039;).join(&#039;%2B&#039;);&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.removeAnchor=function() {&lt;br /&gt;
	return new Title(this.toString(true));&lt;br /&gt;
};&lt;br /&gt;
Title.prototype.toUrl=function() {&lt;br /&gt;
	return pg.wiki.titlebase + this.urlString();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function paramValue(param, url) {&lt;br /&gt;
	var s=url.parenSplit(RegExp(&#039;[?&amp;amp;]&#039; + literalizeRegex(param) + &#039;=([^?&amp;amp;]*)&#039;));&lt;br /&gt;
	if (!url) { return null; }&lt;br /&gt;
	return s[1] || null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function parseParams(url) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	if (url.indexOf(&#039;?&#039;)==-1) { return ret; }&lt;br /&gt;
	var s=url.split(&#039;?&#039;).slice(1).join();&lt;br /&gt;
	var t=s.split(&#039;&amp;amp;&#039;);&lt;br /&gt;
	for (var i=0; i&amp;lt;t.length; ++i) {&lt;br /&gt;
		var z=t[i].split(&#039;=&#039;);&lt;br /&gt;
		z.push(null);&lt;br /&gt;
		ret[z[0]]=z[1];&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// all sorts of stuff here&lt;br /&gt;
// FIXME almost everything needs to be rewritten&lt;br /&gt;
&lt;br /&gt;
function oldidFromAnchor(a) { return paramValue(&#039;oldid&#039;, a.href); }&lt;br /&gt;
//function diffFromAnchor(a) { return paramValue(&#039;diff&#039;, a.href); }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function wikiMarkupToAddressFragment (str) { // for images&lt;br /&gt;
	var ret = safeDecodeURI(str);&lt;br /&gt;
	ret = ret.split(&#039; &#039;).join(&#039;_&#039;);&lt;br /&gt;
	ret = encodeURI(ret);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// (a) myDecodeURI (first standard decodeURI, then pg.re.urlNoPopup)&lt;br /&gt;
// (b) change spaces to underscores&lt;br /&gt;
// (c) encodeURI (just the straight one, no pg.re.urlNoPopup)&lt;br /&gt;
&lt;br /&gt;
function myDecodeURI (str) {&lt;br /&gt;
	var ret;&lt;br /&gt;
	// FIXME decodeURIComponent??&lt;br /&gt;
	try { ret=decodeURI(str.toString()); }&lt;br /&gt;
	catch (summat) { return str; }&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.misc.decodeExtras.length; ++i) {&lt;br /&gt;
		var from=pg.misc.decodeExtras[i].from;&lt;br /&gt;
		var to=pg.misc.decodeExtras[i].to;&lt;br /&gt;
		ret=ret.split(from).join(to);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function safeDecodeURI(str) { var ret=myDecodeURI(str); return ret || str; }&lt;br /&gt;
&lt;br /&gt;
///////////&lt;br /&gt;
// TESTS //&lt;br /&gt;
///////////&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function isIpUser(user) {return pg.re.ipUser.test(user);}&lt;br /&gt;
&lt;br /&gt;
function isDisambig(data, article) {&lt;br /&gt;
	if (!getValueOf(&#039;popupAllDabsStubs&#039;) &amp;amp;&amp;amp; article.namespace()) { return false; }&lt;br /&gt;
	return ! article.isTalkPage() &amp;amp;&amp;amp; pg.re.disambig.test(data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function stubCount(data, article) {&lt;br /&gt;
	if (!getValueOf(&#039;popupAllDabsStubs&#039;) &amp;amp;&amp;amp; article.namespace()) { return false; }&lt;br /&gt;
	var sectStub=0;&lt;br /&gt;
	var realStub=0;&lt;br /&gt;
	if (pg.re.stub.test(data)) {&lt;br /&gt;
		var s=data.parenSplit(pg.re.stub);&lt;br /&gt;
		for (var i=1; i&amp;lt;s.length; i=i+2) {&lt;br /&gt;
			if (s[i]) { ++sectStub; }&lt;br /&gt;
			else { ++realStub; }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return { real: realStub, sect: sectStub };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function isValidImageName(str){ // extend as needed...&lt;br /&gt;
	return ( str.indexOf(&#039;{&#039;) == -1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function isInStrippableNamespace(article) {&lt;br /&gt;
	//I believe that this method means to return whether the given article is in a namspace without subpages. Meaning, it&#039;s broken.&lt;br /&gt;
	return ( article.namespace() !== &#039;&#039; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function isInMainNamespace(article) { return !isInStrippableNamespace(article); }&lt;br /&gt;
&lt;br /&gt;
function anchorContainsImage(a) {&lt;br /&gt;
	// iterate over children of anchor a&lt;br /&gt;
	// see if any are images&lt;br /&gt;
	if (a===null) { return false; }&lt;br /&gt;
	kids=a.childNodes;&lt;br /&gt;
	for (var i=0; i&amp;lt;kids.length; ++i) { if (kids[i].nodeName==&#039;IMG&#039;) { return true; } }&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
function isPopupLink(a) {&lt;br /&gt;
	// NB for performance reasons, TOC links generally return true&lt;br /&gt;
	// they should be stripped out later&lt;br /&gt;
&lt;br /&gt;
	if (!markNopopupSpanLinks.done) { markNopopupSpanLinks(); }&lt;br /&gt;
	if (a.inNopopupSpan) { return false; }&lt;br /&gt;
&lt;br /&gt;
	// FIXME is this faster inline?&lt;br /&gt;
	if (a.onmousedown || a.getAttribute(&#039;nopopup&#039;)) { return false; }&lt;br /&gt;
	var h=a.href;&lt;br /&gt;
	if (h===document.location.href+&#039;#&#039;) { return false; }&lt;br /&gt;
	if (!pg.re.basenames.test(h)) { return false; }&lt;br /&gt;
	if (!pg.re.urlNoPopup.test(h)) { return true;	}&lt;br /&gt;
	return (&lt;br /&gt;
		(pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h)) &amp;amp;&amp;amp;&lt;br /&gt;
		h.indexOf(&#039;&amp;amp;limit=&#039;) == -1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function markNopopupSpanLinks() {&lt;br /&gt;
	if( !getValueOf(&#039;popupOnlyArticleLinks&#039;))&lt;br /&gt;
		fixVectorMenuPopups();&lt;br /&gt;
&lt;br /&gt;
	var s = $(&#039;.nopopups&#039;).toArray();&lt;br /&gt;
	for (var i=0; i&amp;lt;s.length; ++i) {&lt;br /&gt;
		var as=s[i].getElementsByTagName(&#039;a&#039;);&lt;br /&gt;
		for (var j=0; j&amp;lt;as.length; ++j) {&lt;br /&gt;
			as[j].inNopopupSpan=true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	markNopopupSpanLinks.done=true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function fixVectorMenuPopups() {&lt;br /&gt;
	$(&#039;div.vectorMenu h3:first a:first&#039;).prop(&#039;inNopopupSpan&#039;, true);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: titles.js&lt;br /&gt;
// STARTFILE: cookies.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Cookie handling&lt;br /&gt;
// from http://www.quirksmode.org/js/cookies.html&lt;br /&gt;
&lt;br /&gt;
var Cookie= {&lt;br /&gt;
	create: function(name,value,days)&lt;br /&gt;
	{&lt;br /&gt;
		var expires;&lt;br /&gt;
		if (days)&lt;br /&gt;
		{&lt;br /&gt;
			var date = new Date();&lt;br /&gt;
			date.setTime(date.getTime()+(days*24*60*60*1000));&lt;br /&gt;
			expires = &amp;quot;; expires=&amp;quot;+date.toGMTString();&lt;br /&gt;
		}&lt;br /&gt;
		else { expires = &amp;quot;&amp;quot;; }&lt;br /&gt;
		document.cookie = name+&amp;quot;=&amp;quot;+value+expires+&amp;quot;; path=/&amp;quot;;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	read: function(name)&lt;br /&gt;
	{&lt;br /&gt;
		var nameEQ = name + &amp;quot;=&amp;quot;;&lt;br /&gt;
		var ca = document.cookie.split(&#039;;&#039;);&lt;br /&gt;
		for(var i=0;i &amp;lt; ca.length;i++)&lt;br /&gt;
		{&lt;br /&gt;
			var c = ca[i];&lt;br /&gt;
			while (c.charAt(0)==&#039; &#039;) { c = c.substring(1,c.length); }&lt;br /&gt;
			if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	erase: function(name)&lt;br /&gt;
	{&lt;br /&gt;
		Cookie.create(name,&amp;quot;&amp;quot;,-1);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: cookies.js&lt;br /&gt;
// STARTFILE: getpage.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Wiki-specific downloading&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Schematic for a getWiki call&lt;br /&gt;
//&lt;br /&gt;
//   getWiki-&amp;gt;-getPageWithCaching&lt;br /&gt;
//					|&lt;br /&gt;
//	   false		|		  true&lt;br /&gt;
// getPage&amp;lt;-[findPictureInCache]-&amp;gt;-onComplete(a fake download)&lt;br /&gt;
//   \.&lt;br /&gt;
//	 (async)-&amp;gt;addPageToCache(download)-&amp;gt;-onComplete(download)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** @todo {document}&lt;br /&gt;
	@param {Title} article&lt;br /&gt;
	@param {Function} onComplete&lt;br /&gt;
	@param {integer} oldid&lt;br /&gt;
	@param {Navapopup} owner&lt;br /&gt;
*/&lt;br /&gt;
function getWiki(article, onComplete, oldid, owner) {&lt;br /&gt;
	// set ctype=text/css to get around opera gzip bug&lt;br /&gt;
	var url = pg.wiki.titlebase + article.removeAnchor().urlString() +&lt;br /&gt;
		&#039;&amp;amp;action=raw&amp;amp;ctype=text/css&#039;;&lt;br /&gt;
	if (oldid || oldid===0 || oldid===&#039;0&#039;) { url += &#039;&amp;amp;oldid=&#039;+oldid; }&lt;br /&gt;
	url += &#039;&amp;amp;maxage=0&amp;amp;smaxage=0&#039;;&lt;br /&gt;
&lt;br /&gt;
	getPageWithCaching(url, onComplete, owner);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// check cache to see if page exists&lt;br /&gt;
&lt;br /&gt;
function getPageWithCaching(url, onComplete, owner) {&lt;br /&gt;
	log(&#039;getPageWithCaching, url=&#039;+url);&lt;br /&gt;
	var i=findInPageCache(url);&lt;br /&gt;
	if (i &amp;gt; -1) {&lt;br /&gt;
		var d=fakeDownload(url, owner.idNumber, onComplete,&lt;br /&gt;
				   pg.cache.pages[i].data, pg.cache.pages[i].lastModified,&lt;br /&gt;
				   owner);&lt;br /&gt;
	} else {&lt;br /&gt;
		var d=getPage(url, onComplete, owner);&lt;br /&gt;
		if (d &amp;amp;&amp;amp; owner &amp;amp;&amp;amp; owner.addDownload) {&lt;br /&gt;
			owner.addDownload(d);&lt;br /&gt;
			d.owner=owner;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPage(url, onComplete, owner) {&lt;br /&gt;
	log(&#039;getPage&#039;);&lt;br /&gt;
	var callback= function (d) { if (!d.aborted) {addPageToCache(d); onComplete(d);} };&lt;br /&gt;
	return startDownload(url, owner.idNumber, callback);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function findInPageCache(url) {&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.cache.pages.length; ++i) {&lt;br /&gt;
		if (url==pg.cache.pages[i].url) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addPageToCache(download) {&lt;br /&gt;
	log(&#039;addPageToCache &#039;+download.url);&lt;br /&gt;
	var page = {url: download.url, data: download.data, lastModified: download.lastModified};&lt;br /&gt;
	return pg.cache.pages.push(page);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: getpage.js&lt;br /&gt;
// STARTFILE: md5-2.2alpha.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message&lt;br /&gt;
 * Digest Algorithm, as defined in RFC 1321.&lt;br /&gt;
 * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005&lt;br /&gt;
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet&lt;br /&gt;
 * Distributed under the BSD License&lt;br /&gt;
 * See http://pajhome.org.uk/crypt/md5 for more info.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Configurable variables. You may need to tweak these to be compatible with&lt;br /&gt;
 * the server-side, but the defaults work in most cases.&lt;br /&gt;
 */&lt;br /&gt;
var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase		 */&lt;br /&gt;
var b64pad  = &amp;quot;&amp;quot;; /* base-64 pad character. &amp;quot;=&amp;quot; for strict RFC compliance   */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * These are the functions you&#039;ll usually want to call&lt;br /&gt;
 * They take string arguments and return either hex or base-64 encoded strings&lt;br /&gt;
 */&lt;br /&gt;
function hex_md5(s)	{ return rstr2hex(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function b64_md5(s)	{ return rstr2b64(rstr_md5(str2rstr_utf8(s))); }&lt;br /&gt;
function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }&lt;br /&gt;
function hex_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function b64_hmac_md5(k, d)&lt;br /&gt;
  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }&lt;br /&gt;
function any_hmac_md5(k, d, e)&lt;br /&gt;
  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Perform a simple self-test to see if the VM is working&lt;br /&gt;
 */&lt;br /&gt;
function md5_vm_test()&lt;br /&gt;
{&lt;br /&gt;
  return hex_md5(&amp;quot;abc&amp;quot;) == &amp;quot;900150983cd24fb0d6963f7d28e17f72&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of a raw string&lt;br /&gt;
 */&lt;br /&gt;
function rstr_md5(s)&lt;br /&gt;
{&lt;br /&gt;
  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the HMAC-MD5, of a key and some data (raw strings)&lt;br /&gt;
 */&lt;br /&gt;
function rstr_hmac_md5(key, data)&lt;br /&gt;
{&lt;br /&gt;
  var bkey = rstr2binl(key);&lt;br /&gt;
  if(bkey.length &amp;gt; 16) bkey = binl_md5(bkey, key.length * 8);&lt;br /&gt;
&lt;br /&gt;
  var ipad = Array(16), opad = Array(16);&lt;br /&gt;
  for(var i = 0; i &amp;lt; 16; i++)&lt;br /&gt;
  {&lt;br /&gt;
	ipad[i] = bkey[i] ^ 0x36363636;&lt;br /&gt;
	opad[i] = bkey[i] ^ 0x5C5C5C5C;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);&lt;br /&gt;
  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a hex string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2hex(input)&lt;br /&gt;
{&lt;br /&gt;
  var hex_tab = hexcase ? &amp;quot;0123456789ABCDEF&amp;quot; : &amp;quot;0123456789abcdef&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var x;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
	x = input.charCodeAt(i);&lt;br /&gt;
	output += hex_tab.charAt((x &amp;gt;&amp;gt;&amp;gt; 4) &amp;amp; 0x0F)&lt;br /&gt;
	   +  hex_tab.charAt( x		   &amp;amp; 0x0F);&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to a base-64 string&lt;br /&gt;
 */&lt;br /&gt;
function rstr2b64(input)&lt;br /&gt;
{&lt;br /&gt;
  var tab = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;quot;;&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var len = input.length;&lt;br /&gt;
  for(var i = 0; i &amp;lt; len; i += 3)&lt;br /&gt;
  {&lt;br /&gt;
	var triplet = (input.charCodeAt(i) &amp;lt;&amp;lt; 16)&lt;br /&gt;
		| (i + 1 &amp;lt; len ? input.charCodeAt(i+1) &amp;lt;&amp;lt; 8 : 0)&lt;br /&gt;
		| (i + 2 &amp;lt; len ? input.charCodeAt(i+2)		: 0);&lt;br /&gt;
	for(var j = 0; j &amp;lt; 4; j++)&lt;br /&gt;
	{&lt;br /&gt;
	  if(i * 8 + j * 6 &amp;gt; input.length * 8) output += b64pad;&lt;br /&gt;
	  else output += tab.charAt((triplet &amp;gt;&amp;gt;&amp;gt; 6*(3-j)) &amp;amp; 0x3F);&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an arbitrary string encoding&lt;br /&gt;
 */&lt;br /&gt;
function rstr2any(input, encoding)&lt;br /&gt;
{&lt;br /&gt;
  var divisor = encoding.length;&lt;br /&gt;
  var remainders = Array();&lt;br /&gt;
  var i, q, x, quotient;&lt;br /&gt;
&lt;br /&gt;
  /* Convert to an array of 16-bit big-endian values, forming the dividend */&lt;br /&gt;
  var dividend = Array(input.length / 2);&lt;br /&gt;
  for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
  {&lt;br /&gt;
	dividend[i] = (input.charCodeAt(i * 2) &amp;lt;&amp;lt; 8) | input.charCodeAt(i * 2 + 1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /*&lt;br /&gt;
   * Repeatedly perform a long division. The binary array forms the dividend,&lt;br /&gt;
   * the length of the encoding is the divisor. Once computed, the quotient&lt;br /&gt;
   * forms the dividend for the next step. We stop when the dividend is zero.&lt;br /&gt;
   * All remainders are stored for later use.&lt;br /&gt;
   */&lt;br /&gt;
  while(dividend.length &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
	quotient = Array();&lt;br /&gt;
	x = 0;&lt;br /&gt;
	for(i = 0; i &amp;lt; dividend.length; i++)&lt;br /&gt;
	{&lt;br /&gt;
	  x = (x &amp;lt;&amp;lt; 16) + dividend[i];&lt;br /&gt;
	  q = Math.floor(x / divisor);&lt;br /&gt;
	  x -= q * divisor;&lt;br /&gt;
	  if(quotient.length &amp;gt; 0 || q &amp;gt; 0)&lt;br /&gt;
	quotient[quotient.length] = q;&lt;br /&gt;
	}&lt;br /&gt;
	remainders[remainders.length] = x;&lt;br /&gt;
	dividend = quotient;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* Convert the remainders to the output string */&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(i = remainders.length - 1; i &amp;gt;= 0; i--)&lt;br /&gt;
	output += encoding.charAt(remainders[i]);&lt;br /&gt;
&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-8.&lt;br /&gt;
 * For efficiency, this assumes the input is valid utf-16.&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf8(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  var i = -1;&lt;br /&gt;
  var x, y;&lt;br /&gt;
&lt;br /&gt;
  while(++i &amp;lt; input.length)&lt;br /&gt;
  {&lt;br /&gt;
	/* Decode utf-16 surrogate pairs */&lt;br /&gt;
	x = input.charCodeAt(i);&lt;br /&gt;
	y = i + 1 &amp;lt; input.length ? input.charCodeAt(i + 1) : 0;&lt;br /&gt;
	if(0xD800 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt;= 0xDBFF &amp;amp;&amp;amp; 0xDC00 &amp;lt;= y &amp;amp;&amp;amp; y &amp;lt;= 0xDFFF)&lt;br /&gt;
	{&lt;br /&gt;
	  x = 0x10000 + ((x &amp;amp; 0x03FF) &amp;lt;&amp;lt; 10) + (y &amp;amp; 0x03FF);&lt;br /&gt;
	  i++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Encode output as utf-8 */&lt;br /&gt;
	if(x &amp;lt;= 0x7F)&lt;br /&gt;
	  output += String.fromCharCode(x);&lt;br /&gt;
	else if(x &amp;lt;= 0x7FF)&lt;br /&gt;
	  output += String.fromCharCode(0xC0 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x1F),&lt;br /&gt;
					0x80 | ( x		   &amp;amp; 0x3F));&lt;br /&gt;
	else if(x &amp;lt;= 0xFFFF)&lt;br /&gt;
	  output += String.fromCharCode(0xE0 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x0F),&lt;br /&gt;
					0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
					0x80 | ( x		   &amp;amp; 0x3F));&lt;br /&gt;
	else if(x &amp;lt;= 0x1FFFFF)&lt;br /&gt;
	  output += String.fromCharCode(0xF0 | ((x &amp;gt;&amp;gt;&amp;gt; 18) &amp;amp; 0x07),&lt;br /&gt;
					0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 12) &amp;amp; 0x3F),&lt;br /&gt;
					0x80 | ((x &amp;gt;&amp;gt;&amp;gt; 6 ) &amp;amp; 0x3F),&lt;br /&gt;
					0x80 | ( x		   &amp;amp; 0x3F));&lt;br /&gt;
  }&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Encode a string as utf-16&lt;br /&gt;
 */&lt;br /&gt;
function str2rstr_utf16le(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
	output += String.fromCharCode( input.charCodeAt(i)		  &amp;amp; 0xFF,&lt;br /&gt;
				  (input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function str2rstr_utf16be(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length; i++)&lt;br /&gt;
	output += String.fromCharCode((input.charCodeAt(i) &amp;gt;&amp;gt;&amp;gt; 8) &amp;amp; 0xFF,&lt;br /&gt;
				   input.charCodeAt(i)		  &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert a raw string to an array of little-endian words&lt;br /&gt;
 * Characters &amp;gt;255 have their high-byte silently ignored.&lt;br /&gt;
 */&lt;br /&gt;
function rstr2binl(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = Array(input.length &amp;gt;&amp;gt; 2);&lt;br /&gt;
  for(var i = 0; i &amp;lt; output.length; i++)&lt;br /&gt;
	output[i] = 0;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 8; i += 8)&lt;br /&gt;
	output[i&amp;gt;&amp;gt;5] |= (input.charCodeAt(i / 8) &amp;amp; 0xFF) &amp;lt;&amp;lt; (i%32);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Convert an array of little-endian words to a string&lt;br /&gt;
 */&lt;br /&gt;
function binl2rstr(input)&lt;br /&gt;
{&lt;br /&gt;
  var output = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var i = 0; i &amp;lt; input.length * 32; i += 8)&lt;br /&gt;
	output += String.fromCharCode((input[i&amp;gt;&amp;gt;5] &amp;gt;&amp;gt;&amp;gt; (i % 32)) &amp;amp; 0xFF);&lt;br /&gt;
  return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Calculate the MD5 of an array of little-endian words, and a bit length.&lt;br /&gt;
 */&lt;br /&gt;
function binl_md5(x, len)&lt;br /&gt;
{&lt;br /&gt;
  /* append padding */&lt;br /&gt;
  x[len &amp;gt;&amp;gt; 5] |= 0x80 &amp;lt;&amp;lt; ((len) % 32);&lt;br /&gt;
  x[(((len + 64) &amp;gt;&amp;gt;&amp;gt; 9) &amp;lt;&amp;lt; 4) + 14] = len;&lt;br /&gt;
&lt;br /&gt;
  var a =  1732584193;&lt;br /&gt;
  var b = -271733879;&lt;br /&gt;
  var c = -1732584194;&lt;br /&gt;
  var d =  271733878;&lt;br /&gt;
&lt;br /&gt;
  for(var i = 0; i &amp;lt; x.length; i += 16)&lt;br /&gt;
  {&lt;br /&gt;
	var olda = a;&lt;br /&gt;
	var oldb = b;&lt;br /&gt;
	var oldc = c;&lt;br /&gt;
	var oldd = d;&lt;br /&gt;
&lt;br /&gt;
	a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);&lt;br /&gt;
	d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);&lt;br /&gt;
	c = md5_ff(c, d, a, b, x[i+ 2], 17,	 606105819);&lt;br /&gt;
	b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);&lt;br /&gt;
	a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);&lt;br /&gt;
	d = md5_ff(d, a, b, c, x[i+ 5], 12,	 1200080426);&lt;br /&gt;
	c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);&lt;br /&gt;
	b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);&lt;br /&gt;
	a = md5_ff(a, b, c, d, x[i+ 8], 7 ,	 1770035416);&lt;br /&gt;
	d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);&lt;br /&gt;
	c = md5_ff(c, d, a, b, x[i+10], 17, -42063);&lt;br /&gt;
	b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);&lt;br /&gt;
	a = md5_ff(a, b, c, d, x[i+12], 7 ,	 1804603682);&lt;br /&gt;
	d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);&lt;br /&gt;
	c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);&lt;br /&gt;
	b = md5_ff(b, c, d, a, x[i+15], 22,	 1236535329);&lt;br /&gt;
&lt;br /&gt;
	a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);&lt;br /&gt;
	d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);&lt;br /&gt;
	c = md5_gg(c, d, a, b, x[i+11], 14,	 643717713);&lt;br /&gt;
	b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);&lt;br /&gt;
	a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);&lt;br /&gt;
	d = md5_gg(d, a, b, c, x[i+10], 9 ,	 38016083);&lt;br /&gt;
	c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);&lt;br /&gt;
	b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);&lt;br /&gt;
	a = md5_gg(a, b, c, d, x[i+ 9], 5 ,	 568446438);&lt;br /&gt;
	d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);&lt;br /&gt;
	c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);&lt;br /&gt;
	b = md5_gg(b, c, d, a, x[i+ 8], 20,	 1163531501);&lt;br /&gt;
	a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);&lt;br /&gt;
	d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);&lt;br /&gt;
	c = md5_gg(c, d, a, b, x[i+ 7], 14,	 1735328473);&lt;br /&gt;
	b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);&lt;br /&gt;
&lt;br /&gt;
	a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);&lt;br /&gt;
	d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);&lt;br /&gt;
	c = md5_hh(c, d, a, b, x[i+11], 16,	 1839030562);&lt;br /&gt;
	b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);&lt;br /&gt;
	a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);&lt;br /&gt;
	d = md5_hh(d, a, b, c, x[i+ 4], 11,	 1272893353);&lt;br /&gt;
	c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);&lt;br /&gt;
	b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);&lt;br /&gt;
	a = md5_hh(a, b, c, d, x[i+13], 4 ,	 681279174);&lt;br /&gt;
	d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);&lt;br /&gt;
	c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);&lt;br /&gt;
	b = md5_hh(b, c, d, a, x[i+ 6], 23,	 76029189);&lt;br /&gt;
	a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);&lt;br /&gt;
	d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);&lt;br /&gt;
	c = md5_hh(c, d, a, b, x[i+15], 16,	 530742520);&lt;br /&gt;
	b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);&lt;br /&gt;
&lt;br /&gt;
	a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);&lt;br /&gt;
	d = md5_ii(d, a, b, c, x[i+ 7], 10,	 1126891415);&lt;br /&gt;
	c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);&lt;br /&gt;
	b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);&lt;br /&gt;
	a = md5_ii(a, b, c, d, x[i+12], 6 ,	 1700485571);&lt;br /&gt;
	d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);&lt;br /&gt;
	c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);&lt;br /&gt;
	b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);&lt;br /&gt;
	a = md5_ii(a, b, c, d, x[i+ 8], 6 ,	 1873313359);&lt;br /&gt;
	d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);&lt;br /&gt;
	c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);&lt;br /&gt;
	b = md5_ii(b, c, d, a, x[i+13], 21,	 1309151649);&lt;br /&gt;
	a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);&lt;br /&gt;
	d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);&lt;br /&gt;
	c = md5_ii(c, d, a, b, x[i+ 2], 15,	 718787259);&lt;br /&gt;
	b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);&lt;br /&gt;
&lt;br /&gt;
	a = safe_add(a, olda);&lt;br /&gt;
	b = safe_add(b, oldb);&lt;br /&gt;
	c = safe_add(c, oldc);&lt;br /&gt;
	d = safe_add(d, oldd);&lt;br /&gt;
  }&lt;br /&gt;
  return Array(a, b, c, d);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * These functions implement the four basic operations the algorithm uses.&lt;br /&gt;
 */&lt;br /&gt;
function md5_cmn(q, a, b, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);&lt;br /&gt;
}&lt;br /&gt;
function md5_ff(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; c) | ((~b) &amp;amp; d), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_gg(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn((b &amp;amp; d) | (c &amp;amp; (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_hh(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
function md5_ii(a, b, c, d, x, s, t)&lt;br /&gt;
{&lt;br /&gt;
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally&lt;br /&gt;
 * to work around bugs in some JS interpreters.&lt;br /&gt;
 */&lt;br /&gt;
function safe_add(x, y)&lt;br /&gt;
{&lt;br /&gt;
  var lsw = (x &amp;amp; 0xFFFF) + (y &amp;amp; 0xFFFF);&lt;br /&gt;
  var msw = (x &amp;gt;&amp;gt; 16) + (y &amp;gt;&amp;gt; 16) + (lsw &amp;gt;&amp;gt; 16);&lt;br /&gt;
  return (msw &amp;lt;&amp;lt; 16) | (lsw &amp;amp; 0xFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Bitwise rotate a 32-bit number to the left.&lt;br /&gt;
 */&lt;br /&gt;
function bit_rol(num, cnt)&lt;br /&gt;
{&lt;br /&gt;
  return (num &amp;lt;&amp;lt; cnt) | (num &amp;gt;&amp;gt;&amp;gt; (32 - cnt));&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: md5-2.2alpha.js&lt;br /&gt;
// STARTFILE: parensplit.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// parenSplit&lt;br /&gt;
&lt;br /&gt;
// String.prototype.parenSplit should do what ECMAscript says String.prototype.split does,&lt;br /&gt;
// interspersing paren matches (regex capturing groups) between the split elements.&lt;br /&gt;
// i.e. &#039;abc&#039;.split(/(b)/)) should return [&#039;a&#039;,&#039;b&#039;,&#039;c&#039;], not [&#039;a&#039;,&#039;c&#039;]&lt;br /&gt;
&lt;br /&gt;
if (String(&#039;abc&#039;.split(/(b)/))!=&#039;a,b,c&#039;) {&lt;br /&gt;
	// broken String.split, e.g. konq, IE&lt;br /&gt;
	String.prototype.parenSplit=function (re) {&lt;br /&gt;
		re=nonGlobalRegex(re);&lt;br /&gt;
		var s=this;&lt;br /&gt;
		var m=re.exec(s);&lt;br /&gt;
		var ret=[];&lt;br /&gt;
		while (m &amp;amp;&amp;amp; s) {&lt;br /&gt;
			// without the following loop, we have&lt;br /&gt;
			// &#039;ab&#039;.parenSplit(/a|(b)/) != &#039;ab&#039;.split(/a|(b)/)&lt;br /&gt;
			for(var i=0; i&amp;lt;m.length; ++i) {&lt;br /&gt;
				if (typeof m[i]==&#039;undefined&#039;) m[i]=&#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			ret.push(s.substring(0,m.index));&lt;br /&gt;
			ret = ret.concat(m.slice(1));&lt;br /&gt;
			s=s.substring(m.index + m[0].length);&lt;br /&gt;
			m=re.exec(s);&lt;br /&gt;
		}&lt;br /&gt;
		ret.push(s);&lt;br /&gt;
		return ret;&lt;br /&gt;
	};&lt;br /&gt;
} else {&lt;br /&gt;
	String.prototype.parenSplit=function (re) { return this.split(re); };&lt;br /&gt;
	String.prototype.parenSplit.isNative=true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nonGlobalRegex(re) {&lt;br /&gt;
	var s=re.toString();&lt;br /&gt;
	flags=&#039;&#039;;&lt;br /&gt;
	for (var j=s.length; s.charAt(j) != &#039;/&#039;; --j) {&lt;br /&gt;
		if (s.charAt(j) != &#039;g&#039;) { flags += s.charAt(j); }&lt;br /&gt;
	}&lt;br /&gt;
	var t=s.substring(1,j);&lt;br /&gt;
	return RegExp(t,flags);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: parensplit.js&lt;br /&gt;
// STARTFILE: tools.js&lt;br /&gt;
// IE madness with encoding&lt;br /&gt;
// ========================&lt;br /&gt;
//&lt;br /&gt;
// suppose throughout that the page is in utf8, like wikipedia&lt;br /&gt;
//&lt;br /&gt;
// if a is an anchor DOM element and a.href should consist of&lt;br /&gt;
//&lt;br /&gt;
// http://host.name.here/wiki/foo?bar=baz&lt;br /&gt;
//&lt;br /&gt;
// then IE gives foo as &amp;quot;latin1-encoded&amp;quot; utf8; we have foo = decode_utf8(decodeURI(foo_ie))&lt;br /&gt;
// but IE gives bar=baz correctly as plain utf8&lt;br /&gt;
//&lt;br /&gt;
// ---------------------------------&lt;br /&gt;
//&lt;br /&gt;
// IE&#039;s xmlhttp doesn&#039;t understand utf8 urls. Have to use encodeURI here.&lt;br /&gt;
//&lt;br /&gt;
// ---------------------------------&lt;br /&gt;
//&lt;br /&gt;
// summat else&lt;br /&gt;
&lt;br /&gt;
// Source: http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/utf8.htm&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function encode_utf8(rohtext) {&lt;br /&gt;
	// dient der Normalisierung des Zeilenumbruchs&lt;br /&gt;
	rohtext = rohtext.replace(/\r\n/g,&amp;quot;\n&amp;quot;);&lt;br /&gt;
	var utftext = &amp;quot;&amp;quot;;&lt;br /&gt;
	for(var n=0; n&amp;lt;rohtext.length; n++)&lt;br /&gt;
	{&lt;br /&gt;
		// ermitteln des Unicodes des  aktuellen Zeichens&lt;br /&gt;
		var c=rohtext.charCodeAt(n);&lt;br /&gt;
		// alle Zeichen von 0-127 =&amp;gt; 1byte&lt;br /&gt;
		if (c&amp;lt;128)&lt;br /&gt;
			utftext += String.fromCharCode(c);&lt;br /&gt;
		// alle Zeichen von 127 bis 2047 =&amp;gt; 2byte&lt;br /&gt;
		else if((c&amp;gt;127) &amp;amp;&amp;amp; (c&amp;lt;2048)) {&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;gt;&amp;gt;6)|192);&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;amp;63)|128);}&lt;br /&gt;
		// alle Zeichen von 2048 bis 66536 =&amp;gt; 3byte&lt;br /&gt;
		else {&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;gt;&amp;gt;12)|224);&lt;br /&gt;
			utftext += String.fromCharCode(((c&amp;gt;&amp;gt;6)&amp;amp;63)|128);&lt;br /&gt;
			utftext += String.fromCharCode((c&amp;amp;63)|128);}&lt;br /&gt;
	}&lt;br /&gt;
	return utftext;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getJsObj(json) {&lt;br /&gt;
	try {&lt;br /&gt;
		var json_ret = eval(&#039;(&#039; + json + &#039;)&#039;);&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		errlog(&#039;Something went wrong with getJsobj, json=&#039;+json);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	if( json_ret[&#039;warnings&#039;] ) {&lt;br /&gt;
		for( var w=0; w &amp;lt; json_ret[&#039;warnings&#039;].length; w++ ) {&lt;br /&gt;
			log( json_ret[&#039;warnings&#039;][w][&#039;*&#039;] );&lt;br /&gt;
		}&lt;br /&gt;
	} else if ( json_ret[&#039;error&#039;] ) {&lt;br /&gt;
		errlog( json_ret[&#039;error&#039;].code + &#039;: &#039; + json_ret[&#039;error&#039;].info );&lt;br /&gt;
	}&lt;br /&gt;
	return json_ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function anyChild(obj) {&lt;br /&gt;
	for (var p in obj) {&lt;br /&gt;
		return obj[p];&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function decode_utf8(utftext) {&lt;br /&gt;
	var plaintext = &amp;quot;&amp;quot;; var i=0, c=0, c1=0, c2=0;&lt;br /&gt;
	// while-Schleife, weil einige Zeichen uebersprungen werden&lt;br /&gt;
	while(i&amp;lt;utftext.length)&lt;br /&gt;
	{&lt;br /&gt;
		c = utftext.charCodeAt(i);&lt;br /&gt;
		if (c&amp;lt;128) {&lt;br /&gt;
			plaintext += String.fromCharCode(c);&lt;br /&gt;
			i++;}&lt;br /&gt;
		else if((c&amp;gt;191) &amp;amp;&amp;amp; (c&amp;lt;224)) {&lt;br /&gt;
			c2 = utftext.charCodeAt(i+1);&lt;br /&gt;
			plaintext += String.fromCharCode(((c&amp;amp;31)&amp;lt;&amp;lt;6) | (c2&amp;amp;63));&lt;br /&gt;
			i+=2;}&lt;br /&gt;
		else {&lt;br /&gt;
			c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2);&lt;br /&gt;
			plaintext += String.fromCharCode(((c&amp;amp;15)&amp;lt;&amp;lt;12) | ((c2&amp;amp;63)&amp;lt;&amp;lt;6) | (c3&amp;amp;63));&lt;br /&gt;
			i+=3;}&lt;br /&gt;
	}&lt;br /&gt;
	return plaintext;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function upcaseFirst(str) {&lt;br /&gt;
	if (typeof str != typeof &#039;&#039; || str==&#039;&#039;) return &#039;&#039;;&lt;br /&gt;
	return str.charAt(0).toUpperCase() + str.substring(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function findInArray(arr, foo) {&lt;br /&gt;
	if (!arr || !arr.length) { return -1; }&lt;br /&gt;
	var len=arr.length;&lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) { if (arr[i]==foo) { return i; } }&lt;br /&gt;
	return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nextOne (array, value) {&lt;br /&gt;
	// NB if the array has two consecutive entries equal&lt;br /&gt;
	//	then this will loop on successive calls&lt;br /&gt;
	var i=findInArray(array, value);&lt;br /&gt;
	if (i&amp;lt;0) { return null; }&lt;br /&gt;
	return array[i+1];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function literalizeRegex(str){&lt;br /&gt;
	return str.replace(RegExp(&#039;([-.|()\\\\+?*^${}\\[\\]])&#039;, &#039;g&#039;), &#039;\\$1&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
String.prototype.entify=function() {&lt;br /&gt;
	//var shy=&#039;&amp;amp;shy;&#039;;&lt;br /&gt;
	return this.split(&#039;&amp;amp;&#039;).join(&#039;&amp;amp;amp;&#039;).split(&#039;&amp;lt;&#039;).join(&#039;&amp;amp;lt;&#039;).split(&#039;&amp;gt;&#039;).join(&#039;&amp;amp;gt;&#039;/*+shy*/).split(&#039;&amp;quot;&#039;).join(&#039;&amp;amp;quot;&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function findThis(array, value) {&lt;br /&gt;
	if (typeof array.length == &#039;undefined&#039;) { return null; }&lt;br /&gt;
	for (var i=0; i&amp;lt;array.length; ++i) {&lt;br /&gt;
		if (array[i]==value) { return i; }&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function removeNulls(list) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (list[i]) {&lt;br /&gt;
			ret.push(list[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
function joinPath(list) {&lt;br /&gt;
	return removeNulls(list).join(&#039;/&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function simplePrintf(str, subs) {&lt;br /&gt;
	if (!str || !subs) { return str; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	var s=str.parenSplit(/(%s|\$[0-9]+)/);&lt;br /&gt;
	var i=0;&lt;br /&gt;
	do {&lt;br /&gt;
		ret.push(s.shift());&lt;br /&gt;
		if ( !s.length ) { break; }&lt;br /&gt;
		var cmd=s.shift();&lt;br /&gt;
		if (cmd == &#039;%s&#039;) {&lt;br /&gt;
			if ( i &amp;lt; subs.length ) { ret.push(subs[i]); } else { ret.push(cmd); }&lt;br /&gt;
			++i;&lt;br /&gt;
		} else {&lt;br /&gt;
			var j=parseInt( cmd.replace(&#039;$&#039;, &#039;&#039;), 10 ) - 1;&lt;br /&gt;
			if ( j &amp;gt; -1 &amp;amp;&amp;amp; j &amp;lt; subs.length ) { ret.push(subs[j]); } else { ret.push(cmd); }&lt;br /&gt;
		}&lt;br /&gt;
	} while (s.length &amp;gt; 0);&lt;br /&gt;
	return ret.join(&#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function max(a,b){return a&amp;lt;b ? b : a;}&lt;br /&gt;
function min(a,b){return a&amp;gt;b ? b : a;}&lt;br /&gt;
&lt;br /&gt;
function isString(x) { return (typeof x === &#039;string&#039; || x instanceof String); }&lt;br /&gt;
//function isNumber(x) { return (typeof x === &#039;number&#039; || x instanceof Number); }&lt;br /&gt;
function isRegExp(x) { return x instanceof RegExp; }&lt;br /&gt;
function isArray (x) { return x instanceof Array; }&lt;br /&gt;
function isObject(x) { return x instanceof Object; }&lt;br /&gt;
function isFunction(x) {&lt;br /&gt;
	return !isRegExp(x) &amp;amp;&amp;amp; (typeof x === &#039;function&#039; || x instanceof Function);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function repeatString(s,mult) {&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
	for (var i=0; i&amp;lt;mult; ++i) { ret += s; }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function zeroFill(s, min) {&lt;br /&gt;
	min = min || 2;&lt;br /&gt;
	var t=s.toString();&lt;br /&gt;
	return repeatString(&#039;0&#039;, min - t.length) + t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function map(f, o) {&lt;br /&gt;
	if (isArray(o)) { return map_array(f,o); }&lt;br /&gt;
	return map_object(f,o);&lt;br /&gt;
}&lt;br /&gt;
function map_array(f,o) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;o.length; ++i) {&lt;br /&gt;
		ret.push(f(o[i]));&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
function map_object(f,o) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	for (var i in o) { ret[o]=f(o[i]); }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pg.escapeQuotesHTML = function ( text ) {	var re = new RegExp( &#039;&amp;amp;&#039;, &amp;quot;g&amp;quot; );	text = text.replace( re, &amp;quot;&amp;amp;amp;&amp;quot; );	re = new RegExp( &#039;&amp;quot;&#039;, &amp;quot;g&amp;quot; );	text = text.replace( re, &amp;quot;&amp;amp;quot;&amp;quot; );	re = new RegExp( &#039;&amp;lt;&#039;, &amp;quot;g&amp;quot; );	text = text.replace( re, &amp;quot;&amp;amp;lt;&amp;quot; );	re = new RegExp( &#039;&amp;gt;&#039;, &amp;quot;g&amp;quot; );	text = text.replace( re, &amp;quot;&amp;amp;gt;&amp;quot; );	return text;}&lt;br /&gt;
&lt;br /&gt;
pg.jsescape = function(s)&lt;br /&gt;
{&lt;br /&gt;
	if (typeof s !== &amp;quot;string&amp;quot;) throw &amp;quot;Invalid type in pg.jsescape&amp;quot;;&lt;br /&gt;
	var res = &amp;quot;&amp;quot;;&lt;br /&gt;
	//this can be optimized by copying substrings instead of char by char!&lt;br /&gt;
	for (var i=0; i&amp;lt;s.length; i++)&lt;br /&gt;
	{&lt;br /&gt;
		var c = s[i];&lt;br /&gt;
	switch (c)&lt;br /&gt;
	{&lt;br /&gt;
	  case &#039;\b&#039;: res += &#039;\\b&#039;; continue;&lt;br /&gt;
	  case &#039;\f&#039;: res += &#039;\\f&#039;; continue;&lt;br /&gt;
	  case &#039;\n&#039;: res += &#039;\\n&#039;; continue;&lt;br /&gt;
	  case &#039;\0&#039;: res += &#039;\\0&#039;; continue;&lt;br /&gt;
	  case &#039;\r&#039;: res += &#039;\\r&#039;; continue;&lt;br /&gt;
	  case &#039;\t&#039;: res += &#039;\\t&#039;; continue;&lt;br /&gt;
	  case &#039;\v&#039;: res += &#039;\\v&#039;; continue;&lt;br /&gt;
	  case &#039;\\&#039;: res += &#039;\\\\&#039;; continue;&lt;br /&gt;
	  case &#039;\&amp;quot;&#039;:  res += &#039;\\\&amp;quot;&#039;; continue;&lt;br /&gt;
	  case &#039;\&#039;&#039;:  res += &#039;\\\&#039;&#039;; continue;&lt;br /&gt;
		   continue;&lt;br /&gt;
	  default:&lt;br /&gt;
			if (c &amp;lt; &#039; &#039; || c===&#039;&amp;lt;&#039; || c===&#039;&amp;gt;&#039; || c===&amp;quot;&#039;&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
					var unicodeChar = c.charCodeAt(0).toString(16).toUpperCase();&lt;br /&gt;
					res += &amp;quot;\\u&amp;quot; + (unicodeChar.length&amp;gt;1?&amp;quot;00&amp;quot;:&amp;quot;000&amp;quot;) + unicodeChar;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				res += c;&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ENDFILE: tools.js&lt;br /&gt;
// STARTFILE: dab.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Dab-fixing code&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function retargetDab(newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) {&lt;br /&gt;
	log(&#039;retargetDab: newTarget=&#039;+newTarget + &#039; oldTarget=&#039; + oldTarget);&lt;br /&gt;
	return changeLinkTargetLink(&lt;br /&gt;
	{newTarget: newTarget,&lt;br /&gt;
			text: newTarget.split(&#039; &#039;).join(&#039;&amp;amp;nbsp;&#039;),&lt;br /&gt;
			hint: tprintf(&#039;disambigHint&#039;, [newTarget]),&lt;br /&gt;
			summary: simplePrintf(&lt;br /&gt;
					getValueOf(&#039;popupFixDabsSummary&#039;), [friendlyCurrentArticleName, newTarget ]),&lt;br /&gt;
			clickButton: &#039;wpDiff&#039;, minor: true, oldTarget: oldTarget,&lt;br /&gt;
			watch: getValueOf(&#039;popupWatchDisambiggedPages&#039;),&lt;br /&gt;
			title: titleToEdit});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function listLinks(wikitext, oldTarget, titleToEdit) {&lt;br /&gt;
	// mediawiki strips trailing spaces, so we do the same&lt;br /&gt;
	// testcase: http://en.wikipedia.org/w/index.php?title=Radial&amp;amp;oldid=97365633&lt;br /&gt;
	var reg=RegExp(&#039;\\[\\[([^|]*?) *(\\||\\]\\])&#039;, &#039;gi&#039;);&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	var splitted=wikitext.parenSplit(reg);&lt;br /&gt;
	// ^[a-z]+ should match interwiki links, hopefully (case-insensitive)&lt;br /&gt;
	// and ^[a-z]* should match those and [[:Category...]] style links too&lt;br /&gt;
	var omitRegex=RegExp(&#039;^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory&#039;);&lt;br /&gt;
	var friendlyCurrentArticleName= oldTarget.toString();&lt;br /&gt;
	var wikPos = getValueOf(&#039;popupDabWiktionary&#039;);&lt;br /&gt;
&lt;br /&gt;
	for (var i=1; i&amp;lt;splitted.length; i=i+3) {&lt;br /&gt;
		if (typeof splitted[i] == typeof &#039;string&#039; &amp;amp;&amp;amp; splitted[i].length&amp;gt;0 &amp;amp;&amp;amp; !omitRegex.test(splitted[i])) {&lt;br /&gt;
			ret.push( retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit) );&lt;br /&gt;
		} /* if */&lt;br /&gt;
	} /* for loop */&lt;br /&gt;
&lt;br /&gt;
	ret = rmDupesFromSortedList(ret.sort());&lt;br /&gt;
&lt;br /&gt;
	if (wikPos) {&lt;br /&gt;
		var wikTarget=&#039;wiktionary:&#039; +&lt;br /&gt;
			friendlyCurrentArticleName.replace( RegExp(&#039;^(.+)\\s+[(][^)]+[)]\\s*$&#039;), &#039;$1&#039; );&lt;br /&gt;
&lt;br /&gt;
		var meth;&lt;br /&gt;
		if (wikPos.toLowerCase() == &#039;first&#039;) { meth = &#039;unshift&#039;; }&lt;br /&gt;
		else { meth = &#039;push&#039;; }&lt;br /&gt;
&lt;br /&gt;
		ret[meth]( retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret.push(changeLinkTargetLink(&lt;br /&gt;
	{ newTarget: null,&lt;br /&gt;
			text: popupString(&#039;remove this link&#039;).split(&#039; &#039;).join(&#039;&amp;amp;nbsp;&#039;),&lt;br /&gt;
			hint: popupString(&amp;quot;remove all links to this disambig page from this article&amp;quot;),&lt;br /&gt;
			clickButton: &amp;quot;wpDiff&amp;quot;, oldTarget: oldTarget,&lt;br /&gt;
			summary: simplePrintf(getValueOf(&#039;popupRmDabLinkSummary&#039;), [friendlyCurrentArticleName]),&lt;br /&gt;
			watch: getValueOf(&#039;popupWatchDisambiggedPages&#039;),&lt;br /&gt;
			title: titleToEdit&lt;br /&gt;
			}));&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function rmDupesFromSortedList(list) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (ret.length===0 || list[i]!=ret[ret.length-1]) { ret.push(list[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function makeFixDab(data, navpop) {&lt;br /&gt;
	// grab title from parent popup if there is one; default exists in changeLinkTargetLink&lt;br /&gt;
	var titleToEdit=(navpop.parentPopup &amp;amp;&amp;amp; navpop.parentPopup.article.toString());&lt;br /&gt;
	var list=listLinks(data, navpop.originalArticle, titleToEdit);&lt;br /&gt;
	if (list.length===0) { log(&#039;listLinks returned empty list&#039;); return null; }&lt;br /&gt;
	var html=&#039;&amp;lt;hr&amp;gt;&#039; + popupString(&#039;Click to disambiguate this link to:&#039;) + &#039;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
	html+=list.join(&#039;, &#039;);&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function makeFixDabs(wikiText, navpop) {&lt;br /&gt;
	if (getValueOf(&#039;popupFixDabs&#039;) &amp;amp;&amp;amp; isDisambig(wikiText, navpop.article) &amp;amp;&amp;amp;&lt;br /&gt;
		Title.fromURL(location.href).namespaceId() != pg.nsSpecialId &amp;amp;&amp;amp;&lt;br /&gt;
		navpop.article.talkPage() ) {&lt;br /&gt;
		setPopupHTML(makeFixDab(wikiText, navpop), &#039;popupFixDab&#039;, navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupRedlinkHTML(article) {&lt;br /&gt;
	return changeLinkTargetLink(&lt;br /&gt;
		{ newTarget: null, text: popupString(&#039;remove this link&#039;).split(&#039; &#039;).join(&#039;&amp;amp;nbsp;&#039;),&lt;br /&gt;
			hint: popupString(&amp;quot;remove all links to this page from this article&amp;quot;),&lt;br /&gt;
			clickButton: &amp;quot;wpDiff&amp;quot;,&lt;br /&gt;
			oldTarget: article.toString(),&lt;br /&gt;
			summary: simplePrintf(getValueOf(&#039;popupRedlinkSummary&#039;), [article.toString()])});&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: dab.js&lt;br /&gt;
// STARTFILE: htmloutput.js&lt;br /&gt;
&lt;br /&gt;
function appendPopupContent(obj, elementId, popupId, onSuccess) {&lt;br /&gt;
	return setPopupHTML(obj, elementId, popupId, onSuccess, true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// this has to use a timer loop as we don&#039;t know if the DOM element exists when we want to set the text&lt;br /&gt;
function setPopupHTML (str, elementId, popupId, onSuccess, append) {&lt;br /&gt;
	if (elementId==&#039;popupPreview&#039;) {&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof popupId === &#039;undefined&#039;) {&lt;br /&gt;
		//console.error(&#039;popupId is not defined in setPopupHTML, html=&#039;+str.substring(0,100));&lt;br /&gt;
		popupId = pg.idNumber;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var popupElement=document.getElementById(elementId+popupId);&lt;br /&gt;
	if (popupElement) {&lt;br /&gt;
		if (!append) { popupElement.innerHTML=&#039;&#039;; }&lt;br /&gt;
		if (isString(str)) {&lt;br /&gt;
			popupElement.innerHTML+=str;&lt;br /&gt;
		} else {&lt;br /&gt;
			popupElement.appendChild(str);&lt;br /&gt;
		}&lt;br /&gt;
		if (onSuccess) { onSuccess(); }&lt;br /&gt;
		setTimeout(checkPopupPosition, 100);&lt;br /&gt;
		return true;&lt;br /&gt;
	} else {&lt;br /&gt;
		// call this function again in a little while...&lt;br /&gt;
		setTimeout(function(){&lt;br /&gt;
				setPopupHTML(str,elementId,popupId,onSuccess);&lt;br /&gt;
			}, 600);&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function setPopupTrailer(str,id) {return setPopupHTML(str, &#039;popupData&#039;, id);}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function fillEmptySpans(args) { return fillEmptySpans2(args); }&lt;br /&gt;
&lt;br /&gt;
// args.navpopup is mandatory&lt;br /&gt;
// optional: args.redir, args.redirTarget&lt;br /&gt;
// FIXME: ye gods, this is ugly stuff&lt;br /&gt;
function fillEmptySpans2(args) { // if redir is present and true then redirTarget is mandatory&lt;br /&gt;
	var redir=true;&lt;br /&gt;
	if (typeof args != &#039;object&#039; || typeof args.redir == &#039;undefined&#039; || !args.redir) { redir=false; }&lt;br /&gt;
	var a=args.navpopup.parentAnchor;&lt;br /&gt;
&lt;br /&gt;
	var article, hint=null, oldid=null, params={};&lt;br /&gt;
	if (redir &amp;amp;&amp;amp; typeof args.redirTarget == typeof {}) {&lt;br /&gt;
		article=args.redirTarget;&lt;br /&gt;
		//hint=article.hintValue();&lt;br /&gt;
	} else {&lt;br /&gt;
		article=(new Title()).fromAnchor(a);&lt;br /&gt;
		hint=a.originalTitle || article.hintValue();&lt;br /&gt;
		params=parseParams(a.href);&lt;br /&gt;
		oldid=(getValueOf(&#039;popupHistoricalLinks&#039;)) ? params.oldid : null;&lt;br /&gt;
		rcid=params.rcid;&lt;br /&gt;
	}&lt;br /&gt;
	var x={ article:article, hint: hint, oldid: oldid, rcid: rcid, navpop:args.navpopup, params:params };&lt;br /&gt;
&lt;br /&gt;
	var structure=pg.structures[getValueOf(&#039;popupStructure&#039;)];&lt;br /&gt;
	if (typeof structure != &#039;object&#039;) {&lt;br /&gt;
		setPopupHTML(&#039;popupError&#039;, &#039;Unknown structure (this should never happen): &#039;+&lt;br /&gt;
				 pg.option.popupStructure, args.navpopup.idNumber);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var spans=flatten(pg.misc.layout);&lt;br /&gt;
	var numspans = spans.length;&lt;br /&gt;
	var redirs=pg.misc.redirSpans;&lt;br /&gt;
&lt;br /&gt;
	for (var i=0; i&amp;lt;numspans; ++i) {&lt;br /&gt;
		var f=findThis(redirs, spans[i]);&lt;br /&gt;
		//log(&#039;redir=&#039;+redir+&#039;, f=&#039;+f+&#039;, spans[i]=&#039;+spans[i]);&lt;br /&gt;
		if ( (f!==null &amp;amp;&amp;amp; !redir) || (f===null &amp;amp;&amp;amp; redir) ) {&lt;br /&gt;
			//log(&#039;skipping this set of the loop&#039;);&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		var structurefn=structure[spans[i]];&lt;br /&gt;
		var setfn = setPopupHTML;&lt;br /&gt;
		if (getValueOf(&#039;popupActiveNavlinks&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
			(spans[i].indexOf(&#039;popupTopLinks&#039;)==0 || spans[i].indexOf(&#039;popupRedirTopLinks&#039;)==0)&lt;br /&gt;
				) {&lt;br /&gt;
			setfn = setPopupTipsAndHTML;&lt;br /&gt;
		}&lt;br /&gt;
		switch (typeof structurefn) {&lt;br /&gt;
		case &#039;function&#039;:&lt;br /&gt;
			//log(&#039;running &#039;+spans[i]+&#039;({article:&#039;+x.article+&#039;, hint:&#039;+x.hint+&#039;, oldid: &#039;+x.oldid+&#039;})&#039;);&lt;br /&gt;
			setfn(structurefn(x), spans[i], args.navpopup.idNumber);&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;string&#039;:&lt;br /&gt;
			setfn(structurefn, spans[i], args.navpopup.idNumber);&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			errlog(&#039;unknown thing with label &#039;+spans[i]);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// flatten an array&lt;br /&gt;
function flatten(list, start) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	if (typeof start == &#039;undefined&#039;) { start=0; }&lt;br /&gt;
	for (var i=start; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (typeof list[i] == typeof []) {&lt;br /&gt;
			return ret.concat(flatten(list[i])).concat(flatten(list, i+1));&lt;br /&gt;
		}&lt;br /&gt;
		else { ret.push(list[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Generate html for whole popup&lt;br /&gt;
function popupHTML (a) {&lt;br /&gt;
	getValueOf(&#039;popupStructure&#039;);&lt;br /&gt;
	var structure=pg.structures[pg.option.popupStructure];&lt;br /&gt;
	if (typeof structure != &#039;object&#039;) {&lt;br /&gt;
		//return &#039;Unknown structure: &#039;+pg.option.popupStructure;&lt;br /&gt;
		// override user choice&lt;br /&gt;
		pg.option.popupStructure=pg.optionDefault.popupStructure;&lt;br /&gt;
		return popupHTML(a);&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof structure.popupLayout != &#039;function&#039;) { return &#039;Bad layout&#039;; }&lt;br /&gt;
	pg.misc.layout=structure.popupLayout();&lt;br /&gt;
	if (typeof structure.popupRedirSpans == &#039;function&#039;) { pg.misc.redirSpans=structure.popupRedirSpans(); }&lt;br /&gt;
	else { pg.misc.redirSpans=[]; }&lt;br /&gt;
	return makeEmptySpans(pg.misc.layout, a.navpopup);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function makeEmptySpans (list, navpop) {&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		if (typeof list[i] == typeof &#039;&#039;) {&lt;br /&gt;
			ret += emptySpanHTML(list[i], navpop.idNumber, &#039;div&#039;);&lt;br /&gt;
		} else if (typeof list[i] == typeof [] &amp;amp;&amp;amp; list[i].length &amp;gt; 0 ) {&lt;br /&gt;
			ret = ret.parenSplit(RegExp(&#039;(&amp;lt;/[^&amp;gt;]*?&amp;gt;$)&#039;)).join(makeEmptySpans(list[i], navpop));&lt;br /&gt;
		} else if (typeof list[i] == typeof {} &amp;amp;&amp;amp; list[i].nodeType ) {&lt;br /&gt;
			ret += emptySpanHTML(list[i].name, navpop.idNumber, list[i].nodeType);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function emptySpanHTML(name, id, tag, classname) {&lt;br /&gt;
	tag = tag || &#039;span&#039;;&lt;br /&gt;
	if (!classname) { classname = emptySpanHTML.classAliases[name]; }&lt;br /&gt;
	classname = classname || name;&lt;br /&gt;
	if (name == getValueOf(&#039;popupDragHandle&#039;)) { classname += &#039; popupDragHandle&#039;; }&lt;br /&gt;
	return simplePrintf(&#039;&amp;lt;%s id=&amp;quot;%s&amp;quot; class=&amp;quot;%s&amp;quot;&amp;gt;&amp;lt;/%s&amp;gt;&#039;, [tag, name + id, classname, tag]);&lt;br /&gt;
}&lt;br /&gt;
emptySpanHTML.classAliases={ &#039;popupSecondPreview&#039;: &#039;popupPreview&#039; };&lt;br /&gt;
&lt;br /&gt;
// generate html for popup image&lt;br /&gt;
// &amp;lt;a id=&amp;quot;popupImageLinkn&amp;quot;&amp;gt;&amp;lt;img id=&amp;quot;popupImagen&amp;quot;&amp;gt;&lt;br /&gt;
// where n=idNumber&lt;br /&gt;
function imageHTML(article, idNumber) {&lt;br /&gt;
	return simplePrintf(&#039;&amp;lt;a id=&amp;quot;popupImageLink$1&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;img align=&amp;quot;right&amp;quot; valign=&amp;quot;top&amp;quot; id=&amp;quot;popupImg$1&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;/a&amp;gt;&#039;, [ idNumber ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popTipsSoonFn(id, when, popData) {&lt;br /&gt;
	when || ( when=250 );&lt;br /&gt;
	var popTips=function(){ setupTooltips(document.getElementById(id), false, true, popData); };&lt;br /&gt;
	return function() { setTimeout( popTips, when, popData ); };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setPopupTipsAndHTML(html, divname, idnumber, popData) {&lt;br /&gt;
	setPopupHTML(html, divname, idnumber,&lt;br /&gt;
			 getValueOf(&#039;popupSubpopups&#039;) ? &lt;br /&gt;
			 popTipsSoonFn(divname + idnumber, null, popData) : &lt;br /&gt;
			 null);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: htmloutput.js&lt;br /&gt;
// STARTFILE: mouseout.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// fuzzy checks&lt;br /&gt;
&lt;br /&gt;
function fuzzyCursorOffMenus(x,y, fuzz, parent) {&lt;br /&gt;
	if (!parent) { return null; }&lt;br /&gt;
	var uls=parent.getElementsByTagName(&#039;ul&#039;);&lt;br /&gt;
	for (var i=0; i&amp;lt;uls.length; ++i) {&lt;br /&gt;
		if (uls[i].className==&#039;popup_menu&#039;) {&lt;br /&gt;
			if (uls[i].offsetWidth &amp;gt; 0) return false;&lt;br /&gt;
		} // else {document.title+=&#039;.&#039;;}&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function checkPopupPosition () { // stop the popup running off the right of the screen&lt;br /&gt;
	// FIXME avoid pg.current.link&lt;br /&gt;
	pg.current.link &amp;amp;&amp;amp; pg.current.link.navpopup &amp;amp;&amp;amp;&lt;br /&gt;
		pg.current.link.navpopup.limitHorizontalPosition();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function mouseOutWikiLink () {&lt;br /&gt;
	if (!window.popupsReady || !window.popupsReady()) { return; }&lt;br /&gt;
	//console (&#039;mouseOutWikiLink&#039;);&lt;br /&gt;
	var a=this;&lt;br /&gt;
	if (a.navpopup==null) return;&lt;br /&gt;
	if ( ! a.navpopup.isVisible() ) {&lt;br /&gt;
		a.navpopup.banish();&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
		restoreTitle(a);&lt;br /&gt;
	Navpopup.tracker.addHook(posCheckerHook(a.navpopup));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function posCheckerHook(navpop) {&lt;br /&gt;
	return function() {&lt;br /&gt;
		if (!navpop.isVisible()) { return true; /* remove this hook */ }&lt;br /&gt;
		if (Navpopup.tracker.dirty) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		var x=Navpopup.tracker.x, y=Navpopup.tracker.y;&lt;br /&gt;
		var mouseOverNavpop = navpop.isWithin(x,y,navpop.fuzz, navpop.mainDiv) ||&lt;br /&gt;
			!fuzzyCursorOffMenus(x,y,navpop.fuzz, navpop.mainDiv);&lt;br /&gt;
&lt;br /&gt;
		// FIXME it&#039;d be prettier to do this internal to the Navpopup objects&lt;br /&gt;
		var t=getValueOf(&#039;popupHideDelay&#039;);&lt;br /&gt;
		if (t) { t = t * 1000; }&lt;br /&gt;
		if (!t) {&lt;br /&gt;
			if(!mouseOverNavpop) {&lt;br /&gt;
				if(navpop.parentAnchor) {&lt;br /&gt;
					restoreTitle( navpop.parentAnchor );&lt;br /&gt;
				}&lt;br /&gt;
				navpop.banish();&lt;br /&gt;
				return true; /* remove this hook */&lt;br /&gt;
			}&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		// we have a hide delay set&lt;br /&gt;
		var d=+(new Date());&lt;br /&gt;
		if ( !navpop.mouseLeavingTime ) {&lt;br /&gt;
			navpop.mouseLeavingTime = d;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		if ( mouseOverNavpop ) {&lt;br /&gt;
			navpop.mouseLeavingTime=null;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		if (d - navpop.mouseLeavingTime &amp;gt; t) {&lt;br /&gt;
			navpop.mouseLeavingTime=null;&lt;br /&gt;
			navpop.banish(); return true; /* remove this hook */&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function runStopPopupTimer(navpop) {&lt;br /&gt;
	// at this point, we should have left the link but remain within the popup&lt;br /&gt;
	// so we call this function again until we leave the popup.&lt;br /&gt;
	if (!navpop.stopPopupTimer) {&lt;br /&gt;
		navpop.stopPopupTimer=setInterval(posCheckerHook(navpop), 500);&lt;br /&gt;
		navpop.addHook(function(){clearInterval(navpop.stopPopupTimer);},&lt;br /&gt;
				   &#039;hide&#039;, &#039;before&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: mouseout.js&lt;br /&gt;
// STARTFILE: previewmaker.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview&lt;br /&gt;
   Defines the {@link Previewmaker} object, which generates short previews from wiki markup.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Previewmaker&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Previewmaker class. Use an instance of this to generate short previews from Wikitext.&lt;br /&gt;
   @param {String} wikiText The Wikitext source of the page we wish to preview.&lt;br /&gt;
   @param {String} baseUrl The url we should prepend when creating relative urls.&lt;br /&gt;
   @param {Navpopup} owner The navpop associated to this preview generator&lt;br /&gt;
*/&lt;br /&gt;
function Previewmaker(wikiText, baseUrl, owner) {&lt;br /&gt;
	/** The wikitext which is manipulated to generate the preview. */&lt;br /&gt;
	this.originalData=wikiText;&lt;br /&gt;
	this.setData();&lt;br /&gt;
	this.baseUrl=baseUrl;&lt;br /&gt;
	this.owner=owner;&lt;br /&gt;
	this.maxCharacters=getValueOf(&#039;popupMaxPreviewCharacters&#039;);&lt;br /&gt;
	this.maxSentences=getValueOf(&#039;popupMaxPreviewSentences&#039;);&lt;br /&gt;
}&lt;br /&gt;
Previewmaker.prototype.setData=function() {&lt;br /&gt;
	var maxSize=max(10000, 2*this.maxCharacters);&lt;br /&gt;
	this.data=this.originalData.substring(0,maxSize);&lt;br /&gt;
};&lt;br /&gt;
/** Remove HTML comments&lt;br /&gt;
	@private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killComments = function () {&lt;br /&gt;
	// this also kills one trailing newline, eg [[diamyo]]&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;&amp;lt;!--[\\s\\S]*?--&amp;gt;\\n?&#039;, &#039;g&#039;), &#039;&#039;); &lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killDivs = function () {&lt;br /&gt;
	// say goodbye, divs (can be nested, so use * not *?)&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;&amp;lt; *div[^&amp;gt;]* *&amp;gt;[\\s\\S]*?&amp;lt; */ *div *&amp;gt;&#039;,&lt;br /&gt;
					   &#039;gi&#039;), &#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killGalleries = function () {&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;&amp;lt; *gallery[^&amp;gt;]* *&amp;gt;[\\s\\S]*?&amp;lt; */ *gallery *&amp;gt;&#039;,&lt;br /&gt;
					   &#039;gi&#039;), &#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.kill = function(opening, closing, subopening, subclosing, repl) {&lt;br /&gt;
	var oldk=this.data;&lt;br /&gt;
	var k=this.killStuff(this.data, opening, closing, subopening, subclosing, repl);&lt;br /&gt;
	while (k.length &amp;lt; oldk.length) {&lt;br /&gt;
		oldk=k;&lt;br /&gt;
		k=this.killStuff(k, opening, closing, subopening, subclosing, repl);&lt;br /&gt;
	}&lt;br /&gt;
	this.data=k;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killStuff = function (txt, opening, closing, subopening, subclosing, repl) {&lt;br /&gt;
	var op=this.makeRegexp(opening);&lt;br /&gt;
	var cl=this.makeRegexp(closing, &#039;^&#039;);&lt;br /&gt;
	var sb=subopening ? this.makeRegexp(subopening, &#039;^&#039;) : null;&lt;br /&gt;
	var sc=subclosing ? this.makeRegexp(subclosing, &#039;^&#039;) : cl;&lt;br /&gt;
	if (!op || !cl) {&lt;br /&gt;
		alert(&#039;Navigation Popups error: op or cl is null! something is wrong.&#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if (!op.test(txt)) { return txt; }&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
	var opResult = op.exec(txt);&lt;br /&gt;
	ret = txt.substring(0,opResult.index);&lt;br /&gt;
	txt=txt.substring(opResult.index+opResult[0].length);&lt;br /&gt;
	var depth = 1;&lt;br /&gt;
	while (txt.length &amp;gt; 0) {&lt;br /&gt;
		var removal=0;&lt;br /&gt;
		if (depth==1 &amp;amp;&amp;amp; cl.test(txt)) {&lt;br /&gt;
			depth--;&lt;br /&gt;
			removal=cl.exec(txt)[0].length;&lt;br /&gt;
		} else if (depth &amp;gt; 1 &amp;amp;&amp;amp; sc.test(txt)) {&lt;br /&gt;
			depth--;&lt;br /&gt;
			removal=sc.exec(txt)[0].length;&lt;br /&gt;
		}else if (sb &amp;amp;&amp;amp; sb.test(txt)) {&lt;br /&gt;
			depth++;&lt;br /&gt;
			removal=sb.exec(txt)[0].length;&lt;br /&gt;
		}&lt;br /&gt;
		if ( !removal ) { removal = 1; }&lt;br /&gt;
		txt=txt.substring(removal);&lt;br /&gt;
		if (depth==0) { break; }&lt;br /&gt;
	}&lt;br /&gt;
	return ret + (repl || &#039;&#039;) + txt;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.makeRegexp = function (x, prefix, suffix) {&lt;br /&gt;
	prefix = prefix || &#039;&#039;;&lt;br /&gt;
	suffix = suffix || &#039;&#039;;&lt;br /&gt;
	var reStr=&#039;&#039;;&lt;br /&gt;
	var flags=&#039;&#039;;&lt;br /&gt;
	if (isString(x)) {&lt;br /&gt;
		reStr=prefix + literalizeRegex(x) + suffix;&lt;br /&gt;
	} else if (isRegExp(x)) {&lt;br /&gt;
		var s=x.toString().substring(1);&lt;br /&gt;
		var sp=s.split(&#039;/&#039;);&lt;br /&gt;
		flags=sp[sp.length-1];&lt;br /&gt;
		sp[sp.length-1]=&#039;&#039;;&lt;br /&gt;
		s=sp.join(&#039;/&#039;);&lt;br /&gt;
		s=s.substring(0,s.length-1);&lt;br /&gt;
		reStr= prefix + s + suffix;&lt;br /&gt;
	} else {&lt;br /&gt;
		log (&#039;makeRegexp failed&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	log (&#039;makeRegexp: got reStr=&#039; + reStr + &#039;, flags=&#039; + flags);&lt;br /&gt;
	return RegExp(reStr, flags);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killBoxTemplates = function () {&lt;br /&gt;
&lt;br /&gt;
	// taxobox removal... in fact, there&#039;s a saudiprincebox_begin, so let&#039;s be more general&lt;br /&gt;
	// also, have float_begin, ... float_end&lt;br /&gt;
	this.kill(RegExp(&#039;[{][{][^{}\\s|]*?(float|box)[_ ](begin|start)&#039;, &#039;i&#039;),	/[}][}]\s*/, &#039;{{&#039;);&lt;br /&gt;
&lt;br /&gt;
	// infoboxes etc&lt;br /&gt;
	// from [[User:Zyxw/popups.js]]: kill frames too&lt;br /&gt;
	this.kill(RegExp(&#039;[{][{][^{}\\s|]*?(infobox|elementbox|frame)[_ ]&#039;, &#039;i&#039;), /[}][}]\s*/, &#039;{{&#039;);&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killTemplates = function () {&lt;br /&gt;
	this.kill(&#039;{{&#039;, &#039;}}&#039;, &#039;{&#039;, &#039;}&#039;, &#039; &#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killTables = function () {&lt;br /&gt;
	// tables are bad, too&lt;br /&gt;
	// this can be slow, but it&#039;s an inprovement over a browser hang&lt;br /&gt;
	// torture test: [[Comparison_of_Intel_Central_Processing_Units]]&lt;br /&gt;
	this.kill(&#039;{|&#039;, /[|]}\s*/, &#039;{|&#039;);&lt;br /&gt;
	this.kill(/&amp;lt;table.*?&amp;gt;/i, /&amp;lt;\/table.*?&amp;gt;/i, /&amp;lt;table.*?&amp;gt;/i);&lt;br /&gt;
	// remove lines starting with a pipe for the hell of it (?)&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;^[|].*$&#039;, &#039;mg&#039;), &#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killImages = function () {&lt;br /&gt;
	var forbiddenNamespaceAliases = [];&lt;br /&gt;
	jQuery.each(mw.config.get(&#039;wgNamespaceIds&#039;), function(_localizedNamespaceLc, _namespaceId) {&lt;br /&gt;
		if (_namespaceId!=pg.nsImageId &amp;amp;&amp;amp; _namespaceId!=pg.nsCategoryId) return;&lt;br /&gt;
		forbiddenNamespaceAliases.push(_localizedNamespaceLc.split(&#039; &#039;).join(&#039;[ _]&#039;)); //todo: escape regexp fragments!&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	// images and categories are a nono&lt;br /&gt;
	this.kill(RegExp(&#039;[[][[]\\s*(&#039; + forbiddenNamespaceAliases.join(&#039;|&#039;) + &#039;)\\s*:&#039;, &#039;i&#039;),&lt;br /&gt;
		  /\]\]\s*/, &#039;[&#039;, &#039;]&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killHTML = function () {&lt;br /&gt;
	// kill &amp;lt;ref ...&amp;gt;...&amp;lt;/ref&amp;gt;&lt;br /&gt;
	this.kill(/&amp;lt;ref\b[^/&amp;gt;]*?&amp;gt;/i, /&amp;lt;\/ref&amp;gt;/i);&lt;br /&gt;
&lt;br /&gt;
	// let&#039;s also delete entire lines starting with &amp;lt;. it&#039;s worth a try.&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;(^|\\n) *&amp;lt;.*&#039;, &#039;g&#039;), &#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
	// and those pesky html tags, but not &amp;lt;nowiki&amp;gt; or &amp;lt;blockquote&amp;gt;&lt;br /&gt;
	var splitted=this.data.parenSplit(/(&amp;lt;[\w\W]*?(?:&amp;gt;|$|(?=&amp;lt;)))/);&lt;br /&gt;
	var len=splitted.length;&lt;br /&gt;
	for (var i=1; i&amp;lt;len; i=i+2) {&lt;br /&gt;
		switch (splitted[i]) {&lt;br /&gt;
		case &#039;&amp;lt;nowiki&amp;gt;&#039;:&lt;br /&gt;
		case &#039;&amp;lt;/nowiki&amp;gt;&#039;:&lt;br /&gt;
		case &#039;&amp;lt;blockquote&amp;gt;&#039;:&lt;br /&gt;
		case &#039;&amp;lt;/blockquote&amp;gt;&#039;:&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			splitted[i]=&#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	this.data=splitted.join(&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killChunks = function() { // heuristics alert&lt;br /&gt;
	// chunks of italic text? you crazy, man?&lt;br /&gt;
	var italicChunkRegex=new RegExp&lt;br /&gt;
	(&amp;quot;((^|\\n)\\s*:*\\s*&#039;&#039;[^&#039;]([^&#039;]|&#039;&#039;&#039;|&#039;[^&#039;]){20}(.|\\n[^\\n])*&#039;&#039;[.!?\\s]*\\n)+&amp;quot;, &#039;g&#039;);&lt;br /&gt;
	// keep stuff separated, though, so stick in \n (fixes [[Union Jack]]?&lt;br /&gt;
	this.data=this.data.replace(italicChunkRegex, &#039;\n&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.mopup = function () {&lt;br /&gt;
	// we simply *can&#039;t* be doing with horizontal rules right now&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;^-{4,}&#039;,&#039;mg&#039;),&#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
	// no indented lines&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;(^|\\n) *:[^\\n]*&#039;,&#039;g&#039;), &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
	// replace __TOC__, __NOTOC__ and whatever else there is&lt;br /&gt;
	// this&#039;ll probably do&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;^__[A-Z_]*__ *$&#039;, &#039;gmi&#039;),&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.firstBit = function () {&lt;br /&gt;
	// dont&#039;t be givin&#039; me no subsequent paragraphs, you hear me?&lt;br /&gt;
	/// first we &amp;quot;normalize&amp;quot; section headings, removing whitespace after, adding before&lt;br /&gt;
	var d=this.data;&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;popupPreviewCutHeadings&#039;)) {&lt;br /&gt;
		this.data=this.data.replace(RegExp(&#039;\\s*(==+[^=]*==+)\\s*&#039;, &#039;g&#039;), &#039;\n\n$1 &#039;);&lt;br /&gt;
		/// then we want to get rid of paragraph breaks whose text ends badly&lt;br /&gt;
		this.data=this.data.replace(RegExp(&#039;([:;]) *\\n{2,}&#039;, &#039;g&#039;), &#039;$1\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		this.data=this.data.replace(RegExp(&#039;^[\\s\\n]*&#039;), &#039;&#039;);&lt;br /&gt;
		stuff=(RegExp(&#039;^([^\\n]|\\n[^\\n\\s])*&#039;)).exec(this.data);&lt;br /&gt;
		if (stuff) { d = stuff[0]; }&lt;br /&gt;
		if (!getValueOf(&#039;popupPreviewFirstParOnly&#039;)) { d = this.data; }&lt;br /&gt;
&lt;br /&gt;
		/// now put \n\n after sections so that bullets and numbered lists work&lt;br /&gt;
		d=d.replace(RegExp(&#039;(==+[^=]*==+)\\s*&#039;, &#039;g&#039;), &#039;$1\n\n&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Split sentences. Superfluous sentences are RIGHT OUT.&lt;br /&gt;
	// note: exactly 1 set of parens here needed to make the slice work&lt;br /&gt;
	d = d.parenSplit(RegExp(&#039;([!?.]+[&amp;quot;&#039;+&amp;quot;&#039;&amp;quot;+&#039;]*\\s)&#039;,&#039;g&#039;));&lt;br /&gt;
	// leading space is bad, mmkay?&lt;br /&gt;
	d[0]=d[0].replace(RegExp(&#039;^\\s*&#039;), &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
	var notSentenceEnds=RegExp(&#039;([^.][a-z][.] *[a-z]|etc|sic|Dr|Mr|Mrs|Ms|St|no|op|cit|\\[[^\\]]*|\\s[A-Zvclm])$&#039;, &#039;i&#039;);&lt;br /&gt;
	d = this.fixSentenceEnds(d, notSentenceEnds);&lt;br /&gt;
&lt;br /&gt;
	this.fullLength=d.join(&#039;&#039;).length;&lt;br /&gt;
	var maxChars=getValueOf(&#039;popupMaxPreviewCharacters&#039;) + this.extraCharacters;&lt;br /&gt;
	var n=this.maxSentences;&lt;br /&gt;
	var dd=this.firstSentences(d,n); &lt;br /&gt;
&lt;br /&gt;
	do {&lt;br /&gt;
		dd=this.firstSentences(d,n); --n;&lt;br /&gt;
	} while ( dd.length &amp;gt; this.maxCharacters &amp;amp;&amp;amp; n != 0 );&lt;br /&gt;
&lt;br /&gt;
	this.data = dd;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.fixSentenceEnds = function(strs, reg) {&lt;br /&gt;
	// take an array of strings, strs&lt;br /&gt;
	// join strs[i] to strs[i+1] &amp;amp; strs[i+2] if strs[i] matches regex reg&lt;br /&gt;
&lt;br /&gt;
	var abbrevRe=/\b[a-z][^a-z]*$/i;&lt;br /&gt;
&lt;br /&gt;
	for (var i=0; i&amp;lt;strs.length-2; ++i) {&lt;br /&gt;
		if (reg.test(strs[i])) {&lt;br /&gt;
			a=[];&lt;br /&gt;
			for (var j=0; j&amp;lt;strs.length; ++j) {&lt;br /&gt;
				if (j&amp;lt;i)   a[j]=strs[j];&lt;br /&gt;
				if (j==i)  a[i]=strs[i]+strs[i+1]+strs[i+2];&lt;br /&gt;
				if (j&amp;gt;i+2) a[j-2]=strs[j];&lt;br /&gt;
			}&lt;br /&gt;
			return this.fixSentenceEnds(a,reg);&lt;br /&gt;
		}&lt;br /&gt;
		// BUGGY STUFF - trying to fix up [[S. C. Johnson &amp;amp; Son]] preview&lt;br /&gt;
		if (false &amp;amp;&amp;amp; abbrevRe.test(strs[i])) {&lt;br /&gt;
			var j=i, buf=&#039;&#039;;&lt;br /&gt;
			do {&lt;br /&gt;
				buf=buf+strs[i]+strs[i+1];&lt;br /&gt;
				i=i+2;&lt;br /&gt;
			} while (i&amp;lt;strs.length-2 &amp;amp;&amp;amp; abbrevRe.test(strs[i]));&lt;br /&gt;
			strs[i]=buf+strs[i];&lt;br /&gt;
			var a=(j?strs.slice(0,j-1):[]).concat(strs.slice(i));&lt;br /&gt;
			return this.fixSentenceEnds(a,reg);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return strs;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.firstSentences = function(strs, howmany) {&lt;br /&gt;
	var t=strs.slice(0, 2*howmany);&lt;br /&gt;
	return t.join(&#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killBadWhitespace = function() {&lt;br /&gt;
	// also cleans up isolated &#039;&#039;&#039;&#039;, eg [[Suntory Sungoliath]]&lt;br /&gt;
	this.data=this.data.replace(RegExp(&#039;^ *\&#039;+ *$&#039;, &#039;gm&#039;), &#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Runs the various methods to generate the preview.&lt;br /&gt;
   The preview is stored in the &amp;lt;code&amp;gt;html&amp;lt;/html&amp;gt; field.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.makePreview = function() {&lt;br /&gt;
	if (this.owner.article.namespaceId()!=pg.nsTemplateId &amp;amp;&amp;amp;&lt;br /&gt;
				this.owner.article.namespaceId()!=pg.nsImageId ) {&lt;br /&gt;
		this.killComments();&lt;br /&gt;
		this.killDivs();&lt;br /&gt;
		this.killGalleries();&lt;br /&gt;
		this.killBoxTemplates();&lt;br /&gt;
&lt;br /&gt;
		if (getValueOf(&#039;popupPreviewKillTemplates&#039;)) {&lt;br /&gt;
			this.killTemplates();&lt;br /&gt;
		} else {&lt;br /&gt;
			this.killMultilineTemplates();&lt;br /&gt;
		}&lt;br /&gt;
		this.killTables();&lt;br /&gt;
		this.killImages();&lt;br /&gt;
		this.killHTML();&lt;br /&gt;
		this.killChunks();&lt;br /&gt;
		this.mopup();&lt;br /&gt;
&lt;br /&gt;
		this.firstBit();&lt;br /&gt;
		this.killBadWhitespace();&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		this.killHTML();&lt;br /&gt;
	}&lt;br /&gt;
	this.html=wiki2html(this.data, this.baseUrl); // needs livepreview&lt;br /&gt;
	this.fixHTML();&lt;br /&gt;
	this.stripLongTemplates();&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.esWiki2HtmlPart = function(data) {&lt;br /&gt;
  var reLinks = /(?:\[\[([^|\]]*)(?:\|([^|\]]*))*]]([a-z]*))/gi; //match a wikilink&lt;br /&gt;
  reLinks.lastIndex = 0; //reset regex&lt;br /&gt;
&lt;br /&gt;
  var match;&lt;br /&gt;
  var result = &amp;quot;&amp;quot;;&lt;br /&gt;
  var postfixIndex = 0;&lt;br /&gt;
  while ((match = reLinks.exec(data)) != null) //match all wikilinks&lt;br /&gt;
  {&lt;br /&gt;
	//FIXME: the way that link is built here isn&#039;t perfect. It is clickable, but popups preview won&#039;t recognize it in some cases.&lt;br /&gt;
	result += pg.escapeQuotesHTML(data.substring(postfixIndex, match.index)) + &lt;br /&gt;
			  &#039;&amp;lt;a href=&amp;quot;&#039;+Insta.conf.paths.articles+pg.escapeQuotesHTML(match[1])+&#039;&amp;quot;&amp;gt;&#039;+pg.escapeQuotesHTML((match[2]?match[2]:match[1])+match[3])+&amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	postfixIndex = reLinks.lastIndex;&lt;br /&gt;
  }&lt;br /&gt;
  //append the rest&lt;br /&gt;
  result += pg.escapeQuotesHTML(data.substring(postfixIndex));&lt;br /&gt;
  &lt;br /&gt;
  return result;&lt;br /&gt;
};&lt;br /&gt;
Previewmaker.prototype.editSummaryPreview=function() {&lt;br /&gt;
	var reAes   = /\/\* *(.*?) *\*\//g; //match the first section marker&lt;br /&gt;
	reAes.lastIndex = 0; //reset regex&lt;br /&gt;
	&lt;br /&gt;
	var match;&lt;br /&gt;
	&lt;br /&gt;
	match = reAes.exec(this.data);&lt;br /&gt;
	if (match)&lt;br /&gt;
	{&lt;br /&gt;
		//we have a section link. Split it, process it, combine it.&lt;br /&gt;
		var prefix = this.data.substring(0,match.index-1);&lt;br /&gt;
		var section = match[1];&lt;br /&gt;
		var postfix = this.data.substring(reAes.lastIndex);&lt;br /&gt;
		&lt;br /&gt;
		var start = &amp;quot;&amp;lt;span class=&#039;autocomment&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		var end = &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
		if (prefix.length&amp;gt;0) start = this.esWiki2HtmlPart(prefix) + &amp;quot; &amp;quot; + start + &amp;quot;- &amp;quot;;&lt;br /&gt;
		if (postfix.length&amp;gt;0) end = &amp;quot;: &amp;quot; + end + this.esWiki2HtmlPart(postfix);&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		var t=new Title().fromURL(this.baseUrl);&lt;br /&gt;
		t.anchorFromUtf(section);&lt;br /&gt;
		var sectionLink = Insta.conf.paths.articles + pg.escapeQuotesHTML(t.toString(true)) + &#039;#&#039; + pg.escapeQuotesHTML(t.anchor);&lt;br /&gt;
		return start + &#039;&amp;lt;a href=&amp;quot;&#039;+sectionLink+&#039;&amp;quot;&amp;gt;&amp;amp;rarr;&amp;lt;/a&amp;gt; &#039;+pg.escapeQuotesHTML(section) + end;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	//else there&#039;s no section link, htmlify the whole thing.&lt;br /&gt;
	return this.esWiki2HtmlPart(this.data);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/** Test function for debugging preview problems one step at a time.&lt;br /&gt;
 */&lt;br /&gt;
function previewSteps(txt) {&lt;br /&gt;
	try {&lt;br /&gt;
		txt=txt || document.editform.wpTextbox1.value;&lt;br /&gt;
	} catch (err) {&lt;br /&gt;
		if (pg.cache.pages.length &amp;gt; 0) {&lt;br /&gt;
			txt=pg.cache.pages[pg.cache.pages.length-1].data;&lt;br /&gt;
		} else {&lt;br /&gt;
			alert(&#039;provide text or use an edit page&#039;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	txt=txt.substring(0,10000);&lt;br /&gt;
	var base=pg.wiki.articlebase + Title.fromURL(document.location.href).urlString();&lt;br /&gt;
	var p=new Previewmaker(txt, base, pg.current.link.navpopup);&lt;br /&gt;
	if (this.owner.article.namespaceId() != pg.nsTemplateId) {&lt;br /&gt;
		p.killComments(); if (!confirm(&#039;done killComments(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killDivs(); if (!confirm(&#039;done killDivs(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killGalleries(); if (!confirm(&#039;done killGalleries(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killBoxTemplates(); if (!confirm(&#039;done killBoxTemplates(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
&lt;br /&gt;
		if (getValueOf(&#039;popupPreviewKillTemplates&#039;)) {&lt;br /&gt;
			p.killTemplates(); if (!confirm(&#039;done killTemplates(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		} else {&lt;br /&gt;
			p.killMultilineTemplates(); if (!confirm(&#039;done killMultilineTemplates(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		p.killTables(); if (!confirm(&#039;done killTables(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killImages(); if (!confirm(&#039;done killImages(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killHTML(); if (!confirm(&#039;done killHTML(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killChunks(); if (!confirm(&#039;done killChunks(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.mopup(); if (!confirm(&#039;done mopup(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
&lt;br /&gt;
		p.firstBit(); if (!confirm(&#039;done firstBit(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
		p.killBadWhitespace(); if (!confirm(&#039;done killBadWhitespace(). Continue?\n---\n&#039; + p.data)) { return; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	p.html=wiki2html(p.data, base); // needs livepreview&lt;br /&gt;
	p.fixHTML(); if (!confirm(&#039;done fixHTML(). Continue?\n---\n&#039; + p.html)) { return; }&lt;br /&gt;
	p.stripLongTemplates(); if (!confirm(&#039;done stripLongTemplates(). Continue?\n---\n&#039; + p.html)) { return; }&lt;br /&gt;
	alert(&#039;finished preview - end result follows.\n---\n&#039; + p.html);&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Works around livepreview bugs.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.fixHTML = function() {&lt;br /&gt;
	if(!this.html) return;&lt;br /&gt;
&lt;br /&gt;
  var ret = this.html;&lt;br /&gt;
&lt;br /&gt;
	// fix question marks in wiki links&lt;br /&gt;
	// maybe this&#039;ll break some stuff :-(&lt;br /&gt;
	ret=ret.replace(RegExp(&#039;\(&amp;lt;a href=&amp;quot;&#039; + pg.wiki.articlePath + &#039;/[^&amp;quot;]*\)[?]\(.*?&amp;quot;\)&#039;, &#039;g&#039;), &#039;$1%3F$2&#039;);&lt;br /&gt;
	ret=ret.replace(RegExp(&#039;\(&amp;lt;a href=\&#039;&#039; + pg.wiki.articlePath + &#039;/[^\&#039;]*\)[?]\(.*?\&#039;\)&#039;, &#039;g&#039;), &#039;$1%3F$2&#039;);&lt;br /&gt;
	// FIXME fix up % too&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	this.html=ret;&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Generates the preview and displays it in the current popup.&lt;br /&gt;
&lt;br /&gt;
   Does nothing if the generated preview is invalid or consists of whitespace only.&lt;br /&gt;
   Also activates wikilinks in the preview for subpopups if the popupSubpopups option is true.&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.showPreview = function () {&lt;br /&gt;
	this.makePreview();&lt;br /&gt;
	if (typeof this.html != typeof &#039;&#039;) return;&lt;br /&gt;
	if (RegExp(&#039;^\\s*$&#039;).test(this.html)) return;&lt;br /&gt;
	setPopupHTML(&#039;&amp;lt;hr&amp;gt;&#039;, &#039;popupPrePreviewSep&#039;, this.owner.idNumber);&lt;br /&gt;
	setPopupTipsAndHTML(this.html, &#039;popupPreview&#039;, this.owner.idNumber, { owner: this.owner });&lt;br /&gt;
	var more = (this.fullLength &amp;gt; this.data.length) ? this.moreLink() : &#039;&#039;;&lt;br /&gt;
	setPopupHTML(more, &#039;popupPreviewMore&#039;, this.owner.idNumber);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.moreLink=function() {&lt;br /&gt;
	var a=document.createElement(&#039;a&#039;);&lt;br /&gt;
	a.className=&#039;popupMoreLink&#039;;&lt;br /&gt;
	a.innerHTML=popupString(&#039;more...&#039;);&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	a.onclick=function() {&lt;br /&gt;
		savedThis.maxCharacters+=2000;&lt;br /&gt;
		savedThis.maxSentences+=20;&lt;br /&gt;
		savedThis.setData();&lt;br /&gt;
		savedThis.showPreview();&lt;br /&gt;
	}&lt;br /&gt;
	return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.stripLongTemplates = function() {&lt;br /&gt;
	// operates on the HTML!&lt;br /&gt;
	this.html=this.html.replace(RegExp(&#039;^.{0,1000}[{][{][^}]*?(&amp;lt;(p|br)( /)?&amp;gt;\\s*){2,}([^{}]*?[}][}])?&#039;, &#039;gi&#039;), &#039;&#039;);&lt;br /&gt;
	this.html=this.html.split(&#039;\n&#039;).join(&#039; &#039;); // workaround for &amp;lt;pre&amp;gt; templates&lt;br /&gt;
	this.html=this.html.replace(RegExp(&#039;[{][{][^}]*&amp;lt;pre&amp;gt;[^}]*[}][}]&#039;,&#039;gi&#039;), &#039;&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Previewmaker.prototype.killMultilineTemplates = function() {&lt;br /&gt;
	this.kill(&#039;{{{&#039;, &#039;}}}&#039;);&lt;br /&gt;
	this.kill(RegExp(&#039;\\s*[{][{][^{}]*\\n&#039;), &#039;}}&#039;, &#039;{{&#039;);&lt;br /&gt;
};&lt;br /&gt;
// ENDFILE: previewmaker.js&lt;br /&gt;
// STARTFILE: querypreview.js&lt;br /&gt;
function loadAPIPreview(queryType, article, navpop) {&lt;br /&gt;
	var art=new Title(article).urlString();&lt;br /&gt;
	var url=pg.wiki.apiwikibase + &#039;?format=json&amp;amp;action=query&amp;amp;&#039;;&lt;br /&gt;
	var htmlGenerator=function(a,d){alert(&#039;invalid html generator&#039;);};&lt;br /&gt;
	switch (queryType) {&lt;br /&gt;
	case &#039;history&#039;:&lt;br /&gt;
		url += &#039;meta=userinfo&amp;amp;uiprop=options&amp;amp;titles=&#039; + art + &#039;&amp;amp;prop=revisions&amp;amp;rvlimit=&#039; +&lt;br /&gt;
			getValueOf(&#039;popupHistoryPreviewLimit&#039;);&lt;br /&gt;
		htmlGenerator=APIhistoryPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;category&#039;:&lt;br /&gt;
		url += &#039;list=categorymembers&amp;amp;cmtitle=&#039; + art;&lt;br /&gt;
		htmlGenerator=APIcategoryPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;userinfo&#039;:&lt;br /&gt;
	  var username = new Title( article ).userName();&lt;br /&gt;
		var usernameart = encodeURIComponent( username );&lt;br /&gt;
		if (pg.re.ipUser.test(username)) {&lt;br /&gt;
			url += &#039;list=blocks&amp;amp;bkprop=range&amp;amp;bkip=&#039; + usernameart;&lt;br /&gt;
		} else {&lt;br /&gt;
			url += &#039;list=users&amp;amp;usprop=blockinfo|groups|editcount|registration&amp;amp;ususers=&#039; + usernameart + &amp;quot;&amp;amp;meta=globaluserinfo&amp;amp;guiprop=groups|unattached&amp;amp;guiuser=&amp;quot;+ usernameart;&lt;br /&gt;
		}&lt;br /&gt;
		htmlGenerator=APIuserInfoPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;contribs&#039;:&lt;br /&gt;
		var usernameart = encodeURIComponent( new Title( article ).userName() );&lt;br /&gt;
		url += &#039;list=usercontribs&amp;amp;meta=userinfo&amp;amp;uiprop=options&amp;amp;ucuser=&#039; + usernameart +&lt;br /&gt;
			&#039;&amp;amp;uclimit=&#039; + getValueOf(&#039;popupContribsPreviewLimit&#039;);&lt;br /&gt;
		htmlGenerator=APIcontribsPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;imagepagepreview&#039;:&lt;br /&gt;
		var trail=&#039;&#039;;&lt;br /&gt;
		if (getValueOf(&#039;popupImageLinks&#039;)) { trail = &#039;&amp;amp;list=imageusage&amp;amp;iutitle=&#039; + art; }&lt;br /&gt;
		url += &#039;titles=&#039; + art + &#039;&amp;amp;prop=revisions|imageinfo&amp;amp;rvprop=content&#039; + trail;&lt;br /&gt;
		htmlGenerator=APIimagepagePreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;backlinks&#039;:&lt;br /&gt;
		url += &#039;list=backlinks&amp;amp;bltitle=&#039; + art;&lt;br /&gt;
		htmlGenerator=APIbacklinksPreviewHTML;&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	if( !window.wgEnableAPI || !wgEnableAPI ) {&lt;br /&gt;
		/* The API is not available */&lt;br /&gt;
		htmlGenerator=function(a,d){&lt;br /&gt;
			return &#039;This function of navigation popups now requires a MediaWiki &#039; + &lt;br /&gt;
			&#039;installation with the &amp;lt;a href=&amp;quot;http://www.mediawiki.org/wiki/API&amp;quot;&amp;gt;API&amp;lt;/a&amp;gt; enabled.&#039;; };&lt;br /&gt;
	}&lt;br /&gt;
	var callback=function(d){&lt;br /&gt;
		log( &amp;quot;callback of API functions was hit&amp;quot; );&lt;br /&gt;
		showAPIPreview(queryType, htmlGenerator(article,d,navpop), navpop.idNumber, navpop, d);&lt;br /&gt;
	};&lt;br /&gt;
	if (pg.flag.isIE) {&lt;br /&gt;
		url = url + &#039;&amp;amp;*&#039;; //to circumvent https://bugzilla.wikimedia.org/show_bug.cgi?id=28840&lt;br /&gt;
	}&lt;br /&gt;
	var go = function(){&lt;br /&gt;
		getPageWithCaching(url, callback, navpop);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf(&#039;popupLazyDownloads&#039;)) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, &#039;unhide&#039;, &#039;before&#039;, &#039;DOWNLOAD_&#039;+queryType+&#039;_QUERY_DATA&#039;); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function linkList(list) {&lt;br /&gt;
	list.sort(function(x,y) { return (x==y ? 0 : (x&amp;lt;y ? -1 : 1)); });&lt;br /&gt;
	var buf=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;list.length; ++i) {&lt;br /&gt;
		buf.push(wikiLink({article: new Title(list[i]),&lt;br /&gt;
				   text:	list[i].split(&#039; &#039;).join(&#039;&amp;amp;nbsp;&#039;),&lt;br /&gt;
				   action:  &#039;view&#039;}));&lt;br /&gt;
	}&lt;br /&gt;
	return buf.join(&#039;, &#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getTimeOffset(tz) {&lt;br /&gt;
	if( tz ) {&lt;br /&gt;
		if( tz.indexOf(&#039;|&#039;) &amp;gt; -1 ) {&lt;br /&gt;
			// New format&lt;br /&gt;
			return parseInt(tz.split(&#039;|&#039;)[1],10);&lt;br /&gt;
		} else if ( tz.indexOf(&#039;:&#039;) &amp;gt; -1 ) {&lt;br /&gt;
			// Old format&lt;br /&gt;
			return( parseInt(tz,10)*60 + parseInt(tz.split(&#039;:&#039;)[1],10) );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function editPreviewTable(article, h, reallyContribs, timeOffset) {&lt;br /&gt;
	var html=[&#039;&amp;lt;table&amp;gt;&#039;];&lt;br /&gt;
	var day=null;&lt;br /&gt;
	var curart=article;&lt;br /&gt;
	for (var i=0; i&amp;lt;h.length; ++i) {&lt;br /&gt;
		if (reallyContribs) { &lt;br /&gt;
			var page=h[i][&#039;title&#039;]; curart = new Title(page);&lt;br /&gt;
		}&lt;br /&gt;
		var minor=typeof h[i][&#039;minor&#039;]==&#039;undefined&#039; ? &#039;&#039; : &#039;&amp;lt;b&amp;gt;m &amp;lt;/b&amp;gt;&#039;;&lt;br /&gt;
		var editDate=adjustDate(getDateFromTimestamp(h[i].timestamp), timeOffset);&lt;br /&gt;
		var thisDay = dayFormat(editDate);&lt;br /&gt;
		var thisTime = timeFormat(editDate);&lt;br /&gt;
		if (thisDay==day) { thisDay=&#039;&#039;; }&lt;br /&gt;
		else { day=thisDay; }&lt;br /&gt;
		if (thisDay) {&lt;br /&gt;
			html.push( &#039;&amp;lt;tr&amp;gt;&amp;lt;td colspan=3&amp;gt;&amp;lt;span class=&amp;quot;popup_history_date&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				  thisDay+&#039;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		html.push(&#039;&amp;lt;tr class=&amp;quot;popup_history_row_&#039; + ( (i%2) ? &#039;odd&#039; : &#039;even&#039;) + &#039;&amp;quot;&amp;gt;&#039;);&lt;br /&gt;
		html.push(&#039;&amp;lt;td&amp;gt;(&amp;lt;a href=&amp;quot;&#039; + pg.wiki.titlebase + new Title(curart).urlString() +&lt;br /&gt;
			&#039;&amp;amp;diff=prev&amp;amp;oldid=&#039; + h[i][&#039;revid&#039;] + &#039;&amp;quot;&amp;gt;&#039; + popupString(&#039;last&#039;) + &#039;&amp;lt;/a&amp;gt;)&amp;lt;/td&amp;gt;&#039;);&lt;br /&gt;
		html.push(&#039;&amp;lt;td&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;a href=&amp;quot;&#039; + pg.wiki.titlebase + new Title(curart).urlString() +&lt;br /&gt;
			&#039;&amp;amp;oldid=&#039; + h[i][&#039;revid&#039;] + &#039;&amp;quot;&amp;gt;&#039; + thisTime + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039;);&lt;br /&gt;
		var col3url=&#039;&#039;, col3txt=&#039;&#039;;&lt;br /&gt;
		if (!reallyContribs) {&lt;br /&gt;
			var user=h[i][&#039;user&#039;];&lt;br /&gt;
			if( typeof h[i][&#039;userhidden&#039;] == &amp;quot;undefined&amp;quot; ) {&lt;br /&gt;
				if( pg.re.ipUser.test(user) ) {&lt;br /&gt;
					col3url=pg.wiki.titlebase + mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsSpecialId] + &#039;:Contributions&amp;amp;target=&#039; + new Title(user).urlString();&lt;br /&gt;
				} else {&lt;br /&gt;
					col3url=pg.wiki.titlebase + mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId] + &#039;:&#039; + new Title(user).urlString();&lt;br /&gt;
				}&lt;br /&gt;
				col3txt=pg.escapeQuotesHTML(user);&lt;br /&gt;
			} else {&lt;br /&gt;
				col3url=getValueOf(&#039;popupRevDelUrl&#039;);&lt;br /&gt;
				col3txt=pg.escapeQuotesHTML( popupString(&#039;revdel&#039;));&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			col3url=pg.wiki.titlebase + curart.urlString();&lt;br /&gt;
			col3txt=pg.escapeQuotesHTML(page);&lt;br /&gt;
		}&lt;br /&gt;
		html.push(&#039;&amp;lt;td&amp;gt;&#039; + (reallyContribs ? minor : &#039;&#039;) +&lt;br /&gt;
			&#039;&amp;lt;a href=&amp;quot;&#039; + col3url + &#039;&amp;quot;&amp;gt;&#039; + col3txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039;);&lt;br /&gt;
		var comment=&#039;&#039;;&lt;br /&gt;
		var c=h[i].comment || h[i][&#039;*&#039;];&lt;br /&gt;
		if (c) {&lt;br /&gt;
			comment=new Previewmaker(c, new Title(curart).toUrl()).editSummaryPreview();&lt;br /&gt;
		} else if (typeof h[i][&#039;commenthidden&#039;] != &amp;quot;undefined&amp;quot; ) {&lt;br /&gt;
			comment=popupString(&#039;revdel&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		html.push(&#039;&amp;lt;td&amp;gt;&#039; + (!reallyContribs ? minor : &#039;&#039;) + comment + &#039;&amp;lt;/td&amp;gt;&#039;);&lt;br /&gt;
		html.push(&#039;&amp;lt;/tr&amp;gt;&#039;);&lt;br /&gt;
		html=[html.join(&#039;&#039;)];&lt;br /&gt;
	}&lt;br /&gt;
	html.push(&#039;&amp;lt;/table&amp;gt;&#039;);&lt;br /&gt;
	return html.join(&#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getDateFromTimestamp(t) {&lt;br /&gt;
	var s=t.split(/[^0-9]/);&lt;br /&gt;
	switch(s.length) {&lt;br /&gt;
	case 0: return null;&lt;br /&gt;
	case 1: return new Date(s[0]);&lt;br /&gt;
	case 2: return new Date(s[0], s[1]-1);&lt;br /&gt;
	case 3: return new Date(s[0], s[1]-1, s[2]);&lt;br /&gt;
	case 4: return new Date(s[0], s[1]-1, s[2], s[3]);&lt;br /&gt;
	case 5: return new Date(s[0], s[1]-1, s[2], s[3], s[4]);&lt;br /&gt;
	case 6: return new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5]);&lt;br /&gt;
	default: return new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5], s[6]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function adjustDate(d, offset) {&lt;br /&gt;
	// offset is in minutes&lt;br /&gt;
	var o=offset * 60 * 1000;&lt;br /&gt;
	return new Date( +d + o);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dayFormat(editDate, utc) {&lt;br /&gt;
	if (utc) { return map(zeroFill, [editDate.getUTCFullYear(), editDate.getUTCMonth()+1, editDate.getUTCDate()]).join(&#039;-&#039;); }&lt;br /&gt;
	return map(zeroFill, [editDate.getFullYear(), editDate.getMonth()+1, editDate.getDate()]).join(&#039;-&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function timeFormat(editDate, utc) {&lt;br /&gt;
	if (utc) { return map(zeroFill, [editDate.getUTCHours(), editDate.getUTCMinutes(), editDate.getUTCSeconds()]).join(&#039;:&#039;); }&lt;br /&gt;
	return map(zeroFill, [editDate.getHours(), editDate.getMinutes(), editDate.getSeconds()]).join(&#039;:&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function showAPIPreview(queryType, html, id, navpop, download) {&lt;br /&gt;
	// DJ: done&lt;br /&gt;
	var target=&#039;popupPreview&#039;;&lt;br /&gt;
	switch (queryType) {&lt;br /&gt;
	case &#039;imagelinks&#039;:&lt;br /&gt;
	case &#039;category&#039;:&lt;br /&gt;
	case &#039;userinfo&#039;:&lt;br /&gt;
		target=&#039;popupPostPreview&#039;; break;&lt;br /&gt;
	}&lt;br /&gt;
	setPopupTipsAndHTML(html, target, id);&lt;br /&gt;
	completedNavpopTask(navpop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIbacklinksPreviewHTML(article, download, navpop) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsObj=getJsObj(download.data);&lt;br /&gt;
		   var list=jsObj.query.backlinks;&lt;br /&gt;
	} catch (someError) { return &#039;backlinksPreviewHTML went wonky&#039;; }&lt;br /&gt;
	var html=[];&lt;br /&gt;
	if (!list) { return popupString(&#039;No backlinks found&#039;); }&lt;br /&gt;
	for ( var i=0; i &amp;lt; list.length; i++ ) {&lt;br /&gt;
		var t=new Title(list[i][&#039;title&#039;]);&lt;br /&gt;
		html.push(&#039;&amp;lt;a href=&amp;quot;&#039; + pg.wiki.titlebase + t.urlString() + &#039;&amp;quot;&amp;gt;&#039; + t + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	html=html.join(&#039;, &#039;);&lt;br /&gt;
	if (jsObj[&#039;query-continue&#039;] &amp;amp;&amp;amp; jsObj[&#039;query-continue&#039;].backlinks &amp;amp;&amp;amp; jsObj[&#039;query-continue&#039;].backlinks.blcontinue) {&lt;br /&gt;
		html += popupString(&#039; and more&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIsharedImagePagePreviewHTML(obj) {&lt;br /&gt;
	log( &amp;quot;APIsharedImagePagePreviewHTML&amp;quot; );&lt;br /&gt;
	var popupid = obj[&#039;requestid&#039;];&lt;br /&gt;
	if( obj[&#039;query&#039;] &amp;amp;&amp;amp; obj[&#039;query&#039;][&#039;pages&#039;] )&lt;br /&gt;
	{&lt;br /&gt;
		var page=anyChild(obj[&#039;query&#039;][&#039;pages&#039;]);&lt;br /&gt;
		var content=(page &amp;amp;&amp;amp; page.revisions ) ? page.revisions[0][&#039;*&#039;] : null;&lt;br /&gt;
		if( content ) &lt;br /&gt;
		{&lt;br /&gt;
			/* Not entirely safe, but the best we can do */&lt;br /&gt;
			var p=new Previewmaker(content, pg.current.link.navpopup.article, pg.current.link.navpopup);&lt;br /&gt;
			p.makePreview();&lt;br /&gt;
			setPopupHTML( p.html, &amp;quot;popupSecondPreview&amp;quot;, popupid );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIimagepagePreviewHTML(article, download, navpop) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsObj=getJsObj(download.data);&lt;br /&gt;
		var page=anyChild(jsObj.query.pages);&lt;br /&gt;
		var content=(page &amp;amp;&amp;amp; page.revisions ) ? page.revisions[0][&#039;*&#039;] : null;&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		return &#039;API imagepage preview failed :(&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
	var alt=&#039;&#039;;&lt;br /&gt;
	try{alt=navpop.parentAnchor.childNodes[0].alt;} catch(e){}&lt;br /&gt;
	if (alt) {&lt;br /&gt;
		ret = ret + &#039;&amp;lt;hr&amp;gt;&amp;lt;b&amp;gt;&#039; + popupString(&#039;Alt text:&#039;) + &#039;&amp;lt;/b&amp;gt; &#039; + pg.escapeQuotesHTML(alt);&lt;br /&gt;
	}&lt;br /&gt;
	if (content) {&lt;br /&gt;
		var p=prepPreviewmaker(content, article, navpop);&lt;br /&gt;
		p.makePreview();&lt;br /&gt;
		if (p.html) { ret += &#039;&amp;lt;hr&amp;gt;&#039; + p.html; }&lt;br /&gt;
	}&lt;br /&gt;
	if (content!==null &amp;amp;&amp;amp; getValueOf(&#039;popupSummaryData&#039;)) {&lt;br /&gt;
		var info=getPageInfo(content, download);&lt;br /&gt;
		log(info);&lt;br /&gt;
		setPopupTrailer(info, navpop.idNumber);&lt;br /&gt;
	}&lt;br /&gt;
	if (page &amp;amp;&amp;amp; page.imagerepository == &amp;quot;shared&amp;quot; ) {&lt;br /&gt;
		var art=new Title(article);&lt;br /&gt;
		var encart = encodeURIComponent( &amp;quot;File:&amp;quot; + art.stripNamespace() );&lt;br /&gt;
		var shared_url =  pg.wiki.apicommonsbase + &#039;?format=json&amp;amp;callback=APIsharedImagePagePreviewHTML&#039; +&lt;br /&gt;
							&#039;&amp;amp;requestid=&#039; + navpop.idNumber +&lt;br /&gt;
							&#039;&amp;amp;action=query&amp;amp;prop=revisions&amp;amp;rvprop=content&amp;amp;titles=&#039; + encart;&lt;br /&gt;
		if (pg.flag.isIE) {&lt;br /&gt;
			shared_url = shared_url + &#039;&amp;amp;*&#039;; //to circumvent https://bugzilla.wikimedia.org/show_bug.cgi?id=28840&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ret = ret +&#039;&amp;lt;hr&amp;gt;&#039; + popupString( &#039;Image from Commons&#039;) +&lt;br /&gt;
				&#039;: &amp;lt;a href=&amp;quot;&#039; + pg.wiki.commonsbase + &#039;?title=&#039; + encart + &#039;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				popupString( &#039;Description page&#039;) + &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
		importScriptURI( shared_url );&lt;br /&gt;
	}&lt;br /&gt;
	showAPIPreview(&#039;imagelinks&#039;, APIimagelinksPreviewHTML(article,download), navpop.idNumber, download);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIimagelinksPreviewHTML(article, download) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var list=jsobj.query.imageusage;&lt;br /&gt;
		if (!list) { return popupString(&#039;No image links found&#039;); }&lt;br /&gt;
	} catch(someError) { return &#039;Image links preview generation failed :(&#039;; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i &amp;lt; list.length; i++) {&lt;br /&gt;
		ret.push(list[i][&#039;title&#039;]);&lt;br /&gt;
	}&lt;br /&gt;
	if (ret.length === 0) { return popupString(&#039;No image links found&#039;); }&lt;br /&gt;
	return &#039;&amp;lt;h2&amp;gt;&#039; + popupString(&#039;File links&#039;) + &#039;&amp;lt;/h2&amp;gt;&#039; + linkList(ret);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIcategoryPreviewHTML(article, download) {&lt;br /&gt;
	try{&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var list=jsobj.query.categorymembers;&lt;br /&gt;
	} catch(someError) { return &#039;Category preview failed :(&#039;; }&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var p=0; p &amp;lt; list.length; p++) { &lt;br /&gt;
	   ret.push(list[p][&#039;title&#039;]); &lt;br /&gt;
	}&lt;br /&gt;
	if (ret.length === 0) { return popupString(&#039;Empty category&#039;); }&lt;br /&gt;
	ret = &#039;&amp;lt;h2&amp;gt;&#039; + tprintf(&#039;Category members (%s shown)&#039;, [ret.length]) + &#039;&amp;lt;/h2&amp;gt;&#039; +linkList(ret);&lt;br /&gt;
	if (jsobj[&#039;query-continue&#039;] &amp;amp;&amp;amp; jsobj[&#039;query-continue&#039;].categorymembers &amp;amp;&amp;amp; jsobj[&#039;query-continue&#039;].categorymembers.cmcontinue) {&lt;br /&gt;
		ret += popupString(&#039; and more&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIuserInfoPreviewHTML(article, download) {&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	try{&lt;br /&gt;
		var queryobj=getJsObj(download.data).query;&lt;br /&gt;
	} catch(someError) { return &#039;Userinfo preview failed :(&#039;; }&lt;br /&gt;
	&lt;br /&gt;
	var user=anyChild(queryobj.users);&lt;br /&gt;
	if (user) {&lt;br /&gt;
		var globaluserinfo=queryobj.globaluserinfo;&lt;br /&gt;
		if (user.invalid == &#039;&#039;) {&lt;br /&gt;
			ret.push( popupString( &#039;Invalid user&#039;) );&lt;br /&gt;
		} else if (user.missing == &#039;&#039;) {&lt;br /&gt;
			ret.push( popupString( &#039;Not a registered username&#039;) );&lt;br /&gt;
		}&lt;br /&gt;
		if( user.blockedby )&lt;br /&gt;
			ret.push(&#039;&amp;lt;b&amp;gt;&#039; + popupString(&#039;BLOCKED&#039;) + &#039;&amp;lt;/b&amp;gt;&#039;);&lt;br /&gt;
		if( globaluserinfo &amp;amp;&amp;amp; (globaluserinfo.locked != null || globaluserinfo.hidden != null) ) {&lt;br /&gt;
			var lockedSulAccountIsAttachedToThis = true;&lt;br /&gt;
			for( var i=0; globaluserinfo.unattached &amp;amp;&amp;amp; i &amp;lt; globaluserinfo.unattached.length; i++) {&lt;br /&gt;
				if (globaluserinfo.unattached[i].wiki===wgDBname) { lockedSulAccountIsAttachedToThis=false; break; }&lt;br /&gt;
			}&lt;br /&gt;
			if (lockedSulAccountIsAttachedToThis) {&lt;br /&gt;
				if (globaluserinfo.locked != null) ret.push(&#039;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&#039; + popupString(&#039;LOCKED&#039;) + &#039;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&#039;);&lt;br /&gt;
				if (globaluserinfo.hidden != null) ret.push(&#039;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&#039; + popupString(&#039;HIDDEN&#039;) + &#039;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for( var i=0; (user.groups &amp;amp;&amp;amp; i &amp;lt; user.groups.length); i++) {&lt;br /&gt;
			switch (user.groups[i]) {&lt;br /&gt;
				case &#039;*&#039;:&lt;br /&gt;
				case &#039;user&#039;:&lt;br /&gt;
				case &#039;autoconfirmed&#039;:&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					ret.push( pg.escapeQuotesHTML(user.groups[i]) );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for( var i=0; (globaluserinfo &amp;amp;&amp;amp; globaluserinfo.groups &amp;amp;&amp;amp; i &amp;lt; globaluserinfo.groups.length); i++) {&lt;br /&gt;
			ret.push( &#039;&amp;lt;i&amp;gt;&#039;+pg.escapeQuotesHTML(globaluserinfo.groups[i])+&#039;&amp;lt;/i&amp;gt;&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( user.editcount || user.registration )&lt;br /&gt;
			ret.push( pg.escapeQuotesHTML((user.editcount?user.editcount:&#039;&#039;) + popupString(&#039; edits since: &#039;) + (user.registration?dayFormat(getDateFromTimestamp(user.registration)):&#039;&#039;)) );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (queryobj.blocks) {&lt;br /&gt;
		ret.push( popupString( &#039;IP user&#039;) ); //we only request list=blocks for IPs&lt;br /&gt;
		for (var i=0; i&amp;lt;queryobj.blocks.length; i++) {&lt;br /&gt;
			ret.push(&#039;&amp;lt;b&amp;gt;&#039; + popupString(queryobj.blocks[i].rangestart===queryobj.blocks[i].rangeend ? &#039;BLOCKED&#039; : &#039;RANGEBLOCKED&#039;) + &#039;&amp;lt;/b&amp;gt;&#039; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	ret = &#039;&amp;lt;hr&amp;gt;&#039; + ret.join( &#039;, &#039; );&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIcontribsPreviewHTML(article, download, navpop) {&lt;br /&gt;
	return APIhistoryPreviewHTML(article, download, navpop, true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function APIhistoryPreviewHTML(article, download, navpop, reallyContribs) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsobj=getJsObj(download.data);&lt;br /&gt;
		var tz=jsobj.query.userinfo.options.timecorrection;&lt;br /&gt;
		if( reallyContribs )&lt;br /&gt;
			var edits=jsobj.query.usercontribs;&lt;br /&gt;
		else &lt;br /&gt;
			var edits=anyChild(jsobj.query.pages)[&#039;revisions&#039;];&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		return &#039;History preview failed :-(&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	var timeOffset = getTimeOffset(tz);&lt;br /&gt;
	Cookie.create(&#039;popTz&#039;, timeOffset, 1);&lt;br /&gt;
&lt;br /&gt;
	var ret=editPreviewTable(article, edits, reallyContribs, timeOffset);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: querypreview.js&lt;br /&gt;
// STARTFILE: debug.js&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Debugging functions&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
function log(){}; // dummy to stop errors&lt;br /&gt;
function setupDebugging() {&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	if (window.popupDebug) { // popupDebug is set from .version&lt;br /&gt;
		window.log=function(x) { //if(gMsg!=&#039;&#039;)gMsg += &#039;\n&#039;; gMsg+=time() + &#039; &#039; + x; };&lt;br /&gt;
			window.console.log(x);&lt;br /&gt;
		}&lt;br /&gt;
		window.errlog=function(x) {&lt;br /&gt;
			window.console.error(x);&lt;br /&gt;
		}&lt;br /&gt;
		log(&#039;Initializing logger&#039;);&lt;br /&gt;
	} else {&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
		window.log = function(x) {};&lt;br /&gt;
		window.errlog = function(x) {};&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: debug.js&lt;br /&gt;
// STARTFILE: images.js&lt;br /&gt;
&lt;br /&gt;
// load image of type Title.&lt;br /&gt;
function loadImage(image, navpop) {&lt;br /&gt;
	if (typeof image.stripNamespace != &#039;function&#039;) { alert(&#039;loadImages bad&#039;); }&lt;br /&gt;
	// API call to retrieve image info.&lt;br /&gt;
&lt;br /&gt;
	if (!getValueOf(&#039;popupImages&#039;) || !window.wgEnableAPI || !wgEnableAPI) return;&lt;br /&gt;
	if (!isValidImageName(image)) return false;&lt;br /&gt;
	&lt;br /&gt;
	var art=image.urlString();&lt;br /&gt;
&lt;br /&gt;
	var url=pg.wiki.apiwikibase + &#039;?format=json&amp;amp;action=query&#039;;&lt;br /&gt;
	url += &#039;&amp;amp;prop=imageinfo&amp;amp;iiprop=url|mime&amp;amp;iiurlwidth=&#039; + getValueOf(&#039;popupImageSizeLarge&#039;);;&lt;br /&gt;
	url += &#039;&amp;amp;titles=&#039; + art;&lt;br /&gt;
	if (pg.flag.isIE) {&lt;br /&gt;
		url = url + &#039;&amp;amp;*&#039;; //to circumvent https://bugzilla.wikimedia.org/show_bug.cgi?id=28840&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	pendingNavpopTask(navpop);&lt;br /&gt;
	var callback=function(d){&lt;br /&gt;
		popupsInsertImage(navpop.idNumber, navpop, d);&lt;br /&gt;
	};&lt;br /&gt;
	var go = function(){&lt;br /&gt;
		getPageWithCaching(url, callback, navpop);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf(&#039;popupLazyDownloads&#039;)) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, &#039;unhide&#039;, &#039;after&#039;, &#039;DOWNLOAD_IMAGE_QUERY_DATA&#039;); }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupsInsertImage(id, navpop, download) {&lt;br /&gt;
	log( &amp;quot;popupsInsertImage&amp;quot;);&lt;br /&gt;
	try {&lt;br /&gt;
		var jsObj=getJsObj(download.data);&lt;br /&gt;
		var imagepage=anyChild(jsObj.query.pages);&lt;br /&gt;
		if (typeof imagepage.imageinfo === &#039;undefined&#039;) return;&lt;br /&gt;
		var imageinfo = imagepage.imageinfo[0];&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		log( &amp;quot;popupsInsertImage failed :(&amp;quot; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var popupImage = document.getElementById(&amp;quot;popupImg&amp;quot;+id);&lt;br /&gt;
	if (!popupImage) {&lt;br /&gt;
		log( &amp;quot;could not find insertion point for image&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	popupImage.width=getValueOf(&#039;popupImageSize&#039;);&lt;br /&gt;
	popupImage.style.display=&#039;inline&#039;;&lt;br /&gt;
&lt;br /&gt;
	// Set the source for the image.&lt;br /&gt;
	if( imageinfo.thumburl )&lt;br /&gt;
		popupImage.src=imageinfo.thumburl;&lt;br /&gt;
	else if( imageinfo.mime.indexOf(&amp;quot;image&amp;quot;) == 0 ){&lt;br /&gt;
		popupImage.src=imageinfo.url;&lt;br /&gt;
		log( &amp;quot;a thumb could not be found, using original image&amp;quot; );&lt;br /&gt;
	} else log( &amp;quot;fullsize imagethumb, but not sure if it&#039;s an image&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	var a=document.getElementById(&amp;quot;popupImageLink&amp;quot;+id);&lt;br /&gt;
	if (a === null) { return null; }&lt;br /&gt;
&lt;br /&gt;
	// Determine the action of the surrouding imagelink.&lt;br /&gt;
	switch (getValueOf(&#039;popupThumbAction&#039;)) {&lt;br /&gt;
	case &#039;imagepage&#039;:&lt;br /&gt;
		if (pg.current.article.namespaceId()!=pg.nsImageId) {&lt;br /&gt;
			a.href=imageinfo.descriptionurl;&lt;br /&gt;
			// FIXME: unreliable pg.idNumber&lt;br /&gt;
			popTipsSoonFn(&#039;popupImage&#039; + id)();&lt;br /&gt;
			break;&lt;br /&gt;
		} // else fall through&lt;br /&gt;
	case &#039;sizetoggle&#039;:&lt;br /&gt;
		a.onclick=toggleSize;&lt;br /&gt;
		a.title=popupString(&#039;Toggle image size&#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	case &#039;linkfull&#039;:&lt;br /&gt;
		a.href = imageinfo.url;&lt;br /&gt;
		a.title=popupString(&#039;Open full-size image&#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Toggles the image between inline small and navpop fullwidth.&lt;br /&gt;
// It&#039;s the same image, no actual sizechange occurs, only display width.&lt;br /&gt;
function toggleSize() {&lt;br /&gt;
	var imgContainer=this;&lt;br /&gt;
	if (!imgContainer) { alert(&#039;imgContainer is null :/&#039;); return;}&lt;br /&gt;
	img=imgContainer.firstChild;&lt;br /&gt;
	if (!img) { alert(&#039;img is null :/&#039;); return;}&lt;br /&gt;
	if (!img.style.width || img.style.width==&#039;&#039;) { img.style.width=&#039;100%&#039;; }&lt;br /&gt;
	else { img.style.width=&#039;&#039;; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Returns one title of an image from wikiText.&lt;br /&gt;
function getValidImageFromWikiText(wikiText) {&lt;br /&gt;
	// nb in pg.re.image we&#039;re interested in the second bracketed expression&lt;br /&gt;
	// this may change if the regex changes :-(&lt;br /&gt;
	//var match=pg.re.image.exec(wikiText);&lt;br /&gt;
	var matched=null;&lt;br /&gt;
	var match;&lt;br /&gt;
	// strip html comments, used by evil bots :-(&lt;br /&gt;
	var t = removeMatchesUnless(wikiText, RegExp(&#039;(&amp;lt;!--[\\s\\S]*?--&amp;gt;)&#039;), 1,&lt;br /&gt;
					RegExp(&#039;^&amp;lt;!--[^[]*popup&#039;, &#039;i&#039;));&lt;br /&gt;
&lt;br /&gt;
	while ( match = pg.re.image.exec(t) ) {&lt;br /&gt;
		// now find a sane image name - exclude templates by seeking {&lt;br /&gt;
		var m = match[2] || match[6];&lt;br /&gt;
		if ( isValidImageName(m) ) {&lt;br /&gt;
			matched=m;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	pg.re.image.lastIndex=0;&lt;br /&gt;
	if (!matched) { return null; }&lt;br /&gt;
	return mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsImageId]+&#039;:&#039;+upcaseFirst(matched);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function removeMatchesUnless(str, re1, parencount, re2) {&lt;br /&gt;
	var split=str.parenSplit(re1);&lt;br /&gt;
	var c=parencount + 1;&lt;br /&gt;
	for (var i=0; i&amp;lt;split.length; ++i) {&lt;br /&gt;
	if ( i%c === 0 || re2.test(split[i]) ) { continue; }&lt;br /&gt;
	split[i]=&#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return split.join(&#039;&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: images.js&lt;br /&gt;
// STARTFILE: namespaces.js&lt;br /&gt;
// Set up namespaces and other non-strings.js localization&lt;br /&gt;
// (currently that means redirs too)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function namespaceListToRegex(list) {return RegExp(&#039;^(&#039;+list.join(&#039;|&#039;).split(&#039; &#039;).join(&#039;[ _]&#039;)+&#039;):&#039;);};&lt;br /&gt;
&lt;br /&gt;
function setNamespaces() {&lt;br /&gt;
	pg.nsSpecialId   = -1;&lt;br /&gt;
	pg.nsMainspaceId  = 0;&lt;br /&gt;
	pg.nsImageId	 = 6;&lt;br /&gt;
	pg.nsUserId	  = 2;&lt;br /&gt;
	pg.nsUsertalkId  = 3;&lt;br /&gt;
	pg.nsCategoryId  = 14;&lt;br /&gt;
	pg.nsTemplateId  = 10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function setRedirs() {&lt;br /&gt;
	var r=&#039;redirect&#039;;&lt;br /&gt;
	var R=&#039;REDIRECT&#039;;&lt;br /&gt;
	var redirLists={&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
		&#039;ar&#039;:  [ R, &#039;تحويل&#039; ],&lt;br /&gt;
		&#039;be&#039;:  [ r, &#039;перанакіраваньне&#039; ],&lt;br /&gt;
		&#039;bg&#039;:  [ r, &#039;пренасочване&#039;, &#039;виж&#039; ],&lt;br /&gt;
		&#039;bs&#039;:  [ r, &#039;Preusmjeri&#039;, &#039;preusmjeri&#039;, &#039;PREUSMJERI&#039; ],&lt;br /&gt;
		&#039;cs&#039;:  [ R, &#039;PŘESMĚRUJ&#039; ],&lt;br /&gt;
		&#039;cy&#039;:  [ r, &#039;ail-cyfeirio&#039; ],&lt;br /&gt;
		&#039;de&#039;:  [ R, &#039;WEITERLEITUNG&#039; ],&lt;br /&gt;
		&#039;eo&#039;:  [ R, &#039;ALIDIREKTU&#039;, &#039;ALIDIREKTI&#039; ],&lt;br /&gt;
		&#039;es&#039;:  [ R, &#039;REDIRECCIÓN&#039; ],&lt;br /&gt;
		&#039;et&#039;:  [ r, &#039;suuna&#039; ],&lt;br /&gt;
		&#039;ga&#039;:  [ r, &#039;athsheoladh&#039; ],&lt;br /&gt;
		&#039;gl&#039;:  [ r, &#039;REDIRECCIÓN&#039;, &#039;REDIRECIONAMENTO&#039;],&lt;br /&gt;
		&#039;he&#039;:  [ R, &#039;הפניה&#039; ],&lt;br /&gt;
		&#039;hu&#039;:  [ R, &#039;ÁTIRÁNYÍTÁS&#039; ],&lt;br /&gt;
		&#039;is&#039;:  [ r, &#039;tilvísun&#039;, &#039;TILVÍSUN&#039; ],&lt;br /&gt;
		&#039;it&#039;:  [ R, &#039;RINVIA&#039;, &#039;Rinvia&#039;],&lt;br /&gt;
                &#039;ja&#039;:  [ R, &#039;転送&#039; ],&lt;br /&gt;
		&#039;mk&#039;:  [ r, &#039;пренасочување&#039;, &#039;види&#039; ],&lt;br /&gt;
		&#039;nds&#039;: [ r, &#039;wiederleiden&#039; ],&lt;br /&gt;
		&#039;nl&#039;:  [ R, &#039;DOORVERWIJZING&#039; ],&lt;br /&gt;
		&#039;nn&#039;:  [ r, &#039;omdiriger&#039; ],&lt;br /&gt;
		&#039;pl&#039;:  [ R, &#039;PATRZ&#039;, &#039;PRZEKIERUJ&#039;, &#039;TAM&#039; ],&lt;br /&gt;
		&#039;pt&#039;:  [ R, &#039;redir&#039; ],&lt;br /&gt;
		&#039;ru&#039;:  [ R, &#039;ПЕРЕНАПРАВЛЕНИЕ&#039;, &#039;ПЕРЕНАПР&#039; ],&lt;br /&gt;
		&#039;sk&#039;:  [ r, &#039;presmeruj&#039; ],&lt;br /&gt;
		&#039;sr&#039;:  [ r, &#039;Преусмери&#039;, &#039;преусмери&#039;, &#039;ПРЕУСМЕРИ&#039;, &#039;Preusmeri&#039;, &#039;preusmeri&#039;, &#039;PREUSMERI&#039; ],&lt;br /&gt;
		&#039;tt&#039;:  [ R, &#039;yünältü&#039;, &#039;перенаправление&#039;, &#039;перенапр&#039; ],&lt;br /&gt;
		&#039;uk&#039;: [ R, &#039;ПЕРЕНАПРАВЛЕННЯ&#039;, &#039;ПЕРЕНАПР&#039; ],&lt;br /&gt;
		&#039;vi&#039;:  [ r, &#039;đổi&#039; ] // no comma&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	};&lt;br /&gt;
	var redirList=redirLists[ pg.wiki.lang ] || [r, R];&lt;br /&gt;
	// Mediawiki is very tolerant about what comes after the #redirect at the start&lt;br /&gt;
	pg.re.redirect=RegExp(&#039;^\\s*[#](&#039; + redirList.join(&#039;|&#039;) + &#039;).*?\\[{2}([^\\|\\]]*)(|[^\\]]*)?\\]{2}\\s*(.*)&#039;, &#039;i&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setInterwiki() {&lt;br /&gt;
	if (pg.wiki.wikimedia) {&lt;br /&gt;
		// From http://meta.wikimedia.org/wiki/List_of_Wikipedias&lt;br /&gt;
		pg.wiki.interwiki=&#039;aa|ab|ace|af|ak|als|am|an|ang|ar|arc|arz|as|ast|av|ay|az|ba|bar|bat-smg|bcl|be|be-x-old|bg|bh|bi|bjn|bm|bn|bo|bpy|br|bs|bug|bxr|ca|cbk-zam|cdo|ce|ceb|ch|cho|chr|chy|ckb|co|cr|crh|cs|csb|cu|cv|cy|da|de|diq|dsb|dv|dz|ee|el|eml|en|eo|es|et|eu|ext|fa|ff|fi|fiu-vro|fj|fo|fr|frp|frr|fur|fy|ga|gag|gan|gd|gl|glk|gn|got|gu|gv|ha|hak|haw|he|hi|hif|ho|hr|hsb|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|ilo|io|is|it|iu|ja|jbo|jv|ka|kaa|kab|kbd|kg|ki|kj|kk|kl|km|kn|ko|koi|kr|krc|ks|ksh|ku|kv|kw|ky|la|lad|lb|lbe|lg|li|lij|lmo|ln|lo|lt|ltg|lv|map-bms|mdf|mg|mh|mhr|mi|mk|ml|mn|mo|mr|mrj|ms|mt|mus|mwl|my|myv|mzn|na|nah|nap|nds|nds-nl|ne|new|ng|nl|nn|no|nov|nrm|nv|ny|oc|om|or|os|pa|pag|pam|pap|pcd|pdc|pfl|pi|pih|pl|pms|pnb|pnt|ps|pt|qu|rm|rmy|rn|ro|roa-rup|roa-tara|ru|rue|rw|sa|sah|sc|scn|sco|sd|se|sg|sh|si|simple|sk|sl|sm|sn|so|sq|sr|srn|ss|st|stq|su|sv|sw|szl|ta|te|tet|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tum|tw|ty|udm|ug|uk|ur|uz|ve|vec|vi|vls|vo|wa|war|wo|wuu|xal|xh|yi|yo|za|zea|zh|zh-classical|zh-min-nan|zh-yue|zu&#039;;&lt;br /&gt;
		pg.re.interwiki=RegExp(&#039;^&#039;+pg.wiki.interwiki+&#039;:&#039;);&lt;br /&gt;
	} else {&lt;br /&gt;
		pg.wiki.interwiki=null;&lt;br /&gt;
		pg.re.interwiki=RegExp(&#039;^$&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// return a regexp pattern matching all variants to write the given namespace&lt;br /&gt;
function nsRe(namespaceId) {&lt;br /&gt;
	var imageNamespaceVariants = [];&lt;br /&gt;
	jQuery.each(mw.config.get(&#039;wgNamespaceIds&#039;), function(_localizedNamespaceLc, _namespaceId) {&lt;br /&gt;
		if (_namespaceId!=namespaceId) return;&lt;br /&gt;
		//todo: escape regexp fragments!&lt;br /&gt;
		_localizedNamespaceLc = upcaseFirst(_localizedNamespaceLc);&lt;br /&gt;
		imageNamespaceVariants.push(_localizedNamespaceLc.split(&#039; &#039;).join(&#039;[ _]&#039;));&lt;br /&gt;
		imageNamespaceVariants.push(encodeURI(_localizedNamespaceLc));&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	return &#039;(?:&#039; + imageNamespaceVariants.join(&#039;|&#039;) + &#039;)&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nsReImage() {&lt;br /&gt;
	return nsRe(pg.nsImageId);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ENDFILE: namespaces.js&lt;br /&gt;
// STARTFILE: selpop.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function getEditboxSelection() {&lt;br /&gt;
	// see http://www.webgurusforum.com/8/12/0&lt;br /&gt;
	try {&lt;br /&gt;
		var editbox=document.editform.wpTextbox1;&lt;br /&gt;
	} catch (dang) { return; }&lt;br /&gt;
	// IE, Opera&lt;br /&gt;
	if (document.selection) { return document.selection.createRange().text; }&lt;br /&gt;
	// Mozilla&lt;br /&gt;
	var selStart = editbox.selectionStart;&lt;br /&gt;
	var selEnd = editbox.selectionEnd;&lt;br /&gt;
	return (editbox.value).substring(selStart, selEnd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function doSelectionPopup() {&lt;br /&gt;
	// popup if the selection looks like [[foo|anything afterwards at all&lt;br /&gt;
	// or [[foo|bar]]text without &#039;]]&#039;&lt;br /&gt;
	// or [[foo|bar]]&lt;br /&gt;
	var sel=getEditboxSelection();&lt;br /&gt;
	var open=sel.indexOf(&#039;[[&#039;);&lt;br /&gt;
	var pipe=sel.indexOf(&#039;|&#039;);&lt;br /&gt;
	var close=sel.indexOf(&#039;]]&#039;);&lt;br /&gt;
	if (open == -1 || ( pipe == -1 &amp;amp;&amp;amp; close == -1) ) { return; }&lt;br /&gt;
	if (pipe != -1 &amp;amp;&amp;amp; open &amp;gt; pipe || close != -1 &amp;amp;&amp;amp; open &amp;gt; close) { return; }&lt;br /&gt;
	if (getValueOf(&#039;popupOnEditSelection&#039;)==&#039;boxpreview&#039;) {&lt;br /&gt;
		return doSeparateSelectionPopup(sel);&lt;br /&gt;
	}&lt;br /&gt;
	var article=new Title(sel.substring(open+2, (pipe &amp;lt; 0) ? close : pipe)).urlString();&lt;br /&gt;
	if (close &amp;gt; 0 &amp;amp;&amp;amp; sel.substring(close+2).indexOf(&#039;[[&#039;) &amp;gt;= 0) { &lt;br /&gt;
		return; &lt;br /&gt;
	}&lt;br /&gt;
	var a=document.createElement(&#039;a&#039;);&lt;br /&gt;
	a.href=pg.wiki.titlebase + article;&lt;br /&gt;
	mouseOverWikiLink2(a);&lt;br /&gt;
	if (a.navpopup) {&lt;br /&gt;
		a.navpopup.addHook(function(){runStopPopupTimer(a.navpopup);}, &#039;unhide&#039;, &#039;after&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function doSeparateSelectionPopup(str) {&lt;br /&gt;
	var div=document.getElementById(&#039;selectionPreview&#039;);&lt;br /&gt;
	if (!div) {&lt;br /&gt;
		div = document.createElement(&#039;div&#039;);&lt;br /&gt;
		div.id=&#039;selectionPreview&#039;;&lt;br /&gt;
		try { var box=document.editform.wpTextbox1; }&lt;br /&gt;
		catch (oopsie) { return; }&lt;br /&gt;
		box.parentNode.insertBefore(div, box);&lt;br /&gt;
	}&lt;br /&gt;
	div.innerHTML=wiki2html(str);&lt;br /&gt;
	div.ranSetupTooltipsAlready = false;&lt;br /&gt;
	popTipsSoonFn(&#039;selectionPreview&#039;)();&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: selpop.js&lt;br /&gt;
// STARTFILE: navpopup.js&lt;br /&gt;
/**&lt;br /&gt;
   @fileoverview  Defines two classes: {@link Navpopup} and {@link Mousetracker}.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;code&amp;gt;Navpopup&amp;lt;/code&amp;gt; describes popups: when they appear, where, what&lt;br /&gt;
   they look like and so on.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;code&amp;gt;Mousetracker&amp;lt;/code&amp;gt; &amp;quot;captures&amp;quot; the mouse using&lt;br /&gt;
   &amp;lt;code&amp;gt;document.onmousemove&amp;lt;/code&amp;gt;.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Mousetracker.&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Mousetracker class. This monitors mouse movements and manages associated hooks.&lt;br /&gt;
*/&lt;br /&gt;
function Mousetracker() {&lt;br /&gt;
	/**&lt;br /&gt;
	   Interval to regularly run the hooks anyway, in milliseconds.&lt;br /&gt;
	   @type Integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.loopDelay=400;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	   Timer for the loop.&lt;br /&gt;
	   @type Timer&lt;br /&gt;
	*/&lt;br /&gt;
	this.timer=null;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	   Flag - are we switched on?&lt;br /&gt;
	   @type Boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.active=false;&lt;br /&gt;
	/**&lt;br /&gt;
	   Flag - are we probably inaccurate, i.e. not reflecting the actual mouse position?&lt;br /&gt;
	*/&lt;br /&gt;
	this.dirty=true;&lt;br /&gt;
	/**&lt;br /&gt;
	   Array of hook functions.&lt;br /&gt;
	   @private&lt;br /&gt;
	   @type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.hooks=[];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Adds a hook, to be called when we get events.&lt;br /&gt;
   @param {Function} f A function which is called as&lt;br /&gt;
   &amp;lt;code&amp;gt;f(x,y)&amp;lt;/code&amp;gt;. It should return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; when it&lt;br /&gt;
   wants to be removed, and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.addHook = function (f) {&lt;br /&gt;
	this.hooks.push(f);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Runs hooks, passing them the x&lt;br /&gt;
   and y coords of the mouse.  Hook functions that return true are&lt;br /&gt;
   passed to {@link Mousetracker#removeHooks} for removal.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.runHooks = function () {&lt;br /&gt;
	if (!this.hooks || !this.hooks.length) { return; }&lt;br /&gt;
	//log(&#039;Mousetracker.runHooks; we got some hooks to run&#039;);&lt;br /&gt;
	var remove=false;&lt;br /&gt;
	var removeObj={};&lt;br /&gt;
	// this method gets called a LOT -&lt;br /&gt;
	// pre-cache some variables&lt;br /&gt;
	var x=this.x, y=this.y, len = this.hooks.length;&lt;br /&gt;
&lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) {&lt;br /&gt;
		//~ run the hook function, and remove it if it returns true&lt;br /&gt;
		if (this.hooks[i](x, y)===true) {&lt;br /&gt;
			remove=true;&lt;br /&gt;
			removeObj[i]=true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (remove) { this.removeHooks(removeObj); }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Removes hooks.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Object} removeObj An object whose keys are the index&lt;br /&gt;
   numbers of functions for removal, with values that evaluate to true&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.removeHooks = function(removeObj) {&lt;br /&gt;
	var newHooks=[];&lt;br /&gt;
	var len = this.hooks.length;&lt;br /&gt;
	for (var i=0; i&amp;lt;len; ++i) {&lt;br /&gt;
		if (! removeObj[i]) { newHooks.push(this.hooks[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	this.hooks=newHooks;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Event handler for mouse wiggles.&lt;br /&gt;
   We simply grab the event, set x and y and run the hooks.&lt;br /&gt;
   This makes the cpu all hot and bothered :-(&lt;br /&gt;
   @private&lt;br /&gt;
   @param {Event} e Mousemove event&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.track=function (e) {&lt;br /&gt;
	//~ Apparently this is needed in IE.&lt;br /&gt;
	e = e || window.event;&lt;br /&gt;
	var x, y;&lt;br /&gt;
	if (e) {&lt;br /&gt;
		if (e.pageX) { x=e.pageX; y=e.pageY; }&lt;br /&gt;
		else if (typeof e.clientX!=&#039;undefined&#039;) {&lt;br /&gt;
			var left, top, docElt = window.document.documentElement;&lt;br /&gt;
&lt;br /&gt;
			if (docElt) { left=docElt.scrollLeft; }&lt;br /&gt;
			left = left || window.document.body.scrollLeft || window.document.scrollLeft || 0;&lt;br /&gt;
&lt;br /&gt;
			if (docElt) { top=docElt.scrollTop; }&lt;br /&gt;
			top = top || window.document.body.scrollTop || window.document.scrollTop || 0;&lt;br /&gt;
&lt;br /&gt;
			x=e.clientX + left;&lt;br /&gt;
			y=e.clientY + top;&lt;br /&gt;
		} else { return; }&lt;br /&gt;
		this.setPosition(x,y);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Sets the x and y coordinates stored and takes appropriate action,&lt;br /&gt;
   running hooks as appropriate.&lt;br /&gt;
   @param {Integer} x, y Screen coordinates to set&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Mousetracker.prototype.setPosition=function(x,y) {&lt;br /&gt;
	this.x = x;&lt;br /&gt;
	this.y = y;&lt;br /&gt;
	if (this.dirty || this.hooks.length === 0) { this.dirty=false; return; }&lt;br /&gt;
	if (typeof this.lastHook_x != &#039;number&#039;) { this.lastHook_x = -100; this.lastHook_y=-100; }&lt;br /&gt;
	var diff = (this.lastHook_x - x)*(this.lastHook_y - y);&lt;br /&gt;
	diff = (diff &amp;gt;= 0) ? diff : -diff;&lt;br /&gt;
	if ( diff &amp;gt; 1 ) {&lt;br /&gt;
		this.lastHook_x=x;&lt;br /&gt;
		this.lastHook_y=y;&lt;br /&gt;
		if (this.dirty) { this.dirty = false; }&lt;br /&gt;
		else { this.runHooks(); }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Sets things in motion, unless they are already that is, registering an event handler on &amp;lt;code&amp;gt;document.onmousemove&amp;lt;/code&amp;gt;.&lt;br /&gt;
   A half-hearted attempt is made to preserve the old event handler if there is one.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.enable = function () {&lt;br /&gt;
	if (this.active) { return; }&lt;br /&gt;
	this.active=true;&lt;br /&gt;
	//~ Save the current handler for mousemove events. This isn&#039;t too&lt;br /&gt;
	//~ robust, of course.&lt;br /&gt;
	this.savedHandler=document.onmousemove;&lt;br /&gt;
	//~ Gotta save @tt{this} again for the closure, and use apply for&lt;br /&gt;
	//~ the member function.&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	document.onmousemove=function (e) {savedThis.track.apply(savedThis, [e]);};&lt;br /&gt;
	if (this.loopDelay) { this.timer = setInterval(function() { //log(&#039;loop delay in mousetracker is working&#039;);&lt;br /&gt;
									savedThis.runHooks();}, this.loopDelay); }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Disables the tracker, removing the event handler.&lt;br /&gt;
*/&lt;br /&gt;
Mousetracker.prototype.disable = function () {&lt;br /&gt;
	if (!this.active) { return; }&lt;br /&gt;
	if (typeof this.savedHandler==&#039;function&#039;) {&lt;br /&gt;
		document.onmousemove=this.savedHandler;&lt;br /&gt;
	} else { delete document.onmousemove; }&lt;br /&gt;
	if (this.timer) { clearInterval(this.timer); }&lt;br /&gt;
	this.active=false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates a new Navpopup.&lt;br /&gt;
   Gets a UID for the popup and&lt;br /&gt;
   @param init Contructor object. If &amp;lt;code&amp;gt;init.draggable&amp;lt;/code&amp;gt; is true or absent, the popup becomes draggable.&lt;br /&gt;
   @constructor&lt;br /&gt;
   @class The Navpopup class. This generates popup hints, and does some management of them.&lt;br /&gt;
*/&lt;br /&gt;
function Navpopup(init) {&lt;br /&gt;
	//alert(&#039;new Navpopup(init)&#039;);&lt;br /&gt;
	/** UID for each Navpopup instance.&lt;br /&gt;
		Read-only.&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.uid=Navpopup.uid++;&lt;br /&gt;
	/**&lt;br /&gt;
	   Read-only flag for current visibility of the popup.&lt;br /&gt;
	   @type boolean&lt;br /&gt;
	   @private&lt;br /&gt;
	*/&lt;br /&gt;
	this.visible=false;&lt;br /&gt;
	/** Flag to be set when we want to cancel a previous request to&lt;br /&gt;
		show the popup in a little while.&lt;br /&gt;
		@private&lt;br /&gt;
		@type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	/** Categorised list of hooks.&lt;br /&gt;
		@see #runHooks&lt;br /&gt;
		@see #addHook&lt;br /&gt;
		@private&lt;br /&gt;
		@type Object&lt;br /&gt;
	*/&lt;br /&gt;
	this.hooks={&lt;br /&gt;
		&#039;create&#039;: [],&lt;br /&gt;
		&#039;unhide&#039;: [],&lt;br /&gt;
		&#039;hide&#039;: []&lt;br /&gt;
	};&lt;br /&gt;
	/** list of unique IDs of hook functions, to avoid duplicates&lt;br /&gt;
		@private&lt;br /&gt;
	*/&lt;br /&gt;
	this.hookIds={};&lt;br /&gt;
	/** List of downloads associated with the popup.&lt;br /&gt;
		@private&lt;br /&gt;
		@type Array&lt;br /&gt;
	*/&lt;br /&gt;
	this.downloads=[];&lt;br /&gt;
	/** Number of uncompleted downloads.&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.pending=null;&lt;br /&gt;
	/** Tolerance in pixels when detecting whether the mouse has left the popup.&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.fuzz=5;&lt;br /&gt;
	/** Flag to toggle running {@link #limitHorizontalPosition} to regulate the popup&#039;s position.&lt;br /&gt;
		@type boolean&lt;br /&gt;
	*/&lt;br /&gt;
	this.constrained=true;&lt;br /&gt;
	/** The popup width in pixels.&lt;br /&gt;
		@private&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.width=0;&lt;br /&gt;
	/** The popup width in pixels.&lt;br /&gt;
		@private&lt;br /&gt;
		@type integer&lt;br /&gt;
	*/&lt;br /&gt;
	this.height=0;&lt;br /&gt;
	/** The main content DIV element.&lt;br /&gt;
		@type HTMLDivElement&lt;br /&gt;
	*/&lt;br /&gt;
	this.mainDiv=null;&lt;br /&gt;
	this.createMainDiv();&lt;br /&gt;
&lt;br /&gt;
//	if (!init || typeof init.popups_draggable==&#039;undefined&#039; || init.popups_draggable) {&lt;br /&gt;
//		this.makeDraggable(true);&lt;br /&gt;
//	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   A UID for each Navpopup. This constructor property is just a counter.&lt;br /&gt;
   @type integer&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.uid=0;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Retrieves the {@link #visible} attribute, indicating whether the popup is currently visible.&lt;br /&gt;
   @type boolean&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.isVisible=function() {&lt;br /&gt;
	return this.visible;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Repositions popup using CSS style.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {integer} x x-coordinate (px)&lt;br /&gt;
   @param {integer} y y-coordinate (px)&lt;br /&gt;
   @param {boolean} noLimitHor Don&#039;t call {@link #limitHorizontalPosition}&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.reposition= function (x,y, noLimitHor) {&lt;br /&gt;
	log (&#039;reposition(&#039;+x+&#039;,&#039;+y+&#039;,&#039;+noLimitHor+&#039;)&#039;);&lt;br /&gt;
	if (typeof x != &#039;undefined&#039; &amp;amp;&amp;amp; x!==null) { this.left=x; }&lt;br /&gt;
	if (typeof y != &#039;undefined&#039; &amp;amp;&amp;amp; y!==null) { this.top=y; }&lt;br /&gt;
	if (typeof this.left != &#039;undefined&#039; &amp;amp;&amp;amp; typeof this.top != &#039;undefined&#039;) {&lt;br /&gt;
		this.mainDiv.style.left=this.left + &#039;px&#039;;&lt;br /&gt;
		this.mainDiv.style.top=this.top + &#039;px&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	if (!noLimitHor) { this.limitHorizontalPosition(); }&lt;br /&gt;
	//console.log(&#039;navpop&#039;+this.uid+&#039; - (left,top)=(&#039; + this.left + &#039;,&#039; + this.top + &#039;), css=(&#039;&lt;br /&gt;
	//+ this.mainDiv.style.left + &#039;,&#039; + this.mainDiv.style.top + &#039;)&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Prevents popups from being in silly locations. Hopefully.&lt;br /&gt;
   Should not be run if {@link #constrained} is true.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.limitHorizontalPosition=function() {&lt;br /&gt;
	if (!this.constrained || this.tooWide) { return; }&lt;br /&gt;
	this.updateDimensions();&lt;br /&gt;
	var x=this.left;&lt;br /&gt;
	var w=this.width;&lt;br /&gt;
	var cWidth=document.body.clientWidth;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//	log(&#039;limitHorizontalPosition: x=&#039;+x+&lt;br /&gt;
//			&#039;, this.left=&#039; + this.left +&lt;br /&gt;
//			&#039;, this.width=&#039; + this.width +&lt;br /&gt;
//			&#039;, cWidth=&#039; + cWidth);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if ( (x+w) &amp;gt;= cWidth ||&lt;br /&gt;
		 ( x &amp;gt; 0 &amp;amp;&amp;amp; this.maxWidth &amp;amp;&amp;amp; this.width &amp;lt; this.maxWidth &amp;amp;&amp;amp; this.height &amp;gt; this.width&lt;br /&gt;
		   &amp;amp;&amp;amp; x &amp;gt; cWidth - this.maxWidth ) ) {&lt;br /&gt;
		// This is a very nasty hack. There has to be a better way!&lt;br /&gt;
		// We find the &amp;quot;natural&amp;quot; width of the div by positioning it at the far left&lt;br /&gt;
		// then reset it so that it should be flush right (well, nearly)&lt;br /&gt;
		this.mainDiv.style.left=&#039;-10000px&#039;;&lt;br /&gt;
		this.mainDiv.style.width = this.maxWidth + &#039;px&#039;;&lt;br /&gt;
		var naturalWidth=parseInt(this.mainDiv.offsetWidth, 10);&lt;br /&gt;
		var newLeft=cWidth - naturalWidth - 1;&lt;br /&gt;
		if (newLeft &amp;lt; 0) { newLeft = 0; this.tooWide=true; } // still unstable for really wide popups?&lt;br /&gt;
		log (&#039;limitHorizontalPosition: moving to (&#039;+newLeft + &#039;,&#039;+ this.top+&#039;);&#039; + &#039; naturalWidth=&#039; + naturalWidth + &#039;, clientWidth=&#039; + cWidth);&lt;br /&gt;
		this.reposition(newLeft, null, true);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Counter indicating the z-order of the &amp;quot;highest&amp;quot; popup.&lt;br /&gt;
   We start the z-index at 1000 so that popups are above everything&lt;br /&gt;
   else on the screen.&lt;br /&gt;
   @private&lt;br /&gt;
   @type integer&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.highest=1000;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Brings popup to the top of the z-order.&lt;br /&gt;
   We increment the {@link #highest} property of the contructor here.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.raise = function () {&lt;br /&gt;
	this.mainDiv.style.zIndex=Navpopup.highest + 1;&lt;br /&gt;
	++Navpopup.highest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Shows the popup provided {@link #noshow} is not true.&lt;br /&gt;
   Updates the position, brings the popup to the top of the z-order and unhides it.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.show = function () {&lt;br /&gt;
	//document.title+=&#039;s&#039;;&lt;br /&gt;
	if (this.noshow) { return; }&lt;br /&gt;
	//document.title+=&#039;t&#039;;&lt;br /&gt;
	this.reposition();&lt;br /&gt;
	this.raise();&lt;br /&gt;
	this.unhide();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Runs the {@link #show} method in a little while, unless we&#039;re&lt;br /&gt;
   already visible.&lt;br /&gt;
   @param {integer} time Delay in milliseconds&lt;br /&gt;
   @see #showSoonIfStable&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.showSoon = function (time) {&lt;br /&gt;
	if (this.visible) { return; }&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	//~ We have to save the value of @tt{this} so that the closure below&lt;br /&gt;
	//~ works.&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	//this.start_x = Navpopup.tracker.x;&lt;br /&gt;
	//this.start_y = Navpopup.tracker.y;&lt;br /&gt;
	setTimeout(function () {&lt;br /&gt;
		if (Navpopup.tracker.active) {&lt;br /&gt;
			savedThis.reposition.apply(savedThis, [Navpopup.tracker.x + 2, Navpopup.tracker.y + 2]);&lt;br /&gt;
		}&lt;br /&gt;
		//~ Have to use apply to invoke his member function here&lt;br /&gt;
		savedThis.show.apply(savedThis, []);&lt;br /&gt;
	}, time);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Checks to see if the mouse pointer has&lt;br /&gt;
   stabilised (checking every &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;/2 milliseconds) and runs the&lt;br /&gt;
   {@link #show} method if it has. This method makes {@link #showSoon} redundant.&lt;br /&gt;
   @param {integer} time The minimum time (ms) before the popup may be shown.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.showSoonIfStable = function (time) {&lt;br /&gt;
	log (&#039;showSoonIfStable, time=&#039;+time);&lt;br /&gt;
	if (this.visible) { return; }&lt;br /&gt;
	this.noshow = false;&lt;br /&gt;
&lt;br /&gt;
	//~ initialize these variables so that we never run @tt{show} after&lt;br /&gt;
	//~ just half the time&lt;br /&gt;
	this.stable_x = -10000; this.stable_y = -10000;&lt;br /&gt;
&lt;br /&gt;
	var stableShow = function() {&lt;br /&gt;
		log(&#039;stableShow called&#039;);&lt;br /&gt;
		var new_x = Navpopup.tracker.x, new_y = Navpopup.tracker.y;&lt;br /&gt;
		var dx = savedThis.stable_x - new_x, dy = savedThis.stable_y - new_y;&lt;br /&gt;
		var fuzz2 = 0; // savedThis.fuzz * savedThis.fuzz;&lt;br /&gt;
		//document.title += &#039;[&#039; + [savedThis.stable_x,new_x, savedThis.stable_y,new_y, dx, dy, fuzz2].join(&#039;,&#039;) + &#039;] &#039;;&lt;br /&gt;
		if ( dx * dx &amp;lt;= fuzz2 &amp;amp;&amp;amp; dy * dy &amp;lt;= fuzz2 ) {&lt;br /&gt;
			log (&#039;mouse is stable&#039;);&lt;br /&gt;
			clearInterval(savedThis.showSoonStableTimer);&lt;br /&gt;
			savedThis.reposition.apply(savedThis, [new_x + 2, new_y + 2]);&lt;br /&gt;
			savedThis.show.apply(savedThis, []);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		savedThis.stable_x = new_x; savedThis.stable_y = new_y;&lt;br /&gt;
	};&lt;br /&gt;
	var savedThis = this;&lt;br /&gt;
	this.showSoonStableTimer = setInterval(stableShow, time/2);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Makes the popup unhidable until we call {@link #unstick}.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.stick=function() {&lt;br /&gt;
	this.noshow=false;&lt;br /&gt;
	this.sticky=true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Allows the popup to be hidden.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.unstick=function() {&lt;br /&gt;
	this.sticky=false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Sets the {@link #noshow} flag and hides the popup. This should be called&lt;br /&gt;
   when the mouse leaves the link before&lt;br /&gt;
   (or after) it&#039;s actually been displayed.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.banish = function () {&lt;br /&gt;
	log (&#039;banish called&#039;);&lt;br /&gt;
	// hide and prevent showing with showSoon in the future&lt;br /&gt;
	this.noshow=true;&lt;br /&gt;
	if (this.showSoonStableTimer) {&lt;br /&gt;
		log(&#039;clearing showSoonStableTimer&#039;);&lt;br /&gt;
		clearInterval(this.showSoonStableTimer);&lt;br /&gt;
	}&lt;br /&gt;
	this.hide();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Runs hooks added with {@link #addHook}.&lt;br /&gt;
   @private&lt;br /&gt;
   @param {String} key Key name of the {@link #hooks} array - one of &#039;create&#039;, &#039;unhide&#039;, &#039;hide&#039;&lt;br /&gt;
   @param {String} when Controls exactly when the hook is run: either &#039;before&#039; or &#039;after&#039;&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.runHooks = function (key, when) {&lt;br /&gt;
	if (!this.hooks[key]) { return; }&lt;br /&gt;
	var keyHooks=this.hooks[key];&lt;br /&gt;
	var len=keyHooks.length;&lt;br /&gt;
	for (var i=0; i&amp;lt; len; ++i) {&lt;br /&gt;
		if (keyHooks[i] &amp;amp;&amp;amp; keyHooks[i].when == when) {&lt;br /&gt;
			if (keyHooks[i].hook.apply(this, [])) {&lt;br /&gt;
				// remove the hook&lt;br /&gt;
				if (keyHooks[i].hookId) {&lt;br /&gt;
					delete this.hookIds[keyHooks[i].hookId];&lt;br /&gt;
				}&lt;br /&gt;
				keyHooks[i]=null;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Adds a hook to the popup. Hook functions are run with &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; set to refer to the Navpopup instance, and no arguments.&lt;br /&gt;
   @param {Function} hook The hook function. Functions that return true are deleted.&lt;br /&gt;
   @param {String} key Key name of the {@link #hooks} array - one of &#039;create&#039;, &#039;unhide&#039;, &#039;hide&#039;&lt;br /&gt;
   @param {String} when Controls exactly when the hook is run: either &#039;before&#039; or &#039;after&#039;&lt;br /&gt;
   @param {String} uid A truthy string identifying the hook function; if it matches another hook in this position, it won&#039;t be added again.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.addHook = function ( hook, key, when, uid ) {&lt;br /&gt;
	when = when || &#039;after&#039;;&lt;br /&gt;
	if (!this.hooks[key]) { return; }&lt;br /&gt;
	// if uid is specified, don&#039;t add duplicates&lt;br /&gt;
	var hookId=null;&lt;br /&gt;
	if (uid) {&lt;br /&gt;
		hookId=[key,when,uid].join(&#039;|&#039;);&lt;br /&gt;
		if (this.hookIds[hookId]) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		this.hookIds[hookId]=true;&lt;br /&gt;
	}&lt;br /&gt;
	this.hooks[key].push( {hook: hook, when: when, hookId: hookId} );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Creates the main DIV element, which contains all the actual popup content.&lt;br /&gt;
   Runs hooks with key &#039;create&#039;.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.createMainDiv = function () {&lt;br /&gt;
	if (this.mainDiv) { return; }&lt;br /&gt;
	this.runHooks(&#039;create&#039;, &#039;before&#039;);&lt;br /&gt;
	var mainDiv=document.createElement(&#039;div&#039;);&lt;br /&gt;
&lt;br /&gt;
	var savedThis=this;&lt;br /&gt;
	mainDiv.onclick=function(e) {savedThis.onclickHandler(e);};&lt;br /&gt;
	mainDiv.className=(this.className) ? this.className : &#039;navpopup_maindiv&#039;;&lt;br /&gt;
	mainDiv.id=mainDiv.className + this.uid;&lt;br /&gt;
&lt;br /&gt;
	mainDiv.style.position=&#039;absolute&#039;;&lt;br /&gt;
	mainDiv.style.display=&#039;none&#039;;&lt;br /&gt;
	mainDiv.className=&#039;navpopup&#039;;&lt;br /&gt;
&lt;br /&gt;
	// easy access to javascript object through DOM functions&lt;br /&gt;
	mainDiv.navpopup=this;&lt;br /&gt;
&lt;br /&gt;
	this.mainDiv=mainDiv;&lt;br /&gt;
	document.body.appendChild(mainDiv);&lt;br /&gt;
	this.runHooks(&#039;create&#039;, &#039;after&#039;);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Calls the {@link #raise} method.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.onclickHandler=function(e) {&lt;br /&gt;
	this.raise();&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Makes the popup draggable, using a {@link Drag} object.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.makeDraggable=function(handleName) {&lt;br /&gt;
	if (!this.mainDiv) { this.createMainDiv(); }&lt;br /&gt;
	var drag=new Drag();&lt;br /&gt;
	if (!handleName) {&lt;br /&gt;
		drag.startCondition=function(e) {&lt;br /&gt;
		try { if (!e.shiftKey) { return false; } } catch (err) { return false; }&lt;br /&gt;
		return true;&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
	var dragHandle;&lt;br /&gt;
	if (handleName) dragHandle = document.getElementById(handleName);&lt;br /&gt;
	if (!dragHandle) dragHandle = this.mainDiv;&lt;br /&gt;
	var np=this;&lt;br /&gt;
	drag.endHook=function(x,y) {&lt;br /&gt;
		Navpopup.tracker.dirty=true;&lt;br /&gt;
		np.reposition(x,y);&lt;br /&gt;
	};&lt;br /&gt;
	drag.init(dragHandle,this.mainDiv);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/** Hides the popup using CSS. Runs hooks with key &#039;hide&#039;.&lt;br /&gt;
	Sets {@link #visible} appropriately.	 {@link #banish} should be called externally instead of this method.&lt;br /&gt;
&lt;br /&gt;
	@private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.hide = function () {&lt;br /&gt;
	this.runHooks(&#039;hide&#039;, &#039;before&#039;);&lt;br /&gt;
	this.abortDownloads();&lt;br /&gt;
	if (this.sticky) { return; }&lt;br /&gt;
	if (typeof this.visible != &#039;undefined&#039; &amp;amp;&amp;amp; this.visible) {&lt;br /&gt;
		this.mainDiv.style.display=&#039;none&#039;;&lt;br /&gt;
		this.visible=false;&lt;br /&gt;
	}&lt;br /&gt;
	this.runHooks(&#039;hide&#039;, &#039;after&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/** Shows the popup using CSS. Runs hooks with key &#039;unhide&#039;.&lt;br /&gt;
	Sets {@link #visible} appropriately.   {@link #show} should be called externally instead of this method.&lt;br /&gt;
	@private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.unhide = function () {&lt;br /&gt;
	this.runHooks(&#039;unhide&#039;, &#039;before&#039;);&lt;br /&gt;
	if (typeof this.visible != &#039;undefined&#039; &amp;amp;&amp;amp; !this.visible) {&lt;br /&gt;
		this.mainDiv.style.display=&#039;inline&#039;;&lt;br /&gt;
		this.visible=true;&lt;br /&gt;
	}&lt;br /&gt;
	this.runHooks(&#039;unhide&#039;, &#039;after&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Sets the &amp;lt;code&amp;gt;innerHTML&amp;lt;/code&amp;gt; attribute of the main div containing the popup content.&lt;br /&gt;
   @param {String} html The HTML to set.&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.setInnerHTML = function (html) {&lt;br /&gt;
	this.mainDiv.innerHTML = html;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Updates the {@link #width} and {@link #height} attributes with the CSS properties.&lt;br /&gt;
   @private&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.updateDimensions = function () {&lt;br /&gt;
	this.width=parseInt(this.mainDiv.offsetWidth, 10);&lt;br /&gt;
	this.height=parseInt(this.mainDiv.offsetHeight, 10);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Checks if the point (x,y) is within {@link #fuzz} of the&lt;br /&gt;
   {@link #mainDiv}.&lt;br /&gt;
   @param {integer} x x-coordinate (px)&lt;br /&gt;
   @param {integer} y y-coordinate (px)&lt;br /&gt;
   @type boolean&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.isWithin = function(x,y) {&lt;br /&gt;
	//~ If we&#039;re not even visible, no point should be considered as&lt;br /&gt;
	//~ being within the popup.&lt;br /&gt;
	if (!this.visible) { return false; }&lt;br /&gt;
	this.updateDimensions();&lt;br /&gt;
	var fuzz=this.fuzz || 0;&lt;br /&gt;
	//~ Use a simple box metric here.&lt;br /&gt;
	return (x+fuzz &amp;gt;= this.left &amp;amp;&amp;amp; x-fuzz &amp;lt;= this.left + this.width &amp;amp;&amp;amp;&lt;br /&gt;
		y+fuzz &amp;gt;= this.top  &amp;amp;&amp;amp; y-fuzz &amp;lt;= this.top  + this.height);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   Adds a download to {@link #downloads}.&lt;br /&gt;
   @param {Downloader} download&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.addDownload=function(download) {&lt;br /&gt;
	if (!download) { return; }&lt;br /&gt;
	this.downloads.push(download);&lt;br /&gt;
};&lt;br /&gt;
/**&lt;br /&gt;
   Aborts the downloads listed in {@link #downloads}.&lt;br /&gt;
   @see Downloader#abort&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.prototype.abortDownloads=function() {&lt;br /&gt;
	for(var i=0; i&amp;lt;this.downloads.length; ++i) {&lt;br /&gt;
		var d=this.downloads[i];&lt;br /&gt;
		if (d &amp;amp;&amp;amp; d.abort) { d.abort(); }&lt;br /&gt;
	}&lt;br /&gt;
	this.downloads=[];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
   A {@link Mousetracker} instance which is a property of the constructor (pseudo-global).&lt;br /&gt;
*/&lt;br /&gt;
Navpopup.tracker=new Mousetracker();&lt;br /&gt;
// ENDFILE: navpopup.js&lt;br /&gt;
// STARTFILE: diff.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Javascript Diff Algorithm&lt;br /&gt;
 *  By John Resig (http://ejohn.org/) and [[:en:User:Lupin]]&lt;br /&gt;
 *&lt;br /&gt;
 * More Info:&lt;br /&gt;
 *  http://ejohn.org/projects/javascript-diff-algorithm/&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function delFmt(x) {&lt;br /&gt;
	if (!x.length) { return &#039;&#039;; }&lt;br /&gt;
	return &amp;quot;&amp;lt;del class=&#039;popupDiff&#039;&amp;gt;&amp;quot; + x.join(&#039;&#039;) +&amp;quot;&amp;lt;/del&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
function insFmt(x) {&lt;br /&gt;
	if (!x.length) { return &#039;&#039;; }&lt;br /&gt;
	return &amp;quot;&amp;lt;ins class=&#039;popupDiff&#039;&amp;gt;&amp;quot; + x.join(&#039;&#039;) +&amp;quot;&amp;lt;/ins&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function countCrossings(a, b, i, eject) {&lt;br /&gt;
	// count the crossings on the edge starting at b[i]&lt;br /&gt;
	if (!b[i].row &amp;amp;&amp;amp; b[i].row !== 0) { return -1; }&lt;br /&gt;
	var count=0;&lt;br /&gt;
	for (var j=0; j&amp;lt;a.length; ++j) {&lt;br /&gt;
		if (!a[j].row &amp;amp;&amp;amp; a[j].row !== 0) { continue; }&lt;br /&gt;
		if ( (j-b[i].row)*(i-a[j].row) &amp;gt; 0) {&lt;br /&gt;
			if(eject) { return true; }&lt;br /&gt;
			count++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function shortenDiffString(str, context) {&lt;br /&gt;
	var re=RegExp(&#039;(&amp;lt;del[\\s\\S]*?&amp;lt;/del&amp;gt;|&amp;lt;ins[\\s\\S]*?&amp;lt;/ins&amp;gt;)&#039;);&lt;br /&gt;
	var splitted=str.parenSplit(re);&lt;br /&gt;
	var ret=[&#039;&#039;];&lt;br /&gt;
	for (var i=0; i&amp;lt;splitted.length; i+=2) {&lt;br /&gt;
		if (splitted[i].length &amp;lt; 2*context) {&lt;br /&gt;
			ret[ret.length-1] += splitted[i];&lt;br /&gt;
			if (i+1&amp;lt;splitted.length) { ret[ret.length-1] += splitted[i+1]; }&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			if (i &amp;gt; 0) { ret[ret.length-1] += splitted[i].substring(0,context); }&lt;br /&gt;
			if (i+1 &amp;lt; splitted.length) {&lt;br /&gt;
				ret.push(splitted[i].substring(splitted[i].length-context) +&lt;br /&gt;
					 splitted[i+1]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	while (ret.length &amp;gt; 0 &amp;amp;&amp;amp; !ret[0]) { ret = ret.slice(1); }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function diffString( o, n, simpleSplit ) {&lt;br /&gt;
	var splitRe=RegExp(&#039;([[]{2}|[\\]]{2}|[{]{2,3}|[}]{2,3}|[|]|=|&amp;lt;|&amp;gt;|[*:]+|\\s|\\b)&#039;);&lt;br /&gt;
&lt;br /&gt;
	//  We need to split the strings o and n first, and entify() the parts&lt;br /&gt;
	//  individually, so that the HTML entities are never cut apart. (AxelBoldt)&lt;br /&gt;
	var out, i, oSplitted, nSplitted;&lt;br /&gt;
	if (simpleSplit) { &lt;br /&gt;
		oSplitted=o.split(/\b/); &lt;br /&gt;
		nSplitted=n.split(/\b/); &lt;br /&gt;
	} else { &lt;br /&gt;
		oSplitted=o.parenSplit(splitRe); &lt;br /&gt;
		nSplitted=n.parenSplit(splitRe); &lt;br /&gt;
	}&lt;br /&gt;
	for (i=0; i&amp;lt;oSplitted.length; ++i) {oSplitted[i]=oSplitted[i].entify();}&lt;br /&gt;
	for (i=0; i&amp;lt;nSplitted.length; ++i) {nSplitted[i]=nSplitted[i].entify();}&lt;br /&gt;
		&lt;br /&gt;
	out = diff (oSplitted, nSplitted);&lt;br /&gt;
	var str = &amp;quot;&amp;quot;;&lt;br /&gt;
	var acc=[]; // accumulator for prettier output&lt;br /&gt;
&lt;br /&gt;
	// crossing pairings -- eg &#039;A B&#039; vs &#039;B A&#039; -- cause problems, so let&#039;s iron them out&lt;br /&gt;
	// this doesn&#039;t always do things optimally but it should be fast enough&lt;br /&gt;
	var maxOutputPair=0;&lt;br /&gt;
	for (i=0; i&amp;lt;out.n.length; ++i) {&lt;br /&gt;
		if ( out.n[i].paired ) {&lt;br /&gt;
		if( maxOutputPair &amp;gt; out.n[i].row ) {&lt;br /&gt;
			// tangle - delete pairing&lt;br /&gt;
			out.o[ out.n[i].row ]=out.o[ out.n[i].row ].text;&lt;br /&gt;
			out.n[i]=out.n[i].text;&lt;br /&gt;
		}&lt;br /&gt;
		if (maxOutputPair &amp;lt; out.n[i].row) { maxOutputPair = out.n[i].row; }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// output the stuff preceding the first paired old line&lt;br /&gt;
	for (i=0; i&amp;lt;out.o.length &amp;amp;&amp;amp; !out.o[i].paired; ++i) { acc.push( out.o[i] ); }&lt;br /&gt;
	str += delFmt(acc); acc=[];&lt;br /&gt;
&lt;br /&gt;
	// main loop&lt;br /&gt;
	for ( i = 0; i &amp;lt; out.n.length; ++i ) {&lt;br /&gt;
		// output unpaired new &amp;quot;lines&amp;quot;&lt;br /&gt;
		while ( i &amp;lt; out.n.length &amp;amp;&amp;amp; !out.n[i].paired ) { acc.push( out.n[i++] ); }&lt;br /&gt;
		str += insFmt(acc); acc=[];&lt;br /&gt;
		if ( i &amp;lt; out.n.length ) { // this new &amp;quot;line&amp;quot; is paired with the (out.n[i].row)th old &amp;quot;line&amp;quot;&lt;br /&gt;
			str += out.n[i].text;&lt;br /&gt;
			// output unpaired old rows starting after this new line&#039;s partner&lt;br /&gt;
			var m = out.n[i].row + 1;&lt;br /&gt;
			while ( m &amp;lt; out.o.length &amp;amp;&amp;amp; !out.o[m].paired ) { acc.push ( out.o[m++] ); }&lt;br /&gt;
			str += delFmt(acc); acc=[];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// see http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object&lt;br /&gt;
// FIXME: use obj.hasOwnProperty instead of this kludge!&lt;br /&gt;
window.jsReservedProperties=RegExp(&#039;^(constructor|prototype|__((define|lookup)[GS]etter)__&#039; +&lt;br /&gt;
				   &#039;|eval|hasOwnProperty|propertyIsEnumerable&#039; +&lt;br /&gt;
				   &#039;|to(Source|String|LocaleString)|(un)?watch|valueOf)$&#039;);&lt;br /&gt;
function diffBugAlert(word) {&lt;br /&gt;
	if (!diffBugAlert.list[word]) {&lt;br /&gt;
		diffBugAlert.list[word]=1;&lt;br /&gt;
		alert(&#039;Bad word: &#039;+word+&#039;\n\nPlease report this bug.&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
diffBugAlert.list={};&lt;br /&gt;
&lt;br /&gt;
function makeDiffHashtable(src) {&lt;br /&gt;
	var ret={};&lt;br /&gt;
	for ( var i = 0; i &amp;lt; src.length; i++ ) {&lt;br /&gt;
		if ( jsReservedProperties.test(src[i]) ) { src[i] += &#039;&amp;lt;!-- --&amp;gt;&#039;; }&lt;br /&gt;
		if ( !ret[ src[i] ] ) { ret[ src[i] ] = []; }&lt;br /&gt;
		try { ret[ src[i] ].push( i ); } catch (err) { diffBugAlert(src[i]); }&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function diff( o, n ) {&lt;br /&gt;
&lt;br /&gt;
	// pass 1: make hashtable ns with new rows as keys&lt;br /&gt;
	var ns = makeDiffHashtable(n);&lt;br /&gt;
&lt;br /&gt;
	// pass 2: make hashtable os with old rows as keys&lt;br /&gt;
	var os = makeDiffHashtable(o);&lt;br /&gt;
&lt;br /&gt;
	// pass 3: pair unique new rows and matching unique old rows&lt;br /&gt;
	var i;&lt;br /&gt;
	for ( i in ns ) {&lt;br /&gt;
		if ( ns[i].length == 1 &amp;amp;&amp;amp; os[i] &amp;amp;&amp;amp; os[i].length == 1 ) {&lt;br /&gt;
			n[ ns[i][0] ] = { text: n[ ns[i][0] ], row: os[i][0], paired: true };&lt;br /&gt;
			o[ os[i][0] ] = { text: o[ os[i][0] ], row: ns[i][0], paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// pass 4: pair matching rows immediately following paired rows (not necessarily unique)&lt;br /&gt;
	for ( i = 0; i &amp;lt; n.length - 1; i++ ) {&lt;br /&gt;
		if ( n[i].paired &amp;amp;&amp;amp; ! n[i+1].paired &amp;amp;&amp;amp; n[i].row + 1 &amp;lt; o.length &amp;amp;&amp;amp; ! o[ n[i].row + 1 ].paired &amp;amp;&amp;amp;&lt;br /&gt;
			 n[i+1] == o[ n[i].row + 1 ] ) {&lt;br /&gt;
			n[i+1] = { text: n[i+1], row: n[i].row + 1, paired: true };&lt;br /&gt;
			o[n[i].row+1] = { text: o[n[i].row+1], row: i + 1, paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// pass 5: pair matching rows immediately preceding paired rows (not necessarily unique)&lt;br /&gt;
	for ( i = n.length - 1; i &amp;gt; 0; i-- ) {&lt;br /&gt;
		if ( n[i].paired &amp;amp;&amp;amp; ! n[i-1].paired &amp;amp;&amp;amp; n[i].row &amp;gt; 0 &amp;amp;&amp;amp; ! o[ n[i].row - 1 ].paired &amp;amp;&amp;amp;&lt;br /&gt;
			 n[i-1] == o[ n[i].row - 1 ] ) {&lt;br /&gt;
			n[i-1] = { text: n[i-1], row: n[i].row - 1, paired: true };&lt;br /&gt;
			o[n[i].row-1] = { text: o[n[i].row-1], row: i - 1, paired: true };&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return { o: o, n: n };&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: diff.js&lt;br /&gt;
// STARTFILE: init.js&lt;br /&gt;
function setSiteInfo() {&lt;br /&gt;
	if (window.popupLocalDebug) {&lt;br /&gt;
		pg.wiki.hostname = &#039;en.wikipedia.org&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		pg.wiki.hostname = location.hostname; // use in preference to location.hostname for flexibility (?)&lt;br /&gt;
	}&lt;br /&gt;
	pg.wiki.wikimedia=RegExp(&#039;(wiki([pm]edia|source|books|news|quote|versity)|wiktionary|mediawiki)[.]org&#039;).test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.wikia=RegExp(&#039;[.]wikia[.]com$&#039;, &#039;i&#039;).test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.isLocal=RegExp(&#039;^localhost&#039;).test(pg.wiki.hostname);&lt;br /&gt;
	pg.wiki.commons=( pg.wiki.wikimedia &amp;amp;&amp;amp; pg.wiki.hostname != &#039;commons.wikimedia.org&#039;) ? &#039;commons.wikimedia.org&#039; : null;&lt;br /&gt;
	pg.wiki.lang = wgContentLanguage;&lt;br /&gt;
	var port = location.port ? &#039;:&#039; + location.port : &#039;&#039;;&lt;br /&gt;
	pg.wiki.sitebase = pg.wiki.hostname + port;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setTitleBase() {&lt;br /&gt;
	var protocol = ( window.popupLocalDebug ? &#039;http:&#039; : location.protocol );&lt;br /&gt;
	pg.wiki.articlePath = wgArticlePath.replace(/\/\$1/, &amp;quot;&amp;quot;);   // as in http://some.thing.com/wiki/Article&lt;br /&gt;
	pg.wiki.botInterfacePath = wgScript;&lt;br /&gt;
	pg.wiki.APIPath = wgScriptPath +&amp;quot;/api.php&amp;quot;;&lt;br /&gt;
	// default mediawiki setting is paths like http://some.thing.com/articlePath/index.php?title=foo&lt;br /&gt;
&lt;br /&gt;
	var titletail = pg.wiki.botInterfacePath + &#039;?title=&#039;;&lt;br /&gt;
	//var titletail2 = joinPath([pg.wiki.botInterfacePath, &#039;wiki.phtml?title=&#039;]);&lt;br /&gt;
&lt;br /&gt;
	// other sites may need to add code here to set titletail depending on how their urls work&lt;br /&gt;
&lt;br /&gt;
	pg.wiki.titlebase   = protocol + &#039;//&#039; + pg.wiki.sitebase + titletail;&lt;br /&gt;
	//pg.wiki.titlebase2  = protocol + &#039;//&#039; + joinPath([pg.wiki.sitebase, titletail2]);&lt;br /&gt;
	pg.wiki.wikibase	= protocol + &#039;//&#039; + pg.wiki.sitebase + pg.wiki.botInterfacePath;&lt;br /&gt;
	pg.wiki.apiwikibase = protocol + &#039;//&#039; + pg.wiki.sitebase + pg.wiki.APIPath;&lt;br /&gt;
	pg.wiki.articlebase = protocol + &#039;//&#039; + pg.wiki.sitebase + pg.wiki.articlePath;&lt;br /&gt;
	pg.wiki.commonsbase = protocol + &#039;//&#039; + pg.wiki.commons  + pg.wiki.botInterfacePath;&lt;br /&gt;
	pg.wiki.apicommonsbase = protocol + &#039;//&#039; + pg.wiki.commons  + pg.wiki.APIPath;&lt;br /&gt;
	pg.re.basenames = RegExp( &#039;^(&#039; +&lt;br /&gt;
				  map( literalizeRegex, [ pg.wiki.titlebase, //pg.wiki.titlebase2,&lt;br /&gt;
							  pg.wiki.articlebase ]).join(&#039;|&#039;) + &#039;)&#039; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Global regexps&lt;br /&gt;
&lt;br /&gt;
function setMainRegex() {&lt;br /&gt;
	var reStart=&#039;[^:]*://&#039;;&lt;br /&gt;
	var preTitles = literalizeRegex(wgScriptPath) + &#039;/(?:index[.]php|wiki[.]phtml)[?]title=&#039;;&lt;br /&gt;
	preTitles += &#039;|&#039; + literalizeRegex( pg.wiki.articlePath + &#039;/&#039; );&lt;br /&gt;
&lt;br /&gt;
	var reEnd=&#039;(&#039; + preTitles + &#039;)([^&amp;amp;?#]*)[^#]*(?:#(.+))?&#039;;&lt;br /&gt;
	pg.re.main = RegExp(reStart + literalizeRegex(pg.wiki.sitebase) + reEnd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setRegexps() {&lt;br /&gt;
	setMainRegex();&lt;br /&gt;
	var sp=nsRe(pg.nsSpecialId);&lt;br /&gt;
	pg.re.urlNoPopup=RegExp(&#039;((title=|/)&#039; + sp + &#039;(?:%3A|:)|section=[0-9]|^#$)&#039;) ;&lt;br /&gt;
	pg.re.contribs  =RegExp(&#039;(title=|/)&#039;  + sp + &#039;(?:%3A|:)Contributions&#039; + &#039;(&amp;amp;target=|/|/&#039; + mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId]+&#039;:)(.*)&#039;) ;&lt;br /&gt;
	pg.re.email	 =RegExp(&#039;(title=|/)&#039;  + sp + &#039;(?:%3A|:)EmailUser&#039;	 + &#039;(&amp;amp;target=|/|/(?:&#039; + mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsUserId]+&#039;:)?)(.*)&#039;) ;&lt;br /&gt;
	pg.re.backlinks =RegExp(&#039;(title=|/)&#039;  + sp + &#039;(?:%3A|:)WhatLinksHere&#039; + &#039;(&amp;amp;target=|/)([^&amp;amp;]*)&#039;);&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	var im=nsReImage();&lt;br /&gt;
	// note: tries to get images in infobox templates too, e.g. movie pages, album pages etc&lt;br /&gt;
	//					  (^|\[\[)image: *([^|\]]*[^|\] ]) *&lt;br /&gt;
	//					  (^|\[\[)image: *([^|\]]*[^|\] ])([^0-9\]]*([0-9]+) *px)?&lt;br /&gt;
	//														$4 = 120 as in 120px&lt;br /&gt;
	pg.re.image = RegExp(&#039;(^|\\[\\[)&#039; + im + &#039;: *([^|\\]]*[^|\\] ])&#039; +&lt;br /&gt;
				 &#039;([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *&#039; +&lt;br /&gt;
				 &#039;(&#039; + getValueOf(&#039;popupImageVarsRegexp&#039;) + &#039;)&#039; +&lt;br /&gt;
				 &#039; *= *(?:\\[\\[ *)?(?:&#039; + im + &#039;:)?&#039; +&lt;br /&gt;
				 &#039;([^|]*?)(?:\\]\\])? *[|]? *\\n&#039;, &#039;img&#039;) ;&lt;br /&gt;
	pg.re.imageBracketCount = 6;&lt;br /&gt;
&lt;br /&gt;
	pg.re.category = RegExp(&#039;\\[\\[&#039; +nsRe(pg.nsCategoryId) +&lt;br /&gt;
				&#039;: *([^|\\]]*[^|\\] ]) *&#039;, &#039;i&#039;);&lt;br /&gt;
	pg.re.categoryBracketCount = 1;&lt;br /&gt;
&lt;br /&gt;
	pg.re.ipUser=RegExp(&#039;^&#039; +&lt;br /&gt;
				// IPv6&lt;br /&gt;
				&#039;(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})&#039; +&lt;br /&gt;
				// IPv4&lt;br /&gt;
				&#039;|(((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}&#039; +&lt;br /&gt;
				&#039;(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]))$&#039;);&lt;br /&gt;
&lt;br /&gt;
	pg.re.stub= RegExp(getValueOf(&#039;popupStubRegexp&#039;), &#039;im&#039;);&lt;br /&gt;
	pg.re.disambig=RegExp(getValueOf(&#039;popupDabRegexp&#039;), &#039;im&#039;);&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	// FIXME replace with general parameter parsing function, this is daft&lt;br /&gt;
	pg.re.oldid=RegExp(&#039;[?&amp;amp;]oldid=([^&amp;amp;]*)&#039;);&lt;br /&gt;
	pg.re.diff=RegExp(&#039;[?&amp;amp;]diff=([^&amp;amp;]*)&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// miscellany&lt;br /&gt;
&lt;br /&gt;
function setupCache() {&lt;br /&gt;
	// page caching&lt;br /&gt;
	pg.cache.pages = [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setMisc() {&lt;br /&gt;
	pg.current.link=null;&lt;br /&gt;
	pg.current.links=[];&lt;br /&gt;
	pg.current.linksHash={};&lt;br /&gt;
&lt;br /&gt;
	setupCache();&lt;br /&gt;
&lt;br /&gt;
	pg.timer.checkPopupPosition=null;&lt;br /&gt;
	pg.counter.loop=0;&lt;br /&gt;
&lt;br /&gt;
	// ids change with each popup: popupImage0, popupImage1 etc&lt;br /&gt;
	pg.idNumber=0;&lt;br /&gt;
&lt;br /&gt;
	// for myDecodeURI&lt;br /&gt;
	pg.misc.decodeExtras = [&lt;br /&gt;
		{from: &#039;%2C&#039;, to: &#039;,&#039; },&lt;br /&gt;
		{from: &#039;_&#039;,   to: &#039; &#039; },&lt;br /&gt;
		{from: &#039;%24&#039;, to: &#039;$&#039;},&lt;br /&gt;
		{from: &#039;%26&#039;,   to: &#039;&amp;amp;&#039; } // no ,&lt;br /&gt;
		];&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function leadingInteger(s){&lt;br /&gt;
	var n=s.match(/^(\d*)/)[1];&lt;br /&gt;
	if (n) { return +n; }&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setBrowserHacks() {&lt;br /&gt;
	var useOriginal=false;&lt;br /&gt;
	// browser-specific hacks&lt;br /&gt;
	if (typeof window.opera != &#039;undefined&#039;) {&lt;br /&gt;
		//if (leadingInteger(opera.version()) &amp;lt; 9)&lt;br /&gt;
		{ useOriginal=true; } // v9 beta still seems to have buggy css&lt;br /&gt;
		setDefault(&#039;popupNavLinkSeparator&#039;, &#039; &amp;amp;#183; &#039;);&lt;br /&gt;
	} else if (navigator.appName==&#039;Konqueror&#039;) {&lt;br /&gt;
		setDefault(&#039;popupNavLinkSeparator&#039;, &#039; &amp;amp;bull; &#039;);&lt;br /&gt;
		pg.flag.isKonq=true;&lt;br /&gt;
	} else if ( navigator.vendor &amp;amp;&amp;amp; navigator.vendor.toLowerCase().indexOf(&#039;apple computer&#039;)===0) {&lt;br /&gt;
		pg.flag.isSafari=true;&lt;br /&gt;
		var webkit=+navigator.userAgent.replace(RegExp(&#039;^.*AppleWebKit[/](\\d+).*&#039;, &#039;i&#039;), &#039;$1&#039;);&lt;br /&gt;
		if (webkit &amp;lt; 420) { useOriginal=true; }&lt;br /&gt;
	} else if (navigator.appName.indexOf(&amp;quot;Microsoft&amp;quot;)!=-1) {&lt;br /&gt;
		setDefault(&#039;popupNavLinkSeparator&#039;, &#039; &amp;amp;#183; &#039;);&lt;br /&gt;
		var ver=+navigator.userAgent.replace(RegExp(&#039;^.*MSIE (\\d+).*&#039;), &#039;$1&#039;);&lt;br /&gt;
		pg.flag.isIE=true;&lt;br /&gt;
		pg.flag.IEVersion=ver;&lt;br /&gt;
	}&lt;br /&gt;
	if (pg.flag.isIE &amp;amp;&amp;amp; pg.flag.IEVersion &amp;lt; 8) {&lt;br /&gt;
		useOriginal=true;&lt;br /&gt;
	}&lt;br /&gt;
	if ((pg.flag.isIE &amp;amp;&amp;amp; pg.flag.IEVersion &amp;lt; 7) || pg.flag.isKonq || (pg.flag.isSafari &amp;amp;&amp;amp; webkit &amp;lt; 420)) {&lt;br /&gt;
		pg.flag.linksLikeIE6=true;&lt;br /&gt;
	}&lt;br /&gt;
	if (useOriginal &amp;amp;&amp;amp; pg.structures.original) {&lt;br /&gt;
		setDefault(&#039;popupStructure&#039;,&#039;original&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// We need a callback since this might end up asynchronous because of&lt;br /&gt;
// the mw.loader.using() call.&lt;br /&gt;
function setupPopups( callback ) {&lt;br /&gt;
	mw.loader.using( &#039;mediawiki.user&#039;, function() {&lt;br /&gt;
		// NB translatable strings should be set up first (strings.js)&lt;br /&gt;
		// basics&lt;br /&gt;
		setupDebugging();&lt;br /&gt;
		setSiteInfo();&lt;br /&gt;
		setTitleBase();&lt;br /&gt;
		setOptions(); // see options.js&lt;br /&gt;
&lt;br /&gt;
		// namespaces etc&lt;br /&gt;
		setNamespaces();&lt;br /&gt;
		setInterwiki();&lt;br /&gt;
&lt;br /&gt;
		// regexps&lt;br /&gt;
		setRegexps();&lt;br /&gt;
		setRedirs();&lt;br /&gt;
&lt;br /&gt;
		// other stuff&lt;br /&gt;
		setBrowserHacks();&lt;br /&gt;
		setMisc();&lt;br /&gt;
		setupLivePreview();&lt;br /&gt;
&lt;br /&gt;
		// main deal here&lt;br /&gt;
		setupTooltips();&lt;br /&gt;
		Navpopup.tracker.enable();&lt;br /&gt;
&lt;br /&gt;
		setupPopups.completed = true;&lt;br /&gt;
		if ( $.isFunction( callback ) ) {&lt;br /&gt;
			callback();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: init.js&lt;br /&gt;
// STARTFILE: navlinks.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// navlinks... let the fun begin&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
function defaultNavlinkSpec() {&lt;br /&gt;
	var str=&#039;&#039;;&lt;br /&gt;
	str += &#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;mainlink|shortcut= &amp;gt;&amp;gt;&amp;lt;/b&amp;gt;&#039;;&lt;br /&gt;
	if (getValueOf(&#039;popupLastEditLink&#039;)) {&lt;br /&gt;
		str += &#039;*&amp;lt;&amp;lt;lastEdit|shortcut=/&amp;gt;&amp;gt;|&amp;lt;&amp;lt;lastContrib&amp;gt;&amp;gt;|&amp;lt;&amp;lt;sinceMe&amp;gt;&amp;gt;if(oldid){|&amp;lt;&amp;lt;oldEdit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;diffCur&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// user links&lt;br /&gt;
	// contribs - log - count - email - block&lt;br /&gt;
	// count only if applicable; block only if popupAdminLinks&lt;br /&gt;
	str += &#039;if(user){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;contribs|shortcut=c&amp;gt;&amp;gt;*&amp;lt;&amp;lt;userlog|shortcut=L|log&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	str+=&#039;if(ipuser){*&amp;lt;&amp;lt;arin&amp;gt;&amp;gt;}if(wikimedia){*&amp;lt;&amp;lt;count|shortcut=#&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	str+=&#039;if(ipuser){}else{*&amp;lt;&amp;lt;email|shortcut=E&amp;gt;&amp;gt;}if(admin){*&amp;lt;&amp;lt;block|shortcut=b&amp;gt;&amp;gt;|&amp;lt;&amp;lt;blocklog|log&amp;gt;&amp;gt;}}&#039;;&lt;br /&gt;
&lt;br /&gt;
	// editing links&lt;br /&gt;
	// talkpage   -&amp;gt; edit|new - history - un|watch - article|edit&lt;br /&gt;
	// other page -&amp;gt; edit - history - un|watch - talk|edit|new&lt;br /&gt;
	var editstr=&#039;&amp;lt;&amp;lt;edit|shortcut=e&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
	var editOldidStr=&#039;if(oldid){&amp;lt;&amp;lt;editOld|shortcut=e&amp;gt;&amp;gt;|&amp;lt;&amp;lt;revert|shortcut=v|rv&amp;gt;&amp;gt;|&amp;lt;&amp;lt;edit|cur&amp;gt;&amp;gt;}else{&#039; + editstr + &#039;}&#039;&lt;br /&gt;
		var historystr=&#039;&amp;lt;&amp;lt;history|shortcut=h&amp;gt;&amp;gt;if(mainspace_en){|&amp;lt;&amp;lt;editors|shortcut=E|&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	var watchstr=&#039;&amp;lt;&amp;lt;unwatch|unwatchShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;watch|shortcut=w|watchThingy&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	str+=&#039;&amp;lt;br&amp;gt;if(talk){&#039; +&lt;br /&gt;
		editOldidStr+&#039;|&amp;lt;&amp;lt;new|shortcut=+&amp;gt;&amp;gt;&#039; + &#039;*&#039; + historystr+&#039;*&#039;+watchstr + &#039;*&#039; +&lt;br /&gt;
		&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;article|shortcut=a&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editArticle|edit&amp;gt;&amp;gt;&#039; +&lt;br /&gt;
		&#039;}else{&#039; + // not a talk page&lt;br /&gt;
		editOldidStr + &#039;*&#039; + historystr + &#039;*&#039; + watchstr + &#039;*&#039; +&lt;br /&gt;
		&#039;&amp;lt;b&amp;gt;&amp;lt;&amp;lt;talk|shortcut=t&amp;gt;&amp;gt;&amp;lt;/b&amp;gt;|&amp;lt;&amp;lt;editTalk|edit&amp;gt;&amp;gt;|&amp;lt;&amp;lt;newTalk|shortcut=+|new&amp;gt;&amp;gt;&#039;&lt;br /&gt;
		+ &#039;}&#039;;&lt;br /&gt;
&lt;br /&gt;
	// misc links&lt;br /&gt;
	str += &#039;&amp;lt;br&amp;gt;&amp;lt;&amp;lt;whatLinksHere|shortcut=l&amp;gt;&amp;gt;*&amp;lt;&amp;lt;relatedChanges|shortcut=r&amp;gt;&amp;gt;*&amp;lt;&amp;lt;move|shortcut=m&amp;gt;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	// admin links&lt;br /&gt;
	str += &#039;if(admin){&amp;lt;br&amp;gt;&amp;lt;&amp;lt;unprotect|unprotectShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protect|shortcut=p&amp;gt;&amp;gt;|&amp;lt;&amp;lt;protectlog|log&amp;gt;&amp;gt;*&#039; +&lt;br /&gt;
		&#039;&amp;lt;&amp;lt;undelete|undeleteShort&amp;gt;&amp;gt;|&amp;lt;&amp;lt;delete|shortcut=d&amp;gt;&amp;gt;|&amp;lt;&amp;lt;deletelog|log&amp;gt;&amp;gt;}&#039;;&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function navLinksHTML (article, hint, params) { //oldid, rcid) {&lt;br /&gt;
	var str = &#039;&amp;lt;span class=&amp;quot;popupNavLinks&amp;quot;&amp;gt;&#039; + defaultNavlinkSpec() + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	// BAM&lt;br /&gt;
	return navlinkStringToHTML(str, article, params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function expandConditionalNavlinkString(s,article,z,recursionCount) {&lt;br /&gt;
	var oldid=z.oldid, rcid=z.rcid, diff=z.diff;&lt;br /&gt;
	// nested conditionals (up to 10 deep) are ok, hopefully! (work from the inside out)&lt;br /&gt;
	if (typeof recursionCount!=typeof 0) { recursionCount=0; }&lt;br /&gt;
	var conditionalSplitRegex=RegExp(&lt;br /&gt;
		//(1	 if	\\(	(2	2)	\\)	  {(3	3)}  (4   else	  {(5	 5)}  4)1)&lt;br /&gt;
		&#039;(;?\\s*if\\s*\\(\\s*([\\w]*)\\s*\\)\\s*\\{([^{}]*)\\}(\\s*else\\s*\\{([^{}]*?)\\}|))&#039;, &#039;i&#039;);&lt;br /&gt;
	var splitted=s.parenSplit(conditionalSplitRegex);&lt;br /&gt;
	// $1: whole conditional&lt;br /&gt;
	// $2: test condition&lt;br /&gt;
	// $3: true expansion&lt;br /&gt;
	// $4: else clause (possibly empty)&lt;br /&gt;
	// $5: false expansion (possibly null)&lt;br /&gt;
	var numParens=5;&lt;br /&gt;
	var ret = splitted[0];&lt;br /&gt;
	for (var i=1; i&amp;lt;splitted.length; i=i+numParens+1) {&lt;br /&gt;
&lt;br /&gt;
		var testString=splitted[i+2-1];&lt;br /&gt;
		var trueString=splitted[i+3-1];&lt;br /&gt;
		var falseString=splitted[i+5-1];&lt;br /&gt;
		if (typeof falseString==&#039;undefined&#039; || !falseString) { falseString=&#039;&#039;; }&lt;br /&gt;
		var testResult=null;&lt;br /&gt;
&lt;br /&gt;
		switch (testString) {&lt;br /&gt;
		case &#039;user&#039;:&lt;br /&gt;
			testResult=(article.userName())?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;talk&#039;:&lt;br /&gt;
			testResult=(article.talkPage())?false:true; // talkPage converts _articles_ to talkPages&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;admin&#039;:&lt;br /&gt;
			testResult=getValueOf(&#039;popupAdminLinks&#039;)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;oldid&#039;:&lt;br /&gt;
			testResult=(typeof oldid != &#039;undefined&#039; &amp;amp;&amp;amp; oldid)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;rcid&#039;:&lt;br /&gt;
			testResult=(typeof rcid != &#039;undefined&#039; &amp;amp;&amp;amp; rcid)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;ipuser&#039;:&lt;br /&gt;
			testResult=(article.isIpUser())?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;mainspace_en&#039;:&lt;br /&gt;
			testResult=isInMainNamespace(article) &amp;amp;&amp;amp;&lt;br /&gt;
				pg.wiki.hostname==&#039;en.wikipedia.org&#039;;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;wikimedia&#039;:&lt;br /&gt;
			testResult=(pg.wiki.wikimedia) ? true : false;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;diff&#039;:&lt;br /&gt;
			testResult=(typeof diff != &#039;undefined&#039; &amp;amp;&amp;amp; diff)?true:false;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		switch(testResult) {&lt;br /&gt;
		case null: ret+=splitted[i];  break;&lt;br /&gt;
		case true: ret+=trueString;   break;&lt;br /&gt;
		case false: ret+=falseString; break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// append non-conditional string&lt;br /&gt;
		ret += splitted[i+numParens];&lt;br /&gt;
	}&lt;br /&gt;
	if (conditionalSplitRegex.test(ret) &amp;amp;&amp;amp; recursionCount &amp;lt; 10) {&lt;br /&gt;
		return expandConditionalNavlinkString(ret,article,z,recursionCount+1);&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function navlinkStringToArray(s, article, params) {&lt;br /&gt;
	s=expandConditionalNavlinkString(s,article,params);&lt;br /&gt;
	var splitted=s.parenSplit(RegExp(&#039;&amp;lt;&amp;lt;(.*?)&amp;gt;&amp;gt;&#039;));&lt;br /&gt;
	var ret=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;splitted.length; ++i) {&lt;br /&gt;
		if (i%2) { // i odd, so s is a tag&lt;br /&gt;
			var t=new navlinkTag();&lt;br /&gt;
			var ss=splitted[i].split(&#039;|&#039;);&lt;br /&gt;
			t.id=ss[0];&lt;br /&gt;
			for (var j=1; j&amp;lt;ss.length; ++j) {&lt;br /&gt;
				var sss=ss[j].split(&#039;=&#039;);&lt;br /&gt;
				if (sss.length&amp;gt;1) {&lt;br /&gt;
					t[sss[0]]=sss[1];&lt;br /&gt;
				}&lt;br /&gt;
				else { // no assignment (no &amp;quot;=&amp;quot;), so treat this as a title (overwriting the last one)&lt;br /&gt;
					t.text=popupString(sss[0]);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			t.article=article;&lt;br /&gt;
			var oldid=params.oldid, rcid=params.rcid, diff=params.diff;&lt;br /&gt;
			if (typeof oldid != &#039;undefined&#039; &amp;amp;&amp;amp; oldid != null) { t.oldid=oldid; }&lt;br /&gt;
			if (typeof rcid != &#039;undefined&#039; &amp;amp;&amp;amp; rcid != null) { t.rcid=rcid; }&lt;br /&gt;
			if (typeof diff != &#039;undefined&#039; &amp;amp;&amp;amp; diff != null) { t.diff=diff; }&lt;br /&gt;
			if (!t.text &amp;amp;&amp;amp; t.id != &#039;mainlink&#039;) { t.text=popupString(t.id); }&lt;br /&gt;
			ret.push(t);&lt;br /&gt;
		}&lt;br /&gt;
		else { // plain HTML&lt;br /&gt;
			ret.push(splitted[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function navlinkSubstituteHTML(s) {&lt;br /&gt;
	return s.split(&#039;*&#039;).join(getValueOf(&#039;popupNavLinkSeparator&#039;))&lt;br /&gt;
		.split(&#039;&amp;lt;menurow&amp;gt;&#039;).join(&#039;&amp;lt;li class=&amp;quot;popup_menu_row&amp;quot;&amp;gt;&#039;)&lt;br /&gt;
		.split(&#039;&amp;lt;/menurow&amp;gt;&#039;).join(&#039;&amp;lt;/li&amp;gt;&#039;)&lt;br /&gt;
		.split(&#039;&amp;lt;menu&amp;gt;&#039;).join(&#039;&amp;lt;ul class=&amp;quot;popup_menu&amp;quot;&amp;gt;&#039;)&lt;br /&gt;
		.split(&#039;&amp;lt;/menu&amp;gt;&#039;).join(&#039;&amp;lt;/ul&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function navlinkDepth(magic,s) {&lt;br /&gt;
	return s.split(&#039;&amp;lt;&#039; + magic + &#039;&amp;gt;&#039;).length - s.split(&#039;&amp;lt;/&#039; + magic + &#039;&amp;gt;&#039;).length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// navlinkString: * becomes the separator&lt;br /&gt;
//				&amp;lt;&amp;lt;foo|bar=baz|fubar&amp;gt;&amp;gt; becomes a foo-link with attribute bar=&#039;baz&#039;&lt;br /&gt;
//									  and visible text &#039;fubar&#039;&lt;br /&gt;
//				if(test){...} and if(test){...}else{...} work too (nested ok)&lt;br /&gt;
&lt;br /&gt;
function navlinkStringToHTML(s,article,params) {&lt;br /&gt;
	//limitAlert(navlinkStringToHTML, 5, &#039;navlinkStringToHTML\n&#039; + article + &#039;\n&#039; + (typeof article));&lt;br /&gt;
	var p=navlinkStringToArray(s,article,params);&lt;br /&gt;
	var html=&#039;&#039;;&lt;br /&gt;
	var menudepth = 0; // nested menus not currently allowed, but doesn&#039;t do any harm to code for it&lt;br /&gt;
	var menurowdepth = 0;&lt;br /&gt;
	var wrapping = null;&lt;br /&gt;
	for (var i=0; i&amp;lt;p.length; ++i) {&lt;br /&gt;
		if (typeof p[i] == typeof &#039;&#039;) {&lt;br /&gt;
			html+=navlinkSubstituteHTML(p[i]);&lt;br /&gt;
			menudepth += navlinkDepth(&#039;menu&#039;, p[i]);&lt;br /&gt;
			menurowdepth += navlinkDepth(&#039;menurow&#039;, p[i]);&lt;br /&gt;
//			if (menudepth === 0) {&lt;br /&gt;
//				tagType=&#039;span&#039;;&lt;br /&gt;
//			} else if (menurowdepth === 0) {&lt;br /&gt;
//				tagType=&#039;li&#039;;&lt;br /&gt;
//			} else {&lt;br /&gt;
//				tagType = null;&lt;br /&gt;
//			}&lt;br /&gt;
		} else if (typeof p[i].type != &#039;undefined&#039; &amp;amp;&amp;amp; p[i].type==&#039;navlinkTag&#039;) {&lt;br /&gt;
			if (menudepth &amp;gt; 0 &amp;amp;&amp;amp; menurowdepth === 0) {&lt;br /&gt;
				html += &#039;&amp;lt;li class=&amp;quot;popup_menu_item&amp;quot;&amp;gt;&#039; + p[i].html() + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				html+=p[i].html();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function navlinkTag() {&lt;br /&gt;
	this.type=&#039;navlinkTag&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
navlinkTag.prototype.html=function () {&lt;br /&gt;
	this.getNewWin();&lt;br /&gt;
	this.getPrintFunction();&lt;br /&gt;
	var html=&#039;&#039;;&lt;br /&gt;
	var opening, closing;&lt;br /&gt;
	var tagType=&#039;span&#039;;&lt;br /&gt;
	if (!tagType) {&lt;br /&gt;
		opening = &#039;&#039;; closing = &#039;&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		opening = &#039;&amp;lt;&#039; + tagType + &#039; class=&amp;quot;popup_&#039; + this.id + &#039;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
		closing = &#039;&amp;lt;/&#039; + tagType + &#039;&amp;gt;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	if (typeof this.print!=&#039;function&#039;) {&lt;br /&gt;
		errlog (&#039;Oh dear - invalid print function for a navlinkTag, id=&#039;+this.id);&lt;br /&gt;
	} else {&lt;br /&gt;
		html=this.print(this);&lt;br /&gt;
		if (typeof html != typeof &#039;&#039;) {html=&#039;&#039;;}&lt;br /&gt;
		else if (typeof this.shortcut!=&#039;undefined&#039;) html=addPopupShortcut(html, this.shortcut);&lt;br /&gt;
	}&lt;br /&gt;
	return opening + html + closing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
navlinkTag.prototype.getNewWin=function() {&lt;br /&gt;
	getValueOf(&#039;popupLinksNewWindow&#039;);&lt;br /&gt;
	if (typeof pg.option.popupLinksNewWindow[this.id] === &#039;undefined&#039;) { this.newWin=null; }&lt;br /&gt;
	this.newWin=pg.option.popupLinksNewWindow[this.id];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
navlinkTag.prototype.getPrintFunction=function() { //think about this some more&lt;br /&gt;
	// this.id and this.article should already be defined&lt;br /&gt;
	if (typeof this.id!=typeof &#039;&#039; || typeof this.article!=typeof {} ) { return; }&lt;br /&gt;
	var html=&#039;&#039;;&lt;br /&gt;
	var a,t;&lt;br /&gt;
&lt;br /&gt;
	this.noPopup=1;&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case &#039;contribs&#039;: case &#039;history&#039;: case &#039;whatLinksHere&#039;:&lt;br /&gt;
	case &#039;userPage&#039;: case &#039;monobook&#039;: case &#039;userTalk&#039;:&lt;br /&gt;
	case &#039;talk&#039;: case &#039;article&#039;: case &#039;lastEdit&#039;:&lt;br /&gt;
		this.noPopup=null;&lt;br /&gt;
	}&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case &#039;email&#039;:	 case &#039;contribs&#039;:  case &#039;block&#039;:	 case &#039;unblock&#039;:&lt;br /&gt;
	case &#039;userlog&#039;:   case &#039;userSpace&#039;: case &#039;deletedContribs&#039;:&lt;br /&gt;
		this.article=this.article.userName();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case &#039;userTalk&#039;: case &#039;newUserTalk&#039;: case &#039;editUserTalk&#039;:&lt;br /&gt;
	case &#039;userPage&#039;: case &#039;monobook&#039;: case &#039;editMonobook&#039;: case &#039;blocklog&#039;:&lt;br /&gt;
		this.article=this.article.userName(true);&lt;br /&gt;
	// fall through; no break&lt;br /&gt;
	case &#039;pagelog&#039;: case &#039;deletelog&#039;: case &#039;protectlog&#039;:&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (this.id==&#039;editMonobook&#039; || this.id==&#039;monobook&#039;) { this.article.append(&#039;/monobook.js&#039;); }&lt;br /&gt;
&lt;br /&gt;
	if (this.id != &#039;mainlink&#039;) {&lt;br /&gt;
		// FIXME anchor handling should be done differently with Title object&lt;br /&gt;
		this.article=this.article.removeAnchor();&lt;br /&gt;
		// if (typeof this.text==&#039;undefined&#039;) this.text=popupString(this.id);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	switch (this.id) {&lt;br /&gt;
	case &#039;undelete&#039;:       this.print=specialLink; this.specialpage=&#039;Undelete&#039;; this.sep=&#039;/&#039;; break;&lt;br /&gt;
	case &#039;whatLinksHere&#039;:  this.print=specialLink; this.specialpage=&#039;Whatlinkshere&#039;; break;&lt;br /&gt;
	case &#039;relatedChanges&#039;: this.print=specialLink; this.specialpage=&#039;Recentchangeslinked&#039;; break;&lt;br /&gt;
	case &#039;move&#039;:           this.print=specialLink; this.specialpage=&#039;Movepage&#039;; break;&lt;br /&gt;
	case &#039;contribs&#039;:       this.print=specialLink; this.specialpage=&#039;Contributions&#039;; break;&lt;br /&gt;
	case &#039;deletedContribs&#039;:this.print=specialLink; this.specialpage=&#039;Deletedcontributions&#039;; break;&lt;br /&gt;
	case &#039;email&#039;:          this.print=specialLink; this.specialpage=&#039;EmailUser&#039;; this.sep=&#039;/&#039;; break;&lt;br /&gt;
	case &#039;block&#039;:          this.print=specialLink; this.specialpage=&#039;Blockip&#039;; this.sep=&#039;&amp;amp;ip=&#039;; break;&lt;br /&gt;
	case &#039;unblock&#039;:        this.print=specialLink; this.specialpage=&#039;Ipblocklist&#039;; this.sep=&#039;&amp;amp;action=unblock&amp;amp;ip=&#039;; break;&lt;br /&gt;
	case &#039;userlog&#039;:        this.print=specialLink; this.specialpage=&#039;Log&#039;; this.sep=&#039;&amp;amp;user=&#039;; break;&lt;br /&gt;
	case &#039;blocklog&#039;:       this.print=specialLink; this.specialpage=&#039;Log&#039;; this.sep=&#039;&amp;amp;type=block&amp;amp;page=&#039;; break;&lt;br /&gt;
	case &#039;pagelog&#039;:        this.print=specialLink; this.specialpage=&#039;Log&#039;; this.sep=&#039;&amp;amp;page=&#039;; break;&lt;br /&gt;
	case &#039;protectlog&#039;:     this.print=specialLink; this.specialpage=&#039;Log&#039;; this.sep=&#039;&amp;amp;type=protect&amp;amp;page=&#039;; break;&lt;br /&gt;
	case &#039;deletelog&#039;:      this.print=specialLink; this.specialpage=&#039;Log&#039;; this.sep=&#039;&amp;amp;type=delete&amp;amp;page=&#039;; break;&lt;br /&gt;
	case &#039;userSpace&#039;:      this.print=specialLink; this.specialpage=&#039;PrefixIndex&#039;; this.sep=&#039;&amp;amp;namespace=2&amp;amp;prefix=&#039;; break;&lt;br /&gt;
	case &#039;search&#039;:         this.print=specialLink; this.specialpage=&#039;Search&#039;; this.sep=&#039;&amp;amp;fulltext=Search&amp;amp;search=&#039;; break;&lt;br /&gt;
	case &#039;unwatch&#039;: case &#039;watch&#039;:&lt;br /&gt;
	this.print=magicWatchLink; this.action=this.id+&#039;&amp;amp;autowatchlist=1&amp;amp;actoken=&#039;+autoClickToken(); break;&lt;br /&gt;
	case &#039;history&#039;: case &#039;historyfeed&#039;: &lt;br /&gt;
	case &#039;unprotect&#039;: case &#039;protect&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=this.id; break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;delete&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;delete&#039;;&lt;br /&gt;
	if (this.article.namespaceId()==pg.nsImageId) {&lt;br /&gt;
		var img=this.article.stripNamespace();&lt;br /&gt;
		this.action+=&#039;&amp;amp;image=&#039;+img;&lt;br /&gt;
	}&lt;br /&gt;
	break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;markpatrolled&#039;:&lt;br /&gt;
	case &#039;edit&#039;: // editOld should keep the oldid, but edit should not.&lt;br /&gt;
	delete this.oldid; // fall through&lt;br /&gt;
	case &#039;view&#039;: case &#039;purge&#039;: case &#039;render&#039;:&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	this.action=this.id; break;&lt;br /&gt;
	case &#039;raw&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;raw&amp;amp;ctype=text/css&#039;; break;&lt;br /&gt;
	case &#039;new&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;edit&amp;amp;section=new&#039;; break;&lt;br /&gt;
	case &#039;mainlink&#039;:&lt;br /&gt;
	if (typeof this.text==&#039;undefined&#039;) { this.text=this.article.toString().entify(); }&lt;br /&gt;
	if (getValueOf(&#039;popupSimplifyMainLink&#039;) &amp;amp;&amp;amp; isInStrippableNamespace(this.article)) {&lt;br /&gt;
		var s=this.text.split(&#039;/&#039;); this.text=s[s.length-1];&lt;br /&gt;
		if (this.text==&#039;&#039; &amp;amp;&amp;amp; s.length &amp;gt; 1) { this.text=s[s.length-2]; }&lt;br /&gt;
	}&lt;br /&gt;
	this.print=titledWikiLink;&lt;br /&gt;
	if (typeof this.title==&#039;undefined&#039; &amp;amp;&amp;amp; pg.current.link &amp;amp;&amp;amp; typeof pg.current.link.href != &#039;undefined&#039;) {&lt;br /&gt;
		this.title=safeDecodeURI((pg.current.link.originalTitle)?pg.current.link.originalTitle:this.article);&lt;br /&gt;
		if (typeof this.oldid != &#039;undefined&#039; &amp;amp;&amp;amp; this.oldid) {&lt;br /&gt;
		this.title=tprintf(&#039;Revision %s of %s&#039;, [this.oldid, this.title]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	this.action=&#039;view&#039;; break;&lt;br /&gt;
	case &#039;userPage&#039;:&lt;br /&gt;
	case &#039;article&#039;:&lt;br /&gt;
	case &#039;monobook&#039;:&lt;br /&gt;
	case &#039;editMonobook&#039;:&lt;br /&gt;
	case &#039;editArticle&#039;:&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	//alert(this.id+&#039;\n&#039;+this.article + &#039;\n&#039;+ typeof this.article);&lt;br /&gt;
	this.article=this.article.articleFromTalkOrArticle();&lt;br /&gt;
	//alert(this.id+&#039;\n&#039;+this.article + &#039;\n&#039;+ typeof this.article);&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	if (this.id.indexOf(&#039;edit&#039;)==0) {&lt;br /&gt;
		this.action=&#039;edit&#039;;&lt;br /&gt;
	} else { this.action=&#039;view&#039;;}&lt;br /&gt;
	break;&lt;br /&gt;
	case &#039;userTalk&#039;:&lt;br /&gt;
	case &#039;talk&#039;:&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	this.print=wikiLink;&lt;br /&gt;
	this.action=&#039;view&#039;; break;&lt;br /&gt;
	case &#039;arin&#039;:&lt;br /&gt;
	this.print=arinLink; break;&lt;br /&gt;
	case &#039;count&#039;:&lt;br /&gt;
	this.print=editCounterLink; break;&lt;br /&gt;
	case &#039;google&#039;:&lt;br /&gt;
	this.print=googleLink; break;&lt;br /&gt;
	case &#039;editors&#039;:&lt;br /&gt;
	this.print=editorListLink; break;&lt;br /&gt;
	case &#039;globalsearch&#039;:&lt;br /&gt;
	this.print=globalSearchLink; break;&lt;br /&gt;
	case &#039;lastEdit&#039;:&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=popupString(&#039;Show the last edit&#039;);&lt;br /&gt;
	this.from=&#039;prev&#039;; this.to=&#039;cur&#039;; break;&lt;br /&gt;
	case &#039;oldEdit&#039;:&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=popupString(&#039;Show the edit made to get revision&#039;) + &#039; &#039; + this.oldid;&lt;br /&gt;
	this.from=&#039;prev&#039;; this.to=this.oldid; break;&lt;br /&gt;
	case &#039;editOld&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;edit&#039;; break;&lt;br /&gt;
	case &#039;undo&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;edit&amp;amp;undo=&#039;; break;&lt;br /&gt;
	case &#039;markpatrolled&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;markpatrolled&#039;;&lt;br /&gt;
	case &#039;revert&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;revert&#039;; break;&lt;br /&gt;
	case &#039;nullEdit&#039;:&lt;br /&gt;
	this.print=wikiLink; this.action=&#039;nullEdit&#039;; break;&lt;br /&gt;
	case &#039;diffCur&#039;:&lt;br /&gt;
	this.print=titledDiffLink;&lt;br /&gt;
	this.title=tprintf(&#039;Show changes since revision %s&#039;, [this.oldid]);&lt;br /&gt;
	this.from=this.oldid; this.to=&#039;cur&#039;; break;&lt;br /&gt;
	case &#039;editUserTalk&#039;:&lt;br /&gt;
	case &#039;editTalk&#039;:&lt;br /&gt;
	delete this.oldid;&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	this.action=&#039;edit&#039;; this.print=wikiLink; break;&lt;br /&gt;
	case &#039;newUserTalk&#039;:&lt;br /&gt;
	case &#039;newTalk&#039;:&lt;br /&gt;
	this.article=this.article.talkPage();&lt;br /&gt;
	this.action=&#039;edit&amp;amp;section=new&#039;; this.print=wikiLink; break;&lt;br /&gt;
	case &#039;lastContrib&#039;:&lt;br /&gt;
	case &#039;sinceMe&#039;:&lt;br /&gt;
	this.print=magicHistoryLink;&lt;br /&gt;
	break;&lt;br /&gt;
	case &#039;togglePreviews&#039;:&lt;br /&gt;
	this.text=popupString(pg.option.simplePopups ? &#039;enable previews&#039; : &#039;disable previews&#039;);&lt;br /&gt;
	case &#039;disablePopups&#039;: case &#039;purgePopups&#039;:&lt;br /&gt;
	this.print=popupMenuLink;&lt;br /&gt;
	break;&lt;br /&gt;
	default:&lt;br /&gt;
	this.print=function () {return &#039;Unknown navlink type: &#039;+this.id+&#039;&#039;};&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
//&lt;br /&gt;
//  end navlinks&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: navlinks.js&lt;br /&gt;
// STARTFILE: shortcutkeys.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function popupHandleKeypress(evt) {&lt;br /&gt;
	var keyCode = window.event ? window.event.keyCode : ( evt.keyCode ? evt.keyCode : evt.which);&lt;br /&gt;
	if (!keyCode || !pg.current.link || !pg.current.link.navpopup) { return; }&lt;br /&gt;
	if (keyCode==27) { // escape&lt;br /&gt;
		killPopup();&lt;br /&gt;
		return false; // swallow keypress&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var letter=String.fromCharCode(keyCode);&lt;br /&gt;
	var links=pg.current.link.navpopup.mainDiv.getElementsByTagName(&#039;A&#039;);&lt;br /&gt;
	var startLink=0;&lt;br /&gt;
	var i,j;&lt;br /&gt;
&lt;br /&gt;
	if (popupHandleKeypress.lastPopupLinkSelected) {&lt;br /&gt;
		for (i=0; i&amp;lt;links.length; ++i) {&lt;br /&gt;
			if (links[i]==popupHandleKeypress.lastPopupLinkSelected) { startLink=i; }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for (j=0; j&amp;lt;links.length; ++j) {&lt;br /&gt;
		i=(startLink + j + 1) % links.length;&lt;br /&gt;
		if (links[i].getAttribute(&#039;popupkey&#039;)==letter) {&lt;br /&gt;
			if (evt &amp;amp;&amp;amp; evt.preventDefault) evt.preventDefault();&lt;br /&gt;
			links[i].focus();&lt;br /&gt;
			popupHandleKeypress.lastPopupLinkSelected=links[i];&lt;br /&gt;
			return false; // swallow keypress&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// pass keypress on&lt;br /&gt;
	if (document.oldPopupOnkeypress) { return document.oldPopupOnkeypress(evt); }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addPopupShortcuts() {&lt;br /&gt;
	if (document.onkeypress!=popupHandleKeypress) {&lt;br /&gt;
		document.oldPopupOnkeypress=document.onkeypress;&lt;br /&gt;
	}&lt;br /&gt;
	document.onkeypress=popupHandleKeypress;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function rmPopupShortcuts() {&lt;br /&gt;
	popupHandleKeypress.lastPopupLinkSelected=null;&lt;br /&gt;
	try {&lt;br /&gt;
		if (document.oldPopupOnkeypress &amp;amp;&amp;amp; document.oldPopupOnkeypress==popupHandleKeypress) {&lt;br /&gt;
			// panic&lt;br /&gt;
			document.onkeypress=null; //function () {};&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		document.onkeypress=document.oldPopupOnkeypress;&lt;br /&gt;
	} catch (nasties) { /* IE goes here */ }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function addLinkProperty(html, property) {&lt;br /&gt;
	// take &amp;quot;&amp;lt;a href=...&amp;gt;...&amp;lt;/a&amp;gt; and add a property&lt;br /&gt;
	// not sophisticated at all, easily broken&lt;br /&gt;
	var i=html.indexOf(&#039;&amp;gt;&#039;);&lt;br /&gt;
	if (i&amp;lt;0) { return html; }&lt;br /&gt;
	return html.substring(0,i) + &#039; &#039; + property + html.substring(i);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function addPopupShortcut(html, key) {&lt;br /&gt;
	if (!getValueOf(&#039;popupShortcutKeys&#039;)) { return html; }&lt;br /&gt;
	var ret= addLinkProperty(html, &#039;popupkey=&amp;quot;&#039;+key+&#039;&amp;quot;&#039;);&lt;br /&gt;
	if (key==&#039; &#039;) { key=popupString(&#039;spacebar&#039;); }&lt;br /&gt;
	return ret.replace(RegExp(&#039;^(.*?)(title=&amp;quot;)(.*?)(&amp;quot;.*)$&#039;, &#039;i&#039;),&#039;$1$2$3 [&#039;+key+&#039;]$4&#039;);&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: shortcutkeys.js&lt;br /&gt;
// STARTFILE: diffpreview.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
function loadDiff(article, oldid, diff, navpop) {&lt;br /&gt;
	navpop.diffData={};&lt;br /&gt;
	var oldRev, newRev;&lt;br /&gt;
	switch (diff) {&lt;br /&gt;
	case &#039;cur&#039;:&lt;br /&gt;
		switch ( oldid ) {&lt;br /&gt;
		case null:&lt;br /&gt;
		case &#039;&#039;:&lt;br /&gt;
		case &#039;prev&#039;:&lt;br /&gt;
			// eg newmessages diff link&lt;br /&gt;
			oldRev=&#039;0&amp;amp;direction=prev&#039;;&lt;br /&gt;
			newRev=0;&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			oldRev = oldid;&lt;br /&gt;
			newRev = 0;&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;prev&#039;:&lt;br /&gt;
		oldRev = ( oldid || 0 ) + &#039;&amp;amp;direction=prev&#039;; newRev = oldid; break;&lt;br /&gt;
	case &#039;next&#039;:&lt;br /&gt;
		oldRev = oldid; newRev = oldid + &#039;&amp;amp;direction=next&#039;;&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		oldRev = oldid || 0; newRev = diff || 0; break;&lt;br /&gt;
	}&lt;br /&gt;
	oldRev = oldRev || 0;&lt;br /&gt;
	newRev = newRev || 0;&lt;br /&gt;
&lt;br /&gt;
	var go = function() {&lt;br /&gt;
		pendingNavpopTask(navpop);&lt;br /&gt;
		getWiki(article, doneDiffNew, newRev, navpop);&lt;br /&gt;
&lt;br /&gt;
		pendingNavpopTask(navpop);&lt;br /&gt;
		getWiki(article, doneDiffOld, oldRev, navpop);&lt;br /&gt;
&lt;br /&gt;
		var tz = Cookie.read(&#039;popTz&#039;);&lt;br /&gt;
		if ( (window.wgEnableAPI || wgEnableAPI) &amp;amp;&amp;amp; getValueOf(&#039;popupAdjustDiffDates&#039;) &amp;amp;&amp;amp; tz===null) {&lt;br /&gt;
			pendingNavpopTask(navpop);&lt;br /&gt;
			getPageWithCaching(pg.wiki.apiwikibase + &#039;?format=json&amp;amp;action=query&amp;amp;meta=userinfo&amp;amp;uiprop=options&#039;,&lt;br /&gt;
					   function(d) {&lt;br /&gt;
						   completedNavpopTask(navpop);&lt;br /&gt;
						   setTimecorrectionCookie(d);&lt;br /&gt;
						   if (diffDownloadsComplete(navpop)) { insertDiff(navpop); }&lt;br /&gt;
					   },  navpop);&lt;br /&gt;
		}&lt;br /&gt;
		return true; // remove hook once run&lt;br /&gt;
	}&lt;br /&gt;
	if (navpop.visible || !getValueOf(&#039;popupLazyDownloads&#039;)) { go(); }&lt;br /&gt;
	else { navpop.addHook(go, &#039;unhide&#039;, &#039;before&#039;, &#039;DOWNLOAD_DIFFS&#039;); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setTimecorrectionCookie(d) {&lt;br /&gt;
	try {&lt;br /&gt;
		var jsobj=getJsObj(d.data);&lt;br /&gt;
		var tz=jsobj.query.userinfo.options.timecorrection;&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		logerr( &#039;setTimecorretion failed&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Cookie.create( &#039;popTz&#039;, getTimeOffset(tz), 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function doneDiff(download, isOld) {&lt;br /&gt;
	if (!download.owner || !download.owner.diffData) { return; }&lt;br /&gt;
	var navpop=download.owner;&lt;br /&gt;
	var label= (isOld) ? &#039;Old&#039; : &#039;New&#039;;&lt;br /&gt;
	var otherLabel=(isOld) ? &#039;New&#039; : &#039;Old&#039;;&lt;br /&gt;
	navpop.diffData[label]=download;&lt;br /&gt;
	completedNavpopTask(download.owner);&lt;br /&gt;
	if (diffDownloadsComplete(navpop)) { insertDiff(navpop); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function diffDownloadsComplete(navpop) {&lt;br /&gt;
	if ( Cookie.read(&#039;popTz&#039;)===null) { return false; }&lt;br /&gt;
	return navpop.diffData.Old &amp;amp;&amp;amp; navpop.diffData.New;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function doneDiffNew(download) { doneDiff(download, false); }&lt;br /&gt;
function doneDiffOld(download) { doneDiff(download, true);  }&lt;br /&gt;
&lt;br /&gt;
function rmBoringLines(a,b,context) {&lt;br /&gt;
&lt;br /&gt;
	if (typeof context == &#039;undefined&#039;) { context=2; }&lt;br /&gt;
	// this is fairly slow... i think it&#039;s quicker than doing a word-based diff from the off, though&lt;br /&gt;
	var aa=[], aaa=[];&lt;br /&gt;
	var bb=[], bbb=[];&lt;br /&gt;
	var i, j;&lt;br /&gt;
&lt;br /&gt;
	// first, gather all disconnected nodes in a and all crossing nodes in a and b&lt;br /&gt;
	for (i=0; i&amp;lt;a.length; ++i ) {&lt;br /&gt;
		if(!a[i].paired) { aa[i]=1; }&lt;br /&gt;
		else if (countCrossings(b,a,i, true)) {&lt;br /&gt;
			aa[i]=1;&lt;br /&gt;
			bb[ a[i].row ] = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// pick up remaining disconnected nodes in b&lt;br /&gt;
	for (i=0; i&amp;lt;b.length; ++i ) {&lt;br /&gt;
		if (bb[i]==1) { continue; }&lt;br /&gt;
		if(!b[i].paired) { bb[i]=1; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// another pass to gather context: we want the neighbours of included nodes which are not yet included&lt;br /&gt;
	// we have to add in partners of these nodes, but we don&#039;t want to add context for *those* nodes in the next pass&lt;br /&gt;
	for (i=0; i&amp;lt;b.length; ++i) {&lt;br /&gt;
		if ( bb[i] == 1 ) {&lt;br /&gt;
			for (j=max(0,i-context); j &amp;lt; min(b.length, i+context); ++j) {&lt;br /&gt;
				if ( !bb[j] ) { bb[j] = 1; aa[ b[j].row ] = 0.5; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (i=0; i&amp;lt;a.length; ++i) {&lt;br /&gt;
		if ( aa[i] == 1 ) {&lt;br /&gt;
			for (j=max(0,i-context); j &amp;lt; min(a.length, i+context); ++j) {&lt;br /&gt;
				if ( !aa[j] ) { aa[j] = 1; bb[ a[j].row ] = 0.5; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (i=0; i&amp;lt;bb.length; ++i) {&lt;br /&gt;
		if (bb[i] &amp;gt; 0) { // it&#039;s a row we need&lt;br /&gt;
			if (b[i].paired) { bbb.push(b[i].text); } // joined; partner should be in aa&lt;br /&gt;
			else {&lt;br /&gt;
				bbb.push(b[i]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for (i=0; i&amp;lt;aa.length; ++i) {&lt;br /&gt;
		if (aa[i] &amp;gt; 0) { // it&#039;s a row we need&lt;br /&gt;
			if (a[i].paired) { aaa.push(a[i].text); } // joined; partner should be in aa&lt;br /&gt;
			else {&lt;br /&gt;
				aaa.push(a[i]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return { a: aaa, b: bbb};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function stripOuterCommonLines(a,b,context) {&lt;br /&gt;
	var i=0;&lt;br /&gt;
	while (i&amp;lt;a.length &amp;amp;&amp;amp; i &amp;lt; b.length &amp;amp;&amp;amp; a[i]==b[i]) { ++i; }&lt;br /&gt;
	var j=a.length-1; var k=b.length-1;&lt;br /&gt;
	while ( j&amp;gt;=0 &amp;amp;&amp;amp; k&amp;gt;=0 &amp;amp;&amp;amp; a[j]==b[k] ) { --j; --k; }&lt;br /&gt;
&lt;br /&gt;
	return { a: a.slice(max(0,i - 1 - context), min(a.length+1, j + context+1)),&lt;br /&gt;
				b: b.slice(max(0,i - 1 - context), min(b.length+1, k + context+1)) };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function insertDiff(navpop) {&lt;br /&gt;
	// for speed reasons, we first do a line-based diff, discard stuff that seems boring, then do a word-based diff&lt;br /&gt;
	// FIXME: sometimes this gives misleading diffs as distant chunks are squashed together&lt;br /&gt;
	var oldlines=navpop.diffData.Old.data.split(&#039;\n&#039;);&lt;br /&gt;
	var newlines=navpop.diffData.New.data.split(&#039;\n&#039;);&lt;br /&gt;
	var inner=stripOuterCommonLines(oldlines,newlines,getValueOf(&#039;popupDiffContextLines&#039;));&lt;br /&gt;
	oldlines=inner.a; newlines=inner.b;&lt;br /&gt;
	var truncated=false;&lt;br /&gt;
	getValueOf(&#039;popupDiffMaxLines&#039;);&lt;br /&gt;
	if (oldlines.length &amp;gt; pg.option.popupDiffMaxLines || newlines.length &amp;gt; pg.option.popupDiffMaxLines) {&lt;br /&gt;
		// truncate&lt;br /&gt;
		truncated=true;&lt;br /&gt;
		inner=stripOuterCommonLines(oldlines.slice(0,pg.option.popupDiffMaxLines),&lt;br /&gt;
						newlines.slice(0,pg.option.popupDiffMaxLines),&lt;br /&gt;
						pg.option.popupDiffContextLines);&lt;br /&gt;
		oldlines=inner.a; newlines=inner.b;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var lineDiff=diff(oldlines, newlines);&lt;br /&gt;
	var lines2=rmBoringLines(lineDiff.o, lineDiff.n);&lt;br /&gt;
	var oldlines2=lines2.a; var newlines2=lines2.b;&lt;br /&gt;
&lt;br /&gt;
	var simpleSplit = !String.prototype.parenSplit.isNative;&lt;br /&gt;
	var html=&#039;&amp;lt;hr&amp;gt;&#039;;&lt;br /&gt;
	if (getValueOf(&#039;popupDiffDates&#039;)) {&lt;br /&gt;
		html += diffDatesTable(navpop.diffData.Old, navpop.diffData.New);&lt;br /&gt;
		html += &#039;&amp;lt;hr&amp;gt;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	html += shortenDiffString(&lt;br /&gt;
		diffString(oldlines2.join(&#039;\n&#039;), newlines2.join(&#039;\n&#039;), simpleSplit),&lt;br /&gt;
		getValueOf(&#039;popupDiffContextCharacters&#039;) ).join(&#039;&amp;lt;hr&amp;gt;&#039;);&lt;br /&gt;
	setPopupTipsAndHTML(html.split(&#039;\n&#039;).join(&#039;&amp;lt;br&amp;gt;&#039;) +&lt;br /&gt;
			 (truncated ? &#039;&amp;lt;hr&amp;gt;&amp;lt;b&amp;gt;&#039;+popupString(&#039;Diff truncated for performance reasons&#039;)+&#039;&amp;lt;/b&amp;gt;&#039; : &#039;&#039;) ,&lt;br /&gt;
				&#039;popupPreview&#039;, navpop.idNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function diffDatesTable( oldDl, newDl ) {&lt;br /&gt;
	var html=&#039;&amp;lt;table class=&amp;quot;popup_diff_dates&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
	html += diffDatesTableRow( newDl, tprintf(&#039;New revision&#039;));&lt;br /&gt;
	html += diffDatesTableRow( oldDl, tprintf(&#039;Old revision&#039;));&lt;br /&gt;
	html += &#039;&amp;lt;/table&amp;gt;&#039;;&lt;br /&gt;
	return html;&lt;br /&gt;
}&lt;br /&gt;
function diffDatesTableRow( dl, label ) {&lt;br /&gt;
	var txt=&#039;&#039;;&lt;br /&gt;
	if (!dl) {&lt;br /&gt;
		txt=popupString(&#039;Something went wrong :-(&#039;);&lt;br /&gt;
	} else if (!dl.lastModified) {&lt;br /&gt;
		txt= (/^\s*$/.test(dl.data)) ?&lt;br /&gt;
			popupString(&#039;Empty revision, maybe non-existent&#039;) : popupString(&#039;Unknown date&#039;);&lt;br /&gt;
	} else {&lt;br /&gt;
		var datePrint=getValueOf(&#039;popupDiffDatePrinter&#039;);&lt;br /&gt;
		if (typeof dl.lastModified[datePrint] == &#039;function&#039;) {&lt;br /&gt;
			if (getValueOf(&#039;popupAdjustDiffDates&#039;)) {&lt;br /&gt;
				var off;&lt;br /&gt;
				if (off=Cookie.read(&#039;popTz&#039;)) {&lt;br /&gt;
					var d2=adjustDate(dl.lastModified, off);&lt;br /&gt;
					txt = dayFormat(d2, true) + &#039; &#039; + timeFormat(d2, true);&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				txt = dl.lastModified[datePrint]();&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			txt = tprintf(&#039;Invalid %s %s&#039;, [&#039;popupDiffDatePrinter&#039;, datePrint]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var revlink = generalLink({url: dl.url.replace(/&amp;amp;.*?(oldid=[0-9]+(?:&amp;amp;direction=[^&amp;amp;]*)?).*/, &#039;&amp;amp;$1&#039;),&lt;br /&gt;
				   text: label, title: label});&lt;br /&gt;
	return simplePrintf(&#039;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;, [ revlink, txt ]);&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: diffpreview.js&lt;br /&gt;
// STARTFILE: links.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
/////////////////////&lt;br /&gt;
// LINK GENERATION //&lt;br /&gt;
/////////////////////&lt;br /&gt;
&lt;br /&gt;
// titledDiffLink --&amp;gt; titledWikiLink --&amp;gt; generalLink&lt;br /&gt;
// wikiLink	   --&amp;gt; titledWikiLink --&amp;gt; generalLink&lt;br /&gt;
// editCounterLink --&amp;gt; generalLink&lt;br /&gt;
&lt;br /&gt;
function titledDiffLink(l) { // article, text, title, from, to) {&lt;br /&gt;
	return titledWikiLink({article: l.article, action: l.to + &#039;&amp;amp;oldid=&#039; + l.from,&lt;br /&gt;
				newWin: l.newWin,&lt;br /&gt;
				noPopup: l.noPopup,&lt;br /&gt;
				text: l.text, title: l.title,&lt;br /&gt;
				/* hack: no oldid here */&lt;br /&gt;
				actionName: &#039;diff&#039;});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function wikiLink(l) {&lt;br /&gt;
	//{article:article, action:action, text:text, oldid, newid}) {&lt;br /&gt;
	if (! (typeof l.article == typeof {}&lt;br /&gt;
		   &amp;amp;&amp;amp; typeof l.action == typeof &#039;&#039; &amp;amp;&amp;amp; typeof l.text==typeof &#039;&#039;)) return null;&lt;br /&gt;
	if (typeof l.oldid == &#039;undefined&#039;) { l.oldid=null; }&lt;br /&gt;
	var savedOldid = l.oldid;&lt;br /&gt;
	if (!/^(edit|view|revert|render)$|^raw/.test(l.action)) { l.oldid=null; }&lt;br /&gt;
	var hint=popupString(l.action + &#039;Hint&#039;); // revertHint etc etc etc&lt;br /&gt;
	var oldidData=[l.oldid, safeDecodeURI(l.article)];&lt;br /&gt;
	var revisionString = tprintf(&#039;revision %s of %s&#039;, oldidData);&lt;br /&gt;
	log(&#039;revisionString=&#039;+revisionString);&lt;br /&gt;
	switch (l.action) {&lt;br /&gt;
	case &#039;edit&amp;amp;section=new&#039;: hint = popupString(&#039;newSectionHint&#039;);  break;&lt;br /&gt;
	case &#039;edit&amp;amp;undo=&#039;:&lt;br /&gt;
		if (l.diff &amp;amp;&amp;amp; l.diff != &#039;prev&#039; &amp;amp;&amp;amp; savedOldid ) {&lt;br /&gt;
		  l.action += l.diff + &#039;&amp;amp;undoafter=&#039; + savedOldid;&lt;br /&gt;
		} else if (savedOldid) {&lt;br /&gt;
		  l.action += savedOldid;&lt;br /&gt;
		}&lt;br /&gt;
		hint = popupString(&#039;undoHint&#039;);&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;raw&amp;amp;ctype=text/css&#039;: hint=popupString(&#039;rawHint&#039;); break;&lt;br /&gt;
	case &#039;revert&#039;:&lt;br /&gt;
		if (!window.wgEnableAPI || !wgEnableAPI) {&lt;br /&gt;
			alert( &#039;This function of navigation popups now requires a MediaWiki &#039; + &lt;br /&gt;
			&#039;installation with the API enabled.&#039;);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		var p=parseParams(pg.current.link.href);&lt;br /&gt;
		l.action=&#039;edit&amp;amp;autoclick=wpSave&amp;amp;actoken=&#039; + autoClickToken() + &#039;&amp;amp;autosummary=&#039; + revertSummary(l.oldid, p.diff);&lt;br /&gt;
		if (p.diff==&#039;prev&#039;) {&lt;br /&gt;
			l.action += &#039;&amp;amp;direction=prev&#039;;&lt;br /&gt;
			revisionString = tprintf(&#039;the revision prior to revision %s of %s&#039;, oldidData);&lt;br /&gt;
		}&lt;br /&gt;
		if (getValueOf(&#039;popupRevertSummaryPrompt&#039;)) { l.action += &#039;&amp;amp;autosummaryprompt=true&#039;; }&lt;br /&gt;
		if (getValueOf(&#039;popupMinorReverts&#039;)) { l.action += &#039;&amp;amp;autominor=true&#039;; }&lt;br /&gt;
		log(&#039;revisionString is now &#039;+revisionString);&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;nullEdit&#039;:&lt;br /&gt;
		l.action=&#039;edit&amp;amp;autoclick=wpSave&amp;amp;actoken=&#039; + autoClickToken() + &#039;&amp;amp;autosummary=null&#039;;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;historyfeed&#039;:&lt;br /&gt;
		l.action=&#039;history&amp;amp;feed=rss&#039;;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;markpatrolled&#039;:&lt;br /&gt;
		l.action=&#039;markpatrolled&amp;amp;rcid=&#039;+l.rcid;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (hint) {&lt;br /&gt;
		if (l.oldid) {&lt;br /&gt;
			hint = simplePrintf(hint, [revisionString]);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			hint = simplePrintf(hint, [safeDecodeURI(l.article)]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		hint = safeDecodeURI(l.article + &#039;&amp;amp;action=&#039; + l.action) + (l.oldid) ? &#039;&amp;amp;oldid=&#039;+l.oldid : &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return titledWikiLink({article: l.article, action: l.action, text: l.text, newWin:l.newWin,&lt;br /&gt;
				title: hint, oldid: l.oldid, noPopup: l.noPopup, onclick: l.onclick});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function revertSummary(oldid, diff) {&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
	if (diff == &#039;prev&#039;) {&lt;br /&gt;
		ret=getValueOf(&#039;popupQueriedRevertToPreviousSummary&#039;);&lt;br /&gt;
	} else { ret = getValueOf(&#039;popupQueriedRevertSummary&#039;); }&lt;br /&gt;
	return ret + &#039;&amp;amp;autorv=&#039; + oldid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function titledWikiLink(l) {&lt;br /&gt;
	// possible properties of argument:&lt;br /&gt;
	// article, action, text, title, oldid, actionName, className, noPopup&lt;br /&gt;
	// oldid = null is fine here&lt;br /&gt;
&lt;br /&gt;
	// article and action are mandatory args&lt;br /&gt;
&lt;br /&gt;
	if (typeof l.article == &#039;undefined&#039; || typeof l.action==&#039;undefined&#039;) {&lt;br /&gt;
		errlog(&#039;got undefined article or action in titledWikiLink&#039;);&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var base = pg.wiki.titlebase +  l.article.urlString();&lt;br /&gt;
	var url=base;&lt;br /&gt;
&lt;br /&gt;
	if (typeof l.actionName==&#039;undefined&#039; || !l.actionName) { l.actionName=&#039;action&#039;; }&lt;br /&gt;
&lt;br /&gt;
	// no need to add &amp;amp;action=view, and this confuses anchors&lt;br /&gt;
	if (l.action != &#039;view&#039;) { url = base + &#039;&amp;amp;&#039; + l.actionName + &#039;=&#039; + l.action; }&lt;br /&gt;
&lt;br /&gt;
	if (typeof l.oldid!=&#039;undefined&#039; &amp;amp;&amp;amp; l.oldid) { url+=&#039;&amp;amp;oldid=&#039;+l.oldid; }&lt;br /&gt;
&lt;br /&gt;
	var cssClass=pg.misc.defaultNavlinkClassname;&lt;br /&gt;
	if (typeof l.className!=&#039;undefined&#039; &amp;amp;&amp;amp; l.className) { cssClass=l.className; }&lt;br /&gt;
&lt;br /&gt;
	return generalNavLink({url: url, newWin: l.newWin,&lt;br /&gt;
				title: (typeof l.title != &#039;undefined&#039;) ? l.title : null,&lt;br /&gt;
				text: (typeof l.text!=&#039;undefined&#039;)?l.text:null,&lt;br /&gt;
				className: cssClass, noPopup:l.noPopup, onclick:l.onclick});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getLastContrib(wikipage, newWin) {&lt;br /&gt;
	getHistoryInfo(wikipage, function(x){processLastContribInfo(x,{page: wikipage, newWin: newWin})});&lt;br /&gt;
}&lt;br /&gt;
function processLastContribInfo(info, stuff) {&lt;br /&gt;
	if(!info.edits || !info.edits.length) { alert(&#039;Popups: an odd thing happened. Please retry.&#039;); return; }&lt;br /&gt;
	if(!info.firstNewEditor) {&lt;br /&gt;
		alert(tprintf(&#039;Only found one editor: %s made %s edits&#039;, [info.edits[0].editor,info.edits.length]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var newUrl=pg.wiki.titlebase + new Title(stuff.page).urlString() + &#039;&amp;amp;diff=cur&amp;amp;oldid=&#039;+info.firstNewEditor.oldid;&lt;br /&gt;
	displayUrl(newUrl, stuff.newWin);&lt;br /&gt;
}&lt;br /&gt;
function getDiffSinceMyEdit(wikipage, newWin) {&lt;br /&gt;
	getHistoryInfo(wikipage, function(x){processDiffSinceMyEdit(x,{page: wikipage, newWin: newWin})});&lt;br /&gt;
}&lt;br /&gt;
function processDiffSinceMyEdit(info, stuff) {&lt;br /&gt;
	if(!info.edits || !info.edits.length) { alert(&#039;Popups: something fishy happened. Please try again.&#039;); return; }&lt;br /&gt;
	var friendlyName=stuff.page.split(&#039;_&#039;).join(&#039; &#039;);&lt;br /&gt;
	if(!info.myLastEdit) {&lt;br /&gt;
		alert(tprintf(&#039;Couldn\&#039;t find an edit by %s\nin the last %s edits to\n%s&#039;,&lt;br /&gt;
				  [info.userName, getValueOf(&#039;popupHistoryLimit&#039;), friendlyName]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if(info.myLastEdit.index==0) {&lt;br /&gt;
		alert(tprintf(&amp;quot;%s seems to be the last editor to the page %s&amp;quot;, [info.userName, friendlyName]));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var newUrl=pg.wiki.titlebase + new Title(stuff.page).urlString() + &#039;&amp;amp;diff=cur&amp;amp;oldid=&#039;+ info.myLastEdit.oldid;&lt;br /&gt;
	displayUrl(newUrl, stuff.newWin);&lt;br /&gt;
}&lt;br /&gt;
function displayUrl(url, newWin){&lt;br /&gt;
	if(newWin) { window.open(url); }&lt;br /&gt;
	else { document.location=url; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function purgePopups() {&lt;br /&gt;
	processAllPopups(true);&lt;br /&gt;
	setupCache(); // deletes all cached items (not browser cached, though...)&lt;br /&gt;
	pg.option={};&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function processAllPopups(nullify, banish) {&lt;br /&gt;
	for (var i=0; i&amp;lt;pg.current.links.length; ++i) {&lt;br /&gt;
		if (!pg.current.links[i].navpopup) { continue; }&lt;br /&gt;
		(nullify || banish) &amp;amp;&amp;amp; pg.current.links[i].navpopup.banish();&lt;br /&gt;
		pg.current.links[i].simpleNoMore=false;&lt;br /&gt;
		nullify &amp;amp;&amp;amp; (pg.current.links[i].navpopup=null);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function disablePopups(){&lt;br /&gt;
	processAllPopups(false, true);&lt;br /&gt;
	setupTooltips(null, true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function togglePreviews() {&lt;br /&gt;
	processAllPopups(true, true);&lt;br /&gt;
	pg.option.simplePopups=!pg.option.simplePopups;&lt;br /&gt;
	abortAllDownloads();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function magicWatchLink(l) {&lt;br /&gt;
	//Yuck!! Would require a thorough redesign to add this as a click event though ...&lt;br /&gt;
	l.onclick = simplePrintf( &#039;modifyWatchlist(\&#039;%s\&#039;,\&#039;%s\&#039;);return false;&#039;, [l.article.toString(true).split(&amp;quot;\\&amp;quot;).join(&amp;quot;\\\\&amp;quot;).split(&amp;quot;&#039;&amp;quot;).join(&amp;quot;\\&#039;&amp;quot;), this.id] );&lt;br /&gt;
	return wikiLink(l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function modifyWatchlist(title, action) {&lt;br /&gt;
		var reqData = {&lt;br /&gt;
			&#039;action&#039;: &#039;watch&#039;,&lt;br /&gt;
			&#039;format&#039;: &#039;json&#039;,&lt;br /&gt;
			&#039;title&#039;: title,&lt;br /&gt;
			&#039;token&#039;: mw.user.tokens.get(&#039;watchToken&#039;),&lt;br /&gt;
			&#039;uselang&#039;: mw.config.get(&#039;wgUserLanguage&#039;)&lt;br /&gt;
		};&lt;br /&gt;
		if (action===&#039;unwatch&#039;) reqData.unwatch = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
		jQuery.ajax({&lt;br /&gt;
			url: mw.util.wikiScript(&#039;api&#039;),&lt;br /&gt;
			dataType: &#039;json&#039;,&lt;br /&gt;
			type: &#039;POST&#039;,&lt;br /&gt;
			data: reqData,&lt;br /&gt;
			success: function( data, textStatus, xhr ) {&lt;br /&gt;
				mw.util.jsMessage( data.watch.message, &#039;watch&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function magicHistoryLink(l) {&lt;br /&gt;
	// FIXME use onclick change href trick to sort this out instead of window.open&lt;br /&gt;
&lt;br /&gt;
	var jsUrl=&#039;&#039;, title=&#039;&#039;;&lt;br /&gt;
	switch(l.id) {&lt;br /&gt;
	case &#039;lastContrib&#039;:&lt;br /&gt;
		jsUrl=simplePrintf(&#039;javascript:getLastContrib(\&#039;%s\&#039;,%s)&#039;,&lt;br /&gt;
			[l.article.toString(true).split(&amp;quot;\\&amp;quot;).join(&amp;quot;\\\\&amp;quot;).split(&amp;quot;&#039;&amp;quot;).join(&amp;quot;\\&#039;&amp;quot;), l.newWin]);&lt;br /&gt;
		title=popupString(&#039;lastContribHint&#039;);&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;sinceMe&#039;:&lt;br /&gt;
		jsUrl=simplePrintf(&#039;javascript:getDiffSinceMyEdit(\&#039;%s\&#039;,%s)&#039;,&lt;br /&gt;
			[l.article.toString(true).split(&amp;quot;\\&amp;quot;).join(&amp;quot;\\\\&amp;quot;).split(&amp;quot;&#039;&amp;quot;).join(&amp;quot;\\&#039;&amp;quot;), l.newWin]);&lt;br /&gt;
		title=popupString(&#039;sinceMeHint&#039;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return generalNavLink({url: jsUrl, newWin: false, // can&#039;t have new windows with JS links, I think&lt;br /&gt;
				title: title, text: l.text, noPopup: l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function popupMenuLink(l) {&lt;br /&gt;
	var jsUrl=simplePrintf(&#039;javascript:%s()&#039;, [l.id]);&lt;br /&gt;
	var title=popupString(simplePrintf(&#039;%sHint&#039;, [l.id]));&lt;br /&gt;
	return generalNavLink({url: jsUrl, newWin:false, title:title, text:l.text, noPopup:l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function specialLink(l) {&lt;br /&gt;
	// properties: article, specialpage, text, sep&lt;br /&gt;
	if (typeof l.specialpage==&#039;undefined&#039;||!l.specialpage) return null;&lt;br /&gt;
	var base = pg.wiki.titlebase +  mw.config.get(&#039;wgFormattedNamespaces&#039;)[pg.nsSpecialId]+&#039;:&#039;+l.specialpage;&lt;br /&gt;
	if (typeof l.sep == &#039;undefined&#039; || l.sep===null) l.sep=&#039;&amp;amp;target=&#039;;&lt;br /&gt;
	var article=l.article.urlString({keepSpaces: l.specialpage==&#039;Search&#039;});&lt;br /&gt;
	var hint=popupString(l.specialpage+&#039;Hint&#039;);&lt;br /&gt;
	switch (l.specialpage) {&lt;br /&gt;
	case &#039;Log&#039;:&lt;br /&gt;
		switch (l.sep) {&lt;br /&gt;
		case &#039;&amp;amp;user=&#039;: hint=popupString(&#039;userLogHint&#039;); break;&lt;br /&gt;
		case &#039;&amp;amp;type=block&amp;amp;page=&#039;: hint=popupString(&#039;blockLogHint&#039;); break;&lt;br /&gt;
		case &#039;&amp;amp;page=&#039;: hint=popupString(&#039;pageLogHint&#039;); break;&lt;br /&gt;
		case &#039;&amp;amp;type=protect&amp;amp;page=&#039;: hint=popupString(&#039;protectLogHint&#039;); break;&lt;br /&gt;
		case &#039;&amp;amp;type=delete&amp;amp;page=&#039;: hint=popupString(&#039;deleteLogHint&#039;); break;&lt;br /&gt;
		default: log(&#039;Unknown log type, sep=&#039; + l.sep); hint=&#039;Missing hint (FIXME)&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;PrefixIndex&#039;: article += &#039;/&#039;; break;&lt;br /&gt;
	}&lt;br /&gt;
	if (hint) hint = simplePrintf(hint, [safeDecodeURI(l.article)]);&lt;br /&gt;
	else hint = safeDecodeURI(l.specialpage+&#039;:&#039;+l.article) ;&lt;br /&gt;
&lt;br /&gt;
	var url = base + l.sep + article;&lt;br /&gt;
	return generalNavLink({url: url, title: hint, text: l.text, newWin:l.newWin, noPopup:l.noPopup});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function generalLink(l) {&lt;br /&gt;
	// l.url, l.text, l.title, l.newWin, l.className, l.noPopup, l.onclick&lt;br /&gt;
	if (typeof l.url==&#039;undefined&#039;) return null;&lt;br /&gt;
&lt;br /&gt;
	// only quotation marks in the url can screw us up now... I think&lt;br /&gt;
	var url=l.url.split(&#039;&amp;quot;&#039;).join(&#039;%22&#039;);&lt;br /&gt;
&lt;br /&gt;
	var ret=&#039;&amp;lt;a href=&amp;quot;&#039; + url + &#039;&amp;quot;&#039;;&lt;br /&gt;
	if (typeof l.title!=&#039;undefined&#039; &amp;amp;&amp;amp; l.title) { ret += &#039; title=&amp;quot;&#039; + pg.escapeQuotesHTML(l.title) + &#039;&amp;quot;&#039;; }&lt;br /&gt;
	if (typeof l.onclick!=&#039;undefined&#039; &amp;amp;&amp;amp; l.onclick) { ret += &#039; onclick=&amp;quot;&#039; + pg.escapeQuotesHTML(l.onclick) + &#039;&amp;quot;&#039;; }&lt;br /&gt;
	if (l.noPopup) { ret += &#039; noPopup=1&#039;; }&lt;br /&gt;
	var newWin;&lt;br /&gt;
	if (typeof l.newWin==&#039;undefined&#039; || l.newWin===null) { newWin=getValueOf(&#039;popupNewWindows&#039;); }&lt;br /&gt;
	else { newWin=l.newWin; }&lt;br /&gt;
	if (newWin) { ret += &#039; target=&amp;quot;_blank&amp;quot;&#039;; }&lt;br /&gt;
	if (typeof l.className!=&#039;undefined&#039;&amp;amp;&amp;amp;l.className) { ret+=&#039; class=&amp;quot;&#039;+l.className+&#039;&amp;quot;&#039;; }&lt;br /&gt;
	ret += &#039;&amp;gt;&#039;;&lt;br /&gt;
	if (typeof l.text==typeof &#039;&#039;) { ret+= l.text; }&lt;br /&gt;
	ret +=&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function appendParamsToLink(linkstr, params) {&lt;br /&gt;
	var sp=linkstr.parenSplit(RegExp(&#039;(href=&amp;quot;[^&amp;quot;]+?)&amp;quot;&#039;, &#039;i&#039;));&lt;br /&gt;
	if (sp.length&amp;lt;2) return null;&lt;br /&gt;
	var ret=sp.shift() + sp.shift();&lt;br /&gt;
	ret += &#039;&amp;amp;&#039; + params + &#039;&amp;quot;&#039;;&lt;br /&gt;
	ret += sp.join(&#039;&#039;);&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function changeLinkTargetLink(x) { // newTarget, text, hint, summary, clickButton, minor, title (optional) {&lt;br /&gt;
	if (x.newTarget) {&lt;br /&gt;
		log (&#039;changeLinkTargetLink: newTarget=&#039; + x.newTarget);&lt;br /&gt;
	}&lt;br /&gt;
	// optional: oldTarget (in wikitext)&lt;br /&gt;
	// if x.newTarget omitted or null, remove the link&lt;br /&gt;
&lt;br /&gt;
	//x.text=encodeURI(x.text);  // this buggers things up on zh.wikipedia.org and doesn&#039;t seem necessary&lt;br /&gt;
	x.clickButton=encodeURI(x.clickButton);&lt;br /&gt;
&lt;br /&gt;
	// FIXME: first character of page title as well as namespace should be case insensitive&lt;br /&gt;
	// eg [[category:foo]] and [[Category:Foo]] are equivalent&lt;br /&gt;
	// this&#039;ll break if charAt(0) is nasty&lt;br /&gt;
	var cA=literalizeRegex(x.oldTarget);&lt;br /&gt;
	var chs=cA.charAt(0).toUpperCase();&lt;br /&gt;
	chs=&#039;[&#039;+chs + chs.toLowerCase()+&#039;]&#039;;&lt;br /&gt;
	var currentArticleRegexBit=encodeURIComponent(chs+cA.substring(1));&lt;br /&gt;
	currentArticleRegexBit=currentArticleRegexBit&lt;br /&gt;
		.split(RegExp(&#039;[_ ]+&#039;, &#039;g&#039;)).join(&#039;[_ ]+&#039;)&lt;br /&gt;
		.split( &amp;quot;%20&amp;quot; ).join(&#039;[_ ]+&#039;)&lt;br /&gt;
		.split(&#039;\\(&#039;).join(&#039;(?:%2528|\\()&#039;)&lt;br /&gt;
		.split(&#039;\\)&#039;).join(&#039;(?:%2529|\\))&#039;);&lt;br /&gt;
	// leading and trailing space should be ignored, and anchor bits optional:&lt;br /&gt;
	currentArticleRegexBit = &#039;\\s*(&#039; + currentArticleRegexBit + &#039;(?:#[^\\[\\|]*)?)\\s*&#039;;&lt;br /&gt;
	// e.g. Computer (archaic) -&amp;gt; \s*([Cc]omputer[_ ](?:%2528|\()archaic(?:%2528|\)))\s*&lt;br /&gt;
&lt;br /&gt;
	// autoedit=s~\[\[([Cc]ad)\]\]~[[Computer-aided%20design|$1]]~g;s~\[\[([Cc]AD)[|]~[[Computer-aided%20design|~g&lt;br /&gt;
&lt;br /&gt;
	var title=x.title || wgPageName.split(&#039;_&#039;).join(&#039; &#039;);&lt;br /&gt;
	var lk=titledWikiLink({article: new Title(title), newWin:x.newWin,&lt;br /&gt;
						action:  &#039;edit&#039;,&lt;br /&gt;
						text:	x.text,&lt;br /&gt;
						title:   x.hint,&lt;br /&gt;
						className: &#039;popup_change_title_link&#039;&lt;br /&gt;
						});&lt;br /&gt;
	var cmd=&#039;&#039;;&lt;br /&gt;
	if (x.newTarget) {&lt;br /&gt;
		// escape &#039;&amp;amp;&#039; and other nasties&lt;br /&gt;
		var t=encodeURIComponent(x.newTarget);&lt;br /&gt;
		var s=encodeURIComponent(literalizeRegex(x.newTarget));&lt;br /&gt;
		cmd += &#039;s~\\[\\[&#039;+currentArticleRegexBit+&#039;\\]\\]~[[&#039;+t+&#039;|$1]]~g;&#039;;&lt;br /&gt;
		cmd += &#039;s~\\[\\[&#039;+currentArticleRegexBit+&#039;[|]~[[&#039;+t+&#039;|~g;&#039;;&lt;br /&gt;
		cmd += &#039;s~\\[\\[&#039;+s + &#039;\\|&#039; + s + &#039;\\]\\]~[[&#039; + t + &#039;]]~g&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		cmd += &#039;s~\\[\\[&#039;+currentArticleRegexBit+&#039;\\]\\]~$1~g;&#039;;&lt;br /&gt;
		cmd += &#039;s~\\[\\[&#039;+currentArticleRegexBit+&#039;[|](.*?)\\]\\]~$2~g&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	cmd += &#039;&amp;amp;autoclick=&#039;+x.clickButton + &#039;&amp;amp;actoken=&#039; + autoClickToken();&lt;br /&gt;
	cmd += ( x.minor == null ) ? &#039;&#039; : &#039;&amp;amp;autominor=&#039;+x.minor;&lt;br /&gt;
	cmd += ( x.watch == null ) ? &#039;&#039; : &#039;&amp;amp;autowatch=&#039;+x.watch;&lt;br /&gt;
	cmd += &#039;&amp;amp;autosummary=&#039;+encodeURIComponent(x.summary);&lt;br /&gt;
	return appendParamsToLink(lk, &#039;autoedit=&#039;+cmd);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function redirLink(redirMatch, article) {&lt;br /&gt;
	// NB redirMatch is in wikiText&lt;br /&gt;
	var ret=&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	if (getValueOf(&#039;popupAppendRedirNavLinks&#039;) &amp;amp;&amp;amp; getValueOf(&#039;popupNavLinks&#039;)) {&lt;br /&gt;
		ret += &#039;&amp;lt;hr&amp;gt;&#039;;&lt;br /&gt;
		if (getValueOf(&#039;popupFixRedirs&#039;) &amp;amp;&amp;amp; typeof autoEdit != &#039;undefined&#039; &amp;amp;&amp;amp; autoEdit) {&lt;br /&gt;
			log(&#039;redirLink: newTarget=&#039; + redirMatch);&lt;br /&gt;
			ret += addPopupShortcut(&lt;br /&gt;
				changeLinkTargetLink(&lt;br /&gt;
				{newTarget: redirMatch, text: popupString(&#039;Redirects&#039;),&lt;br /&gt;
					hint: popupString(&#039;Fix this redirect&#039;),&lt;br /&gt;
						summary: simplePrintf(getValueOf(&#039;popupFixRedirsSummary&#039;),&lt;br /&gt;
									  [article.toString(), redirMatch ]),&lt;br /&gt;
						oldTarget: article.toString(),&lt;br /&gt;
						clickButton: getValueOf(&#039;popupRedirAutoClick&#039;), minor: true,&lt;br /&gt;
						watch: getValueOf(&#039;popupWatchRedirredPages&#039;)})&lt;br /&gt;
				, &#039;R&#039;);&lt;br /&gt;
			ret += popupString(&#039; to &#039;);&lt;br /&gt;
		}&lt;br /&gt;
		else ret += popupString(&#039;Redirects&#039;) + popupString(&#039; to &#039;);&lt;br /&gt;
		return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	else return &#039;&amp;lt;br&amp;gt; &#039; + popupString(&#039;Redirects&#039;) + popupString(&#039; to &#039;) +&lt;br /&gt;
			 titledWikiLink({article: new Title().fromWikiText(redirMatch), action: &#039;view&#039;,  /* FIXME: newWin */&lt;br /&gt;
							  text: safeDecodeURI(redirMatch), title: popupString(&#039;Bypass redirect&#039;)});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function arinLink(l) {&lt;br /&gt;
	if (!saneLinkCheck(l)) { return null; }&lt;br /&gt;
	if ( ! l.article.isIpUser() || ! pg.wiki.wikimedia) return null;&lt;br /&gt;
&lt;br /&gt;
	var uN=l.article.userName();&lt;br /&gt;
&lt;br /&gt;
	return generalNavLink({url:&#039;http://ws.arin.net/cgi-bin/whois.pl?queryinput=&#039; + encodeURIComponent(uN), newWin:l.newWin,&lt;br /&gt;
				title: tprintf(&#039;Look up %s in ARIN whois database&#039;, [uN]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function toolDbName(cookieStyle) {&lt;br /&gt;
	var ret = wgDBname;&lt;br /&gt;
	if (!cookieStyle) { ret+= &#039;_p&#039;; }&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function saneLinkCheck(l) {&lt;br /&gt;
	if (typeof l.article != typeof {} || typeof l.text != typeof &#039;&#039;) { return false; }&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
function editCounterLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
	if (! pg.wiki.wikimedia) return null;&lt;br /&gt;
	var uN=l.article.userName();&lt;br /&gt;
	var tool=getValueOf(&#039;popupEditCounterTool&#039;);&lt;br /&gt;
	var url;&lt;br /&gt;
	var soxredToolUrl=&#039;//tools.wmflabs.org/xtools/pcount/index.php?name=$1&amp;amp;lang=$2&amp;amp;wiki=$3&#039;;&lt;br /&gt;
&lt;br /&gt;
	switch(tool) {&lt;br /&gt;
	case &#039;custom&#039;:&lt;br /&gt;
		url=simplePrintf(getValueOf(&#039;popupEditCounterUrl&#039;), [ encodeURIComponent(uN), toolDbName() ]);&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;kate&#039;:&lt;br /&gt;
	case &#039;interiot&#039;:&lt;br /&gt;
	default:&lt;br /&gt;
		var theWiki=pg.wiki.hostname.split(&#039;.&#039;);&lt;br /&gt;
		url=simplePrintf(soxredToolUrl, [ encodeURIComponent(uN), theWiki[0], theWiki[1] ]);&lt;br /&gt;
	}&lt;br /&gt;
	return generalNavLink({url:url, title: tprintf(&#039;editCounterLinkHint&#039;, [uN]),&lt;br /&gt;
				newWin:l.newWin, text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function globalSearchLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
&lt;br /&gt;
	var base=&#039;http://vs.aka-online.de/cgi-bin/globalwpsearch.pl?timeout=120&amp;amp;search=&#039;;&lt;br /&gt;
	var article=l.article.urlString({keepSpaces:true});&lt;br /&gt;
&lt;br /&gt;
	return generalNavLink({url:base + article, newWin:l.newWin,&lt;br /&gt;
				title: tprintf(&#039;globalSearchHint&#039;, [safeDecodeURI(l.article)]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function googleLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
&lt;br /&gt;
	var base=&#039;http://www.google.com/search?q=&#039;;&lt;br /&gt;
	var article=l.article.urlString({keepSpaces:true});&lt;br /&gt;
&lt;br /&gt;
	return generalNavLink({url:base + &#039;%22&#039; + article + &#039;%22&#039;, newWin:l.newWin,&lt;br /&gt;
				title: tprintf(&#039;googleSearchHint&#039;, [safeDecodeURI(l.article)]),&lt;br /&gt;
				text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function editorListLink(l) {&lt;br /&gt;
	if(!saneLinkCheck(l)) return null;&lt;br /&gt;
	var article= l.article.articleFromTalkPage() || l.article;&lt;br /&gt;
		var theWiki=pg.wiki.hostname.split(&#039;.&#039;);&lt;br /&gt;
		var base=&#039;//tools.wmflabs.org/xtools/articleinfo/index.php?&amp;amp;uselang=&#039; + wgUserLanguage +&lt;br /&gt;
			&#039;lang=&#039; + theWiki[0] + &#039;&amp;amp;wiki=&#039; + theWiki[1] + &#039;&amp;amp;begin=&amp;amp;end=&amp;amp;article=&#039;&lt;br /&gt;
	return generalNavLink({url:base+article.urlString(),&lt;br /&gt;
				title: tprintf(&#039;editorListHint&#039;, [article]),&lt;br /&gt;
				newWin:l.newWin, text: l.text, noPopup:1});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function generalNavLink(l) {&lt;br /&gt;
	l.className = (l.className==null) ? &#039;popupNavLink&#039; : l.className;&lt;br /&gt;
	return generalLink(l);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// magic history links&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
function getHistoryInfo(wikipage, whatNext) {&lt;br /&gt;
	log(&#039;getHistoryInfo&#039;);&lt;br /&gt;
	getHistory(wikipage, whatNext ? function(d){whatNext(processHistory(d));} : processHistory);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// FIXME eliminate pg.idNumber ... how? :-(&lt;br /&gt;
&lt;br /&gt;
function getHistory(wikipage, onComplete) {&lt;br /&gt;
	log(&#039;getHistory&#039;);&lt;br /&gt;
	if( !window.wgEnableAPI || !wgEnableAPI ) {&lt;br /&gt;
		alert( &#039;This function of navigation popups now requires a MediaWiki &#039; + &lt;br /&gt;
			&#039;installation with the API enabled.&#039;);&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	var url = pg.wiki.apiwikibase + &#039;?format=json&amp;amp;action=query&amp;amp;prop=revisions&amp;amp;titles=&#039; +&lt;br /&gt;
			new Title(wikipage).urlString() + &#039;&amp;amp;rvlimit=&#039; + getValueOf(&#039;popupHistoryLimit&#039;);&lt;br /&gt;
	log(&#039;getHistory: url=&#039;+url);&lt;br /&gt;
	if (pg.flag.isIE) {&lt;br /&gt;
		url = url + &#039;&amp;amp;*&#039;; //to circumvent https://bugzilla.wikimedia.org/show_bug.cgi?id=28840&lt;br /&gt;
	}&lt;br /&gt;
	return startDownload(url, pg.idNumber+&#039;history&#039;, onComplete);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function processHistory(download) {&lt;br /&gt;
	var jsobj = getJsObj(download.data);&lt;br /&gt;
	try {&lt;br /&gt;
		window.x=jsobj;&lt;br /&gt;
		var p=jsobj[&#039;query&#039;][&#039;pages&#039;]&lt;br /&gt;
		for (var pageid in p) {&lt;br /&gt;
			var revisions=p[pageid][&#039;revisions&#039;];&lt;br /&gt;
			// we only get the first one&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	} catch (someError) {&lt;br /&gt;
		log(&#039;Something went wrong with JSON business&#039;);&lt;br /&gt;
		return finishProcessHistory([]);&lt;br /&gt;
	}&lt;br /&gt;
	var edits=[];&lt;br /&gt;
	for (var i=0; i&amp;lt;revisions.length; ++i) {&lt;br /&gt;
		edits.push({ oldid: revisions[i][&#039;revid&#039;], editor: revisions[i][&#039;user&#039;] });&lt;br /&gt;
	}&lt;br /&gt;
	log(&#039;processed &#039; + edits.length + &#039; edits&#039;);&lt;br /&gt;
	return finishProcessHistory(edits, wgUserName);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function finishProcessHistory(edits, userName) {&lt;br /&gt;
	var histInfo={};&lt;br /&gt;
&lt;br /&gt;
	histInfo.edits=edits;&lt;br /&gt;
	histInfo.userName=userName;&lt;br /&gt;
&lt;br /&gt;
	for (var i=0; i&amp;lt;edits.length; ++i) {&lt;br /&gt;
		if (typeof histInfo.myLastEdit == &#039;undefined&#039; &amp;amp;&amp;amp; userName &amp;amp;&amp;amp; edits[i].editor==userName) {&lt;br /&gt;
			histInfo.myLastEdit={index: i, oldid: edits[i].oldid, previd: (i==0 ? null : edits[i-1].oldid)};&lt;br /&gt;
		}&lt;br /&gt;
		if (typeof histInfo.firstNewEditor == &#039;undefined&#039; &amp;amp;&amp;amp; edits[i].editor != edits[0].editor) {&lt;br /&gt;
			histInfo.firstNewEditor={index:i, oldid:edits[i].oldid, previd: (i==0 ? null : edits[i-1].oldid)};&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	//pg.misc.historyInfo=histInfo;&lt;br /&gt;
	return histInfo;&lt;br /&gt;
}&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: links.js&lt;br /&gt;
// STARTFILE: options.js&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// options&lt;br /&gt;
&lt;br /&gt;
// check for cookies and existing value, else use default&lt;br /&gt;
function defaultize(x) {&lt;br /&gt;
	var val=null;&lt;br /&gt;
	if (x!=&#039;popupCookies&#039;) {&lt;br /&gt;
		defaultize(&#039;popupCookies&#039;);&lt;br /&gt;
		if (pg.option.popupCookies &amp;amp;&amp;amp; (val=Cookie.read(x))) {&lt;br /&gt;
			pg.option[x]=val;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if (pg.option[x]===null || typeof pg.option[x]==&#039;undefined&#039;) {&lt;br /&gt;
		if (typeof window[x] != &#039;undefined&#039; ) pg.option[x]=window[x];&lt;br /&gt;
		else pg.option[x]=pg.optionDefault[x];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function newOption(x, def) {&lt;br /&gt;
	pg.optionDefault[x]=def;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setDefault(x, def) {&lt;br /&gt;
	return newOption(x, def);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getValueOf(varName) {&lt;br /&gt;
	defaultize(varName);&lt;br /&gt;
	return pg.option[varName];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function useDefaultOptions() { // for testing&lt;br /&gt;
	for (var p in pg.optionDefault) {&lt;br /&gt;
		pg.option[p]=pg.optionDefault[p];&lt;br /&gt;
		if (typeof window[p]!=&#039;undefined&#039;) { delete window[p]; }&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setOptions() {&lt;br /&gt;
	// user-settable parameters and defaults&lt;br /&gt;
	var userIsSysop = false;&lt;br /&gt;
	if ( wgUserGroups ) {&lt;br /&gt;
		for ( var g = 0; g &amp;lt; wgUserGroups.length; ++g ) {&lt;br /&gt;
			if ( wgUserGroups[g] == &amp;quot;sysop&amp;quot; )&lt;br /&gt;
				userIsSysop = true&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Basic options&lt;br /&gt;
	newOption(&#039;popupDelay&#039;,               0.5);&lt;br /&gt;
	newOption(&#039;popupHideDelay&#039;,           0.5);&lt;br /&gt;
	newOption(&#039;simplePopups&#039;,             false);&lt;br /&gt;
	newOption(&#039;popupStructure&#039;,           &#039;shortmenus&#039;);   // see later - default for popupStructure is &#039;original&#039; if simplePopups is true&lt;br /&gt;
	newOption(&#039;popupActionsMenu&#039;,         true);&lt;br /&gt;
	newOption(&#039;popupSetupMenu&#039;,           true);&lt;br /&gt;
	newOption(&#039;popupAdminLinks&#039;,          userIsSysop);&lt;br /&gt;
	newOption(&#039;popupShortcutKeys&#039;,        false);&lt;br /&gt;
	newOption(&#039;popupHistoricalLinks&#039;,     true);&lt;br /&gt;
	newOption(&#039;popupOnlyArticleLinks&#039;,    true);&lt;br /&gt;
	newOption(&#039;removeTitles&#039;,             true);&lt;br /&gt;
	newOption(&#039;popupMaxWidth&#039;,            350);&lt;br /&gt;
	newOption(&#039;popupInitialWidth&#039;,        false); // integer or false&lt;br /&gt;
	newOption(&#039;popupSimplifyMainLink&#039;,    true);&lt;br /&gt;
	newOption(&#039;popupAppendRedirNavLinks&#039;, true);&lt;br /&gt;
	newOption(&#039;popupTocLinks&#039;,            false);&lt;br /&gt;
	newOption(&#039;popupSubpopups&#039;,           true);&lt;br /&gt;
	newOption(&#039;popupDragHandle&#039;,          false /* &#039;popupTopLinks&#039;*/);&lt;br /&gt;
	newOption(&#039;popupLazyPreviews&#039;,        true);&lt;br /&gt;
	newOption(&#039;popupLazyDownloads&#039;,       true);&lt;br /&gt;
	newOption(&#039;popupAllDabsStubs&#039;,        false);&lt;br /&gt;
	newOption(&#039;popupDebugging&#039;,           false);&lt;br /&gt;
	newOption(&#039;popupAdjustDiffDates&#039;,     true);&lt;br /&gt;
	newOption(&#039;popupActiveNavlinks&#039;,      true);&lt;br /&gt;
	newOption(&#039;popupModifier&#039;,            false); // ctrl, shift, alt or meta&lt;br /&gt;
	newOption(&#039;popupModifierAction&#039;,      &#039;enable&#039;); // or &#039;disable&#039;&lt;br /&gt;
	newOption(&#039;popupDraggable&#039;,           true);&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	// images&lt;br /&gt;
	newOption(&#039;popupImages&#039;,                 true);&lt;br /&gt;
	newOption(&#039;imagePopupsForImages&#039;,        true);&lt;br /&gt;
	newOption(&#039;popupNeverGetThumbs&#039;,         false);&lt;br /&gt;
	//newOption(&#039;popupImagesToggleSize&#039;,       true);&lt;br /&gt;
	newOption(&#039;popupThumbAction&#039;,            &#039;imagepage&#039;); //&#039;sizetoggle&#039;);&lt;br /&gt;
	newOption(&#039;popupImageSize&#039;,              60);&lt;br /&gt;
	newOption(&#039;popupImageSizeLarge&#039;,         200);&lt;br /&gt;
&lt;br /&gt;
	// redirs, dabs, reversion&lt;br /&gt;
	newOption(&#039;popupFixRedirs&#039;,             false);&lt;br /&gt;
	newOption(&#039;popupRedirAutoClick&#039;,        &#039;wpDiff&#039;);&lt;br /&gt;
	newOption(&#039;popupFixDabs&#039;,               false);&lt;br /&gt;
	newOption(&#039;popupRevertSummaryPrompt&#039;,   false);&lt;br /&gt;
	newOption(&#039;popupMinorReverts&#039;,          false);&lt;br /&gt;
	newOption(&#039;popupRedlinkRemoval&#039;,        false);&lt;br /&gt;
	newOption(&#039;popupWatchDisambiggedPages&#039;, null);&lt;br /&gt;
	newOption(&#039;popupWatchRedirredPages&#039;,    null);&lt;br /&gt;
	newOption(&#039;popupDabWiktionary&#039;,         &#039;last&#039;);&lt;br /&gt;
&lt;br /&gt;
	// navlinks&lt;br /&gt;
	newOption(&#039;popupNavLinks&#039;,          true);&lt;br /&gt;
	newOption(&#039;popupNavLinkSeparator&#039;,  &#039; &amp;amp;sdot; &#039;);&lt;br /&gt;
	newOption(&#039;popupLastEditLink&#039;,      true);&lt;br /&gt;
	newOption(&#039;popupEditCounterTool&#039;,   &#039;soxred&#039;);&lt;br /&gt;
	newOption(&#039;popupEditCounterUrl&#039;,    &#039;&#039;);&lt;br /&gt;
	newOption(&#039;popupExtraUserMenu&#039;,     &#039;&#039;);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	// previews etc&lt;br /&gt;
	newOption(&#039;popupPreviews&#039;,             true);&lt;br /&gt;
	newOption(&#039;popupSummaryData&#039;,          true);&lt;br /&gt;
	newOption(&#039;popupMaxPreviewSentences&#039;,  5);&lt;br /&gt;
	newOption(&#039;popupMaxPreviewCharacters&#039;, 600);&lt;br /&gt;
	newOption(&#039;popupLastModified&#039;,         true);&lt;br /&gt;
	newOption(&#039;popupPreviewKillTemplates&#039;, true);&lt;br /&gt;
	newOption(&#039;popupPreviewRawTemplates&#039;,  true);&lt;br /&gt;
	newOption(&#039;popupPreviewFirstParOnly&#039;,  true);&lt;br /&gt;
	newOption(&#039;popupPreviewCutHeadings&#039;,   true);&lt;br /&gt;
	newOption(&#039;popupPreviewButton&#039;,        false);&lt;br /&gt;
	newOption(&#039;popupPreviewButtonEvent&#039;,   &#039;click&#039;);&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	// diffs&lt;br /&gt;
	newOption(&#039;popupPreviewDiffs&#039;,          true);&lt;br /&gt;
	newOption(&#039;popupDiffMaxLines&#039;,          100);&lt;br /&gt;
	newOption(&#039;popupDiffContextLines&#039;,      2);&lt;br /&gt;
	newOption(&#039;popupDiffContextCharacters&#039;, 40);&lt;br /&gt;
	newOption(&#039;popupDiffDates&#039;,             true);&lt;br /&gt;
	newOption(&#039;popupDiffDatePrinter&#039;,       &#039;toLocaleString&#039;);&lt;br /&gt;
&lt;br /&gt;
	// edit summaries. God, these are ugly.&lt;br /&gt;
	newOption(&#039;popupFixDabsSummary&#039;,           popupString(&#039;defaultpopupFixDabsSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupExtendedRevertSummary&#039;,    popupString(&#039;defaultpopupExtendedRevertSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupTimeOffset&#039;,               null);&lt;br /&gt;
	newOption(&#039;popupRevertSummary&#039;,            popupString(&#039;defaultpopupRevertSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupRevertToPreviousSummary&#039;,  popupString(&#039;defaultpopupRevertToPreviousSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupQueriedRevertSummary&#039;,            popupString(&#039;defaultpopupQueriedRevertSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupQueriedRevertToPreviousSummary&#039;,  popupString(&#039;defaultpopupQueriedRevertToPreviousSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupFixRedirsSummary&#039;,         popupString(&#039;defaultpopupFixRedirsSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupRedlinkSummary&#039;,           popupString(&#039;defaultpopupRedlinkSummary&#039;) );&lt;br /&gt;
	newOption(&#039;popupRmDabLinkSummary&#039;,         popupString(&#039;defaultpopupRmDabLinkSummary&#039;) );&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
	// misc&lt;br /&gt;
	newOption(&#039;popupCookies&#039;,             false);&lt;br /&gt;
	newOption(&#039;popupHistoryLimit&#039;,        50);&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
	newOption(&#039;popupFilters&#039;,             [popupFilterStubDetect,     popupFilterDisambigDetect,&lt;br /&gt;
					       popupFilterPageSize,       popupFilterCountLinks,&lt;br /&gt;
					       popupFilterCountImages,    popupFilterCountCategories,&lt;br /&gt;
					       popupFilterLastModified]);&lt;br /&gt;
	newOption(&#039;extraPopupFilters&#039;,        []);&lt;br /&gt;
	newOption(&#039;popupOnEditSelection&#039;, &#039;cursor&#039;);&lt;br /&gt;
	newOption(&#039;popupPreviewHistory&#039;,      true);&lt;br /&gt;
	newOption(&#039;popupImageLinks&#039;,          true);&lt;br /&gt;
	newOption(&#039;popupCategoryMembers&#039;,     true);&lt;br /&gt;
	newOption(&#039;popupUserInfo&#039;,            true);&lt;br /&gt;
	newOption(&#039;popupHistoryPreviewLimit&#039;, 25);&lt;br /&gt;
	newOption(&#039;popupContribsPreviewLimit&#039;,25);&lt;br /&gt;
	newOption(&#039;popupRevDelUrl&#039;,          &#039;//en.wikipedia.org/wiki/Wikipedia:Revision_deletion&#039;);&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	// new windows&lt;br /&gt;
	newOption(&#039;popupNewWindows&#039;,     false);&lt;br /&gt;
	newOption(&#039;popupLinksNewWindow&#039;, {&#039;lastContrib&#039;: true, &#039;sinceMe&#039;: true});&lt;br /&gt;
&lt;br /&gt;
	// regexps&lt;br /&gt;
	newOption(&#039;popupDabRegexp&#039;, &#039;(\\{\\{\\s*disambig(?!uation needed)|disambig\\s*\\}\\}|disamb\\s*\\}\\}|dab\\s*\\}\\})|\\{\\{\\s*(((geo|hn|road?|school|number)dis)|[234][lc][acw]|(road|ship)index)(\\s*[|][^}]*)?\\s*[}][}]|is a .*disambiguation.*page&#039;);&lt;br /&gt;
	newOption(&#039;popupAnchorRegexp&#039;, &#039;anchors?&#039;); //how to identify an anchors template&lt;br /&gt;
	newOption(&#039;popupStubRegexp&#039;, &#039;(sect)?stub[}][}]|This .*-related article is a .*stub&#039;);&lt;br /&gt;
	newOption(&#039;popupImageVarsRegexp&#039;, &#039;image|image_(?:file|skyline|name|flag|seal)|cover|badge|logo&#039;);&lt;br /&gt;
}&lt;br /&gt;
// ENDFILE: options.js&lt;br /&gt;
// STARTFILE: strings.js&lt;br /&gt;
//&amp;lt;NOLITE&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
// Translatable strings&lt;br /&gt;
//////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
// See instructions at&lt;br /&gt;
// http://en.wikipedia.org/wiki/Wikipedia:Tools/Navigation_popups/Translation&lt;br /&gt;
&lt;br /&gt;
pg.string = {&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// summary data, searching etc.&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;article&#039;: &#039;article&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;category&#039;,&lt;br /&gt;
	&#039;categories&#039;: &#039;categories&#039;,&lt;br /&gt;
	&#039;image&#039;: &#039;image&#039;,&lt;br /&gt;
	&#039;images&#039;: &#039;images&#039;,&lt;br /&gt;
	&#039;stub&#039;: &#039;stub&#039;,&lt;br /&gt;
	&#039;section stub&#039;: &#039;section stub&#039;,&lt;br /&gt;
	&#039;Empty page&#039;: &#039;Empty page&#039;,&lt;br /&gt;
	&#039;kB&#039;: &#039;kB&#039;,&lt;br /&gt;
	&#039;bytes&#039;: &#039;bytes&#039;,&lt;br /&gt;
	&#039;day&#039;: &#039;day&#039;,&lt;br /&gt;
	&#039;days&#039;: &#039;days&#039;,&lt;br /&gt;
	&#039;hour&#039;: &#039;hour&#039;,&lt;br /&gt;
	&#039;hours&#039;: &#039;hours&#039;,&lt;br /&gt;
	&#039;minute&#039;: &#039;minute&#039;,&lt;br /&gt;
	&#039;minutes&#039;: &#039;minutes&#039;,&lt;br /&gt;
	&#039;second&#039;: &#039;second&#039;,&lt;br /&gt;
	&#039;seconds&#039;: &#039;seconds&#039;,&lt;br /&gt;
	&#039;week&#039;: &#039;week&#039;,&lt;br /&gt;
	&#039;weeks&#039;: &#039;weeks&#039;,&lt;br /&gt;
	&#039;search&#039;: &#039;search&#039;,&lt;br /&gt;
	&#039;SearchHint&#039;: &#039;Find English Wikipedia articles containing %s&#039;,&lt;br /&gt;
	&#039;web&#039;: &#039;web&#039;,&lt;br /&gt;
	&#039;global&#039;: &#039;global&#039;,&lt;br /&gt;
	&#039;globalSearchHint&#039;: &#039;Search across Wikipedias in different languages for %s&#039;,&lt;br /&gt;
	&#039;googleSearchHint&#039;: &#039;Google for %s&#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// article-related actions and info&lt;br /&gt;
	// (some actions also apply to user pages)&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;actions&#039;: &#039;actions&#039;,		 ///// view articles and view talk&lt;br /&gt;
	&#039;popupsMenu&#039;: &#039;popups&#039;,&lt;br /&gt;
	&#039;togglePreviewsHint&#039;: &#039;Toggle preview generation in popups on this page&#039;,&lt;br /&gt;
	&#039;enable previews&#039;: &#039;enable previews&#039;,&lt;br /&gt;
	&#039;disable previews&#039;: &#039;disable previews&#039;,&lt;br /&gt;
	&#039;toggle previews&#039;: &#039;toggle previews&#039;,&lt;br /&gt;
	&#039;show preview&#039;: &#039;show preview&#039;,&lt;br /&gt;
	&#039;reset&#039;: &#039;reset&#039;,&lt;br /&gt;
	&#039;more...&#039;: &#039;more...&#039;,&lt;br /&gt;
	&#039;disable&#039;: &#039;disable popups&#039;,&lt;br /&gt;
	&#039;disablePopupsHint&#039;: &#039;Disable popups on this page. Reload page to re-enable.&#039;,&lt;br /&gt;
	&#039;historyfeedHint&#039;: &#039;RSS feed of recent changes to this page&#039;,&lt;br /&gt;
	&#039;purgePopupsHint&#039;: &#039;Reset popups, clearing all cached popup data.&#039;,&lt;br /&gt;
	&#039;PopupsHint&#039;: &#039;Reset popups, clearing all cached popup data.&#039;,&lt;br /&gt;
	&#039;spacebar&#039;: &#039;space&#039;,&lt;br /&gt;
	&#039;view&#039;: &#039;view&#039;,&lt;br /&gt;
	&#039;view article&#039;: &#039;view article&#039;,&lt;br /&gt;
	&#039;viewHint&#039;: &#039;Go to %s&#039;,&lt;br /&gt;
	&#039;talk&#039;: &#039;talk&#039;,&lt;br /&gt;
	&#039;talk page&#039;: &#039;talk page&#039;,&lt;br /&gt;
	&#039;this&amp;amp;nbsp;revision&#039;: &#039;this&amp;amp;nbsp;revision&#039;,&lt;br /&gt;
	&#039;revision %s of %s&#039;: &#039;revision %s of %s&#039;,&lt;br /&gt;
	&#039;Revision %s of %s&#039;: &#039;Revision %s of %s&#039;,&lt;br /&gt;
	&#039;the revision prior to revision %s of %s&#039;: &#039;the revision prior to revision %s of %s&#039;,&lt;br /&gt;
	&#039;Toggle image size&#039;: &#039;Click to toggle image size&#039;,&lt;br /&gt;
	&#039;del&#039;: &#039;del&#039;,				 ///// delete, protect, move&lt;br /&gt;
	&#039;delete&#039;: &#039;delete&#039;,&lt;br /&gt;
	&#039;deleteHint&#039;: &#039;Delete %s&#039;,&lt;br /&gt;
	&#039;undeleteShort&#039;: &#039;un&#039;,&lt;br /&gt;
	&#039;UndeleteHint&#039;: &#039;Show the deletion history for %s&#039;,&lt;br /&gt;
	&#039;protect&#039;: &#039;protect&#039;,&lt;br /&gt;
	&#039;protectHint&#039;: &#039;Restrict editing rights to %s&#039;,&lt;br /&gt;
	&#039;unprotectShort&#039;: &#039;un&#039;,&lt;br /&gt;
	&#039;unprotectHint&#039;: &#039;Allow %s to be edited by anyone again&#039;,&lt;br /&gt;
	&#039;move&#039;: &#039;move&#039;,&lt;br /&gt;
	&#039;move page&#039;: &#039;move page&#039;,&lt;br /&gt;
	&#039;MovepageHint&#039;: &#039;Change the title of %s&#039;,&lt;br /&gt;
	&#039;edit&#039;: &#039;edit&#039;,			   ///// edit articles and talk&lt;br /&gt;
	&#039;edit article&#039;: &#039;edit article&#039;,&lt;br /&gt;
	&#039;editHint&#039;: &#039;Change the content of %s&#039;,&lt;br /&gt;
	&#039;edit talk&#039;: &#039;edit talk&#039;,&lt;br /&gt;
	&#039;new&#039;: &#039;new&#039;,&lt;br /&gt;
	&#039;new topic&#039;: &#039;new topic&#039;,&lt;br /&gt;
	&#039;newSectionHint&#039;: &#039;Start a new section on %s&#039;,&lt;br /&gt;
	&#039;null edit&#039;: &#039;null edit&#039;,&lt;br /&gt;
	&#039;nullEditHint&#039;: &#039;Submit an edit to %s, making no changes &#039;,&lt;br /&gt;
	&#039;hist&#039;: &#039;hist&#039;,			   ///// history, diffs, editors, related&lt;br /&gt;
	&#039;history&#039;: &#039;history&#039;,&lt;br /&gt;
	&#039;historyHint&#039;: &#039;List the changes made to %s&#039;,&lt;br /&gt;
	&#039;last&#039;: &#039;last&#039;,&lt;br /&gt;
	&#039;lastEdit&#039;: &#039;lastEdit&#039;,&lt;br /&gt;
	&#039;mark patrolled&#039;: &#039;mark patrolled&#039;,&lt;br /&gt;
	&#039;markpatrolledHint&#039;: &#039;Mark this edit as patrolled&#039;,&lt;br /&gt;
	&#039;show last edit&#039;: &#039;most recent edit&#039;,&lt;br /&gt;
	&#039;Show the last edit&#039;: &#039;Show the effects of the most recent change&#039;,&lt;br /&gt;
	&#039;lastContrib&#039;: &#039;lastContrib&#039;,&lt;br /&gt;
	&#039;last set of edits&#039;: &#039;latest edits&#039;,&lt;br /&gt;
	&#039;lastContribHint&#039;: &#039;Show the net effect of changes made by the last editor&#039;,&lt;br /&gt;
	&#039;cur&#039;: &#039;cur&#039;,&lt;br /&gt;
	&#039;diffCur&#039;: &#039;diffCur&#039;,&lt;br /&gt;
	&#039;Show changes since revision %s&#039;: &#039;Show changes since revision %s&#039;,&lt;br /&gt;
	&#039;%s old&#039;: &#039;%s old&#039;, // as in 4 weeks old&lt;br /&gt;
	&#039;oldEdit&#039;: &#039;oldEdit&#039;,&lt;br /&gt;
	&#039;purge&#039;: &#039;purge&#039;,&lt;br /&gt;
	&#039;purgeHint&#039;: &#039;Demand a fresh copy of %s&#039;,&lt;br /&gt;
	&#039;raw&#039;: &#039;source&#039;,&lt;br /&gt;
	&#039;rawHint&#039;: &#039;Download the source of %s&#039;,&lt;br /&gt;
	&#039;render&#039;: &#039;simple&#039;,&lt;br /&gt;
	&#039;renderHint&#039;: &#039;Show a plain HTML version of %s&#039;,&lt;br /&gt;
	&#039;Show the edit made to get revision&#039;: &#039;Show the edit made to get revision&#039;,&lt;br /&gt;
	&#039;sinceMe&#039;: &#039;sinceMe&#039;,&lt;br /&gt;
	&#039;changes since mine&#039;: &#039;diff my edit&#039;,&lt;br /&gt;
	&#039;sinceMeHint&#039;: &#039;Show changes since my last edit&#039;,&lt;br /&gt;
	&#039;Couldn\&#039;t find an edit by %s\nin the last %s edits to\n%s&#039;: &#039;Couldn\&#039;t find an edit by %s\nin the last %s edits to\n%s&#039;,&lt;br /&gt;
	&#039;eds&#039;: &#039;eds&#039;,&lt;br /&gt;
	&#039;editors&#039;: &#039;editors&#039;,&lt;br /&gt;
	&#039;editorListHint&#039;: &#039;List the users who have edited %s&#039;,&lt;br /&gt;
	&#039;related&#039;: &#039;related&#039;,&lt;br /&gt;
	&#039;relatedChanges&#039;: &#039;relatedChanges&#039;,&lt;br /&gt;
	&#039;related changes&#039;: &#039;related changes&#039;,&lt;br /&gt;
	&#039;RecentchangeslinkedHint&#039;: &#039;Show changes in articles related to %s&#039;,&lt;br /&gt;
	&#039;editOld&#039;: &#039;editOld&#039;,		  ///// edit old version, or revert&lt;br /&gt;
	&#039;rv&#039;: &#039;rv&#039;,&lt;br /&gt;
	&#039;revert&#039;: &#039;revert&#039;,&lt;br /&gt;
	&#039;revertHint&#039;: &#039;Revert to %s&#039;,&lt;br /&gt;
	&#039;defaultpopupRedlinkSummary&#039;: &#039;Removing link to empty page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupFixDabsSummary&#039;: &#039;Disambiguate [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupFixRedirsSummary&#039;: &#039;Redirect bypass from [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupExtendedRevertSummary&#039;: &#039;Revert to revision dated %s by %s, oldid %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupRevertToPreviousSummary&#039;: &#039;Revert to the revision prior to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupRevertSummary&#039;: &#039;Revert to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupQueriedRevertToPreviousSummary&#039;: &#039;Revert to the revision prior to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupQueriedRevertSummary&#039;: &#039;Revert to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;defaultpopupRmDabLinkSummary&#039;: &#039;Remove link to dab page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]&#039;,&lt;br /&gt;
	&#039;Redirects&#039;: &#039;Redirects&#039;, // as in Redirects to ...&lt;br /&gt;
	&#039; to &#039;: &#039; to &#039;,		   // as in Redirects to ...&lt;br /&gt;
	&#039;Bypass redirect&#039;: &#039;Bypass redirect&#039;,&lt;br /&gt;
	&#039;Fix this redirect&#039;: &#039;Fix this redirect&#039;,&lt;br /&gt;
	&#039;disambig&#039;: &#039;disambig&#039;,		  ///// add or remove dab etc.&lt;br /&gt;
	&#039;disambigHint&#039;: &#039;Disambiguate this link to [[%s]]&#039;,&lt;br /&gt;
	&#039;Click to disambiguate this link to:&#039;: &#039;Click to disambiguate this link to:&#039;,&lt;br /&gt;
	&#039;remove this link&#039;: &#039;remove this link&#039;,&lt;br /&gt;
	&#039;remove all links to this page from this article&#039;: &#039;remove all links to this page from this article&#039;,&lt;br /&gt;
	&#039;remove all links to this disambig page from this article&#039;: &#039;remove all links to this disambig page from this article&#039;,&lt;br /&gt;
	&#039;mainlink&#039;: &#039;mainlink&#039;,		  ///// links, watch, unwatch&lt;br /&gt;
	&#039;wikiLink&#039;: &#039;wikiLink&#039;,&lt;br /&gt;
	&#039;wikiLinks&#039;: &#039;wikiLinks&#039;,&lt;br /&gt;
	&#039;links here&#039;: &#039;links here&#039;,&lt;br /&gt;
	&#039;whatLinksHere&#039;: &#039;whatLinksHere&#039;,&lt;br /&gt;
	&#039;what links here&#039;: &#039;what links here&#039;,&lt;br /&gt;
	&#039;WhatlinkshereHint&#039;: &#039;List the pages that are hyperlinked to %s&#039;,&lt;br /&gt;
	&#039;unwatchShort&#039;: &#039;un&#039;,&lt;br /&gt;
	&#039;watchThingy&#039;: &#039;watch&#039;,  // called watchThingy because {}.watch is a function&lt;br /&gt;
	&#039;watchHint&#039;: &#039;Add %s to my watchlist&#039;,&lt;br /&gt;
	&#039;unwatchHint&#039;: &#039;Remove %s from my watchlist&#039;,&lt;br /&gt;
	&#039;Only found one editor: %s made %s edits&#039;: &#039;Only found one editor: %s made %s edits&#039;,&lt;br /&gt;
	&#039;%s seems to be the last editor to the page %s&#039;: &#039;%s seems to be the last editor to the page %s&#039;,&lt;br /&gt;
	&#039;rss&#039;: &#039;rss&#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// diff previews&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;Diff truncated for performance reasons&#039;: &#039;Diff truncated for performance reasons&#039;,&lt;br /&gt;
	&#039;Old revision&#039;: &#039;Old revision&#039;,&lt;br /&gt;
	&#039;New revision&#039;: &#039;New revision&#039;,&lt;br /&gt;
	&#039;Something went wrong :-(&#039;: &#039;Something went wrong :-(&#039;,&lt;br /&gt;
	&#039;Empty revision, maybe non-existent&#039;: &#039;Empty revision, maybe non-existent&#039;,&lt;br /&gt;
	&#039;Unknown date&#039;: &#039;Unknown date&#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// other special previews&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;Empty category&#039;: &#039;Empty category&#039;,&lt;br /&gt;
	&#039;Category members (%s shown)&#039;: &#039;Category members (%s shown)&#039;,&lt;br /&gt;
	&#039;No image links found&#039;: &#039;No image links found&#039;,&lt;br /&gt;
	&#039;File links&#039;: &#039;File links&#039;,&lt;br /&gt;
	&#039;No image found&#039;: &#039;No image found&#039;,&lt;br /&gt;
	&#039;Image from Commons&#039;: &#039;Image from Commons&#039;,&lt;br /&gt;
	&#039;Description page&#039;: &#039;Description page&#039;,&lt;br /&gt;
	&#039;Alt text:&#039;: &#039;Alt text:&#039;,&lt;br /&gt;
	&#039;revdel&#039;:&#039;Hidden revision&#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// user-related actions and info&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;user&#039;: &#039;user&#039;,			   ///// user page, talk, email, space&lt;br /&gt;
	&#039;user&amp;amp;nbsp;page&#039;: &#039;user&amp;amp;nbsp;page&#039;,&lt;br /&gt;
	&#039;user talk&#039;: &#039;user talk&#039;,&lt;br /&gt;
	&#039;edit user talk&#039;: &#039;edit user talk&#039;,&lt;br /&gt;
	&#039;leave comment&#039;: &#039;leave comment&#039;,&lt;br /&gt;
	&#039;email&#039;: &#039;email&#039;,&lt;br /&gt;
	&#039;email user&#039;: &#039;email user&#039;,&lt;br /&gt;
	&#039;EmailuserHint&#039;: &#039;Send an email to %s&#039;,&lt;br /&gt;
	&#039;space&#039;: &#039;space&#039;, // short form for userSpace link&lt;br /&gt;
	&#039;PrefixIndexHint&#039;: &#039;Show pages in the userspace of %s&#039;,&lt;br /&gt;
	&#039;count&#039;: &#039;count&#039;,			 ///// contributions, log&lt;br /&gt;
	&#039;edit counter&#039;: &#039;edit counter&#039;,&lt;br /&gt;
	&#039;editCounterLinkHint&#039;: &#039;Count the contributions made by %s&#039;,&lt;br /&gt;
	&#039;contribs&#039;: &#039;contribs&#039;,&lt;br /&gt;
	&#039;contributions&#039;: &#039;contributions&#039;,&lt;br /&gt;
	&#039;deletedContribs&#039;: &#039;deleted contributions&#039;,&lt;br /&gt;
	&#039;DeletedcontributionsHint&#039;: &#039;List deleted edits made by %s&#039;,&lt;br /&gt;
	&#039;ContributionsHint&#039;: &#039;List the contributions made by %s&#039;,&lt;br /&gt;
	&#039;log&#039;: &#039;log&#039;,&lt;br /&gt;
	&#039;user log&#039;: &#039;user log&#039;,&lt;br /&gt;
	&#039;userLogHint&#039;: &#039;Show %s\&#039;s user log&#039;,&lt;br /&gt;
	&#039;arin&#039;: &#039;ARIN lookup&#039;,			 ///// ARIN lookup, block user or IP&lt;br /&gt;
	&#039;Look up %s in ARIN whois database&#039;: &#039;Look up %s in the ARIN whois database&#039;,&lt;br /&gt;
	&#039;unblockShort&#039;: &#039;un&#039;,&lt;br /&gt;
	&#039;block&#039;: &#039;block&#039;,&lt;br /&gt;
	&#039;block user&#039;: &#039;block user&#039;,&lt;br /&gt;
	&#039;IpblocklistHint&#039;: &#039;Unblock %s&#039;,&lt;br /&gt;
	&#039;BlockipHint&#039;: &#039;Prevent %s from editing&#039;,&lt;br /&gt;
	&#039;block log&#039;: &#039;block log&#039;,&lt;br /&gt;
	&#039;blockLogHint&#039;: &#039;Show the block log for %s&#039;,&lt;br /&gt;
	&#039;protectLogHint&#039;: &#039;Show the protection log for %s&#039;,&lt;br /&gt;
	&#039;pageLogHint&#039;: &#039;Show the page log for %s&#039;,&lt;br /&gt;
	&#039;deleteLogHint&#039;: &#039;Show the deletion log for %s&#039;,&lt;br /&gt;
	&#039;Invalid %s %s&#039;: &#039;The option %s is invalid: %s&#039;,&lt;br /&gt;
	&#039;No backlinks found&#039;: &#039;No backlinks found&#039;,&lt;br /&gt;
	&#039; and more&#039;: &#039; and more&#039;,&lt;br /&gt;
	&#039;undo&#039;: &#039;undo&#039;,&lt;br /&gt;
	&#039;undoHint&#039;: &#039;undo this edit&#039;,&lt;br /&gt;
	&#039;Download preview data&#039;: &#039;Download preview data&#039;,&lt;br /&gt;
	&#039;Invalid or IP user&#039;: &#039;Invalid or IP user&#039;,&lt;br /&gt;
	&#039;Not a registered username&#039;: &#039;Not a registered username&#039;,&lt;br /&gt;
	&#039;BLOCKED&#039;: &#039;BLOCKED&#039;,&lt;br /&gt;
	&#039; edits since: &#039;: &#039; edits since: &#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// Autoediting&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;Enter a non-empty edit summary or press cancel to abort&#039;: &#039;Enter a non-empty edit summary or press cancel to abort&#039;,&lt;br /&gt;
	&#039;Failed to get revision information, please edit manually.\n\n&#039;: &#039;Failed to get revision information, please edit manually.\n\n&#039;,&lt;br /&gt;
	&#039;The %s button has been automatically clicked. Please wait for the next page to load.&#039;: &#039;The %s button has been automatically clicked. Please wait for the next page to load.&#039;,&lt;br /&gt;
	&#039;Could not find button %s. Please check the settings in your javascript file.&#039;: &#039;Could not find button %s. Please check the settings in your javascript file.&#039;,&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	// Popups setup&lt;br /&gt;
	/////////////////////////////////////&lt;br /&gt;
	&#039;Open full-size image&#039;: &#039;Open full-size image&#039;,&lt;br /&gt;
	&#039;zxy&#039;: &#039;zxy&#039;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function popupString(str) {&lt;br /&gt;
	if (typeof popupStrings != &#039;undefined&#039; &amp;amp;&amp;amp; popupStrings &amp;amp;&amp;amp; popupStrings[str]) { return popupStrings[str]; }&lt;br /&gt;
	if (pg.string[str]) { return pg.string[str]; }&lt;br /&gt;
	return str;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function tprintf(str,subs) {&lt;br /&gt;
	if (typeof subs != typeof []) { subs = [subs]; }&lt;br /&gt;
	return simplePrintf(popupString(str), subs);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/NOLITE&amp;gt;&lt;br /&gt;
// ENDFILE: strings.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Run things&lt;br /&gt;
////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
hookEvent(&#039;load&#039;, setupPopups);&lt;br /&gt;
addOnloadHook(autoEdit);&lt;br /&gt;
&lt;br /&gt;
// Support for MediaWiki&#039;s live preview, VisualEditor&#039;s saves and Echo&#039;s flyout.&lt;br /&gt;
( function () {&lt;br /&gt;
	var once = true;&lt;br /&gt;
	function dynamicContentHandler( $content ) {&lt;br /&gt;
		// Try to detect the hook fired on initial page load and disregard&lt;br /&gt;
		// it, we already hook to onload (possibly to different parts of&lt;br /&gt;
		// page - it&#039;s configurable) and running twice might be bad. Ugly…&lt;br /&gt;
		if ( $content.attr( &#039;id&#039; ) == &#039;mw-content-text&#039; ) {&lt;br /&gt;
			if ( once ) {&lt;br /&gt;
				once = false;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function doIt () {&lt;br /&gt;
			$content.each( function () {&lt;br /&gt;
				this.ranSetupTooltipsAlready = false;&lt;br /&gt;
				setupTooltips( this );&lt;br /&gt;
			} );&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if ( !setupPopups.completed ) {&lt;br /&gt;
			setupPopups( doIt );&lt;br /&gt;
		} else {&lt;br /&gt;
			doIt();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This hook is also fired after page load.&lt;br /&gt;
	mw.hook( &#039;wikipage.content&#039; ).add( dynamicContentHandler );&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;ext.echo.overlay.beforeShowingOverlay&#039; ).add( function($overlay){&lt;br /&gt;
		dynamicContentHandler( $overlay.find(&amp;quot;.mw-echo-state&amp;quot;) );&lt;br /&gt;
	});&lt;br /&gt;
} )();&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinkleprotect.js&amp;diff=23212</id>
		<title>MediaWiki:Gadget-twinkleprotect.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinkleprotect.js&amp;diff=23212"/>
		<updated>2013-12-15T12:25:31Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-662-g5d477ae: protect: Adjust weightings per comment at WT:TW; protect: Improve protection weighting logic; ffd: Make NFCR more palatable in article space; Remove unused pref speedyPromptOnG7; morebits: Add style attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinkleprotect.js: Protect/RPP module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;PP&amp;quot;/&amp;quot;RPP&amp;quot;)&lt;br /&gt;
 * Active on:              Non-special pages&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// Note: a lot of code in this module is re-used/called by batchprotect.&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect = function twinkleprotect() {&lt;br /&gt;
	if ( mw.config.get(&#039;wgNamespaceNumber&#039;) &amp;lt; 0 ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Twinkle.addPortletLink(Twinkle.protect.callback, Morebits.userIsInGroup(&#039;sysop&#039;) ? &amp;quot;PP&amp;quot; : &amp;quot;RPP&amp;quot;, &amp;quot;tw-rpp&amp;quot;,&lt;br /&gt;
		Morebits.userIsInGroup(&#039;sysop&#039;) ? &amp;quot;Protect page&amp;quot; : &amp;quot;Request page protection&amp;quot; );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.callback = function twinkleprotectCallback() {&lt;br /&gt;
	Twinkle.protect.protectionLevel = null;&lt;br /&gt;
&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 620, 530 );&lt;br /&gt;
	Window.setTitle( Morebits.userIsInGroup( &#039;sysop&#039; ) ? &amp;quot;Apply, request or tag page protection&amp;quot; : &amp;quot;Request or tag page protection&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Protection templates&amp;quot;, &amp;quot;Template:Protection templates&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Protection policy&amp;quot;, &amp;quot;WP:PROT&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#protect&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.protect.callback.evaluate );&lt;br /&gt;
	var actionfield = form.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			label: &#039;Type of action&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	if( Morebits.userIsInGroup( &#039;sysop&#039; ) ) {&lt;br /&gt;
		actionfield.append( {&lt;br /&gt;
				type: &#039;radio&#039;,&lt;br /&gt;
				name: &#039;actiontype&#039;,&lt;br /&gt;
				event: Twinkle.protect.callback.changeAction,&lt;br /&gt;
				list: [&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Protect page&#039;,&lt;br /&gt;
						value: &#039;protect&#039;,&lt;br /&gt;
						tooltip: &#039;Apply actual protection to the page.&#039;,&lt;br /&gt;
						checked: true&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			} );&lt;br /&gt;
	}&lt;br /&gt;
	actionfield.append( {&lt;br /&gt;
			type: &#039;radio&#039;,&lt;br /&gt;
			name: &#039;actiontype&#039;,&lt;br /&gt;
			event: Twinkle.protect.callback.changeAction,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Request page protection&#039;,&lt;br /&gt;
					value: &#039;request&#039;,&lt;br /&gt;
					tooltip: &#039;If you want to request protection via WP:RPP&#039; + (Morebits.userIsInGroup(&#039;sysop&#039;) ? &#039; instead of doing the protection by yourself.&#039; : &#039;.&#039;),&lt;br /&gt;
					checked: !Morebits.userIsInGroup(&#039;sysop&#039;)&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Tag page with protection template&#039;,&lt;br /&gt;
					value: &#039;tag&#039;,&lt;br /&gt;
					tooltip: &#039;If the protecting admin forgot to apply a protection template, or you have just protected the page without tagging, you can use this to apply the appropriate protection tag.&#039;,&lt;br /&gt;
					disabled: mw.config.get(&#039;wgArticleId&#039;) === 0&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	form.append({ type: &#039;field&#039;, label: &#039;Preset&#039;, name: &#039;field_preset&#039; });&lt;br /&gt;
	form.append({ type: &#039;field&#039;, label: &#039;1&#039;, name: &#039;field1&#039; });&lt;br /&gt;
	form.append({ type: &#039;field&#039;, label: &#039;2&#039;, name: &#039;field2&#039; });&lt;br /&gt;
&lt;br /&gt;
	form.append( { type:&#039;submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
	var result = form.render();&lt;br /&gt;
	Window.setContent( result );&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	// We must init the controls&lt;br /&gt;
	var evt = document.createEvent( &amp;quot;Event&amp;quot; );&lt;br /&gt;
	evt.initEvent( &#039;change&#039;, true, true );&lt;br /&gt;
	result.actiontype[0].dispatchEvent( evt );&lt;br /&gt;
&lt;br /&gt;
	// get current protection level asynchronously&lt;br /&gt;
	if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
		Morebits.wiki.actionCompleted.postfix = false;  // avoid Action: completed notice&lt;br /&gt;
		Morebits.status.init($(&#039;div[name=&amp;quot;currentprot&amp;quot;] span&#039;).last()[0]);&lt;br /&gt;
	}&lt;br /&gt;
	Twinkle.protect.fetchProtectionLevel();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Current protection level in a human-readable format&lt;br /&gt;
// (a string, or null if no protection; only filled for sysops)&lt;br /&gt;
Twinkle.protect.protectionLevel = null;  &lt;br /&gt;
// Contains the current protection level in an object&lt;br /&gt;
// Once filled, it will look something like:&lt;br /&gt;
// { edit: { level: &amp;quot;sysop&amp;quot;, expiry: &amp;lt;some date&amp;gt;, cascade: true }, ... }&lt;br /&gt;
Twinkle.protect.currentProtectionLevels = {};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.fetchProtectionLevel = function twinkleprotectFetchProtectionLevel() {&lt;br /&gt;
&lt;br /&gt;
	var api = new mw.Api();&lt;br /&gt;
	api.get({&lt;br /&gt;
		format: &#039;json&#039;,&lt;br /&gt;
		indexpageids: true,&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		prop: &#039;info|flagged&#039;,&lt;br /&gt;
		inprop: &#039;protection&#039;,&lt;br /&gt;
		titles: mw.config.get(&#039;wgPageName&#039;)&lt;br /&gt;
	})&lt;br /&gt;
	.done(function(data){&lt;br /&gt;
		var pageid = data.query.pageids[0];&lt;br /&gt;
		var page = data.query.pages[pageid];&lt;br /&gt;
		var result = [];&lt;br /&gt;
		var current = {};&lt;br /&gt;
&lt;br /&gt;
		var updateResult = function(label, level, expiry, cascade) {&lt;br /&gt;
			// for sysops, stringify, so they can base their decision on existing protection&lt;br /&gt;
			if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
				var boldnode = document.createElement(&#039;b&#039;);&lt;br /&gt;
				boldnode.textContent = label + &amp;quot;: &amp;quot; + level;&lt;br /&gt;
				result.push(boldnode);&lt;br /&gt;
				if (expiry === &#039;infinity&#039;) {&lt;br /&gt;
					result.push(&amp;quot; (indefinite) &amp;quot;);&lt;br /&gt;
				} else {&lt;br /&gt;
					result.push(&amp;quot; (expires &amp;quot; + new Date(expiry).toUTCString() + &amp;quot;) &amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
				if (cascade) {&lt;br /&gt;
					result.push(&amp;quot;(cascading) &amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		$.each(page.protection, function( index, protection ) {&lt;br /&gt;
			if (protection.type !== &amp;quot;aft&amp;quot;) {&lt;br /&gt;
				current[protection.type] = {&lt;br /&gt;
					level: protection.level,&lt;br /&gt;
					expiry: protection.expiry,&lt;br /&gt;
					cascade: protection.cascade === &#039;&#039;&lt;br /&gt;
				};&lt;br /&gt;
				updateResult( Morebits.string.toUpperCaseFirstChar(protection.type), protection.level, protection.expiry, protection.cascade );&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		if(page.flagged) {&lt;br /&gt;
			current.stabilize = {&lt;br /&gt;
				level: page.flagged.protection_level,&lt;br /&gt;
				expiry: page.flagged.protection_expiry&lt;br /&gt;
			};&lt;br /&gt;
			// FlaggedRevision gives bad date&lt;br /&gt;
			updateResult( &#039;Pending Changes&#039;, page.flagged.protection_level, page.flagged.protection_expiry, false );			&lt;br /&gt;
		} &lt;br /&gt;
&lt;br /&gt;
		// show the protection level to sysops&lt;br /&gt;
		if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			if (!result.length) {&lt;br /&gt;
				var boldnode = document.createElement(&#039;b&#039;);&lt;br /&gt;
				boldnode.textContent = &amp;quot;no protection&amp;quot;;&lt;br /&gt;
				result.push(boldnode);&lt;br /&gt;
			}&lt;br /&gt;
			Twinkle.protect.protectionLevel = result;&lt;br /&gt;
			Morebits.status.init($(&#039;div[name=&amp;quot;currentprot&amp;quot;] span&#039;).last()[0]);&lt;br /&gt;
			Morebits.status.info(&amp;quot;Current protection level&amp;quot;, Twinkle.protect.protectionLevel);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		Twinkle.protect.currentProtectionLevels = current;&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.callback.changeAction = function twinkleprotectCallbackChangeAction(e) {&lt;br /&gt;
	var field_preset;&lt;br /&gt;
	var field1;&lt;br /&gt;
	var field2;&lt;br /&gt;
	var isTemplate = mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) === 10 || mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) === 828;&lt;br /&gt;
&lt;br /&gt;
	switch (e.target.values) {&lt;br /&gt;
		case &#039;protect&#039;:&lt;br /&gt;
			field_preset = new Morebits.quickForm.element({ type: &#039;field&#039;, label: &#039;Preset&#039;, name: &#039;field_preset&#039; });&lt;br /&gt;
			field_preset.append({&lt;br /&gt;
					type: &#039;select&#039;,&lt;br /&gt;
					name: &#039;category&#039;,&lt;br /&gt;
					label: &#039;Choose a preset:&#039;,&lt;br /&gt;
					event: Twinkle.protect.callback.changePreset,&lt;br /&gt;
					list: (mw.config.get(&#039;wgArticleId&#039;) ? &lt;br /&gt;
						Twinkle.protect.protectionTypes.filter(function(v) {&lt;br /&gt;
							return isTemplate || v.label !== &#039;Template protection&#039;;&lt;br /&gt;
						}) : &lt;br /&gt;
						Twinkle.protect.protectionTypesCreate)&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			field2 = new Morebits.quickForm.element({ type: &#039;field&#039;, label: &#039;Protection options&#039;, name: &#039;field2&#039; });&lt;br /&gt;
			field2.append({ type: &#039;div&#039;, name: &#039;currentprot&#039;, label: &#039; &#039; });  // holds the current protection level, as filled out by the async callback&lt;br /&gt;
			// for existing pages&lt;br /&gt;
			if (mw.config.get(&#039;wgArticleId&#039;)) {&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;checkbox&#039;,&lt;br /&gt;
						name: &#039;editmodify&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.editmodify,&lt;br /&gt;
						list: [&lt;br /&gt;
							{&lt;br /&gt;
								label: &#039;Modify edit protection&#039;,&lt;br /&gt;
								value: &#039;editmodify&#039;,&lt;br /&gt;
								tooltip: &#039;If this is turned off, the edit protection level, and expiry time, will be left as is.&#039;,&lt;br /&gt;
								checked: true&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
				var editlevel = field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;editlevel&#039;,&lt;br /&gt;
						label: &#039;Edit protection:&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.editlevel&lt;br /&gt;
					});&lt;br /&gt;
				editlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;All&#039;,&lt;br /&gt;
						value: &#039;all&#039;&lt;br /&gt;
					});&lt;br /&gt;
				editlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
						value: &#039;autoconfirmed&#039;&lt;br /&gt;
					});&lt;br /&gt;
				if (isTemplate) {&lt;br /&gt;
					editlevel.append({&lt;br /&gt;
							type: &#039;option&#039;,&lt;br /&gt;
							label: &#039;Template editor&#039;,&lt;br /&gt;
							value: &#039;templateeditor&#039;&lt;br /&gt;
						});&lt;br /&gt;
				}&lt;br /&gt;
				editlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Sysop&#039;,&lt;br /&gt;
						value: &#039;sysop&#039;,&lt;br /&gt;
						selected: true&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;editexpiry&#039;,&lt;br /&gt;
						label: &#039;Expires:&#039;,&lt;br /&gt;
						event: function(e) {&lt;br /&gt;
							if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
								Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
							}&lt;br /&gt;
						},&lt;br /&gt;
						list: [&lt;br /&gt;
							{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
							{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
							{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
							{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
							{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
							{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
							{ label: &#039;2 days&#039;, selected: true, value: &#039;2 days&#039; },&lt;br /&gt;
							{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
							{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
							{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
							{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
							{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
							{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
							{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
							{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
							{ label: &#039;indefinite&#039;, value:&#039;indefinite&#039; },&lt;br /&gt;
							{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;checkbox&#039;,&lt;br /&gt;
						name: &#039;movemodify&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.movemodify,&lt;br /&gt;
						list: [&lt;br /&gt;
							{&lt;br /&gt;
								label: &#039;Modify move protection&#039;,&lt;br /&gt;
								value: &#039;movemodify&#039;,&lt;br /&gt;
								tooltip: &#039;If this is turned off, the move protection level, and expiry time, will be left as is.&#039;,&lt;br /&gt;
								checked: true&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
				var movelevel = field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;movelevel&#039;,&lt;br /&gt;
						label: &#039;Move protection:&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.movelevel&lt;br /&gt;
					});&lt;br /&gt;
				movelevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;All&#039;,&lt;br /&gt;
						value: &#039;all&#039;&lt;br /&gt;
					});&lt;br /&gt;
				movelevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
						value: &#039;autoconfirmed&#039;&lt;br /&gt;
					});&lt;br /&gt;
				if (isTemplate) {&lt;br /&gt;
					movelevel.append({&lt;br /&gt;
							type: &#039;option&#039;,&lt;br /&gt;
							label: &#039;Template editor&#039;,&lt;br /&gt;
							value: &#039;templateeditor&#039;&lt;br /&gt;
						});&lt;br /&gt;
				}&lt;br /&gt;
				movelevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Sysop&#039;,&lt;br /&gt;
						value: &#039;sysop&#039;,&lt;br /&gt;
						selected: true&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;moveexpiry&#039;,&lt;br /&gt;
						label: &#039;Expires:&#039;,&lt;br /&gt;
						event: function(e) {&lt;br /&gt;
							if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
								Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
							}&lt;br /&gt;
						},&lt;br /&gt;
						list: [&lt;br /&gt;
							{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
							{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
							{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
							{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
							{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
							{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
							{ label: &#039;2 days&#039;, value: &#039;2 days&#039; },&lt;br /&gt;
							{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
							{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
							{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
							{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
							{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
							{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
							{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
							{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
							{ label: &#039;indefinite&#039;, selected: true, value:&#039;indefinite&#039; },&lt;br /&gt;
							{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;checkbox&#039;,&lt;br /&gt;
						name: &#039;pcmodify&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.pcmodify,&lt;br /&gt;
						list: [&lt;br /&gt;
							{&lt;br /&gt;
								label: &#039;Modify pending changes protection&#039;,&lt;br /&gt;
								value: &#039;pcmodify&#039;,&lt;br /&gt;
								tooltip: &#039;If this is turned off, the pending changes level, and expiry time, will be left as is.&#039;,&lt;br /&gt;
								checked: true&lt;br /&gt;
							}&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
				var pclevel = field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;pclevel&#039;,&lt;br /&gt;
						label: &#039;Pending changes:&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.pclevel&lt;br /&gt;
					});&lt;br /&gt;
				pclevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;None&#039;,&lt;br /&gt;
						value: &#039;none&#039;&lt;br /&gt;
					});&lt;br /&gt;
				pclevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Level 1&#039;,&lt;br /&gt;
						value: &#039;autoconfirmed&#039;,&lt;br /&gt;
						selected: true&lt;br /&gt;
					});&lt;br /&gt;
				pclevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Level 2 (do not use)&#039;,&lt;br /&gt;
						value: &#039;review&#039;&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;pcexpiry&#039;,&lt;br /&gt;
						label: &#039;Expires:&#039;,&lt;br /&gt;
						event: function(e) {&lt;br /&gt;
							if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
								Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
							}&lt;br /&gt;
						},&lt;br /&gt;
						list: [&lt;br /&gt;
							{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
							{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
							{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
							{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
							{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
							{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
							{ label: &#039;2 days&#039;, value: &#039;2 days&#039; },&lt;br /&gt;
							{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
							{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
							{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
							{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
							{ label: &#039;1 month&#039;, selected: true, value: &#039;1 month&#039; },&lt;br /&gt;
							{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
							{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
							{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
							{ label: &#039;indefinite&#039;, value:&#039;indefinite&#039; },&lt;br /&gt;
							{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
			} else {  // for non-existing pages&lt;br /&gt;
				var createlevel = field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;createlevel&#039;,&lt;br /&gt;
						label: &#039;Create protection:&#039;,&lt;br /&gt;
						event: Twinkle.protect.formevents.createlevel&lt;br /&gt;
					});&lt;br /&gt;
				createlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;All&#039;,&lt;br /&gt;
						value: &#039;all&#039;&lt;br /&gt;
					});&lt;br /&gt;
				createlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
						value: &#039;autoconfirmed&#039;&lt;br /&gt;
					});&lt;br /&gt;
				if (isTemplate) {&lt;br /&gt;
					createlevel.append({&lt;br /&gt;
							type: &#039;option&#039;,&lt;br /&gt;
							label: &#039;Template editor&#039;,&lt;br /&gt;
							value: &#039;templateeditor&#039;&lt;br /&gt;
						});&lt;br /&gt;
				}&lt;br /&gt;
				createlevel.append({&lt;br /&gt;
						type: &#039;option&#039;,&lt;br /&gt;
						label: &#039;Sysop&#039;,&lt;br /&gt;
						value: &#039;sysop&#039;,&lt;br /&gt;
						selected: true&lt;br /&gt;
					});&lt;br /&gt;
				field2.append({&lt;br /&gt;
						type: &#039;select&#039;,&lt;br /&gt;
						name: &#039;createexpiry&#039;,&lt;br /&gt;
						label: &#039;Expires:&#039;,&lt;br /&gt;
						event: function(e) {&lt;br /&gt;
							if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
								Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
							}&lt;br /&gt;
						},&lt;br /&gt;
						list: [&lt;br /&gt;
							{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
							{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
							{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
							{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
							{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
							{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
							{ label: &#039;2 days&#039;, value: &#039;2 days&#039; },&lt;br /&gt;
							{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
							{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
							{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
							{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
							{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
							{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
							{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
							{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
							{ label: &#039;indefinite&#039;, selected: true, value: &#039;indefinite&#039; },&lt;br /&gt;
							{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
						]&lt;br /&gt;
					});&lt;br /&gt;
			}&lt;br /&gt;
			field2.append({&lt;br /&gt;
					type: &#039;textarea&#039;,&lt;br /&gt;
					name: &#039;protectReason&#039;,&lt;br /&gt;
					label: &#039;Reason (for protection log):&#039;&lt;br /&gt;
				});&lt;br /&gt;
			if (!mw.config.get(&#039;wgArticleId&#039;)) {  // tagging isn&#039;t relevant for non-existing pages&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			/* falls through */&lt;br /&gt;
		case &#039;tag&#039;:&lt;br /&gt;
			field1 = new Morebits.quickForm.element({ type: &#039;field&#039;, label: &#039;Tagging options&#039;, name: &#039;field1&#039; });&lt;br /&gt;
			field1.append( {&lt;br /&gt;
					type: &#039;select&#039;,&lt;br /&gt;
					name: &#039;tagtype&#039;,&lt;br /&gt;
					label: &#039;Choose protection template:&#039;,&lt;br /&gt;
					list: Twinkle.protect.protectionTags,&lt;br /&gt;
					event: Twinkle.protect.formevents.tagtype&lt;br /&gt;
				} );&lt;br /&gt;
			field1.append( {&lt;br /&gt;
					type: &#039;checkbox&#039;,&lt;br /&gt;
					list: [&lt;br /&gt;
						{&lt;br /&gt;
							name: &#039;small&#039;,&lt;br /&gt;
							label: &#039;Iconify (small=yes)&#039;,&lt;br /&gt;
							tooltip: &#039;Will use the |small=yes feature of the template, and only render it as a keylock&#039;,&lt;br /&gt;
							checked: true&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							name: &#039;noinclude&#039;,&lt;br /&gt;
							label: &#039;Wrap protection template with &amp;lt;noinclude&amp;gt;&#039;,&lt;br /&gt;
							tooltip: &#039;Will wrap the protection template in &amp;amp;lt;noinclude&amp;amp;gt; tags, so that it won\&#039;t transclude&#039;,&lt;br /&gt;
							checked: (mw.config.get(&#039;wgNamespaceNumber&#039;) === 10)&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				} );&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &#039;request&#039;:&lt;br /&gt;
			field_preset = new Morebits.quickForm.element({ type: &#039;field&#039;, label: &#039;Type of protection&#039;, name: &#039;field_preset&#039; });&lt;br /&gt;
			field_preset.append({&lt;br /&gt;
					type: &#039;select&#039;,&lt;br /&gt;
					name: &#039;category&#039;,&lt;br /&gt;
					label: &#039;Type and reason:&#039;,&lt;br /&gt;
					event: Twinkle.protect.callback.changePreset,&lt;br /&gt;
					list: (mw.config.get(&#039;wgArticleId&#039;) ? Twinkle.protect.protectionTypes : Twinkle.protect.protectionTypesCreate)&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
			field1 = new Morebits.quickForm.element({ type: &#039;field&#039;, label: &#039;Options&#039;, name: &#039;field1&#039; });&lt;br /&gt;
			field1.append( {&lt;br /&gt;
					type: &#039;select&#039;,&lt;br /&gt;
					name: &#039;expiry&#039;,&lt;br /&gt;
					label: &#039;Duration: &#039;,&lt;br /&gt;
					list: [&lt;br /&gt;
						{ label: &#039;Temporary&#039;, value: &#039;temporary&#039; },&lt;br /&gt;
						{ label: &#039;Indefinite&#039;, value: &#039;indefinite&#039; },&lt;br /&gt;
						{ label: &#039;&#039;, selected: true, value: &#039;&#039; }&lt;br /&gt;
					]&lt;br /&gt;
				} );&lt;br /&gt;
			field1.append({&lt;br /&gt;
					type: &#039;textarea&#039;,&lt;br /&gt;
					name: &#039;reason&#039;,&lt;br /&gt;
					label: &#039;Reason: &#039;&lt;br /&gt;
				});&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			alert(&amp;quot;Something&#039;s afoot in twinkleprotect&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var oldfield;&lt;br /&gt;
	if (field_preset) {&lt;br /&gt;
		oldfield = $(e.target.form).find(&#039;fieldset[name=&amp;quot;field_preset&amp;quot;]&#039;)[0];&lt;br /&gt;
		oldfield.parentNode.replaceChild(field_preset.render(), oldfield);&lt;br /&gt;
	} else {&lt;br /&gt;
		$(e.target.form).find(&#039;fieldset[name=&amp;quot;field_preset&amp;quot;]&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	if (field1) {&lt;br /&gt;
		oldfield = $(e.target.form).find(&#039;fieldset[name=&amp;quot;field1&amp;quot;]&#039;)[0];&lt;br /&gt;
		oldfield.parentNode.replaceChild(field1.render(), oldfield);&lt;br /&gt;
	} else {&lt;br /&gt;
		$(e.target.form).find(&#039;fieldset[name=&amp;quot;field1&amp;quot;]&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	if (field2) {&lt;br /&gt;
		oldfield = $(e.target.form).find(&#039;fieldset[name=&amp;quot;field2&amp;quot;]&#039;)[0];&lt;br /&gt;
		oldfield.parentNode.replaceChild(field2.render(), oldfield);&lt;br /&gt;
	} else {&lt;br /&gt;
		$(e.target.form).find(&#039;fieldset[name=&amp;quot;field2&amp;quot;]&#039;).css(&#039;display&#039;, &#039;none&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (e.target.values === &#039;protect&#039;) {&lt;br /&gt;
		// fake a change event on the preset dropdown&lt;br /&gt;
		var evt = document.createEvent( &amp;quot;Event&amp;quot; );&lt;br /&gt;
		evt.initEvent( &#039;change&#039;, true, true );&lt;br /&gt;
		e.target.form.category.dispatchEvent( evt );&lt;br /&gt;
&lt;br /&gt;
		// re-add protection level text, if it&#039;s available&lt;br /&gt;
		if (Twinkle.protect.protectionLevel) {&lt;br /&gt;
			Morebits.status.init($(&#039;div[name=&amp;quot;currentprot&amp;quot;] span&#039;).last()[0]);&lt;br /&gt;
			Morebits.status.info(&amp;quot;Current protection level&amp;quot;, Twinkle.protect.protectionLevel);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// reduce vertical height of dialog&lt;br /&gt;
		$(e.target.form).find(&#039;fieldset[name=&amp;quot;field2&amp;quot;] select&#039;).parent().css({ display: &#039;inline-block&#039;, marginRight: &#039;0.5em&#039; });&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.formevents = {&lt;br /&gt;
	editmodify: function twinkleprotectFormEditmodifyEvent(e) {&lt;br /&gt;
		e.target.form.editlevel.disabled = !e.target.checked;&lt;br /&gt;
		e.target.form.editexpiry.disabled = !e.target.checked || (e.target.form.editlevel.value === &#039;all&#039;);&lt;br /&gt;
		e.target.form.editlevel.style.color = e.target.form.editexpiry.style.color = (e.target.checked ? &amp;quot;&amp;quot; : &amp;quot;transparent&amp;quot;);&lt;br /&gt;
	},&lt;br /&gt;
	editlevel: function twinkleprotectFormEditlevelEvent(e) {&lt;br /&gt;
		e.target.form.editexpiry.disabled = (e.target.value === &#039;all&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	movemodify: function twinkleprotectFormMovemodifyEvent(e) {&lt;br /&gt;
		e.target.form.movelevel.disabled = !e.target.checked;&lt;br /&gt;
		e.target.form.moveexpiry.disabled = !e.target.checked || (e.target.form.movelevel.value === &#039;all&#039;);&lt;br /&gt;
		e.target.form.movelevel.style.color = e.target.form.moveexpiry.style.color = (e.target.checked ? &amp;quot;&amp;quot; : &amp;quot;transparent&amp;quot;);&lt;br /&gt;
	},&lt;br /&gt;
	movelevel: function twinkleprotectFormMovelevelEvent(e) {&lt;br /&gt;
		e.target.form.moveexpiry.disabled = (e.target.value === &#039;all&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	pcmodify: function twinkleprotectFormPcmodifyEvent(e) {&lt;br /&gt;
		e.target.form.pclevel.disabled = !e.target.checked;&lt;br /&gt;
		e.target.form.pcexpiry.disabled = !e.target.checked || (e.target.form.pclevel.value === &#039;none&#039;);&lt;br /&gt;
		e.target.form.pclevel.style.color = e.target.form.pcexpiry.style.color = (e.target.checked ? &amp;quot;&amp;quot; : &amp;quot;transparent&amp;quot;);&lt;br /&gt;
	},&lt;br /&gt;
	pclevel: function twinkleprotectFormPclevelEvent(e) {&lt;br /&gt;
		e.target.form.pcexpiry.disabled = (e.target.value === &#039;none&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	createlevel: function twinkleprotectFormCreatelevelEvent(e) {&lt;br /&gt;
		e.target.form.createexpiry.disabled = (e.target.value === &#039;all&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	tagtype: function twinkleprotectFormTagtypeEvent(e) {&lt;br /&gt;
		e.target.form.small.disabled = e.target.form.noinclude.disabled = (e.target.value === &#039;none&#039;) || (e.target.value === &#039;noop&#039;);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.doCustomExpiry = function twinkleprotectDoCustomExpiry(target) {&lt;br /&gt;
	var custom = prompt(&#039;Enter a custom expiry time.  \nYou can use relative times, like &amp;quot;1 minute&amp;quot; or &amp;quot;19 days&amp;quot;, or absolute timestamps, &amp;quot;yyyymmddhhmm&amp;quot; (e.g. &amp;quot;200602011405&amp;quot; is Feb 1, 2006, at 14:05 UTC).&#039;, &#039;&#039;);&lt;br /&gt;
	if (custom) {&lt;br /&gt;
		var option = document.createElement(&#039;option&#039;);&lt;br /&gt;
		option.setAttribute(&#039;value&#039;, custom);&lt;br /&gt;
		option.textContent = custom;&lt;br /&gt;
		target.appendChild(option);&lt;br /&gt;
		target.value = custom;&lt;br /&gt;
	} else {&lt;br /&gt;
		target.selectedIndex = 0;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.protectionTypes = [&lt;br /&gt;
	{ label: &#039;Unprotection&#039;, value: &#039;unprotect&#039; },&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Full protection&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Generic (full)&#039;, value: &#039;pp-protected&#039; },&lt;br /&gt;
			{ label: &#039;Content dispute/edit warring (full)&#039;, value: &#039;pp-dispute&#039; },&lt;br /&gt;
			{ label: &#039;Persistent vandalism (full)&#039;, value: &#039;pp-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;User talk of blocked user (full)&#039;, value: &#039;pp-usertalk&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Template protection&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Highly visible template (TE)&#039;, value: &#039;pp-template&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Semi-protection&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Generic (semi)&#039;, value: &#039;pp-semi-protected&#039; },&lt;br /&gt;
			{ label: &#039;Persistent vandalism (semi)&#039;, selected: true, value: &#039;pp-semi-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;BLP policy violations (semi)&#039;, value: &#039;pp-semi-blp&#039; },&lt;br /&gt;
			{ label: &#039;Sockpuppetry (semi)&#039;, value: &#039;pp-semi-sock&#039; },&lt;br /&gt;
			{ label: &#039;User talk of blocked user (semi)&#039;, value: &#039;pp-semi-usertalk&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Pending changes&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Generic (PC)&#039;, value: &#039;pp-pc-protected&#039; },&lt;br /&gt;
			{ label: &#039;Persistent vandalism (PC)&#039;, value: &#039;pp-pc-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;BLP policy violations (PC)&#039;, value: &#039;pp-pc-blp&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Move protection&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Generic (move)&#039;, value: &#039;pp-move&#039; },&lt;br /&gt;
			{ label: &#039;Dispute/move warring (move)&#039;, value: &#039;pp-move-dispute&#039; },&lt;br /&gt;
			{ label: &#039;Page-move vandalism (move)&#039;, value: &#039;pp-move-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;Highly visible page (move)&#039;, value: &#039;pp-move-indef&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.protectionTypesCreate = [&lt;br /&gt;
	{ label: &#039;Unprotection&#039;, value: &#039;unprotect&#039; },&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Create protection&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;Generic ({{pp-create}})&#039;, value: &#039;pp-create&#039; },&lt;br /&gt;
			{ label: &#039;Offensive name&#039;, value: &#039;pp-create-offensive&#039; },&lt;br /&gt;
			{ label: &#039;Repeatedly recreated&#039;, selected: true, value: &#039;pp-create-salt&#039; },&lt;br /&gt;
			{ label: &#039;Recently deleted BLP&#039;, value: &#039;pp-create-blp&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// A page with both regular and PC protection will be assigned its regular&lt;br /&gt;
// protection weight plus 2 (for PC1) or 7 (for PC2)&lt;br /&gt;
Twinkle.protect.protectionWeight = {&lt;br /&gt;
	sysop: 30,&lt;br /&gt;
	templateeditor: 20,&lt;br /&gt;
	flaggedrevs_review: 15,  // Pending Changes level 2 protection alone&lt;br /&gt;
	autoconfirmed: 10,&lt;br /&gt;
	flaggedrevs_autoconfirmed: 5,  // Pending Changes level 1 protection alone&lt;br /&gt;
	all: 0,&lt;br /&gt;
	flaggedrevs_none: 0  // just in case&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// NOTICE: keep this synched with [[MediaWiki:Protect-dropdown]]&lt;br /&gt;
// Also note: stabilize = Pending Changes level&lt;br /&gt;
Twinkle.protect.protectionPresetsInfo = {&lt;br /&gt;
	&#039;pp-protected&#039;: {&lt;br /&gt;
		edit: &#039;sysop&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: null&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-dispute&#039;: {&lt;br /&gt;
		edit: &#039;sysop&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:PP#Content disputes|Edit warring / content dispute]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-vandalism&#039;: {&lt;br /&gt;
		edit: &#039;sysop&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;Persistent [[WP:Vandalism|vandalism]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-usertalk&#039;: {&lt;br /&gt;
		edit: &#039;sysop&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:PP#Talk-page protection|Inappropriate use of user talk page while blocked]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-template&#039;: {&lt;br /&gt;
		edit: &#039;templateeditor&#039;,&lt;br /&gt;
		move: &#039;templateeditor&#039;,&lt;br /&gt;
		reason: &#039;[[WP:High-risk templates|Highly visible template]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-vandalism&#039;: {&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: &#039;Persistent [[WP:Vandalism|vandalism]]&#039;,&lt;br /&gt;
		template: &#039;pp-vandalism&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-blp&#039;: {&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: &#039;Violations of the [[WP:BLP|biographies of living persons policy]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-usertalk&#039;: {&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:PP#Talk-page protection|Inappropriate use of user talk page while blocked]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-template&#039;: {  // removed for now&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:High-risk templates|Highly visible template]]&#039;,&lt;br /&gt;
		template: &#039;pp-template&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-sock&#039;: {&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: &#039;Persistent [[WP:Sock puppetry|sock puppetry]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-semi-protected&#039;: {&lt;br /&gt;
		edit: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: null,&lt;br /&gt;
		template: &#039;pp-protected&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-pc-vandalism&#039;: {&lt;br /&gt;
		stabilize: &#039;autoconfirmed&#039;,  // stabilize = Pending Changes&lt;br /&gt;
		reason: &#039;Persistent [[WP:Vandalism|vandalism]]&#039;,&lt;br /&gt;
		template: &#039;pp-pc1&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-pc-blp&#039;: {&lt;br /&gt;
		stabilize: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: &#039;Violations of the [[WP:BLP|biographies of living persons policy]]&#039;,&lt;br /&gt;
		template: &#039;pp-pc1&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-pc-protected&#039;: {&lt;br /&gt;
		stabilize: &#039;autoconfirmed&#039;,&lt;br /&gt;
		reason: null,&lt;br /&gt;
		template: &#039;pp-pc1&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-move&#039;: {&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: null&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-move-dispute&#039;: {&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:MOVP|Move warring]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-move-vandalism&#039;: {&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:MOVP|Page-move vandalism]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-move-indef&#039;: {&lt;br /&gt;
		move: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:MOVP|Highly visible page]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;unprotect&#039;: {&lt;br /&gt;
		edit: &#039;all&#039;,&lt;br /&gt;
		move: &#039;all&#039;,&lt;br /&gt;
		stabilize: &#039;none&#039;,&lt;br /&gt;
		create: &#039;all&#039;,&lt;br /&gt;
		reason: null,&lt;br /&gt;
		template: &#039;none&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-create-offensive&#039;: {&lt;br /&gt;
		create: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:SALT|Offensive name]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-create-salt&#039;: {&lt;br /&gt;
		create: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:SALT|Repeatedly recreated]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-create-blp&#039;: {&lt;br /&gt;
		create: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;[[WP:BLPDEL|Recently deleted BLP]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;pp-create&#039;: {&lt;br /&gt;
		create: &#039;sysop&#039;,&lt;br /&gt;
		reason: &#039;{{pp-create}}&#039;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.protectionTags = [&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;None (remove existing protection templates)&#039;,&lt;br /&gt;
		value: &#039;none&#039;&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;None (do not remove existing protection templates)&#039;,&lt;br /&gt;
		value: &#039;noop&#039;&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Full protection templates&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;{{pp-dispute}}: dispute/edit war&#039;, value: &#039;pp-dispute&#039;, selected: true },&lt;br /&gt;
			{ label: &#039;{{pp-usertalk}}: blocked user talk&#039;, value: &#039;pp-usertalk&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Full/semi-protection templates&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;{{pp-vandalism}}: vandalism&#039;, value: &#039;pp-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-template}}: high-risk template&#039;, value: &#039;pp-template&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-protected}}: general protection&#039;, value: &#039;pp-protected&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Semi-protection templates&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;{{pp-semi-usertalk}}: blocked user talk&#039;, value: &#039;pp-semi-usertalk&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-semi-sock}}: sockpuppetry&#039;, value: &#039;pp-semi-sock&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-semi-blp}}: BLP violations&#039;, value: &#039;pp-semi-blp&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-semi-indef}}: general long-term&#039;, value: &#039;pp-semi-indef&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Pending changes templates&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;{{pp-pc1}}: pending changes level 1&#039;, value: &#039;pp-pc1&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: &#039;Move protection templates&#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{ label: &#039;{{pp-move-dispute}}: dispute/move war&#039;, value: &#039;pp-move-dispute&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-move-vandalism}}: page-move vandalism&#039;, value: &#039;pp-move-vandalism&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-move-indef}}: general long-term&#039;, value: &#039;pp-move-indef&#039; },&lt;br /&gt;
			{ label: &#039;{{pp-move}}: other&#039;, value: &#039;pp-move&#039; }&lt;br /&gt;
		]&lt;br /&gt;
	}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.callback.changePreset = function twinkleprotectCallbackChangePreset(e) {&lt;br /&gt;
	var form = e.target.form;&lt;br /&gt;
&lt;br /&gt;
	var actiontypes = form.actiontype;&lt;br /&gt;
	var actiontype;&lt;br /&gt;
	for( var i = 0; i &amp;lt; actiontypes.length; i++ )&lt;br /&gt;
	{&lt;br /&gt;
		if( !actiontypes[i].checked ) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		actiontype = actiontypes[i].values;&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (actiontype === &#039;protect&#039;) {  // actually protecting the page&lt;br /&gt;
		var item = Twinkle.protect.protectionPresetsInfo[form.category.value];&lt;br /&gt;
		if (mw.config.get(&#039;wgArticleId&#039;)) {&lt;br /&gt;
			if (item.edit) {&lt;br /&gt;
				form.editmodify.checked = true;&lt;br /&gt;
				Twinkle.protect.formevents.editmodify({ target: form.editmodify });&lt;br /&gt;
				form.editlevel.value = item.edit;&lt;br /&gt;
				Twinkle.protect.formevents.editlevel({ target: form.editlevel });&lt;br /&gt;
			} else {&lt;br /&gt;
				form.editmodify.checked = false;&lt;br /&gt;
				Twinkle.protect.formevents.editmodify({ target: form.editmodify });&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (item.move) {&lt;br /&gt;
				form.movemodify.checked = true;&lt;br /&gt;
				Twinkle.protect.formevents.movemodify({ target: form.movemodify });&lt;br /&gt;
				form.movelevel.value = item.move;&lt;br /&gt;
				Twinkle.protect.formevents.movelevel({ target: form.movelevel });&lt;br /&gt;
			} else {&lt;br /&gt;
				form.movemodify.checked = false;&lt;br /&gt;
				Twinkle.protect.formevents.movemodify({ target: form.movemodify });&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (item.stabilize) {&lt;br /&gt;
				form.pcmodify.checked = true;&lt;br /&gt;
				Twinkle.protect.formevents.pcmodify({ target: form.pcmodify });&lt;br /&gt;
				form.pclevel.value = item.stabilize;&lt;br /&gt;
				Twinkle.protect.formevents.pclevel({ target: form.pclevel });&lt;br /&gt;
			} else {&lt;br /&gt;
				form.pcmodify.checked = false;&lt;br /&gt;
				Twinkle.protect.formevents.pcmodify({ target: form.pcmodify });&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			if (item.create) {&lt;br /&gt;
				form.createlevel.value = item.create;&lt;br /&gt;
				Twinkle.protect.formevents.createlevel({ target: form.createlevel });&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var reasonField = (actiontype === &amp;quot;protect&amp;quot; ? form.protectReason : form.reason);&lt;br /&gt;
		if (item.reason) {&lt;br /&gt;
			reasonField.value = item.reason;&lt;br /&gt;
		} else {&lt;br /&gt;
			reasonField.value = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// sort out tagging options&lt;br /&gt;
		if (mw.config.get(&#039;wgArticleId&#039;)) {&lt;br /&gt;
			if( form.category.value === &#039;unprotect&#039; ) {&lt;br /&gt;
				form.tagtype.value = &#039;none&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				form.tagtype.value = (item.template ? item.template : form.category.value);&lt;br /&gt;
			}&lt;br /&gt;
			Twinkle.protect.formevents.tagtype({ target: form.tagtype });&lt;br /&gt;
&lt;br /&gt;
			if( /template/.test( form.category.value ) ) {&lt;br /&gt;
				form.noinclude.checked = true;&lt;br /&gt;
				form.editexpiry.value = form.moveexpiry.value = form.pcexpiry.value = &amp;quot;indefinite&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				form.noinclude.checked = false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	} else {  // RPP request&lt;br /&gt;
		if( form.category.value === &#039;unprotect&#039; ) {&lt;br /&gt;
			form.expiry.value = &#039;&#039;;&lt;br /&gt;
			form.expiry.disabled = true;&lt;br /&gt;
		} else {&lt;br /&gt;
			form.expiry.disabled = false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.callback.evaluate = function twinkleprotectCallbackEvaluate(e) {&lt;br /&gt;
	var form = e.target;&lt;br /&gt;
&lt;br /&gt;
	var actiontypes = form.actiontype;&lt;br /&gt;
	var actiontype;&lt;br /&gt;
	for( var i = 0; i &amp;lt; actiontypes.length; i++ )&lt;br /&gt;
	{&lt;br /&gt;
		if( !actiontypes[i].checked ) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		actiontype = actiontypes[i].values;&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var tagparams;&lt;br /&gt;
	if( actiontype === &#039;tag&#039; || (actiontype === &#039;protect&#039; &amp;amp;&amp;amp; mw.config.get(&#039;wgArticleId&#039;)) ) {&lt;br /&gt;
		tagparams = {&lt;br /&gt;
			tag: form.tagtype.value,&lt;br /&gt;
			reason: ((form.tagtype.value === &#039;pp-protected&#039; || form.tagtype.value === &#039;pp-semi-protected&#039; || form.tagtype.value === &#039;pp-move&#039;) &amp;amp;&amp;amp; form.protectReason) ? form.protectReason.value : null,&lt;br /&gt;
			expiry: (actiontype === &#039;protect&#039;) ? (form.editmodify.checked ? form.editexpiry.value : (form.movemodify.checked ?&lt;br /&gt;
				form.moveexpiry.value : null)) : null,&lt;br /&gt;
			small: form.small.checked,&lt;br /&gt;
			noinclude: form.noinclude.checked&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	switch (actiontype) {&lt;br /&gt;
		case &#039;protect&#039;:&lt;br /&gt;
			// protect the page&lt;br /&gt;
&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Protection complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			var statusInited = false;&lt;br /&gt;
			var thispage;&lt;br /&gt;
&lt;br /&gt;
			var allDone = function twinkleprotectCallbackAllDone() {&lt;br /&gt;
				if (thispage) {&lt;br /&gt;
					thispage.getStatusElement().info(&amp;quot;done&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
				if (tagparams) {&lt;br /&gt;
					Twinkle.protect.callbacks.taggingPageInitial(tagparams);&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			var protectIt = function twinkleprotectCallbackProtectIt(next) {&lt;br /&gt;
				thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Protecting page&amp;quot;);&lt;br /&gt;
				if (mw.config.get(&#039;wgArticleId&#039;)) {&lt;br /&gt;
					if (form.editmodify.checked) {&lt;br /&gt;
						thispage.setEditProtection(form.editlevel.value, form.editexpiry.value);&lt;br /&gt;
					}&lt;br /&gt;
					if (form.movemodify.checked) {&lt;br /&gt;
						thispage.setMoveProtection(form.movelevel.value, form.moveexpiry.value);&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					thispage.setCreateProtection(form.createlevel.value, form.createexpiry.value);&lt;br /&gt;
					thispage.setWatchlist(false);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (form.protectReason.value) {&lt;br /&gt;
					thispage.setEditSummary(form.protectReason.value);&lt;br /&gt;
				} else {&lt;br /&gt;
					alert(&amp;quot;You must enter a protect reason, which will be inscribed into the protection log.&amp;quot;);&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (!statusInited) {&lt;br /&gt;
					Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
					Morebits.status.init( form );&lt;br /&gt;
					statusInited = true;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				thispage.protect(next);&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			var stabilizeIt = function twinkleprotectCallbackStabilizeIt() {&lt;br /&gt;
				if (thispage) {&lt;br /&gt;
					thispage.getStatusElement().info(&amp;quot;done&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Applying pending changes protection&amp;quot;);&lt;br /&gt;
				thispage.setFlaggedRevs(form.pclevel.value, form.pcexpiry.value);&lt;br /&gt;
&lt;br /&gt;
				if (form.protectReason.value) {&lt;br /&gt;
					thispage.setEditSummary(form.protectReason.value);&lt;br /&gt;
				} else {&lt;br /&gt;
					alert(&amp;quot;You must enter a protect reason, which will be inscribed into the protection log.&amp;quot;);&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (!statusInited) {&lt;br /&gt;
					Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
					Morebits.status.init(form);&lt;br /&gt;
					statusInited = true;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				thispage.stabilize(allDone);&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			if ((form.editmodify &amp;amp;&amp;amp; form.editmodify.checked) || (form.movemodify &amp;amp;&amp;amp; form.movemodify.checked) ||&lt;br /&gt;
				!mw.config.get(&#039;wgArticleId&#039;)) {&lt;br /&gt;
				if (form.pcmodify &amp;amp;&amp;amp; form.pcmodify.checked) {&lt;br /&gt;
					protectIt(stabilizeIt);&lt;br /&gt;
				} else {&lt;br /&gt;
					protectIt(allDone);&lt;br /&gt;
				}&lt;br /&gt;
			} else if (form.pcmodify &amp;amp;&amp;amp; form.pcmodify.checked) {&lt;br /&gt;
				stabilizeIt();&lt;br /&gt;
			} else {&lt;br /&gt;
				alert(&amp;quot;Please give Twinkle something to do! \nIf you just want to tag the page, you can choose the &#039;Tag page with protection template&#039; option at the top.&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &#039;tag&#039;:&lt;br /&gt;
			// apply a protection template&lt;br /&gt;
&lt;br /&gt;
			Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
			Morebits.status.init( form );&lt;br /&gt;
&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
			Morebits.wiki.actionCompleted.followRedirect = false;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Tagging complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			Twinkle.protect.callbacks.taggingPageInitial(tagparams);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &#039;request&#039;:&lt;br /&gt;
			// file request at RPP&lt;br /&gt;
			var typename, typereason;&lt;br /&gt;
			switch( form.category.value ) {&lt;br /&gt;
				case &#039;pp-dispute&#039;:&lt;br /&gt;
				case &#039;pp-vandalism&#039;:&lt;br /&gt;
				case &#039;pp-usertalk&#039;:&lt;br /&gt;
				case &#039;pp-protected&#039;:&lt;br /&gt;
					typename = &#039;full protection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-template&#039;:&lt;br /&gt;
					typename = &#039;template protection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-semi-vandalism&#039;:&lt;br /&gt;
				case &#039;pp-semi-usertalk&#039;:&lt;br /&gt;
				case &#039;pp-semi-sock&#039;:&lt;br /&gt;
				case &#039;pp-semi-blp&#039;:&lt;br /&gt;
				case &#039;pp-semi-protected&#039;:&lt;br /&gt;
					typename = &#039;semi-protection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-pc-vandalism&#039;:&lt;br /&gt;
				case &#039;pp-pc-blp&#039;:&lt;br /&gt;
				case &#039;pp-pc-protected&#039;:&lt;br /&gt;
					typename = &#039;pending changes&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-move&#039;:&lt;br /&gt;
				case &#039;pp-move-dispute&#039;:&lt;br /&gt;
				case &#039;pp-move-indef&#039;:&lt;br /&gt;
				case &#039;pp-move-vandalism&#039;:&lt;br /&gt;
					typename = &#039;move protection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-create&#039;:&lt;br /&gt;
				case &#039;pp-create-offensive&#039;:&lt;br /&gt;
				case &#039;pp-create-blp&#039;:&lt;br /&gt;
				case &#039;pp-create-salt&#039;:&lt;br /&gt;
					typename = &#039;create protection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;unprotect&#039;:&lt;br /&gt;
					/* falls through */&lt;br /&gt;
				default:&lt;br /&gt;
					typename = &#039;unprotection&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			switch (form.category.value) {&lt;br /&gt;
				case &#039;pp-dispute&#039;:&lt;br /&gt;
					typereason = &#039;Content dispute/edit warring&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-vandalism&#039;:&lt;br /&gt;
				case &#039;pp-semi-vandalism&#039;:&lt;br /&gt;
				case &#039;pp-pc-vandalism&#039;:&lt;br /&gt;
					typereason = &#039;Persistent vandalism&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-template&#039;:&lt;br /&gt;
					typereason = &#039;Highly visible template&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-usertalk&#039;:&lt;br /&gt;
				case &#039;pp-semi-usertalk&#039;:&lt;br /&gt;
					typereason = &#039;Inappropriate use of user talk page while blocked&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-semi-sock&#039;:&lt;br /&gt;
					typereason = &#039;Persistent sockpuppetry&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-semi-blp&#039;:&lt;br /&gt;
				case &#039;pp-pc-blp&#039;:&lt;br /&gt;
					typereason = &#039;[[WP:BLP|BLP]] policy violations&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-move-dispute&#039;:&lt;br /&gt;
					typereason = &#039;Page title dispute/move warring&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-move-vandalism&#039;:&lt;br /&gt;
					typereason = &#039;Page-move vandalism&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-move-indef&#039;:&lt;br /&gt;
					typereason = &#039;Highly visible page&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-create-offensive&#039;:&lt;br /&gt;
					typereason = &#039;Offensive name&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-create-blp&#039;:&lt;br /&gt;
					typereason = &#039;Recently deleted [[WP:BLP|BLP]]&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;pp-create-salt&#039;:&lt;br /&gt;
					typereason = &#039;Repeatedly recreated&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					typereason = &#039;&#039;;&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var reason = typereason;&lt;br /&gt;
			if( form.reason.value !== &#039;&#039;) {&lt;br /&gt;
				if ( typereason !== &#039;&#039; ) {&lt;br /&gt;
					reason += &amp;quot;\u00A0\u2013 &amp;quot;;  // U+00A0 NO-BREAK SPACE; U+2013 EN RULE&lt;br /&gt;
				}&lt;br /&gt;
				reason += form.reason.value;&lt;br /&gt;
			}&lt;br /&gt;
			if( reason !== &#039;&#039; &amp;amp;&amp;amp; reason.charAt( reason.length - 1 ) !== &#039;.&#039; ) {&lt;br /&gt;
				reason += &#039;.&#039;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var rppparams = {&lt;br /&gt;
				reason: reason,&lt;br /&gt;
				typename: typename,&lt;br /&gt;
				category: form.category.value,&lt;br /&gt;
				expiry: form.expiry.value&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
			Morebits.status.init( form );&lt;br /&gt;
&lt;br /&gt;
			rppName = &#039;Wikipedia:Requests for page protection&#039;;&lt;br /&gt;
&lt;br /&gt;
			// Updating data for the action completed event&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = rppName;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, redirecting now to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			var rppPage = new Morebits.wiki.page( rppName, &#039;Requesting protection of page&#039;);&lt;br /&gt;
			rppPage.setFollowRedirect( true );&lt;br /&gt;
			rppPage.setCallbackParameters( rppparams );&lt;br /&gt;
			rppPage.load( Twinkle.protect.callbacks.fileRequest );&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			alert(&amp;quot;twinkleprotect: unknown kind of action&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.protect.callbacks = {&lt;br /&gt;
	taggingPageInitial: function( tagparams ) {&lt;br /&gt;
		if (tagparams.tag === &#039;noop&#039;) {&lt;br /&gt;
			Morebits.status.info(&amp;quot;Applying protection template&amp;quot;, &amp;quot;nothing to do&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var protectedPage = new Morebits.wiki.page( mw.config.get(&#039;wgPageName&#039;), &#039;Tagging page&#039;);&lt;br /&gt;
		protectedPage.setCallbackParameters( tagparams );&lt;br /&gt;
		protectedPage.load( Twinkle.protect.callbacks.taggingPage );&lt;br /&gt;
	},&lt;br /&gt;
	taggingPage: function( protectedPage ) {&lt;br /&gt;
		var params = protectedPage.getCallbackParameters();&lt;br /&gt;
		var text = protectedPage.getPageText();&lt;br /&gt;
		var tag, summary;&lt;br /&gt;
&lt;br /&gt;
		var oldtag_re = /\s*(?:&amp;lt;noinclude&amp;gt;)?\s*\{\{\s*(pp-[^{}]*?|protected|(?:t|v|s|p-|usertalk-v|usertalk-s|sb|move)protected(?:2)?|protected template|privacy protection)\s*?\}\}\s*(?:&amp;lt;\/noinclude&amp;gt;)?\s*/gi;&lt;br /&gt;
		var re_result = oldtag_re.exec(text);&lt;br /&gt;
		if (re_result) {&lt;br /&gt;
			if (confirm(&amp;quot;{{&amp;quot; + re_result[1] + &amp;quot;}} was found on the page. \nClick OK to remove it, or click Cancel to leave it there.&amp;quot;)) {&lt;br /&gt;
				text = text.replace( oldtag_re, &#039;&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( params.tag !== &#039;none&#039; ) {&lt;br /&gt;
			tag = params.tag;&lt;br /&gt;
			if( params.reason ) {&lt;br /&gt;
				tag += &#039;|reason=&#039; + params.reason;&lt;br /&gt;
			}&lt;br /&gt;
			if( [&#039;indefinite&#039;, &#039;infinite&#039;, &#039;never&#039;, null].indexOf(params.expiry) === -1 ) {&lt;br /&gt;
				tag += &#039;|expiry={{subst:#time:j F Y|&#039; + (/^\s*\d+\s*$/.exec(params.expiry) ? params.expiry : &#039;+&#039; + params.expiry) + &#039;}}&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			if( params.small ) {&lt;br /&gt;
				tag += &#039;|small=yes&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( params.tag === &#039;none&#039; ) {&lt;br /&gt;
			summary = &#039;Removing protection template&#039; + Twinkle.getPref(&#039;summaryAd&#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			if( params.noinclude ) {&lt;br /&gt;
				text = &amp;quot;&amp;lt;noinclude&amp;gt;{{&amp;quot; + tag + &amp;quot;}}&amp;lt;/noinclude&amp;gt;&amp;quot; + text;&lt;br /&gt;
			} else if( Morebits.wiki.isPageRedirect() ) {&lt;br /&gt;
				text = text + &amp;quot;\n{{&amp;quot; + tag + &amp;quot;}}&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				text = &amp;quot;{{&amp;quot; + tag + &amp;quot;}}\n&amp;quot; + text;&lt;br /&gt;
			}&lt;br /&gt;
			summary = &amp;quot;Adding {{&amp;quot; + params.tag + &amp;quot;}}&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		protectedPage.setEditSummary( summary );&lt;br /&gt;
		protectedPage.setPageText( text );&lt;br /&gt;
		protectedPage.setCreateOption( &#039;nocreate&#039; );&lt;br /&gt;
		protectedPage.suppressProtectWarning(); // no need to let admins know they are editing through protection&lt;br /&gt;
		protectedPage.save();&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	fileRequest: function( rppPage ) {&lt;br /&gt;
&lt;br /&gt;
		var params = rppPage.getCallbackParameters();&lt;br /&gt;
		var text = rppPage.getPageText();&lt;br /&gt;
		var statusElement = rppPage.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
		var ns2tag = {&lt;br /&gt;
			&#039;0&#039;: &#039;la&#039;,&lt;br /&gt;
			&#039;1&#039;: &#039;lat&#039;,&lt;br /&gt;
			&#039;2&#039;: &#039;lu&#039;,&lt;br /&gt;
			&#039;3&#039;: &#039;lut&#039;,&lt;br /&gt;
			&#039;4&#039;: &#039;lw&#039;,&lt;br /&gt;
			&#039;5&#039;: &#039;lwt&#039;,&lt;br /&gt;
			&#039;6&#039;: &#039;lf&#039;,&lt;br /&gt;
			&#039;7&#039;: &#039;lft&#039;,&lt;br /&gt;
			&#039;8&#039;: &#039;lm&#039;,&lt;br /&gt;
			&#039;9&#039;: &#039;lmt&#039;,&lt;br /&gt;
			&#039;10&#039;: &#039;lt&#039;,&lt;br /&gt;
			&#039;11&#039;: &#039;ltt&#039;,&lt;br /&gt;
			&#039;12&#039;: &#039;lh&#039;,&lt;br /&gt;
			&#039;13&#039;: &#039;lht&#039;,&lt;br /&gt;
			&#039;14&#039;: &#039;lc&#039;,&lt;br /&gt;
			&#039;15&#039;: &#039;lct&#039;,&lt;br /&gt;
			&#039;100&#039;: &#039;lp&#039;,&lt;br /&gt;
			&#039;101&#039;: &#039;lpt&#039;,&lt;br /&gt;
			&#039;108&#039;: &#039;lb&#039;,&lt;br /&gt;
			&#039;109&#039;: &#039;lbt&#039;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		var linkTemplate = ns2tag[ mw.config.get(&#039;wgNamespaceNumber&#039;) ];&lt;br /&gt;
		// support other namespaces like TimedText&lt;br /&gt;
		// (this could support talk spaces better, but doesn&#039;t seem worth it)&lt;br /&gt;
		if (!linkTemplate) {&lt;br /&gt;
			linkTemplate = &#039;ln|&#039; + Morebits.pageNameNorm.substring(0, Morebits.pageNameNorm.indexOf(&#039;:&#039;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var rppRe = new RegExp( &#039;====\\s*\\{\\{\\s*&#039; + linkTemplate + &#039;\\s*\\|\\s*&#039; + RegExp.escape( mw.config.get(&#039;wgTitle&#039;), true ) + &#039;\\s*\\}\\}\\s*====&#039;, &#039;m&#039; );&lt;br /&gt;
		var tag = rppRe.exec( text );&lt;br /&gt;
&lt;br /&gt;
		var rppLink = document.createElement(&#039;a&#039;);&lt;br /&gt;
		rppLink.setAttribute(&#039;href&#039;, mw.util.getUrl(rppPage.getPageName()) );&lt;br /&gt;
		rppLink.appendChild(document.createTextNode(rppPage.getPageName()));&lt;br /&gt;
&lt;br /&gt;
		if ( tag ) {&lt;br /&gt;
			statusElement.error( [ &#039;There is already a protection request for this page at &#039;, rppLink, &#039;, aborting.&#039; ] );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var newtag = &#039;==== {{&#039; + linkTemplate + &#039;|&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;}} ====&#039; + &amp;quot;\n&amp;quot;;&lt;br /&gt;
		if( ( new RegExp( &#039;^&#039; + RegExp.escape( newtag ).replace( /\s+/g, &#039;\\s*&#039; ), &#039;m&#039; ) ).test( text ) ) {&lt;br /&gt;
			statusElement.error( [ &#039;There is already a protection request for this page at &#039;, rppLink, &#039;, aborting.&#039; ] );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var words;&lt;br /&gt;
		switch( params.expiry ) {&lt;br /&gt;
		case &#039;temporary&#039;:&lt;br /&gt;
			words = &amp;quot;Temporary &amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;indefinite&#039;:&lt;br /&gt;
			words = &amp;quot;Indefinite &amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			words = &amp;quot;&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		words += params.typename;&lt;br /&gt;
&lt;br /&gt;
		newtag += &amp;quot;&#039;&#039;&#039;&amp;quot; + Morebits.string.toUpperCaseFirstChar(words) + ( params.reason !== &#039;&#039; ? ( &amp;quot;:&#039;&#039;&#039; &amp;quot; + &lt;br /&gt;
			Morebits.string.formatReasonText(params.reason) ) : &amp;quot;.&#039;&#039;&#039;&amp;quot; ) + &amp;quot; ~~~~&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// If either protection type results in a increased status, then post it under increase&lt;br /&gt;
		// else we post it under decrease&lt;br /&gt;
		var increase = false;&lt;br /&gt;
		var protInfo = Twinkle.protect.protectionPresetsInfo[params.category];&lt;br /&gt;
&lt;br /&gt;
		// function to compute protection weights (see comment at Twinkle.protect.protectionWeight)&lt;br /&gt;
		var computeWeight = function(mainLevel, stabilizeLevel) {&lt;br /&gt;
			var result = Twinkle.protect.protectionWeight[mainLevel || &#039;all&#039;];&lt;br /&gt;
			if (stabilizeLevel) {&lt;br /&gt;
				if (result) {&lt;br /&gt;
					if (stabilizeLevel.level === &amp;quot;autoconfirmed&amp;quot;) {&lt;br /&gt;
						result += 2;&lt;br /&gt;
					} else if (stabilizeLevel.level === &amp;quot;review&amp;quot;) {&lt;br /&gt;
						result += 7;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					result = Twinkle.protect.protectionWeight[&amp;quot;flaggedrevs_&amp;quot; + stabilizeLevel];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return result;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		// compare the page&#039;s current protection weights with the protection we are requesting&lt;br /&gt;
		var editWeight = computeWeight(Twinkle.protect.currentProtectionLevels.edit &amp;amp;&amp;amp;&lt;br /&gt;
			Twinkle.protect.currentProtectionLevels.edit.level,&lt;br /&gt;
			Twinkle.protect.currentProtectionLevels.stabilize &amp;amp;&amp;amp;&lt;br /&gt;
			Twinkle.protect.currentProtectionLevels.stabilize.level);&lt;br /&gt;
		if (computeWeight(protInfo.edit, protInfo.stabilize) &amp;gt; editWeight ||&lt;br /&gt;
			computeWeight(protInfo.move) &amp;gt; computeWeight(Twinkle.protect.currentProtectionLevels.move &amp;amp;&amp;amp; &lt;br /&gt;
			Twinkle.protect.currentProtectionLevels.move.level) ||&lt;br /&gt;
			computeWeight(protInfo.create) &amp;gt; computeWeight(Twinkle.protect.currentProtectionLevels.create &amp;amp;&amp;amp; &lt;br /&gt;
			Twinkle.protect.currentProtectionLevels.create.level)) {&lt;br /&gt;
			increase = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var reg;&lt;br /&gt;
		if ( increase ) {&lt;br /&gt;
			reg = /(\n==\s*Current requests for increase in protection level\s*==\s*\n\s*\{\{[^\}\}]+\}\}\s*\n)/;&lt;br /&gt;
		} else {&lt;br /&gt;
			reg = /(\n==\s*Current requests for reduction in protection level\s*==\s*\n\s*\{\{[^\}\}]+\}\}\s*\n)/;&lt;br /&gt;
		}&lt;br /&gt;
		var originalTextLength = text.length;&lt;br /&gt;
		text = text.replace( reg, &amp;quot;$1&amp;quot; + newtag + &amp;quot;\n&amp;quot;);&lt;br /&gt;
		if (text.length === originalTextLength)&lt;br /&gt;
		{&lt;br /&gt;
			var linknode = document.createElement(&#039;a&#039;);&lt;br /&gt;
			linknode.setAttribute(&amp;quot;href&amp;quot;, mw.util.getUrl(&amp;quot;Wikipedia:Twinkle/Fixing RPP&amp;quot;) );&lt;br /&gt;
			linknode.appendChild(document.createTextNode(&#039;How to fix RPP&#039;));&lt;br /&gt;
			statusElement.error( [ &#039;Could not find relevant heading on WP:RPP. To fix this problem, please see &#039;, linknode, &#039;.&#039; ] );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		statusElement.status( &#039;Adding new request...&#039; );&lt;br /&gt;
		rppPage.setEditSummary( &amp;quot;Requesting &amp;quot; + params.typename + (params.typename === &amp;quot;pending changes&amp;quot; ? &#039; on [[&#039; : &#039; of [[&#039;) +&lt;br /&gt;
			Morebits.pageNameNorm + &#039;]].&#039; + Twinkle.getPref(&#039;summaryAd&#039;) );&lt;br /&gt;
		rppPage.setPageText( text );&lt;br /&gt;
		rppPage.setCreateOption( &#039;recreate&#039; );&lt;br /&gt;
		rppPage.save();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklexfd.js&amp;diff=23375</id>
		<title>MediaWiki:Gadget-twinklexfd.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklexfd.js&amp;diff=23375"/>
		<updated>2013-12-15T12:25:24Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-662-g5d477ae: protect: Adjust weightings per comment at WT:TW; protect: Improve protection weighting logic; ffd: Make NFCR more palatable in article space; Remove unused pref speedyPromptOnG7; morebits: Add style attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklexfd.js: XFD module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;XFD&amp;quot;)&lt;br /&gt;
 * Active on:              Existing, non-special pages, except for file pages with no local (non-Commons) file which are not redirects&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd = function twinklexfd() {&lt;br /&gt;
	// Disable on:&lt;br /&gt;
	// * special pages&lt;br /&gt;
	// * non-existent pages&lt;br /&gt;
	// * files on Commons, whether there is a local page or not (unneeded local pages of files on Commons are eligible for CSD F2)&lt;br /&gt;
	// * file pages without actual files (these are eligible for CSD G8)&lt;br /&gt;
	if ( mw.config.get(&#039;wgNamespaceNumber&#039;) &amp;lt; 0 || !mw.config.get(&#039;wgArticleId&#039;) || (mw.config.get(&#039;wgNamespaceNumber&#039;) === 6 &amp;amp;&amp;amp; (document.getElementById(&#039;mw-sharedupload&#039;) || (!document.getElementById(&#039;mw-imagepage-section-filehistory&#039;) &amp;amp;&amp;amp; !Morebits.wiki.isPageRedirect()))) ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Twinkle.addPortletLink( Twinkle.xfd.callback, &amp;quot;XFD&amp;quot;, &amp;quot;tw-xfd&amp;quot;, &amp;quot;Nominate for deletion&amp;quot; );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.num2order = function twinklexfdNum2order( num ) {&lt;br /&gt;
	switch( num ) {&lt;br /&gt;
	case 1: return &#039;&#039;;&lt;br /&gt;
	case 2: return &#039;2nd&#039;;&lt;br /&gt;
	case 3: return &#039;3rd&#039;;&lt;br /&gt;
	default: return num + &#039;th&#039;;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.currentRationale = null;&lt;br /&gt;
&lt;br /&gt;
// error callback on Morebits.status.object&lt;br /&gt;
Twinkle.xfd.printRationale = function twinklexfdPrintRationale() {&lt;br /&gt;
	if (Twinkle.xfd.currentRationale) {&lt;br /&gt;
		var p = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
		p.textContent = &amp;quot;Your deletion rationale is provided below, which you can copy and paste into a new XFD dialog if you wish to try again:&amp;quot;;&lt;br /&gt;
		var pre = document.createElement(&amp;quot;pre&amp;quot;);&lt;br /&gt;
		pre.className = &amp;quot;toccolours&amp;quot;;&lt;br /&gt;
		pre.style.marginTop = &amp;quot;0&amp;quot;;&lt;br /&gt;
		pre.textContent = Twinkle.xfd.currentRationale;&lt;br /&gt;
		p.appendChild(pre);&lt;br /&gt;
		Morebits.status.root.appendChild(p);&lt;br /&gt;
		// only need to print the rationale once&lt;br /&gt;
		Twinkle.xfd.currentRationale = null;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.callback = function twinklexfdCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 600, 350 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Nominate for deletion (XfD)&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;About deletion discussions&amp;quot;, &amp;quot;WP:XFD&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#xfd&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.xfd.callback.evaluate );&lt;br /&gt;
	var categories = form.append( {&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;category&#039;,&lt;br /&gt;
			label: &#039;Deletion discussion venue:&#039;,&lt;br /&gt;
			tooltip: &#039;When activated, a default choice is made, based on what namespace you are in. This default should be the most appropriate&#039;,&lt;br /&gt;
			event: Twinkle.xfd.callback.change_category&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;AfD (Articles for deletion)&#039;,&lt;br /&gt;
			selected: mw.config.get(&#039;wgNamespaceNumber&#039;) === 0,  // Main namespace&lt;br /&gt;
			value: &#039;afd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;TfD (Templates for discussion)&#039;,&lt;br /&gt;
			selected: mw.config.get(&#039;wgNamespaceNumber&#039;) === 10,  // Template namespace&lt;br /&gt;
			value: &#039;tfd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Discussion venues for files (FFD, PUF or NFCR)&#039;,&lt;br /&gt;
			selected: mw.config.get(&#039;wgNamespaceNumber&#039;) === 6,  // File namespace&lt;br /&gt;
			value: &#039;ffd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;CfD (Categories for discussion)&#039;,&lt;br /&gt;
			selected: mw.config.get(&#039;wgNamespaceNumber&#039;) === 14,  // Category namespace&lt;br /&gt;
			value: &#039;cfd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
  categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;CfD/S (Categories for speedy renaming)&#039;,&lt;br /&gt;
			value: &#039;cfds&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;MfD (Miscellany for deletion)&#039;,&lt;br /&gt;
			selected: [ 0, 6, 10, 14 ].indexOf( mw.config.get(&#039;wgNamespaceNumber&#039;) ) === -1,&lt;br /&gt;
			value: &#039;mfd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;RfD (Redirects for discussion)&#039;,&lt;br /&gt;
			selected: Morebits.wiki.isPageRedirect(),&lt;br /&gt;
			value: &#039;rfd&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;checkbox&#039;,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Notify page creator if possible&#039;,&lt;br /&gt;
					value: &#039;notify&#039;,&lt;br /&gt;
					name: &#039;notify&#039;,&lt;br /&gt;
					tooltip: &amp;quot;A notification template will be placed on the creator&#039;s talk page if this is true.&amp;quot;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	);&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			label:&#039;Work area&#039;,&lt;br /&gt;
			name: &#039;work_area&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( { type:&#039;submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
	var result = form.render();&lt;br /&gt;
	Window.setContent( result );&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	// We must init the controls&lt;br /&gt;
	var evt = document.createEvent( &amp;quot;Event&amp;quot; );&lt;br /&gt;
	evt.initEvent( &#039;change&#039;, true, true );&lt;br /&gt;
	result.category.dispatchEvent( evt );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.previousNotify = true;&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory(e) {&lt;br /&gt;
	var value = e.target.value;&lt;br /&gt;
	var form = e.target.form;&lt;br /&gt;
	var old_area = Morebits.quickForm.getElements(e.target.form, &amp;quot;work_area&amp;quot;)[0];&lt;br /&gt;
	var work_area = null;&lt;br /&gt;
&lt;br /&gt;
	var oldreasontextbox = form.getElementsByTagName(&#039;textarea&#039;)[0];&lt;br /&gt;
	var oldreason = (oldreasontextbox ? oldreasontextbox.value : &#039;&#039;);&lt;br /&gt;
	&lt;br /&gt;
	var appendReasonBox = function twinklexfdAppendReasonBox() {&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;textarea&#039;,&lt;br /&gt;
			name: &#039;xfdreason&#039;,&lt;br /&gt;
			label: &#039;Reason: &#039;,&lt;br /&gt;
			value: oldreason,&lt;br /&gt;
			tooltip: &#039;You can use wikimarkup in your reason. Twinkle will automatically sign your post.&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		// TODO possible future &amp;quot;preview&amp;quot; link here&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	switch( value ) {&lt;br /&gt;
	case &#039;afd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Articles for deletion&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
						{&lt;br /&gt;
							label: &#039;Wrap deletion tag with &amp;lt;noinclude&amp;gt;&#039;,&lt;br /&gt;
							value: &#039;noinclude&#039;,&lt;br /&gt;
							name: &#039;noinclude&#039;,&lt;br /&gt;
							tooltip: &#039;Will wrap the deletion tag in &amp;amp;lt;noinclude&amp;amp;gt; tags, so that it won\&#039;t transclude. This option is not normally required.&#039;&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
		} );&lt;br /&gt;
		var afd_category = work_area.append( {&lt;br /&gt;
				type:&#039;select&#039;,&lt;br /&gt;
				name:&#039;xfdcat&#039;,&lt;br /&gt;
				label:&#039;Choose what category this nomination belongs in:&#039;&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Unknown&#039;, value:&#039;?&#039;, selected:true } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Media and music&#039;, value:&#039;M&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Organisation, corporation, or product&#039;, value:&#039;O&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Biographical&#039;, value:&#039;B&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Society topics&#039;, value:&#039;S&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Web or internet&#039;, value:&#039;W&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Games or sports&#039;, value:&#039;G&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Science and technology&#039;, value:&#039;T&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Fiction and the arts&#039;, value:&#039;F&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Places and transportation&#039;, value:&#039;P&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Indiscernible or unclassifiable topic&#039;, value:&#039;I&#039; } );&lt;br /&gt;
		afd_category.append( { type:&#039;option&#039;, label:&#039;Debate not yet sorted&#039;, value:&#039;U&#039; } );&lt;br /&gt;
&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;tfd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Templates for discussion&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;div&#039;,&lt;br /&gt;
				label: &#039;Stub types and userboxes are not eligible for TfD. Stub types go to CfD, and userboxes go to MfD.&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		var tfd_category = work_area.append( {&lt;br /&gt;
				type: &#039;select&#039;,&lt;br /&gt;
				label: &#039;Choose type of action wanted: &#039;,&lt;br /&gt;
				name: &#039;xfdcat&#039;,&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var target = e.target;&lt;br /&gt;
					// add/remove extra input box&lt;br /&gt;
					if( target.value === &#039;tfm&#039; &amp;amp;&amp;amp; !target.form.xfdtarget ) { //$(target.parentNode).find(&amp;quot;input[name=&#039;xfdtarget&#039;]&amp;quot;).length === 0 ) {&lt;br /&gt;
						var xfdtarget = new Morebits.quickForm.element( {&lt;br /&gt;
							name: &#039;xfdtarget&#039;,&lt;br /&gt;
							type: &#039;input&#039;,&lt;br /&gt;
							label: &#039;Other template to be merged: &#039;&lt;br /&gt;
						} );&lt;br /&gt;
						target.parentNode.appendChild(xfdtarget.render());&lt;br /&gt;
					} else {&lt;br /&gt;
						$(Morebits.quickForm.getElementContainer(target.form.xfdtarget)).remove();&lt;br /&gt;
						target.form.xfdtarget = null;&lt;br /&gt;
						//$(target.parentNode).find(&amp;quot;input[name=&#039;xfdtarget&#039;]&amp;quot;).remove();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		tfd_category.append( { type: &#039;option&#039;, label: &#039;Deletion&#039;, value: &#039;tfd&#039;, selected: true } );&lt;br /&gt;
		tfd_category.append( { type: &#039;option&#039;, label: &#039;Merge&#039;, value: &#039;tfm&#039; } );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
						{&lt;br /&gt;
							label: &#039;Inline deletion tag&#039;,&lt;br /&gt;
							value: &#039;tfdinline&#039;,&lt;br /&gt;
							name: &#039;tfdinline&#039;,&lt;br /&gt;
							tooltip: &#039;Use {{tfd|type=inline}} to tag the page instead of {{tfd}}. Good for inline templates (those that appear amongst the words of text).&#039;,&lt;br /&gt;
							checked: false&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							label: &#039;Wrap deletion tag with &amp;lt;noinclude&amp;gt; (for substituted templates only)&#039;,&lt;br /&gt;
							value: &#039;noinclude&#039;,&lt;br /&gt;
							name: &#039;noinclude&#039;,&lt;br /&gt;
							tooltip: &#039;Will wrap the deletion tag in &amp;amp;lt;noinclude&amp;amp;gt; tags, so that it won\&#039;t get substituted along with the template.&#039;&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
		} );&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;mfd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Miscellany for deletion&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
						{&lt;br /&gt;
							label: &#039;Wrap deletion tag with &amp;lt;noinclude&amp;gt;&#039;,&lt;br /&gt;
							value: &#039;noinclude&#039;,&lt;br /&gt;
							name: &#039;noinclude&#039;,&lt;br /&gt;
							tooltip: &#039;Will wrap the deletion tag in &amp;amp;lt;noinclude&amp;amp;gt; tags, so that it won\&#039;t transclude. Select this option for userboxes.&#039;&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
		} );&lt;br /&gt;
		if (mw.config.get(&#039;wgNamespaceNumber&#039;) === 2 /* User: */ || mw.config.get(&#039;wgNamespaceNumber&#039;) === 3 /* User talk: */) {&lt;br /&gt;
			work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
						{&lt;br /&gt;
							label: &#039;Also notify owner of userspace if they are not the page creator&#039;,&lt;br /&gt;
							value: &#039;notifyuserspace&#039;,&lt;br /&gt;
							name: &#039;notifyuserspace&#039;,&lt;br /&gt;
							tooltip: &#039;If the user in whose userspace this page is located, is not the page creator (for example, the page is a rescued article stored as a userspace draft), notify the userspace owner as well.&#039;,&lt;br /&gt;
							checked: true&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;ffd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Discussion venues for files&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;radio&#039;,&lt;br /&gt;
				name: &#039;ffdvenue&#039;,&lt;br /&gt;
				event: Twinkle.xfd.callback.ffdvenue_change,&lt;br /&gt;
				list: [&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;File for deletion&#039;,&lt;br /&gt;
						value: &#039;ffd&#039;,&lt;br /&gt;
						tooltip: &#039;General deletion discussion&#039;,&lt;br /&gt;
						checked: mw.config.get(&#039;wgNamespaceNumber&#039;) === 6&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Possibly unfree file&#039;,&lt;br /&gt;
						value: &#039;puf&#039;,&lt;br /&gt;
						tooltip: &#039;File has disputed source or licensing information&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Non-free content review&#039;,&lt;br /&gt;
						value: &#039;nfcr&#039;,&lt;br /&gt;
						tooltip: &#039;File\&#039;s compliance with non-free content criteria ([[WP:NFCC]]) is disputed. User notification does not occur for NFCR, as it is not deemed relevant.&#039;,&lt;br /&gt;
						checked: mw.config.get(&#039;wgNamespaceNumber&#039;) !== 6&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			} );&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;cfd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Categories for discussion&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		var cfd_category = work_area.append( {&lt;br /&gt;
				type: &#039;select&#039;,&lt;br /&gt;
				label: &#039;Choose type of action wanted: &#039;,&lt;br /&gt;
				name: &#039;xfdcat&#039;,&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var value = e.target.value;&lt;br /&gt;
					var target = e.target.form.xfdtarget;&lt;br /&gt;
					// update enabled status&lt;br /&gt;
					if( value === &#039;cfd&#039; ) {&lt;br /&gt;
						target.disabled = true;&lt;br /&gt;
					} else {&lt;br /&gt;
						target.disabled = false;&lt;br /&gt;
					}&lt;br /&gt;
					// update label&lt;br /&gt;
					if( value === &#039;cfs&#039; ) {&lt;br /&gt;
						target.previousSibling.textContent = &amp;quot;Target categories: &amp;quot;;&lt;br /&gt;
					} else if( value === &#039;cfc&#039; ) {&lt;br /&gt;
						target.previousSibling.textContent = &amp;quot;Target article: &amp;quot;;&lt;br /&gt;
					} else {&lt;br /&gt;
						target.previousSibling.textContent = &amp;quot;Target category: &amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
					// add/remove extra input box&lt;br /&gt;
					if( value === &#039;cfs&#039; &amp;amp;&amp;amp; $(target.parentNode).find(&amp;quot;input[name=&#039;xfdtarget2&#039;]&amp;quot;).length === 0 ) {&lt;br /&gt;
						var xfdtarget2 = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
						xfdtarget2.setAttribute(&amp;quot;name&amp;quot;, &amp;quot;xfdtarget2&amp;quot;);&lt;br /&gt;
						xfdtarget2.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;text&amp;quot;);&lt;br /&gt;
						target.parentNode.appendChild(xfdtarget2);&lt;br /&gt;
					} else {&lt;br /&gt;
						$(target.parentNode).find(&amp;quot;input[name=&#039;xfdtarget2&#039;]&amp;quot;).remove();&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		cfd_category.append( { type: &#039;option&#039;, label: &#039;Deletion&#039;, value: &#039;cfd&#039;, selected: true } );&lt;br /&gt;
		cfd_category.append( { type: &#039;option&#039;, label: &#039;Merge&#039;, value: &#039;cfm&#039; } );&lt;br /&gt;
		cfd_category.append( { type: &#039;option&#039;, label: &#039;Renaming&#039;, value: &#039;cfr&#039; } );&lt;br /&gt;
		cfd_category.append( { type: &#039;option&#039;, label: &#039;Split&#039;, value: &#039;cfs&#039; } );&lt;br /&gt;
		cfd_category.append( { type: &#039;option&#039;, label: &#039;Convert into article&#039;, value: &#039;cfc&#039; } );&lt;br /&gt;
&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;xfdtarget&#039;,&lt;br /&gt;
				label: &#039;Target page: &#039;,&lt;br /&gt;
				disabled: true,&lt;br /&gt;
				value: &#039;&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;cfds&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Categories for speedy renaming&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		var cfds_category = work_area.append( {&lt;br /&gt;
				type: &#039;select&#039;,&lt;br /&gt;
				label: &#039;C2 sub-criterion: &#039;,&lt;br /&gt;
				name: &#039;xfdcat&#039;,&lt;br /&gt;
				tooltip: &#039;See WP:CFDS for full explanations.&#039;,&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var value = e.target.value;&lt;br /&gt;
					var target = e.target.form.xfdtarget;&lt;br /&gt;
					if( value === &#039;cfd&#039; ) {&lt;br /&gt;
						target.disabled = true;&lt;br /&gt;
					} else {&lt;br /&gt;
						target.disabled = false;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		cfds_category.append( { type: &#039;option&#039;, label: &#039;C2A: Typographic and spelling fixes&#039;, value: &#039;C2A&#039;, selected: true } );&lt;br /&gt;
		cfds_category.append( { type: &#039;option&#039;, label: &#039;C2B: Naming conventions and disambiguation&#039;, value: &#039;C2B&#039; } );&lt;br /&gt;
		cfds_category.append( { type: &#039;option&#039;, label: &#039;C2C: Consistency with names of similar categories&#039;, value: &#039;C2C&#039; } );&lt;br /&gt;
		cfds_category.append( { type: &#039;option&#039;, label: &#039;C2D: Rename to match article name&#039;, value: &#039;C2D&#039; } );&lt;br /&gt;
		cfds_category.append( { type: &#039;option&#039;, label: &#039;C2E: Author request&#039;, value: &#039;C2E&#039; } );&lt;br /&gt;
&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;xfdtarget&#039;,&lt;br /&gt;
				label: &#039;New name: &#039;,&lt;br /&gt;
				value: &#039;&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;rfd&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Redirects for discussion&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		appendReasonBox();&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Nothing for anything&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// No creator notification for CFDS&lt;br /&gt;
	if (value === &amp;quot;cfds&amp;quot;) {&lt;br /&gt;
		Twinkle.xfd.previousNotify = form.notify.checked;&lt;br /&gt;
		form.notify.checked = false;&lt;br /&gt;
		form.notify.disabled = true;&lt;br /&gt;
	} else {&lt;br /&gt;
		form.notify.checked = Twinkle.xfd.previousNotify;&lt;br /&gt;
		form.notify.disabled = false;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.callback.ffdvenue_change = function twinklexfdCallbackFfdvenueChange(e) {&lt;br /&gt;
	if (e.target.values === &amp;quot;nfcr&amp;quot;) {&lt;br /&gt;
		e.target.form.notify.disabled = true;&lt;br /&gt;
		e.target.form.notify.checked = false;&lt;br /&gt;
	} else {&lt;br /&gt;
		e.target.form.notify.disabled = false;&lt;br /&gt;
		e.target.form.notify.checked = true;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.callbacks = {&lt;br /&gt;
	afd: {&lt;br /&gt;
		main: function(apiobj) {&lt;br /&gt;
			var xmlDoc = apiobj.responseXML;&lt;br /&gt;
			var titles = $(xmlDoc).find(&#039;allpages p&#039;);&lt;br /&gt;
&lt;br /&gt;
			// There has been no earlier entries with this prefix, just go on.&lt;br /&gt;
			if( titles.length &amp;lt;= 0 ) {&lt;br /&gt;
				apiobj.params.numbering = apiobj.params.number = &#039;&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				var number = 0;&lt;br /&gt;
				for( var i = 0; i &amp;lt; titles.length; ++i ) {&lt;br /&gt;
					var title = titles[i].getAttribute(&#039;title&#039;);&lt;br /&gt;
&lt;br /&gt;
					// First, simple test, is there an instance with this exact name?&lt;br /&gt;
					if( title === &#039;Wikipedia:Articles for deletion/&#039; + Morebits.pageNameNorm ) {&lt;br /&gt;
						number = Math.max( number, 1 );&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					var order_re = new RegExp( &#039;^&#039; +&lt;br /&gt;
						RegExp.escape( &#039;Wikipedia:Articles for deletion/&#039; + Morebits.pageNameNorm, true ) +&lt;br /&gt;
						&#039;\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$&#039;);&lt;br /&gt;
					var match = order_re.exec( title );&lt;br /&gt;
&lt;br /&gt;
					// No match; A non-good value&lt;br /&gt;
					if( !match ) {&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// A match, set number to the max of current&lt;br /&gt;
					number = Math.max( number, Number(match[1]) );&lt;br /&gt;
				}&lt;br /&gt;
				apiobj.params.number = Twinkle.xfd.num2order( parseInt( number, 10 ) + 1);&lt;br /&gt;
				apiobj.params.numbering = number &amp;gt; 0 ? &#039; (&#039; + apiobj.params.number + &#039; nomination)&#039; : &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			apiobj.params.discussionpage = &#039;Wikipedia:Articles for deletion/&#039; + Morebits.pageNameNorm + apiobj.params.numbering;&lt;br /&gt;
&lt;br /&gt;
			Morebits.status.info( &amp;quot;Next discussion page&amp;quot;, &amp;quot;[[&amp;quot; + apiobj.params.discussionpage + &amp;quot;]]&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
			// Updating data for the action completed event&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = apiobj.params.discussionpage;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			// Tagging article&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Adding deletion tag to article&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);  // should never be needed, but if the article is moved, we would want to follow the redirect&lt;br /&gt;
			wikipedia_page.setCallbackParameters(apiobj.params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.taggingArticle);&lt;br /&gt;
		},&lt;br /&gt;
		// Tagging needs to happen before everything else: this means we can check if there is an AfD tag already on the page&lt;br /&gt;
		taggingArticle: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			if (!pageobj.exists()) {&lt;br /&gt;
				statelem.error(&amp;quot;It seems that the page doesn&#039;t exist; perhaps it has already been deleted&amp;quot;);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Check for existing AfD tag, for the benefit of new page patrollers&lt;br /&gt;
			var textNoAfd = text.replace(/\{\{\s*(Article for deletion\/dated|AfDM)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, &amp;quot;&amp;quot;);&lt;br /&gt;
			if (text !== textNoAfd) {&lt;br /&gt;
				if (confirm(&amp;quot;An AfD tag was found on this article. Maybe someone beat you to it.  \nClick OK to replace the current AfD tag (not recommended), or Cancel to abandon your nomination.&amp;quot;)) {&lt;br /&gt;
					text = textNoAfd;&lt;br /&gt;
				} else {&lt;br /&gt;
					statelem.error(&amp;quot;Article already tagged with AfD tag, and you chose to abort&amp;quot;);&lt;br /&gt;
					window.location.reload();&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Now we know we want to go ahead with it, trigger the other AJAX requests&lt;br /&gt;
&lt;br /&gt;
			// Starting discussion page&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(params.discussionpage, &amp;quot;Creating article deletion discussion page&amp;quot;);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.discussionPage);&lt;br /&gt;
&lt;br /&gt;
			// Today&#039;s list&lt;br /&gt;
			var date = new Date();&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(&#039;Wikipedia:Articles for deletion/Log/&#039; + date.getUTCFullYear() + &#039; &#039; +&lt;br /&gt;
				date.getUTCMonthName() + &#039; &#039; + date.getUTCDate(), &amp;quot;Adding discussion to today&#039;s list&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.afd.todaysList);&lt;br /&gt;
&lt;br /&gt;
			// Notification to first contributor&lt;br /&gt;
			if (params.usertalk) {&lt;br /&gt;
				var thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
				thispage.setCallbackParameters(params);&lt;br /&gt;
				thispage.lookupCreator(Twinkle.xfd.callbacks.afd.userNotification);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Remove some tags that should always be removed on AfD.&lt;br /&gt;
			text = text.replace(/\{\{\s*(dated prod|dated prod blp|Prod blp\/dated|Proposed deletion\/dated|prod2|Proposed deletion endorsed|New unreviewed article|Unreviewed|Userspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, &amp;quot;&amp;quot;);&lt;br /&gt;
			// Then, test if there are speedy deletion-related templates on the article.&lt;br /&gt;
			var textNoSd = text.replace(/\{\{\s*(db(-\w*)?|delete|(?:hang|hold)[\- ]?on)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/ig, &amp;quot;&amp;quot;);&lt;br /&gt;
			if (text !== textNoSd &amp;amp;&amp;amp; confirm(&amp;quot;A speedy deletion tag was found on this page. Should it be removed?&amp;quot;)) {&lt;br /&gt;
				text = textNoSd;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText((params.noinclude ? &amp;quot;&amp;lt;noinclude&amp;gt;{{&amp;quot; : &amp;quot;{{&amp;quot;) + (params.number === &#039;&#039; ? &amp;quot;subst:afd|help=off&amp;quot; : (&#039;subst:afdx|&#039; +&lt;br /&gt;
				params.number + &amp;quot;|help=off&amp;quot;)) + (params.noinclude ? &amp;quot;}}&amp;lt;/noinclude&amp;gt;\n&amp;quot; : &amp;quot;}}\n&amp;quot;) + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for deletion; see [[&amp;quot; + params.discussionpage + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		discussionPage: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{subst:afd2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) +&lt;br /&gt;
				&amp;quot; ~~~~|pg=&amp;quot; + Morebits.pageNameNorm + &amp;quot;|cat=&amp;quot; + params.xfdcat + &amp;quot;}}\n&amp;quot;);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Creating deletion discussion page for [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;createonly&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var old_text = pageobj.getPageText() + &amp;quot;\n&amp;quot;;  // MW strips trailing blanks, but we like them, so we add a fake one&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var text = old_text.replace( /(&amp;lt;\!-- Add new entries to the TOP of the following list --&amp;gt;\n+)/, &amp;quot;$1{{subst:afd3|pg=&amp;quot; + Morebits.pageNameNorm + params.numbering + &amp;quot;}}\n&amp;quot;);&lt;br /&gt;
			if( text === old_text ) {&lt;br /&gt;
				var linknode = document.createElement(&#039;a&#039;);&lt;br /&gt;
				linknode.setAttribute(&amp;quot;href&amp;quot;, mw.util.getUrl(&amp;quot;Wikipedia:Twinkle/Fixing AFD&amp;quot;) + &amp;quot;?action=purge&amp;quot; );&lt;br /&gt;
				linknode.appendChild(document.createTextNode(&#039;How to fix AFD&#039;));&lt;br /&gt;
				statelem.error( [ &#039;Could not find the target spot for the discussion. To fix this problem, please see &#039;, linknode, &#039;.&#039; ] );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + params.discussionpage + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchList&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
			var notifytext = &amp;quot;\n{{subst:AFDWarning|1=&amp;quot; + Morebits.pageNameNorm + ( params.numbering !== &#039;&#039; ? &#039;|order=&amp;amp;#32;&#039; + params.numbering : &#039;&#039; ) + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:AFD|articles for deletion]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	tfd: {&lt;br /&gt;
		taggingTemplate: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText((params.noinclude ? &amp;quot;&amp;lt;noinclude&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + &amp;quot;{{subst:template for discussion|help=off|&amp;quot; +&lt;br /&gt;
				(params.tfdinline ? &amp;quot;type=inline|&amp;quot; : &amp;quot;&amp;quot;) + mw.config.get(&#039;wgTitle&#039;) + (params.noinclude ? &amp;quot;}}&amp;lt;/noinclude&amp;gt;&amp;quot; : &amp;quot;}}\n&amp;quot;) + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for deletion; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		taggingTemplateForMerge: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText((params.noinclude ? &amp;quot;&amp;lt;noinclude&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + &amp;quot;{{subst:tfm|help=off|&amp;quot; +&lt;br /&gt;
				(params.tfdinline ? &amp;quot;type=inline|1=&amp;quot; : &amp;quot;1=&amp;quot;) + params.otherTemplateName.replace(/^Template:/, &amp;quot;&amp;quot;) + &lt;br /&gt;
				(params.noinclude ? &amp;quot;}}&amp;lt;/noinclude&amp;gt;&amp;quot; : &amp;quot;}}\n&amp;quot;) + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for merging with [[&amp;quot; + params.otherTemplateName + &amp;quot;]]; see [[&amp;quot; + &lt;br /&gt;
				params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var old_text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var added_data = &amp;quot;&amp;quot;;&lt;br /&gt;
			switch( params.xfdcat ) {&lt;br /&gt;
			case &#039;tfd&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:tfd2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;tfm&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:tfm2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				alert(&amp;quot;twinklexfd in todaysList: unknown TFD action&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var text = old_text.replace( &#039;--&amp;gt;&#039;, &amp;quot;--&amp;gt;\n&amp;quot; + added_data );&lt;br /&gt;
			if( text === old_text ) {&lt;br /&gt;
				statelem.error( &#039;failed to find target spot for the discussion&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[Template:&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			var notifytext = &amp;quot;\n&amp;quot;;&lt;br /&gt;
			switch (params.xfdcat) {&lt;br /&gt;
			case &#039;tfd&#039;:&lt;br /&gt;
				notifytext += &amp;quot;{{subst:tfdnotice|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;tfm&#039;:&lt;br /&gt;
				notifytext += &amp;quot;{{subst:tfmnotice|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				alert(&amp;quot;twinklexfd in userNotification: unknown TFD action&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: nomination at [[WP:TFD|templates for discussion]] of [[&amp;quot; + pageobj.getPageName() + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	mfd: {&lt;br /&gt;
		main: function(apiobj) {&lt;br /&gt;
			var xmlDoc = apiobj.responseXML;&lt;br /&gt;
			var titles = $(xmlDoc).find(&#039;allpages p&#039;);&lt;br /&gt;
&lt;br /&gt;
			// There has been no earlier entries with this prefix, just go on.&lt;br /&gt;
			if( titles.length &amp;lt;= 0 ) {&lt;br /&gt;
				apiobj.params.numbering = apiobj.params.number = &#039;&#039;;&lt;br /&gt;
				numbering = number = &#039;&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				var number = 0;&lt;br /&gt;
				for( var i = 0; i &amp;lt; titles.length; ++i ) {&lt;br /&gt;
					var title = titles[i].getAttribute(&#039;title&#039;);&lt;br /&gt;
&lt;br /&gt;
					// First, simple test, is there an instance with this exact name?&lt;br /&gt;
					if( title === &#039;Wikipedia:Miscellany for deletion/&#039; + Morebits.pageNameNorm ) {&lt;br /&gt;
						number = Math.max( number, 1 );&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					var order_re = new RegExp( &#039;^&#039; +&lt;br /&gt;
							RegExp.escape( &#039;Wikipedia:Miscellany for deletion/&#039; + Morebits.pageNameNorm, true ) +&lt;br /&gt;
							&#039;\\s*\\(\\s*(\\d+)(?:(?:th|nd|rd|st) nom(?:ination)?)?\\s*\\)\\s*$&#039; );&lt;br /&gt;
					var match = order_re.exec( title );&lt;br /&gt;
&lt;br /&gt;
					// No match; A non-good value&lt;br /&gt;
					if( !match ) {&lt;br /&gt;
						continue;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// A match, set number to the max of current&lt;br /&gt;
					number = Math.max( number, Number(match[1]) );&lt;br /&gt;
				}&lt;br /&gt;
				apiobj.params.number = Twinkle.xfd.num2order( parseInt( number, 10 ) + 1);&lt;br /&gt;
				apiobj.params.numbering = number &amp;gt; 0 ? &#039; (&#039; + apiobj.params.number + &#039; nomination)&#039; : &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			apiobj.params.discussionpage = &amp;quot;Wikipedia:Miscellany for deletion/&amp;quot; + Morebits.pageNameNorm + apiobj.params.numbering;&lt;br /&gt;
&lt;br /&gt;
			apiobj.statelem.info( &amp;quot;next in order is [[&amp;quot; + apiobj.params.discussionpage + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
			// Tagging page&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging page with deletion tag&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);  // should never be needed, but if the page is moved, we would want to follow the redirect&lt;br /&gt;
			wikipedia_page.setCallbackParameters(apiobj.params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.mfd.taggingPage);&lt;br /&gt;
&lt;br /&gt;
			// Updating data for the action completed event&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = apiobj.params.discussionpage;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			// Discussion page&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(apiobj.params.discussionpage, &amp;quot;Creating deletion discussion page&amp;quot;);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(apiobj.params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.mfd.discussionPage);&lt;br /&gt;
&lt;br /&gt;
			// Today&#039;s list&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(&amp;quot;Wikipedia:Miscellany for deletion&amp;quot;, &amp;quot;Adding discussion to today&#039;s list&amp;quot;);&lt;br /&gt;
			//wikipedia_page.setPageSection(2);&lt;br /&gt;
				// pageSection has been disabled - the API seems to throw up with nonexistent edit conflicts&lt;br /&gt;
				// it can be turned on again once the problem is fixed, to save bandwidth&lt;br /&gt;
			//wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(apiobj.params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.mfd.todaysList);&lt;br /&gt;
&lt;br /&gt;
			// Notification to first contributor, and notification to owner of userspace (if applicable and required)&lt;br /&gt;
			if (apiobj.params.usertalk) {&lt;br /&gt;
				var thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
				thispage.setCallbackParameters(apiobj.params);&lt;br /&gt;
				thispage.lookupCreator(Twinkle.xfd.callbacks.mfd.userNotification);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		taggingPage: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText((params.noinclude ? &amp;quot;&amp;lt;noinclude&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + &amp;quot;{{&amp;quot; + ((params.number === &#039;&#039;) ? &amp;quot;mfd}}\n&amp;quot; : (&#039;mfdx|&#039; + params.number + &amp;quot;}}\n&amp;quot;)) +&lt;br /&gt;
				(params.noinclude ? &amp;quot;&amp;lt;/noinclude&amp;gt;&amp;quot; : &amp;quot;&amp;quot;) + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for deletion; see [[&amp;quot; + params.discussionpage + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		discussionPage: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{subst:mfd2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
				&amp;quot; ~~~~|pg=&amp;quot; + Morebits.pageNameNorm + &amp;quot;}}\n&amp;quot;);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Creating deletion discussion page for [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;createonly&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var date = new Date();&lt;br /&gt;
			var date_header = &amp;quot;===&amp;quot; + date.getUTCMonthName() + &#039; &#039; + date.getUTCDate() + &#039;, &#039; + date.getUTCFullYear() + &amp;quot;===\n&amp;quot;;&lt;br /&gt;
			var date_header_regex = new RegExp( &amp;quot;(===\\s*&amp;quot; + date.getUTCMonthName() + &#039;\\s+&#039; + date.getUTCDate() + &#039;,\\s+&#039; + date.getUTCFullYear() + &amp;quot;\\s*===)&amp;quot; );&lt;br /&gt;
			var new_data = &amp;quot;{{subst:mfd3|pg=&amp;quot; + Morebits.pageNameNorm + params.numbering + &amp;quot;}}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			if( date_header_regex.test( text ) ) { // we have a section already&lt;br /&gt;
				statelem.info( &#039;Found today\&#039;s section, proceeding to add new entry&#039; );&lt;br /&gt;
				text = text.replace( date_header_regex, &amp;quot;$1\n&amp;quot; + new_data );&lt;br /&gt;
			} else { // we need to create a new section&lt;br /&gt;
				statelem.info( &#039;No section for today found, proceeding to create one&#039; );&lt;br /&gt;
				text = text.replace(&amp;quot;===&amp;quot;, date_header + new_data + &amp;quot;\n\n===&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + params.discussionpage + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchList&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			// Really notify the creator&lt;br /&gt;
			Twinkle.xfd.callbacks.mfd.userNotificationMain(params, initialContrib, &amp;quot;Notifying initial contributor&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Also notify the user who owns the subpage if they are not the creator&lt;br /&gt;
			if (params.notifyuserspace) {&lt;br /&gt;
				var userspaceOwner = ((mw.config.get(&#039;wgTitle&#039;).indexOf(&#039;/&#039;) === -1) ? mw.config.get(&#039;wgTitle&#039;) : mw.config.get(&#039;wgTitle&#039;).substring(0, mw.config.get(&#039;wgTitle&#039;).indexOf(&#039;/&#039;)));&lt;br /&gt;
				if (userspaceOwner !== initialContrib) {&lt;br /&gt;
					Twinkle.xfd.callbacks.mfd.userNotificationMain(params, userspaceOwner, &amp;quot;Notifying owner of userspace&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		userNotificationMain: function(params, initialContrib, actionName)&lt;br /&gt;
		{&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, actionName + &amp;quot; (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
			var notifytext = &amp;quot;\n{{subst:MFDWarning|1=&amp;quot; + Morebits.pageNameNorm + ( params.numbering !== &#039;&#039; ? &#039;|order=&amp;amp;#32;&#039; + params.numbering : &#039;&#039; ) + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:MFD|miscellany for deletion]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	ffd: {&lt;br /&gt;
		main: function(pageobj) {&lt;br /&gt;
			// this is coming in from lookupCreator...!&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			params.uploader = initialContrib;&lt;br /&gt;
&lt;br /&gt;
			// Adding discussion&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(params.logpage, &amp;quot;Adding discussion to today&#039;s list&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.ffd.todaysList);&lt;br /&gt;
&lt;br /&gt;
			// Notification to first contributor&lt;br /&gt;
			if(params.usertalk) {&lt;br /&gt;
				var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
				var notifytext = &amp;quot;\n{{subst:idw|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				usertalkpage.setAppendText(notifytext);&lt;br /&gt;
				usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:FFD|files for deletion]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
				usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
				switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
					case &#039;yes&#039;:&lt;br /&gt;
						usertalkpage.setWatchlist(true);&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;no&#039;:&lt;br /&gt;
						usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
						break;&lt;br /&gt;
					default:&lt;br /&gt;
						usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
				usertalkpage.setFollowRedirect(true);&lt;br /&gt;
				usertalkpage.append();&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		taggingImage: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{ffd|log=&amp;quot; + params.date + &amp;quot;}}\n&amp;quot; + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for deletion; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);  // it might be possible for a file to exist without a description page&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			// add date header if the log is found to be empty (a bot should do this automatically, but it sometimes breaks down)&lt;br /&gt;
			if (!pageobj.exists()) {&lt;br /&gt;
				text = &amp;quot;{{subst:Ffd log}}&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text + &amp;quot;\n{{subst:ffd2|Reason=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
				&amp;quot;|Uploader=&amp;quot; + params.uploader + &amp;quot;|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}} ~~~~&amp;quot;);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	puf: {&lt;br /&gt;
		taggingImage: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{puf|help=off|log=&amp;quot; + params.date + &amp;quot;}}\n&amp;quot; + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Listed at [[WP:PUF|possibly unfree files]]: [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);  // it might be possible for a file to exist without a description page&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text + &amp;quot;\n{{subst:puf2|reason=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
				&amp;quot;|image=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}} ~~~~&amp;quot;);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
			var notifytext = &amp;quot;\n{{subst:idw-puf|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:PUF|possibly unfree files]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// NOTE: NFCR doesn&#039;t have any callbacks here, everything happens in callback.evaluate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	cfd: {&lt;br /&gt;
		taggingCategory: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			var added_data = &amp;quot;&amp;quot;;&lt;br /&gt;
			var editsummary = &amp;quot;&amp;quot;;&lt;br /&gt;
			switch( params.xfdcat ) {&lt;br /&gt;
			case &#039;cfd&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfd}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Category being considered for deletion; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfm&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfm|&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Category being considered for merging; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfr&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfr|&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Category being considered for renaming; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfs&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfs|&amp;quot; + params.target + &amp;quot;|&amp;quot; + params.target2 + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Category being considered for splitting; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfc&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfc|&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Category being considered for conversion to an article; see [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				alert(&amp;quot;twinklexfd in taggingCategory(): unknown CFD action&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(added_data + &amp;quot;\n&amp;quot; + text);&lt;br /&gt;
			pageobj.setEditSummary(editsummary + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);  // since categories can be populated without an actual page at that title&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var old_text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var added_data = &amp;quot;&amp;quot;;&lt;br /&gt;
			var editsummary = &amp;quot;&amp;quot;;&lt;br /&gt;
			switch( params.xfdcat ) {&lt;br /&gt;
			case &#039;cfd&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfd2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Added delete nomination of [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfm&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfm2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Added merge nomination of [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfr&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfr2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Added rename nomination of [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfs&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfs2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;|3=&amp;quot; + params.target2 + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Added split nomination of [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;cfc&#039;:&lt;br /&gt;
				added_data = &amp;quot;{{subst:cfc2|text=&amp;quot; + Morebits.string.formatReasonText(params.reason) + &lt;br /&gt;
					&amp;quot; ~~~~|1=&amp;quot; + mw.config.get(&#039;wgTitle&#039;) + &amp;quot;|2=&amp;quot; + params.target + &amp;quot;}}&amp;quot;;&lt;br /&gt;
				editsummary = &amp;quot;Added convert nomination of [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				alert(&amp;quot;twinklexfd in todaysList: unknown CFD action&amp;quot;);&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			text = old_text.replace( &#039;below this line --&amp;gt;&#039;, &amp;quot;below this line --&amp;gt;\n&amp;quot; + added_data );&lt;br /&gt;
			if( text === old_text ) {&lt;br /&gt;
				statelem.error( &#039;failed to find target spot for the discussion&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(editsummary + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
			var notifytext = &amp;quot;\n{{subst:CFDNote|1=&amp;quot; + Morebits.pageNameNorm + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:CFD|categories for discussion]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	cfds: {&lt;br /&gt;
		taggingCategory: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{subst:cfr-speedy|1=&amp;quot; + params.target + &amp;quot;}}\n&amp;quot; + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Nominated for speedy renaming; see [[WP:CFDS|Categories for discussion/Speedy]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);  // since categories can be populated without an actual page at that title&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		addToList: function(pageobj) {&lt;br /&gt;
			var old_text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var newcatname = (/^Category:/.test(params.target) ? params.target : (&amp;quot;Category:&amp;quot; + params.target));&lt;br /&gt;
			text = old_text.replace( &#039;BELOW THIS LINE --&amp;gt;&#039;, &amp;quot;BELOW THIS LINE --&amp;gt;\n* [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]] to [[:&amp;quot; +&lt;br /&gt;
				newcatname + &amp;quot;]]\u00A0\u2013 &amp;quot; + params.xfdcat + (params.reason ? (&amp;quot;: &amp;quot; + Morebits.string.formatReasonText(params.reason)) : &amp;quot;.&amp;quot;) + &lt;br /&gt;
				&amp;quot; ~~~~&amp;quot; );&lt;br /&gt;
				// U+00A0 NO-BREAK SPACE; U+2013 EN RULE&lt;br /&gt;
			if( text === old_text ) {&lt;br /&gt;
				statelem.error( &#039;failed to find target spot for the discussion&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	rfd: {&lt;br /&gt;
		// This is a callback from an API request, which gets the target of the redirect&lt;br /&gt;
		findTargetCallback: function(apiobj) {&lt;br /&gt;
			var xmlDoc = apiobj.responseXML;&lt;br /&gt;
			var target = $(xmlDoc).find(&#039;redirects r&#039;).first().attr(&#039;to&#039;);&lt;br /&gt;
			if( !target ) {&lt;br /&gt;
				apiobj.statelem.error( &amp;quot;This page is currently not a redirect, aborting&amp;quot; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			apiobj.params.target = target;&lt;br /&gt;
			Twinkle.xfd.callbacks.rfd.main(apiobj.params);&lt;br /&gt;
		},&lt;br /&gt;
		main: function(params) {&lt;br /&gt;
			var date = new Date();&lt;br /&gt;
			params.logpage = &#039;Wikipedia:Redirects for discussion/Log/&#039; + date.getUTCFullYear() + &#039; &#039; + date.getUTCMonthName() + &#039; &#039; + date.getUTCDate();&lt;br /&gt;
&lt;br /&gt;
			// Tagging redirect&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Adding deletion tag to redirect&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(false);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.rfd.taggingRedirect);&lt;br /&gt;
&lt;br /&gt;
			// Updating data for the action completed event&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = params.logpage;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to today&#039;s log&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			// Adding discussion&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(params.logpage, &amp;quot;Adding discussion to today&#039;s log&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.rfd.todaysList);&lt;br /&gt;
&lt;br /&gt;
			// Notifying initial contributor&lt;br /&gt;
			if (params.usertalk) {&lt;br /&gt;
				var thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
				thispage.setCallbackParameters(params);&lt;br /&gt;
				thispage.lookupCreator(Twinkle.xfd.callbacks.rfd.userNotification);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		taggingRedirect: function(pageobj) {&lt;br /&gt;
			var text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(&amp;quot;{{subst:rfd}}\n&amp;quot; + text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Listed for discussion at [[&amp;quot; + params.logpage + &amp;quot;#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
			pageobj.save();&lt;br /&gt;
		},&lt;br /&gt;
		todaysList: function(pageobj) {&lt;br /&gt;
			var old_text = pageobj.getPageText();&lt;br /&gt;
			var params = pageobj.getCallbackParameters();&lt;br /&gt;
			var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
			var text = old_text.replace( /(&amp;lt;\!-- Add new entries directly below this line\.? --&amp;gt;)/, &amp;quot;$1\n{{subst:rfd2|text=&amp;quot; +&lt;br /&gt;
				Morebits.string.formatReasonText(params.reason) + &amp;quot;|redirect=&amp;quot;+ Morebits.pageNameNorm + &amp;quot;|target=&amp;quot; +&lt;br /&gt;
				params.target + &amp;quot;}} ~~~~\n&amp;quot; );&lt;br /&gt;
			if( text === old_text ) {&lt;br /&gt;
				statelem.error( &#039;failed to find target spot for the discussion&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			pageobj.setPageText(text);&lt;br /&gt;
			pageobj.setEditSummary(&amp;quot;Adding [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					pageobj.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					pageobj.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			pageobj.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			pageobj.save(function() {&lt;br /&gt;
				Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
			});&lt;br /&gt;
		},&lt;br /&gt;
		userNotification: function(pageobj) {&lt;br /&gt;
			var initialContrib = pageobj.getCreator();&lt;br /&gt;
			var usertalkpage = new Morebits.wiki.page(&#039;User talk:&#039; + initialContrib, &amp;quot;Notifying initial contributor (&amp;quot; + initialContrib + &amp;quot;)&amp;quot;);&lt;br /&gt;
			var notifytext = &amp;quot;\n{{subst:RFDNote|1=&amp;quot; + Morebits.pageNameNorm + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
			usertalkpage.setAppendText(notifytext);&lt;br /&gt;
			usertalkpage.setEditSummary(&amp;quot;Notification: listing at [[WP:RFD|redirects for discussion]] of [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
			usertalkpage.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
			switch (Twinkle.getPref(&#039;xfdWatchUser&#039;)) {&lt;br /&gt;
				case &#039;yes&#039;:&lt;br /&gt;
					usertalkpage.setWatchlist(true);&lt;br /&gt;
					break;&lt;br /&gt;
				case &#039;no&#039;:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(false);&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					usertalkpage.setWatchlistFromPreferences(true);&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			usertalkpage.setFollowRedirect(true);&lt;br /&gt;
			usertalkpage.append();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.xfd.callback.evaluate = function(e) {&lt;br /&gt;
	var type = e.target.category.value;&lt;br /&gt;
	var usertalk = e.target.notify.checked;&lt;br /&gt;
	var reason = e.target.xfdreason.value;&lt;br /&gt;
	var xfdcat, xfdtarget, xfdtarget2, ffdvenue, noinclude, tfdinline, notifyuserspace;&lt;br /&gt;
	if( type === &amp;quot;afd&amp;quot; || type === &amp;quot;cfd&amp;quot; || type === &amp;quot;cfds&amp;quot; || type === &amp;quot;tfd&amp;quot; ) {&lt;br /&gt;
		xfdcat = e.target.xfdcat.value;&lt;br /&gt;
	}&lt;br /&gt;
	if( type === &amp;quot;cfd&amp;quot; || type === &amp;quot;cfds&amp;quot; ) {&lt;br /&gt;
		xfdtarget = e.target.xfdtarget.value;&lt;br /&gt;
		if (e.target.xfdtarget2) {&lt;br /&gt;
			xfdtarget2 = e.target.xfdtarget2.value;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if( type === &#039;ffd&#039; ) {&lt;br /&gt;
		var ffdvenues = e.target.ffdvenue;&lt;br /&gt;
		for( var i = 0; i &amp;lt; ffdvenues.length; i++ )&lt;br /&gt;
		{&lt;br /&gt;
			if( !ffdvenues[i].checked ) {&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			ffdvenue = ffdvenues[i].values;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if( type === &amp;quot;afd&amp;quot; || type === &amp;quot;mfd&amp;quot; || type === &amp;quot;tfd&amp;quot; ) {&lt;br /&gt;
		noinclude = e.target.noinclude.checked;&lt;br /&gt;
	}&lt;br /&gt;
	if( type === &#039;tfd&#039; ) {&lt;br /&gt;
		tfdinline = e.target.tfdinline.checked;&lt;br /&gt;
		if (e.target.xfdtarget) {&lt;br /&gt;
			xfdtarget = e.target.xfdtarget.value;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if( type === &#039;mfd&#039; ) {&lt;br /&gt;
		notifyuserspace = e.target.notifyuserspace &amp;amp;&amp;amp; e.target.notifyuserspace.checked;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
	Morebits.status.init( e.target );&lt;br /&gt;
&lt;br /&gt;
	Twinkle.xfd.currentRationale = reason;&lt;br /&gt;
	Morebits.status.onError(Twinkle.xfd.printRationale);&lt;br /&gt;
&lt;br /&gt;
	if( !type ) {&lt;br /&gt;
		Morebits.status.error( &#039;Error&#039;, &#039;no action given&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var query, wikipedia_page, wikipedia_api, logpage, params;&lt;br /&gt;
	var date = new Date();&lt;br /&gt;
	switch( type ) {&lt;br /&gt;
&lt;br /&gt;
	case &#039;afd&#039;: // AFD&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;list&#039;: &#039;allpages&#039;,&lt;br /&gt;
			&#039;apprefix&#039;: &#039;Articles for deletion/&#039; + Morebits.pageNameNorm,&lt;br /&gt;
			&#039;apnamespace&#039;: 4,&lt;br /&gt;
			&#039;apfilterredir&#039;: &#039;nonredirects&#039;,&lt;br /&gt;
			&#039;aplimit&#039;: Morebits.userIsInGroup( &#039;sysop&#039; ) ? 5000 : 500&lt;br /&gt;
		};&lt;br /&gt;
		wikipedia_api = new Morebits.wiki.api( &#039;Tagging article with deletion tag&#039;, query, Twinkle.xfd.callbacks.afd.main );&lt;br /&gt;
		wikipedia_api.params = { usertalk:usertalk, reason:reason, noinclude:noinclude, xfdcat:xfdcat };&lt;br /&gt;
		wikipedia_api.post();&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;tfd&#039;: // TFD&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
&lt;br /&gt;
		if (xfdtarget) {&lt;br /&gt;
			xfdtarget = Morebits.string.toUpperCaseFirstChar(xfdtarget.replace(/^\:?Template\:/i, &#039;&#039;));&lt;br /&gt;
		} else {&lt;br /&gt;
			xfdtarget = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		logpage = &#039;Wikipedia:Templates for discussion/Log/&#039; + date.getUTCFullYear() + &#039; &#039; + date.getUTCMonthName() + &#039; &#039; + date.getUTCDate();&lt;br /&gt;
		params = { tfdinline: tfdinline, logpage: logpage, noinclude: noinclude, xfdcat: xfdcat, target: xfdtarget, reason: reason };&lt;br /&gt;
&lt;br /&gt;
		// Tagging template(s)&lt;br /&gt;
		if (xfdcat === &amp;quot;tfm&amp;quot;) {&lt;br /&gt;
			// Tag this template&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging this template with merge tag&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			params.otherTemplateName = &amp;quot;Template:&amp;quot; + xfdtarget;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.tfd.taggingTemplateForMerge);&lt;br /&gt;
			&lt;br /&gt;
			// Tag other template&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(&amp;quot;Template:&amp;quot; + xfdtarget, &amp;quot;Tagging other template with merge tag&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
			params = $.extend(params);&lt;br /&gt;
			params.otherTemplateName = Morebits.pageNameNorm;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.tfd.taggingTemplateForMerge);&lt;br /&gt;
		} else {&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging template with deletion tag&amp;quot;);&lt;br /&gt;
			wikipedia_page.setFollowRedirect(true);  // should never be needed, but if the page is moved, we would want to follow the redirect&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.xfd.callbacks.tfd.taggingTemplate);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Updating data for the action completed event&lt;br /&gt;
		Morebits.wiki.actionCompleted.redirect = logpage;&lt;br /&gt;
		Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to today&#039;s log&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// Adding discussion&lt;br /&gt;
		wikipedia_page = new Morebits.wiki.page(logpage, &amp;quot;Adding discussion to today&#039;s log&amp;quot;);&lt;br /&gt;
		wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.load(Twinkle.xfd.callbacks.tfd.todaysList);&lt;br /&gt;
&lt;br /&gt;
		// Notification to first contributor&lt;br /&gt;
		if (usertalk) {&lt;br /&gt;
			var thispage = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
			thispage.setCallbackParameters(params);&lt;br /&gt;
			thispage.lookupCreator(Twinkle.xfd.callbacks.tfd.userNotification);&lt;br /&gt;
			&lt;br /&gt;
			// Nice try, but what if the two page creators are the same user?&lt;br /&gt;
			// Also, other XFD types don&#039;t do this... yet!&lt;br /&gt;
			//if (xfdcat === &amp;quot;tfm&amp;quot;) {&lt;br /&gt;
			//	thispage = new Morebits.wiki.page(&amp;quot;Template:&amp;quot; + xfdtarget);&lt;br /&gt;
			//	thispage.setCallbackParameters(params);&lt;br /&gt;
			//	thispage.lookupCreator(Twinkle.xfd.callbacks.tfd.userNotification);&lt;br /&gt;
			//}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.removeCheckpoint();&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;mfd&#039;: // MFD&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;list&#039;: &#039;allpages&#039;,&lt;br /&gt;
			&#039;apprefix&#039;: &#039;Miscellany for deletion/&#039; + Morebits.pageNameNorm,&lt;br /&gt;
			&#039;apnamespace&#039;: 4,&lt;br /&gt;
			&#039;apfilterredir&#039;: &#039;nonredirects&#039;,&lt;br /&gt;
			&#039;aplimit&#039;: Morebits.userIsInGroup( &#039;sysop&#039; ) ? 5000 : 500&lt;br /&gt;
		};&lt;br /&gt;
		wikipedia_api = new Morebits.wiki.api( &amp;quot;Looking for prior nominations of this page&amp;quot;, query, Twinkle.xfd.callbacks.mfd.main );&lt;br /&gt;
		wikipedia_api.params = { usertalk: usertalk, notifyuserspace: notifyuserspace, reason: reason, noinclude: noinclude, xfdcat: xfdcat };&lt;br /&gt;
		wikipedia_api.post();&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;ffd&#039;: // FFD/PUF/NFCR&lt;br /&gt;
		var dateString = date.getUTCFullYear() + &#039; &#039; + date.getUTCMonthName() + &#039; &#039; + date.getUTCDate();&lt;br /&gt;
		logpage = &#039;Wikipedia:Files for deletion/&#039; + dateString;&lt;br /&gt;
		params = { usertalk: usertalk, reason: reason, date: dateString, logpage: logpage };&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
		switch( ffdvenue ) {&lt;br /&gt;
			case &#039;puf&#039;:&lt;br /&gt;
				params.logpage = logpage = &#039;Wikipedia:Possibly unfree files/&#039; + dateString;&lt;br /&gt;
&lt;br /&gt;
				// Updating data for the action completed event&lt;br /&gt;
				Morebits.wiki.actionCompleted.redirect = logpage;&lt;br /&gt;
				Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to today&#039;s list&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
				// Tagging file&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging file with PUF tag&amp;quot;);&lt;br /&gt;
				wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
				wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
				wikipedia_page.load(Twinkle.xfd.callbacks.puf.taggingImage);&lt;br /&gt;
&lt;br /&gt;
				// Adding discussion&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(params.logpage, &amp;quot;Adding discussion to today&#039;s list&amp;quot;);&lt;br /&gt;
				wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
				wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
				wikipedia_page.load(Twinkle.xfd.callbacks.puf.todaysList);&lt;br /&gt;
&lt;br /&gt;
				// Notification to first contributor&lt;br /&gt;
				if (usertalk) {&lt;br /&gt;
					wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
					wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
					wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.puf.userNotification);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case &#039;nfcr&#039;:&lt;br /&gt;
				// Updating data for the action completed event&lt;br /&gt;
				Morebits.wiki.actionCompleted.redirect = &amp;quot;Wikipedia:Non-free content review&amp;quot;;&lt;br /&gt;
				Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
				// Tagging file&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging file with review tag&amp;quot;);&lt;br /&gt;
				wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
				wikipedia_page.setPrependText(&amp;quot;{{non-free review}}\n&amp;quot;);&lt;br /&gt;
				wikipedia_page.setEditSummary(&amp;quot;This &amp;quot; +&lt;br /&gt;
					(mw.config.get(&#039;wgNamespaceNumber&#039;) === 6 ? &amp;quot;file&amp;quot; : &amp;quot;page&amp;quot;) +&lt;br /&gt;
					&amp;quot; has been listed for review at [[Wikipedia:Non-free content review#&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
				switch (Twinkle.getPref(&#039;xfdWatchPage&#039;)) {&lt;br /&gt;
					case &#039;yes&#039;:&lt;br /&gt;
						wikipedia_page.setWatchlist(true);&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;no&#039;:&lt;br /&gt;
						wikipedia_page.setWatchlistFromPreferences(false);&lt;br /&gt;
						break;&lt;br /&gt;
					default:&lt;br /&gt;
						wikipedia_page.setWatchlistFromPreferences(true);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
				wikipedia_page.setCreateOption(&#039;recreate&#039;);  // it might be possible for a file to exist without a description page&lt;br /&gt;
				wikipedia_page.prepend();&lt;br /&gt;
&lt;br /&gt;
				// Adding discussion&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(&amp;quot;Wikipedia:Non-free content review&amp;quot;, &amp;quot;Adding discussion to the NFCR page&amp;quot;);&lt;br /&gt;
				wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
				wikipedia_page.setAppendText(&amp;quot;\n\n== [[:&amp;quot; + Morebits.pageNameNorm + &amp;quot;]] ==\n\n&amp;quot; + &lt;br /&gt;
					Morebits.string.formatReasonText(params.reason) + &amp;quot; ~~~~&amp;quot;);&lt;br /&gt;
				wikipedia_page.setEditSummary(&amp;quot;Adding [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;));&lt;br /&gt;
				switch (Twinkle.getPref(&#039;xfdWatchDiscussion&#039;)) {&lt;br /&gt;
					case &#039;yes&#039;:&lt;br /&gt;
						wikipedia_page.setWatchlist(true);&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;no&#039;:&lt;br /&gt;
						wikipedia_page.setWatchlistFromPreferences(false);&lt;br /&gt;
						break;&lt;br /&gt;
					default:&lt;br /&gt;
						wikipedia_page.setWatchlistFromPreferences(true);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
				wikipedia_page.setCreateOption(&#039;recreate&#039;);&lt;br /&gt;
				wikipedia_page.append(function() {&lt;br /&gt;
					Twinkle.xfd.currentRationale = null;  // any errors from now on do not need to print the rationale, as it is safely saved on-wiki&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
				// can&#039;t notify user on NFCR, so don&#039;t&lt;br /&gt;
&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
				break;&lt;br /&gt;
				&lt;br /&gt;
			default:&lt;br /&gt;
				// Updating data for the action completed event&lt;br /&gt;
				Morebits.wiki.actionCompleted.redirect = logpage;&lt;br /&gt;
				Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
				// Tagging file&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Adding deletion tag to file page&amp;quot;);&lt;br /&gt;
				wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
				wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
				wikipedia_page.load(Twinkle.xfd.callbacks.ffd.taggingImage);&lt;br /&gt;
&lt;br /&gt;
				// Contributor specific edits&lt;br /&gt;
				wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
				wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
				wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.ffd.main);&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		Morebits.wiki.removeCheckpoint();&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;cfd&#039;:&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
&lt;br /&gt;
		if( xfdtarget ) {&lt;br /&gt;
			xfdtarget = xfdtarget.replace( /^\:?Category\:/i, &#039;&#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			xfdtarget = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( xfdtarget2 ) {&lt;br /&gt;
			xfdtarget2 = xfdtarget2.replace( /^\:?Category\:/i, &#039;&#039; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		logpage = &#039;Wikipedia:Categories for discussion/Log/&#039; + date.getUTCFullYear() + &#039; &#039; + date.getUTCMonthName() + &#039; &#039; + date.getUTCDate();&lt;br /&gt;
&lt;br /&gt;
		params = { reason: reason, xfdcat: xfdcat, target: xfdtarget, target2: xfdtarget2, logpage: logpage };&lt;br /&gt;
&lt;br /&gt;
		// Updating data for the action completed event&lt;br /&gt;
		Morebits.wiki.actionCompleted.redirect = logpage;&lt;br /&gt;
		Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to today&#039;s log&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// Tagging category&lt;br /&gt;
		wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging category with deletion tag&amp;quot;);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.load(Twinkle.xfd.callbacks.cfd.taggingCategory);&lt;br /&gt;
&lt;br /&gt;
		// Adding discussion to list&lt;br /&gt;
		wikipedia_page = new Morebits.wiki.page(logpage, &amp;quot;Adding discussion to today&#039;s list&amp;quot;);&lt;br /&gt;
		//wikipedia_page.setPageSection(2);&lt;br /&gt;
			// pageSection has been disabled - the API seems to throw up with nonexistent edit conflicts&lt;br /&gt;
			// it can be turned on again once the problem is fixed, to save bandwidth&lt;br /&gt;
		//wikipedia_page.setFollowRedirect(true);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.load(Twinkle.xfd.callbacks.cfd.todaysList);&lt;br /&gt;
&lt;br /&gt;
		// Notification to first contributor&lt;br /&gt;
		if (usertalk) {&lt;br /&gt;
			wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;));&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.lookupCreator(Twinkle.xfd.callbacks.cfd.userNotification);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.removeCheckpoint();&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;cfds&#039;:&lt;br /&gt;
		xfdtarget = xfdtarget.replace( /^\:?Category\:/, &#039;&#039; );&lt;br /&gt;
&lt;br /&gt;
		logpage = &amp;quot;Wikipedia:Categories for discussion/Speedy&amp;quot;;&lt;br /&gt;
		params = { reason: reason, xfdcat: xfdcat, target: xfdtarget };&lt;br /&gt;
&lt;br /&gt;
		// Updating data for the action completed event&lt;br /&gt;
		Morebits.wiki.actionCompleted.redirect = logpage;&lt;br /&gt;
		Morebits.wiki.actionCompleted.notice = &amp;quot;Nomination completed, now redirecting to the discussion page&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// Tagging category&lt;br /&gt;
		wikipedia_page = new Morebits.wiki.page(mw.config.get(&#039;wgPageName&#039;), &amp;quot;Tagging category with rename tag&amp;quot;);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.load(Twinkle.xfd.callbacks.cfds.taggingCategory);&lt;br /&gt;
&lt;br /&gt;
		// Adding discussion to list&lt;br /&gt;
		wikipedia_page = new Morebits.wiki.page(logpage, &amp;quot;Adding discussion to the list&amp;quot;);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.load(Twinkle.xfd.callbacks.cfds.addToList);&lt;br /&gt;
&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;rfd&#039;:&lt;br /&gt;
		params = { usertalk: usertalk, reason: reason };&lt;br /&gt;
		if (document.getElementById(&amp;quot;softredirect&amp;quot;)) {&lt;br /&gt;
			// For soft redirects, skip straight to the callback&lt;br /&gt;
			params.target = document.getElementById(&amp;quot;softredirect&amp;quot;).textContent.replace(/^\:+/, &amp;quot;&amp;quot;);&lt;br /&gt;
			Twinkle.xfd.callbacks.rfd.main(params);&lt;br /&gt;
		} else {&lt;br /&gt;
			// Find current target of redirect&lt;br /&gt;
			query = {&lt;br /&gt;
				&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
				&#039;titles&#039;: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
				&#039;redirects&#039;: true&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api( &amp;quot;Finding target of redirect&amp;quot;, query, Twinkle.xfd.callbacks.rfd.findTargetCallback );&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		alert(&amp;quot;twinklexfd: unknown XFD discussion venue&amp;quot;);&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-morebits.js&amp;diff=23164</id>
		<title>MediaWiki:Gadget-morebits.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-morebits.js&amp;diff=23164"/>
		<updated>2013-12-15T12:25:09Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-662-g5d477ae: protect: Adjust weightings per comment at WT:TW; protect: Improve protection weighting logic; ffd: Make NFCR more palatable in article space; Remove unused pref speedyPromptOnG7; morebits: Add style attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * morebits.js&lt;br /&gt;
 * ===========&lt;br /&gt;
 * A library full of lots of goodness for user scripts on MediaWiki wikis, including Wikipedia.&lt;br /&gt;
 *&lt;br /&gt;
 * The highlights include:&lt;br /&gt;
 *   - Morebits.quickForm class - generates quick HTML forms on the fly&lt;br /&gt;
 *   - Morebits.wiki.api class - makes calls to the MediaWiki API&lt;br /&gt;
 *   - Morebits.wiki.page class - modifies pages on the wiki (edit, revert, delete, etc.)&lt;br /&gt;
 *   - Morebits.wikitext class - contains some utilities for dealing with wikitext&lt;br /&gt;
 *   - Morebits.status class - a rough-and-ready status message displayer, used by the Morebits.wiki classes&lt;br /&gt;
 *   - Morebits.simpleWindow class - a wrapper for jQuery UI Dialog with a custom look and extra features&lt;br /&gt;
 *&lt;br /&gt;
 * Dependencies:&lt;br /&gt;
 *   - The whole thing relies on jQuery.  But most wikis should provide this by default.&lt;br /&gt;
 *   - Morebits.quickForm, Morebits.simpleWindow, and Morebits.status rely on the &amp;quot;morebits.css&amp;quot; file for their styling.&lt;br /&gt;
 *   - Morebits.simpleWindow relies on jquery UI Dialog (ResourceLoader module name &#039;jquery.ui.dialog&#039;).&lt;br /&gt;
 *   - Morebits.quickForm tooltips rely on Tipsy (ResourceLoader module name &#039;jquery.tipsy&#039;).&lt;br /&gt;
 *     For external installations, Tipsy is available at [http://onehackoranother.com/projects/jquery/tipsy].&lt;br /&gt;
 *   - To create a gadget based on morebits.js, use this syntax in MediaWiki:Gadgets-definition:&lt;br /&gt;
 *       * GadgetName[ResourceLoader|dependencies=mediawiki.util,jquery.ui.dialog,jquery.tipsy]|morebits.js|morebits.css|GadgetName.js&lt;br /&gt;
 *&lt;br /&gt;
 * Most of the stuff here doesn&#039;t work on IE &amp;lt; 9.  It is your script&#039;s responsibility to enforce this.&lt;br /&gt;
 *&lt;br /&gt;
 * This library is maintained by the maintainers of Twinkle.&lt;br /&gt;
 * For queries, suggestions, help, etc., head to [[Wikipedia talk:Twinkle]] on English Wikipedia [http://en.wikipedia.org].&lt;br /&gt;
 * The latest development source is available at [https://github.com/azatoth/twinkle/blob/master/morebits.js].&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
( function ( window, document, $, undefined ) { // Wrap entire file with anonymous function&lt;br /&gt;
&lt;br /&gt;
var Morebits = {};&lt;br /&gt;
window.Morebits = Morebits;  // allow global access&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.userIsInGroup() ****************&lt;br /&gt;
 * Simple helper function to see what groups a user might belong&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.userIsInGroup = function ( group ) {&lt;br /&gt;
	return $.inArray(group, mw.config.get( &#039;wgUserGroups&#039; )) !== -1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.isIPAddress() ****************&lt;br /&gt;
 * Helper function: Returns true if given string contains a valid IPv4 or&lt;br /&gt;
 * IPv6 address&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.isIPAddress = function ( address ) {&lt;br /&gt;
	return mw.util.isIPv4Address(address) || mw.util.isIPv6Address(address);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.quickForm ****************&lt;br /&gt;
 * Morebits.quickForm is a class for creation of simple and standard forms without much &lt;br /&gt;
 * specific coding.&lt;br /&gt;
 *&lt;br /&gt;
 * Index to Morebits.quickForm element types:&lt;br /&gt;
 *&lt;br /&gt;
 *   select    A combo box (aka drop-down).&lt;br /&gt;
 *              - Attributes: name, label, multiple, size, list, event&lt;br /&gt;
 *   option    An element for a combo box.&lt;br /&gt;
 *              - Attributes: value, label, selected, disabled&lt;br /&gt;
 *   optgroup  A group of &amp;quot;option&amp;quot;s.&lt;br /&gt;
 *              - Attributes: label, list&lt;br /&gt;
 *   field     A fieldset (aka group box).&lt;br /&gt;
 *              - Attributes: name, label&lt;br /&gt;
 *   checkbox  A checkbox. Must use &amp;quot;list&amp;quot; parameter.&lt;br /&gt;
 *              - Attributes: name, list, event&lt;br /&gt;
 *              - Attributes (within list): name, label, value, checked, disabled, event, subgroup&lt;br /&gt;
 *   radio     A radio button. Must use &amp;quot;list&amp;quot; parameter.&lt;br /&gt;
 *              - Attributes: name, list, event&lt;br /&gt;
 *              - Attributes (within list): name, label, value, checked, disabled, event, subgroup&lt;br /&gt;
 *   input     A text box.&lt;br /&gt;
 *              - Attributes: name, label, value, size, disabled, readonly, maxlength, event&lt;br /&gt;
 *   dyninput  A set of text boxes with &amp;quot;Remove&amp;quot; buttons and an &amp;quot;Add&amp;quot; button.&lt;br /&gt;
 *              - Attributes: name, label, min, max, sublabel, value, size, maxlength, event&lt;br /&gt;
 *   hidden    An invisible form field.&lt;br /&gt;
 *              - Attributes: name, value&lt;br /&gt;
 *   header    A level 5 header.&lt;br /&gt;
 *              - Attributes: label&lt;br /&gt;
 *   div       A generic placeholder element or label.&lt;br /&gt;
 *              - Attributes: name, label&lt;br /&gt;
 *   submit    A submit button. Morebits.simpleWindow moves these to the footer of the dialog.&lt;br /&gt;
 *              - Attributes: name, label, disabled&lt;br /&gt;
 *   button    A generic button.&lt;br /&gt;
 *              - Attributes: name, label, disabled, event&lt;br /&gt;
 *   textarea  A big, multi-line text box.&lt;br /&gt;
 *              - Attributes: name, label, value, cols, rows, disabled, readonly&lt;br /&gt;
 *&lt;br /&gt;
 * Global attributes: id, style, tooltip, extra, adminonly&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm = function QuickForm( event, eventType ) {&lt;br /&gt;
	this.root = new Morebits.quickForm.element( { type: &#039;form&#039;, event: event, eventType:eventType } );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.prototype.render = function QuickFormRender() {&lt;br /&gt;
	var ret = this.root.render();&lt;br /&gt;
	ret.names = {};&lt;br /&gt;
	return ret;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.prototype.append = function QuickFormAppend( data ) {&lt;br /&gt;
	return this.root.append( data );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element = function QuickFormElement( data ) {&lt;br /&gt;
	this.data = data;&lt;br /&gt;
	this.childs = [];&lt;br /&gt;
	this.id = Morebits.quickForm.element.id++;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element.id = 0;&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element.prototype.append = function QuickFormElementAppend( data ) {&lt;br /&gt;
	var child;&lt;br /&gt;
	if( data instanceof Morebits.quickForm.element ) {&lt;br /&gt;
		child = data;&lt;br /&gt;
	} else {&lt;br /&gt;
		child = new Morebits.quickForm.element( data );&lt;br /&gt;
	}&lt;br /&gt;
	this.childs.push( child );&lt;br /&gt;
	return child;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This should be called without parameters: form.render()&lt;br /&gt;
Morebits.quickForm.element.prototype.render = function QuickFormElementRender( internal_subgroup_id ) {&lt;br /&gt;
	var currentNode = this.compute( this.data, internal_subgroup_id );&lt;br /&gt;
&lt;br /&gt;
	for( var i = 0; i &amp;lt; this.childs.length; ++i ) {&lt;br /&gt;
		// do not pass internal_subgroup_id to recursive calls&lt;br /&gt;
		currentNode[1].appendChild( this.childs[i].render() );&lt;br /&gt;
	}&lt;br /&gt;
	return currentNode[0];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( data, in_id ) {&lt;br /&gt;
	var node;&lt;br /&gt;
	var childContainder = null;&lt;br /&gt;
	var label;&lt;br /&gt;
	var id = ( in_id ? in_id + &#039;_&#039; : &#039;&#039; ) + &#039;node_&#039; + this.id;&lt;br /&gt;
	if( data.adminonly &amp;amp;&amp;amp; !Morebits.userIsInGroup( &#039;sysop&#039; ) ) {&lt;br /&gt;
		// hell hack alpha&lt;br /&gt;
		data.type = &#039;hidden&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var i, current, subnode;&lt;br /&gt;
	switch( data.type ) {&lt;br /&gt;
	case &#039;form&#039;:&lt;br /&gt;
		node = document.createElement( &#039;form&#039; );&lt;br /&gt;
		node.className = &amp;quot;quickform&amp;quot;;&lt;br /&gt;
		node.setAttribute( &#039;action&#039;, &#039;javascript:void(0);&#039;);&lt;br /&gt;
		if( data.event ) {&lt;br /&gt;
			node.addEventListener( data.eventType || &#039;submit&#039;, data.event , false );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;select&#039;:&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
&lt;br /&gt;
		node.setAttribute( &#039;id&#039;, &#039;div_&#039; + id );&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			label = node.appendChild( document.createElement( &#039;label&#039; ) );&lt;br /&gt;
			label.setAttribute( &#039;for&#039;, id );&lt;br /&gt;
			label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
		}&lt;br /&gt;
		var select = node.appendChild( document.createElement( &#039;select&#039; ) );&lt;br /&gt;
		if( data.event ) {&lt;br /&gt;
			select.addEventListener( &#039;change&#039;, data.event, false );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.multiple ) {&lt;br /&gt;
			select.setAttribute( &#039;multiple&#039;, &#039;multiple&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.size ) {&lt;br /&gt;
			select.setAttribute( &#039;size&#039;, data.size );&lt;br /&gt;
		}&lt;br /&gt;
		select.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
&lt;br /&gt;
		if( data.list ) {&lt;br /&gt;
			for( i = 0; i &amp;lt; data.list.length; ++i ) {&lt;br /&gt;
&lt;br /&gt;
				current = data.list[i];&lt;br /&gt;
&lt;br /&gt;
				if( current.list ) {&lt;br /&gt;
					current.type = &#039;optgroup&#039;;&lt;br /&gt;
				} else {&lt;br /&gt;
					current.type = &#039;option&#039;;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				subnode = this.compute( current );&lt;br /&gt;
				select.appendChild( subnode[0] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		childContainder = select;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;option&#039;:&lt;br /&gt;
		node = document.createElement( &#039;option&#039; );&lt;br /&gt;
		node.values = data.value;&lt;br /&gt;
		node.setAttribute( &#039;value&#039;, data.value );&lt;br /&gt;
		if( data.selected ) {&lt;br /&gt;
			node.setAttribute( &#039;selected&#039;, &#039;selected&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.disabled ) {&lt;br /&gt;
			node.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		node.setAttribute( &#039;label&#039;, data.label );&lt;br /&gt;
		node.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;optgroup&#039;:&lt;br /&gt;
		node = document.createElement( &#039;optgroup&#039; );&lt;br /&gt;
		node.setAttribute( &#039;label&#039;, data.label );&lt;br /&gt;
&lt;br /&gt;
		if( data.list ) {&lt;br /&gt;
			for( i = 0; i &amp;lt; data.list.length; ++i ) {&lt;br /&gt;
&lt;br /&gt;
				current = data.list[i];&lt;br /&gt;
				current.type = &#039;option&#039;; //must be options here&lt;br /&gt;
&lt;br /&gt;
				subnode = this.compute( current );&lt;br /&gt;
				node.appendChild( subnode[0] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;field&#039;:&lt;br /&gt;
		node = document.createElement( &#039;fieldset&#039; );&lt;br /&gt;
		label = node.appendChild( document.createElement( &#039;legend&#039; ) );&lt;br /&gt;
		label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
		if( data.name ) {&lt;br /&gt;
			node.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;checkbox&#039;:&lt;br /&gt;
	case &#039;radio&#039;:&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
		if( data.list ) {&lt;br /&gt;
			for( i = 0; i &amp;lt; data.list.length; ++i ) {&lt;br /&gt;
				var cur_id = id + &#039;_&#039; + i;&lt;br /&gt;
				current = data.list[i];&lt;br /&gt;
				var cur_div;&lt;br /&gt;
				if( current.type === &#039;header&#039; ) {&lt;br /&gt;
					// inline hack&lt;br /&gt;
					cur_div = node.appendChild( document.createElement( &#039;h6&#039; ) );&lt;br /&gt;
					cur_div.appendChild( document.createTextNode( current.label ) );&lt;br /&gt;
					if( current.tooltip ) {&lt;br /&gt;
						Morebits.quickForm.element.generateTooltip( cur_div , current );&lt;br /&gt;
					}&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				cur_div = node.appendChild( document.createElement( &#039;div&#039; ) );&lt;br /&gt;
				subnode = cur_div.appendChild( document.createElement( &#039;input&#039; ) );&lt;br /&gt;
				subnode.values = current.value;&lt;br /&gt;
				subnode.setAttribute( &#039;value&#039;, current.value );&lt;br /&gt;
				subnode.setAttribute( &#039;name&#039;, current.name || data.name );&lt;br /&gt;
				subnode.setAttribute( &#039;type&#039;, data.type );&lt;br /&gt;
				subnode.setAttribute( &#039;id&#039;, cur_id );&lt;br /&gt;
&lt;br /&gt;
				if( current.checked ) {&lt;br /&gt;
					subnode.setAttribute( &#039;checked&#039;, &#039;checked&#039; );&lt;br /&gt;
				}&lt;br /&gt;
				if( current.disabled ) {&lt;br /&gt;
					subnode.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
				}&lt;br /&gt;
				label = cur_div.appendChild( document.createElement( &#039;label&#039; ) );&lt;br /&gt;
				label.appendChild( document.createTextNode( current.label ) );&lt;br /&gt;
				label.setAttribute( &#039;for&#039;, cur_id );&lt;br /&gt;
				if( current.tooltip ) {&lt;br /&gt;
					Morebits.quickForm.element.generateTooltip( label, current );&lt;br /&gt;
				}&lt;br /&gt;
				// styles go on the label, doesn&#039;t make sense to style a checkbox/radio&lt;br /&gt;
				if( current.style ) {&lt;br /&gt;
					subnode.setAttribute( &#039;style&#039;, current.style );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				var event;&lt;br /&gt;
				if( current.subgroup ) {&lt;br /&gt;
					var tmpgroup = current.subgroup;&lt;br /&gt;
&lt;br /&gt;
					if( ! $.isArray( tmpgroup ) ) {&lt;br /&gt;
						tmpgroup = [ tmpgroup ];&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					var subgroupRaw = new Morebits.quickForm.element({&lt;br /&gt;
						type: &#039;div&#039;,&lt;br /&gt;
						id: id + &#039;_&#039; + i + &#039;_subgroup&#039;&lt;br /&gt;
					});&lt;br /&gt;
					$.each( tmpgroup, function( idx, el ) {&lt;br /&gt;
						var newEl = $.extend( {}, el );&lt;br /&gt;
						if( ! newEl.type ) {&lt;br /&gt;
							newEl.type = data.type;&lt;br /&gt;
						}&lt;br /&gt;
						newEl.name = (current.name || data.name) + &#039;.&#039; + newEl.name;&lt;br /&gt;
						subgroupRaw.append( newEl );&lt;br /&gt;
					} );&lt;br /&gt;
&lt;br /&gt;
					var subgroup = subgroupRaw.render( cur_id );&lt;br /&gt;
					subgroup.className = &amp;quot;quickformSubgroup&amp;quot;;&lt;br /&gt;
					subnode.subgroup = subgroup;&lt;br /&gt;
					subnode.shown = false;&lt;br /&gt;
&lt;br /&gt;
					event = function(e) {&lt;br /&gt;
						if( e.target.checked ) {&lt;br /&gt;
							e.target.parentNode.appendChild( e.target.subgroup );&lt;br /&gt;
							if( e.target.type === &#039;radio&#039; ) {&lt;br /&gt;
								var name = e.target.name;&lt;br /&gt;
								if( e.target.form.names[name] !== undefined ) {&lt;br /&gt;
									e.target.form.names[name].parentNode.removeChild( e.target.form.names[name].subgroup );&lt;br /&gt;
								}&lt;br /&gt;
								e.target.form.names[name] = e.target;&lt;br /&gt;
							}&lt;br /&gt;
						} else {&lt;br /&gt;
							e.target.parentNode.removeChild( e.target.subgroup );&lt;br /&gt;
						}&lt;br /&gt;
					};&lt;br /&gt;
					subnode.addEventListener( &#039;change&#039;, event, true );&lt;br /&gt;
					if( current.checked ) {&lt;br /&gt;
						subnode.parentNode.appendChild( subgroup );&lt;br /&gt;
					}&lt;br /&gt;
				} else if( data.type === &#039;radio&#039; ) {&lt;br /&gt;
					event = function(e) {&lt;br /&gt;
						if( e.target.checked ) {&lt;br /&gt;
							var name = e.target.name;&lt;br /&gt;
							if( e.target.form.names[name] !== undefined ) {&lt;br /&gt;
								e.target.form.names[name].parentNode.removeChild( e.target.form.names[name].subgroup );&lt;br /&gt;
							}&lt;br /&gt;
							delete e.target.form.names[name];&lt;br /&gt;
						}&lt;br /&gt;
					};&lt;br /&gt;
					subnode.addEventListener( &#039;change&#039;, event, true );&lt;br /&gt;
				}&lt;br /&gt;
				// add users&#039; event last, so it can interact with the subgroup&lt;br /&gt;
				if( data.event ) {&lt;br /&gt;
					subnode.addEventListener( &#039;change&#039;, data.event, false );&lt;br /&gt;
				} else if ( current.event ) {&lt;br /&gt;
					subnode.addEventListener( &#039;change&#039;, current.event, true );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;input&#039;:&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
		node.setAttribute( &#039;id&#039;, &#039;div_&#039; + id );&lt;br /&gt;
&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			label = node.appendChild( document.createElement( &#039;label&#039; ) );&lt;br /&gt;
			label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
			label.setAttribute( &#039;for&#039;, id );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		subnode = node.appendChild( document.createElement( &#039;input&#039; ) );&lt;br /&gt;
		if( data.value ) {&lt;br /&gt;
			subnode.setAttribute( &#039;value&#039;, data.value );&lt;br /&gt;
		}&lt;br /&gt;
		subnode.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		subnode.setAttribute( &#039;id&#039;, id );&lt;br /&gt;
		subnode.setAttribute( &#039;type&#039;, &#039;text&#039; );&lt;br /&gt;
		if( data.size ) {&lt;br /&gt;
			subnode.setAttribute( &#039;size&#039;, data.size );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.disabled ) {&lt;br /&gt;
			subnode.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.readonly ) {&lt;br /&gt;
			subnode.setAttribute( &#039;readonly&#039;, &#039;readonly&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.maxlength ) {&lt;br /&gt;
			subnode.setAttribute( &#039;maxlength&#039;, data.maxlength );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.event ) {&lt;br /&gt;
			subnode.addEventListener( &#039;keyup&#039;, data.event, false );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;dyninput&#039;:&lt;br /&gt;
		var min = data.min || 1;&lt;br /&gt;
		var max = data.max || Infinity;&lt;br /&gt;
&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
&lt;br /&gt;
		label = node.appendChild( document.createElement( &#039;h5&#039; ) );&lt;br /&gt;
		label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
&lt;br /&gt;
		var listNode = node.appendChild( document.createElement( &#039;div&#039; ) );&lt;br /&gt;
&lt;br /&gt;
		var more = this.compute( {&lt;br /&gt;
				type: &#039;button&#039;,&lt;br /&gt;
				label: &#039;more&#039;,&lt;br /&gt;
				disabled: min &amp;gt;= max,&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var area = e.target.area;&lt;br /&gt;
					var new_node =  new Morebits.quickForm.element( e.target.sublist );&lt;br /&gt;
					e.target.area.appendChild( new_node.render() );&lt;br /&gt;
&lt;br /&gt;
					if( ++e.target.counter &amp;gt;= e.target.max ) {&lt;br /&gt;
						e.target.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
					}&lt;br /&gt;
					e.stopPropagation();&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
		node.appendChild( more[0] );&lt;br /&gt;
		var moreButton = more[1];&lt;br /&gt;
&lt;br /&gt;
		var sublist = {&lt;br /&gt;
			type: &#039;_dyninput_element&#039;,&lt;br /&gt;
			label: data.sublabel || data.label,&lt;br /&gt;
			name: data.name,&lt;br /&gt;
			value: data.value,&lt;br /&gt;
			size: data.size,&lt;br /&gt;
			remove: false,&lt;br /&gt;
			maxlength: data.maxlength,&lt;br /&gt;
			event: data.event&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		for( i = 0; i &amp;lt; min; ++i ) {&lt;br /&gt;
			var elem = new Morebits.quickForm.element( sublist );&lt;br /&gt;
			listNode.appendChild( elem.render() );&lt;br /&gt;
		}&lt;br /&gt;
		sublist.remove = true;&lt;br /&gt;
		sublist.morebutton = moreButton;&lt;br /&gt;
		sublist.listnode = listNode;&lt;br /&gt;
&lt;br /&gt;
		moreButton.sublist = sublist;&lt;br /&gt;
		moreButton.area = listNode;&lt;br /&gt;
		moreButton.max = max - min;&lt;br /&gt;
		moreButton.counter = 0;&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;_dyninput_element&#039;: // Private, similar to normal input&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			label = node.appendChild( document.createElement( &#039;label&#039; ) );&lt;br /&gt;
			label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
			label.setAttribute( &#039;for&#039;, id );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		subnode = node.appendChild( document.createElement( &#039;input&#039; ) );&lt;br /&gt;
		if( data.value ) {&lt;br /&gt;
			subnode.setAttribute( &#039;value&#039;, data.value );&lt;br /&gt;
		}&lt;br /&gt;
		subnode.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		subnode.setAttribute( &#039;type&#039;, &#039;text&#039; );&lt;br /&gt;
		if( data.size ) {&lt;br /&gt;
			subnode.setAttribute( &#039;size&#039;, data.size );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.maxlength ) {&lt;br /&gt;
			subnode.setAttribute( &#039;maxlength&#039;, data.maxlength );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.event ) {&lt;br /&gt;
			subnode.addEventListener( &#039;keyup&#039;, data.event, false );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.remove ) {&lt;br /&gt;
			var remove = this.compute( {&lt;br /&gt;
					type: &#039;button&#039;,&lt;br /&gt;
					label: &#039;remove&#039;,&lt;br /&gt;
					event: function(e) {&lt;br /&gt;
						var list = e.target.listnode;&lt;br /&gt;
						var node = e.target.inputnode;&lt;br /&gt;
						var more = e.target.morebutton;&lt;br /&gt;
&lt;br /&gt;
						list.removeChild( node );&lt;br /&gt;
						--more.counter;&lt;br /&gt;
						more.removeAttribute( &#039;disabled&#039; );&lt;br /&gt;
						e.stopPropagation();&lt;br /&gt;
					}&lt;br /&gt;
				} );&lt;br /&gt;
			node.appendChild( remove[0] );&lt;br /&gt;
			var removeButton = remove[1];&lt;br /&gt;
			removeButton.inputnode = node;&lt;br /&gt;
			removeButton.listnode = data.listnode;&lt;br /&gt;
			removeButton.morebutton = data.morebutton;&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;hidden&#039;:&lt;br /&gt;
		node = document.createElement( &#039;input&#039; );&lt;br /&gt;
		node.setAttribute( &#039;type&#039;, &#039;hidden&#039; );&lt;br /&gt;
		node.values = data.value;&lt;br /&gt;
		node.setAttribute( &#039;value&#039;, data.value );&lt;br /&gt;
		node.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;header&#039;:&lt;br /&gt;
		node = document.createElement( &#039;h5&#039; );&lt;br /&gt;
		node.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;div&#039;:&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
		if (data.name) {&lt;br /&gt;
			node.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		}&lt;br /&gt;
		if (data.label) {&lt;br /&gt;
			if ( ! $.isArray( data.label ) ) {&lt;br /&gt;
				data.label = [ data.label ];&lt;br /&gt;
			}&lt;br /&gt;
			var result = document.createElement( &#039;span&#039; );&lt;br /&gt;
			result.className = &#039;quickformDescription&#039;;&lt;br /&gt;
			for( i = 0; i &amp;lt; data.label.length; ++i ) {&lt;br /&gt;
				if( typeof data.label[i] === &#039;string&#039; ) {&lt;br /&gt;
					result.appendChild( document.createTextNode( data.label[i] ) );&lt;br /&gt;
				} else if( data.label[i] instanceof Element ) {&lt;br /&gt;
					result.appendChild( data.label[i] );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			node.appendChild( result );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;submit&#039;:&lt;br /&gt;
		node = document.createElement( &#039;span&#039; );&lt;br /&gt;
		childContainder = node.appendChild(document.createElement( &#039;input&#039; ));&lt;br /&gt;
		childContainder.setAttribute( &#039;type&#039;, &#039;submit&#039; );&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			childContainder.setAttribute( &#039;value&#039;, data.label );&lt;br /&gt;
		}&lt;br /&gt;
		childContainder.setAttribute( &#039;name&#039;, data.name || &#039;submit&#039; );&lt;br /&gt;
		if( data.disabled ) {&lt;br /&gt;
			childContainder.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;button&#039;:&lt;br /&gt;
		node = document.createElement( &#039;span&#039; );&lt;br /&gt;
		childContainder = node.appendChild(document.createElement( &#039;input&#039; ));&lt;br /&gt;
		childContainder.setAttribute( &#039;type&#039;, &#039;button&#039; );&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			childContainder.setAttribute( &#039;value&#039;, data.label );&lt;br /&gt;
		}&lt;br /&gt;
		childContainder.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		if( data.disabled ) {&lt;br /&gt;
			childContainder.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.event ) {&lt;br /&gt;
			childContainder.addEventListener( &#039;click&#039;, data.event, false );&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;textarea&#039;:&lt;br /&gt;
		node = document.createElement( &#039;div&#039; );&lt;br /&gt;
		node.setAttribute( &#039;id&#039;, &#039;div_&#039; + id );&lt;br /&gt;
		if( data.label ) {&lt;br /&gt;
			label = node.appendChild( document.createElement( &#039;h5&#039; ) );&lt;br /&gt;
			label.appendChild( document.createTextNode( data.label ) );&lt;br /&gt;
			// TODO need to nest a &amp;lt;label&amp;gt; tag in here without creating extra vertical space&lt;br /&gt;
			//label.setAttribute( &#039;for&#039;, id );&lt;br /&gt;
		}&lt;br /&gt;
		subnode = node.appendChild( document.createElement( &#039;textarea&#039; ) );&lt;br /&gt;
		subnode.setAttribute( &#039;name&#039;, data.name );&lt;br /&gt;
		if( data.cols ) {&lt;br /&gt;
			subnode.setAttribute( &#039;cols&#039;, data.cols );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.rows ) {&lt;br /&gt;
			subnode.setAttribute( &#039;rows&#039;, data.rows );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.disabled ) {&lt;br /&gt;
			subnode.setAttribute( &#039;disabled&#039;, &#039;disabled&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.readonly ) {&lt;br /&gt;
			subnode.setAttribute( &#039;readonly&#039;, &#039;readonly&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if( data.value ) {&lt;br /&gt;
			subnode.value = data.value;&lt;br /&gt;
		}&lt;br /&gt;
		break;&lt;br /&gt;
	default:&lt;br /&gt;
		throw new Error(&amp;quot;Morebits.quickForm: unknown element type &amp;quot; + data.type.toString());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if( !childContainder ) {&lt;br /&gt;
		childContainder = node;&lt;br /&gt;
	}&lt;br /&gt;
	if( data.tooltip ) {&lt;br /&gt;
		Morebits.quickForm.element.generateTooltip( label || node , data );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if( data.extra ) {&lt;br /&gt;
		childContainder.extra = data.extra;&lt;br /&gt;
	}&lt;br /&gt;
	if( data.style ) {&lt;br /&gt;
		childContainder.setAttribute( &#039;style&#039;, data.style );&lt;br /&gt;
	}&lt;br /&gt;
	childContainder.setAttribute( &#039;id&#039;, data.id || id );&lt;br /&gt;
&lt;br /&gt;
	return [ node, childContainder ];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element.autoNWSW = function() {&lt;br /&gt;
	return $(this).offset().top &amp;gt; ($(document).scrollTop() + $(window).height() / 2) ? &#039;sw&#039; : &#039;nw&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.element.generateTooltip = function QuickFormElementGenerateTooltip( node, data ) {&lt;br /&gt;
	$(&#039;&amp;lt;span/&amp;gt;&#039;, {&lt;br /&gt;
			&#039;class&#039;: &#039;ui-icon ui-icon-help ui-icon-inline morebits-tooltip&#039;&lt;br /&gt;
		}).appendTo(node).tipsy({&lt;br /&gt;
			&#039;fallback&#039;: data.tooltip,&lt;br /&gt;
			&#039;fade&#039;: true,&lt;br /&gt;
			&#039;gravity&#039;: (data.type === &amp;quot;input&amp;quot; || data.type === &amp;quot;select&amp;quot;) ? &lt;br /&gt;
				Morebits.quickForm.element.autoNWSW : $.fn.tipsy.autoWE,&lt;br /&gt;
			&#039;html&#039;: true,&lt;br /&gt;
			&#039;delayOut&#039;: 250&lt;br /&gt;
		});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some utility methods for manipulating quickForms after their creation&lt;br /&gt;
 * (None of them work for &amp;quot;dyninput&amp;quot; type fields at present)&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.getElements(form, fieldName)&lt;br /&gt;
 *    Returns all form elements with a given field name or ID&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.getCheckboxOrRadio(elementArray, value)&lt;br /&gt;
 *    Searches the array of elements for a checkbox or radio button with a certain |value| attribute&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.getElementContainer(element)&lt;br /&gt;
 *    Returns the &amp;lt;div&amp;gt; containing the form element, or the form element itself&lt;br /&gt;
 *    May not work as expected on checkboxes or radios&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.getElementLabelObject(element)&lt;br /&gt;
 *    Gets the HTML element that contains the label of the given form element (mainly for internal use)&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.getElementLabel(element)&lt;br /&gt;
 *    Gets the label text of the element&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.setElementLabel(element, labelText)&lt;br /&gt;
 *    Sets the label of the element to the given text&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.overrideElementLabel(element, temporaryLabelText)&lt;br /&gt;
 *    Stores the element&#039;s current label, and temporarily sets the label to the given text&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.resetElementLabel(element)&lt;br /&gt;
 *    Restores the label stored by overrideElementLabel&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.setElementVisibility(element, visibility)&lt;br /&gt;
 *    Shows or hides a form element plus its label and tooltip&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.quickForm.setElementTooltipVisibility(element, visibility)&lt;br /&gt;
 *    Shows or hides the &amp;quot;question mark&amp;quot; icon next to a form element&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.getElements = function QuickFormGetElements(form, fieldName) {&lt;br /&gt;
	var $form = $(form);&lt;br /&gt;
	var $elements = $form.find(&#039;[name=&amp;quot;&#039; + fieldName + &#039;&amp;quot;]&#039;);&lt;br /&gt;
	if ($elements.length &amp;gt; 0) {&lt;br /&gt;
		return $elements.toArray();&lt;br /&gt;
	}&lt;br /&gt;
	$elements = $form.find(&#039;#&#039; + fieldName);&lt;br /&gt;
	if ($elements.length &amp;gt; 0) {&lt;br /&gt;
		return $elements.toArray();&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.getCheckboxOrRadio = function QuickFormGetCheckboxOrRadio(elementArray, value) {&lt;br /&gt;
	var found = $.grep(elementArray, function(el) {&lt;br /&gt;
		return el.value === value;&lt;br /&gt;
	});&lt;br /&gt;
	if (found.length &amp;gt; 0) {&lt;br /&gt;
		return found[0];&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.getElementContainer = function QuickFormGetElementContainer(element) {&lt;br /&gt;
	// for divs, headings and fieldsets, the container is the element itself&lt;br /&gt;
	if (element instanceof HTMLFieldSetElement || element instanceof HTMLDivElement ||&lt;br /&gt;
			element instanceof HTMLHeadingElement) {&lt;br /&gt;
		return element;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// for others, just return the parent node&lt;br /&gt;
	return element.parentNode;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.getElementLabelObject = function QuickFormGetElementLabelObject(element) {&lt;br /&gt;
	// for buttons, divs and headers, the label is on the element itself&lt;br /&gt;
	if (element.type === &amp;quot;button&amp;quot; || element.type === &amp;quot;submit&amp;quot; ||&lt;br /&gt;
			element instanceof HTMLDivElement || element instanceof HTMLHeadingElement) {&lt;br /&gt;
		return element;&lt;br /&gt;
&lt;br /&gt;
	// for fieldsets, the label is the child &amp;lt;legend&amp;gt; element&lt;br /&gt;
	} else if (element instanceof HTMLFieldSetElement) {&lt;br /&gt;
		return element.getElementsByTagName(&amp;quot;legend&amp;quot;)[0];&lt;br /&gt;
&lt;br /&gt;
	// for textareas, the label is the sibling &amp;lt;h5&amp;gt; element&lt;br /&gt;
	} else if (element instanceof HTMLTextAreaElement) {&lt;br /&gt;
		return element.parentNode.getElementsByTagName(&amp;quot;h5&amp;quot;)[0];&lt;br /&gt;
&lt;br /&gt;
	// for others, the label is the sibling &amp;lt;label&amp;gt; element&lt;br /&gt;
	} else {&lt;br /&gt;
		return element.parentNode.getElementsByTagName(&amp;quot;label&amp;quot;)[0];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.getElementLabel = function QuickFormGetElementLabel(element) {&lt;br /&gt;
	var labelElement = Morebits.quickForm.getElementLabelObject(element);&lt;br /&gt;
&lt;br /&gt;
	if (!labelElement) {&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	return labelElement.firstChild.textContent;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.setElementLabel = function QuickFormSetElementLabel(element, labelText) {&lt;br /&gt;
	var labelElement = Morebits.quickForm.getElementLabelObject(element);&lt;br /&gt;
&lt;br /&gt;
	if (!labelElement) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	labelElement.firstChild.textContent = labelText;&lt;br /&gt;
	return true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.overrideElementLabel = function QuickFormOverrideElementLabel(element, temporaryLabelText) {&lt;br /&gt;
	if (!element.hasAttribute(&amp;quot;data-oldlabel&amp;quot;)) {&lt;br /&gt;
		element.setAttribute(&amp;quot;data-oldlabel&amp;quot;, Morebits.quickForm.getElementLabel(element));&lt;br /&gt;
	}&lt;br /&gt;
	return Morebits.quickForm.setElementLabel(element, temporaryLabelText);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.resetElementLabel = function QuickFormResetElementLabel(element) {&lt;br /&gt;
	if (element.hasAttribute(&amp;quot;data-oldlabel&amp;quot;)) {&lt;br /&gt;
		return Morebits.quickForm.setElementLabel(element, element.getAttribute(&amp;quot;data-oldlabel&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	return null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.setElementVisibility = function QuickFormSetElementVisibility(element, visibility) {&lt;br /&gt;
	$(element).toggle(visibility);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.quickForm.setElementTooltipVisibility = function QuickFormSetElementTooltipVisibility(element, visibility) {&lt;br /&gt;
	$(Morebits.quickForm.getElementContainer(element)).find(&amp;quot;.morebits-tooltip&amp;quot;).toggle(visibility);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** HTMLFormElement ****************&lt;br /&gt;
 *&lt;br /&gt;
 * getChecked: &lt;br /&gt;
 *   XXX Doesn&#039;t seem to work reliably across all browsers at the moment. -- see getChecked2 in twinkleunlink.js, which is better&lt;br /&gt;
 *&lt;br /&gt;
 *   Returns an array containing the values of elements with the given name, that has it&#039;s&lt;br /&gt;
 *   checked property set to true. (i.e. a checkbox or a radiobutton is checked), or select options&lt;br /&gt;
 *   that have selected set to true. (don&#039;t try to mix selects with radio/checkboxes, please)&lt;br /&gt;
 *   Type is optional and can specify if either radio or checkbox (for the event&lt;br /&gt;
 *   that both checkboxes and radiobuttons have the same name.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
HTMLFormElement.prototype.getChecked = function( name, type ) {&lt;br /&gt;
	var elements = this.elements[name];&lt;br /&gt;
	if( !elements ) {&lt;br /&gt;
		// if the element doesn&#039;t exists, return null.&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
	var return_array = [];&lt;br /&gt;
	var i;&lt;br /&gt;
	if( elements instanceof HTMLSelectElement ) {&lt;br /&gt;
		var options = elements.options;&lt;br /&gt;
		for( i = 0; i &amp;lt; options.length; ++i ) {&lt;br /&gt;
			if( options[i].selected ) {&lt;br /&gt;
				if( options[i].values ) {&lt;br /&gt;
					return_array.push( options[i].values );&lt;br /&gt;
				} else {&lt;br /&gt;
					return_array.push( options[i].value );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} else if( elements instanceof HTMLInputElement ) {&lt;br /&gt;
		if( type &amp;amp;&amp;amp; elements.type !== type ) {&lt;br /&gt;
			return [];&lt;br /&gt;
		} else if( elements.checked ) {&lt;br /&gt;
			return [ elements.value ];&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		for( i = 0; i &amp;lt; elements.length; ++i ) {&lt;br /&gt;
			if( elements[i].checked ) {&lt;br /&gt;
				if( type &amp;amp;&amp;amp; elements[i].type !== type ) {&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
				if( elements[i].values ) {&lt;br /&gt;
					return_array.push( elements[i].values );&lt;br /&gt;
				} else {&lt;br /&gt;
					return_array.push( elements[i].value );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return return_array;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** RegExp ****************&lt;br /&gt;
 *&lt;br /&gt;
 * RegExp.escape: Will escape a string to be used in a RegExp&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
RegExp.escape = function( text, space_fix ) {&lt;br /&gt;
	text = $.escapeRE(text);&lt;br /&gt;
&lt;br /&gt;
	// Special MediaWiki escape - underscore/space are often equivalent&lt;br /&gt;
	if( space_fix ) {&lt;br /&gt;
		text = text.replace( / |_/g, &#039;[_ ]&#039; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.bytes ****************&lt;br /&gt;
 * Utility object for formatting byte values&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.bytes = function( value ) {&lt;br /&gt;
	if( typeof value === &#039;string&#039; ) {&lt;br /&gt;
		var res = /(\d+) ?(\w?)(i?)B?/.exec( value );&lt;br /&gt;
		var number = res[1];&lt;br /&gt;
		var mag = res[2];&lt;br /&gt;
		var si = res[3];&lt;br /&gt;
&lt;br /&gt;
		if( !number ) {&lt;br /&gt;
			this.number = 0;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( !si ) {&lt;br /&gt;
			this.value = number * Math.pow( 10, Morebits.bytes.magnitudes[mag] * 3 );&lt;br /&gt;
		} else {&lt;br /&gt;
			this.value = number * Math.pow( 2, Morebits.bytes.magnitudes[mag] * 10 );&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		this.value = value;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.bytes.magnitudes = {&lt;br /&gt;
	&#039;&#039;: 0,&lt;br /&gt;
	&#039;K&#039;: 1,&lt;br /&gt;
	&#039;M&#039;: 2,&lt;br /&gt;
	&#039;G&#039;: 3,&lt;br /&gt;
	&#039;T&#039;: 4,&lt;br /&gt;
	&#039;P&#039;: 5,&lt;br /&gt;
	&#039;E&#039;: 6,&lt;br /&gt;
	&#039;Z&#039;: 7,&lt;br /&gt;
	&#039;Y&#039;: 8&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.bytes.rmagnitudes = {&lt;br /&gt;
	0: &#039;&#039;,&lt;br /&gt;
	1: &#039;K&#039;,&lt;br /&gt;
	2: &#039;M&#039;,&lt;br /&gt;
	3: &#039;G&#039;,&lt;br /&gt;
	4: &#039;T&#039;,&lt;br /&gt;
	5: &#039;P&#039;,&lt;br /&gt;
	6: &#039;E&#039;,&lt;br /&gt;
	7: &#039;Z&#039;,&lt;br /&gt;
	8: &#039;Y&#039;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.bytes.prototype.valueOf = function() {&lt;br /&gt;
	return this.value;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.bytes.prototype.toString = function( magnitude ) {&lt;br /&gt;
	var tmp = this.value;&lt;br /&gt;
	if( magnitude ) {&lt;br /&gt;
		var si = /i/.test(magnitude);&lt;br /&gt;
		var mag = magnitude.replace( /.*?(\w)i?B?.*/g, &#039;$1&#039; );&lt;br /&gt;
		if( si ) {&lt;br /&gt;
			tmp /= Math.pow( 2, Morebits.bytes.magnitudes[mag] * 10 );&lt;br /&gt;
		} else {&lt;br /&gt;
			tmp /= Math.pow( 10, Morebits.bytes.magnitudes[mag] * 3 );&lt;br /&gt;
		}&lt;br /&gt;
		if( parseInt( tmp, 10 ) !== tmp ) {&lt;br /&gt;
			tmp = Number( tmp ).toPrecision( 4 );&lt;br /&gt;
		}&lt;br /&gt;
		return tmp + &#039; &#039; + mag + (si?&#039;i&#039;:&#039;&#039;) + &#039;B&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		// si per default&lt;br /&gt;
		var current = 0;&lt;br /&gt;
		while( tmp &amp;gt;= 1024 ) {&lt;br /&gt;
			tmp /= 1024;&lt;br /&gt;
			++current;&lt;br /&gt;
		}&lt;br /&gt;
		tmp = this.value / Math.pow( 2, current * 10 );&lt;br /&gt;
		if( parseInt( tmp, 10 ) !== tmp ) {&lt;br /&gt;
			tmp = Number( tmp ).toPrecision( 4 );&lt;br /&gt;
		}&lt;br /&gt;
		return tmp + &#039; &#039; + Morebits.bytes.rmagnitudes[current] + ( current &amp;gt; 0 ? &#039;iB&#039; : &#039;B&#039; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** String; Morebits.string ****************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if (!String.prototype.trimLeft) {&lt;br /&gt;
	String.prototype.trimLeft = function stringPrototypeLtrim( ) {&lt;br /&gt;
		return this.replace( /^[\s]+/g, &amp;quot;&amp;quot; );&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!String.prototype.trimRight) {&lt;br /&gt;
	String.prototype.trimRight = function stringPrototypeRtrim( ) {&lt;br /&gt;
		return this.replace( /[\s]+$/g, &amp;quot;&amp;quot; );&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!String.prototype.trim) {&lt;br /&gt;
	String.prototype.trim = function stringPrototypeTrim( ) {&lt;br /&gt;
		return this.trimRight().trimLeft();&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Helper functions to change case of a string&lt;br /&gt;
Morebits.string = {&lt;br /&gt;
	toUpperCaseFirstChar: function(str) {&lt;br /&gt;
		str = str.toString();&lt;br /&gt;
		return str.substr( 0, 1 ).toUpperCase() + str.substr( 1 );&lt;br /&gt;
	},&lt;br /&gt;
	toLowerCaseFirstChar: function(str) {&lt;br /&gt;
		str = str.toString();&lt;br /&gt;
		return str.substr( 0, 1 ).toLowerCase() + str.substr( 1 );&lt;br /&gt;
	},&lt;br /&gt;
	splitWeightedByKeys: function( str, start, end, skip ) {&lt;br /&gt;
		if( start.length !== end.length ) {&lt;br /&gt;
			throw new Error( &#039;start marker and end marker must be of the same length&#039; );&lt;br /&gt;
		}&lt;br /&gt;
		var level = 0;&lt;br /&gt;
		var initial = null;&lt;br /&gt;
		var result = [];&lt;br /&gt;
		if( ! $.isArray( skip ) ) {&lt;br /&gt;
			if( skip === undefined ) {&lt;br /&gt;
				skip = [];&lt;br /&gt;
			} else if( typeof skip === &#039;string&#039; ) {&lt;br /&gt;
				skip = [ skip ];&lt;br /&gt;
			} else {&lt;br /&gt;
				throw new Error( &amp;quot;non-applicable skip parameter&amp;quot; );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for( var i  = 0; i &amp;lt; str.length; ++i ) {&lt;br /&gt;
			for( var j = 0; j &amp;lt; skip.length; ++j ) {&lt;br /&gt;
				if( str.substr( i, skip[j].length ) === skip[j] ) {&lt;br /&gt;
					i += skip[j].length - 1;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if( str.substr( i, start.length ) === start ) {&lt;br /&gt;
				if( initial === null ) {&lt;br /&gt;
					initial = i;&lt;br /&gt;
				}&lt;br /&gt;
				++level;&lt;br /&gt;
				i += start.length - 1;&lt;br /&gt;
			} else if( str.substr( i, end.length ) === end ) {&lt;br /&gt;
				--level;&lt;br /&gt;
				i += end.length - 1;&lt;br /&gt;
			}&lt;br /&gt;
			if( !level &amp;amp;&amp;amp; initial !== null ) {&lt;br /&gt;
				result.push( str.substring( initial, i + 1 ) );&lt;br /&gt;
				initial = null;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return result;&lt;br /&gt;
	},&lt;br /&gt;
	// for deletion/other templates taking a freeform &amp;quot;reason&amp;quot; from a textarea (e.g. PROD, XFD, RPP)&lt;br /&gt;
	formatReasonText: function( str ) {&lt;br /&gt;
		return str.toString().trimRight().replace(/\|/g, &amp;quot;{{subst:!}}&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.array ****************&lt;br /&gt;
 *&lt;br /&gt;
 * uniq(arr): returns a copy of the array with duplicates removed&lt;br /&gt;
 *&lt;br /&gt;
 * dups(arr): returns a copy of the array with the first instance of each value&lt;br /&gt;
 *            removed; subsequent instances of those values (duplicates) remain&lt;br /&gt;
 *&lt;br /&gt;
 * chunk(arr, size): breaks up |arr| into smaller arrays of length |size|, and&lt;br /&gt;
 *                   returns an array of these &amp;quot;chunked&amp;quot; arrays&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.array = {&lt;br /&gt;
	uniq: function(arr) {&lt;br /&gt;
		if ( ! $.isArray( arr ) ) {&lt;br /&gt;
			throw &amp;quot;A non-array object passed to Morebits.array.uniq&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		var result = [];&lt;br /&gt;
		for( var i = 0; i &amp;lt; arr.length; ++i ) {&lt;br /&gt;
			var current = arr[i];&lt;br /&gt;
			if( result.indexOf( current ) === -1 ) {&lt;br /&gt;
				result.push( current );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return result;&lt;br /&gt;
	},&lt;br /&gt;
	dups: function(arr) {&lt;br /&gt;
		if ( ! $.isArray( arr ) ) {&lt;br /&gt;
			throw &amp;quot;A non-array object passed to Morebits.array.dups&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		var uniques = [];&lt;br /&gt;
		var result = [];&lt;br /&gt;
		for( var i = 0; i &amp;lt; arr.length; ++i ) {&lt;br /&gt;
			var current = arr[i];&lt;br /&gt;
			if( uniques.indexOf( current ) === -1 ) {&lt;br /&gt;
				uniques.push( current );&lt;br /&gt;
			} else {&lt;br /&gt;
				result.push( current );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return result;&lt;br /&gt;
	},&lt;br /&gt;
	chunk: function( arr, size ) {&lt;br /&gt;
		if ( ! $.isArray( arr ) ) {&lt;br /&gt;
			throw &amp;quot;A non-array object passed to Morebits.array.chunk&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		if( typeof size !== &#039;number&#039; || size &amp;lt;= 0 ) { // pretty impossible to do anything :)&lt;br /&gt;
			return [ arr ]; // we return an array consisting of this array.&lt;br /&gt;
		}&lt;br /&gt;
		var result = [];&lt;br /&gt;
		var current;&lt;br /&gt;
		for( var i = 0; i &amp;lt; arr.length; ++i ) {&lt;br /&gt;
			if( i % size === 0 ) { // when &#039;i&#039; is 0, this is always true, so we start by creating one.&lt;br /&gt;
				current = [];&lt;br /&gt;
				result.push( current );&lt;br /&gt;
			}&lt;br /&gt;
			current.push( arr[i] );&lt;br /&gt;
		}&lt;br /&gt;
		return result;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.getPageAssociatedUser ****************&lt;br /&gt;
 * Get the user associated with the currently-viewed page.&lt;br /&gt;
 * Currently works on User:, User talk:, Special:Contributions.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.getPageAssociatedUser = function(){&lt;br /&gt;
	var thisNamespaceId = mw.config.get(&#039;wgNamespaceNumber&#039;);&lt;br /&gt;
&lt;br /&gt;
	if ( thisNamespaceId === 2 /* User: */ || thisNamespaceId === 3 /* User talk: */ ) {&lt;br /&gt;
		return mw.config.get(&#039;wgTitle&#039;).split( &#039;/&#039; )[0];  // only first part before any slashes, to work on subpages&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( thisNamespaceId === -1 /* Special: */ &amp;amp;&amp;amp; mw.config.get(&#039;wgCanonicalSpecialPageName&#039;) === &amp;quot;Contributions&amp;quot; ) {&lt;br /&gt;
		return $(&#039;table.mw-contributions-table input[name=&amp;quot;target&amp;quot;]&#039;)[0].getAttribute(&#039;value&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.pageNameNorm ****************&lt;br /&gt;
 * Stores a normalized version of the wgPageName variable (underscores converted to spaces).&lt;br /&gt;
 * For queen/king/whatever and country!&lt;br /&gt;
 */&lt;br /&gt;
Morebits.pageNameNorm = mw.config.get(&#039;wgPageName&#039;).replace(/_/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.unbinder ****************&lt;br /&gt;
 * Used by Morebits.wikitext.page.commentOutImage&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.unbinder = function Unbinder( string ) {&lt;br /&gt;
	if( typeof string !== &#039;string&#039; ) {&lt;br /&gt;
		throw new Error( &amp;quot;not a string&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
	this.content = string;&lt;br /&gt;
	this.counter = 0;&lt;br /&gt;
	this.history = {};&lt;br /&gt;
	this.prefix = &#039;%UNIQ::&#039; + Math.random() + &#039;::&#039;;&lt;br /&gt;
	this.postfix = &#039;::UNIQ%&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.unbinder.prototype = {&lt;br /&gt;
	unbind: function UnbinderUnbind( prefix, postfix ) {&lt;br /&gt;
		var re = new RegExp( prefix + &#039;(.*?)&#039; + postfix, &#039;g&#039; );&lt;br /&gt;
		this.content = this.content.replace( re, Morebits.unbinder.getCallback( this ) );&lt;br /&gt;
	},&lt;br /&gt;
	rebind: function UnbinderRebind() {&lt;br /&gt;
		var content = this.content;&lt;br /&gt;
		content.self = this;&lt;br /&gt;
		for( var current in this.history ) {&lt;br /&gt;
			if( this.history.hasOwnProperty( current ) ) {&lt;br /&gt;
				content = content.replace( current, this.history[current] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return content;&lt;br /&gt;
	},&lt;br /&gt;
	prefix: null, // %UNIQ::0.5955981644938324::&lt;br /&gt;
	postfix: null, // ::UNIQ%&lt;br /&gt;
	content: null, // string&lt;br /&gt;
	counter: null, // 0++&lt;br /&gt;
	history: null // {}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.unbinder.getCallback = function UnbinderGetCallback(self) {&lt;br /&gt;
	return function UnbinderCallback( match , a , b ) {&lt;br /&gt;
		var current = self.prefix + self.counter + self.postfix;&lt;br /&gt;
		self.history[current] = match;&lt;br /&gt;
		++self.counter;&lt;br /&gt;
		return current;&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Date ****************&lt;br /&gt;
 * Helper functions to get the month as a string instead of a number&lt;br /&gt;
 *&lt;br /&gt;
 * Normally it is poor form to play with prototypes of primitive types, but it&lt;br /&gt;
 * is fairly unlikely that anyone will iterate over a Date object.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Date.monthNames = [&lt;br /&gt;
	&#039;January&#039;,&lt;br /&gt;
	&#039;February&#039;,&lt;br /&gt;
	&#039;March&#039;,&lt;br /&gt;
	&#039;April&#039;,&lt;br /&gt;
	&#039;May&#039;,&lt;br /&gt;
	&#039;June&#039;,&lt;br /&gt;
	&#039;July&#039;,&lt;br /&gt;
	&#039;August&#039;,&lt;br /&gt;
	&#039;September&#039;,&lt;br /&gt;
	&#039;October&#039;,&lt;br /&gt;
	&#039;November&#039;,&lt;br /&gt;
	&#039;December&#039;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
Date.monthNamesAbbrev = [&lt;br /&gt;
	&#039;Jan&#039;,&lt;br /&gt;
	&#039;Feb&#039;,&lt;br /&gt;
	&#039;Mar&#039;,&lt;br /&gt;
	&#039;Apr&#039;,&lt;br /&gt;
	&#039;May&#039;,&lt;br /&gt;
	&#039;Jun&#039;,&lt;br /&gt;
	&#039;Jul&#039;,&lt;br /&gt;
	&#039;Aug&#039;,&lt;br /&gt;
	&#039;Sep&#039;,&lt;br /&gt;
	&#039;Oct&#039;,&lt;br /&gt;
	&#039;Nov&#039;,&lt;br /&gt;
	&#039;Dec&#039;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
Date.prototype.getMonthName = function() {&lt;br /&gt;
	return Date.monthNames[ this.getMonth() ];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Date.prototype.getMonthNameAbbrev = function() {&lt;br /&gt;
	return Date.monthNamesAbbrev[ this.getMonth() ];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Date.prototype.getUTCMonthName = function() {&lt;br /&gt;
	return Date.monthNames[ this.getUTCMonth() ];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Date.prototype.getUTCMonthNameAbbrev = function() {&lt;br /&gt;
	return Date.monthNamesAbbrev[ this.getUTCMonth() ];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wikipedia ****************&lt;br /&gt;
 * English Wikipedia-specific objects&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wikipedia = {};&lt;br /&gt;
&lt;br /&gt;
Morebits.wikipedia.namespaces = {&lt;br /&gt;
	&#039;-2&#039;:  &#039;Media&#039;,&lt;br /&gt;
	&#039;-1&#039;:  &#039;Special&#039;,&lt;br /&gt;
	&#039;0&#039;:   &#039;&#039;,&lt;br /&gt;
	&#039;1&#039;:   &#039;Talk&#039;,&lt;br /&gt;
	&#039;2&#039;:   &#039;User&#039;,&lt;br /&gt;
	&#039;3&#039;:   &#039;User talk&#039;,&lt;br /&gt;
	&#039;4&#039;:   &#039;Project&#039;,&lt;br /&gt;
	&#039;5&#039;:   &#039;Project talk&#039;,&lt;br /&gt;
	&#039;6&#039;:   &#039;File&#039;,&lt;br /&gt;
	&#039;7&#039;:   &#039;File talk&#039;,&lt;br /&gt;
	&#039;8&#039;:   &#039;MediaWiki&#039;,&lt;br /&gt;
	&#039;9&#039;:   &#039;MediaWiki talk&#039;,&lt;br /&gt;
	&#039;10&#039;:  &#039;Template&#039;,&lt;br /&gt;
	&#039;11&#039;:  &#039;Template talk&#039;,&lt;br /&gt;
	&#039;12&#039;:  &#039;Help&#039;,&lt;br /&gt;
	&#039;13&#039;:  &#039;Help talk&#039;,&lt;br /&gt;
	&#039;14&#039;:  &#039;Category&#039;,&lt;br /&gt;
	&#039;15&#039;:  &#039;Category talk&#039;,&lt;br /&gt;
	&#039;100&#039;: &#039;Portal&#039;,&lt;br /&gt;
	&#039;101&#039;: &#039;Portal talk&#039;,&lt;br /&gt;
	&#039;108&#039;: &#039;Book&#039;,&lt;br /&gt;
	&#039;109&#039;: &#039;Book talk&#039;,&lt;br /&gt;
	&#039;446&#039;: &#039;Education Program&#039;,&lt;br /&gt;
	&#039;447&#039;: &#039;Education Program talk&#039;,&lt;br /&gt;
	&#039;710&#039;: &#039;TimedText&#039;,&lt;br /&gt;
	&#039;711&#039;: &#039;TimedText talk&#039;,&lt;br /&gt;
	&#039;828&#039;: &#039;Module&#039;,&lt;br /&gt;
	&#039;829&#039;: &#039;Module talk&#039;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wikipedia.namespacesFriendly = {&lt;br /&gt;
	&#039;0&#039;:   &#039;(Article)&#039;,&lt;br /&gt;
	&#039;1&#039;:   &#039;Talk&#039;,&lt;br /&gt;
	&#039;2&#039;:   &#039;User&#039;,&lt;br /&gt;
	&#039;3&#039;:   &#039;User talk&#039;,&lt;br /&gt;
	&#039;4&#039;:   &#039;Wikipedia&#039;,&lt;br /&gt;
	&#039;5&#039;:   &#039;Wikipedia talk&#039;,&lt;br /&gt;
	&#039;6&#039;:   &#039;File&#039;,&lt;br /&gt;
	&#039;7&#039;:   &#039;File talk&#039;,&lt;br /&gt;
	&#039;8&#039;:   &#039;MediaWiki&#039;,&lt;br /&gt;
	&#039;9&#039;:   &#039;MediaWiki talk&#039;,&lt;br /&gt;
	&#039;10&#039;:  &#039;Template&#039;,&lt;br /&gt;
	&#039;11&#039;:  &#039;Template talk&#039;,&lt;br /&gt;
	&#039;12&#039;:  &#039;Help&#039;,&lt;br /&gt;
	&#039;13&#039;:  &#039;Help talk&#039;,&lt;br /&gt;
	&#039;14&#039;:  &#039;Category&#039;,&lt;br /&gt;
	&#039;15&#039;:  &#039;Category talk&#039;,&lt;br /&gt;
	&#039;100&#039;: &#039;Portal&#039;,&lt;br /&gt;
	&#039;101&#039;: &#039;Portal talk&#039;,&lt;br /&gt;
	&#039;108&#039;: &#039;Book&#039;,&lt;br /&gt;
	&#039;109&#039;: &#039;Book talk&#039;,&lt;br /&gt;
	&#039;446&#039;: &#039;Education Program&#039;,&lt;br /&gt;
	&#039;447&#039;: &#039;Education Program talk&#039;,&lt;br /&gt;
	&#039;710&#039;: &#039;TimedText&#039;,&lt;br /&gt;
	&#039;711&#039;: &#039;TimedText talk&#039;,&lt;br /&gt;
	&#039;828&#039;: &#039;Module&#039;,&lt;br /&gt;
	&#039;829&#039;: &#039;Module talk&#039;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wiki ****************&lt;br /&gt;
 * Various objects for wiki editing and API access&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki = {};&lt;br /&gt;
&lt;br /&gt;
// Determines whether the current page is a redirect or soft redirect&lt;br /&gt;
// (fails to detect soft redirects on edit, history, etc. pages)&lt;br /&gt;
Morebits.wiki.isPageRedirect = function wikipediaIsPageRedirect() {&lt;br /&gt;
	return !!(mw.config.get(&amp;quot;wgIsRedirect&amp;quot;) || document.getElementById(&amp;quot;softredirect&amp;quot;));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wiki.actionCompleted ****************&lt;br /&gt;
 *&lt;br /&gt;
 * Use of Morebits.wiki.actionCompleted():&lt;br /&gt;
 *    Every call to Morebits.wiki.api.post() results in the dispatch of&lt;br /&gt;
 *    an asynchronous callback. Each callback can in turn&lt;br /&gt;
 *    make an additional call to Morebits.wiki.api.post() to continue a &lt;br /&gt;
 *    processing sequence. At the conclusion of the final callback&lt;br /&gt;
 *    of a processing sequence, it is not possible to simply return to the&lt;br /&gt;
 *    original caller because there is no call stack leading back to&lt;br /&gt;
 *    the original context. Instead, Morebits.wiki.actionCompleted.event() is&lt;br /&gt;
 *    called to display the result to the user and to perform an optional&lt;br /&gt;
 *    page redirect.&lt;br /&gt;
 *&lt;br /&gt;
 *    The determination of when to call Morebits.wiki.actionCompleted.event()&lt;br /&gt;
 *    is managed through the globals Morebits.wiki.numberOfActionsLeft and&lt;br /&gt;
 *    Morebits.wiki.nbrOfCheckpointsLeft. Morebits.wiki.numberOfActionsLeft is&lt;br /&gt;
 *    incremented at the start of every Morebits.wiki.api call and decremented &lt;br /&gt;
 *    after the completion of a callback function. If a callback function&lt;br /&gt;
 *    does not create a new Morebits.wiki.api object before exiting, it is the&lt;br /&gt;
 *    final step in the processing chain and Morebits.wiki.actionCompleted.event()&lt;br /&gt;
 *    will then be called.&lt;br /&gt;
 *&lt;br /&gt;
 *    Optionally, callers may use Morebits.wiki.addCheckpoint() to indicate that&lt;br /&gt;
 *    processing is not complete upon the conclusion of the final callback function.&lt;br /&gt;
 *    This is used for batch operations. The end of a batch is signaled by calling&lt;br /&gt;
 *    Morebits.wiki.removeCheckpoint(). &lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.numberOfActionsLeft = 0;&lt;br /&gt;
Morebits.wiki.nbrOfCheckpointsLeft = 0;&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.actionCompleted = function( self ) {&lt;br /&gt;
	if( --Morebits.wiki.numberOfActionsLeft &amp;lt;= 0 &amp;amp;&amp;amp; Morebits.wiki.nbrOfCheckpointsLeft &amp;lt;= 0 ) {&lt;br /&gt;
		Morebits.wiki.actionCompleted.event( self );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Change per action wanted&lt;br /&gt;
Morebits.wiki.actionCompleted.event = function() {&lt;br /&gt;
	new Morebits.status( Morebits.wiki.actionCompleted.notice, Morebits.wiki.actionCompleted.postfix, &#039;info&#039; );&lt;br /&gt;
	if( Morebits.wiki.actionCompleted.redirect ) {&lt;br /&gt;
		// if it isn&#039;t a URL, make it one. TODO: This breaks on the articles &#039;http://&#039;, &#039;ftp://&#039;, and similar ones.&lt;br /&gt;
		if( !( (/^\w+\:\/\//).test( Morebits.wiki.actionCompleted.redirect ) ) ) {&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = mw.util.getUrl( Morebits.wiki.actionCompleted.redirect );&lt;br /&gt;
			if( Morebits.wiki.actionCompleted.followRedirect === false ) {&lt;br /&gt;
				Morebits.wiki.actionCompleted.redirect += &amp;quot;?redirect=no&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		window.setTimeout( function() { window.location = Morebits.wiki.actionCompleted.redirect; }, Morebits.wiki.actionCompleted.timeOut );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.actionCompleted.timeOut = ( typeof window.wpActionCompletedTimeOut === &#039;undefined&#039; ? 5000 : window.wpActionCompletedTimeOut );&lt;br /&gt;
Morebits.wiki.actionCompleted.redirect = null;&lt;br /&gt;
Morebits.wiki.actionCompleted.notice = &#039;Action&#039;;&lt;br /&gt;
Morebits.wiki.actionCompleted.postfix = &#039;completed&#039;;&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.addCheckpoint = function() {&lt;br /&gt;
	++Morebits.wiki.nbrOfCheckpointsLeft;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.removeCheckpoint = function() {&lt;br /&gt;
	if( --Morebits.wiki.nbrOfCheckpointsLeft &amp;lt;= 0 &amp;amp;&amp;amp; Morebits.wiki.numberOfActionsLeft &amp;lt;= 0 ) {&lt;br /&gt;
		Morebits.wiki.actionCompleted.event();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wiki.api ****************&lt;br /&gt;
 * An easy way to talk to the MediaWiki API.&lt;br /&gt;
 *&lt;br /&gt;
 * Constructor parameters:&lt;br /&gt;
 *    currentAction: the current action (required)&lt;br /&gt;
 *    query: the query (required)&lt;br /&gt;
 *    onSuccess: the function to call when request gotten&lt;br /&gt;
 *    statusElement: a Morebits.status object to use for status messages (optional)&lt;br /&gt;
 *    onError: the function to call if an error occurs (optional)&lt;br /&gt;
 */&lt;br /&gt;
Morebits.wiki.api = function( currentAction, query, onSuccess, statusElement, onError ) {&lt;br /&gt;
	this.currentAction = currentAction;&lt;br /&gt;
	this.query = query;&lt;br /&gt;
	this.query.format = &#039;xml&#039;;&lt;br /&gt;
	this.onSuccess = onSuccess;&lt;br /&gt;
	this.onError = onError;&lt;br /&gt;
	if( statusElement ) {&lt;br /&gt;
		this.statelem = statusElement;&lt;br /&gt;
		this.statelem.status( currentAction );&lt;br /&gt;
	} else {&lt;br /&gt;
		this.statelem = new Morebits.status( currentAction );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.api.prototype = {&lt;br /&gt;
	currentAction: &#039;&#039;,&lt;br /&gt;
	onSuccess: null,&lt;br /&gt;
	onError: null,&lt;br /&gt;
	parent: window,  // use global context if there is no parent object&lt;br /&gt;
	query: null,&lt;br /&gt;
	responseXML: null,&lt;br /&gt;
	setParent: function(parent) { this.parent = parent; },  // keep track of parent object for callbacks&lt;br /&gt;
	statelem: null,  // this non-standard name kept for backwards compatibility&lt;br /&gt;
	statusText: null, // result received from the API, normally &amp;quot;success&amp;quot; or &amp;quot;error&amp;quot;&lt;br /&gt;
	errorCode: null, // short text error code, if any, as documented in the MediaWiki API&lt;br /&gt;
	errorText: null, // full error description, if any&lt;br /&gt;
&lt;br /&gt;
	// post(): carries out the request&lt;br /&gt;
	// do not specify a parameter unless you really really want to give jQuery some extra parameters&lt;br /&gt;
	post: function( callerAjaxParameters ) {&lt;br /&gt;
&lt;br /&gt;
		++Morebits.wiki.numberOfActionsLeft;&lt;br /&gt;
&lt;br /&gt;
		var ajaxparams = $.extend( {}, {&lt;br /&gt;
			context: this,&lt;br /&gt;
			type: &#039;POST&#039;,&lt;br /&gt;
			url: mw.util.wikiScript(&#039;api&#039;),&lt;br /&gt;
			data: Morebits.queryString.create(this.query),&lt;br /&gt;
			datatype: &#039;xml&#039;&lt;br /&gt;
		}, callerAjaxParameters );&lt;br /&gt;
&lt;br /&gt;
		return $.ajax( ajaxparams ).done(&lt;br /&gt;
			function(xml, statusText, jqXHR) {&lt;br /&gt;
				this.statusText = statusText;&lt;br /&gt;
				this.responseXML = xml;&lt;br /&gt;
				this.errorCode = $(xml).find(&#039;error&#039;).attr(&#039;code&#039;);&lt;br /&gt;
				this.errorText = $(xml).find(&#039;error&#039;).attr(&#039;info&#039;);&lt;br /&gt;
&lt;br /&gt;
				if (typeof this.errorCode === &amp;quot;string&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
					// the API didn&#039;t like what we told it, e.g., bad edit token or an error creating a page&lt;br /&gt;
					this.returnError();&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// invoke success callback if one was supplied&lt;br /&gt;
				if (this.onSuccess) {&lt;br /&gt;
&lt;br /&gt;
					// set the callback context to this.parent for new code and supply the API object&lt;br /&gt;
					// as the first argument to the callback (for legacy code)&lt;br /&gt;
					this.onSuccess.call( this.parent, this );&lt;br /&gt;
				} else {&lt;br /&gt;
					this.statelem.info(&amp;quot;done&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				Morebits.wiki.actionCompleted();&lt;br /&gt;
			}&lt;br /&gt;
		).fail(&lt;br /&gt;
			// only network and server errors reach here – complaints from the API itself are caught in success()&lt;br /&gt;
			function(jqXHR, statusText, errorThrown) {&lt;br /&gt;
				this.statusText = statusText;&lt;br /&gt;
				this.errorThrown = errorThrown; // frequently undefined&lt;br /&gt;
				this.errorText = statusText + &#039; &amp;quot;&#039; + jqXHR.statusText + &#039;&amp;quot; occurred while contacting the API.&#039;;&lt;br /&gt;
				this.returnError();&lt;br /&gt;
			}&lt;br /&gt;
		);  // the return value should be ignored, unless using callerAjaxParameters with |async: false|&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	returnError: function() {&lt;br /&gt;
		this.statelem.error( this.errorText );&lt;br /&gt;
&lt;br /&gt;
		// invoke failure callback if one was supplied&lt;br /&gt;
		if (this.onError) {&lt;br /&gt;
&lt;br /&gt;
			// set the callback context to this.parent for new code and supply the API object&lt;br /&gt;
			// as the first argument to the callback for legacy code&lt;br /&gt;
			this.onError.call( this.parent, this );&lt;br /&gt;
		}&lt;br /&gt;
		// don&#039;t complete the action so that the error remains displayed&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	getStatusElement: function() {&lt;br /&gt;
		return this.statelem;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	getErrorCode: function() {&lt;br /&gt;
		return this.errorCode;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	getErrorText: function() {&lt;br /&gt;
		return this.errorText;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	getXML: function() {&lt;br /&gt;
		return this.responseXML;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wiki.page ****************&lt;br /&gt;
 * Uses the MediaWiki API to load a page and optionally edit it, move it, etc.&lt;br /&gt;
 *&lt;br /&gt;
 * Callers are not permitted to directly access the properties of this class!&lt;br /&gt;
 * All property access is through the appropriate get___() or set___() method.&lt;br /&gt;
 *&lt;br /&gt;
 * Callers should set Morebits.wiki.actionCompleted.notice and Morebits.wiki.actionCompleted.redirect&lt;br /&gt;
 * before the first call to Morebits.wiki.page.load().&lt;br /&gt;
 *&lt;br /&gt;
 * Each of the callback functions takes one parameter, which is a&lt;br /&gt;
 * reference to the Morebits.wiki.page object that registered the callback.&lt;br /&gt;
 * Callback functions may invoke any Morebits.wiki.page prototype method using this reference.&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 * NOTE: This list of member functions is incomplete.&lt;br /&gt;
 *&lt;br /&gt;
 * Constructor: Morebits.wiki.page(pageName, currentAction)&lt;br /&gt;
 *    pageName - the name of the page, prefixed by the namespace (if any)&lt;br /&gt;
 *               (for the current page, use mw.config.get(&#039;wgPageName&#039;))&lt;br /&gt;
 *    currentAction - a string describing the action about to be undertaken (optional)&lt;br /&gt;
 *&lt;br /&gt;
 * load(onSuccess, onFailure): Loads the text for the page&lt;br /&gt;
 *    onSuccess - callback function which is called when the load has succeeded&lt;br /&gt;
 *    onFailure - callback function which is called when the load fails (optional)&lt;br /&gt;
 *                XXX onFailure for load() is not yet implemented – do we need it? -- UncleDouggie&lt;br /&gt;
 *                    probably not -- TTO&lt;br /&gt;
 *&lt;br /&gt;
 * save(onSuccess, onFailure): Saves the text for the page. Must be preceded by calling load().&lt;br /&gt;
 *    onSuccess - callback function which is called when the save has succeeded (optional)&lt;br /&gt;
 *    onFailure - callback function which is called when the save fails (optional)&lt;br /&gt;
 *    Warning: Calling save() can result in additional calls to the previous load() callbacks to&lt;br /&gt;
 *             recover from edit conflicts! &lt;br /&gt;
 *             In this case, callers must make the same edit to the new pageText and reinvoke save(). &lt;br /&gt;
 *             This behavior can be disabled with setMaxConflictRetries(0).&lt;br /&gt;
 *&lt;br /&gt;
 * append(onSuccess, onFailure): Adds the text provided via setAppendText() to the end of the page.&lt;br /&gt;
 *                               Does not require calling load() first.&lt;br /&gt;
 *    onSuccess - callback function which is called when the method has succeeded (optional)&lt;br /&gt;
 *    onFailure - callback function which is called when the method fails (optional)&lt;br /&gt;
 *&lt;br /&gt;
 * prepend(onSuccess, onFailure): Adds the text provided via setPrependText() to the start of the page.&lt;br /&gt;
 *                                Does not require calling load() first.&lt;br /&gt;
 *    onSuccess - callback function which is called when the method has succeeded (optional)&lt;br /&gt;
 *    onFailure - callback function which is called when the method fails (optional)&lt;br /&gt;
 *&lt;br /&gt;
 * getPageName(): returns a string containing the name of the loaded page, including the namespace&lt;br /&gt;
 *&lt;br /&gt;
 * getPageText(): returns a string containing the text of the page after a successful load()&lt;br /&gt;
 *&lt;br /&gt;
 * setPageText(pageText) &lt;br /&gt;
 *    pageText - string containing the updated page text that will be saved when save() is called&lt;br /&gt;
 *&lt;br /&gt;
 * setAppendText(appendText) &lt;br /&gt;
 *    appendText - string containing the text that will be appended to the page when append() is called&lt;br /&gt;
 *&lt;br /&gt;
 * setPrependText(prependText) &lt;br /&gt;
 *    prependText - string containing the text that will be prepended to the page when prepend() is called&lt;br /&gt;
 *&lt;br /&gt;
 * setEditSummary(summary)&lt;br /&gt;
 *    summary - string containing the text of the edit summary that will be used when save() is called&lt;br /&gt;
 *&lt;br /&gt;
 * setMinorEdit(minorEdit) &lt;br /&gt;
 *    minorEdit is a boolean value:&lt;br /&gt;
 *       true  - When save is called, the resulting edit will be marked as &amp;quot;minor&amp;quot;.&lt;br /&gt;
 *       false - When save is called, the resulting edit will not be marked as &amp;quot;minor&amp;quot;. (default)&lt;br /&gt;
 *&lt;br /&gt;
 * setBotEdit(botEdit) &lt;br /&gt;
 *    botEdit is a boolean value:&lt;br /&gt;
 *       true  - When save is called, the resulting edit will be marked as &amp;quot;bot&amp;quot;.&lt;br /&gt;
 *       false - When save is called, the resulting edit will not be marked as &amp;quot;bot&amp;quot;. (default)&lt;br /&gt;
 *&lt;br /&gt;
 * setPageSection(pageSection)&lt;br /&gt;
 *    pageSection - integer specifying the section number to load or save. The default is |null|, which means&lt;br /&gt;
 *                  that the entire page will be retrieved.&lt;br /&gt;
 *&lt;br /&gt;
 * setMaxConflictRetries(maxRetries)&lt;br /&gt;
 *    maxRetries - number of retries for save errors involving an edit conflict or loss of edit token&lt;br /&gt;
 *    default: 2&lt;br /&gt;
 *&lt;br /&gt;
 * setMaxRetries(maxRetries)&lt;br /&gt;
 *    maxRetries - number of retries for save errors not involving an edit conflict or loss of edit token&lt;br /&gt;
 *    default: 2&lt;br /&gt;
 *&lt;br /&gt;
 * setCallbackParameters(callbackParameters)&lt;br /&gt;
 *    callbackParameters - an object for use in a callback function&lt;br /&gt;
 *&lt;br /&gt;
 * getCallbackParameters(): returns the object previous set by setCallbackParameters()&lt;br /&gt;
 *&lt;br /&gt;
 *    Callback notes: callbackParameters is for use by the caller only. The parameters&lt;br /&gt;
 *                    allow a caller to pass the proper context into its callback function.&lt;br /&gt;
 *                    Callers must ensure that any changes to the callbackParameters object&lt;br /&gt;
 *                    within a load() callback still permit a proper re-entry into the&lt;br /&gt;
 *                    load() callback if an edit conflict is detected upon calling save().&lt;br /&gt;
 *&lt;br /&gt;
 * getStatusElement(): returns the Status element created by the constructor&lt;br /&gt;
 *&lt;br /&gt;
 * setFollowRedirect(followRedirect)&lt;br /&gt;
 *    followRedirect is a boolean value:&lt;br /&gt;
 *       true  - a maximum of one redirect will be followed.&lt;br /&gt;
 *               In the event of a redirect, a message is displayed to the user and &lt;br /&gt;
 *               the redirect target can be retrieved with getPageName().&lt;br /&gt;
 *       false - the requested pageName will be used without regard to any redirect. (default)&lt;br /&gt;
 *&lt;br /&gt;
 * setWatchlist(watchlistOption)&lt;br /&gt;
 *    watchlistOption is a boolean value:&lt;br /&gt;
 *       true  - page will be added to the user&#039;s watchlist when save() is called&lt;br /&gt;
 *       false - watchlist status of the page will not be changed (default)&lt;br /&gt;
 *&lt;br /&gt;
 * setWatchlistFromPreferences(watchlistOption)&lt;br /&gt;
 *    watchlistOption is a boolean value:&lt;br /&gt;
 *       true  - page watchlist status will be set based on the user&#039;s &lt;br /&gt;
 *               preference settings when save() is called&lt;br /&gt;
 *       false - watchlist status of the page will not be changed (default)&lt;br /&gt;
 *&lt;br /&gt;
 *    Watchlist notes:&lt;br /&gt;
 *       1. The MediaWiki API value of &#039;unwatch&#039;, which explicitly removes the page from the&lt;br /&gt;
 *          user&#039;s watchlist, is not used.&lt;br /&gt;
 *       2. If both setWatchlist() and setWatchlistFromPreferences() are called,&lt;br /&gt;
 *          the last call takes priority.&lt;br /&gt;
 *       3. Twinkle modules should use the appropriate preference to set the watchlist options.&lt;br /&gt;
 *       4. Most Twinkle modules use setWatchlist().&lt;br /&gt;
 *          setWatchlistFromPreferences() is only needed for the few Twinkle watchlist preferences&lt;br /&gt;
 *          that accept a string value of &#039;default&#039;.&lt;br /&gt;
 *&lt;br /&gt;
 * setCreateOption(createOption)&lt;br /&gt;
 *    createOption is a string value:&lt;br /&gt;
 *       &#039;recreate&#039;   - create the page if it does not exist, or edit it if it exists&lt;br /&gt;
 *       &#039;createonly&#039; - create the page if it does not exist, but return an error if it&lt;br /&gt;
 *                      already exists&lt;br /&gt;
 *       &#039;nocreate&#039;   - don&#039;t create the page, only edit it if it already exists&lt;br /&gt;
 *       null         - create the page if it does not exist, unless it was deleted in the moment&lt;br /&gt;
 *                      between retrieving the edit token and saving the edit (default)&lt;br /&gt;
 *&lt;br /&gt;
 * exists(): returns true if the page existed on the wiki when it was last loaded&lt;br /&gt;
 *&lt;br /&gt;
 * lookupCreator(onSuccess): Retrieves the username of the user who created the page&lt;br /&gt;
 *    onSuccess - callback function which is called when the username is found&lt;br /&gt;
 *                within the callback, the username can be retrieved using the getCreator() function&lt;br /&gt;
 * &lt;br /&gt;
 * getCreator(): returns the user who created the page following lookupCreator()&lt;br /&gt;
 *&lt;br /&gt;
 * getCurrentID(): returns a string containing the current revision ID of the page&lt;br /&gt;
 *&lt;br /&gt;
 * patrol(): marks the page as patrolled, if possible&lt;br /&gt;
 *&lt;br /&gt;
 * move(onSuccess, onFailure): Moves a page to another title&lt;br /&gt;
 *&lt;br /&gt;
 * deletePage(onSuccess, onFailure): Deletes a page (for admins only)&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Call sequence for common operations (optional final user callbacks not shown):&lt;br /&gt;
 *&lt;br /&gt;
 *    Edit current contents of a page (no edit conflict):&lt;br /&gt;
 *       .load(userTextEditCallback) -&amp;gt; ctx.loadApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; &lt;br /&gt;
 *             ctx.fnLoadSuccess() -&amp;gt; userTextEditCallback() -&amp;gt; .save() -&amp;gt; &lt;br /&gt;
 *             ctx.saveApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; ctx.fnSaveSuccess()&lt;br /&gt;
 *&lt;br /&gt;
 *    Edit current contents of a page (with edit conflict):&lt;br /&gt;
 *       .load(userTextEditCallback) -&amp;gt; ctx.loadApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; &lt;br /&gt;
 *             ctx.fnLoadSuccess() -&amp;gt; userTextEditCallback() -&amp;gt; .save() -&amp;gt; &lt;br /&gt;
 *             ctx.saveApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; ctx.fnSaveError() -&amp;gt;&lt;br /&gt;
 *             ctx.loadApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; &lt;br /&gt;
 *             ctx.fnLoadSuccess() -&amp;gt; userTextEditCallback() -&amp;gt; .save() -&amp;gt; &lt;br /&gt;
 *             ctx.saveApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; ctx.fnSaveSuccess()&lt;br /&gt;
 *&lt;br /&gt;
 *    Append to a page (similar for prepend):&lt;br /&gt;
 *       .append() -&amp;gt; ctx.loadApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; &lt;br /&gt;
 *             ctx.fnLoadSuccess() -&amp;gt; ctx.fnAutoSave() -&amp;gt; .save() -&amp;gt; &lt;br /&gt;
 *             ctx.saveApi.post() -&amp;gt; ctx.loadApi.post.success() -&amp;gt; ctx.fnSaveSuccess()&lt;br /&gt;
 *&lt;br /&gt;
 *    Notes: &lt;br /&gt;
 *       1. All functions following Morebits.wiki.api.post() are invoked asynchronously &lt;br /&gt;
 *          from the jQuery AJAX library.&lt;br /&gt;
 *       2. The sequence for append/prepend could be slightly shortened, but it would require&lt;br /&gt;
 *          significant duplication of code for little benefit.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.page = function(pageName, currentAction) {&lt;br /&gt;
&lt;br /&gt;
	if (!currentAction) {&lt;br /&gt;
		currentAction = &#039;Opening page &amp;quot;&#039; + pageName + &#039;&amp;quot;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Private context variables&lt;br /&gt;
	 *&lt;br /&gt;
	 * This context is not visible to the outside, thus all the data here&lt;br /&gt;
	 * must be accessed via getter and setter functions.&lt;br /&gt;
	 */&lt;br /&gt;
	var ctx = {&lt;br /&gt;
		 // backing fields for public properties&lt;br /&gt;
		pageName: pageName,&lt;br /&gt;
		pageExists: false,&lt;br /&gt;
		editSummary: null,&lt;br /&gt;
		callbackParameters: null,&lt;br /&gt;
		statusElement: new Morebits.status(currentAction),&lt;br /&gt;
		 // - edit&lt;br /&gt;
		pageText: null,&lt;br /&gt;
		editMode: &#039;all&#039;,  // save() replaces entire contents of the page by default&lt;br /&gt;
		appendText: null,   // can&#039;t reuse pageText for this because pageText is needed to follow a redirect&lt;br /&gt;
		prependText: null,  // can&#039;t reuse pageText for this because pageText is needed to follow a redirect&lt;br /&gt;
		createOption: null,&lt;br /&gt;
		minorEdit: false,&lt;br /&gt;
		botEdit: false,&lt;br /&gt;
		pageSection: null,&lt;br /&gt;
		maxConflictRetries: 2,&lt;br /&gt;
		maxRetries: 2,&lt;br /&gt;
		followRedirect: false,&lt;br /&gt;
		watchlistOption: &#039;nochange&#039;,&lt;br /&gt;
		creator: null,&lt;br /&gt;
		 // - revert&lt;br /&gt;
		revertOldID: null,&lt;br /&gt;
		 // - move&lt;br /&gt;
		moveDestination: null,&lt;br /&gt;
		moveTalkPage: false,&lt;br /&gt;
		moveSubpages: false,&lt;br /&gt;
		moveSuppressRedirect: false,&lt;br /&gt;
		 // - protect&lt;br /&gt;
		protectEdit: null,&lt;br /&gt;
		protectMove: null,&lt;br /&gt;
		protectCreate: null,&lt;br /&gt;
		protectCascade: false,&lt;br /&gt;
		 // - stabilize (FlaggedRevs)&lt;br /&gt;
		flaggedRevs: null,&lt;br /&gt;
		 // internal status&lt;br /&gt;
		pageLoaded: false,&lt;br /&gt;
		editToken: null,&lt;br /&gt;
		loadTime: null,&lt;br /&gt;
		lastEditTime: null,&lt;br /&gt;
		revertCurID: null,&lt;br /&gt;
		revertUser: null,&lt;br /&gt;
		fullyProtected: false,&lt;br /&gt;
		suppressProtectWarning: false,&lt;br /&gt;
		conflictRetries: 0,&lt;br /&gt;
		retries: 0,&lt;br /&gt;
		 // callbacks&lt;br /&gt;
		onLoadSuccess: null,&lt;br /&gt;
		onLoadFailure: null,&lt;br /&gt;
		onSaveSuccess: null,&lt;br /&gt;
		onSaveFailure: null,&lt;br /&gt;
		onLookupCreatorSuccess: null,&lt;br /&gt;
		onMoveSuccess: null,&lt;br /&gt;
		onMoveFailure: null,&lt;br /&gt;
		onDeleteSuccess: null,&lt;br /&gt;
		onDeleteFailure: null,&lt;br /&gt;
		onProtectSuccess: null,&lt;br /&gt;
		onProtectFailure: null,&lt;br /&gt;
		onStabilizeSuccess: null,&lt;br /&gt;
		onStabilizeFailure: null,&lt;br /&gt;
		 // internal objects&lt;br /&gt;
		loadQuery: null,&lt;br /&gt;
		loadApi: null,&lt;br /&gt;
		saveApi: null,&lt;br /&gt;
		lookupCreatorApi: null,&lt;br /&gt;
		moveApi: null,&lt;br /&gt;
		moveProcessApi: null,&lt;br /&gt;
		deleteApi: null,&lt;br /&gt;
		deleteProcessApi: null,&lt;br /&gt;
		protectApi: null,&lt;br /&gt;
		protectProcessApi: null,&lt;br /&gt;
		stabilizeApi: null,&lt;br /&gt;
		stabilizeProcessApi: null&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var emptyFunction = function() { };&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Public interface accessors&lt;br /&gt;
	 */&lt;br /&gt;
	this.getPageName = function() {&lt;br /&gt;
		return ctx.pageName;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getPageText = function() {&lt;br /&gt;
		return ctx.pageText;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setPageText = function(pageText) {&lt;br /&gt;
		ctx.editMode = &#039;all&#039;;&lt;br /&gt;
		ctx.pageText = pageText;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setAppendText = function(appendText) {&lt;br /&gt;
		ctx.editMode = &#039;append&#039;;&lt;br /&gt;
		ctx.appendText = appendText;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setPrependText = function(prependText) {&lt;br /&gt;
		ctx.editMode = &#039;prepend&#039;;&lt;br /&gt;
		ctx.prependText = prependText;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setEditSummary = function(summary) {&lt;br /&gt;
		ctx.editSummary = summary;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setCreateOption = function(createOption) {&lt;br /&gt;
		ctx.createOption = createOption;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMinorEdit = function(minorEdit) {&lt;br /&gt;
		ctx.minorEdit = minorEdit;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setBotEdit = function(botEdit) {&lt;br /&gt;
		ctx.botEdit = botEdit;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setPageSection = function(pageSection) {&lt;br /&gt;
		ctx.pageSection = pageSection;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMaxConflictRetries = function(maxRetries) {&lt;br /&gt;
		ctx.maxConflictRetries = maxRetries;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMaxRetries = function(maxRetries) {&lt;br /&gt;
		ctx.maxRetries = maxRetries;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setCallbackParameters = function(callbackParameters) {&lt;br /&gt;
		ctx.callbackParameters = callbackParameters;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getCallbackParameters = function() {&lt;br /&gt;
		return ctx.callbackParameters;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getCreator = function() {&lt;br /&gt;
		return ctx.creator;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setOldID = function(oldID) {&lt;br /&gt;
		ctx.revertOldID = oldID;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getCurrentID = function() {&lt;br /&gt;
		return ctx.revertCurID;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getRevisionUser = function() {&lt;br /&gt;
		return ctx.revertUser;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMoveDestination = function(destination) {&lt;br /&gt;
		ctx.moveDestination = destination;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMoveTalkPage = function(flag) {&lt;br /&gt;
		ctx.moveTalkPage = !!flag;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMoveSubpages = function(flag) {&lt;br /&gt;
		ctx.moveSubpages = !!flag;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMoveSuppressRedirect = function(flag) {&lt;br /&gt;
		ctx.moveSuppressRedirect = !!flag;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setEditProtection = function(level, expiry) {&lt;br /&gt;
		ctx.protectEdit = { level: level, expiry: expiry };&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setMoveProtection = function(level, expiry) {&lt;br /&gt;
		ctx.protectMove = { level: level, expiry: expiry };&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setCreateProtection = function(level, expiry) {&lt;br /&gt;
		ctx.protectCreate = { level: level, expiry: expiry };&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setCascadingProtection = function(flag) {&lt;br /&gt;
		ctx.protectCascade = !!flag;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setFlaggedRevs = function(level, expiry) {&lt;br /&gt;
		ctx.flaggedRevs = { level: level, expiry: expiry };&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.getStatusElement = function() {&lt;br /&gt;
		return ctx.statusElement;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setFollowRedirect = function(followRedirect) {&lt;br /&gt;
		if (ctx.pageLoaded) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: cannot change redirect setting after the page has been loaded!&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ctx.followRedirect = followRedirect;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setWatchlist = function(flag) {&lt;br /&gt;
		if (flag) {&lt;br /&gt;
			ctx.watchlistOption = &#039;watch&#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			ctx.watchlistOption = &#039;nochange&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.setWatchlistFromPreferences = function(flag) {&lt;br /&gt;
		if (flag) {&lt;br /&gt;
			ctx.watchlistOption = &#039;preferences&#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			ctx.watchlistOption = &#039;nochange&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.suppressProtectWarning = function() {&lt;br /&gt;
		ctx.suppressProtectWarning = true;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.exists = function() {&lt;br /&gt;
		return ctx.pageExists;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.load = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onLoadSuccess = onSuccess;&lt;br /&gt;
		ctx.onLoadFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		// Need to be able to do something after the page loads&lt;br /&gt;
		if (!onSuccess) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: no onSuccess callback provided to load()!&amp;quot;);&lt;br /&gt;
			ctx.onLoadFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.loadQuery = {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;info|revisions&#039;,&lt;br /&gt;
			intoken: &#039;edit&#039;,  // fetch an edit token&lt;br /&gt;
			titles: ctx.pageName&lt;br /&gt;
			// don&#039;t need rvlimit=1 because we don&#039;t need rvstartid here and only one actual rev is returned by default&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if (ctx.editMode === &#039;all&#039;) {&lt;br /&gt;
			ctx.loadQuery.rvprop = &#039;content|timestamp&#039;;  // get the page content at the same time, if needed&lt;br /&gt;
		} else if (ctx.editMode === &#039;revert&#039;) {&lt;br /&gt;
			ctx.loadQuery.rvprop = &#039;timestamp&#039;;&lt;br /&gt;
			ctx.loadQuery.rvlimit = 1;&lt;br /&gt;
			ctx.loadQuery.rvstartid = ctx.revertOldID;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			ctx.loadQuery.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
		if (typeof ctx.pageSection === &#039;number&#039;) {&lt;br /&gt;
			ctx.loadQuery.rvsection = ctx.pageSection;&lt;br /&gt;
		}&lt;br /&gt;
		if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			ctx.loadQuery.inprop = &#039;protection&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.loadApi = new Morebits.wiki.api(&amp;quot;Retrieving page...&amp;quot;, ctx.loadQuery, fnLoadSuccess, ctx.statusElement, ctx.onLoadFailure);&lt;br /&gt;
		ctx.loadApi.setParent(this);&lt;br /&gt;
		ctx.loadApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Save updated .pageText to Wikipedia&lt;br /&gt;
	// Only valid after successful .load()&lt;br /&gt;
	this.save = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onSaveSuccess = onSuccess;&lt;br /&gt;
		ctx.onSaveFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		if (!ctx.pageLoaded) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: attempt to save a page that has not been loaded!&amp;quot;);&lt;br /&gt;
			ctx.onSaveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.editSummary) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: edit summary not set before save!&amp;quot;);&lt;br /&gt;
			ctx.onSaveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (ctx.fullyProtected &amp;amp;&amp;amp; !ctx.suppressProtectWarning &amp;amp;&amp;amp; &lt;br /&gt;
			!confirm(&#039;You are about to make an edit to the fully protected page &amp;quot;&#039; + ctx.pageName +&lt;br /&gt;
			(ctx.fullyProtected === &#039;infinity&#039; ? &#039;&amp;quot; (protected indefinitely)&#039; : (&#039;&amp;quot; (protection expiring &#039; + ctx.fullyProtected + &#039;)&#039;)) +&lt;br /&gt;
			&#039;.  \n\nClick OK to proceed with the edit, or Cancel to skip this edit.&#039;)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Edit to fully protected page was aborted.&amp;quot;);&lt;br /&gt;
			ctx.onSaveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.retries = 0;&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;edit&#039;,&lt;br /&gt;
			title: ctx.pageName,&lt;br /&gt;
			summary: ctx.editSummary,&lt;br /&gt;
			token: ctx.editToken,&lt;br /&gt;
			watchlist: ctx.watchlistOption&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if (typeof ctx.pageSection === &#039;number&#039;) {&lt;br /&gt;
			query.section = ctx.pageSection;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Set minor edit attribute. If these parameters are present with any value, it is interpreted as true&lt;br /&gt;
		if (ctx.minorEdit) {&lt;br /&gt;
			query.minor = true;&lt;br /&gt;
		} else {&lt;br /&gt;
			query.notminor = true;  // force Twinkle config to override user preference setting for &amp;quot;all edits are minor&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Set bot edit attribute. If this paramter is present with any value, it is interpreted as true&lt;br /&gt;
		if (ctx.botEdit) {&lt;br /&gt;
			query.bot = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		switch (ctx.editMode) {&lt;br /&gt;
		case &#039;append&#039;:&lt;br /&gt;
			query.appendtext = ctx.appendText;  // use mode to append to current page contents&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;prepend&#039;:&lt;br /&gt;
			query.prependtext = ctx.prependText;  // use mode to prepend to current page contents&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;revert&#039;:&lt;br /&gt;
			query.undo = ctx.revertCurID;&lt;br /&gt;
			query.undoafter = ctx.revertOldID;&lt;br /&gt;
			if (ctx.lastEditTime) {&lt;br /&gt;
				query.basetimestamp = ctx.lastEditTime; // check that page hasn&#039;t been edited since it was loaded&lt;br /&gt;
			}&lt;br /&gt;
			query.starttimestamp = ctx.loadTime; // check that page hasn&#039;t been deleted since it was loaded (don&#039;t recreate bad stuff)&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			query.text = ctx.pageText; // replace entire contents of the page&lt;br /&gt;
			if (ctx.lastEditTime) {&lt;br /&gt;
				query.basetimestamp = ctx.lastEditTime; // check that page hasn&#039;t been edited since it was loaded&lt;br /&gt;
			}&lt;br /&gt;
			query.starttimestamp = ctx.loadTime; // check that page hasn&#039;t been deleted since it was loaded (don&#039;t recreate bad stuff)&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ([&#039;recreate&#039;, &#039;createonly&#039;, &#039;nocreate&#039;].indexOf(ctx.createOption) !== -1) {&lt;br /&gt;
			query[ctx.createOption] = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.saveApi = new Morebits.wiki.api( &amp;quot;Saving page...&amp;quot;, query, fnSaveSuccess, ctx.statusElement, fnSaveError);&lt;br /&gt;
		ctx.saveApi.setParent(this);&lt;br /&gt;
		ctx.saveApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.append = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.editMode = &#039;append&#039;;&lt;br /&gt;
		ctx.onSaveSuccess = onSuccess;&lt;br /&gt;
		ctx.onSaveFailure = onFailure || emptyFunction;&lt;br /&gt;
		this.load(fnAutoSave, ctx.onSaveFailure);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.prepend = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.editMode = &#039;prepend&#039;;&lt;br /&gt;
		ctx.onSaveSuccess = onSuccess;&lt;br /&gt;
		ctx.onSaveFailure = onFailure || emptyFunction;&lt;br /&gt;
		this.load(fnAutoSave, ctx.onSaveFailure);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.lookupCreator = function(onSuccess) {&lt;br /&gt;
		if (!onSuccess) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: no onSuccess callback provided to lookupCreator()!&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ctx.onLookupCreatorSuccess = onSuccess;&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;prop&#039;: &#039;revisions&#039;,&lt;br /&gt;
			&#039;titles&#039;: ctx.pageName,&lt;br /&gt;
			&#039;rvlimit&#039;: 1,&lt;br /&gt;
			&#039;rvprop&#039;: &#039;user&#039;,&lt;br /&gt;
			&#039;rvdir&#039;: &#039;newer&#039;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			query.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.lookupCreatorApi = new Morebits.wiki.api(&amp;quot;Retrieving page creator information&amp;quot;, query, fnLookupCreatorSuccess, ctx.statusElement);&lt;br /&gt;
		ctx.lookupCreatorApi.setParent(this);&lt;br /&gt;
		ctx.lookupCreatorApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.patrol = function() {&lt;br /&gt;
		// There&#039;s no patrol link on page, so we can&#039;t patrol&lt;br /&gt;
		if ( !$( &#039;.patrollink&#039; ).length ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Extract the rcid token from the &amp;quot;Mark page as patrolled&amp;quot; link on page&lt;br /&gt;
		var patrolhref = $( &#039;.patrollink a&#039; ).attr( &#039;href&#039; ),&lt;br /&gt;
			rcid = mw.util.getParamValue( &#039;rcid&#039;, patrolhref );&lt;br /&gt;
&lt;br /&gt;
		if ( rcid ) {&lt;br /&gt;
&lt;br /&gt;
			var patrolstat = new Morebits.status( &#039;Marking page as patrolled&#039; );&lt;br /&gt;
&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api( &#039;doing...&#039;, {&lt;br /&gt;
				action: &#039;patrol&#039;,&lt;br /&gt;
				rcid: rcid,&lt;br /&gt;
				token: mw.user.tokens.get( &#039;patrolToken&#039; )&lt;br /&gt;
			}, null, patrolstat );&lt;br /&gt;
&lt;br /&gt;
			// We don&#039;t really care about the response&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.revert = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onSaveSuccess = onSuccess;&lt;br /&gt;
		ctx.onSaveFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		if (!ctx.revertOldID) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: revision ID to revert to was not set before revert!&amp;quot;);&lt;br /&gt;
			ctx.onSaveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.editMode = &#039;revert&#039;;&lt;br /&gt;
		this.load(fnAutoSave, ctx.onSaveFailure);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.move = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onMoveSuccess = onSuccess;&lt;br /&gt;
		ctx.onMoveFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		if (!ctx.editSummary) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: move reason not set before move (use setEditSummary function)!&amp;quot;);&lt;br /&gt;
			ctx.onMoveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.moveDestination) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: destination page name was not set before move!&amp;quot;);&lt;br /&gt;
			ctx.onMoveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;info&#039;,&lt;br /&gt;
			intoken: &#039;move&#039;,&lt;br /&gt;
			titles: ctx.pageName&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			query.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
		if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			query.inprop = &#039;protection&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.moveApi = new Morebits.wiki.api(&amp;quot;retrieving move token...&amp;quot;, query, fnProcessMove, ctx.statusElement, ctx.onMoveFailure);&lt;br /&gt;
		ctx.moveApi.setParent(this);&lt;br /&gt;
		ctx.moveApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// |delete| is a reserved word in some flavours of JS&lt;br /&gt;
	this.deletePage = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onDeleteSuccess = onSuccess;&lt;br /&gt;
		ctx.onDeleteFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		// if a non-admin tries to do this, don&#039;t bother&lt;br /&gt;
		if (!Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot delete page: only admins can do that&amp;quot;);&lt;br /&gt;
			ctx.onDeleteFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.editSummary) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: delete reason not set before delete (use setEditSummary function)!&amp;quot;);&lt;br /&gt;
			ctx.onDeleteFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;info&#039;,&lt;br /&gt;
			inprop: &#039;protection&#039;,&lt;br /&gt;
			intoken: &#039;delete&#039;,&lt;br /&gt;
			titles: ctx.pageName&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			query.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.deleteApi = new Morebits.wiki.api(&amp;quot;retrieving delete token...&amp;quot;, query, fnProcessDelete, ctx.statusElement, ctx.onDeleteFailure);&lt;br /&gt;
		ctx.deleteApi.setParent(this);&lt;br /&gt;
		ctx.deleteApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.protect = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onProtectSuccess = onSuccess;&lt;br /&gt;
		ctx.onProtectFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		// if a non-admin tries to do this, don&#039;t bother&lt;br /&gt;
		if (!Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot protect page: only admins can do that&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.protectEdit &amp;amp;&amp;amp; !ctx.protectMove &amp;amp;&amp;amp; !ctx.protectCreate) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: you must set edit and/or move and/or create protection before calling protect()!&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.editSummary) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: protection reason not set before protect (use setEditSummary function)!&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;info&#039;,&lt;br /&gt;
			inprop: &#039;protection&#039;,&lt;br /&gt;
			intoken: &#039;protect&#039;,&lt;br /&gt;
			titles: ctx.pageName,&lt;br /&gt;
			watchlist: ctx.watchlistOption&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			query.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.protectApi = new Morebits.wiki.api(&amp;quot;retrieving protect token...&amp;quot;, query, fnProcessProtect, ctx.statusElement, ctx.onProtectFailure);&lt;br /&gt;
		ctx.protectApi.setParent(this);&lt;br /&gt;
		ctx.protectApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// apply FlaggedRevs protection-style settings&lt;br /&gt;
	// only works where $wgFlaggedRevsProtection = true (i.e. where FlaggedRevs&lt;br /&gt;
	// settings appear on the wiki&#039;s &amp;quot;protect&amp;quot; tab)&lt;br /&gt;
	this.stabilize = function(onSuccess, onFailure) {&lt;br /&gt;
		ctx.onStabilizeSuccess = onSuccess;&lt;br /&gt;
		ctx.onStabilizeFailure = onFailure || emptyFunction;&lt;br /&gt;
&lt;br /&gt;
		// if a non-admin tries to do this, don&#039;t bother&lt;br /&gt;
		if (!Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot apply FlaggedRevs settings: only admins can do that&amp;quot;);&lt;br /&gt;
			ctx.onStabilizeFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.flaggedRevs) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: you must set flaggedRevs before calling stabilize()!&amp;quot;);&lt;br /&gt;
			ctx.onStabilizeFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (!ctx.editSummary) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Internal error: reason not set before calling stabilize() (use setEditSummary function)!&amp;quot;);&lt;br /&gt;
			ctx.onStabilizeFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;query&#039;,&lt;br /&gt;
			prop: &#039;info|flagged&#039;,&lt;br /&gt;
			intoken: &#039;edit&#039;,&lt;br /&gt;
			titles: ctx.pageName&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.followRedirect) {&lt;br /&gt;
			query.redirects = &#039;&#039;;  // follow all redirects&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.stabilizeApi = new Morebits.wiki.api(&amp;quot;retrieving stabilize token...&amp;quot;, query, fnProcessStabilize, ctx.statusElement, ctx.onStabilizeFailure);&lt;br /&gt;
		ctx.stabilizeApi.setParent(this);&lt;br /&gt;
		ctx.stabilizeApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Private member functions&lt;br /&gt;
	 *&lt;br /&gt;
	 * These are not exposed outside&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	// callback from loadSuccess() for append() and prepend() threads&lt;br /&gt;
	var fnAutoSave = function(pageobj) {&lt;br /&gt;
		pageobj.save(ctx.onSaveSuccess, ctx.onSaveFailure);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// callback from loadApi.post()&lt;br /&gt;
	var fnLoadSuccess = function() {&lt;br /&gt;
		var xml = ctx.loadApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		if ( !fnCheckPageName(xml, ctx.onLoadFailure) ) {&lt;br /&gt;
			return; // abort&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.pageExists = ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) !== &amp;quot;&amp;quot;);&lt;br /&gt;
		if (ctx.pageExists) {&lt;br /&gt;
			ctx.pageText = $(xml).find(&#039;rev&#039;).text();&lt;br /&gt;
		} else {&lt;br /&gt;
			ctx.pageText = &#039;&#039;;  // allow for concatenation, etc.&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// extract protection info, to alert admins when they are about to edit a protected page&lt;br /&gt;
		if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			var editprot = $(xml).find(&#039;pr[type=&amp;quot;edit&amp;quot;]&#039;);&lt;br /&gt;
			if (editprot.length &amp;gt; 0 &amp;amp;&amp;amp; editprot.attr(&#039;level&#039;) === &#039;sysop&#039;) {&lt;br /&gt;
				ctx.fullyProtected = editprot.attr(&#039;expiry&#039;);&lt;br /&gt;
			} else {&lt;br /&gt;
				ctx.fullyProtected = false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.editToken = $(xml).find(&#039;page&#039;).attr(&#039;edittoken&#039;);&lt;br /&gt;
		if (!ctx.editToken) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve edit token.&amp;quot;);&lt;br /&gt;
			ctx.onLoadFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ctx.loadTime = $(xml).find(&#039;page&#039;).attr(&#039;starttimestamp&#039;);&lt;br /&gt;
		if (!ctx.loadTime) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve start timestamp.&amp;quot;);&lt;br /&gt;
			ctx.onLoadFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ctx.lastEditTime = $(xml).find(&#039;rev&#039;).attr(&#039;timestamp&#039;);&lt;br /&gt;
		ctx.revertCurID = $(xml).find(&#039;page&#039;).attr(&#039;lastrevid&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (ctx.editMode === &#039;revert&#039;) {&lt;br /&gt;
			ctx.revertCurID = $(xml).find(&#039;rev&#039;).attr(&#039;revid&#039;);&lt;br /&gt;
			if (!ctx.revertCurID) {&lt;br /&gt;
				ctx.statusElement.error(&amp;quot;Failed to retrieve current revision ID.&amp;quot;);&lt;br /&gt;
				ctx.onLoadFailure(this);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			ctx.revertUser = $(xml).find(&#039;rev&#039;).attr(&#039;user&#039;);&lt;br /&gt;
			if (!ctx.revertUser) {&lt;br /&gt;
				if ($(xml).find(&#039;rev&#039;).attr(&#039;userhidden&#039;) === &amp;quot;&amp;quot;) {  // username was RevDel&#039;d or oversighted&lt;br /&gt;
					ctx.revertUser = &amp;quot;&amp;lt;username hidden&amp;gt;&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					ctx.statusElement.error(&amp;quot;Failed to retrieve user who made the revision.&amp;quot;);&lt;br /&gt;
					ctx.onLoadFailure(this);&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// set revert edit summary&lt;br /&gt;
			ctx.editSummary = &amp;quot;[[Help:Revert|Reverted]] to revision &amp;quot; + ctx.revertOldID + &amp;quot; by &amp;quot; + ctx.revertUser + &amp;quot;: &amp;quot; + ctx.editSummary;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.pageLoaded = true;&lt;br /&gt;
&lt;br /&gt;
		// alert(&amp;quot;Generate edit conflict now&amp;quot;);  // for testing edit conflict recovery logic&lt;br /&gt;
		ctx.onLoadSuccess(this);  // invoke callback&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// helper function to parse the page name returned from the API&lt;br /&gt;
	var fnCheckPageName = function(xml, onFailure) {&lt;br /&gt;
		if (!onFailure) {&lt;br /&gt;
			onFailure = emptyFunction;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// check for invalid titles&lt;br /&gt;
		if ( $(xml).find(&#039;page&#039;).attr(&#039;invalid&#039;) === &amp;quot;&amp;quot; ) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;The page title is invalid: &amp;quot; + ctx.pageName);&lt;br /&gt;
			onFailure(this);&lt;br /&gt;
			return false; // abort&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// retrieve actual title of the page after normalization and redirects&lt;br /&gt;
		if ( $(xml).find(&#039;page&#039;).attr(&#039;title&#039;) ) {&lt;br /&gt;
			var resolvedName = $(xml).find(&#039;page&#039;).attr(&#039;title&#039;);&lt;br /&gt;
&lt;br /&gt;
			// only notify user for redirects, not normalization&lt;br /&gt;
			if ( $(xml).find(&#039;redirects&#039;).length &amp;gt; 0 ) {&lt;br /&gt;
				Morebits.status.info(&amp;quot;Info&amp;quot;, &amp;quot;Redirected from &amp;quot; + ctx.pageName + &amp;quot; to &amp;quot; + resolvedName );&lt;br /&gt;
			}&lt;br /&gt;
			ctx.pageName = resolvedName;  // always update in case of normalization&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// could be a circular redirect or other problem&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Could not resolve redirects for: &amp;quot; + ctx.pageName);&lt;br /&gt;
			onFailure(this);&lt;br /&gt;
&lt;br /&gt;
			// force error to stay on the screen&lt;br /&gt;
			++Morebits.wiki.numberOfActionsLeft;&lt;br /&gt;
			return false; // abort&lt;br /&gt;
		}&lt;br /&gt;
		return true; // all OK&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// callback from saveApi.post()&lt;br /&gt;
	var fnSaveSuccess = function() {&lt;br /&gt;
		ctx.editMode = &#039;all&#039;;  // cancel append/prepend/revert modes&lt;br /&gt;
		var xml = ctx.saveApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		// see if the API thinks we were successful&lt;br /&gt;
		if ($(xml).find(&#039;edit&#039;).attr(&#039;result&#039;) === &amp;quot;Success&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
			// real success&lt;br /&gt;
			// default on success action - display link for edited page&lt;br /&gt;
			var link = document.createElement(&#039;a&#039;);&lt;br /&gt;
			link.setAttribute(&#039;href&#039;, mw.util.getUrl(ctx.pageName) );&lt;br /&gt;
			link.appendChild(document.createTextNode(ctx.pageName));&lt;br /&gt;
			ctx.statusElement.info([&#039;completed (&#039;, link, &#039;)&#039;]);&lt;br /&gt;
			if (ctx.onSaveSuccess) {&lt;br /&gt;
				ctx.onSaveSuccess(this);  // invoke callback&lt;br /&gt;
			}&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// errors here are only generated by extensions which hook APIEditBeforeSave within MediaWiki&lt;br /&gt;
		// Wikimedia wikis should only return spam blacklist errors, captchas, and AbuseFilter messages&lt;br /&gt;
		var $editNode = $(xml).find(&#039;edit&#039;);&lt;br /&gt;
		var blacklist = $editNode.attr(&#039;spamblacklist&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (blacklist) {&lt;br /&gt;
			var code = document.createElement(&#039;code&#039;);&lt;br /&gt;
			code.style.fontFamily = &amp;quot;monospace&amp;quot;;&lt;br /&gt;
			code.appendChild(document.createTextNode(blacklist));&lt;br /&gt;
			ctx.statusElement.error([&#039;Could not save the page because the URL &#039;, code, &#039; is on the spam blacklist.&#039;]);&lt;br /&gt;
		} else if ( $(xml).find(&#039;captcha&#039;).length &amp;gt; 0 ) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Could not save the page because the wiki server wanted you to fill out a CAPTCHA.&amp;quot;);&lt;br /&gt;
		} else if ( $editNode.attr(&#039;code&#039;) === &#039;abusefilter-disallowed&#039; ) {&lt;br /&gt;
			ctx.statusElement.error(&#039;The edit was disallowed by the edit filter rule &amp;quot;&#039; + $editNode.attr(&#039;info&#039;).substring(17) + &#039;&amp;quot;.&#039;);&lt;br /&gt;
		} else if ( $editNode.attr(&#039;info&#039;).indexOf(&#039;Hit AbuseFilter:&#039;) === 0 ) {&lt;br /&gt;
			var div = document.createElement(&#039;div&#039;);&lt;br /&gt;
			div.className = &amp;quot;toccolours&amp;quot;;&lt;br /&gt;
			div.style.fontWeight = &amp;quot;normal&amp;quot;;&lt;br /&gt;
			div.style.color = &amp;quot;black&amp;quot;;&lt;br /&gt;
			div.innerHTML = $editNode.attr(&#039;warning&#039;);&lt;br /&gt;
			ctx.statusElement.error([ &#039;The following warning was returned by the edit filter: &#039;, div, &#039;If you wish to proceed with the edit, please carry it out again. This warning wil not appear a second time.&#039; ]);&lt;br /&gt;
			// XXX provide the user with a way to automatically retry the action if they so choose -&lt;br /&gt;
			// I can&#039;t see how to do this without creating a UI dependency on Morebits.wiki.page though -- TTO&lt;br /&gt;
		} else {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Unknown error received from API while saving page&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// force error to stay on the screen&lt;br /&gt;
		++Morebits.wiki.numberOfActionsLeft;&lt;br /&gt;
&lt;br /&gt;
		ctx.onSaveFailure(this);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// callback from saveApi.post()&lt;br /&gt;
	var fnSaveError = function() {&lt;br /&gt;
&lt;br /&gt;
		var errorCode = ctx.saveApi.getErrorCode();&lt;br /&gt;
&lt;br /&gt;
		// check for edit conflict&lt;br /&gt;
		if ( errorCode === &amp;quot;editconflict&amp;quot; &amp;amp;&amp;amp; ctx.conflictRetries++ &amp;lt; ctx.maxConflictRetries ) {&lt;br /&gt;
&lt;br /&gt;
			// edit conflicts can occur when the page needs to be purged from the server cache&lt;br /&gt;
			var purgeQuery = {&lt;br /&gt;
				action: &#039;purge&#039;,&lt;br /&gt;
				titles: ctx.pageName  // redirects are already resolved&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			var purgeApi = new Morebits.wiki.api(&amp;quot;Edit conflict detected, purging server cache&amp;quot;, purgeQuery, null, ctx.statusElement);&lt;br /&gt;
			var result = purgeApi.post( { async: false } );  // just wait for it, result is for debugging&lt;br /&gt;
&lt;br /&gt;
			--Morebits.wiki.numberOfActionsLeft;  // allow for normal completion if retry succeeds&lt;br /&gt;
&lt;br /&gt;
			ctx.statusElement.info(&amp;quot;Edit conflict detected, reapplying edit&amp;quot;);&lt;br /&gt;
			ctx.loadApi.post(); // reload the page and reapply the edit&lt;br /&gt;
&lt;br /&gt;
		// check for loss of edit token&lt;br /&gt;
		// it&#039;s impractical to request a new token here, so invoke edit conflict logic when this happens&lt;br /&gt;
		} else if ( errorCode === &amp;quot;notoken&amp;quot; &amp;amp;&amp;amp; ctx.conflictRetries++ &amp;lt; ctx.maxConflictRetries ) {&lt;br /&gt;
&lt;br /&gt;
			ctx.statusElement.info(&amp;quot;Edit token is invalid, retrying&amp;quot;);&lt;br /&gt;
			--Morebits.wiki.numberOfActionsLeft;  // allow for normal completion if retry succeeds&lt;br /&gt;
			ctx.loadApi.post(); // reload&lt;br /&gt;
&lt;br /&gt;
		// check for network or server error&lt;br /&gt;
		} else if ( errorCode === &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; ctx.retries++ &amp;lt; ctx.maxRetries ) {&lt;br /&gt;
&lt;br /&gt;
			// the error might be transient, so try again&lt;br /&gt;
			ctx.statusElement.info(&amp;quot;Save failed, retrying&amp;quot;);&lt;br /&gt;
			--Morebits.wiki.numberOfActionsLeft;  // allow for normal completion if retry succeeds&lt;br /&gt;
			ctx.saveApi.post(); // give it another go!&lt;br /&gt;
&lt;br /&gt;
		// hard error, give up&lt;br /&gt;
		} else {&lt;br /&gt;
&lt;br /&gt;
			// non-admin attempting to edit a protected page - this gives a friendlier message than the default&lt;br /&gt;
			if ( errorCode === &amp;quot;protectedpage&amp;quot; ) {&lt;br /&gt;
				ctx.statusElement.error( &amp;quot;Failed to save edit: Page is fully protected&amp;quot; );&lt;br /&gt;
			} else {&lt;br /&gt;
				ctx.statusElement.error( &amp;quot;Failed to save edit: &amp;quot; + ctx.saveApi.getErrorText() );&lt;br /&gt;
			}&lt;br /&gt;
			ctx.editMode = &#039;all&#039;;  // cancel append/prepend/revert modes&lt;br /&gt;
			if (ctx.onSaveFailure) {&lt;br /&gt;
				ctx.onSaveFailure(this);  // invoke callback&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnLookupCreatorSuccess = function() {&lt;br /&gt;
		var xml = ctx.lookupCreatorApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		if ( !fnCheckPageName(xml) ) {&lt;br /&gt;
			return; // abort&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.creator = $(xml).find(&#039;rev&#039;).attr(&#039;user&#039;);&lt;br /&gt;
		if (!ctx.creator) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Could not find name of page creator&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ctx.onLookupCreatorSuccess(this);&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnProcessMove = function() {&lt;br /&gt;
		var xml = ctx.moveApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		if ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) === &amp;quot;&amp;quot;) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot move the page, because it no longer exists&amp;quot;);&lt;br /&gt;
			ctx.onMoveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// extract protection info&lt;br /&gt;
		if (Morebits.userIsInGroup(&#039;sysop&#039;)) {&lt;br /&gt;
			var editprot = $(xml).find(&#039;pr[type=&amp;quot;edit&amp;quot;]&#039;);&lt;br /&gt;
			if (editprot.length &amp;gt; 0 &amp;amp;&amp;amp; editprot.attr(&#039;level&#039;) === &#039;sysop&#039; &amp;amp;&amp;amp; !ctx.suppressProtectWarning &amp;amp;&amp;amp; &lt;br /&gt;
				!confirm(&#039;You are about to move the fully protected page &amp;quot;&#039; + ctx.pageName +&lt;br /&gt;
				(editprot.attr(&#039;expiry&#039;) === &#039;infinity&#039; ? &#039;&amp;quot; (protected indefinitely)&#039; : (&#039;&amp;quot; (protection expiring &#039; + editprot.attr(&#039;expiry&#039;) + &#039;)&#039;)) +&lt;br /&gt;
				&#039;.  \n\nClick OK to proceed with the move, or Cancel to skip this move.&#039;)) {&lt;br /&gt;
				ctx.statusElement.error(&amp;quot;Move of fully protected page was aborted.&amp;quot;);&lt;br /&gt;
				ctx.onMoveFailure(this);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var moveToken = $(xml).find(&#039;page&#039;).attr(&#039;movetoken&#039;);&lt;br /&gt;
		if (!moveToken) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve move token.&amp;quot;);&lt;br /&gt;
			ctx.onMoveFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			&#039;action&#039;: &#039;move&#039;,&lt;br /&gt;
			&#039;from&#039;: $(xml).find(&#039;page&#039;).attr(&#039;title&#039;),&lt;br /&gt;
			&#039;to&#039;: ctx.moveDestination,&lt;br /&gt;
			&#039;token&#039;: moveToken,&lt;br /&gt;
			&#039;reason&#039;: ctx.editSummary&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.moveTalkPage) {&lt;br /&gt;
			query.movetalk = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (ctx.moveSubpages) {&lt;br /&gt;
			query.movesubpages = &#039;true&#039;;  // XXX don&#039;t know whether this works for non-admins&lt;br /&gt;
		}&lt;br /&gt;
		if (ctx.moveSuppressRedirect) {&lt;br /&gt;
			query.noredirect = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (ctx.watchlistOption === &#039;watch&#039;) {&lt;br /&gt;
			query.watch = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.moveProcessApi = new Morebits.wiki.api(&amp;quot;moving page...&amp;quot;, query, ctx.onMoveSuccess, ctx.statusElement, ctx.onMoveFailure);&lt;br /&gt;
		ctx.moveProcessApi.setParent(this);&lt;br /&gt;
		ctx.moveProcessApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnProcessDelete = function() {&lt;br /&gt;
		var xml = ctx.deleteApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		if ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) === &amp;quot;&amp;quot;) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot delete the page, because it no longer exists&amp;quot;);&lt;br /&gt;
			ctx.onDeleteFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// extract protection info&lt;br /&gt;
		var editprot = $(xml).find(&#039;pr[type=&amp;quot;edit&amp;quot;]&#039;);&lt;br /&gt;
		if (editprot.length &amp;gt; 0 &amp;amp;&amp;amp; editprot.attr(&#039;level&#039;) === &#039;sysop&#039; &amp;amp;&amp;amp; !ctx.suppressProtectWarning &amp;amp;&amp;amp;&lt;br /&gt;
			!confirm(&#039;You are about to delete the fully protected page &amp;quot;&#039; + ctx.pageName +&lt;br /&gt;
			(editprot.attr(&#039;expiry&#039;) === &#039;infinity&#039; ? &#039;&amp;quot; (protected indefinitely)&#039; : (&#039;&amp;quot; (protection expiring &#039; + editprot.attr(&#039;expiry&#039;) + &#039;)&#039;)) +&lt;br /&gt;
			&#039;.  \n\nClick OK to proceed with the deletion, or Cancel to skip this deletion.&#039;)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Deletion of fully protected page was aborted.&amp;quot;);&lt;br /&gt;
			ctx.onDeleteFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var deleteToken = $(xml).find(&#039;page&#039;).attr(&#039;deletetoken&#039;);&lt;br /&gt;
		if (!deleteToken) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve delete token.&amp;quot;);&lt;br /&gt;
			ctx.onDeleteFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			&#039;action&#039;: &#039;delete&#039;,&lt;br /&gt;
			&#039;title&#039;: $(xml).find(&#039;page&#039;).attr(&#039;title&#039;),&lt;br /&gt;
			&#039;token&#039;: deleteToken,&lt;br /&gt;
			&#039;reason&#039;: ctx.editSummary&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.watchlistOption === &#039;watch&#039;) {&lt;br /&gt;
			query.watch = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.deleteProcessApi = new Morebits.wiki.api(&amp;quot;deleting page...&amp;quot;, query, ctx.onDeleteSuccess, ctx.statusElement, ctx.onDeleteFailure);&lt;br /&gt;
		ctx.deleteProcessApi.setParent(this);&lt;br /&gt;
		ctx.deleteProcessApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnProcessProtect = function() {&lt;br /&gt;
		var xml = ctx.protectApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		var missing = ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) === &amp;quot;&amp;quot;);&lt;br /&gt;
		if (((ctx.protectEdit || ctx.protectMove) &amp;amp;&amp;amp; missing)) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot protect the page, because it no longer exists&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if (ctx.protectCreate &amp;amp;&amp;amp; !missing) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot create protect the page, because it already exists&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// TODO cascading protection not possible on edit&amp;lt;sysop&lt;br /&gt;
&lt;br /&gt;
		var protectToken = $(xml).find(&#039;page&#039;).attr(&#039;protecttoken&#039;);&lt;br /&gt;
		if (!protectToken) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve protect token.&amp;quot;);&lt;br /&gt;
			ctx.onProtectFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// fetch existing protection levels&lt;br /&gt;
		var prs = $(xml).find(&#039;pr&#039;);&lt;br /&gt;
		var editprot = prs.filter(&#039;[type=&amp;quot;edit&amp;quot;]&#039;);&lt;br /&gt;
		var moveprot = prs.filter(&#039;[type=&amp;quot;move&amp;quot;]&#039;);&lt;br /&gt;
		var createprot = prs.filter(&#039;[type=&amp;quot;create&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
		var protections = [], expirys = [];&lt;br /&gt;
&lt;br /&gt;
		// set edit protection level&lt;br /&gt;
		if (ctx.protectEdit) {&lt;br /&gt;
			protections.push(&#039;edit=&#039; + ctx.protectEdit.level);&lt;br /&gt;
			expirys.push(ctx.protectEdit.expiry);&lt;br /&gt;
		} else if (editprot.length) {&lt;br /&gt;
			protections.push(&#039;edit=&#039; + editprot.attr(&amp;quot;level&amp;quot;));&lt;br /&gt;
			expirys.push(editprot.attr(&amp;quot;expiry&amp;quot;).replace(&amp;quot;infinity&amp;quot;, &amp;quot;indefinite&amp;quot;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (ctx.protectMove) {&lt;br /&gt;
			protections.push(&#039;move=&#039; + ctx.protectMove.level);&lt;br /&gt;
			expirys.push(ctx.protectMove.expiry);&lt;br /&gt;
		} else if (moveprot.length) {&lt;br /&gt;
			protections.push(&#039;move=&#039; + moveprot.attr(&amp;quot;level&amp;quot;));&lt;br /&gt;
			expirys.push(moveprot.attr(&amp;quot;expiry&amp;quot;).replace(&amp;quot;infinity&amp;quot;, &amp;quot;indefinite&amp;quot;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (ctx.protectCreate) {&lt;br /&gt;
			protections.push(&#039;create=&#039; + ctx.protectCreate.level);&lt;br /&gt;
			expirys.push(ctx.protectCreate.expiry);&lt;br /&gt;
		} else if (createprot.length) {&lt;br /&gt;
			protections.push(&#039;create=&#039; + createprot.attr(&amp;quot;level&amp;quot;));&lt;br /&gt;
			expirys.push(createprot.attr(&amp;quot;expiry&amp;quot;).replace(&amp;quot;infinity&amp;quot;, &amp;quot;indefinite&amp;quot;));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;protect&#039;,&lt;br /&gt;
			title: $(xml).find(&#039;page&#039;).attr(&#039;title&#039;),&lt;br /&gt;
			token: protectToken,&lt;br /&gt;
			protections: protections.join(&#039;|&#039;),&lt;br /&gt;
			expiry: expirys.join(&#039;|&#039;),&lt;br /&gt;
			reason: ctx.editSummary&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.protectCascade) {&lt;br /&gt;
			query.cascade = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (ctx.watchlistOption === &#039;watch&#039;) {&lt;br /&gt;
			query.watch = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.protectProcessApi = new Morebits.wiki.api(&amp;quot;protecting page...&amp;quot;, query, ctx.onProtectSuccess, ctx.statusElement, ctx.onProtectFailure);&lt;br /&gt;
		ctx.protectProcessApi.setParent(this);&lt;br /&gt;
		ctx.protectProcessApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnProcessStabilize = function() {&lt;br /&gt;
		var xml = ctx.stabilizeApi.getXML();&lt;br /&gt;
&lt;br /&gt;
		var missing = ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) === &amp;quot;&amp;quot;);&lt;br /&gt;
		if (missing) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Cannot protect the page, because it no longer exists&amp;quot;);&lt;br /&gt;
			ctx.onStabilizeFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var stabilizeToken = $(xml).find(&#039;page&#039;).attr(&#039;edittoken&#039;);&lt;br /&gt;
		if (!stabilizeToken) {&lt;br /&gt;
			ctx.statusElement.error(&amp;quot;Failed to retrieve stabilize token.&amp;quot;);&lt;br /&gt;
			ctx.onStabilizeFailure(this);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;stabilize&#039;,&lt;br /&gt;
			title: $(xml).find(&#039;page&#039;).attr(&#039;title&#039;),&lt;br /&gt;
			token: stabilizeToken,&lt;br /&gt;
			protectlevel: ctx.flaggedRevs.level,&lt;br /&gt;
			expiry: ctx.flaggedRevs.expiry,&lt;br /&gt;
			reason: ctx.editSummary&lt;br /&gt;
		};&lt;br /&gt;
		if (ctx.watchlistOption === &#039;watch&#039;) {&lt;br /&gt;
			query.watch = &#039;true&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		ctx.stabilizeProcessApi = new Morebits.wiki.api(&amp;quot;configuring stabilization settings...&amp;quot;, query, ctx.onStabilizeSuccess, ctx.statusElement, ctx.onStabilizeFailure);&lt;br /&gt;
		ctx.stabilizeProcessApi.setParent(this);&lt;br /&gt;
		ctx.stabilizeProcessApi.post();&lt;br /&gt;
	};&lt;br /&gt;
}; // end Morebits.wiki.page&lt;br /&gt;
&lt;br /&gt;
/** Morebits.wiki.page TODO: (XXX)&lt;br /&gt;
 * - Should we retry loads also?&lt;br /&gt;
 * - Need to reset current action before the save?&lt;br /&gt;
 * - Deal with action.completed stuff&lt;br /&gt;
 * - Need to reset all parameters once done (e.g. edit summary, move destination, etc.)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wiki.preview ****************&lt;br /&gt;
 * Uses the API to parse a fragment of wikitext and render it as HTML.&lt;br /&gt;
 *&lt;br /&gt;
 * Constructor: Morebits.wiki.preview(previewbox, currentAction)&lt;br /&gt;
 *    previewbox - the &amp;lt;div&amp;gt; element that will contain the rendered HTML&lt;br /&gt;
 *&lt;br /&gt;
 * beginRender(wikitext): Displays the preview box, and begins an asynchronous attempt&lt;br /&gt;
 *                        to render the specified wikitext.&lt;br /&gt;
 *    wikitext - wikitext to render; most things should work, including subst: and ~~~~&lt;br /&gt;
 *&lt;br /&gt;
 * closePreview(): Hides the preview box and clears it.&lt;br /&gt;
 *&lt;br /&gt;
 * The suggested implementation pattern (in Morebits.simpleWindow + Morebits.quickForm situations) is to&lt;br /&gt;
 * construct a Morebits.wiki.preview object after rendering a Morebits.quickForm, and bind the object&lt;br /&gt;
 * to an arbitrary property of the form (e.g. |previewer|).  For an example, see&lt;br /&gt;
 * twinklewarn.js.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wiki.preview = function(previewbox) {&lt;br /&gt;
	this.previewbox = previewbox;&lt;br /&gt;
	$(previewbox).addClass(&amp;quot;morebits-previewbox&amp;quot;).hide();&lt;br /&gt;
&lt;br /&gt;
	this.beginRender = function(wikitext) {&lt;br /&gt;
		$(previewbox).show();&lt;br /&gt;
&lt;br /&gt;
		var statusspan = document.createElement(&#039;span&#039;);&lt;br /&gt;
		previewbox.appendChild(statusspan);&lt;br /&gt;
		Morebits.status.init(statusspan);&lt;br /&gt;
&lt;br /&gt;
		var query = {&lt;br /&gt;
			action: &#039;parse&#039;,&lt;br /&gt;
			prop: &#039;text&#039;,&lt;br /&gt;
			pst: &#039;true&#039;,  // PST = pre-save transform; this makes substitution work properly&lt;br /&gt;
			text: wikitext,&lt;br /&gt;
			title: mw.config.get(&#039;wgPageName&#039;)&lt;br /&gt;
		};&lt;br /&gt;
		var renderApi = new Morebits.wiki.api(&amp;quot;loading...&amp;quot;, query, fnRenderSuccess, new Morebits.status(&amp;quot;Preview&amp;quot;));&lt;br /&gt;
		renderApi.post();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var fnRenderSuccess = function(apiobj) {&lt;br /&gt;
		var xml = apiobj.getXML();&lt;br /&gt;
		var html = $(xml).find(&#039;text&#039;).text();&lt;br /&gt;
		if (!html) {&lt;br /&gt;
			apiobj.statelem.error(&amp;quot;failed to retrieve preview, or template was blanked&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		previewbox.innerHTML = html;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	this.closePreview = function() {&lt;br /&gt;
		$(previewbox).empty().hide();&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.wikitext ****************&lt;br /&gt;
 * Wikitext manipulation&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.wikitext = {};&lt;br /&gt;
&lt;br /&gt;
Morebits.wikitext.template = {&lt;br /&gt;
	parse: function( text, start ) {&lt;br /&gt;
		var count = -1;&lt;br /&gt;
		var level = -1;&lt;br /&gt;
		var equals = -1;&lt;br /&gt;
		var current = &#039;&#039;;&lt;br /&gt;
		var result = {&lt;br /&gt;
			name: &#039;&#039;,&lt;br /&gt;
			parameters: {}&lt;br /&gt;
		};&lt;br /&gt;
		var key, value;&lt;br /&gt;
&lt;br /&gt;
		for( var i = start; i &amp;lt; text.length; ++i ) {&lt;br /&gt;
			var test3 = text.substr( i, 3 );&lt;br /&gt;
			if( test3 === &#039;{{{&#039; ) {&lt;br /&gt;
				current += &#039;{{{&#039;;&lt;br /&gt;
				i += 2;&lt;br /&gt;
				++level;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			if( test3 === &#039;}}}&#039; ) {&lt;br /&gt;
				current += &#039;}}}&#039;;&lt;br /&gt;
				i += 2;&lt;br /&gt;
				--level;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			var test2 = text.substr( i, 2 );&lt;br /&gt;
			if( test2 === &#039;{{&#039; || test2 === &#039;[[&#039; ) {&lt;br /&gt;
				current += test2;&lt;br /&gt;
				++i;&lt;br /&gt;
				++level;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			if( test2 === &#039;[[&#039; ) {&lt;br /&gt;
				current += test2;&lt;br /&gt;
				++i;&lt;br /&gt;
				--level;&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			if( test2 === &#039;}}&#039; ) {&lt;br /&gt;
				current += test2;&lt;br /&gt;
				++i;&lt;br /&gt;
				--level;&lt;br /&gt;
&lt;br /&gt;
				if( level &amp;lt;= 0 ) {&lt;br /&gt;
					if( count === -1 ) {&lt;br /&gt;
						result.name = current.substring(2).trim();&lt;br /&gt;
						++count;&lt;br /&gt;
					} else {&lt;br /&gt;
						if( equals !== -1 ) {&lt;br /&gt;
							key = current.substring( 0, equals ).trim();&lt;br /&gt;
							value = current.substring( equals ).trim();&lt;br /&gt;
							result.parameters[key] = value;&lt;br /&gt;
							equals = -1;&lt;br /&gt;
						} else {&lt;br /&gt;
							result.parameters[count] = current;&lt;br /&gt;
							++count;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if( text.charAt(i) === &#039;|&#039; &amp;amp;&amp;amp; level &amp;lt;= 0 ) {&lt;br /&gt;
				if( count === -1 ) {&lt;br /&gt;
					result.name = current.substring(2).trim();&lt;br /&gt;
					++count;&lt;br /&gt;
				} else {&lt;br /&gt;
					if( equals !== -1 ) {&lt;br /&gt;
						key = current.substring( 0, equals ).trim();&lt;br /&gt;
						value = current.substring( equals + 1 ).trim();&lt;br /&gt;
						result.parameters[key] = value;&lt;br /&gt;
						equals = -1;&lt;br /&gt;
					} else {&lt;br /&gt;
						result.parameters[count] = current;&lt;br /&gt;
						++count;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				current = &#039;&#039;;&lt;br /&gt;
			} else if( equals === -1 &amp;amp;&amp;amp; text.charAt(i) === &#039;=&#039; &amp;amp;&amp;amp; level &amp;lt;= 0 ) {&lt;br /&gt;
				equals = current.length;&lt;br /&gt;
				current += text.charAt(i);&lt;br /&gt;
			} else {&lt;br /&gt;
				current += text.charAt(i);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return result;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wikitext.page = function mediawikiPage( text ) {&lt;br /&gt;
	this.text = text;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.wikitext.page.prototype = {&lt;br /&gt;
	text: &#039;&#039;,&lt;br /&gt;
	removeLink: function( link_target ) {&lt;br /&gt;
		var first_char = link_target.substr( 0, 1 );&lt;br /&gt;
		var link_re_string = &amp;quot;[&amp;quot; + first_char.toUpperCase() + first_char.toLowerCase() + &#039;]&#039; + RegExp.escape( link_target.substr( 1 ), true );&lt;br /&gt;
		var link_simple_re = new RegExp( &amp;quot;\\[\\[:?(&amp;quot; + link_re_string + &amp;quot;)\\]\\]&amp;quot;, &#039;g&#039; );&lt;br /&gt;
		var link_named_re = new RegExp( &amp;quot;\\[\\[:?&amp;quot; + link_re_string + &amp;quot;\\|(.+?)\\]\\]&amp;quot;, &#039;g&#039; );&lt;br /&gt;
		this.text = this.text.replace( link_simple_re, &amp;quot;$1&amp;quot; ).replace( link_named_re, &amp;quot;$1&amp;quot; );&lt;br /&gt;
	},&lt;br /&gt;
	commentOutImage: function( image, reason ) {&lt;br /&gt;
		var unbinder = new Morebits.unbinder( this.text );&lt;br /&gt;
		unbinder.unbind( &#039;&amp;lt;!--&#039;, &#039;--&amp;gt;&#039; );&lt;br /&gt;
&lt;br /&gt;
		reason = reason ? (reason + &#039;: &#039;) : &#039;&#039;;&lt;br /&gt;
		var first_char = image.substr( 0, 1 );&lt;br /&gt;
		var image_re_string = &amp;quot;[&amp;quot; + first_char.toUpperCase() + first_char.toLowerCase() + &#039;]&#039; + RegExp.escape( image.substr( 1 ), true );&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * Check for normal image links, i.e. [[Image:Foobar.png|...]]&lt;br /&gt;
		 * Will eat the whole link&lt;br /&gt;
		 */&lt;br /&gt;
		var links_re = new RegExp( &amp;quot;\\[\\[(?:[Ii]mage|[Ff]ile):\\s*&amp;quot; + image_re_string );&lt;br /&gt;
		var allLinks = Morebits.array.uniq(Morebits.string.splitWeightedByKeys( unbinder.content, &#039;[[&#039;, &#039;]]&#039; ));&lt;br /&gt;
		for( var i = 0; i &amp;lt; allLinks.length; ++i ) {&lt;br /&gt;
			if( links_re.test( allLinks[i] ) ) {&lt;br /&gt;
				var replacement = &#039;&amp;lt;!-- &#039; + reason + allLinks[i] + &#039; --&amp;gt;&#039;;&lt;br /&gt;
				unbinder.content = unbinder.content.replace( allLinks[i], replacement, &#039;g&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// unbind the newly created comments&lt;br /&gt;
		unbinder.unbind( &#039;&amp;lt;!--&#039;, &#039;--&amp;gt;&#039; );&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * Check for gallery images, i.e. instances that must start on a new line, eventually preceded with some space, and must include Image: prefix&lt;br /&gt;
		 * Will eat the whole line.&lt;br /&gt;
		 */&lt;br /&gt;
		var gallery_image_re = new RegExp( &amp;quot;(^\\s*(?:[Ii]mage|[Ff]ile):\\s*&amp;quot; + image_re_string + &amp;quot;.*?$)&amp;quot;, &#039;mg&#039; );&lt;br /&gt;
		unbinder.content = unbinder.content.replace( gallery_image_re, &amp;quot;&amp;lt;!-- &amp;quot; + reason + &amp;quot;$1 --&amp;gt;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
		// unbind the newly created comments&lt;br /&gt;
		unbinder.unbind( &#039;&amp;lt;!--&#039;, &#039;--&amp;gt;&#039; );&lt;br /&gt;
		/*&lt;br /&gt;
		 * Check free image usages, for example as template arguments, might have the Image: prefix excluded, but must be preceeded by an |&lt;br /&gt;
		 * Will only eat the image name and the preceeding bar and an eventual named parameter&lt;br /&gt;
		 */&lt;br /&gt;
		var free_image_re = new RegExp( &amp;quot;(\\|\\s*(?:[\\w\\s]+\\=)?\\s*(?:(?:[Ii]mage|[Ff]ile):\\s*)?&amp;quot; + image_re_string + &amp;quot;)&amp;quot;, &#039;mg&#039; );&lt;br /&gt;
		unbinder.content = unbinder.content.replace( free_image_re, &amp;quot;&amp;lt;!-- &amp;quot; + reason + &amp;quot;$1 --&amp;gt;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
		// Rebind the content now, we are done!&lt;br /&gt;
		this.text = unbinder.rebind();&lt;br /&gt;
	},&lt;br /&gt;
	addToImageComment: function( image, data ) {&lt;br /&gt;
		var first_char = image.substr( 0, 1 );&lt;br /&gt;
		var first_char_regex = RegExp.escape( first_char, true );&lt;br /&gt;
		if( first_char.toUpperCase() !== first_char.toLowerCase() ) {&lt;br /&gt;
			first_char_regex = &#039;[&#039; + RegExp.escape( first_char.toUpperCase(), true ) + RegExp.escape( first_char.toLowerCase(), true ) + &#039;]&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var image_re_string = &amp;quot;(?:[Ii]mage|[Ff]ile):\\s*&amp;quot; + first_char_regex + RegExp.escape( image.substr( 1 ), true );&lt;br /&gt;
		var links_re = new RegExp( &amp;quot;\\[\\[&amp;quot; + image_re_string );&lt;br /&gt;
		var allLinks = Morebits.array.uniq(Morebits.string.splitWeightedByKeys( this.text, &#039;[[&#039;, &#039;]]&#039; ));&lt;br /&gt;
		for( var i = 0; i &amp;lt; allLinks.length; ++i ) {&lt;br /&gt;
			if( links_re.test( allLinks[i] ) ) {&lt;br /&gt;
				var replacement = allLinks[i];&lt;br /&gt;
				// just put it at the end?&lt;br /&gt;
				replacement = replacement.replace( /\]\]$/, &#039;|&#039; + data + &#039;]]&#039; );&lt;br /&gt;
				this.text = this.text.replace( allLinks[i], replacement, &#039;g&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		var gallery_re = new RegExp( &amp;quot;^(\\s*&amp;quot; + image_re_string + &#039;.*?)\\|?(.*?)$&#039;, &#039;mg&#039; );&lt;br /&gt;
		var newtext = &amp;quot;$1|$2 &amp;quot; + data;&lt;br /&gt;
		this.text = this.text.replace( gallery_re, newtext );&lt;br /&gt;
	},&lt;br /&gt;
	removeTemplate: function( template ) {&lt;br /&gt;
		var first_char = template.substr( 0, 1 );&lt;br /&gt;
		var template_re_string = &amp;quot;(?:[Tt]emplate:)?\\s*[&amp;quot; + first_char.toUpperCase() + first_char.toLowerCase() + &#039;]&#039; + RegExp.escape( template.substr( 1 ), true );&lt;br /&gt;
		var links_re = new RegExp( &amp;quot;\\{\\{&amp;quot; + template_re_string );&lt;br /&gt;
		var allTemplates = Morebits.array.uniq(Morebits.string.splitWeightedByKeys( this.text, &#039;{{&#039;, &#039;}}&#039;, [ &#039;{{{&#039;, &#039;}}}&#039; ] ));&lt;br /&gt;
		for( var i = 0; i &amp;lt; allTemplates.length; ++i ) {&lt;br /&gt;
			if( links_re.test( allTemplates[i] ) ) {&lt;br /&gt;
				this.text = this.text.replace( allTemplates[i], &#039;&#039;, &#039;g&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	getText: function() {&lt;br /&gt;
		return this.text;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.queryString ****************&lt;br /&gt;
 * Maps the querystring to an object&lt;br /&gt;
 *&lt;br /&gt;
 * Functions:&lt;br /&gt;
 *&lt;br /&gt;
 * Morebits.queryString.exists(key)&lt;br /&gt;
 *     returns true if the particular key is set&lt;br /&gt;
 * Morebits.queryString.get(key)&lt;br /&gt;
 *     returns the value associated to the key&lt;br /&gt;
 * Morebits.queryString.equals(key, value)&lt;br /&gt;
 *     returns true if the value associated with given key equals given value&lt;br /&gt;
 * Morebits.queryString.toString()&lt;br /&gt;
 *     returns the query string as a string&lt;br /&gt;
 * Morebits.queryString.create( hash )&lt;br /&gt;
 *     creates an querystring and encodes strings via encodeURIComponent and joins arrays with | &lt;br /&gt;
 *&lt;br /&gt;
 * In static context, the value of location.search.substring(1), else the value given to the constructor is going to be used. The mapped hash is saved in the object.&lt;br /&gt;
 *&lt;br /&gt;
 * Example:&lt;br /&gt;
 *&lt;br /&gt;
 * var value = Morebits.queryString.get(&#039;key&#039;);&lt;br /&gt;
 * var obj = new Morebits.queryString(&#039;foo=bar&amp;amp;baz=quux&#039;);&lt;br /&gt;
 * value = obj.get(&#039;foo&#039;);&lt;br /&gt;
 */&lt;br /&gt;
Morebits.queryString = function QueryString(qString) {&lt;br /&gt;
	this.string = qString;&lt;br /&gt;
	this.params = {};&lt;br /&gt;
&lt;br /&gt;
	if( !qString.length ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	qString.replace(/\+/, &#039; &#039;);&lt;br /&gt;
	var args = qString.split(&#039;&amp;amp;&#039;);&lt;br /&gt;
&lt;br /&gt;
	for( var i = 0; i &amp;lt; args.length; ++i ) {&lt;br /&gt;
		var pair = args[i].split( &#039;=&#039; );&lt;br /&gt;
		var key = decodeURIComponent( pair[0] ), value = key;&lt;br /&gt;
&lt;br /&gt;
		if( pair.length === 2 ) {&lt;br /&gt;
			value = decodeURIComponent( pair[1] );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		this.params[key] = value;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.staticstr = null;&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.staticInit = function() {&lt;br /&gt;
	if( !Morebits.queryString.staticstr ) {&lt;br /&gt;
		Morebits.queryString.staticstr = new Morebits.queryString(location.search.substring(1));&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.get = function(key) {&lt;br /&gt;
	Morebits.queryString.staticInit();&lt;br /&gt;
	return Morebits.queryString.staticstr.get(key);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.prototype.get = function(key) {&lt;br /&gt;
	return this.params[key] ? this.params[key] : null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.exists = function(key) {&lt;br /&gt;
	Morebits.queryString.staticInit();&lt;br /&gt;
	return Morebits.queryString.staticstr.exists(key);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.prototype.exists = function(key) {&lt;br /&gt;
	return this.params[key] ? true : false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.equals = function(key, value) {&lt;br /&gt;
	Morebits.queryString.staticInit();&lt;br /&gt;
	return Morebits.queryString.staticstr.equals(key, value);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.prototype.equals = function(key, value) {&lt;br /&gt;
	return this.params[key] === value ? true : false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.toString = function() {&lt;br /&gt;
	Morebits.queryString.staticInit();&lt;br /&gt;
	return Morebits.queryString.staticstr.toString();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.prototype.toString = function() {&lt;br /&gt;
	return this.string ? this.string : null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.queryString.create = function( arr ) {&lt;br /&gt;
	var resarr = [];&lt;br /&gt;
	var editToken;  // KLUGE: this should always be the last item in the query string (bug TW-B-0013)&lt;br /&gt;
	for( var i in arr ) {&lt;br /&gt;
		if( arr[i] === undefined ) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		var res;&lt;br /&gt;
		if( $.isArray( arr[i] ) ){&lt;br /&gt;
			var v = [];&lt;br /&gt;
			for(var j = 0; j &amp;lt; arr[i].length; ++j ) {&lt;br /&gt;
				v[j] = encodeURIComponent( arr[i][j] );&lt;br /&gt;
			}&lt;br /&gt;
			res = v.join(&#039;|&#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			res = encodeURIComponent( arr[i] );&lt;br /&gt;
		}&lt;br /&gt;
		if( i === &#039;token&#039; ) {&lt;br /&gt;
			editToken = res;&lt;br /&gt;
		} else {&lt;br /&gt;
			resarr.push( encodeURIComponent( i ) + &#039;=&#039; + res );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if( editToken !== undefined ) {&lt;br /&gt;
		resarr.push( &#039;token=&#039; + editToken );&lt;br /&gt;
	}&lt;br /&gt;
	return resarr.join(&#039;&amp;amp;&#039;);&lt;br /&gt;
};&lt;br /&gt;
Morebits.queryString.prototype.create = Morebits.queryString.create;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.status ****************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.status = function Status( text, stat, type ) {&lt;br /&gt;
	this.textRaw = text;&lt;br /&gt;
	this.text = this.codify(text);&lt;br /&gt;
	this.type = type || &#039;status&#039;;&lt;br /&gt;
	this.generate();&lt;br /&gt;
	if( stat ) {&lt;br /&gt;
		this.update( stat, type );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.init = function( root ) {&lt;br /&gt;
	if( !( root instanceof Element ) ) {&lt;br /&gt;
		throw new Error( &#039;object not an instance of Element&#039; );&lt;br /&gt;
	}&lt;br /&gt;
	while( root.hasChildNodes() ) {&lt;br /&gt;
		root.removeChild( root.firstChild );&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.status.root = root;&lt;br /&gt;
	Morebits.status.errorEvent = null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.root = null;&lt;br /&gt;
&lt;br /&gt;
Morebits.status.onError = function( handler ) {&lt;br /&gt;
	if ( $.isFunction( handler ) ) {&lt;br /&gt;
		Morebits.status.errorEvent = handler;&lt;br /&gt;
	} else {&lt;br /&gt;
		throw &amp;quot;Morebits.status.onError: handler is not a function&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.prototype = {&lt;br /&gt;
	stat: null,&lt;br /&gt;
	text: null,&lt;br /&gt;
	textRaw: null,&lt;br /&gt;
	type: &#039;status&#039;,&lt;br /&gt;
	target: null,&lt;br /&gt;
	node: null,&lt;br /&gt;
	linked: false,&lt;br /&gt;
	link: function() {&lt;br /&gt;
		if( ! this.linked &amp;amp;&amp;amp; Morebits.status.root ) {&lt;br /&gt;
			Morebits.status.root.appendChild( this.node );&lt;br /&gt;
			this.linked = true;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlink: function() {&lt;br /&gt;
		if( this.linked ) {&lt;br /&gt;
			Morebits.status.root.removeChild( this.node );&lt;br /&gt;
			this.linked = false;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	codify: function( obj ) {&lt;br /&gt;
		if ( ! $.isArray( obj ) ) {&lt;br /&gt;
			obj = [ obj ];&lt;br /&gt;
		}&lt;br /&gt;
		var result;&lt;br /&gt;
		result = document.createDocumentFragment();&lt;br /&gt;
		for( var i = 0; i &amp;lt; obj.length; ++i ) {&lt;br /&gt;
			if( typeof obj[i] === &#039;string&#039; ) {&lt;br /&gt;
				result.appendChild( document.createTextNode( obj[i] ) );&lt;br /&gt;
			} else if( obj[i] instanceof Element ) {&lt;br /&gt;
				result.appendChild( obj[i] );&lt;br /&gt;
			} // Else cosmic radiation made something shit&lt;br /&gt;
		}&lt;br /&gt;
		return result;&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	update: function( status, type ) {&lt;br /&gt;
		this.stat = this.codify( status );&lt;br /&gt;
		if( type ) {&lt;br /&gt;
			this.type = type;&lt;br /&gt;
			if (type === &#039;error&#039;) {&lt;br /&gt;
				// hack to force the page not to reload when an error is output - see also Morebits.status() above&lt;br /&gt;
				Morebits.wiki.numberOfActionsLeft = 1000;&lt;br /&gt;
				// call error callback&lt;br /&gt;
				if (Morebits.status.errorEvent) {&lt;br /&gt;
					Morebits.status.errorEvent();&lt;br /&gt;
				}&lt;br /&gt;
				// also log error messages in the browser console&lt;br /&gt;
				if (console &amp;amp;&amp;amp; console.error) {&lt;br /&gt;
					console.error(this.textRaw + &amp;quot;: &amp;quot; + status);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		this.render();&lt;br /&gt;
	},&lt;br /&gt;
	generate: function() {&lt;br /&gt;
		this.node = document.createElement( &#039;div&#039; );&lt;br /&gt;
		this.node.appendChild( document.createElement(&#039;span&#039;) ).appendChild( this.text );&lt;br /&gt;
		this.node.appendChild( document.createElement(&#039;span&#039;) ).appendChild( document.createTextNode( &#039;: &#039; ) );&lt;br /&gt;
		this.target = this.node.appendChild( document.createElement( &#039;span&#039; ) );&lt;br /&gt;
		this.target.appendChild(  document.createTextNode( &#039;&#039; ) ); // dummy node&lt;br /&gt;
	},&lt;br /&gt;
	render: function() {&lt;br /&gt;
		this.node.className = &#039;tw_status_&#039; + this.type;&lt;br /&gt;
		while( this.target.hasChildNodes() ) {&lt;br /&gt;
			this.target.removeChild( this.target.firstChild );&lt;br /&gt;
		}&lt;br /&gt;
		this.target.appendChild( this.stat );&lt;br /&gt;
		this.link();&lt;br /&gt;
	},&lt;br /&gt;
	status: function( status ) {&lt;br /&gt;
		this.update( status, &#039;status&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	info: function( status ) {&lt;br /&gt;
		this.update( status, &#039;info&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	warn: function( status ) {&lt;br /&gt;
		this.update( status, &#039;warn&#039;);&lt;br /&gt;
	},&lt;br /&gt;
	error: function( status ) {&lt;br /&gt;
		this.update( status, &#039;error&#039;);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.info = function( text, status ) {&lt;br /&gt;
	return new Morebits.status( text, status, &#039;info&#039; );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.warn = function( text, status ) {&lt;br /&gt;
	return new Morebits.status( text, status, &#039;warn&#039; );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.status.error = function( text, status ) {&lt;br /&gt;
	return new Morebits.status( text, status, &#039;error&#039; );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.htmlNode() ****************&lt;br /&gt;
 * Simple helper function to create a simple node&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Morebits.htmlNode = function ( type, content, color ) {&lt;br /&gt;
	var node = document.createElement( type );&lt;br /&gt;
	if( color ) {&lt;br /&gt;
		node.style.color = color;&lt;br /&gt;
	}&lt;br /&gt;
	node.appendChild( document.createTextNode( content ) );&lt;br /&gt;
	return node;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Morebits.simpleWindow ****************&lt;br /&gt;
 * A simple draggable window&lt;br /&gt;
 * now a wrapper for jQuery UI&#039;s dialog feature&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
// The height passed in here is the maximum allowable height for the content area.&lt;br /&gt;
Morebits.simpleWindow = function SimpleWindow( width, height ) {&lt;br /&gt;
	var content = document.createElement( &#039;div&#039; );&lt;br /&gt;
	this.content = content;&lt;br /&gt;
	content.className = &#039;morebits-dialog-content&#039;;&lt;br /&gt;
&lt;br /&gt;
	this.height = height;&lt;br /&gt;
&lt;br /&gt;
	$(this.content).dialog({&lt;br /&gt;
			autoOpen: false,&lt;br /&gt;
			buttons: { &amp;quot;Placeholder button&amp;quot;: function() {} },&lt;br /&gt;
			dialogClass: &#039;morebits-dialog&#039;,&lt;br /&gt;
			width: Math.min(parseInt(window.innerWidth, 10), parseInt(width ? width : 800, 10)),&lt;br /&gt;
			// give jQuery the given height value (which represents the anticipated height of the dialog) here, so&lt;br /&gt;
			// it can position the dialog appropriately&lt;br /&gt;
			// the 20 pixels represents adjustment for the extra height of the jQuery dialog &amp;quot;chrome&amp;quot;, compared&lt;br /&gt;
			// to that of the old SimpleWindow&lt;br /&gt;
			height: height + 20,&lt;br /&gt;
			close: function(event, ui) {&lt;br /&gt;
				// dialogs and their content can be destroyed once closed&lt;br /&gt;
				$(event.target).dialog(&amp;quot;destroy&amp;quot;).remove();&lt;br /&gt;
			},&lt;br /&gt;
			resize: function(event, ui) {&lt;br /&gt;
				this.style.maxHeight = &amp;quot;&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	var $widget = $(this.content).dialog(&amp;quot;widget&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// add background gradient to titlebar&lt;br /&gt;
	var $titlebar = $widget.find(&amp;quot;.ui-dialog-titlebar&amp;quot;);&lt;br /&gt;
	var oldstyle = $titlebar.attr(&amp;quot;style&amp;quot;);&lt;br /&gt;
	$titlebar.attr(&amp;quot;style&amp;quot;, (oldstyle ? oldstyle : &amp;quot;&amp;quot;) + &#039;; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB%2FqqA%2BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhQTFRFr73ZobTPusjdsMHZp7nVwtDhzNbnwM3fu8jdq7vUt8nbxtDkw9DhpbfSvMrfssPZqLvVztbno7bRrr7W1d%2Fs1N7qydXk0NjpkW7Q%2BgAAADVJREFUeNoMwgESQCAAAMGLkEIi%2FP%2BnbnbpdB59app5Vdg0sXAoMZCpGoFbK6ciuy6FX4ABAEyoAef0BXOXAAAAAElFTkSuQmCC) !important;&#039;);&lt;br /&gt;
&lt;br /&gt;
	// delete the placeholder button (it&#039;s only there so the buttonpane gets created)&lt;br /&gt;
	$widget.find(&amp;quot;button&amp;quot;).each(function(key, value) {&lt;br /&gt;
		value.parentNode.removeChild(value);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	// add container for the buttons we add, and the footer links (if any)&lt;br /&gt;
	var buttonspan = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
	buttonspan.className = &amp;quot;morebits-dialog-buttons&amp;quot;;&lt;br /&gt;
	var linksspan = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
	linksspan.className = &amp;quot;morebits-dialog-footerlinks&amp;quot;;&lt;br /&gt;
	$widget.find(&amp;quot;.ui-dialog-buttonpane&amp;quot;).append(buttonspan, linksspan);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Morebits.simpleWindow.prototype = {&lt;br /&gt;
	buttons: [],&lt;br /&gt;
	height: 600,&lt;br /&gt;
	hasFooterLinks: false,&lt;br /&gt;
	scriptName: null,&lt;br /&gt;
&lt;br /&gt;
	// Focuses the dialog. This might work, or on the contrary, it might not.&lt;br /&gt;
	focus: function(event) {&lt;br /&gt;
		$(this.content).dialog(&amp;quot;moveToTop&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Closes the dialog.  If this is set as an event handler, it will stop the event from doing anything more.&lt;br /&gt;
	close: function(event) {&lt;br /&gt;
		if (event) {&lt;br /&gt;
			event.preventDefault();&lt;br /&gt;
		}&lt;br /&gt;
		$(this.content).dialog(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Shows the dialog.  Calling display() on a dialog that has previously been closed might work, but it is not guaranteed.&lt;br /&gt;
	display: function() {&lt;br /&gt;
		if (this.scriptName) {&lt;br /&gt;
			var $widget = $(this.content).dialog(&amp;quot;widget&amp;quot;);&lt;br /&gt;
			$widget.find(&amp;quot;.morebits-dialog-scriptname&amp;quot;).remove();&lt;br /&gt;
			var scriptnamespan = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
			scriptnamespan.className = &amp;quot;morebits-dialog-scriptname&amp;quot;;&lt;br /&gt;
			scriptnamespan.textContent = this.scriptName + &amp;quot; \u00B7 &amp;quot;;  // U+00B7 MIDDLE DOT = &amp;amp;middot;&lt;br /&gt;
			$widget.find(&amp;quot;.ui-dialog-title&amp;quot;).prepend(scriptnamespan);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var dialog = $(this.content).dialog(&amp;quot;open&amp;quot;);&lt;br /&gt;
		if (window.setupTooltips &amp;amp;&amp;amp; window.pg &amp;amp;&amp;amp; window.pg.re &amp;amp;&amp;amp; window.pg.re.diff) {  // tie in with NAVPOP&lt;br /&gt;
			dialog.parent()[0].ranSetupTooltipsAlready = false;&lt;br /&gt;
			setupTooltips(dialog.parent()[0]);&lt;br /&gt;
		}&lt;br /&gt;
		this.setHeight( this.height );  // init height algorithm&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Sets the dialog title.&lt;br /&gt;
	setTitle: function( title ) {&lt;br /&gt;
		$(this.content).dialog(&amp;quot;option&amp;quot;, &amp;quot;title&amp;quot;, title);&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Sets the script name, appearing as a prefix to the title to help users determine which&lt;br /&gt;
	// user script is producing which dialog. For instance, Twinkle modules set this to &amp;quot;Twinkle&amp;quot;.&lt;br /&gt;
	setScriptName: function( name ) {&lt;br /&gt;
		this.scriptName = name;&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Sets the dialog width.&lt;br /&gt;
	setWidth: function( width ) {&lt;br /&gt;
		$(this.content).dialog(&amp;quot;option&amp;quot;, &amp;quot;width&amp;quot;, width);&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Sets the dialog&#039;s maximum height. The dialog will auto-size to fit its contents,&lt;br /&gt;
	// but the content area will grow no larger than the height given here.&lt;br /&gt;
	setHeight: function( height ) {&lt;br /&gt;
		this.height = height;&lt;br /&gt;
&lt;br /&gt;
		// from display time onwards, let the browser determine the optimum height, and instead limit the height at the given value&lt;br /&gt;
		// note that the given height will exclude the approx. 20px that the jQuery UI chrome has in height in addition to the height&lt;br /&gt;
		// of an equivalent &amp;quot;classic&amp;quot; Morebits.simpleWindow&lt;br /&gt;
		if (parseInt(getComputedStyle($(this.content).dialog(&amp;quot;widget&amp;quot;)[0], null).height, 10) &amp;gt; window.innerHeight) {&lt;br /&gt;
			$(this.content).dialog(&amp;quot;option&amp;quot;, &amp;quot;height&amp;quot;, window.innerHeight - 2).dialog(&amp;quot;option&amp;quot;, &amp;quot;position&amp;quot;, &amp;quot;top&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$(this.content).dialog(&amp;quot;option&amp;quot;, &amp;quot;height&amp;quot;, &amp;quot;auto&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		$(this.content).dialog(&amp;quot;widget&amp;quot;).find(&amp;quot;.morebits-dialog-content&amp;quot;)[0].style.maxHeight = parseInt(this.height - 30, 10) + &amp;quot;px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Sets the content of the dialog to the given element node, usually from rendering a Morebits.quickForm.&lt;br /&gt;
	// Re-enumerates the footer buttons, but leaves the footer links as they are.&lt;br /&gt;
	// Be sure to call this at least once before the dialog is displayed...&lt;br /&gt;
	setContent: function( content ) {&lt;br /&gt;
		this.purgeContent();&lt;br /&gt;
		this.addContent( content );&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	addContent: function( content ) {&lt;br /&gt;
		this.content.appendChild( content );&lt;br /&gt;
&lt;br /&gt;
		// look for submit buttons in the content, hide them, and add a proxy button to the button pane&lt;br /&gt;
		var thisproxy = this;&lt;br /&gt;
		$(this.content).find(&#039;input[type=&amp;quot;submit&amp;quot;], button[type=&amp;quot;submit&amp;quot;]&#039;).each(function(key, value) {&lt;br /&gt;
				value.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
				var button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
				button.textContent = (value.hasAttribute(&amp;quot;value&amp;quot;) ? value.getAttribute(&amp;quot;value&amp;quot;) : (value.textContent ? value.textContent : &amp;quot;Submit Query&amp;quot;));&lt;br /&gt;
				// here is an instance of cheap coding, probably a memory-usage hit in using a closure here&lt;br /&gt;
				button.addEventListener(&amp;quot;click&amp;quot;, function() { value.click(); }, false);&lt;br /&gt;
				thisproxy.buttons.push(button);&lt;br /&gt;
			});&lt;br /&gt;
		// remove all buttons from the button pane and re-add them&lt;br /&gt;
		if (this.buttons.length &amp;gt; 0) {&lt;br /&gt;
			$(this.content).dialog(&amp;quot;widget&amp;quot;).find(&amp;quot;.morebits-dialog-buttons&amp;quot;).empty().append(this.buttons)[0].removeAttribute(&amp;quot;data-empty&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$(this.content).dialog(&amp;quot;widget&amp;quot;).find(&amp;quot;.morebits-dialog-buttons&amp;quot;)[0].setAttribute(&amp;quot;data-empty&amp;quot;, &amp;quot;data-empty&amp;quot;);  // used by CSS&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	purgeContent: function( content ) {&lt;br /&gt;
		this.buttons = [];&lt;br /&gt;
		// delete all buttons in the buttonpane&lt;br /&gt;
		$(this.content).dialog(&amp;quot;widget&amp;quot;).find(&amp;quot;.morebits-dialog-buttons&amp;quot;).empty();&lt;br /&gt;
&lt;br /&gt;
		while( this.content.hasChildNodes() ) {&lt;br /&gt;
			this.content.removeChild( this.content.firstChild );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	// Adds a link in the bottom-right corner of the dialog.&lt;br /&gt;
	// This can be used to provide help or policy links.&lt;br /&gt;
	// For example, Twinkle&#039;s CSD module adds a link to the CSD policy page,&lt;br /&gt;
	// as well as a link to Twinkle&#039;s documentation.&lt;br /&gt;
	addFooterLink: function( text, wikiPage ) {&lt;br /&gt;
		var $footerlinks = $(this.content).dialog(&amp;quot;widget&amp;quot;).find(&amp;quot;.morebits-dialog-footerlinks&amp;quot;);&lt;br /&gt;
		if (this.hasFooterLinks) {&lt;br /&gt;
			var bullet = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
			bullet.textContent = &amp;quot; \u2022 &amp;quot;;  // U+2022 BULLET&lt;br /&gt;
			$footerlinks.append(bullet);&lt;br /&gt;
		}&lt;br /&gt;
		var link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
		link.setAttribute(&amp;quot;href&amp;quot;, mw.util.getUrl(wikiPage) );&lt;br /&gt;
		link.setAttribute(&amp;quot;title&amp;quot;, wikiPage);&lt;br /&gt;
		link.setAttribute(&amp;quot;target&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt;
		link.textContent = text;&lt;br /&gt;
		$footerlinks.append(link);&lt;br /&gt;
		this.hasFooterLinks = true;&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	},&lt;br /&gt;
	setModality: function( modal ) {&lt;br /&gt;
		$(this.content).dialog(&amp;quot;option&amp;quot;, &amp;quot;modal&amp;quot;, modal);&lt;br /&gt;
&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Enables or disables all footer buttons on all Morebits.simpleWindows in the current page.&lt;br /&gt;
// This should be called with |false| when the button(s) become irrelevant (e.g. just before Morebits.status.init is called).&lt;br /&gt;
// This is not an instance method so that consumers don&#039;t have to keep a reference to the original&lt;br /&gt;
// Morebits.simpleWindow object sitting around somewhere. Anyway, most of the time there will only be one&lt;br /&gt;
// Morebits.simpleWindow open, so this shouldn&#039;t matter.&lt;br /&gt;
Morebits.simpleWindow.setButtonsEnabled = function( enabled ) {&lt;br /&gt;
	$(&amp;quot;.morebits-dialog-buttons button&amp;quot;).attr(&amp;quot;disabled&amp;quot;, !enabled);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Twinkle blacklist was removed per consensus at http://en.wikipedia.org/wiki/Wikipedia:Administrators%27_noticeboard/Archive221#New_Twinkle_blacklist_proposal&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} ( window, document, jQuery )); // End wrap with anonymous function&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * If this script is being executed outside a ResourceLoader context, we add some&lt;br /&gt;
 * global assignments for legacy scripts, hopefully these can be removed down the line&lt;br /&gt;
 *&lt;br /&gt;
 * IMPORTANT NOTE:&lt;br /&gt;
 * PLEASE DO NOT USE THESE ALIASES IN NEW CODE!&lt;br /&gt;
 * Thanks.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if ( typeof arguments === &amp;quot;undefined&amp;quot; ) {  // typeof is here for a reason...&lt;br /&gt;
	window.SimpleWindow = Morebits.simpleWindow;&lt;br /&gt;
	window.QuickForm = Morebits.quickForm;&lt;br /&gt;
	window.Wikipedia = Morebits.wiki;&lt;br /&gt;
	window.Status = Morebits.status;&lt;br /&gt;
	window.QueryString = Morebits.queryString;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-Twinkle.js&amp;diff=23272</id>
		<title>MediaWiki:Gadget-Twinkle.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-Twinkle.js&amp;diff=23272"/>
		<updated>2013-12-15T12:25:06Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-662-g5d477ae: protect: Adjust weightings per comment at WT:TW; protect: Improve protection weighting logic; ffd: Make NFCR more palatable in article space; Remove unused pref speedyPromptOnG7; morebits: Add style attribute&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * +-------------------------------------------------------------------------+&lt;br /&gt;
 * |                  === WARNING: GLOBAL GADGET FILE ===                    |&lt;br /&gt;
 * |                Changes to this page affect many users.                  |&lt;br /&gt;
 * |           Please discuss changes at [[WT:TW]] before editing.           |&lt;br /&gt;
 * +-------------------------------------------------------------------------+&lt;br /&gt;
 *&lt;br /&gt;
 * Imported from github [https://github.com/azatoth/twinkle].&lt;br /&gt;
 * All changes should be made in the repository, otherwise they will be lost.&lt;br /&gt;
 *&lt;br /&gt;
 * To update this script from github, you must have a local repository set up. Then&lt;br /&gt;
 * follow the instructions at [https://github.com/azatoth/twinkle/blob/master/README.md].&lt;br /&gt;
 *&lt;br /&gt;
 * ----------&lt;br /&gt;
 *&lt;br /&gt;
 * This is AzaToth&#039;s Twinkle, the popular script sidekick for newbies, admins, and&lt;br /&gt;
 * every Wikipedian in between. Visit [[WP:TW]] for more information.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
( function ( window, document, $, undefined ) { // Wrap with anonymous function&lt;br /&gt;
&lt;br /&gt;
var Twinkle = {};&lt;br /&gt;
window.Twinkle = Twinkle;  // allow global access&lt;br /&gt;
&lt;br /&gt;
// Check if account is experienced enough to use Twinkle&lt;br /&gt;
Twinkle.userAuthorized = Morebits.userIsInGroup( &amp;quot;autoconfirmed&amp;quot; ) || Morebits.userIsInGroup( &amp;quot;confirmed&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
// for use by custom modules (normally empty)&lt;br /&gt;
Twinkle.initCallbacks = [];&lt;br /&gt;
Twinkle.addInitCallback = function twinkleAddInitCallback( func ) {&lt;br /&gt;
	Twinkle.initCallbacks.push( func );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.defaultConfig = {};&lt;br /&gt;
/**&lt;br /&gt;
 * Twinkle.defaultConfig.twinkle and Twinkle.defaultConfig.friendly&lt;br /&gt;
 *&lt;br /&gt;
 * This holds the default set of preferences used by Twinkle. (The |friendly| object holds preferences stored in the FriendlyConfig object.)&lt;br /&gt;
 * It is important that all new preferences added here, especially admin-only ones, are also added to&lt;br /&gt;
 * |Twinkle.config.sections| in twinkleconfig.js, so they are configurable via the Twinkle preferences panel.&lt;br /&gt;
 * For help on the actual preferences, see the comments in twinkleconfig.js.&lt;br /&gt;
 */&lt;br /&gt;
Twinkle.defaultConfig.twinkle = {&lt;br /&gt;
	 // General&lt;br /&gt;
	summaryAd: &amp;quot; ([[WP:TW|TW]])&amp;quot;,&lt;br /&gt;
	deletionSummaryAd: &amp;quot; ([[WP:TW|TW]])&amp;quot;,&lt;br /&gt;
	protectionSummaryAd: &amp;quot; ([[WP:TW|TW]])&amp;quot;,&lt;br /&gt;
	userTalkPageMode: &amp;quot;window&amp;quot;,&lt;br /&gt;
	dialogLargeFont: false,&lt;br /&gt;
	 // ARV&lt;br /&gt;
	spiWatchReport: &amp;quot;yes&amp;quot;,&lt;br /&gt;
	 // Fluff (revert and rollback)&lt;br /&gt;
	openTalkPage: [ &amp;quot;agf&amp;quot;, &amp;quot;norm&amp;quot;, &amp;quot;vand&amp;quot; ],&lt;br /&gt;
	openTalkPageOnAutoRevert: false,&lt;br /&gt;
	markRevertedPagesAsMinor: [ &amp;quot;vand&amp;quot; ],&lt;br /&gt;
	watchRevertedPages: [ &amp;quot;agf&amp;quot;, &amp;quot;norm&amp;quot;, &amp;quot;vand&amp;quot;, &amp;quot;torev&amp;quot; ],&lt;br /&gt;
	offerReasonOnNormalRevert: true,&lt;br /&gt;
	confirmOnFluff: false,&lt;br /&gt;
	showRollbackLinks: [ &amp;quot;diff&amp;quot;, &amp;quot;others&amp;quot; ],&lt;br /&gt;
	 // DI (twinkleimage)&lt;br /&gt;
	notifyUserOnDeli: true,&lt;br /&gt;
	deliWatchPage: &amp;quot;default&amp;quot;,&lt;br /&gt;
	deliWatchUser: &amp;quot;default&amp;quot;,&lt;br /&gt;
	 // PROD&lt;br /&gt;
	watchProdPages: true,&lt;br /&gt;
	prodReasonDefault: &amp;quot;&amp;quot;,&lt;br /&gt;
	logProdPages: false,&lt;br /&gt;
	prodLogPageName: &amp;quot;PROD log&amp;quot;,&lt;br /&gt;
	 // CSD&lt;br /&gt;
	speedySelectionStyle: &amp;quot;buttonClick&amp;quot;,&lt;br /&gt;
	watchSpeedyPages: [ &amp;quot;g3&amp;quot;, &amp;quot;g5&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot; ],&lt;br /&gt;
	markSpeedyPagesAsPatrolled: true,&lt;br /&gt;
	// these next two should probably be identical by default&lt;br /&gt;
	notifyUserOnSpeedyDeletionNomination:    [ &amp;quot;db&amp;quot;, &amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;g13&amp;quot;, &amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;, &amp;quot;f1&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;f10&amp;quot;, &amp;quot;u3&amp;quot;, &amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;, &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; ],&lt;br /&gt;
	welcomeUserOnSpeedyDeletionNotification: [ &amp;quot;db&amp;quot;, &amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;g13&amp;quot;, &amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;, &amp;quot;f1&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;f10&amp;quot;, &amp;quot;u3&amp;quot;, &amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;, &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; ],&lt;br /&gt;
	promptForSpeedyDeletionSummary: [ &amp;quot;db&amp;quot;, &amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g7&amp;quot;, &amp;quot;g8&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f4&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f8&amp;quot;, &amp;quot;f10&amp;quot;, &amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;, &amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot; ],&lt;br /&gt;
	openUserTalkPageOnSpeedyDelete: [ &amp;quot;db&amp;quot;, &amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g5&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;a1&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;u3&amp;quot;, &amp;quot;t2&amp;quot;, &amp;quot;p1&amp;quot; ],&lt;br /&gt;
	deleteTalkPageOnDelete: false,&lt;br /&gt;
	deleteRedirectsOnDelete: true,&lt;br /&gt;
	deleteSysopDefaultToTag: false,&lt;br /&gt;
	speedyWindowHeight: 500,&lt;br /&gt;
	speedyWindowWidth: 800,&lt;br /&gt;
	logSpeedyNominations: false,&lt;br /&gt;
	speedyLogPageName: &amp;quot;CSD log&amp;quot;,&lt;br /&gt;
	noLogOnSpeedyNomination: [ &amp;quot;u1&amp;quot; ],&lt;br /&gt;
	 // Unlink&lt;br /&gt;
	unlinkNamespaces: [ &amp;quot;0&amp;quot;, &amp;quot;100&amp;quot; ],&lt;br /&gt;
	 // Warn&lt;br /&gt;
	defaultWarningGroup: &amp;quot;1&amp;quot;,&lt;br /&gt;
	showSharedIPNotice: true,&lt;br /&gt;
	watchWarnings: true,&lt;br /&gt;
	blankTalkpageOnIndefBlock: false,&lt;br /&gt;
	customWarningList: [],&lt;br /&gt;
	 // XfD&lt;br /&gt;
	xfdWatchDiscussion: &amp;quot;default&amp;quot;,&lt;br /&gt;
	xfdWatchList: &amp;quot;no&amp;quot;,&lt;br /&gt;
	xfdWatchPage: &amp;quot;default&amp;quot;,&lt;br /&gt;
	xfdWatchUser: &amp;quot;default&amp;quot;,&lt;br /&gt;
	 // Hidden preferences&lt;br /&gt;
	revertMaxRevisions: 50,&lt;br /&gt;
	batchdeleteChunks: 50,&lt;br /&gt;
	batchDeleteMinCutOff: 5,&lt;br /&gt;
	batchMax: 5000,&lt;br /&gt;
	batchProtectChunks: 50,&lt;br /&gt;
	batchProtectMinCutOff: 5,&lt;br /&gt;
	batchundeleteChunks: 50,&lt;br /&gt;
	batchUndeleteMinCutOff: 5,&lt;br /&gt;
	deliChunks: 500,&lt;br /&gt;
	deliMax: 5000,&lt;br /&gt;
	proddeleteChunks: 50&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// now some skin dependent config.&lt;br /&gt;
if ( mw.config.get( &amp;quot;skin&amp;quot; ) === &amp;quot;vector&amp;quot; ) {&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletArea = &amp;quot;right-navigation&amp;quot;;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletId   = &amp;quot;p-twinkle&amp;quot;;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletName = &amp;quot;TW&amp;quot;;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletType = &amp;quot;menu&amp;quot;;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletNext = &amp;quot;p-search&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletArea =  null;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletId   = &amp;quot;p-cactions&amp;quot;;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletName = null;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletType = null;&lt;br /&gt;
	Twinkle.defaultConfig.twinkle.portletNext = null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Twinkle.defaultConfig.friendly = {&lt;br /&gt;
	 // Tag&lt;br /&gt;
	groupByDefault: true,&lt;br /&gt;
	watchTaggedPages: true,&lt;br /&gt;
	watchMergeDiscussions: true,&lt;br /&gt;
	markTaggedPagesAsMinor: false,&lt;br /&gt;
	markTaggedPagesAsPatrolled: true,&lt;br /&gt;
	tagArticleSortOrder: &amp;quot;cat&amp;quot;,&lt;br /&gt;
	customTagList: [],&lt;br /&gt;
	 // Welcome&lt;br /&gt;
	topWelcomes: false,&lt;br /&gt;
	watchWelcomes: true,&lt;br /&gt;
	welcomeHeading: &amp;quot;Welcome&amp;quot;,&lt;br /&gt;
	insertHeadings: true,&lt;br /&gt;
	insertUsername: true,&lt;br /&gt;
	insertSignature: true,  // sign welcome templates, where appropriate&lt;br /&gt;
	quickWelcomeMode: &amp;quot;norm&amp;quot;,&lt;br /&gt;
	quickWelcomeTemplate: &amp;quot;welcome&amp;quot;,&lt;br /&gt;
	customWelcomeList: [],&lt;br /&gt;
	customWelcomeSignature: true,&lt;br /&gt;
	 // Talkback&lt;br /&gt;
	markTalkbackAsMinor: true,&lt;br /&gt;
	insertTalkbackSignature: true,  // always sign talkback templates&lt;br /&gt;
	talkbackHeading: &amp;quot;Talkback&amp;quot;,&lt;br /&gt;
	adminNoticeHeading: &amp;quot;Notice&amp;quot;,&lt;br /&gt;
	mailHeading: &amp;quot;You&#039;ve got mail!&amp;quot;,&lt;br /&gt;
	 // Shared&lt;br /&gt;
	markSharedIPAsMinor: true&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.getPref = function twinkleGetPref( name ) {&lt;br /&gt;
	var result;&lt;br /&gt;
	if ( typeof Twinkle.prefs === &amp;quot;object&amp;quot; &amp;amp;&amp;amp; typeof Twinkle.prefs.twinkle === &amp;quot;object&amp;quot; ) {&lt;br /&gt;
		// look in Twinkle.prefs (twinkleoptions.js)&lt;br /&gt;
		result = Twinkle.prefs.twinkle[name];&lt;br /&gt;
	} else if ( typeof window.TwinkleConfig === &amp;quot;object&amp;quot; ) {&lt;br /&gt;
		// look in TwinkleConfig&lt;br /&gt;
		result = window.TwinkleConfig[name];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( result === undefined ) {&lt;br /&gt;
		return Twinkle.defaultConfig.twinkle[name];&lt;br /&gt;
	}&lt;br /&gt;
	return result;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.getFriendlyPref = function twinkleGetFriendlyPref(name) {&lt;br /&gt;
	var result;&lt;br /&gt;
	if ( typeof Twinkle.prefs === &amp;quot;object&amp;quot; &amp;amp;&amp;amp; typeof Twinkle.prefs.friendly === &amp;quot;object&amp;quot; ) {&lt;br /&gt;
		// look in Twinkle.prefs (twinkleoptions.js)&lt;br /&gt;
		result = Twinkle.prefs.friendly[ name ];&lt;br /&gt;
	} else if ( typeof window.FriendlyConfig === &amp;quot;object&amp;quot; ) {&lt;br /&gt;
		// look in FriendlyConfig&lt;br /&gt;
		result = window.FriendlyConfig[ name ];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( result === undefined ) {&lt;br /&gt;
		return Twinkle.defaultConfig.friendly[ name ];&lt;br /&gt;
	}&lt;br /&gt;
	return result;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Twinkle.addPortlet() ****************&lt;br /&gt;
 *&lt;br /&gt;
 * Adds a portlet menu to one of the navigation areas on the page.&lt;br /&gt;
 * This is necessarily quite a hack since skins, navigation areas, and&lt;br /&gt;
 * portlet menu types all work slightly different.&lt;br /&gt;
 *&lt;br /&gt;
 * Available navigation areas depend on the skin used.&lt;br /&gt;
 * Monobook:&lt;br /&gt;
 *  &amp;quot;column-one&amp;quot;, outer div class &amp;quot;portlet&amp;quot;, inner div class &amp;quot;pBody&amp;quot;. Existing portlets: &amp;quot;p-cactions&amp;quot;, &amp;quot;p-personal&amp;quot;, &amp;quot;p-logo&amp;quot;, &amp;quot;p-navigation&amp;quot;, &amp;quot;p-search&amp;quot;, &amp;quot;p-interaction&amp;quot;, &amp;quot;p-tb&amp;quot;, &amp;quot;p-coll-print_export&amp;quot;&lt;br /&gt;
 *  Special layout of p-cactions and p-personal through specialized styles.&lt;br /&gt;
 * Vector:&lt;br /&gt;
 *  &amp;quot;mw-panel&amp;quot;, outer div class &amp;quot;portal&amp;quot;, inner div class &amp;quot;body&amp;quot;. Existing portlets/elements: &amp;quot;p-logo&amp;quot;, &amp;quot;p-navigation&amp;quot;, &amp;quot;p-interaction&amp;quot;, &amp;quot;p-tb&amp;quot;, &amp;quot;p-coll-print_export&amp;quot;&lt;br /&gt;
 *  &amp;quot;left-navigation&amp;quot;, outer div class &amp;quot;vectorTabs&amp;quot; or &amp;quot;vectorMenu&amp;quot;, inner div class &amp;quot;&amp;quot; or &amp;quot;menu&amp;quot;. Existing portlets: &amp;quot;p-namespaces&amp;quot;, &amp;quot;p-variants&amp;quot; (menu)&lt;br /&gt;
 *  &amp;quot;right-navigation&amp;quot;, outer div class &amp;quot;vectorTabs&amp;quot; or &amp;quot;vectorMenu&amp;quot;, inner div class &amp;quot;&amp;quot; or &amp;quot;menu&amp;quot;. Existing portlets: &amp;quot;p-views&amp;quot;, &amp;quot;p-cactions&amp;quot; (menu), &amp;quot;p-search&amp;quot;&lt;br /&gt;
 *  Special layout of p-personal portlet (part of &amp;quot;head&amp;quot;) through specialized styles.&lt;br /&gt;
 * Modern:&lt;br /&gt;
 *  &amp;quot;mw_contentwrapper&amp;quot; (top nav), outer div class &amp;quot;portlet&amp;quot;, inner div class &amp;quot;pBody&amp;quot;. Existing portlets or elements: &amp;quot;p-cactions&amp;quot;, &amp;quot;mw_content&amp;quot;&lt;br /&gt;
 *  &amp;quot;mw_portlets&amp;quot; (sidebar), outer div class &amp;quot;portlet&amp;quot;, inner div class &amp;quot;pBody&amp;quot;. Existing portlets: &amp;quot;p-navigation&amp;quot;, &amp;quot;p-search&amp;quot;, &amp;quot;p-interaction&amp;quot;, &amp;quot;p-tb&amp;quot;, &amp;quot;p-coll-print_export&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @param String navigation -- id of the target navigation area (skin dependant, on vector either of &amp;quot;left-navigation&amp;quot;, &amp;quot;right-navigation&amp;quot;, or &amp;quot;mw-panel&amp;quot;)&lt;br /&gt;
 * @param String id -- id of the portlet menu to create, preferably start with &amp;quot;p-&amp;quot;.&lt;br /&gt;
 * @param String text -- name of the portlet menu to create. Visibility depends on the class used.&lt;br /&gt;
 * @param String type -- type of portlet. Currently only used for the vector non-sidebar portlets, pass &amp;quot;menu&amp;quot; to make this portlet a drop down menu.&lt;br /&gt;
 * @param Node nextnodeid -- the id of the node before which the new item should be added, should be another item in the same list, or undefined to place it at the end.&lt;br /&gt;
 *&lt;br /&gt;
 * @return Node -- the DOM node of the new item (a DIV element) or null&lt;br /&gt;
 */&lt;br /&gt;
Twinkle.addPortlet = function( navigation, id, text, type, nextnodeid )&lt;br /&gt;
{&lt;br /&gt;
	//sanity checks, and get required DOM nodes&lt;br /&gt;
	var root = document.getElementById( navigation );&lt;br /&gt;
	if ( !root ) {&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var item = document.getElementById( id );&lt;br /&gt;
	if ( item ) {&lt;br /&gt;
		if ( item.parentNode &amp;amp;&amp;amp; item.parentNode === root ) {&lt;br /&gt;
			return item;&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var nextnode;&lt;br /&gt;
	if ( nextnodeid ) {&lt;br /&gt;
		nextnode = document.getElementById(nextnodeid);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//verify/normalize input&lt;br /&gt;
	type = ( skin === &amp;quot;vector&amp;quot; &amp;amp;&amp;amp; type === &amp;quot;menu&amp;quot; &amp;amp;&amp;amp; ( navigation === &amp;quot;left-navigation&amp;quot; || navigation === &amp;quot;right-navigation&amp;quot; )) ? &amp;quot;menu&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
	var outerDivClass;&lt;br /&gt;
	var innerDivClass;&lt;br /&gt;
	switch ( skin )&lt;br /&gt;
	{&lt;br /&gt;
		case &amp;quot;vector&amp;quot;:&lt;br /&gt;
			if ( navigation !== &amp;quot;portal&amp;quot; &amp;amp;&amp;amp; navigation !== &amp;quot;left-navigation&amp;quot; &amp;amp;&amp;amp; navigation !== &amp;quot;right-navigation&amp;quot; ) {&lt;br /&gt;
				navigation = &amp;quot;mw-panel&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			outerDivClass = ( navigation === &amp;quot;mw-panel&amp;quot; ) ? &amp;quot;portal&amp;quot; : ( type === &amp;quot;menu&amp;quot; ? &amp;quot;vectorMenu extraMenu&amp;quot; : &amp;quot;vectorTabs extraMenu&amp;quot; );&lt;br /&gt;
			innerDivClass = ( navigation === &amp;quot;mw-panel&amp;quot; ) ? &amp;quot;body&amp;quot; : ( type === &amp;quot;menu&amp;quot; ? &amp;quot;menu&amp;quot; : &amp;quot;&amp;quot; );&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;quot;modern&amp;quot;:&lt;br /&gt;
			if ( navigation !== &amp;quot;mw_portlets&amp;quot; &amp;amp;&amp;amp; navigation !== &amp;quot;mw_contentwrapper&amp;quot; ) {&lt;br /&gt;
				navigation = &amp;quot;mw_portlets&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			outerDivClass = &amp;quot;portlet&amp;quot;;&lt;br /&gt;
			innerDivClass = &amp;quot;pBody&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			navigation = &amp;quot;column-one&amp;quot;;&lt;br /&gt;
			outerDivClass = &amp;quot;portlet&amp;quot;;&lt;br /&gt;
			innerDivClass = &amp;quot;pBody&amp;quot;;&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Build the DOM elements.&lt;br /&gt;
	var outerDiv = document.createElement( &amp;quot;div&amp;quot; );&lt;br /&gt;
	outerDiv.className = outerDivClass + &amp;quot; emptyPortlet&amp;quot;;&lt;br /&gt;
	outerDiv.id = id;&lt;br /&gt;
	if ( type === &amp;quot;menu&amp;quot; ) {&lt;br /&gt;
		// Fix drop-down arrow image in Vector skin&lt;br /&gt;
		outerDiv.style.backgroundImage = &#039;url(&amp;quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAQCAMAAAAlM38UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9QTFRFsbGxmpqa3d3deXl58/n79CzHcQAAAAV0Uk5T/////wD7tg5TAAAAMklEQVR42mJgwQoYBkqYiZEZAhiZUFRDxWGicEPA4nBRhNlAcYQokpVMDEwD6kuAAAMAyGMFQVv5ldcAAAAASUVORK5CYII=&amp;quot;)&#039;;&lt;br /&gt;
		outerDiv.style.backgroundPosition = &amp;quot;right 60%&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if ( nextnode &amp;amp;&amp;amp; nextnode.parentNode === root ) {&lt;br /&gt;
		root.insertBefore( outerDiv, nextnode );&lt;br /&gt;
	} else {&lt;br /&gt;
		root.appendChild( outerDiv );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var h5 = document.createElement( &amp;quot;h3&amp;quot; );&lt;br /&gt;
	if ( type === &amp;quot;menu&amp;quot; ) {&lt;br /&gt;
		var span = document.createElement( &amp;quot;span&amp;quot; );&lt;br /&gt;
		span.appendChild( document.createTextNode( text ) );&lt;br /&gt;
		h5.appendChild( span );&lt;br /&gt;
&lt;br /&gt;
		var a = document.createElement( &amp;quot;a&amp;quot; );&lt;br /&gt;
		a.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		$( a ).click(function ( e ) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
			if ( !Twinkle.userAuthorized ) {&lt;br /&gt;
				alert(&amp;quot;Sorry, your account is too new to use Twinkle.&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		span = document.createElement( &amp;quot;span&amp;quot; );&lt;br /&gt;
		span.appendChild( document.createTextNode( text ) );&lt;br /&gt;
		a.appendChild( span );&lt;br /&gt;
		h5.appendChild( a );&lt;br /&gt;
	} else {&lt;br /&gt;
		h5.appendChild( document.createTextNode( text ) );&lt;br /&gt;
	}&lt;br /&gt;
	outerDiv.appendChild( h5 );&lt;br /&gt;
&lt;br /&gt;
	var innerDiv = document.createElement( &amp;quot;div&amp;quot; ); // Not strictly necessary with type vectorTabs, or other skins.&lt;br /&gt;
	innerDiv.className = innerDivClass;&lt;br /&gt;
	outerDiv.appendChild(innerDiv);&lt;br /&gt;
&lt;br /&gt;
	var ul = document.createElement( &amp;quot;ul&amp;quot; );&lt;br /&gt;
	innerDiv.appendChild( ul );&lt;br /&gt;
&lt;br /&gt;
	return outerDiv;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** Twinkle.addPortletLink() ****************&lt;br /&gt;
 * Builds a portlet menu if it doesn&#039;t exist yet, and add the portlet link.&lt;br /&gt;
 * @param task: Either a URL for the portlet link or a function to execute.&lt;br /&gt;
 */&lt;br /&gt;
Twinkle.addPortletLink = function( task, text, id, tooltip )&lt;br /&gt;
{&lt;br /&gt;
	if ( Twinkle.getPref(&amp;quot;portletArea&amp;quot;) !== null ) {&lt;br /&gt;
		Twinkle.addPortlet( Twinkle.getPref( &amp;quot;portletArea&amp;quot; ), Twinkle.getPref( &amp;quot;portletId&amp;quot; ), Twinkle.getPref( &amp;quot;portletName&amp;quot; ), Twinkle.getPref( &amp;quot;portletType&amp;quot; ), Twinkle.getPref( &amp;quot;portletNext&amp;quot; ));&lt;br /&gt;
	}&lt;br /&gt;
	var link = mw.util.addPortletLink( Twinkle.getPref( &amp;quot;portletId&amp;quot; ), typeof task === &amp;quot;string&amp;quot; ? task : &amp;quot;#&amp;quot;, text, id, tooltip );&lt;br /&gt;
	if ( $.isFunction( task ) ) {&lt;br /&gt;
		$( link ).click(function ( ev ) {&lt;br /&gt;
			task();&lt;br /&gt;
			ev.preventDefault();&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
	return link;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * **************** General initialization code ****************&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var scriptpathbefore = mw.util.wikiScript( &amp;quot;index&amp;quot; ) + &amp;quot;?title=&amp;quot;,&lt;br /&gt;
    scriptpathafter = &amp;quot;&amp;amp;action=raw&amp;amp;ctype=text/javascript&amp;amp;happy=yes&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Retrieve the user&#039;s Twinkle preferences&lt;br /&gt;
$.ajax({&lt;br /&gt;
	url: scriptpathbefore + &amp;quot;User:&amp;quot; + encodeURIComponent( mw.config.get(&amp;quot;wgUserName&amp;quot;)) + &amp;quot;/twinkleoptions.js&amp;quot; + scriptpathafter,&lt;br /&gt;
	dataType: &amp;quot;text&amp;quot;&lt;br /&gt;
})&lt;br /&gt;
	.fail(function () {	mw.util.jsMessage( &amp;quot;Could not load twinkleoptions.js&amp;quot; ); })&lt;br /&gt;
	.done(function ( optionsText ) {&lt;br /&gt;
&lt;br /&gt;
		// Quick pass if user has no options&lt;br /&gt;
		if ( optionsText === &amp;quot;&amp;quot; ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Twinkle options are basically a JSON object with some comments. Strip those:&lt;br /&gt;
		optionsText = optionsText.replace( /(?:^(?:\/\/[^\n]*\n)*\n*|(?:\/\/[^\n]*(?:\n|$))*$)/g, &amp;quot;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
		// First version of options had some boilerplate code to make it eval-able -- strip that too. This part may become obsolete down the line.&lt;br /&gt;
		if ( optionsText.lastIndexOf( &amp;quot;window.Twinkle.prefs = &amp;quot;, 0 ) === 0 ) {&lt;br /&gt;
			optionsText = optionsText.replace( /(?:^window.Twinkle.prefs = |;\n*$)/g, &amp;quot;&amp;quot; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			var options = $.parseJSON( optionsText );&lt;br /&gt;
&lt;br /&gt;
			// Assuming that our options evolve, we will want to transform older versions:&lt;br /&gt;
			//if ( options.optionsVersion === undefined ) {&lt;br /&gt;
			// ...&lt;br /&gt;
			// options.optionsVersion = 1;&lt;br /&gt;
			//}&lt;br /&gt;
			//if ( options.optionsVersion === 1 ) {&lt;br /&gt;
			// ...&lt;br /&gt;
			// options.optionsVersion = 2;&lt;br /&gt;
			//}&lt;br /&gt;
			// At the same time, twinkleconfig.js needs to be adapted to write a higher version number into the options.&lt;br /&gt;
&lt;br /&gt;
			if ( options ) {&lt;br /&gt;
				Twinkle.prefs = options;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		catch ( e ) {&lt;br /&gt;
			mw.util.jsMessage(&amp;quot;Could not parse twinkleoptions.js&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	})&lt;br /&gt;
	.always(function () {&lt;br /&gt;
		$( Twinkle.load );&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
// Developers: you can import custom Twinkle modules here&lt;br /&gt;
// For example, mw.loader.load(scriptpathbefore + &amp;quot;User:UncleDouggie/morebits-test.js&amp;quot; + scriptpathafter);&lt;br /&gt;
&lt;br /&gt;
Twinkle.load = function () {&lt;br /&gt;
	    // Don&#039;t activate on special pages other than &amp;quot;Contributions&amp;quot; so that they load faster, especially the watchlist.&lt;br /&gt;
	var isSpecialPage = ( mw.config.get(&#039;wgNamespaceNumber&#039;) === -1&lt;br /&gt;
	    	&amp;amp;&amp;amp; mw.config.get(&#039;wgCanonicalSpecialPageName&#039;) !== &amp;quot;Contributions&amp;quot;&lt;br /&gt;
	    	&amp;amp;&amp;amp; mw.config.get(&#039;wgCanonicalSpecialPageName&#039;) !== &amp;quot;Prefixindex&amp;quot; ),&lt;br /&gt;
&lt;br /&gt;
	    // Also, Twinkle is incompatible with Internet Explorer versions 8 or lower, so don&#039;t load there either.&lt;br /&gt;
	    isOldIE = ( $.client.profile().name === &#039;msie&#039; &amp;amp;&amp;amp; $.client.profile().versionNumber &amp;lt; 9 );&lt;br /&gt;
&lt;br /&gt;
    // Prevent users that are not autoconfirmed from loading Twinkle as well.&lt;br /&gt;
	if ( isSpecialPage || isOldIE || !Twinkle.userAuthorized ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Load the modules in the order that the tabs should appears&lt;br /&gt;
	// User/user talk-related&lt;br /&gt;
	Twinkle.arv();&lt;br /&gt;
	Twinkle.warn();&lt;br /&gt;
	Twinkle.welcome();&lt;br /&gt;
	Twinkle.shared();&lt;br /&gt;
	Twinkle.talkback();&lt;br /&gt;
	// Deletion&lt;br /&gt;
	Twinkle.speedy();&lt;br /&gt;
	Twinkle.prod();&lt;br /&gt;
	Twinkle.xfd();&lt;br /&gt;
	Twinkle.image();&lt;br /&gt;
	// Maintenance&lt;br /&gt;
	Twinkle.protect();&lt;br /&gt;
	Twinkle.tag();&lt;br /&gt;
	// Misc. ones last&lt;br /&gt;
	Twinkle.diff();&lt;br /&gt;
	Twinkle.unlink();&lt;br /&gt;
	Twinkle.config.init();&lt;br /&gt;
	Twinkle.fluff.init();&lt;br /&gt;
	if ( Morebits.userIsInGroup(&#039;sysop&#039;) ) {&lt;br /&gt;
		Twinkle.delimages();&lt;br /&gt;
		Twinkle.deprod();&lt;br /&gt;
		Twinkle.batchdelete();&lt;br /&gt;
		Twinkle.batchprotect();&lt;br /&gt;
		Twinkle.batchundelete();&lt;br /&gt;
	}&lt;br /&gt;
	// Run the initialization callbacks for any custom modules&lt;br /&gt;
	$( Twinkle.initCallbacks ).each(function ( k, v ) { v(); });&lt;br /&gt;
	Twinkle.addInitCallback = function ( func ) { func(); };&lt;br /&gt;
&lt;br /&gt;
	// Increases text size in Twinkle dialogs, if so configured&lt;br /&gt;
	if ( Twinkle.getPref( &amp;quot;dialogLargeFont&amp;quot; ) ) {&lt;br /&gt;
		mw.util.addCSS( &amp;quot;.morebits-dialog-content, .morebits-dialog-footerlinks { font-size: 100% !important; } &amp;quot; +&lt;br /&gt;
			&amp;quot;.morebits-dialog input, .morebits-dialog select, .morebits-dialog-content button { font-size: inherit !important; }&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
} ( window, document, jQuery )); // End wrap with anonymous function&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:TemplateDataHeader&amp;diff=23855</id>
		<title>Template:TemplateDataHeader</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:TemplateDataHeader&amp;diff=23855"/>
		<updated>2013-12-15T12:05:02Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: class&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;templatedata-header&amp;quot;&amp;gt;{{#if:{{{noheader|}}}| |This is the [[Wikipedia:VisualEditor/TemplateData|TemplateData]] documentation for the template used by the new [[Wikipedia:VisualEditor|VisualEditor]].}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;{{{1|{{BASEPAGENAME}}}}}&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;includeonly&amp;gt;[[Category:TemplateData documentation]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1&amp;diff=23893</id>
		<title>Module:Citation/CS1</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1&amp;diff=23893"/>
		<updated>2013-12-14T19:51:46Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Fix for broken |ref=harv;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local z = {&lt;br /&gt;
    error_categories = {};&lt;br /&gt;
    error_ids = {};&lt;br /&gt;
    message_tail = {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Include translation message hooks, ID and error handling configuration settings.&lt;br /&gt;
local cfg = mw.loadData( &#039;Module:Citation/CS1/Configuration&#039; );&lt;br /&gt;
&lt;br /&gt;
-- Contains a list of all recognized parameters&lt;br /&gt;
local whitelist = mw.loadData( &#039;Module:Citation/CS1/Whitelist&#039; );&lt;br /&gt;
&lt;br /&gt;
-- Whether variable is set or not&lt;br /&gt;
function is_set( var )&lt;br /&gt;
    return not (var == nil or var == &#039;&#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- First set variable or nil if none&lt;br /&gt;
function first_set(...)&lt;br /&gt;
    local list = {...};&lt;br /&gt;
    for _, var in pairs(list) do&lt;br /&gt;
        if is_set( var ) then&lt;br /&gt;
            return var;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Whether needle is in haystack&lt;br /&gt;
function inArray( needle, haystack )&lt;br /&gt;
    if needle == nil then&lt;br /&gt;
        return false;&lt;br /&gt;
    end&lt;br /&gt;
    for n,v in ipairs( haystack ) do&lt;br /&gt;
        if v == needle then&lt;br /&gt;
            return n;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Categorize and emit an error message when the citation contains one or more deprecated parameters.  Because deprecated parameters (currently |day=, |month=,&lt;br /&gt;
|coauthor=, and |coauthors=) aren&#039;t related to each other and because these parameters may be concatenated into the variables used by |date= and |author#= (and aliases)&lt;br /&gt;
details of which parameter caused the error message are not provided.  Only one error message is emitted regarless of the number of deprecated parameters in the citation.&lt;br /&gt;
]]&lt;br /&gt;
function deprecated_parameter()&lt;br /&gt;
	if true ~= Page_in_deprecated_cat then	-- if we haven&#039;t been here before then set a &lt;br /&gt;
		Page_in_deprecated_cat=true;		-- sticky flag so that if there are more than one deprecated parameter the category is added only once&lt;br /&gt;
		table.insert( z.message_tail, { seterror( &#039;deprecated_params&#039;, {error_message}, true ) } );		-- add error message&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Populates numbered arguments in a message string using an argument table.&lt;br /&gt;
function substitute( msg, args )&lt;br /&gt;
    return args and tostring( mw.message.newRawMessage( msg, args ) ) or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wraps a string using a message_list configuration taking one argument&lt;br /&gt;
function wrap( key, str, lower )&lt;br /&gt;
    if not is_set( str ) then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    elseif inArray( key, { &#039;italic-title&#039;, &#039;trans-italic-title&#039; } ) then&lt;br /&gt;
        str = safeforitalics( str );&lt;br /&gt;
    end&lt;br /&gt;
    if lower == true then&lt;br /&gt;
        return substitute( cfg.messages[key]:lower(), {str} );&lt;br /&gt;
    else&lt;br /&gt;
        return substitute( cfg.messages[key], {str} );&lt;br /&gt;
    end        &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Argument wrapper.  This function provides support for argument &lt;br /&gt;
mapping defined in the configuration file so that multiple names&lt;br /&gt;
can be transparently aliased to single internal variable.&lt;br /&gt;
]]&lt;br /&gt;
function argument_wrapper( args )&lt;br /&gt;
    local origin = {};&lt;br /&gt;
    &lt;br /&gt;
    return setmetatable({&lt;br /&gt;
        ORIGIN = function( self, k )&lt;br /&gt;
            local dummy = self[k]; --force the variable to be loaded.&lt;br /&gt;
            return origin[k];&lt;br /&gt;
        end&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        __index = function ( tbl, k )&lt;br /&gt;
            if origin[k] ~= nil then&lt;br /&gt;
                return nil;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            local args, list, v = args, cfg.aliases[k];&lt;br /&gt;
            &lt;br /&gt;
            if type( list ) == &#039;table&#039; then&lt;br /&gt;
                v, origin[k] = selectone( args, list, &#039;redundant_parameters&#039; );&lt;br /&gt;
                if origin[k] == nil then&lt;br /&gt;
                    origin[k] = &#039;&#039;; -- Empty string, not nil&lt;br /&gt;
                end&lt;br /&gt;
            elseif list ~= nil then&lt;br /&gt;
                v, origin[k] = args[list], list;&lt;br /&gt;
            else&lt;br /&gt;
                -- maybe let through instead of raising an error?&lt;br /&gt;
                -- v, origin[k] = args[k], k;&lt;br /&gt;
                error( cfg.messages[&#039;unknown_argument_map&#039;] );&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            -- Empty strings, not nil;&lt;br /&gt;
            if v == nil then&lt;br /&gt;
                v = cfg.defaults[k] or &#039;&#039;;&lt;br /&gt;
                origin[k] = &#039;&#039;;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            tbl = rawset( tbl, k, v );&lt;br /&gt;
            return v;&lt;br /&gt;
        end,&lt;br /&gt;
    });&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Looks for a parameter&#039;s name in the whitelist.&lt;br /&gt;
&lt;br /&gt;
Parameters in the whitelist can have three valuse:&lt;br /&gt;
	true - active, supported parameters&lt;br /&gt;
	false - deprecated, supported parameters&lt;br /&gt;
	nil - unsupported parameters&lt;br /&gt;
]]&lt;br /&gt;
function validate( name )&lt;br /&gt;
	local name = tostring( name );&lt;br /&gt;
	local state = whitelist.basic_arguments[ name ];&lt;br /&gt;
	&lt;br /&gt;
	-- Normal arguments&lt;br /&gt;
	if true == state then return true; end		-- valid actively supported parameter&lt;br /&gt;
	if false == state then&lt;br /&gt;
		deprecated_parameter ();				-- parameter is deprecated but still supported&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Arguments with numbers in them&lt;br /&gt;
	name = name:gsub( &amp;quot;%d+&amp;quot;, &amp;quot;#&amp;quot; );				-- replace digit(s) with # (last25 becomes last#&lt;br /&gt;
	state = whitelist.numbered_arguments[ name ];&lt;br /&gt;
	if true == state then return true; end		-- valid actively supported parameter&lt;br /&gt;
	if false == state then&lt;br /&gt;
		deprecated_parameter ();				-- parameter is deprecated but still supported&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return false;								-- Not supported because not found or name is set to nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a comment for error trapping&lt;br /&gt;
function errorcomment( content, hidden )&lt;br /&gt;
    return wrap( hidden and &#039;hidden-error&#039; or &#039;visible-error&#039;, content );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Sets an error condition and returns the appropriate error message.  The actual placement&lt;br /&gt;
of the error message in the output is the responsibility of the calling function.&lt;br /&gt;
]]&lt;br /&gt;
function seterror( error_id, arguments, raw, prefix, suffix )&lt;br /&gt;
    local error_state = cfg.error_conditions[ error_id ];&lt;br /&gt;
    &lt;br /&gt;
    prefix = prefix or &amp;quot;&amp;quot;;&lt;br /&gt;
    suffix = suffix or &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    if error_state == nil then&lt;br /&gt;
        error( cfg.messages[&#039;undefined_error&#039;] );&lt;br /&gt;
    elseif is_set( error_state.category ) then&lt;br /&gt;
        table.insert( z.error_categories, error_state.category );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local message = substitute( error_state.message, arguments );&lt;br /&gt;
    &lt;br /&gt;
    message = message .. &amp;quot; ([[&amp;quot; .. cfg.messages[&#039;help page link&#039;] .. &lt;br /&gt;
        &amp;quot;#&amp;quot; .. error_state.anchor .. &amp;quot;|&amp;quot; ..&lt;br /&gt;
        cfg.messages[&#039;help page label&#039;] .. &amp;quot;]])&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    z.error_ids[ error_id ] = true;&lt;br /&gt;
    if inArray( error_id, { &#039;bare_url_missing_title&#039;, &#039;trans_missing_title&#039; } )&lt;br /&gt;
            and z.error_ids[&#039;citation_missing_title&#039;] then&lt;br /&gt;
        return &#039;&#039;, false;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    message = table.concat({ prefix, message, suffix });&lt;br /&gt;
    &lt;br /&gt;
    if raw == true then&lt;br /&gt;
        return message, error_state.hidden;&lt;br /&gt;
    end        &lt;br /&gt;
        &lt;br /&gt;
    return errorcomment( message, error_state.hidden );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a wiki style external link&lt;br /&gt;
function externallinkid(options)&lt;br /&gt;
    local url_string = options.id;&lt;br /&gt;
    if options.encode == true or options.encode == nil then&lt;br /&gt;
        url_string = mw.uri.encode( url_string );&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.format( &#039;[[%s|%s]]%s[%s%s%s %s]&#039;,&lt;br /&gt;
        options.link, options.label, options.separator or &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
        options.prefix, url_string, options.suffix or &amp;quot;&amp;quot;,&lt;br /&gt;
        mw.text.nowiki(options.id)&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a wiki style internal link&lt;br /&gt;
function internallinkid(options)&lt;br /&gt;
    return mw.ustring.format( &#039;[[%s|%s]]%s[[%s%s%s|%s]]&#039;,&lt;br /&gt;
        options.link, options.label, options.separator or &amp;quot;&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
        options.prefix, options.id, options.suffix or &amp;quot;&amp;quot;,&lt;br /&gt;
        mw.text.nowiki(options.id)&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format an external link with error checking&lt;br /&gt;
function externallink( URL, label, source )&lt;br /&gt;
    local error_str = &amp;quot;&amp;quot;;&lt;br /&gt;
    if not is_set( label ) then&lt;br /&gt;
        label = URL;&lt;br /&gt;
        if is_set( source ) then&lt;br /&gt;
            error_str = seterror( &#039;bare_url_missing_title&#039;, { wrap( &#039;parameter&#039;, source ) }, false, &amp;quot; &amp;quot; );&lt;br /&gt;
        else&lt;br /&gt;
            error( cfg.messages[&amp;quot;bare_url_no_origin&amp;quot;] );&lt;br /&gt;
        end            &lt;br /&gt;
    end&lt;br /&gt;
    if not checkurl( URL ) then&lt;br /&gt;
        error_str = seterror( &#039;bad_url&#039;, {}, false, &amp;quot; &amp;quot; ) .. error_str;&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat({ &amp;quot;[&amp;quot;, URL, &amp;quot; &amp;quot;, safeforurl( label ), &amp;quot;]&amp;quot;, error_str });&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a link to Amazon&lt;br /&gt;
function amazon(id, domain)&lt;br /&gt;
    if not is_set(domain) then &lt;br /&gt;
        domain = &amp;quot;com&amp;quot;&lt;br /&gt;
    elseif ( &amp;quot;jp&amp;quot; == domain or &amp;quot;uk&amp;quot; == domain ) then&lt;br /&gt;
        domain = &amp;quot;co.&amp;quot; .. domain&lt;br /&gt;
    end&lt;br /&gt;
    local handler = cfg.id_handlers[&#039;ASIN&#039;];&lt;br /&gt;
    return externallinkid({link = handler.link,&lt;br /&gt;
        label=handler.label , prefix=&amp;quot;//www.amazon.&amp;quot;..domain..&amp;quot;/dp/&amp;quot;,id=id,&lt;br /&gt;
        encode=handler.encode, separator = handler.separator})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Determines if a PMC identifier&#039;s online version is embargoed. Compares the date in |embargo= against today&#039;s date.  If embargo date is&lt;br /&gt;
in the future, returns true; otherwse, returns false because the embargo has expired or |embargo= not set in this cite.&lt;br /&gt;
]]&lt;br /&gt;
function is_embargoed(embargo)&lt;br /&gt;
	if is_set(embargo) then&lt;br /&gt;
		local lang = mw.getContentLanguage();&lt;br /&gt;
		local good1, embargo_date, good2, todays_date;&lt;br /&gt;
		good1, embargo_date = pcall( lang.formatDate, lang, &#039;U&#039;, embargo );&lt;br /&gt;
		good2, todays_date = pcall( lang.formatDate, lang, &#039;U&#039; );&lt;br /&gt;
	&lt;br /&gt;
		if good1 and good2 and tonumber( embargo_date ) &amp;gt;= tonumber( todays_date ) then	--is embargo date is in the future?&lt;br /&gt;
			return true;	-- still embargoed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false;			-- embargo expired or |embargo= not set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Formats a PMC and checks for embargoed articles.  The embargo parameter takes a date for a value. If the embargo date is in the future&lt;br /&gt;
the PMC identifier will not be linked to the article.  If the embargo specifies a date in the past, or if it is empty or omitted, then&lt;br /&gt;
the PMC identifier is linked to the article through the link at cfg.id_handlers[&#039;PMC&#039;].prefix.&lt;br /&gt;
]]&lt;br /&gt;
function pmc(id, embargo)&lt;br /&gt;
	local handler = cfg.id_handlers[&#039;PMC&#039;];&lt;br /&gt;
    &lt;br /&gt;
	local text;&lt;br /&gt;
&lt;br /&gt;
	if is_embargoed(embargo) then&lt;br /&gt;
		text=&amp;quot;[[&amp;quot; .. handler.link .. &amp;quot;|&amp;quot; .. handler.label .. &amp;quot;]]:&amp;quot; .. handler.separator .. id;	--still embargoed so no external link&lt;br /&gt;
	else&lt;br /&gt;
		text = externallinkid({link = handler.link, label = handler.label,			--no embargo date, ok to link to article&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})&lt;br /&gt;
	end&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a DOI and checks for DOI errors.&lt;br /&gt;
function doi(id, inactive)&lt;br /&gt;
    local cat = &amp;quot;&amp;quot;&lt;br /&gt;
    local handler = cfg.id_handlers[&#039;DOI&#039;];&lt;br /&gt;
    &lt;br /&gt;
    local text;&lt;br /&gt;
	if is_set(inactive) then&lt;br /&gt;
		local inactive_year = inactive:match(&amp;quot;%d%d%d%d&amp;quot;) or &#039;&#039;;		-- try to get the year portion from the inactive date&lt;br /&gt;
		text = &amp;quot;[[&amp;quot; .. handler.link .. &amp;quot;|&amp;quot; .. handler.label .. &amp;quot;]]:&amp;quot; .. id;&lt;br /&gt;
		if is_set(inactive_year) then&lt;br /&gt;
			table.insert( z.error_categories, &amp;quot;Pages with DOIs inactive since &amp;quot; .. inactive_year );&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( z.error_categories, &amp;quot;Pages with inactive DOIs&amp;quot; );	-- when inactive doesn&#039;t contain a recognizable year&lt;br /&gt;
		end&lt;br /&gt;
		inactive = &amp;quot; (&amp;quot; .. cfg.messages[&#039;inactive&#039;] .. &amp;quot; &amp;quot; .. inactive .. &amp;quot;)&amp;quot; &lt;br /&gt;
	else &lt;br /&gt;
		text = externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})&lt;br /&gt;
		inactive = &amp;quot;&amp;quot; &lt;br /&gt;
	end&lt;br /&gt;
	if ( string.sub(id,1,3) ~= &amp;quot;10.&amp;quot; ) then      &lt;br /&gt;
		cat = seterror( &#039;bad_doi&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	return text .. inactive .. cat &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats an OpenLibrary link, and checks for associated errors.&lt;br /&gt;
function openlibrary(id)&lt;br /&gt;
    local code = id:sub(-1,-1)&lt;br /&gt;
    local handler = cfg.id_handlers[&#039;OL&#039;];&lt;br /&gt;
    if ( code == &amp;quot;A&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix=&amp;quot;http://openlibrary.org/authors/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    elseif ( code == &amp;quot;M&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix=&amp;quot;http://openlibrary.org/books/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    elseif ( code == &amp;quot;W&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix= &amp;quot;http://openlibrary.org/works/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    else&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix= &amp;quot;http://openlibrary.org/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode}) .. &lt;br /&gt;
            &#039; &#039; .. seterror( &#039;bad_ol&#039; );&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Validate and format an issn.  This code fixes the case where an editor has included an ISSN in the citation but has separated the two groups of four&lt;br /&gt;
digits with a space.  When that condition occurred, the resulting link looked like this:&lt;br /&gt;
&lt;br /&gt;
	|issn=0819 4327 gives: [http://www.worldcat.org/issn/0819 4327 0819 4327]  -- can&#039;t have spaces in an external link&lt;br /&gt;
	&lt;br /&gt;
This code now prevents that by inserting a hyphen at the issn midpoint.  It also validates the issn for length and makes sure that the checkdigit agrees&lt;br /&gt;
with the calculated value.  Incorrect length (8 digits), characters other than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check issn&lt;br /&gt;
error message.  The issn is always displayed with a hyphen, even if the issn was given as a single group of 8 digits.&lt;br /&gt;
]]&lt;br /&gt;
function issn(id)&lt;br /&gt;
	local issn_copy = id;		-- save a copy of unadulterated issn; use this version for display if issn does not validate&lt;br /&gt;
	local handler = cfg.id_handlers[&#039;ISSN&#039;];&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_issn = true;&lt;br /&gt;
&lt;br /&gt;
	id=id:gsub( &amp;quot;[%s-–]&amp;quot;, &amp;quot;&amp;quot; );									-- strip spaces, hyphens, and ndashes from the issn&lt;br /&gt;
&lt;br /&gt;
	if 8 ~= id:len() or nil == id:match( &amp;quot;^%d*X?$&amp;quot; ) then		-- validate the issn: 8 didgits long, containing only 0-9 or X in the last position&lt;br /&gt;
		valid_issn=false;										-- wrong length or improper character&lt;br /&gt;
	else&lt;br /&gt;
		valid_issn=is_valid_isxn(id, 8);						-- validate issn&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if true == valid_issn then&lt;br /&gt;
		id = string.sub( id, 1, 4 ) .. &amp;quot;-&amp;quot; .. string.sub( id, 5 );	-- if valid, display correctly formatted version&lt;br /&gt;
	else&lt;br /&gt;
		id = issn_copy;											-- if not valid, use the show the invalid issn with error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
		prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})&lt;br /&gt;
 &lt;br /&gt;
	if false == valid_issn then&lt;br /&gt;
		text = text .. &#039; &#039; .. seterror( &#039;bad_issn&#039; )			-- add an error message if the issn is invalid&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function sets default title types (equivalent to the citation including |type=&amp;lt;default value&amp;gt;) for those citations that have defaults.&lt;br /&gt;
Also handles the special case where it is desireable to omit the title type from the rendered citation (|type=none).&lt;br /&gt;
]]&lt;br /&gt;
function set_titletype(cite_class, title_type)&lt;br /&gt;
	if is_set(title_type) then&lt;br /&gt;
		if &amp;quot;none&amp;quot; == title_type then&lt;br /&gt;
			title_type = &amp;quot;&amp;quot;;					-- if |type=none then type parameter not displayed&lt;br /&gt;
		end&lt;br /&gt;
		return title_type;						-- if |type= has been set to any other value use that value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &amp;quot;pressrelease&amp;quot; == cite_class then		-- if this citation is cite press release&lt;br /&gt;
		return &amp;quot;Press release&amp;quot;;					-- display press release annotation&lt;br /&gt;
&lt;br /&gt;
	elseif &amp;quot;speech&amp;quot; == cite_class then			-- if this citation is cite speech&lt;br /&gt;
		return &amp;quot;Speech&amp;quot;;						-- display speech annotation&lt;br /&gt;
	&lt;br /&gt;
	elseif &amp;quot;techreport&amp;quot; == cite_class then		-- if this citation is cite techreport&lt;br /&gt;
		return &amp;quot;Technical report&amp;quot;;				-- display techreport annotation&lt;br /&gt;
	&lt;br /&gt;
	elseif &amp;quot;thesis&amp;quot; == cite_class then			-- if this citation is cite thesis (degree option handled after this function returns)&lt;br /&gt;
			return &amp;quot;Thesis&amp;quot;;					-- display simple thesis annotation (without |degree= modification)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns a number according to the month in a date: 1 for January, etc.  If not a valid month, returns 0&lt;br /&gt;
function get_month_number (month)&lt;br /&gt;
local long_months = {[&#039;january&#039;]=1, [&#039;february&#039;]=2, [&#039;march&#039;]=3, [&#039;april&#039;]=4, [&#039;may&#039;]=5, [&#039;june&#039;]=6, [&#039;july&#039;]=7, [&#039;august&#039;]=8, [&#039;september&#039;]=9, [&#039;october&#039;]=10, [&#039;november&#039;]=11, [&#039;december&#039;]=12};&lt;br /&gt;
local short_months = {[&#039;jan&#039;]=1, [&#039;feb&#039;]=2, [&#039;mar&#039;]=3, [&#039;apr&#039;]=4, [&#039;may&#039;]=5, [&#039;jun&#039;]=6, [&#039;jul&#039;]=7, [&#039;aug&#039;]=8, [&#039;sep&#039;]=9, [&#039;oct&#039;]=10, [&#039;nov&#039;]=11, [&#039;dec&#039;]=12};&lt;br /&gt;
local temp;&lt;br /&gt;
	temp=long_months[month:lower()];&lt;br /&gt;
	if temp then return temp; end				-- if month is the long-form name&lt;br /&gt;
	temp=short_months[month:lower()];&lt;br /&gt;
	if temp then return temp; end				-- if month is the short-form name&lt;br /&gt;
	return 0;									-- misspelled or not a month name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns true if date has one of the five seasons.  Else false.&lt;br /&gt;
function is_valid_season (season)&lt;br /&gt;
	if inArray( season, {&#039;winter&#039;, &#039;spring&#039;, &#039;summer&#039;, &#039;fall&#039;, &#039;autumn&#039;} ) then&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
	return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Returns true if day is less than or equal to the number of days in month; else returns false.&lt;br /&gt;
&lt;br /&gt;
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap years before 1582 and Gregorian leap years after 1582.&lt;br /&gt;
Where the two calendars overlap (1582 to approximately 1923) dates are assumed to be Gregorian.&lt;br /&gt;
]]&lt;br /&gt;
function is_valid_date (year, month, day)&lt;br /&gt;
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};&lt;br /&gt;
local month_length;&lt;br /&gt;
	if (2==month) then							-- if February&lt;br /&gt;
		month_length = 28;						-- then 28 days unless&lt;br /&gt;
		if 1582 &amp;gt; tonumber(year) then			-- Julian calendar&lt;br /&gt;
			if 0==(year%4) then&lt;br /&gt;
				month_length = 29;&lt;br /&gt;
			end&lt;br /&gt;
		else									-- Gregorian calendar&lt;br /&gt;
			if (0==(year%4) and (0~=(year%100) or 0==(year%400))) then	-- is a leap year?&lt;br /&gt;
				month_length = 29;				-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month_length=days_in_month[month];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber (day) &amp;gt; month_length then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Check a pair of months or seasons to see if both are valid members of a month or season pair.&lt;br /&gt;
--TODO: Check order to make sure that the left month/season properly precedes the right month/season&lt;br /&gt;
&lt;br /&gt;
function is_valid_month_season_range(range_start, range_end)&lt;br /&gt;
	if 0 == get_month_number (range_start:lower()) then			-- is this a month range?&lt;br /&gt;
		if true == is_valid_season (range_start:lower()) then	-- not a month range, is this a season range?&lt;br /&gt;
			return is_valid_season (range_end:lower());			-- range_start is season; return true if range_end also a season; else false&lt;br /&gt;
		end&lt;br /&gt;
		return false;		-- range_start is not a month or a season&lt;br /&gt;
	end&lt;br /&gt;
	if 0 == get_month_number (range_end:lower()) then			-- range_start is a month; is range_end also a  month?&lt;br /&gt;
		return false;											-- not a month range&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Check date format to see that it is one of the formats approved by MOS:DATE: MMMM D, YYYY; D MMMM YYYY; MMMM YYYY; YYYY-MM-DD; YYYY.&lt;br /&gt;
Additionally, check the date to see that it is a real date: no 31 in 30-day months; no 29 February when not a leap year.  Months, both long-form and three&lt;br /&gt;
character abbreviations, and seasons must be spelled correctly.&lt;br /&gt;
&lt;br /&gt;
If the date fails the fomat tests, this function returns false but does not return values for anchor_year and COinS_date.  When this happens, the date parameter is&lt;br /&gt;
used in the COinS metadata and the CITEREF identifier gets its year from the year parameter if present.&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	date_string - date string from date-holding parameters (date, year, accessdate, embargo, archivedate, etc)&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	false if date string is not a real date; else&lt;br /&gt;
	true, anchor_year, COinS_date&lt;br /&gt;
		anchor_year can be used in CITEREF anchors&lt;br /&gt;
		COinS_date is date_string without anchor_year disambiguator if any&lt;br /&gt;
]]&lt;br /&gt;
function check_date (date_string)&lt;br /&gt;
	local year;&lt;br /&gt;
	local month;&lt;br /&gt;
	local day;&lt;br /&gt;
	local anchor_year;&lt;br /&gt;
	local coins_date;&lt;br /&gt;
&lt;br /&gt;
	if date_string:match(&amp;quot;^%d%d%d%d%-%d%d%-%d%d$&amp;quot;) then			-- Year-initial numerical year month day format&lt;br /&gt;
		coins_date = date_string:match(&amp;quot;%d%d%d%d%-%d%d%-%d%d&amp;quot;);&lt;br /&gt;
		year, month, day=string.match(date_string, &amp;quot;(%d%d%d%d)%-(%d%d)%-(%d%d)&amp;quot;);&lt;br /&gt;
		anchor_year = year;&lt;br /&gt;
		month=tonumber(month);&lt;br /&gt;
		if 12 &amp;lt; month or 1 &amp;gt; month then return false; end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+%s*%d%d*%s*,%s*%d%d%d%d%a?$&amp;quot;) then	-- month-initial: month day, year&lt;br /&gt;
		coins_date = date_string:match(&amp;quot;%a+%s*%d%d*%s*,%s*%d%d%d%d&amp;quot;);&lt;br /&gt;
		month, day, anchor_year, year=string.match(date_string, &amp;quot;(%a+)%s*(%d%d*)%s*,%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		month = get_month_number (month:lower());&lt;br /&gt;
		if 0 == month then return false; end					-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
				&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%d%d*%s*%a+%s*%d%d%d%d%a?$&amp;quot;) then		-- date-initial: day month year&lt;br /&gt;
		coins_date = date_string:match(&amp;quot;%d%d*%s*%a+%s*%d%d%d%d&amp;quot;);&lt;br /&gt;
		day, month, anchor_year, year=string.match(date_string, &amp;quot;(%d%d*)%s*(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		month = get_month_number (month:lower());&lt;br /&gt;
		if 0 == month then return false; end					-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match (date_string, &amp;quot;^%a+%s*[%s%-/–]%s*%a+%s*%d%d%d%d%a?$&amp;quot;) then		-- month/season range year&lt;br /&gt;
		local month2&lt;br /&gt;
		coins_date = mw.ustring.match (date_string, &amp;quot;%a+%s*[%s%-/–]%s*%a+%s*%d%d%d%d&amp;quot;);&lt;br /&gt;
		coins_date= mw.ustring.gsub( coins_date, &amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );	-- replace ndash with hyphen&lt;br /&gt;
		month, month2, anchor_year, year=mw.ustring.match (date_string, &amp;quot;(%a+)%s*[%s%-/–]%s*(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		day=0;													-- mark day as not used&lt;br /&gt;
		if false == is_valid_month_season_range(month, month2) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+%s*%d%d%d%d%a?$&amp;quot;) then		-- month/season year&lt;br /&gt;
		coins_date = date_string:match(&amp;quot;%a+%s*%d%d%d%d&amp;quot;);&lt;br /&gt;
		month, anchor_year, year=string.match(date_string, &amp;quot;(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		day=0;													-- mark day as not used&lt;br /&gt;
		local season=month;										-- copy &lt;br /&gt;
		month = get_month_number (month:lower());&lt;br /&gt;
		if month == 0 then										-- if month text isn&#039;t one of the twelve months, might be a season&lt;br /&gt;
			if false == is_valid_season (season:lower()) then&lt;br /&gt;
				return false;									-- return false not a month or one of the five seasons&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%d%d%d%d?%a?$&amp;quot;) then			-- year; here accept either YYY or YYYY&lt;br /&gt;
		coins_date = date_string:match(&amp;quot;^%d%d%d%d?&amp;quot;);&lt;br /&gt;
		anchor_year, year=string.match(date_string, &amp;quot;((%d%d%d%d?)%a?)&amp;quot;);&lt;br /&gt;
		month, day = 0, 0;										-- mark day and month as not used&lt;br /&gt;
	else&lt;br /&gt;
		return false;											-- date format not one of the MOS:DATE approved formats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 0~=month and 0~=day then									-- check year month day dates for validity&lt;br /&gt;
		if false==is_valid_date(year,month,day) then&lt;br /&gt;
			return false;										-- date string is not a real date return false; unset anchor_year and coins_date&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, anchor_year, coins_date;						-- format is good and date string represents a real date&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns&lt;br /&gt;
true and values for anchor_year (used in CITEREF identifiers) and COinS_date (used in the COinS metadata).  The |date= parameter test is unique.  This function only &lt;br /&gt;
accepts anchor_year and COinS_date results from the |date= parameter test and |date= is the only date-holding parameter that is allowed to contain the no-date keywords&lt;br /&gt;
&amp;quot;n.d.&amp;quot; or &amp;quot;nd&amp;quot; (without quotes).&lt;br /&gt;
&lt;br /&gt;
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,&lt;br /&gt;
a single error message is created as the dates are tested.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function dates(date_parameters_list)&lt;br /&gt;
	local anchor_year;		-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local COinS_date;		-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local error_message =&amp;quot;&amp;quot;;&lt;br /&gt;
	local good_date=false;&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs(date_parameters_list) do		-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(v) then							-- if the parameter has a value&lt;br /&gt;
			if v:match(&amp;quot;^c%.%s%d%d%d%d?%a?$&amp;quot;) then	-- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=&lt;br /&gt;
				if &#039;date&#039;==k then&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v:match(&amp;quot;((c%.%s%d%d%d%d?)%a?)&amp;quot;);	-- anchor year and COinS_date only from |date= parameter&lt;br /&gt;
				elseif &#039;year&#039;==k then&lt;br /&gt;
					good_date =  true;&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;year&#039;==k then					-- if the parameter is |year= (but not c. year)&lt;br /&gt;
				if v:match(&amp;quot;^%d%d%d%d?%a?$&amp;quot;) then	-- year with or without CITEREF disambiguator&lt;br /&gt;
					good_date =  true;&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;date&#039;==k then					-- if the parameter is |date=&lt;br /&gt;
				if v:match(&amp;quot;n%.d%.%a?&amp;quot;) then		-- if |date=n.d. with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v:match(&amp;quot;((n%.d%.)%a?)&amp;quot;);	--&amp;quot;n.d.&amp;quot;; no error when date parameter is set to no date&lt;br /&gt;
				elseif v:match(&amp;quot;nd%a?$&amp;quot;) then		-- if |date=nd with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v:match(&amp;quot;((nd)%a?)&amp;quot;);	--&amp;quot;nd&amp;quot;;	no error when date parameter is set to no date&lt;br /&gt;
				else&lt;br /&gt;
					good_date, anchor_year, COinS_date = check_date (v);	-- go test the date&lt;br /&gt;
				end&lt;br /&gt;
			else									-- any other date-holding parameter&lt;br /&gt;
				good_date = check_date (v);			-- go test the date&lt;br /&gt;
			end&lt;br /&gt;
			if false==good_date then				-- assemble one error message so we don&#039;t add the tracking category multiple times&lt;br /&gt;
				if is_set(error_message) then		-- once we&#039;ve added the first portion of the error message ...&lt;br /&gt;
					error_message=error_message .. &amp;quot;, &amp;quot;;	-- ... add a comma space separator&lt;br /&gt;
				end&lt;br /&gt;
				error_message=error_message .. &amp;quot;&amp;amp;#124;&amp;quot; .. k .. &amp;quot;=&amp;quot;;	-- add the failed parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if is_set(error_message) then&lt;br /&gt;
		table.insert( z.message_tail, { seterror( &#039;bad_date&#039;, {error_message}, true ) } );	-- add this error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return anchor_year, COinS_date;		-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Determines whether a URL string is valid&lt;br /&gt;
&lt;br /&gt;
At present the only check is whether the string appears to &lt;br /&gt;
be prefixed with a URI scheme.  It is not determined whether &lt;br /&gt;
the URI scheme is valid or whether the URL is otherwise well &lt;br /&gt;
formed.&lt;br /&gt;
]]&lt;br /&gt;
function checkurl( url_str )&lt;br /&gt;
    -- Protocol-relative or URL scheme&lt;br /&gt;
    return url_str:sub(1,2) == &amp;quot;//&amp;quot; or url_str:match( &amp;quot;^[^/]*:&amp;quot; ) ~= nil;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Removes irrelevant text and dashes from ISBN number&lt;br /&gt;
-- Similar to that used for Special:BookSources&lt;br /&gt;
function cleanisbn( isbn_str )&lt;br /&gt;
    return isbn_str:gsub( &amp;quot;[^-0-9X]&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit. ISBN-13 is checked in checkisbn().&lt;br /&gt;
If the number is valid the result will be 0. Before calling this function, issbn/issn must be checked for length and stripped of dashes,&lt;br /&gt;
spaces and other non-isxn characters.&lt;br /&gt;
]]&lt;br /&gt;
function is_valid_isxn (isxn_str, len)&lt;br /&gt;
	local temp = 0;&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, len) };	-- make a table of bytes&lt;br /&gt;
	len = len+1;							-- adjust to be a loop counter&lt;br /&gt;
	for i, v in ipairs( isxn_str ) do		-- loop through all of the bytes and calculate the checksum&lt;br /&gt;
		if v == string.byte( &amp;quot;X&amp;quot; ) then		-- if checkdigit is X&lt;br /&gt;
			temp = temp + 10*( len - i );	-- it represents 10 decimal&lt;br /&gt;
		else&lt;br /&gt;
			temp = temp + tonumber( string.char(v) )*(len-i);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 11 == 0;					-- returns true if calculation result is zero&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Determines whether an ISBN string is valid&lt;br /&gt;
function checkisbn( isbn_str )&lt;br /&gt;
	if nil ~= isbn_str:match(&amp;quot;[^%s-0-9X]&amp;quot;) then return false; end		-- fail if isbn_str contains anything but digits, hyphens, or the uppercase X&lt;br /&gt;
	isbn_str = isbn_str:gsub( &amp;quot;-&amp;quot;, &amp;quot;&amp;quot; ):gsub( &amp;quot; &amp;quot;, &amp;quot;&amp;quot; );	-- remove hyphens and spaces&lt;br /&gt;
	local len = isbn_str:len();&lt;br /&gt;
 &lt;br /&gt;
	if len ~= 10 and len ~= 13 then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if len == 10 then&lt;br /&gt;
		if isbn_str:match( &amp;quot;^%d*X?$&amp;quot; ) == nil then return false; end&lt;br /&gt;
		return is_valid_isxn(isbn_str, 10);&lt;br /&gt;
	else&lt;br /&gt;
		local temp = 0;&lt;br /&gt;
		if isbn_str:match( &amp;quot;^97[89]%d*$&amp;quot; ) == nil then return false; end	-- isbn13 begins with 978 or 979&lt;br /&gt;
		isbn_str = { isbn_str:byte(1, len) };&lt;br /&gt;
		for i, v in ipairs( isbn_str ) do&lt;br /&gt;
			temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) );&lt;br /&gt;
		end&lt;br /&gt;
		return temp % 10 == 0;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the display text for a wikilink like [[A|B]] or [[B]] gives B&lt;br /&gt;
function removewikilink( str )&lt;br /&gt;
    return (str:gsub( &amp;quot;%[%[([^%[%]]*)%]%]&amp;quot;, function(l)&lt;br /&gt;
        return l:gsub( &amp;quot;^[^|]*|(.*)$&amp;quot;, &amp;quot;%1&amp;quot; ):gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
    end));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape sequences for content that will be used for URL descriptions&lt;br /&gt;
function safeforurl( str )&lt;br /&gt;
    if str:match( &amp;quot;%[%[.-%]%]&amp;quot; ) ~= nil then &lt;br /&gt;
        table.insert( z.message_tail, { seterror( &#039;wikilink_in_url&#039;, {}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return str:gsub( &#039;[%[%]\n]&#039;, {    &lt;br /&gt;
        [&#039;[&#039;] = &#039;&amp;amp;#91;&#039;,&lt;br /&gt;
        [&#039;]&#039;] = &#039;&amp;amp;#93;&#039;,&lt;br /&gt;
        [&#039;\n&#039;] = &#039; &#039; } );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts a hyphen to a dash&lt;br /&gt;
function hyphentodash( str )&lt;br /&gt;
    if not is_set(str) or str:match( &amp;quot;[%[%]{}&amp;lt;&amp;gt;]&amp;quot; ) ~= nil then&lt;br /&gt;
        return str;&lt;br /&gt;
    end    &lt;br /&gt;
    return str:gsub( &#039;-&#039;, &#039;–&#039; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Protects a string that will be wrapped in wiki italic markup &#039;&#039; ... &#039;&#039;&lt;br /&gt;
function safeforitalics( str )&lt;br /&gt;
    --[[ Note: We can not use &amp;lt;i&amp;gt; for italics, as the expected behavior for&lt;br /&gt;
    italics specified by &#039;&#039;...&#039;&#039; in the title is that they will be inverted&lt;br /&gt;
    (i.e. unitalicized) in the resulting references.  In addition, &amp;lt;i&amp;gt; and &#039;&#039;&lt;br /&gt;
    tend to interact poorly under Mediawiki&#039;s HTML tidy. ]]&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(str) then&lt;br /&gt;
        return str;&lt;br /&gt;
    else&lt;br /&gt;
        if str:sub(1,1) == &amp;quot;&#039;&amp;quot; then str = &amp;quot;&amp;lt;span /&amp;gt;&amp;quot; .. str; end&lt;br /&gt;
        if str:sub(-1,-1) == &amp;quot;&#039;&amp;quot; then str = str .. &amp;quot;&amp;lt;span /&amp;gt;&amp;quot;; end&lt;br /&gt;
        &lt;br /&gt;
        -- Remove newlines as they break italics.&lt;br /&gt;
        return str:gsub( &#039;\n&#039;, &#039; &#039; );&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Joins a sequence of strings together while checking for duplicate separation&lt;br /&gt;
characters.&lt;br /&gt;
]]&lt;br /&gt;
function safejoin( tbl, duplicate_char )&lt;br /&gt;
    --[[&lt;br /&gt;
    Note: we use string functions here, rather than ustring functions.&lt;br /&gt;
    &lt;br /&gt;
    This has considerably faster performance and should work correctly as &lt;br /&gt;
    long as the duplicate_char is strict ASCII.  The strings&lt;br /&gt;
    in tbl may be ASCII or UTF8.&lt;br /&gt;
    ]]&lt;br /&gt;
    &lt;br /&gt;
    local str = &#039;&#039;;&lt;br /&gt;
    local comp = &#039;&#039;;&lt;br /&gt;
    local end_chr = &#039;&#039;;&lt;br /&gt;
    local trim;&lt;br /&gt;
    for _, value in ipairs( tbl ) do&lt;br /&gt;
        if value == nil then value = &#039;&#039;; end&lt;br /&gt;
        &lt;br /&gt;
        if str == &#039;&#039; then&lt;br /&gt;
            str = value;&lt;br /&gt;
        elseif value ~= &#039;&#039; then&lt;br /&gt;
            if value:sub(1,1) == &#039;&amp;lt;&#039; then&lt;br /&gt;
                -- Special case of values enclosed in spans and other markup.&lt;br /&gt;
                comp = value:gsub( &amp;quot;%b&amp;lt;&amp;gt;&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            else&lt;br /&gt;
                comp = value;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            if comp:sub(1,1) == duplicate_char then&lt;br /&gt;
                trim = false;&lt;br /&gt;
                end_chr = str:sub(-1,-1);&lt;br /&gt;
                -- str = str .. &amp;quot;&amp;lt;HERE(enchr=&amp;quot; .. end_chr.. &amp;quot;)&amp;quot;&lt;br /&gt;
                if end_chr == duplicate_char then&lt;br /&gt;
                    str = str:sub(1,-2);&lt;br /&gt;
                elseif end_chr == &amp;quot;&#039;&amp;quot; then&lt;br /&gt;
                    if str:sub(-3,-1) == duplicate_char .. &amp;quot;&#039;&#039;&amp;quot; then&lt;br /&gt;
                        str = str:sub(1, -4) .. &amp;quot;&#039;&#039;&amp;quot;;&lt;br /&gt;
                    elseif str:sub(-5,-1) == duplicate_char .. &amp;quot;]]&#039;&#039;&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    elseif str:sub(-4,-1) == duplicate_char .. &amp;quot;]&#039;&#039;&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    end&lt;br /&gt;
                elseif end_chr == &amp;quot;]&amp;quot; then&lt;br /&gt;
                    if str:sub(-3,-1) == duplicate_char .. &amp;quot;]]&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    elseif str:sub(-2,-1) == duplicate_char .. &amp;quot;]&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    end&lt;br /&gt;
                elseif end_chr == &amp;quot; &amp;quot; then&lt;br /&gt;
                    if str:sub(-2,-1) == duplicate_char .. &amp;quot; &amp;quot; then&lt;br /&gt;
                        str = str:sub(1,-3);&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if trim then&lt;br /&gt;
                    if value ~= comp then &lt;br /&gt;
                        local dup2 = duplicate_char;&lt;br /&gt;
                        if dup2:match( &amp;quot;%A&amp;quot; ) then dup2 = &amp;quot;%&amp;quot; .. dup2; end&lt;br /&gt;
                        &lt;br /&gt;
                        value = value:gsub( &amp;quot;(%b&amp;lt;&amp;gt;)&amp;quot; .. dup2, &amp;quot;%1&amp;quot;, 1 )&lt;br /&gt;
                    else&lt;br /&gt;
                        value = value:sub( 2, -1 );&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            str = str .. value;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return str;&lt;br /&gt;
end  &lt;br /&gt;
&lt;br /&gt;
-- Attempts to convert names to initials.&lt;br /&gt;
function reducetoinitials(first)&lt;br /&gt;
    local initials = {}&lt;br /&gt;
    for word in string.gmatch(first, &amp;quot;%S+&amp;quot;) do&lt;br /&gt;
        table.insert(initials, string.sub(word,1,1)) -- Vancouver format does not include full stops.&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(initials) -- Vancouver format does not include spaces.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a list of people (e.g. authors / editors) &lt;br /&gt;
function listpeople(control, people)&lt;br /&gt;
    local sep = control.sep;&lt;br /&gt;
    local namesep = control.namesep&lt;br /&gt;
    local format = control.format&lt;br /&gt;
    local maximum = control.maximum&lt;br /&gt;
    local lastauthoramp = control.lastauthoramp;&lt;br /&gt;
    local text = {}&lt;br /&gt;
    local etal = false;&lt;br /&gt;
    &lt;br /&gt;
    if sep:sub(-1,-1) ~= &amp;quot; &amp;quot; then sep = sep .. &amp;quot; &amp;quot; end&lt;br /&gt;
    if maximum ~= nil and maximum &amp;lt; 1 then return &amp;quot;&amp;quot;, 0; end&lt;br /&gt;
    &lt;br /&gt;
    for i,person in ipairs(people) do&lt;br /&gt;
        if is_set(person.last) then&lt;br /&gt;
            local mask = person.mask&lt;br /&gt;
            local one&lt;br /&gt;
            local sep_one = sep;&lt;br /&gt;
            if maximum ~= nil and i &amp;gt; maximum then&lt;br /&gt;
                etal = true;&lt;br /&gt;
                break;&lt;br /&gt;
            elseif (mask ~= nil) then&lt;br /&gt;
                local n = tonumber(mask)&lt;br /&gt;
                if (n ~= nil) then&lt;br /&gt;
                    one = string.rep(&amp;quot;&amp;amp;mdash;&amp;quot;,n)&lt;br /&gt;
                else&lt;br /&gt;
                    one = mask;&lt;br /&gt;
                    sep_one = &amp;quot; &amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                one = person.last&lt;br /&gt;
                local first = person.first&lt;br /&gt;
                if is_set(first) then &lt;br /&gt;
                    if ( &amp;quot;vanc&amp;quot; == format ) then first = reducetoinitials(first) end&lt;br /&gt;
                    one = one .. namesep .. first &lt;br /&gt;
                end&lt;br /&gt;
                if is_set(person.link) then one = &amp;quot;[[&amp;quot; .. person.link .. &amp;quot;|&amp;quot; .. one .. &amp;quot;]]&amp;quot; end&lt;br /&gt;
            end&lt;br /&gt;
            table.insert( text, one )&lt;br /&gt;
            table.insert( text, sep_one )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local count = #text / 2;&lt;br /&gt;
    if count &amp;gt; 0 then &lt;br /&gt;
        if count &amp;gt; 1 and is_set(lastauthoramp) and not etal then&lt;br /&gt;
            text[#text-2] = &amp;quot; &amp;amp; &amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        text[#text] = nil; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result = table.concat(text) -- construct list&lt;br /&gt;
    if etal then &lt;br /&gt;
        local etal_text = cfg.messages[&#039;et al&#039;];&lt;br /&gt;
        result = result .. &amp;quot; &amp;quot; .. etal_text;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- if necessary wrap result in &amp;lt;span&amp;gt; tag to format in Small Caps&lt;br /&gt;
    if ( &amp;quot;scap&amp;quot; == format ) then result = &lt;br /&gt;
        &#039;&amp;lt;span class=&amp;quot;smallcaps&amp;quot; style=&amp;quot;font-variant:small-caps&amp;quot;&amp;gt;&#039; .. result .. &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    end &lt;br /&gt;
    return result, count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Generates a CITEREF anchor ID.&lt;br /&gt;
function anchorid( options )&lt;br /&gt;
    return &amp;quot;CITEREF&amp;quot; .. table.concat( options );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets name list from the input arguments&lt;br /&gt;
function extractnames(args, list_name)&lt;br /&gt;
    local names = {};&lt;br /&gt;
    local i = 1;&lt;br /&gt;
    local last;&lt;br /&gt;
    &lt;br /&gt;
    while true do&lt;br /&gt;
        last = selectone( args, cfg.aliases[list_name .. &#039;-Last&#039;], &#039;redundant_parameters&#039;, i );&lt;br /&gt;
        if not is_set(last) then&lt;br /&gt;
            -- just in case someone passed in an empty parameter&lt;br /&gt;
            break;&lt;br /&gt;
        end&lt;br /&gt;
        names[i] = {&lt;br /&gt;
            last = last,&lt;br /&gt;
            first = selectone( args, cfg.aliases[list_name .. &#039;-First&#039;], &#039;redundant_parameters&#039;, i ),&lt;br /&gt;
            link = selectone( args, cfg.aliases[list_name .. &#039;-Link&#039;], &#039;redundant_parameters&#039;, i ),&lt;br /&gt;
            mask = selectone( args, cfg.aliases[list_name .. &#039;-Mask&#039;], &#039;redundant_parameters&#039;, i )&lt;br /&gt;
        };&lt;br /&gt;
        i = i + 1;&lt;br /&gt;
    end&lt;br /&gt;
    return names;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Populates ID table from arguments using configuration settings&lt;br /&gt;
function extractids( args )&lt;br /&gt;
    local id_list = {};&lt;br /&gt;
    for k, v in pairs( cfg.id_handlers ) do    &lt;br /&gt;
        v = selectone( args, v.parameters, &#039;redundant_parameters&#039; );&lt;br /&gt;
        if is_set(v) then id_list[k] = v; end&lt;br /&gt;
    end&lt;br /&gt;
    return id_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Takes a table of IDs and turns it into a table of formatted ID outputs.&lt;br /&gt;
function buildidlist( id_list, options )&lt;br /&gt;
    local new_list, handler = {};&lt;br /&gt;
    &lt;br /&gt;
    function fallback(k) return { __index = function(t,i) return cfg.id_handlers[k][i] end } end;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs( id_list ) do&lt;br /&gt;
        -- fallback to read-only cfg&lt;br /&gt;
        handler = setmetatable( { [&#039;id&#039;] = v }, fallback(k) );&lt;br /&gt;
        &lt;br /&gt;
        if handler.mode == &#039;external&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, externallinkid( handler ) } );&lt;br /&gt;
        elseif handler.mode == &#039;internal&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, internallinkid( handler ) } );&lt;br /&gt;
        elseif handler.mode ~= &#039;manual&#039; then&lt;br /&gt;
            error( cfg.messages[&#039;unknown_ID_mode&#039;] );&lt;br /&gt;
        elseif k == &#039;DOI&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, doi( v, options.DoiBroken ) } );&lt;br /&gt;
        elseif k == &#039;ASIN&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, amazon( v, options.ASINTLD ) } ); &lt;br /&gt;
        elseif k == &#039;OL&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, openlibrary( v ) } );&lt;br /&gt;
        elseif k == &#039;PMC&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, pmc( v, options.Embargo ) } );&lt;br /&gt;
        elseif k == &#039;ISSN&#039; then&lt;br /&gt;
        	table.insert( new_list, {handler.label, issn( v ) } );&lt;br /&gt;
        elseif k == &#039;ISBN&#039; then&lt;br /&gt;
            local ISBN = internallinkid( handler );&lt;br /&gt;
            if not checkisbn( v ) and not is_set(options.IgnoreISBN) then&lt;br /&gt;
                ISBN = ISBN .. seterror( &#039;bad_isbn&#039;, {}, false, &amp;quot; &amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            end&lt;br /&gt;
            table.insert( new_list, {handler.label, ISBN } );                &lt;br /&gt;
        else&lt;br /&gt;
            error( cfg.messages[&#039;unknown_manual_ID&#039;] );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    function comp( a, b )	-- used in following table.sort()&lt;br /&gt;
        return a[1] &amp;lt; b[1];&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort( new_list, comp );&lt;br /&gt;
    for k, v in ipairs( new_list ) do&lt;br /&gt;
        new_list[k] = v[2];&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return new_list;&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
-- Chooses one matching parameter from a list of parameters to consider&lt;br /&gt;
-- Generates an error if more than one match is present.&lt;br /&gt;
function selectone( args, possible, error_condition, index )&lt;br /&gt;
    local value = nil;&lt;br /&gt;
    local selected = &#039;&#039;;&lt;br /&gt;
    local error_list = {};&lt;br /&gt;
    &lt;br /&gt;
    if index ~= nil then index = tostring(index); end&lt;br /&gt;
    &lt;br /&gt;
    -- Handle special case of &amp;quot;#&amp;quot; replaced by empty string&lt;br /&gt;
    if index == &#039;1&#039; then&lt;br /&gt;
        for _, v in ipairs( possible ) do&lt;br /&gt;
            v = v:gsub( &amp;quot;#&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            if is_set(args[v]) then&lt;br /&gt;
                if value ~= nil and selected ~= v then&lt;br /&gt;
                    table.insert( error_list, v );&lt;br /&gt;
                else&lt;br /&gt;
                    value = args[v];&lt;br /&gt;
                    selected = v;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end        &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    for _, v in ipairs( possible ) do&lt;br /&gt;
        if index ~= nil then&lt;br /&gt;
            v = v:gsub( &amp;quot;#&amp;quot;, index );&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(args[v]) then&lt;br /&gt;
            if value ~= nil and selected ~=  v then&lt;br /&gt;
                table.insert( error_list, v );&lt;br /&gt;
            else&lt;br /&gt;
                value = args[v];&lt;br /&gt;
                selected = v;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if #error_list &amp;gt; 0 then&lt;br /&gt;
        local error_str = &amp;quot;&amp;quot;;&lt;br /&gt;
        for _, k in ipairs( error_list ) do&lt;br /&gt;
            if error_str ~= &amp;quot;&amp;quot; then error_str = error_str .. cfg.messages[&#039;parameter-separator&#039;] end&lt;br /&gt;
            error_str = error_str .. wrap( &#039;parameter&#039;, k );&lt;br /&gt;
        end&lt;br /&gt;
        if #error_list &amp;gt; 1 then&lt;br /&gt;
            error_str = error_str .. cfg.messages[&#039;parameter-final-separator&#039;];&lt;br /&gt;
        else&lt;br /&gt;
            error_str = error_str .. cfg.messages[&#039;parameter-pair-separator&#039;];&lt;br /&gt;
        end&lt;br /&gt;
        error_str = error_str .. wrap( &#039;parameter&#039;, selected );&lt;br /&gt;
        table.insert( z.message_tail, { seterror( error_condition, {error_str}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return value, selected;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) allows automated tools to parse&lt;br /&gt;
-- the citation information.&lt;br /&gt;
function COinS(data)&lt;br /&gt;
    if &#039;table&#039; ~= type(data) or nil == next(data) then&lt;br /&gt;
        return &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local ctx_ver = &amp;quot;Z39.88-2004&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    -- treat table strictly as an array with only set values.&lt;br /&gt;
    local OCinSoutput = setmetatable( {}, {&lt;br /&gt;
        __newindex = function(self, key, value)&lt;br /&gt;
            if is_set(value) then&lt;br /&gt;
                rawset( self, #self+1, table.concat{ key, &#039;=&#039;, mw.uri.encode( removewikilink( value ) ) } );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    if is_set(data.Chapter) then&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;bookitem&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Chapter;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;&lt;br /&gt;
    elseif is_set(data.Periodical) then&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:journal&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;article&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.jtitle&amp;quot;] = data.Periodical;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;&lt;br /&gt;
    else&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;book&amp;quot;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Title;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    OCinSoutput[&amp;quot;rft.place&amp;quot;] = data.PublicationPlace;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.date&amp;quot;] = data.Date;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.series&amp;quot;] = data.Series;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.volume&amp;quot;] = data.Volume;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.issue&amp;quot;] = data.Issue;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.edition&amp;quot;] = data.Edition;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.pub&amp;quot;] = data.PublisherName;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs( data.ID_list ) do&lt;br /&gt;
        local id, value = cfg.id_handlers[k].COinS;&lt;br /&gt;
        if k == &#039;ISBN&#039; then value = cleanisbn( v ); else value = v; end&lt;br /&gt;
        if string.sub( id or &amp;quot;&amp;quot;, 1, 4 ) == &#039;info&#039; then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ id, &amp;quot;/&amp;quot;, v };&lt;br /&gt;
        else&lt;br /&gt;
            OCinSoutput[ id ] = value;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local last, first;&lt;br /&gt;
    for k, v in ipairs( data.Authors ) do&lt;br /&gt;
        last, first = v.last, v.first;&lt;br /&gt;
        if k == 1 then&lt;br /&gt;
            if is_set(last) then&lt;br /&gt;
                OCinSoutput[&amp;quot;rft.aulast&amp;quot;] = last;&lt;br /&gt;
            end&lt;br /&gt;
            if is_set(first) then &lt;br /&gt;
                OCinSoutput[&amp;quot;rft.aufirst&amp;quot;] = first;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(last) and is_set(first) then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft.au&amp;quot;] = table.concat{ last, &amp;quot;, &amp;quot;, first };&lt;br /&gt;
        elseif is_set(last) then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    OCinSoutput.rft_id = data.URL;&lt;br /&gt;
    OCinSoutput.rfr_id = table.concat{ &amp;quot;info:sid/&amp;quot;, mw.site.server:match( &amp;quot;[^/]*$&amp;quot; ), &amp;quot;:&amp;quot;, data.RawPage };&lt;br /&gt;
    OCinSoutput = setmetatable( OCinSoutput, nil );&lt;br /&gt;
    &lt;br /&gt;
    -- sort with version string always first, and combine.&lt;br /&gt;
    table.sort( OCinSoutput );&lt;br /&gt;
    table.insert( OCinSoutput, 1, &amp;quot;ctx_ver=&amp;quot; .. ctx_ver );  -- such as &amp;quot;Z39.88-2004&amp;quot;&lt;br /&gt;
    return table.concat(OCinSoutput, &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This is the main function doing the majority of the citation&lt;br /&gt;
formatting.&lt;br /&gt;
]]&lt;br /&gt;
function citation0( config, args)&lt;br /&gt;
    --[[ &lt;br /&gt;
    Load Input Parameters&lt;br /&gt;
    The argment_wrapper facillitates the mapping of multiple&lt;br /&gt;
    aliases to single internal variable.&lt;br /&gt;
    ]]&lt;br /&gt;
    local A = argument_wrapper( args );&lt;br /&gt;
&lt;br /&gt;
    local i &lt;br /&gt;
    local PPrefix = A[&#039;PPrefix&#039;]&lt;br /&gt;
    local PPPrefix = A[&#039;PPPrefix&#039;]&lt;br /&gt;
    if is_set( A[&#039;NoPP&#039;] ) then PPPrefix = &amp;quot;&amp;quot; PPrefix = &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- Pick out the relevant fields from the arguments.  Different citation templates&lt;br /&gt;
    -- define different field names for the same underlying things.    &lt;br /&gt;
    local Authors = A[&#039;Authors&#039;];&lt;br /&gt;
    local a = extractnames( args, &#039;AuthorList&#039; );&lt;br /&gt;
&lt;br /&gt;
    local Coauthors = A[&#039;Coauthors&#039;];&lt;br /&gt;
    local Others = A[&#039;Others&#039;];&lt;br /&gt;
    local Editors = A[&#039;Editors&#039;];&lt;br /&gt;
    local e = extractnames( args, &#039;EditorList&#039; );&lt;br /&gt;
&lt;br /&gt;
    local Year = A[&#039;Year&#039;];&lt;br /&gt;
    local PublicationDate = A[&#039;PublicationDate&#039;];&lt;br /&gt;
    local OrigYear = A[&#039;OrigYear&#039;];&lt;br /&gt;
    local Date = A[&#039;Date&#039;];&lt;br /&gt;
    local LayDate = A[&#039;LayDate&#039;];&lt;br /&gt;
    ------------------------------------------------- Get title data&lt;br /&gt;
    local Title = A[&#039;Title&#039;];&lt;br /&gt;
    local BookTitle = A[&#039;BookTitle&#039;];&lt;br /&gt;
    local Conference = A[&#039;Conference&#039;];&lt;br /&gt;
    local TransTitle = A[&#039;TransTitle&#039;];&lt;br /&gt;
    local TitleNote = A[&#039;TitleNote&#039;];&lt;br /&gt;
    local TitleLink = A[&#039;TitleLink&#039;];&lt;br /&gt;
    local Chapter = A[&#039;Chapter&#039;];&lt;br /&gt;
    local ChapterLink = A[&#039;ChapterLink&#039;];&lt;br /&gt;
    local TransChapter = A[&#039;TransChapter&#039;];&lt;br /&gt;
    local TitleType = A[&#039;TitleType&#039;];&lt;br /&gt;
    local Degree = A[&#039;Degree&#039;];&lt;br /&gt;
    local Docket = A[&#039;Docket&#039;];&lt;br /&gt;
    local ArchiveURL = A[&#039;ArchiveURL&#039;];&lt;br /&gt;
    local URL = A[&#039;URL&#039;]&lt;br /&gt;
    local URLorigin = A:ORIGIN(&#039;URL&#039;);&lt;br /&gt;
    local ChapterURL = A[&#039;ChapterURL&#039;];&lt;br /&gt;
    local ChapterURLorigin = A:ORIGIN(&#039;ChapterURL&#039;);&lt;br /&gt;
    local ConferenceURL = A[&#039;ConferenceURL&#039;];&lt;br /&gt;
    local ConferenceURLorigin = A:ORIGIN(&#039;ConferenceURL&#039;);&lt;br /&gt;
    local Periodical = A[&#039;Periodical&#039;];&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Parameter remapping for cite encyclopedia:&lt;br /&gt;
When the citation has these parameters:&lt;br /&gt;
	|encyclopedia and |title then map |title to |article and |encyclopedia to |title&lt;br /&gt;
	|encyclopedia and |article then map |encyclopedia to |title&lt;br /&gt;
	|encyclopedia then map |encyclopedia to |title&lt;br /&gt;
&lt;br /&gt;
	|trans_title maps to |trans_chapter when |title is re-mapped&lt;br /&gt;
&lt;br /&gt;
All other combinations of |encyclopedia, |title, and |article are not modified&lt;br /&gt;
]]&lt;br /&gt;
	if ( config.CitationClass == &amp;quot;encyclopaedia&amp;quot; ) then&lt;br /&gt;
		if is_set(Periodical) then					-- Periodical is set when |encyclopedia is set&lt;br /&gt;
			if is_set(Title) then&lt;br /&gt;
				if not is_set(Chapter) then&lt;br /&gt;
					Chapter = Title;				-- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title&lt;br /&gt;
					TransChapter = TransTitle;&lt;br /&gt;
					Title = Periodical;&lt;br /&gt;
					Periodical = &#039;&#039;;				-- redundant so unset&lt;br /&gt;
					TransTitle = &#039;&#039;;				-- redundant so unset&lt;br /&gt;
				end&lt;br /&gt;
			else									-- |title not set&lt;br /&gt;
				Title = Periodical;					-- |encyclopedia set and |article set or not set so map |encyclopedia to |title&lt;br /&gt;
				Periodical = &#039;&#039;;					-- redundant so unset&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
local Series = A[&#039;Series&#039;];&lt;br /&gt;
    local Volume = A[&#039;Volume&#039;];&lt;br /&gt;
    local Issue = A[&#039;Issue&#039;];&lt;br /&gt;
    local Position = &#039;&#039;;&lt;br /&gt;
    local Page, Pages, At, page_type;&lt;br /&gt;
    &lt;br /&gt;
    Page = A[&#039;Page&#039;];&lt;br /&gt;
    Pages = hyphentodash( A[&#039;Pages&#039;] );&lt;br /&gt;
    At = A[&#039;At&#039;];&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Page) then&lt;br /&gt;
        if is_set(Pages) or is_set(At) then&lt;br /&gt;
            Page = Page .. &amp;quot; &amp;quot; .. seterror(&#039;extra_pages&#039;);&lt;br /&gt;
            Pages = &#039;&#039;;&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    elseif is_set(Pages) then&lt;br /&gt;
        if is_set(At) then&lt;br /&gt;
            Pages = Pages .. &amp;quot; &amp;quot; .. seterror(&#039;extra_pages&#039;);&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    local Edition = A[&#039;Edition&#039;];&lt;br /&gt;
    local PublicationPlace = A[&#039;PublicationPlace&#039;]&lt;br /&gt;
    local Place = A[&#039;Place&#039;];&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(PublicationPlace) and is_set(Place) then&lt;br /&gt;
        PublicationPlace = Place;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if PublicationPlace == Place then Place = &#039;&#039;; end&lt;br /&gt;
    &lt;br /&gt;
    local PublisherName = A[&#039;PublisherName&#039;];&lt;br /&gt;
    local RegistrationRequired = A[&#039;RegistrationRequired&#039;];&lt;br /&gt;
    local SubscriptionRequired = A[&#039;SubscriptionRequired&#039;];&lt;br /&gt;
    local Via = A[&#039;Via&#039;];&lt;br /&gt;
    local AccessDate = A[&#039;AccessDate&#039;];&lt;br /&gt;
    local ArchiveDate = A[&#039;ArchiveDate&#039;];&lt;br /&gt;
    local Agency = A[&#039;Agency&#039;];&lt;br /&gt;
    local DeadURL = A[&#039;DeadURL&#039;]&lt;br /&gt;
    local Language = A[&#039;Language&#039;];&lt;br /&gt;
    local Format = A[&#039;Format&#039;];&lt;br /&gt;
    local Ref = A[&#039;Ref&#039;];&lt;br /&gt;
    &lt;br /&gt;
    local DoiBroken = A[&#039;DoiBroken&#039;];&lt;br /&gt;
	&lt;br /&gt;
-- Special case for cite techreport.&lt;br /&gt;
	local ID = A[&#039;ID&#039;];&lt;br /&gt;
	if (config.CitationClass == &amp;quot;techreport&amp;quot;) then	-- special case for cite techreport&lt;br /&gt;
		if is_set(Issue) then						-- cite techreport uses &#039;number&#039;, which other citations aliase to &#039;issue&#039;&lt;br /&gt;
			if not is_set(ID) then					-- can we use ID for the &amp;quot;number&amp;quot;?&lt;br /&gt;
				ID = Issue;							-- yes, use it&lt;br /&gt;
				Issue = &amp;quot;&amp;quot;;							-- unset Issue so that &amp;quot;number&amp;quot; isn&#039;t duplicated in the rendered citation or COinS metadata&lt;br /&gt;
			else									-- can&#039;t use ID so emit error message&lt;br /&gt;
				ID = ID .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;id=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;#124;number=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
	end	&lt;br /&gt;
			&lt;br /&gt;
    local ASINTLD = A[&#039;ASINTLD&#039;];&lt;br /&gt;
    local IgnoreISBN = A[&#039;IgnoreISBN&#039;];&lt;br /&gt;
    local Embargo = A[&#039;Embargo&#039;];&lt;br /&gt;
&lt;br /&gt;
    local ID_list = extractids( args );&lt;br /&gt;
    &lt;br /&gt;
    local Quote = A[&#039;Quote&#039;];&lt;br /&gt;
    local PostScript = A[&#039;PostScript&#039;];&lt;br /&gt;
    local LayURL = A[&#039;LayURL&#039;];&lt;br /&gt;
    local LaySource = A[&#039;LaySource&#039;];&lt;br /&gt;
    local Transcript = A[&#039;Transcript&#039;];&lt;br /&gt;
    local TranscriptURL = A[&#039;TranscriptURL&#039;] &lt;br /&gt;
    local TranscriptURLorigin = A:ORIGIN(&#039;TranscriptURL&#039;);&lt;br /&gt;
    local sepc = A[&#039;Separator&#039;];&lt;br /&gt;
    local LastAuthorAmp = A[&#039;LastAuthorAmp&#039;];&lt;br /&gt;
    local no_tracking_cats = A[&#039;NoTracking&#039;];&lt;br /&gt;
&lt;br /&gt;
    local use_lowercase = ( sepc ~= &#039;.&#039; );&lt;br /&gt;
    local this_page = mw.title.getCurrentTitle();  --Also used for COinS and for language&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(no_tracking_cats) then&lt;br /&gt;
        for k, v in pairs( cfg.uncategorized_namespaces ) do&lt;br /&gt;
            if this_page.nsText == v then&lt;br /&gt;
                no_tracking_cats = &amp;quot;true&amp;quot;;&lt;br /&gt;
                break;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	local anchor_year;		-- used in the CITEREF identifier&lt;br /&gt;
	local COinS_date;		-- used in the COinS metadata&lt;br /&gt;
&lt;br /&gt;
-- legacy: promote concatenation of |day=, |month=, and |year= to Date if Date not set; or, promote PublicationDate to Date if neither Date nor Year are set.&lt;br /&gt;
	if not is_set(Date) then&lt;br /&gt;
		Date = Year;						-- promote Year to Date&lt;br /&gt;
		Year = nil;							-- make nil so Year as empty string isn&#039;t used for CITEREF&lt;br /&gt;
		if is_set(Date) then&lt;br /&gt;
			local Month = A[&#039;Month&#039;];&lt;br /&gt;
			if is_set(Month) then&lt;br /&gt;
				Date = Month .. &amp;quot; &amp;quot; .. Date;&lt;br /&gt;
				local Day = A[&#039;Day&#039;]&lt;br /&gt;
				if is_set(Day) then Date = Day .. &amp;quot; &amp;quot; .. Date end&lt;br /&gt;
			end&lt;br /&gt;
		elseif is_set(PublicationDate) then	-- use PublicationDate when |date= and |year= are not set&lt;br /&gt;
			Date = PublicationDate;			-- promonte PublicationDate to Date&lt;br /&gt;
			PublicationDate = &#039;&#039;;			-- unset, no longer needed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if PublicationDate == Date then PublicationDate = &#039;&#039;; end	-- if PublicationDate is same as Date, don&#039;t display in rendered citation&lt;br /&gt;
&lt;br /&gt;
-- Go test all of the date-holding parameters for valid MOS:DATE format and make sure that dates are real dates.&lt;br /&gt;
-- TODO: 2013-10-27: AirDate is nil when dates() is called because it hasn&#039;t been set yet.  Move the call to dates() or set AirDate earlier.&lt;br /&gt;
	anchor_year, COinS_date = dates({[&#039;accessdate&#039;]=AccessDate, [&#039;airdate&#039;]=AirDate, [&#039;archivedate&#039;]=ArchiveDate, [&#039;date&#039;]=Date, [&#039;doi_brokendate&#039;]=DoiBroken,&lt;br /&gt;
		[&#039;embargo&#039;]=Embargo, [&#039;laydate&#039;]=LayDate, [&#039;publicationdate&#039;]=PublicationDate, [&#039;year&#039;]=Year});&lt;br /&gt;
&lt;br /&gt;
-- At this point fields may be nil if they weren&#039;t specified in the template use.  We can use that fact.&lt;br /&gt;
&lt;br /&gt;
	--Account for the oddity that is {{cite journal}} with |pmc= set and |url= not set&lt;br /&gt;
	if config.CitationClass == &amp;quot;journal&amp;quot; and not is_set(URL) and is_set(ID_list[&#039;PMC&#039;]) then&lt;br /&gt;
		if not is_embargoed(Embargo) then&lt;br /&gt;
			URL=cfg.id_handlers[&#039;PMC&#039;].prefix .. ID_list[&#039;PMC&#039;];	-- set url to be the same as the PMC external link if not embargoed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    -- Account for the oddity that is {{cite conference}}, before generation of COinS data.&lt;br /&gt;
    if is_set(BookTitle) then&lt;br /&gt;
        Chapter = Title;&lt;br /&gt;
        ChapterLink = TitleLink;&lt;br /&gt;
        TransChapter = TransTitle;&lt;br /&gt;
        Title = BookTitle;&lt;br /&gt;
        TitleLink = &#039;&#039;;&lt;br /&gt;
        TransTitle = &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
    -- Account for the oddity that is {{cite episode}}, before generation of COinS data.&lt;br /&gt;
    if config.CitationClass == &amp;quot;episode&amp;quot; then&lt;br /&gt;
        local AirDate = A[&#039;AirDate&#039;];&lt;br /&gt;
        local SeriesLink = A[&#039;SeriesLink&#039;];&lt;br /&gt;
        local Season = A[&#039;Season&#039;];&lt;br /&gt;
        local SeriesNumber = A[&#039;SeriesNumber&#039;];&lt;br /&gt;
        local Network = A[&#039;Network&#039;];&lt;br /&gt;
        local Station = A[&#039;Station&#039;];&lt;br /&gt;
        local s, n = {}, {};&lt;br /&gt;
        local Sep = (first_set(A[&amp;quot;SeriesSeparator&amp;quot;], A[&amp;quot;Separator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if is_set(Issue) then table.insert(s, cfg.messages[&amp;quot;episode&amp;quot;] .. &amp;quot; &amp;quot; .. Issue); Issue = &#039;&#039;; end&lt;br /&gt;
        if is_set(Season) then table.insert(s, cfg.messages[&amp;quot;season&amp;quot;] .. &amp;quot; &amp;quot; .. Season); end&lt;br /&gt;
        if is_set(SeriesNumber) then table.insert(s, cfg.messages[&amp;quot;series&amp;quot;] .. &amp;quot; &amp;quot; .. SeriesNumber); end&lt;br /&gt;
        if is_set(Network) then table.insert(n, Network); end&lt;br /&gt;
        if is_set(Station) then table.insert(n, Station); end&lt;br /&gt;
        &lt;br /&gt;
        Date = Date or AirDate;&lt;br /&gt;
        Chapter = Title;&lt;br /&gt;
        ChapterLink = TitleLink;&lt;br /&gt;
        TransChapter = TransTitle;&lt;br /&gt;
        Title = Series;&lt;br /&gt;
        TitleLink = SeriesLink;&lt;br /&gt;
        TransTitle = &#039;&#039;;&lt;br /&gt;
        &lt;br /&gt;
        Series = table.concat(s, Sep);&lt;br /&gt;
        ID = table.concat(n, Sep);&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) for&lt;br /&gt;
    -- automated parsing of citation information.&lt;br /&gt;
    local OCinSoutput = COinS{&lt;br /&gt;
        [&#039;Periodical&#039;] = Periodical,&lt;br /&gt;
        [&#039;Chapter&#039;] = Chapter,&lt;br /&gt;
        [&#039;Title&#039;] = Title,&lt;br /&gt;
        [&#039;PublicationPlace&#039;] = PublicationPlace,&lt;br /&gt;
        [&#039;Date&#039;] = first_set(COinS_date, Date),		-- COinS_date has correctly formatted date if Date is valid; any reason to keep Date here?  Should we be including invalid dates in metadata?&lt;br /&gt;
        [&#039;Series&#039;] = Series,&lt;br /&gt;
        [&#039;Volume&#039;] = Volume,&lt;br /&gt;
        [&#039;Issue&#039;] = Issue,&lt;br /&gt;
        [&#039;Pages&#039;] = first_set(Page, Pages, At),&lt;br /&gt;
        [&#039;Edition&#039;] = Edition,&lt;br /&gt;
        [&#039;PublisherName&#039;] = PublisherName,&lt;br /&gt;
        [&#039;URL&#039;] = first_set( URL, ChapterURL ),&lt;br /&gt;
        [&#039;Authors&#039;] = a,&lt;br /&gt;
        [&#039;ID_list&#039;] = ID_list,&lt;br /&gt;
        [&#039;RawPage&#039;] = this_page.prefixedText,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    if is_set(Periodical) and not is_set(Chapter) and is_set(Title) then&lt;br /&gt;
        Chapter = Title;&lt;br /&gt;
        ChapterLink = TitleLink;&lt;br /&gt;
        TransChapter = TransTitle;&lt;br /&gt;
        Title = &#039;&#039;;&lt;br /&gt;
        TitleLink = &#039;&#039;;&lt;br /&gt;
        TransTitle = &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Now perform various field substitutions.&lt;br /&gt;
    -- We also add leading spaces and surrounding markup and punctuation to the&lt;br /&gt;
    -- various parts of the citation, but only when they are non-nil.&lt;br /&gt;
    if not is_set(Authors) then&lt;br /&gt;
        local Maximum = tonumber( A[&#039;DisplayAuthors&#039;] );&lt;br /&gt;
        &lt;br /&gt;
        -- Preserve old-style implicit et al.&lt;br /&gt;
        if not is_set(Maximum) and #a == 9 then &lt;br /&gt;
            Maximum = 8;&lt;br /&gt;
            table.insert( z.message_tail, { seterror(&#039;implict_etal_author&#039;, {}, true ) } );&lt;br /&gt;
        elseif not is_set(Maximum) then&lt;br /&gt;
            Maximum = #a + 1;&lt;br /&gt;
        end&lt;br /&gt;
            &lt;br /&gt;
        local control = { &lt;br /&gt;
            sep = A[&amp;quot;AuthorSeparator&amp;quot;] .. &amp;quot; &amp;quot;,&lt;br /&gt;
            namesep = (first_set(A[&amp;quot;AuthorNameSeparator&amp;quot;], A[&amp;quot;NameSeparator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;,&lt;br /&gt;
            format = A[&amp;quot;AuthorFormat&amp;quot;],&lt;br /&gt;
            maximum = Maximum,&lt;br /&gt;
            lastauthoramp = LastAuthorAmp&lt;br /&gt;
        };&lt;br /&gt;
        &lt;br /&gt;
        -- If the coauthor field is also used, prevent ampersand and et al. formatting.&lt;br /&gt;
        if is_set(Coauthors) then&lt;br /&gt;
            control.lastauthoramp = nil;&lt;br /&gt;
            control.maximum = #a + 1;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        Authors = listpeople(control, a) &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if not is_set(Authors) and is_set(Coauthors) then	-- coauthors aren&#039;t displayed if one of authors=, authorn=, or lastn= isn&#039;t specified&lt;br /&gt;
		table.insert( z.message_tail, { seterror(&#039;coauthors_missing_author&#039;, {}, true) } );	-- emit error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local EditorCount&lt;br /&gt;
    if not is_set(Editors) then&lt;br /&gt;
        local Maximum = tonumber( A[&#039;DisplayEditors&#039;] );&lt;br /&gt;
        -- Preserve old-style implicit et al.&lt;br /&gt;
        if not is_set(Maximum) and #e == 4 then &lt;br /&gt;
            Maximum = 3;&lt;br /&gt;
            table.insert( z.message_tail, { seterror(&#039;implict_etal_editor&#039;, {}, true) } );&lt;br /&gt;
        elseif not is_set(Maximum) then&lt;br /&gt;
            Maximum = #e + 1;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local control = { &lt;br /&gt;
            sep = A[&amp;quot;EditorSeparator&amp;quot;] .. &amp;quot; &amp;quot;,&lt;br /&gt;
            namesep = (first_set(A[&amp;quot;EditorNameSeparator&amp;quot;], A[&amp;quot;NameSeparator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;,&lt;br /&gt;
            format = A[&#039;EditorFormat&#039;],&lt;br /&gt;
            maximum = Maximum,&lt;br /&gt;
            lastauthoramp = LastAuthorAmp&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        Editors, EditorCount = listpeople(control, e);&lt;br /&gt;
    else&lt;br /&gt;
        EditorCount = 1;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local Cartography = &amp;quot;&amp;quot;;&lt;br /&gt;
    local Scale = &amp;quot;&amp;quot;;&lt;br /&gt;
    if config.CitationClass == &amp;quot;map&amp;quot; then&lt;br /&gt;
        if not is_set( Authors ) and is_set( PublisherName ) then&lt;br /&gt;
            Authors = PublisherName;&lt;br /&gt;
            PublisherName = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        Cartography = A[&#039;Cartography&#039;];&lt;br /&gt;
        if is_set( Cartography ) then&lt;br /&gt;
            Cartography = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;cartography&#039;, Cartography, use_lowercase );&lt;br /&gt;
        end        &lt;br /&gt;
        Scale = A[&#039;Scale&#039;];&lt;br /&gt;
        if is_set( Scale ) then&lt;br /&gt;
            Scale = sepc .. &amp;quot; &amp;quot; .. Scale;&lt;br /&gt;
        end        &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if  not is_set(URL) and&lt;br /&gt;
        not is_set(ChapterURL) and&lt;br /&gt;
        not is_set(ArchiveURL) and&lt;br /&gt;
        not is_set(ConferenceURL) and&lt;br /&gt;
        not is_set(TranscriptURL) then&lt;br /&gt;
        &lt;br /&gt;
        -- Test if cite web is called without giving a URL&lt;br /&gt;
        if ( config.CitationClass == &amp;quot;web&amp;quot; ) then&lt;br /&gt;
            table.insert( z.message_tail, { seterror( &#039;cite_web_url&#039;, {}, true ) } );&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Test if accessdate is given without giving a URL&lt;br /&gt;
        if is_set(AccessDate) then&lt;br /&gt;
            table.insert( z.message_tail, { seterror( &#039;accessdate_missing_url&#039;, {}, true ) } );&lt;br /&gt;
            AccessDate = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Test if format is given without giving a URL&lt;br /&gt;
        if is_set(Format) then&lt;br /&gt;
            Format = Format .. seterror( &#039;format_missing_url&#039; );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Test if citation has no title&lt;br /&gt;
    if  not is_set(Chapter) and&lt;br /&gt;
        not is_set(Title) and&lt;br /&gt;
        not is_set(Periodical) and&lt;br /&gt;
        not is_set(Conference) and&lt;br /&gt;
        not is_set(TransTitle) and&lt;br /&gt;
        not is_set(TransChapter) then&lt;br /&gt;
        table.insert( z.message_tail, { seterror( &#039;citation_missing_title&#039;, {}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Format = is_set(Format) and &amp;quot; (&amp;quot; .. Format .. &amp;quot;)&amp;quot; or &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    local OriginalURL = URL&lt;br /&gt;
    DeadURL = DeadURL:lower();&lt;br /&gt;
    if is_set( ArchiveURL ) then&lt;br /&gt;
        if ( DeadURL ~= &amp;quot;no&amp;quot; ) then&lt;br /&gt;
            URL = ArchiveURL&lt;br /&gt;
            URLorigin = A:ORIGIN(&#039;ArchiveURL&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Format chapter / article title&lt;br /&gt;
    if is_set(Chapter) and is_set(ChapterLink) then &lt;br /&gt;
        Chapter = &amp;quot;[[&amp;quot; .. ChapterLink .. &amp;quot;|&amp;quot; .. Chapter .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if is_set(Periodical) and is_set(Title) then&lt;br /&gt;
        Chapter = wrap( &#039;italic-title&#039;, Chapter );&lt;br /&gt;
        TransChapter = wrap( &#039;trans-italic-title&#039;, TransChapter );&lt;br /&gt;
    else&lt;br /&gt;
        Chapter = wrap( &#039;quoted-title&#039;, Chapter );&lt;br /&gt;
        TransChapter = wrap( &#039;trans-quoted-title&#039;, TransChapter );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local TransError = &amp;quot;&amp;quot;&lt;br /&gt;
    if is_set(TransChapter) then&lt;br /&gt;
        if not is_set(Chapter) then&lt;br /&gt;
            TransError = &amp;quot; &amp;quot; .. seterror( &#039;trans_missing_chapter&#039; );&lt;br /&gt;
        else&lt;br /&gt;
            TransChapter = &amp;quot; &amp;quot; .. TransChapter;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Chapter = Chapter .. TransChapter;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Chapter) then&lt;br /&gt;
        if not is_set(ChapterLink) then&lt;br /&gt;
            if is_set(ChapterURL) then&lt;br /&gt;
                Chapter = externallink( ChapterURL, Chapter ) .. TransError;&lt;br /&gt;
                if not is_set(URL) then&lt;br /&gt;
                    Chapter = Chapter .. Format;&lt;br /&gt;
                    Format = &amp;quot;&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
            elseif is_set(URL) then &lt;br /&gt;
                Chapter = externallink( URL, Chapter ) .. TransError .. Format;&lt;br /&gt;
                URL = &amp;quot;&amp;quot;;&lt;br /&gt;
                Format = &amp;quot;&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                Chapter = Chapter .. TransError;&lt;br /&gt;
            end            &lt;br /&gt;
        elseif is_set(ChapterURL) then&lt;br /&gt;
            Chapter = Chapter .. &amp;quot; &amp;quot; .. externallink( ChapterURL, nil, ChapterURLorigin ) .. &lt;br /&gt;
                TransError;&lt;br /&gt;
        else&lt;br /&gt;
            Chapter = Chapter .. TransError;&lt;br /&gt;
        end&lt;br /&gt;
        Chapter = Chapter .. sepc .. &amp;quot; &amp;quot; -- with end-space&lt;br /&gt;
    elseif is_set(ChapterURL) then&lt;br /&gt;
        Chapter = &amp;quot; &amp;quot; .. externallink( ChapterURL, nil, ChapterURLorigin ) .. sepc .. &amp;quot; &amp;quot;;&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    -- Format main title.&lt;br /&gt;
    if is_set(TitleLink) and is_set(Title) then&lt;br /&gt;
        Title = &amp;quot;[[&amp;quot; .. TitleLink .. &amp;quot;|&amp;quot; .. Title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Periodical) then&lt;br /&gt;
        Title = wrap( &#039;quoted-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-quoted-title&#039;, TransTitle );&lt;br /&gt;
    elseif inArray(config.CitationClass, {&amp;quot;web&amp;quot;,&amp;quot;news&amp;quot;,&amp;quot;pressrelease&amp;quot;,&amp;quot;conference&amp;quot;}) and&lt;br /&gt;
            not is_set(Chapter) then&lt;br /&gt;
        Title = wrap( &#039;quoted-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-quoted-title&#039;, TransTitle );&lt;br /&gt;
    else&lt;br /&gt;
        Title = wrap( &#039;italic-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-italic-title&#039;, TransTitle );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    TransError = &amp;quot;&amp;quot;;&lt;br /&gt;
    if is_set(TransTitle) then&lt;br /&gt;
        if not is_set(Title) then&lt;br /&gt;
            TransError = &amp;quot; &amp;quot; .. seterror( &#039;trans_missing_title&#039; );&lt;br /&gt;
        else&lt;br /&gt;
            TransTitle = &amp;quot; &amp;quot; .. TransTitle;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Title = Title .. TransTitle;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Title) then&lt;br /&gt;
        if not is_set(TitleLink) and is_set(URL) then &lt;br /&gt;
            Title = externallink( URL, Title ) .. TransError .. Format       &lt;br /&gt;
            URL = &amp;quot;&amp;quot;;&lt;br /&gt;
            Format = &amp;quot;&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            Title = Title .. TransError;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Place) then&lt;br /&gt;
        Place = &amp;quot; &amp;quot; .. wrap( &#039;written&#039;, Place, use_lowercase ) .. sepc .. &amp;quot; &amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Conference) then&lt;br /&gt;
        if is_set(ConferenceURL) then&lt;br /&gt;
            Conference = externallink( ConferenceURL, Conference );&lt;br /&gt;
        end&lt;br /&gt;
        Conference = sepc .. &amp;quot; &amp;quot; .. Conference&lt;br /&gt;
    elseif is_set(ConferenceURL) then&lt;br /&gt;
        Conference = sepc .. &amp;quot; &amp;quot; .. externallink( ConferenceURL, nil, ConferenceURLorigin );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(Position) then&lt;br /&gt;
        local Minutes = A[&#039;Minutes&#039;];&lt;br /&gt;
        if is_set(Minutes) then&lt;br /&gt;
            Position = &amp;quot; &amp;quot; .. Minutes .. &amp;quot; &amp;quot; .. cfg.messages[&#039;minutes&#039;];&lt;br /&gt;
        else&lt;br /&gt;
            local Time = A[&#039;Time&#039;];&lt;br /&gt;
            if is_set(Time) then&lt;br /&gt;
                local TimeCaption = A[&#039;TimeCaption&#039;]&lt;br /&gt;
                if not is_set(TimeCaption) then&lt;br /&gt;
                    TimeCaption = cfg.messages[&#039;event&#039;];&lt;br /&gt;
                    if sepc ~= &#039;.&#039; then&lt;br /&gt;
                        TimeCaption = TimeCaption:lower();&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                Position = &amp;quot; &amp;quot; .. TimeCaption .. &amp;quot; &amp;quot; .. Time;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        Position = &amp;quot; &amp;quot; .. Position;&lt;br /&gt;
        At = &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(Page) then&lt;br /&gt;
        if is_set(Pages) then&lt;br /&gt;
            if is_set(Periodical) and&lt;br /&gt;
                not inArray(config.CitationClass, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;book&amp;quot;,&amp;quot;news&amp;quot;}) then&lt;br /&gt;
                Pages = &amp;quot;: &amp;quot; .. Pages;&lt;br /&gt;
            elseif tonumber(Pages) ~= nil then&lt;br /&gt;
                Pages = sepc ..&amp;quot; &amp;quot; .. PPrefix .. Pages;&lt;br /&gt;
            else&lt;br /&gt;
                Pages = sepc ..&amp;quot; &amp;quot; .. PPPrefix .. Pages;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(Periodical) and&lt;br /&gt;
            not inArray(config.CitationClass, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;book&amp;quot;,&amp;quot;news&amp;quot;}) then&lt;br /&gt;
            Page = &amp;quot;: &amp;quot; .. Page;&lt;br /&gt;
        else&lt;br /&gt;
            Page = sepc ..&amp;quot; &amp;quot; .. PPrefix .. Page;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    At = is_set(At) and (sepc .. &amp;quot; &amp;quot; .. At) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Position = is_set(Position) and (sepc .. &amp;quot; &amp;quot; .. Position) or &amp;quot;&amp;quot;;&lt;br /&gt;
    if config.CitationClass == &#039;map&#039; then&lt;br /&gt;
        local Section = A[&#039;Section&#039;];&lt;br /&gt;
        local Inset = A[&#039;Inset&#039;];&lt;br /&gt;
        if first_set( Pages, Page, At ) ~= nil or sepc ~= &#039;.&#039; then&lt;br /&gt;
            if is_set( Section ) then&lt;br /&gt;
                Section = &amp;quot;, &amp;quot; .. wrap( &#039;section&#039;, Section, true );&lt;br /&gt;
            end&lt;br /&gt;
            if is_set( Inset ) then&lt;br /&gt;
                Inset = &amp;quot;, &amp;quot; .. wrap( &#039;inset&#039;, Inset, true );&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if is_set( Section ) then&lt;br /&gt;
                Section = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;section&#039;, Section, use_lowercase );&lt;br /&gt;
                if is_set( Inset ) then&lt;br /&gt;
                    Inset = &amp;quot;, &amp;quot; .. wrap( &#039;inset&#039;, Inset, true );&lt;br /&gt;
                end&lt;br /&gt;
            elseif is_set( Inset ) then&lt;br /&gt;
                Inset = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;inset&#039;, Inset, use_lowercase );&lt;br /&gt;
            end            &lt;br /&gt;
        end            &lt;br /&gt;
        At = At .. Section .. Inset;        &lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
	--[[Look in the list of iso639-1 language codes to see if the value provided in the language parameter matches one of them.  If a match is found, &lt;br /&gt;
	use that value; if not, then use the value that was provided with the language parameter.&lt;br /&gt;
	&lt;br /&gt;
	Categories are assigned in a manner similar to the {{xx icon}} templates - categorizes only mainspace citations and only when the language code is not &#039;en&#039; (English).&lt;br /&gt;
	]]&lt;br /&gt;
	if is_set (Language) then&lt;br /&gt;
		local name = cfg.iso639_1[Language:lower()];		-- get the language name if Language parameter has a valid iso 639-1 code&lt;br /&gt;
		if nil == name then&lt;br /&gt;
			Language=&amp;quot; &amp;quot; .. wrap( &#039;language&#039;, Language );	-- no match, use parameter&#039;s value&lt;br /&gt;
		else&lt;br /&gt;
			if 0 == this_page.namespace and &#039;en&#039; ~= Language:lower() then	--found a match; is this page main / article space and English not the language?&lt;br /&gt;
				Language=&amp;quot; &amp;quot; .. wrap( &#039;language&#039;, name .. &#039;[[Category:Articles with &#039; .. name .. &#039;-language external links]]&#039; );	-- in main space and not English: categorize&lt;br /&gt;
			else&lt;br /&gt;
				Language=&amp;quot; &amp;quot; .. wrap( &#039;language&#039;, name );	--not in mainspace or language is English so don&#039;t categorize&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		Language=&amp;quot;&amp;quot;;	-- language not specified so make sure this is an empty string;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	Others = is_set(Others) and (sepc .. &amp;quot; &amp;quot; .. Others) or &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
-- handle type parameter for those CS1 citations that have default values&lt;br /&gt;
&lt;br /&gt;
	if inArray(config.CitationClass, {&amp;quot;pressrelease&amp;quot;,&amp;quot;techreport&amp;quot;,&amp;quot;thesis&amp;quot;, &amp;quot;speech&amp;quot;}) then&lt;br /&gt;
		TitleType = set_titletype (config.CitationClass, TitleType);&lt;br /&gt;
		if is_set(Degree) and &amp;quot;Thesis&amp;quot; == TitleType then	-- special case for cite thesis&lt;br /&gt;
			TitleType = Degree .. &amp;quot; thesis&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set(TitleType) then					-- if type parameter is specified&lt;br /&gt;
		TitleType = &amp;quot; (&amp;quot; .. TitleType .. &amp;quot;)&amp;quot;;	-- display it in parentheses&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	TitleNote = is_set(TitleNote) and (sepc .. &amp;quot; &amp;quot; .. TitleNote) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Edition = is_set(Edition) and (&amp;quot; &amp;quot; .. wrap( &#039;edition&#039;, Edition )) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Issue = is_set(Issue) and (&amp;quot; (&amp;quot; .. Issue .. &amp;quot;)&amp;quot;) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Series = is_set(Series) and (sepc .. &amp;quot; &amp;quot; .. Series) or &amp;quot;&amp;quot;;&lt;br /&gt;
    OrigYear = is_set(OrigYear) and (&amp;quot; [&amp;quot; .. OrigYear .. &amp;quot;]&amp;quot;) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Agency = is_set(Agency) and (sepc .. &amp;quot; &amp;quot; .. Agency) or &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Volume) then&lt;br /&gt;
        if ( mw.ustring.len(Volume) &amp;gt; 4 )&lt;br /&gt;
          then Volume = sepc ..&amp;quot; &amp;quot; .. Volume;&lt;br /&gt;
          else Volume = &amp;quot; &amp;lt;b&amp;gt;&amp;quot; .. hyphentodash(Volume) .. &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    ------------------------------------ totally unrelated data&lt;br /&gt;
    --[[ Loosely mimic {{subscription required}} template; Via parameter identifies a delivery source that is not the publisher; these sources often, but not always, exist&lt;br /&gt;
    behind a registration or paywall.  So here, we&#039;ve chosen to decouple via from subscription (via has never been part of the registration required template).&lt;br /&gt;
    &lt;br /&gt;
    Subscription implies paywall; Registration does not.  If both are used in a citation, the subscription required link note is displayed. There are no error messages for this condition.&lt;br /&gt;
    ]]&lt;br /&gt;
    if is_set(Via) then&lt;br /&gt;
        Via = &amp;quot; &amp;quot; .. wrap( &#039;via&#039;, Via );&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if is_set(SubscriptionRequired) then&lt;br /&gt;
        SubscriptionRequired = sepc .. &amp;quot; &amp;quot; .. cfg.messages[&#039;subscription&#039;]; --here when &#039;via&#039; parameter not used but &#039;subscription&#039; is&lt;br /&gt;
    elseif is_set(RegistrationRequired) then&lt;br /&gt;
        SubscriptionRequired = sepc .. &amp;quot; &amp;quot; .. cfg.messages[&#039;registration&#039;]; --here when &#039;via&#039; and &#039;subscription&#039; parameters not used but &#039;registration&#039; is&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if is_set(AccessDate) then&lt;br /&gt;
        local retrv_text = &amp;quot; &amp;quot; .. cfg.messages[&#039;retrieved&#039;]&lt;br /&gt;
        if (sepc ~= &amp;quot;.&amp;quot;) then retrv_text = retrv_text:lower() end&lt;br /&gt;
        AccessDate = &#039;&amp;lt;span class=&amp;quot;reference-accessdate&amp;quot;&amp;gt;&#039; .. sepc&lt;br /&gt;
            .. substitute( retrv_text, {AccessDate} ) .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(ID) then ID = sepc ..&amp;quot; &amp;quot;.. ID; end&lt;br /&gt;
   	if &amp;quot;thesis&amp;quot; == config.CitationClass and is_set(Docket) then&lt;br /&gt;
		ID = sepc ..&amp;quot; Docket &amp;quot;.. Docket .. ID;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    ID_list = buildidlist( ID_list, {DoiBroken = DoiBroken, ASINTLD = ASINTLD, IgnoreISBN = IgnoreISBN, Embargo=Embargo} );&lt;br /&gt;
&lt;br /&gt;
    if is_set(URL) then&lt;br /&gt;
        URL = &amp;quot; &amp;quot; .. externallink( URL, nil, URLorigin );&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if is_set(Quote) then&lt;br /&gt;
        if Quote:sub(1,1) == &#039;&amp;quot;&#039; and Quote:sub(-1,-1) == &#039;&amp;quot;&#039; then&lt;br /&gt;
            Quote = Quote:sub(2,-2);&lt;br /&gt;
        end&lt;br /&gt;
        Quote = sepc ..&amp;quot; &amp;quot; .. wrap( &#039;quoted-text&#039;, Quote ); &lt;br /&gt;
        PostScript = &amp;quot;&amp;quot;;&lt;br /&gt;
    elseif PostScript:lower() == &amp;quot;none&amp;quot; then&lt;br /&gt;
        PostScript = &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Archived&lt;br /&gt;
    if is_set(ArchiveURL) then&lt;br /&gt;
        if not is_set(ArchiveDate) then&lt;br /&gt;
            ArchiveDate = seterror(&#039;archive_missing_date&#039;);&lt;br /&gt;
        end&lt;br /&gt;
        if &amp;quot;no&amp;quot; == DeadURL then&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( cfg.messages[&#039;archived-not-dead&#039;],&lt;br /&gt;
                { externallink( ArchiveURL, arch_text ), ArchiveDate } );&lt;br /&gt;
            if not is_set(OriginalURL) then&lt;br /&gt;
                Archived = Archived .. &amp;quot; &amp;quot; .. seterror(&#039;archive_missing_url&#039;);                               &lt;br /&gt;
            end&lt;br /&gt;
        elseif is_set(OriginalURL) then&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived-dead&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( arch_text,&lt;br /&gt;
                { externallink( OriginalURL, cfg.messages[&#039;original&#039;] ), ArchiveDate } );&lt;br /&gt;
        else&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived-missing&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( arch_text, &lt;br /&gt;
                { seterror(&#039;archive_missing_url&#039;), ArchiveDate } );&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        Archived = &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Lay&lt;br /&gt;
    if is_set(LayURL) then&lt;br /&gt;
        if is_set(LayDate) then LayDate = &amp;quot; (&amp;quot; .. LayDate .. &amp;quot;)&amp;quot; end&lt;br /&gt;
        if is_set(LaySource) then &lt;br /&gt;
            LaySource = &amp;quot; &amp;amp;ndash; &#039;&#039;&amp;quot; .. safeforitalics(LaySource) .. &amp;quot;&#039;&#039;&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            LaySource = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if sepc == &#039;.&#039; then&lt;br /&gt;
            Lay = sepc .. &amp;quot; &amp;quot; .. externallink( LayURL, cfg.messages[&#039;lay summary&#039;] ) .. LaySource .. LayDate&lt;br /&gt;
        else&lt;br /&gt;
            Lay = sepc .. &amp;quot; &amp;quot; .. externallink( LayURL, cfg.messages[&#039;lay summary&#039;]:lower() ) .. LaySource .. LayDate&lt;br /&gt;
        end            &lt;br /&gt;
    else&lt;br /&gt;
        Lay = &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Transcript) then&lt;br /&gt;
        if is_set(TranscriptURL) then Transcript = externallink( TranscriptURL, Transcript ); end&lt;br /&gt;
    elseif is_set(TranscriptURL) then&lt;br /&gt;
        Transcript = externallink( TranscriptURL, nil, TranscriptURLorigin );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Publisher;&lt;br /&gt;
    if is_set(Periodical) and&lt;br /&gt;
        not inArray(config.CitationClass, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;pressrelease&amp;quot;}) then&lt;br /&gt;
        if is_set(PublisherName) then&lt;br /&gt;
            if is_set(PublicationPlace) then&lt;br /&gt;
                Publisher = PublicationPlace .. &amp;quot;: &amp;quot; .. PublisherName;&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = PublisherName;  &lt;br /&gt;
            end&lt;br /&gt;
        elseif is_set(PublicationPlace) then&lt;br /&gt;
            Publisher= PublicationPlace;&lt;br /&gt;
        else &lt;br /&gt;
            Publisher = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(PublicationDate) then&lt;br /&gt;
            if is_set(Publisher) then&lt;br /&gt;
                Publisher = Publisher .. &amp;quot;, &amp;quot; .. wrap( &#039;published&#039;, PublicationDate );&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = PublicationDate;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Publisher) then&lt;br /&gt;
            Publisher = &amp;quot; (&amp;quot; .. Publisher .. &amp;quot;)&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(PublicationDate) then&lt;br /&gt;
            PublicationDate = &amp;quot; (&amp;quot; .. wrap( &#039;published&#039;, PublicationDate ) .. &amp;quot;)&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(PublisherName) then&lt;br /&gt;
            if is_set(PublicationPlace) then&lt;br /&gt;
                Publisher = sepc .. &amp;quot; &amp;quot; .. PublicationPlace .. &amp;quot;: &amp;quot; .. PublisherName .. PublicationDate;&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = sepc .. &amp;quot; &amp;quot; .. PublisherName .. PublicationDate;  &lt;br /&gt;
            end            &lt;br /&gt;
        elseif is_set(PublicationPlace) then &lt;br /&gt;
            Publisher= sepc .. &amp;quot; &amp;quot; .. PublicationPlace .. PublicationDate;&lt;br /&gt;
        else &lt;br /&gt;
            Publisher = PublicationDate;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Several of the above rely upon detecting this as nil, so do it last.&lt;br /&gt;
    if is_set(Periodical) then&lt;br /&gt;
        if is_set(Title) or is_set(TitleNote) then &lt;br /&gt;
            Periodical = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;italic-title&#039;, Periodical ) &lt;br /&gt;
        else &lt;br /&gt;
            Periodical = wrap( &#039;italic-title&#039;, Periodical )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Piece all bits together at last.  Here, all should be non-nil.&lt;br /&gt;
    -- We build things this way because it is more efficient in LUA&lt;br /&gt;
    -- not to keep reassigning to the same string variable over and over.&lt;br /&gt;
&lt;br /&gt;
    local tcommon&lt;br /&gt;
    if inArray(config.CitationClass, {&amp;quot;journal&amp;quot;,&amp;quot;citation&amp;quot;}) and is_set(Periodical) then&lt;br /&gt;
        if is_set(Others) then Others = Others .. sepc .. &amp;quot; &amp;quot; end&lt;br /&gt;
        tcommon = safejoin( {Others, Title, TitleNote, Conference, Periodical, Format, TitleType, Scale, Series, &lt;br /&gt;
            Language, Cartography, Edition, Publisher, Agency, Volume, Issue}, sepc );&lt;br /&gt;
    else &lt;br /&gt;
        tcommon = safejoin( {Title, TitleNote, Conference, Periodical, Format, TitleType, Scale, Series, Language, &lt;br /&gt;
            Volume, Issue, Others, Cartography, Edition, Publisher, Agency}, sepc );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if #ID_list &amp;gt; 0 then&lt;br /&gt;
        ID_list = safejoin( { sepc .. &amp;quot; &amp;quot;,  table.concat( ID_list, sepc .. &amp;quot; &amp;quot; ), ID }, sepc );&lt;br /&gt;
    else&lt;br /&gt;
        ID_list = ID;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local idcommon = safejoin( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );&lt;br /&gt;
    local text;&lt;br /&gt;
    local pgtext = Position .. Page .. Pages .. At;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Authors) then&lt;br /&gt;
        if is_set(Coauthors) then&lt;br /&gt;
            Authors = Authors .. A[&#039;AuthorSeparator&#039;] .. &amp;quot; &amp;quot; .. Coauthors&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            Date = &amp;quot; (&amp;quot;..Date..&amp;quot;)&amp;quot; .. OrigYear .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        elseif string.sub(Authors,-1,-1) == sepc then&lt;br /&gt;
            Authors = Authors .. &amp;quot; &amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            Authors = Authors .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Editors) then&lt;br /&gt;
            local in_text = &amp;quot; &amp;quot;;&lt;br /&gt;
            local post_text = &amp;quot;&amp;quot;;&lt;br /&gt;
            if is_set(Chapter) then&lt;br /&gt;
                in_text = in_text .. cfg.messages[&#039;in&#039;] .. &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                    post_text = &amp;quot;, &amp;quot; .. cfg.messages[&#039;editor&#039;];&lt;br /&gt;
                else&lt;br /&gt;
                    post_text = &amp;quot;, &amp;quot; .. cfg.messages[&#039;editors&#039;];&lt;br /&gt;
                end&lt;br /&gt;
            end &lt;br /&gt;
            if (sepc ~= &#039;.&#039;) then in_text = in_text:lower() end&lt;br /&gt;
            Editors = in_text .. Editors .. post_text;&lt;br /&gt;
            if (string.sub(Editors,-1,-1) == sepc)&lt;br /&gt;
                then Editors = Editors .. &amp;quot; &amp;quot;&lt;br /&gt;
                else Editors = Editors .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        text = safejoin( {Authors, Date, Chapter, Place, Editors, tcommon }, sepc );&lt;br /&gt;
        text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
    elseif is_set(Editors) then&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                Editors = Editors .. &amp;quot;, &amp;quot; .. cfg.messages[&#039;editor&#039;];&lt;br /&gt;
            else&lt;br /&gt;
                Editors = Editors .. &amp;quot;, &amp;quot; .. cfg.messages[&#039;editors&#039;];&lt;br /&gt;
            end&lt;br /&gt;
            Date = &amp;quot; (&amp;quot; .. Date ..&amp;quot;)&amp;quot; .. OrigYear .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&#039;editor&#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&#039;editors&#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        text = safejoin( {Editors, Date, Chapter, Place, tcommon}, sepc );&lt;br /&gt;
        text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            if ( string.sub(tcommon,-1,-1) ~= sepc )&lt;br /&gt;
              then Date = sepc ..&amp;quot; &amp;quot; .. Date .. OrigYear&lt;br /&gt;
              else Date = &amp;quot; &amp;quot; .. Date .. OrigYear&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if config.CitationClass==&amp;quot;journal&amp;quot; and is_set(Periodical) then&lt;br /&gt;
            text = safejoin( {Chapter, Place, tcommon}, sepc );&lt;br /&gt;
            text = safejoin( {text, pgtext, Date, idcommon}, sepc );&lt;br /&gt;
        else&lt;br /&gt;
            text = safejoin( {Chapter, Place, tcommon, Date}, sepc );&lt;br /&gt;
            text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(PostScript) and PostScript ~= sepc then&lt;br /&gt;
        text = safejoin( {text, sepc}, sepc );  --Deals with italics, spaces, etc.&lt;br /&gt;
        text = text:sub(1,-2); --Remove final seperator    &lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    text = safejoin( {text, PostScript}, sepc );&lt;br /&gt;
&lt;br /&gt;
    -- Now enclose the whole thing in a &amp;lt;span/&amp;gt; element&lt;br /&gt;
    local options = {};&lt;br /&gt;
    &lt;br /&gt;
    if is_set(config.CitationClass) and config.CitationClass ~= &amp;quot;citation&amp;quot; then&lt;br /&gt;
        options.class = &amp;quot;citation &amp;quot; .. config.CitationClass;&lt;br /&gt;
    else&lt;br /&gt;
        options.class = &amp;quot;citation&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Ref) and Ref:lower() ~= &amp;quot;none&amp;quot; then&lt;br /&gt;
        local id = Ref&lt;br /&gt;
        if ( &amp;quot;harv&amp;quot; == Ref ) then&lt;br /&gt;
            local names = {} --table of last names &amp;amp; year&lt;br /&gt;
            if #a &amp;gt; 0 then&lt;br /&gt;
                for i,v in ipairs(a) do &lt;br /&gt;
                    names[i] = v.last &lt;br /&gt;
                    if i == 4 then break end&lt;br /&gt;
                end&lt;br /&gt;
            elseif #e &amp;gt; 0 then&lt;br /&gt;
                for i,v in ipairs(e) do &lt;br /&gt;
                    names[i] = v.last &lt;br /&gt;
                    if i == 4 then break end                &lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
			names[ #names + 1 ] = first_set(Year, anchor_year);	-- Year first for legacy citations&lt;br /&gt;
--			names[ #names + 1 ] = Year or anchor_year;	-- Year first for legacy citations&lt;br /&gt;
            id = anchorid(names)&lt;br /&gt;
        end&lt;br /&gt;
        options.id = id;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if string.len(text:gsub(&amp;quot;&amp;lt;span[^&amp;gt;/]*&amp;gt;.-&amp;lt;/span&amp;gt;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%b&amp;lt;&amp;gt;&amp;quot;,&amp;quot;&amp;quot;)) &amp;lt;= 2 then&lt;br /&gt;
        z.error_categories = {};&lt;br /&gt;
        text = seterror(&#039;empty_citation&#039;);&lt;br /&gt;
        z.message_tail = {};&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(options.id) then &lt;br /&gt;
        text = &#039;&amp;lt;span id=&amp;quot;&#039; .. mw.uri.anchorEncode(options.id) ..&#039;&amp;quot; class=&amp;quot;&#039; .. mw.text.nowiki(options.class) .. &#039;&amp;quot;&amp;gt;&#039; .. text .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        text = &#039;&amp;lt;span class=&amp;quot;&#039; .. mw.text.nowiki(options.class) .. &#039;&amp;quot;&amp;gt;&#039; .. text .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
    end        &lt;br /&gt;
&lt;br /&gt;
    local empty_span = &#039;&amp;lt;span style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    -- Note: Using display: none on then COinS span breaks some clients.&lt;br /&gt;
    local OCinS = &#039;&amp;lt;span title=&amp;quot;&#039; .. OCinSoutput .. &#039;&amp;quot; class=&amp;quot;Z3988&amp;quot;&amp;gt;&#039; .. empty_span .. &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    text = text .. OCinS;&lt;br /&gt;
    &lt;br /&gt;
    if #z.message_tail ~= 0 then&lt;br /&gt;
        text = text .. &amp;quot; &amp;quot;;&lt;br /&gt;
        for i,v in ipairs( z.message_tail ) do&lt;br /&gt;
            if is_set(v[1]) then&lt;br /&gt;
                if i == #z.message_tail then&lt;br /&gt;
                    text = text .. errorcomment( v[1], v[2] );&lt;br /&gt;
                else&lt;br /&gt;
                    text = text .. errorcomment( v[1] .. &amp;quot;; &amp;quot;, v[2] );&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    no_tracking_cats = no_tracking_cats:lower();&lt;br /&gt;
    if inArray(no_tracking_cats, {&amp;quot;&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;n&amp;quot;}) then&lt;br /&gt;
        for _, v in ipairs( z.error_categories ) do&lt;br /&gt;
            text = text .. &#039;[[Category:&#039; .. v ..&#039;]]&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This is used by templates such as {{cite book}} to create the actual citation text.&lt;br /&gt;
function z.citation(frame)&lt;br /&gt;
    local pframe = frame:getParent()&lt;br /&gt;
    &lt;br /&gt;
    local args = {};&lt;br /&gt;
    local suggestions = {};&lt;br /&gt;
    local error_text, error_state;&lt;br /&gt;
&lt;br /&gt;
    local config = {};&lt;br /&gt;
    for k, v in pairs( frame.args ) do&lt;br /&gt;
        config[k] = v;&lt;br /&gt;
        args[k] = v;       &lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
    for k, v in pairs( pframe.args ) do&lt;br /&gt;
        if v ~= &#039;&#039; then&lt;br /&gt;
            if not validate( k ) then            &lt;br /&gt;
                error_text = &amp;quot;&amp;quot;;&lt;br /&gt;
                if type( k ) ~= &#039;string&#039; then&lt;br /&gt;
                    -- Exclude empty numbered parameters&lt;br /&gt;
                    if v:match(&amp;quot;%S+&amp;quot;) ~= nil then&lt;br /&gt;
                        error_text, error_state = seterror( &#039;text_ignored&#039;, {v}, true );&lt;br /&gt;
                    end&lt;br /&gt;
                elseif validate( k:lower() ) then &lt;br /&gt;
                    error_text, error_state = seterror( &#039;parameter_ignored_suggest&#039;, {k, k:lower()}, true );&lt;br /&gt;
                else&lt;br /&gt;
                    if #suggestions == 0 then&lt;br /&gt;
                        suggestions = mw.loadData( &#039;Module:Citation/CS1/Suggestions&#039; );&lt;br /&gt;
                    end&lt;br /&gt;
                    if suggestions[ k:lower() ] ~= nil then&lt;br /&gt;
                        error_text, error_state = seterror( &#039;parameter_ignored_suggest&#039;, {k, suggestions[ k:lower() ]}, true );&lt;br /&gt;
                    else&lt;br /&gt;
                        error_text, error_state = seterror( &#039;parameter_ignored&#039;, {k}, true );&lt;br /&gt;
                    end&lt;br /&gt;
                end                  &lt;br /&gt;
                if error_text ~= &#039;&#039; then&lt;br /&gt;
                    table.insert( z.message_tail, {error_text, error_state} );&lt;br /&gt;
                end                &lt;br /&gt;
            end&lt;br /&gt;
            args[k] = v;&lt;br /&gt;
        elseif args[k] ~= nil or (k == &#039;postscript&#039;) then&lt;br /&gt;
            args[k] = v;&lt;br /&gt;
        end        &lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    return citation0( config, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return z&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1/Configuration&amp;diff=23895</id>
		<title>Module:Citation/CS1/Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1/Configuration&amp;diff=23895"/>
		<updated>2013-12-14T18:30:37Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Sync from sandbox; adds deprecated error message;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;citation_config = {};&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
List of namespaces that should not be included in citation&lt;br /&gt;
error categories.  Same as setting notracking = true by default&lt;br /&gt;
&lt;br /&gt;
Note: Namespace names should use underscores instead of spaces.&lt;br /&gt;
]]&lt;br /&gt;
citation_config.uncategorized_namespaces = { &#039;User&#039;, &#039;Talk&#039;, &#039;User_talk&#039;, &#039;Wikipedia_talk&#039;, &#039;File_talk&#039;, &#039;Template_talk&#039;,&lt;br /&gt;
	&#039;Help_talk&#039;, &#039;Category_talk&#039;, &#039;Portal_talk&#039;, &#039;Book_talk&#039;, &#039;Education_Program_talk&#039;, &#039;Module_talk&#039;, &#039;MediaWiki_talk&#039; };&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Translation table&lt;br /&gt;
&lt;br /&gt;
The following contains fixed text that may be output as part of a citation.&lt;br /&gt;
This is separated from the main body to aid in future translations of this&lt;br /&gt;
module.&lt;br /&gt;
]]&lt;br /&gt;
citation_config.messages = {&lt;br /&gt;
  [&#039;published&#039;] = &#039;published $1&#039;,&lt;br /&gt;
  [&#039;lay summary&#039;] = &#039;Lay summary&#039;,&lt;br /&gt;
  [&#039;retrieved&#039;] = &#039;Retrieved $1&#039;,&lt;br /&gt;
  [&#039;inactive&#039;] = &#039;inactive&#039;,&lt;br /&gt;
  [&#039;archived-dead&#039;] = &#039;Archived from $1 on $2&#039;,&lt;br /&gt;
  [&#039;archived-not-dead&#039;] = &#039;$1 from the original on $2&#039;,&lt;br /&gt;
  [&#039;archived-missing&#039;] = &#039;Archived from the original$1 on $2&#039;,&lt;br /&gt;
  [&#039;archived&#039;] = &#039;Archived&#039;,&lt;br /&gt;
  [&#039;original&#039;] = &#039;the original&#039;,&lt;br /&gt;
  [&#039;editor&#039;] = &#039;ed.&#039;,&lt;br /&gt;
  [&#039;editors&#039;] = &#039;eds.&#039;, &lt;br /&gt;
  [&#039;edition&#039;] = &#039;($1 ed.)&#039;, &lt;br /&gt;
  [&#039;episode&#039;] = &#039;episode&#039;,&lt;br /&gt;
  [&#039;season&#039;] = &#039;season&#039;, &lt;br /&gt;
  [&#039;series&#039;] = &#039;series&#039;,&lt;br /&gt;
  [&#039;cartography&#039;] = &#039;Cartography by $1&#039;,&lt;br /&gt;
  [&#039;section&#039;] = &#039;Section $1&#039;,&lt;br /&gt;
  [&#039;inset&#039;] = &#039;$1 inset&#039;,&lt;br /&gt;
  [&#039;written&#039;] = &#039;Written at $1&#039;,&lt;br /&gt;
  [&#039;in&#039;] = &#039;In&#039;,&lt;br /&gt;
  [&#039;et al&#039;] = &#039;et al.&#039;, &lt;br /&gt;
  &lt;br /&gt;
  [&#039;subscription&#039;] = &#039;&amp;lt;span style=&amp;quot;font-size:0.95em; font-size:90%; color:#555&amp;quot;&amp;gt;(subscription required (&amp;lt;span title=&amp;quot;Sources are not required to be available online. Online sources do not have to be freely available. The site may require a paid subscription.&amp;quot; style=&amp;quot;border-bottom:1px dotted;cursor:help&amp;quot;&amp;gt;help&amp;lt;/span&amp;gt;))&amp;lt;/span&amp;gt;&#039; ..&lt;br /&gt;
  	&#039;[[Category:Pages containing links to subscription-only content]]&#039;, &lt;br /&gt;
&lt;br /&gt;
  [&#039;registration&#039;]=&#039;&amp;lt;span style=&amp;quot;font-size:0.95em; font-size:90%; color:#555&amp;quot;&amp;gt;(registration required (&amp;lt;span title=&amp;quot;Sources are not required to be available online. Online sources do not have to be freely available. The site may require registration.&amp;quot; style=&amp;quot;border-bottom:1px dotted;cursor:help&amp;quot;&amp;gt;help&amp;lt;/span&amp;gt;))&amp;lt;/span&amp;gt;&#039; ..&lt;br /&gt;
  	&#039;[[Category:Pages with login required references or sources]]&#039;,&lt;br /&gt;
  &lt;br /&gt;
  [&#039;language&#039;] = &#039;(in $1)&#039;, &lt;br /&gt;
  [&#039;via&#039;] = &amp;quot; &amp;amp;ndash; via $1&amp;quot;,&lt;br /&gt;
  [&#039;event&#039;] = &#039;Event occurs at&#039;,&lt;br /&gt;
  [&#039;minutes&#039;] = &#039;minutes in&#039;, &lt;br /&gt;
&lt;br /&gt;
  [&#039;quoted-title&#039;] = &#039;&amp;quot;$1&amp;quot;&#039;,&lt;br /&gt;
  [&#039;italic-title&#039;] = &amp;quot;&#039;&#039;$1&#039;&#039;&amp;quot;,&lt;br /&gt;
  [&#039;trans-quoted-title&#039;] = &amp;quot;&amp;amp;#91;$1&amp;amp;#93;&amp;quot;,&lt;br /&gt;
  [&#039;trans-italic-title&#039;] = &amp;quot;&amp;amp;#91;&#039;&#039;$1&#039;&#039;&amp;amp;#93;&amp;quot;,&lt;br /&gt;
  [&#039;quoted-text&#039;] = &#039;&amp;quot;$1&amp;quot;&#039;,&lt;br /&gt;
&lt;br /&gt;
  [&#039;parameter&#039;] = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
  [&#039;parameter-separator&#039;] = &#039;, &#039;,&lt;br /&gt;
  [&#039;parameter-final-separator&#039;] = &#039;, and &#039;,&lt;br /&gt;
  [&#039;parameter-pair-separator&#039;] = &#039; and &#039;,&lt;br /&gt;
&lt;br /&gt;
  -- Error output&lt;br /&gt;
  [&#039;hidden-error&#039;] = &#039;&amp;lt;span style=&amp;quot;display:none;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;$1&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
  [&#039;visible-error&#039;] = &#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;$1&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
  &lt;br /&gt;
  -- Determines the location of the help page&lt;br /&gt;
  [&#039;help page link&#039;] = &#039;Help:CS1 errors&#039;,&lt;br /&gt;
  [&#039;help page label&#039;] = &#039;help&#039;,&lt;br /&gt;
  &lt;br /&gt;
  -- Internal errors (should only occur if configuration is bad)&lt;br /&gt;
  [&#039;undefined_error&#039;] = &#039;Called with an undefined error condition&#039;,&lt;br /&gt;
  [&#039;unknown_manual_ID&#039;] = &#039;Unrecognized manual ID mode&#039;,&lt;br /&gt;
  [&#039;unknown_ID_mode&#039;] = &#039;Unrecognized ID mode&#039;,&lt;br /&gt;
  [&#039;unknown_argument_map&#039;] = &#039;Argument map not defined for this variable&#039;,&lt;br /&gt;
  [&#039;bare_url_no_origin&#039;] = &#039;Bare url found but origin indicator is nil or empty&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Aliases table for commonly passed parameters&lt;br /&gt;
citation_config.aliases = {&lt;br /&gt;
    [&#039;AccessDate&#039;] = &#039;accessdate&#039;,&lt;br /&gt;
    [&#039;Agency&#039;] = &#039;agency&#039;,&lt;br /&gt;
    [&#039;AirDate&#039;] = &#039;airdate&#039;,&lt;br /&gt;
    [&#039;ArchiveDate&#039;] = {&#039;archive-date&#039;, &#039;archivedate&#039; },&lt;br /&gt;
    [&#039;ArchiveURL&#039;] = {&#039;archive-url&#039;, &#039;archiveurl&#039; },&lt;br /&gt;
    [&#039;ASINTLD&#039;] = {&#039;ASIN-TLD&#039;, &#039;asin-tld&#039;},&lt;br /&gt;
    [&#039;At&#039;] = &#039;at&#039;,&lt;br /&gt;
    [&#039;Authors&#039;] = {&#039;authors&#039;, &#039;people&#039;},&lt;br /&gt;
    [&#039;AuthorFormat&#039;] = {&amp;quot;author-format&amp;quot;, &amp;quot;authorformat&amp;quot; },&lt;br /&gt;
    [&#039;AuthorSeparator&#039;] = &#039;author-separator&#039;,&lt;br /&gt;
    [&#039;AuthorNameSeparator&#039;] = &#039;author-name-separator&#039;,&lt;br /&gt;
    [&#039;BookTitle&#039;] = &#039;booktitle&#039;,&lt;br /&gt;
    [&#039;Cartography&#039;] = &#039;cartography&#039;,&lt;br /&gt;
    [&#039;Chapter&#039;] = {&#039;chapter&#039;, &#039;contribution&#039;, &#039;entry&#039;, &#039;article&#039;, &#039;section&#039; },&lt;br /&gt;
    [&#039;ChapterLink&#039;] = &#039;chapterlink&#039;,&lt;br /&gt;
    [&#039;ChapterURL&#039;] = {&#039;chapter-url&#039;, &#039;chapterurl&#039;, &#039;contribution-url&#039;, &#039;contributionurl&#039;, &#039;sectionurl&#039; },&lt;br /&gt;
    [&#039;Coauthors&#039;] = {&#039;coauthors&#039;, &#039;coauthor&#039; },&lt;br /&gt;
    [&#039;Conference&#039;] = &#039;conference&#039;,&lt;br /&gt;
    [&#039;ConferenceURL&#039;] = {&#039;conference-url&#039;, &#039;conferenceurl&#039; },&lt;br /&gt;
    [&#039;Date&#039;] = &#039;date&#039;,&lt;br /&gt;
    [&#039;Day&#039;] = &#039;day&#039;,&lt;br /&gt;
    [&#039;DeadURL&#039;] = &#039;deadurl&#039;,&lt;br /&gt;
    [&#039;Degree&#039;] = &#039;degree&#039;,&lt;br /&gt;
    [&#039;DisplayAuthors&#039;] = {&amp;quot;display-authors&amp;quot;, &amp;quot;displayauthors&amp;quot;},&lt;br /&gt;
    [&#039;DisplayEditors&#039;] = {&amp;quot;display-editors&amp;quot;, &amp;quot;displayeditors&amp;quot;},&lt;br /&gt;
    [&#039;Docket&#039;] = &#039;docket&#039;,&lt;br /&gt;
    [&#039;DoiBroken&#039;] = {&#039;doi_inactivedate&#039;, &#039;doi_brokendate&#039;, &#039;DoiBroken&#039;},&lt;br /&gt;
    [&#039;Edition&#039;] = &#039;edition&#039;,&lt;br /&gt;
    [&#039;Editors&#039;] = &#039;editors&#039;,&lt;br /&gt;
    [&#039;EditorFormat&#039;] = {&amp;quot;editor-format&amp;quot;, &amp;quot;editorformat&amp;quot; },&lt;br /&gt;
    [&#039;EditorSeparator&#039;] = &#039;editor-separator&#039;,&lt;br /&gt;
    [&#039;EditorNameSeparator&#039;] = &#039;editor-name-separator&#039;,&lt;br /&gt;
    [&#039;Embargo&#039;] = {&#039;Embargo&#039;, &#039;embargo&#039;},&lt;br /&gt;
    [&#039;Format&#039;] = &#039;format&#039;,&lt;br /&gt;
    [&#039;ID&#039;] = {&#039;id&#039;, &#039;ID&#039;},&lt;br /&gt;
    [&#039;IgnoreISBN&#039;] = {&#039;ignore-isbn-error&#039;, &#039;ignoreisbnerror&#039;},&lt;br /&gt;
    [&#039;Inset&#039;] = &#039;inset&#039;,&lt;br /&gt;
    [&#039;Issue&#039;] = {&#039;issue&#039;, &#039;number&#039;},&lt;br /&gt;
    [&#039;Language&#039;] = {&#039;language&#039;, &#039;in&#039;},&lt;br /&gt;
    [&#039;LastAuthorAmp&#039;] = &#039;lastauthoramp&#039;,&lt;br /&gt;
    [&#039;LayDate&#039;] = &#039;laydate&#039;,&lt;br /&gt;
    [&#039;LaySource&#039;] = &#039;laysource&#039;,&lt;br /&gt;
    [&#039;LayURL&#039;] = {&#039;layurl&#039;, &#039;laysummary&#039;},&lt;br /&gt;
    [&#039;Minutes&#039;] = &#039;minutes&#039;,&lt;br /&gt;
    [&#039;Month&#039;] = &#039;month&#039;,&lt;br /&gt;
    [&#039;NameSeparator&#039;] = &#039;name-separator&#039;,&lt;br /&gt;
    [&#039;Network&#039;] = &#039;network&#039;,&lt;br /&gt;
    [&#039;NoPP&#039;] = &#039;nopp&#039;,&lt;br /&gt;
    [&#039;NoTracking&#039;] = {&amp;quot;template doc demo&amp;quot;, &#039;nocat&#039;, &lt;br /&gt;
        &#039;notracking&#039;, &amp;quot;no-tracking&amp;quot;},&lt;br /&gt;
    [&#039;OrigYear&#039;] = &#039;origyear&#039;,&lt;br /&gt;
    [&#039;Others&#039;] = &#039;others&#039;,&lt;br /&gt;
    [&#039;Page&#039;] = {&#039;p&#039;, &#039;page&#039;},&lt;br /&gt;
    [&#039;Pages&#039;] = {&#039;pp&#039;, &#039;pages&#039;},&lt;br /&gt;
    [&#039;Periodical&#039;] = {&#039;journal&#039;, &#039;newspaper&#039;, &#039;magazine&#039;, &#039;work&#039;,&lt;br /&gt;
        &#039;website&#039;,  &#039;periodical&#039;, &#039;encyclopedia&#039;, &#039;encyclopaedia&#039;, &#039;dictionary&#039;},&lt;br /&gt;
    [&#039;Place&#039;] = {&#039;place&#039;, &#039;location&#039;},&lt;br /&gt;
    [&#039;PPrefix&#039;] = &#039;PPrefix&#039;,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = &#039;PPPrefix&#039;,&lt;br /&gt;
    [&#039;PostScript&#039;] = &#039;postscript&#039;,&lt;br /&gt;
    [&#039;PublicationDate&#039;] = {&#039;publicationdate&#039;, &#039;publication-date&#039; },&lt;br /&gt;
    [&#039;PublicationPlace&#039;] = {&#039;publication-place&#039;, &#039;publicationplace&#039; },&lt;br /&gt;
    [&#039;PublisherName&#039;] = {&#039;publisher&#039;, &#039;distributor&#039;, &#039;institution&#039;},&lt;br /&gt;
    [&#039;Quote&#039;] = {&#039;quote&#039;, &#039;quotation&#039;},&lt;br /&gt;
    [&#039;Ref&#039;] = {&#039;ref&#039;, &#039;Ref&#039;},&lt;br /&gt;
    [&#039;RegistrationRequired&#039;] = &#039;registration&#039;,&lt;br /&gt;
    [&#039;Scale&#039;] = &#039;scale&#039;,&lt;br /&gt;
    [&#039;Section&#039;] = &#039;section&#039;,&lt;br /&gt;
    [&#039;Season&#039;] = &#039;season&#039;,&lt;br /&gt;
    [&#039;Separator&#039;] = &#039;separator&#039;,&lt;br /&gt;
    [&#039;Series&#039;] = {&#039;series&#039;, &#039;version&#039;},&lt;br /&gt;
    [&#039;SeriesSeparator&#039;] = &#039;series-separator&#039;,&lt;br /&gt;
    [&#039;SeriesLink&#039;] = &#039;serieslink&#039;,&lt;br /&gt;
    [&#039;SeriesNumber&#039;] = {&#039;seriesnumber&#039;, &#039;seriesno&#039;},&lt;br /&gt;
    [&#039;Station&#039;] = &#039;station&#039;,&lt;br /&gt;
    [&#039;SubscriptionRequired&#039;] = &#039;subscription&#039;,&lt;br /&gt;
    [&#039;Time&#039;] = &#039;time&#039;,&lt;br /&gt;
    [&#039;TimeCaption&#039;] = &#039;timecaption&#039;,&lt;br /&gt;
    [&#039;Title&#039;] = &#039;title&#039;,&lt;br /&gt;
    [&#039;TitleLink&#039;] = {&#039;titlelink&#039;, &#039;episodelink&#039; },&lt;br /&gt;
    [&#039;TitleNote&#039;] = &#039;department&#039;,&lt;br /&gt;
    [&#039;TitleType&#039;] = {&#039;type&#039;, &#039;medium&#039;},&lt;br /&gt;
    [&#039;TransChapter&#039;] = {&#039;trans-chapter&#039;, &#039;trans_chapter&#039; },&lt;br /&gt;
    [&#039;Transcript&#039;] = &#039;transcript&#039;,&lt;br /&gt;
    [&#039;TranscriptURL&#039;] = {&#039;transcript-url&#039;, &#039;transcripturl&#039;},&lt;br /&gt;
    [&#039;TransTitle&#039;] = {&#039;trans-title&#039;, &#039;trans_title&#039; },&lt;br /&gt;
    [&#039;URL&#039;] = {&#039;url&#039;, &#039;URL&#039;},&lt;br /&gt;
    [&#039;Via&#039;] = &#039;via&#039;,&lt;br /&gt;
    [&#039;Volume&#039;] = &#039;volume&#039;,&lt;br /&gt;
    [&#039;Year&#039;] = &#039;year&#039;,&lt;br /&gt;
&lt;br /&gt;
    [&#039;AuthorList-First&#039;] = {&amp;quot;author#-first&amp;quot;, &amp;quot;author-first#&amp;quot;,&lt;br /&gt;
        &amp;quot;first#&amp;quot;, &amp;quot;given#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Last&#039;] = {&amp;quot;author#-last&amp;quot;, &amp;quot;author-last#&amp;quot;, &lt;br /&gt;
        &amp;quot;last#&amp;quot;, &amp;quot;surname#&amp;quot;, &amp;quot;Author#&amp;quot;, &amp;quot;author#&amp;quot;, &amp;quot;authors#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Link&#039;] = {&amp;quot;author#-link&amp;quot;, &amp;quot;author-link#&amp;quot;, &lt;br /&gt;
        &amp;quot;author#link&amp;quot;, &amp;quot;authorlink#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Mask&#039;] = {&amp;quot;author#-mask&amp;quot;, &amp;quot;author-mask#&amp;quot;, &lt;br /&gt;
        &amp;quot;author#mask&amp;quot;, &amp;quot;authormask#&amp;quot;},&lt;br /&gt;
    &lt;br /&gt;
    [&#039;EditorList-First&#039;] = {&amp;quot;editor#-first&amp;quot;, &lt;br /&gt;
        &amp;quot;editor-first#&amp;quot;, &amp;quot;EditorGiven#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Last&#039;] = {&amp;quot;editor#-last&amp;quot;, &amp;quot;editor-last#&amp;quot;,&lt;br /&gt;
        &amp;quot;EditorSurname#&amp;quot;, &amp;quot;Editor#&amp;quot;, &amp;quot;editor#&amp;quot;, &amp;quot;editors#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Link&#039;] = {&amp;quot;editor#-link&amp;quot;, &amp;quot;editor-link#&amp;quot;, &lt;br /&gt;
        &amp;quot;editor#link&amp;quot;, &amp;quot;editorlink#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Mask&#039;] = {&amp;quot;editor#-mask&amp;quot;, &amp;quot;editor-mask#&amp;quot;, &lt;br /&gt;
        &amp;quot;editor#mask&amp;quot;, &amp;quot;editormask#&amp;quot;},&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Default parameter values&lt;br /&gt;
citation_config.defaults = {&lt;br /&gt;
    [&#039;DeadURL&#039;] = &#039;yes&#039;,&lt;br /&gt;
    [&#039;PostScript&#039;] = &#039;.&#039;,&lt;br /&gt;
    [&#039;Separator&#039;] = &#039;.&#039;,&lt;br /&gt;
    [&#039;AuthorSeparator&#039;] = &#039;;&#039;,&lt;br /&gt;
    [&#039;EditorSeparator&#039;] = &#039;;&#039;,&lt;br /&gt;
    [&#039;NameSeparator&#039;] = &#039;,&#039;,&lt;br /&gt;
    [&#039;PPrefix&#039;] = &amp;quot;p.&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = &amp;quot;pp.&amp;amp;nbsp;&amp;quot;,    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Error condition table&lt;br /&gt;
&lt;br /&gt;
The following contains a list of IDs for various error conditions defined in the &lt;br /&gt;
code.  For each ID, we specify a text message to display, an error category to&lt;br /&gt;
include, and whether the error message should be wrapped as a hidden comment.&lt;br /&gt;
&lt;br /&gt;
Anchor changes require identical changes to matching anchor in Help:CS1 errors&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
citation_config.error_conditions = {&lt;br /&gt;
	accessdate_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;accessdate=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;accessdate_missing_url&#039;,&lt;br /&gt;
		category = &#039;Pages using citations with accessdate and no URL&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	archive_missing_date = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;archiveurl=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;archivedate=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;archive_missing_date&#039;,&lt;br /&gt;
		category = &#039;Pages with archiveurl citation errors‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	archive_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;archiveurl=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;archive_missing_url&#039;,&lt;br /&gt;
		category = &#039;Pages with archiveurl citation errors‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_date = {&lt;br /&gt;
		message = &#039;Check date values in: &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;bad_date&#039;,&lt;br /&gt;
		category = &#039;CS1 errors: dates&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	bad_doi = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;doi=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_doi&#039;,&lt;br /&gt;
		category = &#039;Pages with DOI errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_isbn = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;isbn=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_isbn&#039;,&lt;br /&gt;
		category = &#039;Pages with ISBN errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_issn = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;issn=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_issn&#039;,&lt;br /&gt;
		category = &#039;CS1 errors: ISSN&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_ol = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;ol=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_ol&#039;,&lt;br /&gt;
		category = &#039;Pages with OL errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_url = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt; scheme&#039;,&lt;br /&gt;
		anchor = &#039;bad_url&#039;,&lt;br /&gt;
		category = &#039;Pages with URL errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bare_url_missing_title = {&lt;br /&gt;
		message = &#039;$1 missing title&#039;,&lt;br /&gt;
		anchor = &#039;bare_url_missing_title&#039;,&lt;br /&gt;
		category = &#039;Pages with citations having bare URLs‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	citation_missing_title = {&lt;br /&gt;
		message = &#039;Missing or empty &amp;lt;code&amp;gt;&amp;amp;#124;title=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;citation_missing_title&#039;,&lt;br /&gt;
		category = &#039;Pages with citations lacking titles‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	cite_web_url = {&lt;br /&gt;
		message = &#039;Missing or empty &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;cite_web_url&#039;,&lt;br /&gt;
		category = &#039;Pages using web citations with no URL‎&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	coauthors_missing_author = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;coauthors=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;author=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;coauthors_missing_author&#039;,&lt;br /&gt;
		category = &#039;CS1 errors: coauthors without author‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	deprecated_params = {&lt;br /&gt;
		message = &#039;Cite uses deprecated parameters&#039;,&lt;br /&gt;
		anchor = &#039;deprecated_params&#039;,&lt;br /&gt;
		category = &#039;Pages containing cite templates with deprecated parameters‎&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	empty_citation = {&lt;br /&gt;
		message = &#039;Empty citation‎&#039;,&lt;br /&gt;
		anchor = &#039;empty_citation&#039;,&lt;br /&gt;
		category = &#039;Pages with empty citations‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	extra_pages = {&lt;br /&gt;
		message = &#039;Extra &amp;lt;code&amp;gt;&amp;amp;#124;pages=&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;amp;#124;at=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;extra_pages&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using conflicting page specifications‎&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	format_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;format=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;format_missing_url&#039;,&lt;br /&gt;
		category = &#039;Pages using citations with format and no URL‎&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	implict_etal_author = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;displayauthors=&amp;lt;/code&amp;gt; suggested&#039;,&lt;br /&gt;
		anchor = &#039;displayauthors&#039;,&lt;br /&gt;
		category = &#039;Pages using citations with old-style implicit et al.‎&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	implict_etal_editor = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;displayeditors=&amp;lt;/code&amp;gt; suggested&#039;,&lt;br /&gt;
		anchor = &#039;displayeditors&#039;,&lt;br /&gt;
		category = &#039;Pages using citations with old-style implicit et al.‎&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	parameter_ignored = {&lt;br /&gt;
		message = &#039;Unknown parameter &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignored&#039;,&lt;br /&gt;
		anchor = &#039;parameter_ignored&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using unsupported parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	parameter_ignored_suggest = {&lt;br /&gt;
		message = &#039;Unknown parameter &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignored (&amp;lt;code&amp;gt;&amp;amp;#124;$2=&amp;lt;/code&amp;gt; suggested)&#039;,&lt;br /&gt;
		anchor = &#039;parameter_ignored_suggest&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using unsupported parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	redundant_parameters = {&lt;br /&gt;
		message = &#039;More than one of $1 specified&#039;,&lt;br /&gt;
		anchor = &#039;redundant_parameters&#039;,&lt;br /&gt;
		category = &#039;Pages with citations having redundant parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	text_ignored = {&lt;br /&gt;
		message = &#039;Text &amp;quot;$1&amp;quot; ignored&#039;,&lt;br /&gt;
		anchor = &#039;text_ignored&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using unnamed parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	trans_missing_chapter = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;trans_chapter=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;chapter=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;trans_missing_chapter&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using translated terms without the original&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	trans_missing_title = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;trans_title=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;title=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;trans_missing_title&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using translated terms without the original&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	wikilink_in_url = {&lt;br /&gt;
		message = &#039;Wikilink embedded in URL title&#039;,&lt;br /&gt;
		anchor = &#039;wikilink_in_url&#039;,&lt;br /&gt;
		category = &#039;Pages with citations having wikilinks embedded in URL titles&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
citation_config.id_handlers = {&lt;br /&gt;
    [&#039;ARXIV&#039;] = {&lt;br /&gt;
        parameters = {&#039;arxiv&#039;, &#039;ARXIV&#039;}, &lt;br /&gt;
        link = &#039;arXiv&#039;,&lt;br /&gt;
        label = &#039;arXiv&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//arxiv.org/abs/&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        encode = false,&lt;br /&gt;
        COinS = &#039;info:arxiv&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ASIN&#039;] = {&lt;br /&gt;
        parameters = { &#039;asin&#039;, &#039;ASIN&#039; },       &lt;br /&gt;
        link = &#039;Amazon Standard Identification Number&#039;,&lt;br /&gt;
        label = &#039;ASIN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        COinS = &#039;info:asin&#039;,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
        encode = false;&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;BIBCODE&#039;] = {&lt;br /&gt;
        parameters = {&#039;bibcode&#039;, &#039;BIBCODE&#039;}, &lt;br /&gt;
        link = &#039;Bibcode&#039;,&lt;br /&gt;
        label = &#039;Bibcode&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://adsabs.harvard.edu/abs/&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        COinS = &#039;info:bibcode&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;DOI&#039;] = {&lt;br /&gt;
        parameters = { &#039;doi&#039;, &#039;DOI&#039; },&lt;br /&gt;
        link = &#039;Digital object identifier&#039;,&lt;br /&gt;
        label = &#039;doi&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;http://dx.doi.org/&#039;,&lt;br /&gt;
        COinS = &#039;info:doi&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ISBN&#039;] = {&lt;br /&gt;
        parameters = {&#039;isbn&#039;, &#039;ISBN&#039;, &#039;isbn13&#039;, &#039;ISBN13&#039;}, &lt;br /&gt;
        link = &#039;International Standard Book Number&#039;,&lt;br /&gt;
        label = &#039;ISBN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;Special:BookSources/&#039;,&lt;br /&gt;
        COinS = &#039;rft.isbn&#039;,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ISSN&#039;] = {&lt;br /&gt;
        parameters = {&#039;issn&#039;, &#039;ISSN&#039;}, &lt;br /&gt;
        link = &#039;International Standard Serial Number&#039;,&lt;br /&gt;
        label = &#039;ISSN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;//www.worldcat.org/issn/&#039;,&lt;br /&gt;
        COinS = &#039;rft.issn&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;JFM&#039;] = {&lt;br /&gt;
        parameters = {&#039;jfm&#039;, &#039;JFM&#039;}, &lt;br /&gt;
        link = &#039;Jahrbuch über die Fortschritte der Mathematik&#039;,&lt;br /&gt;
        label = &#039;JFM&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://www.zentralblatt-math.org/zmath/en/search/?format=complete&amp;amp;q=an:&#039;,&lt;br /&gt;
        COinS = &#039;rft.jfm&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;JSTOR&#039;] = {&lt;br /&gt;
        parameters = {&#039;jstor&#039;, &#039;JSTOR&#039;}, &lt;br /&gt;
        link = &#039;JSTOR&#039;,&lt;br /&gt;
        label = &#039;JSTOR&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.jstor.org/stable/&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;rft.jstor&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;LCCN&#039;] = {&lt;br /&gt;
        parameters = {&#039;LCCN&#039;, &#039;lccn&#039;}, &lt;br /&gt;
        link = &#039;Library of Congress Control Number&#039;,&lt;br /&gt;
        label = &#039;LCCN&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://lccn.loc.gov/&#039;,&lt;br /&gt;
        COinS = &#039;rft.lccn&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;MR&#039;] = {&lt;br /&gt;
        parameters = {&#039;MR&#039;, &#039;mr&#039;}, &lt;br /&gt;
        link = &#039;Mathematical Reviews&#039;,&lt;br /&gt;
        label = &#039;MR&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.ams.org/mathscinet-getitem?mr=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;rft.mr&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OCLC&#039;] = {&lt;br /&gt;
        parameters = {&#039;OCLC&#039;, &#039;oclc&#039;}, &lt;br /&gt;
        link = &#039;OCLC&#039;,&lt;br /&gt;
        label = &#039;OCLC&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.worldcat.org/oclc/&#039;,&lt;br /&gt;
        COinS = &#039;info:oclcnum&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OL&#039;] = {&lt;br /&gt;
        parameters = { &#039;ol&#039;, &#039;OL&#039; },&lt;br /&gt;
        link = &#039;Open Library&#039;,&lt;br /&gt;
        label = &#039;OL&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        COinS = &#039;info:olnum&#039;,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
        endode = true,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OSTI&#039;] = {&lt;br /&gt;
        parameters = {&#039;OSTI&#039;, &#039;osti&#039;}, &lt;br /&gt;
        link = &#039;Office of Scientific and Technical Information&#039;,&lt;br /&gt;
        label = &#039;OSTI&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.osti.gov/energycitations/product.biblio.jsp?osti_id=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;info:osti&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;PMC&#039;] = {&lt;br /&gt;
        parameters = {&#039;PMC&#039;, &#039;pmc&#039;}, &lt;br /&gt;
        link = &#039;PubMed Central&#039;,&lt;br /&gt;
        label = &#039;PMC&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,		-- changed to support unlinking of PMC identifier when article is embargoed&lt;br /&gt;
        prefix = &#039;//www.ncbi.nlm.nih.gov/pmc/articles/PMC&#039;, &lt;br /&gt;
        suffix = &amp;quot; &amp;quot;,&lt;br /&gt;
        COinS = &#039;info:pmc&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;PMID&#039;] = {&lt;br /&gt;
        parameters = {&#039;PMID&#039;, &#039;pmid&#039;}, &lt;br /&gt;
        link = &#039;PubMed Identifier&#039;,&lt;br /&gt;
        label = &#039;PMID&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.ncbi.nlm.nih.gov/pubmed/&#039;,&lt;br /&gt;
        COinS = &#039;info:pmid&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;RFC&#039;] = {&lt;br /&gt;
        parameters = {&#039;RFC&#039;, &#039;rfc&#039;}, &lt;br /&gt;
        link = &#039;Request for Comments&#039;,&lt;br /&gt;
        label = &#039;RFC&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//tools.ietf.org/html/rfc&#039;,&lt;br /&gt;
        COinS = &#039;info:rfc&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;SSRN&#039;] = {&lt;br /&gt;
        parameters = {&#039;SSRN&#039;, &#039;ssrn&#039;}, &lt;br /&gt;
        link = &#039;Social Science Research Network&#039;,&lt;br /&gt;
        label = &#039;SSRN&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//ssrn.com/abstract=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;info:ssrn&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ZBL&#039;] = {&lt;br /&gt;
        parameters = {&#039;ZBL&#039;, &#039;zbl&#039;}, &lt;br /&gt;
        link = &#039;Zentralblatt MATH&#039;,&lt;br /&gt;
        label = &#039;Zbl&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://www.zentralblatt-math.org/zmath/en/search/?format=complete&amp;amp;q=an:&#039;,&lt;br /&gt;
        COinS = &#039;info:zbl&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--iso639-1 language codes and names.&lt;br /&gt;
citation_config.iso639_1 = {&lt;br /&gt;
    [&amp;quot;aa&amp;quot;]  = &amp;quot;Afar&amp;quot;,&lt;br /&gt;
    [&amp;quot;ab&amp;quot;]  = &amp;quot;Abkhazian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ae&amp;quot;]  = &amp;quot;Avestan&amp;quot;,&lt;br /&gt;
    [&amp;quot;af&amp;quot;]  = &amp;quot;Afrikaans&amp;quot;,&lt;br /&gt;
    [&amp;quot;ak&amp;quot;]  = &amp;quot;Akan&amp;quot;,&lt;br /&gt;
    [&amp;quot;am&amp;quot;]  = &amp;quot;Amharic&amp;quot;,&lt;br /&gt;
    [&amp;quot;an&amp;quot;]  = &amp;quot;Aragonese&amp;quot;,&lt;br /&gt;
    [&amp;quot;ar&amp;quot;]  = &amp;quot;Arabic&amp;quot;,&lt;br /&gt;
    [&amp;quot;as&amp;quot;]  = &amp;quot;Assamese&amp;quot;,&lt;br /&gt;
    [&amp;quot;av&amp;quot;]  = &amp;quot;Avaric&amp;quot;,&lt;br /&gt;
    [&amp;quot;ay&amp;quot;]  = &amp;quot;Aymara&amp;quot;,&lt;br /&gt;
    [&amp;quot;az&amp;quot;]  = &amp;quot;Azerbaijani&amp;quot;,&lt;br /&gt;
    [&amp;quot;ba&amp;quot;]  = &amp;quot;Bashkir&amp;quot;,&lt;br /&gt;
    [&amp;quot;be&amp;quot;]  = &amp;quot;Belarusian&amp;quot;,&lt;br /&gt;
    [&amp;quot;bg&amp;quot;]  = &amp;quot;Bulgarian&amp;quot;,&lt;br /&gt;
    [&amp;quot;bh&amp;quot;]  = &amp;quot;Bihari languages&amp;quot;,&lt;br /&gt;
    [&amp;quot;bi&amp;quot;]  = &amp;quot;Bislama&amp;quot;,&lt;br /&gt;
    [&amp;quot;bm&amp;quot;]  = &amp;quot;Bambara&amp;quot;,&lt;br /&gt;
    [&amp;quot;bn&amp;quot;]  = &amp;quot;Bengali&amp;quot;,&lt;br /&gt;
    [&amp;quot;bo&amp;quot;]  = &amp;quot;Tibetan&amp;quot;,&lt;br /&gt;
    [&amp;quot;br&amp;quot;]  = &amp;quot;Breton&amp;quot;,&lt;br /&gt;
    [&amp;quot;bs&amp;quot;]  = &amp;quot;Bosnian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ca&amp;quot;]  = &amp;quot;Catalan&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ca&amp;quot;]  = &amp;quot;Valencian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ce&amp;quot;]  = &amp;quot;Chechen&amp;quot;,&lt;br /&gt;
    [&amp;quot;ch&amp;quot;]  = &amp;quot;Chamorro&amp;quot;,&lt;br /&gt;
    [&amp;quot;co&amp;quot;]  = &amp;quot;Corsican&amp;quot;,&lt;br /&gt;
    [&amp;quot;cr&amp;quot;]  = &amp;quot;Cree&amp;quot;,&lt;br /&gt;
    [&amp;quot;cs&amp;quot;]  = &amp;quot;Czech&amp;quot;,&lt;br /&gt;
    [&amp;quot;cu&amp;quot;]  = &amp;quot;Church Slavic&amp;quot;,&lt;br /&gt;
--  [&amp;quot;cu&amp;quot;]  = &amp;quot;Old Slavonic&amp;quot;,&lt;br /&gt;
--  [&amp;quot;cu&amp;quot;]  = &amp;quot;Church Slavonic&amp;quot;,&lt;br /&gt;
--  [&amp;quot;cu&amp;quot;]  = &amp;quot;Old Bulgarian&amp;quot;,&lt;br /&gt;
--  [&amp;quot;cu&amp;quot;]  = &amp;quot;Old Church Slavonic&amp;quot;,&lt;br /&gt;
    [&amp;quot;cv&amp;quot;]  = &amp;quot;Chuvash&amp;quot;,&lt;br /&gt;
    [&amp;quot;cy&amp;quot;]  = &amp;quot;Welsh&amp;quot;,&lt;br /&gt;
    [&amp;quot;da&amp;quot;]  = &amp;quot;Danish&amp;quot;,&lt;br /&gt;
    [&amp;quot;de&amp;quot;]  = &amp;quot;German&amp;quot;,&lt;br /&gt;
    [&amp;quot;dv&amp;quot;]  = &amp;quot;Divehi&amp;quot;,&lt;br /&gt;
    [&amp;quot;dv&amp;quot;]  = &amp;quot;Dhivehi&amp;quot;,&lt;br /&gt;
    [&amp;quot;dv&amp;quot;]  = &amp;quot;Maldivian&amp;quot;,&lt;br /&gt;
    [&amp;quot;dz&amp;quot;]  = &amp;quot;Dzongkha&amp;quot;,&lt;br /&gt;
    [&amp;quot;ee&amp;quot;]  = &amp;quot;Ewe&amp;quot;,&lt;br /&gt;
    [&amp;quot;el&amp;quot;]  = &amp;quot;Modern Greek&amp;quot;,&lt;br /&gt;
    [&amp;quot;en&amp;quot;]  = &amp;quot;English&amp;quot;,&lt;br /&gt;
    [&amp;quot;eo&amp;quot;]  = &amp;quot;Esperanto&amp;quot;,&lt;br /&gt;
    [&amp;quot;es&amp;quot;]  = &amp;quot;Spanish&amp;quot;,&lt;br /&gt;
--  [&amp;quot;es&amp;quot;]  = &amp;quot;Castilian&amp;quot;,&lt;br /&gt;
    [&amp;quot;et&amp;quot;]  = &amp;quot;Estonian&amp;quot;,&lt;br /&gt;
    [&amp;quot;eu&amp;quot;]  = &amp;quot;Basque&amp;quot;,&lt;br /&gt;
    [&amp;quot;fa&amp;quot;]  = &amp;quot;Persian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ff&amp;quot;]  = &amp;quot;Fulah&amp;quot;,&lt;br /&gt;
    [&amp;quot;fi&amp;quot;]  = &amp;quot;Finnish&amp;quot;,&lt;br /&gt;
    [&amp;quot;fj&amp;quot;]  = &amp;quot;Fijian&amp;quot;,&lt;br /&gt;
    [&amp;quot;fo&amp;quot;]  = &amp;quot;Faroese&amp;quot;,&lt;br /&gt;
    [&amp;quot;fr&amp;quot;]  = &amp;quot;French&amp;quot;,&lt;br /&gt;
    [&amp;quot;fy&amp;quot;]  = &amp;quot;Western Frisian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ga&amp;quot;]  = &amp;quot;Irish&amp;quot;,&lt;br /&gt;
--  [&amp;quot;gd&amp;quot;]  = &amp;quot;Gaelic&amp;quot;,&lt;br /&gt;
    [&amp;quot;gd&amp;quot;]  = &amp;quot;Scottish Gaelic&amp;quot;,&lt;br /&gt;
    [&amp;quot;gl&amp;quot;]  = &amp;quot;Galician&amp;quot;,&lt;br /&gt;
    [&amp;quot;gn&amp;quot;]  = &amp;quot;Guarani&amp;quot;,&lt;br /&gt;
    [&amp;quot;gu&amp;quot;]  = &amp;quot;Gujarati&amp;quot;,&lt;br /&gt;
    [&amp;quot;gv&amp;quot;]  = &amp;quot;Manx&amp;quot;,&lt;br /&gt;
    [&amp;quot;ha&amp;quot;]  = &amp;quot;Hausa&amp;quot;,&lt;br /&gt;
    [&amp;quot;he&amp;quot;]  = &amp;quot;Hebrew&amp;quot;,&lt;br /&gt;
    [&amp;quot;hi&amp;quot;]  = &amp;quot;Hindi&amp;quot;,&lt;br /&gt;
    [&amp;quot;ho&amp;quot;]  = &amp;quot;Hiri Motu&amp;quot;,&lt;br /&gt;
    [&amp;quot;hr&amp;quot;]  = &amp;quot;Croatian&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ht&amp;quot;]  = &amp;quot;Haitian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ht&amp;quot;]  = &amp;quot;Haitian Creole&amp;quot;,&lt;br /&gt;
    [&amp;quot;hu&amp;quot;]  = &amp;quot;Hungarian&amp;quot;,&lt;br /&gt;
    [&amp;quot;hy&amp;quot;]  = &amp;quot;Armenian&amp;quot;,&lt;br /&gt;
    [&amp;quot;hz&amp;quot;]  = &amp;quot;Herero&amp;quot;,&lt;br /&gt;
    [&amp;quot;ia&amp;quot;]  = &amp;quot;Interlingua&amp;quot;,&lt;br /&gt;
    [&amp;quot;id&amp;quot;]  = &amp;quot;Indonesian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ie&amp;quot;]  = &amp;quot;Interlingue&amp;quot;,&lt;br /&gt;
    [&amp;quot;ie&amp;quot;]  = &amp;quot;Occidental&amp;quot;,&lt;br /&gt;
    [&amp;quot;ig&amp;quot;]  = &amp;quot;Igbo&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ii&amp;quot;]  = &amp;quot;Sichuan Yi&amp;quot;,&lt;br /&gt;
    [&amp;quot;ii&amp;quot;]  = &amp;quot;Nuosu&amp;quot;,&lt;br /&gt;
    [&amp;quot;ik&amp;quot;]  = &amp;quot;Inupiaq&amp;quot;,&lt;br /&gt;
    [&amp;quot;io&amp;quot;]  = &amp;quot;Ido&amp;quot;,&lt;br /&gt;
    [&amp;quot;is&amp;quot;]  = &amp;quot;Icelandic&amp;quot;,&lt;br /&gt;
    [&amp;quot;it&amp;quot;]  = &amp;quot;Italian&amp;quot;,&lt;br /&gt;
    [&amp;quot;iu&amp;quot;]  = &amp;quot;Inuktitut&amp;quot;,&lt;br /&gt;
    [&amp;quot;ja&amp;quot;]  = &amp;quot;Japanese&amp;quot;,&lt;br /&gt;
    [&amp;quot;jv&amp;quot;]  = &amp;quot;Javanese&amp;quot;,&lt;br /&gt;
    [&amp;quot;ka&amp;quot;]  = &amp;quot;Georgian&amp;quot;,&lt;br /&gt;
    [&amp;quot;kg&amp;quot;]  = &amp;quot;Kongo&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ki&amp;quot;]  = &amp;quot;Kikuyu&amp;quot;,&lt;br /&gt;
    [&amp;quot;ki&amp;quot;]  = &amp;quot;Gikuyu&amp;quot;,&lt;br /&gt;
--  [&amp;quot;kj&amp;quot;]  = &amp;quot;Kuanyama&amp;quot;,&lt;br /&gt;
    [&amp;quot;kj&amp;quot;]  = &amp;quot;Kwanyama&amp;quot;,&lt;br /&gt;
    [&amp;quot;kk&amp;quot;]  = &amp;quot;Kazakh&amp;quot;,&lt;br /&gt;
--  [&amp;quot;kl&amp;quot;]  = &amp;quot;Kalaallisut&amp;quot;,&lt;br /&gt;
    [&amp;quot;kl&amp;quot;]  = &amp;quot;Greenlandic&amp;quot;,&lt;br /&gt;
    [&amp;quot;km&amp;quot;]  = &amp;quot;Central Khmer&amp;quot;,&lt;br /&gt;
    [&amp;quot;kn&amp;quot;]  = &amp;quot;Kannada&amp;quot;,&lt;br /&gt;
    [&amp;quot;ko&amp;quot;]  = &amp;quot;Korean&amp;quot;,&lt;br /&gt;
    [&amp;quot;kr&amp;quot;]  = &amp;quot;Kanuri&amp;quot;,&lt;br /&gt;
    [&amp;quot;ks&amp;quot;]  = &amp;quot;Kashmiri&amp;quot;,&lt;br /&gt;
    [&amp;quot;ku&amp;quot;]  = &amp;quot;Kurdish&amp;quot;,&lt;br /&gt;
    [&amp;quot;kv&amp;quot;]  = &amp;quot;Komi&amp;quot;,&lt;br /&gt;
    [&amp;quot;kw&amp;quot;]  = &amp;quot;Cornish&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ky&amp;quot;]  = &amp;quot;Kirghiz&amp;quot;,&lt;br /&gt;
    [&amp;quot;ky&amp;quot;]  = &amp;quot;Kyrgyz&amp;quot;,&lt;br /&gt;
    [&amp;quot;la&amp;quot;]  = &amp;quot;Latin&amp;quot;,&lt;br /&gt;
    [&amp;quot;lb&amp;quot;]  = &amp;quot;Luxembourgish&amp;quot;,&lt;br /&gt;
--  [&amp;quot;lb&amp;quot;]  = &amp;quot;Letzeburgesch&amp;quot;,&lt;br /&gt;
    [&amp;quot;lg&amp;quot;]  = &amp;quot;Ganda&amp;quot;,&lt;br /&gt;
--  [&amp;quot;li&amp;quot;]  = &amp;quot;Limburgan&amp;quot;,&lt;br /&gt;
--  [&amp;quot;li&amp;quot;]  = &amp;quot;Limburger&amp;quot;,&lt;br /&gt;
    [&amp;quot;li&amp;quot;]  = &amp;quot;Limburgish&amp;quot;,&lt;br /&gt;
    [&amp;quot;ln&amp;quot;]  = &amp;quot;Lingala&amp;quot;,&lt;br /&gt;
    [&amp;quot;lo&amp;quot;]  = &amp;quot;Lao&amp;quot;,&lt;br /&gt;
    [&amp;quot;lt&amp;quot;]  = &amp;quot;Lithuanian&amp;quot;,&lt;br /&gt;
    [&amp;quot;lu&amp;quot;]  = &amp;quot;Luba-Katanga&amp;quot;,&lt;br /&gt;
    [&amp;quot;lv&amp;quot;]  = &amp;quot;Latvian&amp;quot;,&lt;br /&gt;
    [&amp;quot;mg&amp;quot;]  = &amp;quot;Malagasy&amp;quot;,&lt;br /&gt;
    [&amp;quot;mh&amp;quot;]  = &amp;quot;Marshallese&amp;quot;,&lt;br /&gt;
    [&amp;quot;mi&amp;quot;]  = &amp;quot;Maori&amp;quot;,&lt;br /&gt;
    [&amp;quot;mk&amp;quot;]  = &amp;quot;Macedonian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ml&amp;quot;]  = &amp;quot;Malayalam&amp;quot;,&lt;br /&gt;
    [&amp;quot;mn&amp;quot;]  = &amp;quot;Mongolian&amp;quot;,&lt;br /&gt;
    [&amp;quot;mr&amp;quot;]  = &amp;quot;Marathi&amp;quot;,&lt;br /&gt;
    [&amp;quot;ms&amp;quot;]  = &amp;quot;Malay&amp;quot;,&lt;br /&gt;
    [&amp;quot;mt&amp;quot;]  = &amp;quot;Maltese&amp;quot;,&lt;br /&gt;
    [&amp;quot;my&amp;quot;]  = &amp;quot;Burmese&amp;quot;,&lt;br /&gt;
    [&amp;quot;na&amp;quot;]  = &amp;quot;Nauru&amp;quot;,&lt;br /&gt;
    [&amp;quot;nb&amp;quot;]  = &amp;quot;Norwegian Bokmål&amp;quot;,&lt;br /&gt;
    [&amp;quot;nd&amp;quot;]  = &amp;quot;North Ndebele&amp;quot;,&lt;br /&gt;
    [&amp;quot;ne&amp;quot;]  = &amp;quot;Nepali&amp;quot;,&lt;br /&gt;
    [&amp;quot;ng&amp;quot;]  = &amp;quot;Ndonga&amp;quot;,&lt;br /&gt;
    [&amp;quot;nl&amp;quot;]  = &amp;quot;Dutch&amp;quot;,&lt;br /&gt;
--  [&amp;quot;nl&amp;quot;]  = &amp;quot;Flemish&amp;quot;,&lt;br /&gt;
    [&amp;quot;nn&amp;quot;]  = &amp;quot;Norwegian Nynorsk&amp;quot;,&lt;br /&gt;
    [&amp;quot;no&amp;quot;]  = &amp;quot;Norwegian&amp;quot;,&lt;br /&gt;
    [&amp;quot;nr&amp;quot;]  = &amp;quot;South Ndebele&amp;quot;,&lt;br /&gt;
    [&amp;quot;nv&amp;quot;]  = &amp;quot;Navajo&amp;quot;,&lt;br /&gt;
--  [&amp;quot;nv&amp;quot;]  = &amp;quot;Navaho&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ny&amp;quot;]  = &amp;quot;Chichewa&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ny&amp;quot;]  = &amp;quot;Chewa&amp;quot;,&lt;br /&gt;
    [&amp;quot;ny&amp;quot;]  = &amp;quot;Nyanja&amp;quot;,&lt;br /&gt;
    [&amp;quot;oc&amp;quot;]  = &amp;quot;Occitan&amp;quot;,&lt;br /&gt;
    [&amp;quot;oj&amp;quot;]  = &amp;quot;Ojibwa&amp;quot;,&lt;br /&gt;
    [&amp;quot;om&amp;quot;]  = &amp;quot;Oromo&amp;quot;,&lt;br /&gt;
    [&amp;quot;or&amp;quot;]  = &amp;quot;Oriya&amp;quot;,&lt;br /&gt;
    [&amp;quot;os&amp;quot;]  = &amp;quot;Ossetian&amp;quot;,&lt;br /&gt;
    [&amp;quot;os&amp;quot;]  = &amp;quot;Ossetic&amp;quot;,&lt;br /&gt;
--  [&amp;quot;pa&amp;quot;]  = &amp;quot;Panjabi&amp;quot;,&lt;br /&gt;
    [&amp;quot;pa&amp;quot;]  = &amp;quot;Punjabi&amp;quot;,&lt;br /&gt;
    [&amp;quot;pi&amp;quot;]  = &amp;quot;Pali&amp;quot;,&lt;br /&gt;
    [&amp;quot;pl&amp;quot;]  = &amp;quot;Polish&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ps&amp;quot;]  = &amp;quot;Pushto&amp;quot;,&lt;br /&gt;
    [&amp;quot;ps&amp;quot;]  = &amp;quot;Pashto&amp;quot;,&lt;br /&gt;
    [&amp;quot;pt&amp;quot;]  = &amp;quot;Portuguese&amp;quot;,&lt;br /&gt;
    [&amp;quot;qu&amp;quot;]  = &amp;quot;Quechua&amp;quot;,&lt;br /&gt;
    [&amp;quot;rm&amp;quot;]  = &amp;quot;Romansh&amp;quot;,&lt;br /&gt;
    [&amp;quot;rn&amp;quot;]  = &amp;quot;Rundi&amp;quot;,&lt;br /&gt;
    [&amp;quot;ro&amp;quot;]  = &amp;quot;Romanian&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ro&amp;quot;]  = &amp;quot;Moldavian&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ro&amp;quot;]  = &amp;quot;Moldovan&amp;quot;,&lt;br /&gt;
    [&amp;quot;ru&amp;quot;]  = &amp;quot;Russian&amp;quot;,&lt;br /&gt;
    [&amp;quot;rw&amp;quot;]  = &amp;quot;Kinyarwanda&amp;quot;,&lt;br /&gt;
    [&amp;quot;sa&amp;quot;]  = &amp;quot;Sanskrit&amp;quot;,&lt;br /&gt;
    [&amp;quot;sc&amp;quot;]  = &amp;quot;Sardinian&amp;quot;,&lt;br /&gt;
    [&amp;quot;sd&amp;quot;]  = &amp;quot;Sindhi&amp;quot;,&lt;br /&gt;
    [&amp;quot;se&amp;quot;]  = &amp;quot;Northern Sami&amp;quot;,&lt;br /&gt;
    [&amp;quot;sg&amp;quot;]  = &amp;quot;Sango&amp;quot;,&lt;br /&gt;
    [&amp;quot;si&amp;quot;]  = &amp;quot;Sinhala&amp;quot;,&lt;br /&gt;
--  [&amp;quot;si&amp;quot;]  = &amp;quot;Sinhalese&amp;quot;,&lt;br /&gt;
    [&amp;quot;sk&amp;quot;]  = &amp;quot;Slovak&amp;quot;,&lt;br /&gt;
    [&amp;quot;sl&amp;quot;]  = &amp;quot;Slovenian&amp;quot;,&lt;br /&gt;
    [&amp;quot;sm&amp;quot;]  = &amp;quot;Samoan&amp;quot;,&lt;br /&gt;
    [&amp;quot;sn&amp;quot;]  = &amp;quot;Shona&amp;quot;,&lt;br /&gt;
    [&amp;quot;so&amp;quot;]  = &amp;quot;Somali&amp;quot;,&lt;br /&gt;
    [&amp;quot;sq&amp;quot;]  = &amp;quot;Albanian&amp;quot;,&lt;br /&gt;
    [&amp;quot;sr&amp;quot;]  = &amp;quot;Serbian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ss&amp;quot;]  = &amp;quot;Swati&amp;quot;,&lt;br /&gt;
    [&amp;quot;st&amp;quot;]  = &amp;quot;Southern Sotho&amp;quot;,&lt;br /&gt;
    [&amp;quot;su&amp;quot;]  = &amp;quot;Sundanese&amp;quot;,&lt;br /&gt;
    [&amp;quot;sv&amp;quot;]  = &amp;quot;Swedish&amp;quot;,&lt;br /&gt;
    [&amp;quot;sw&amp;quot;]  = &amp;quot;Swahili&amp;quot;,&lt;br /&gt;
    [&amp;quot;ta&amp;quot;]  = &amp;quot;Tamil&amp;quot;,&lt;br /&gt;
    [&amp;quot;te&amp;quot;]  = &amp;quot;Telugu&amp;quot;,&lt;br /&gt;
    [&amp;quot;tg&amp;quot;]  = &amp;quot;Tajik&amp;quot;,&lt;br /&gt;
    [&amp;quot;th&amp;quot;]  = &amp;quot;Thai&amp;quot;,&lt;br /&gt;
    [&amp;quot;ti&amp;quot;]  = &amp;quot;Tigrinya&amp;quot;,&lt;br /&gt;
    [&amp;quot;tk&amp;quot;]  = &amp;quot;Turkmen&amp;quot;,&lt;br /&gt;
    [&amp;quot;tl&amp;quot;]  = &amp;quot;Tagalog&amp;quot;,&lt;br /&gt;
    [&amp;quot;tn&amp;quot;]  = &amp;quot;Tswana&amp;quot;,&lt;br /&gt;
    [&amp;quot;to&amp;quot;]  = &amp;quot;Tonga (Tonga Islands)&amp;quot;,&lt;br /&gt;
    [&amp;quot;tr&amp;quot;]  = &amp;quot;Turkish&amp;quot;,&lt;br /&gt;
    [&amp;quot;ts&amp;quot;]  = &amp;quot;Tsonga&amp;quot;,&lt;br /&gt;
    [&amp;quot;tt&amp;quot;]  = &amp;quot;Tatar&amp;quot;,&lt;br /&gt;
    [&amp;quot;tw&amp;quot;]  = &amp;quot;Twi&amp;quot;,&lt;br /&gt;
    [&amp;quot;ty&amp;quot;]  = &amp;quot;Tahitian&amp;quot;,&lt;br /&gt;
--  [&amp;quot;ug&amp;quot;]  = &amp;quot;Uighur&amp;quot;,&lt;br /&gt;
    [&amp;quot;ug&amp;quot;]  = &amp;quot;Uyghur&amp;quot;,&lt;br /&gt;
    [&amp;quot;uk&amp;quot;]  = &amp;quot;Ukrainian&amp;quot;,&lt;br /&gt;
    [&amp;quot;ur&amp;quot;]  = &amp;quot;Urdu&amp;quot;,&lt;br /&gt;
    [&amp;quot;uz&amp;quot;]  = &amp;quot;Uzbek&amp;quot;,&lt;br /&gt;
    [&amp;quot;ve&amp;quot;]  = &amp;quot;Venda&amp;quot;,&lt;br /&gt;
    [&amp;quot;vi&amp;quot;]  = &amp;quot;Vietnamese&amp;quot;,&lt;br /&gt;
    [&amp;quot;vo&amp;quot;]  = &amp;quot;Volapük&amp;quot;,&lt;br /&gt;
    [&amp;quot;wa&amp;quot;]  = &amp;quot;Walloon&amp;quot;,&lt;br /&gt;
    [&amp;quot;wo&amp;quot;]  = &amp;quot;Wolof&amp;quot;,&lt;br /&gt;
    [&amp;quot;xh&amp;quot;]  = &amp;quot;Xhosa&amp;quot;,&lt;br /&gt;
    [&amp;quot;yi&amp;quot;]  = &amp;quot;Yiddish&amp;quot;,&lt;br /&gt;
    [&amp;quot;yo&amp;quot;]  = &amp;quot;Yoruba&amp;quot;,&lt;br /&gt;
    [&amp;quot;za&amp;quot;]  = &amp;quot;Zhuang&amp;quot;,&lt;br /&gt;
--  [&amp;quot;za&amp;quot;]  = &amp;quot;Chuang&amp;quot;,&lt;br /&gt;
    [&amp;quot;zh&amp;quot;]  = &amp;quot;Chinese&amp;quot;,&lt;br /&gt;
    [&amp;quot;zu&amp;quot;]  = &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
return citation_config;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=23897</id>
		<title>Module:Citation/CS1/Whitelist</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=23897"/>
		<updated>2013-12-14T18:30:34Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Sync from sandbox; streamlined deprecated parameter detection;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
Because a steady-state signal conveys no useful information, whitelist.basic_arguments[] list items now can have three values:&lt;br /&gt;
	true - these parameters are valid and supported parameters&lt;br /&gt;
	false - these parameters are deprecated but still supported&lt;br /&gt;
	nil - these parameters are no longer supported (when setting a parameter to nil, leave a comment stating the reasons for invalidating the parameter)&lt;br /&gt;
]]&lt;br /&gt;
whitelist = {&lt;br /&gt;
&lt;br /&gt;
basic_arguments = {&lt;br /&gt;
    [&#039;accessdate&#039;] = true,&lt;br /&gt;
    [&#039;agency&#039;] = true,&lt;br /&gt;
    [&#039;airdate&#039;] = true,&lt;br /&gt;
    [&#039;archivedate&#039;] = true,&lt;br /&gt;
    [&#039;archive-date&#039;] = true,&lt;br /&gt;
    [&#039;archiveurl&#039;] = true,&lt;br /&gt;
    [&#039;archive-url&#039;] = true,&lt;br /&gt;
    [&#039;article&#039;] = true,&lt;br /&gt;
    [&#039;arxiv&#039;] = true,&lt;br /&gt;
    [&#039;ARXIV&#039;] = true,&lt;br /&gt;
    [&#039;asin&#039;] = true,&lt;br /&gt;
    [&#039;ASIN&#039;] = true,&lt;br /&gt;
    [&#039;asin-tld&#039;] = true,&lt;br /&gt;
    [&#039;ASIN-TLD&#039;] = true,&lt;br /&gt;
    [&#039;at&#039;] = true,&lt;br /&gt;
    [&#039;author&#039;] = true,&lt;br /&gt;
    [&#039;Author&#039;] = true,&lt;br /&gt;
    [&#039;author-first&#039;] = true,&lt;br /&gt;
    [&#039;authorformat&#039;] = true,&lt;br /&gt;
    [&#039;author-format&#039;] = true,&lt;br /&gt;
    [&#039;author-last&#039;] = true,&lt;br /&gt;
    [&#039;authorlink&#039;] = true,&lt;br /&gt;
    [&#039;author-link&#039;] = true,&lt;br /&gt;
    [&#039;authormask&#039;] = true,&lt;br /&gt;
    [&#039;author-mask&#039;] = true,&lt;br /&gt;
    [&#039;author-name-separator&#039;] = true,&lt;br /&gt;
    [&#039;authors&#039;] = true,&lt;br /&gt;
    [&#039;author-separator&#039;] = true,&lt;br /&gt;
    [&#039;bibcode&#039;] = true,&lt;br /&gt;
    [&#039;BIBCODE&#039;] = true,&lt;br /&gt;
    [&#039;booktitle&#039;] = true,&lt;br /&gt;
    [&#039;cartography&#039;] = true,&lt;br /&gt;
    [&#039;chapter&#039;] = true,&lt;br /&gt;
    [&#039;chapterlink&#039;] = true,&lt;br /&gt;
    [&#039;chapterurl&#039;] = true,&lt;br /&gt;
    [&#039;chapter-url&#039;] = true,&lt;br /&gt;
    [&#039;coauthor&#039;] = false,&lt;br /&gt;
    [&#039;coauthors&#039;] = false,&lt;br /&gt;
    [&#039;conference&#039;] = true,&lt;br /&gt;
    [&#039;conferenceurl&#039;] = true,&lt;br /&gt;
    [&#039;conference-url&#039;] = true,&lt;br /&gt;
    [&#039;contribution&#039;] = true,&lt;br /&gt;
    [&#039;contributionurl&#039;] = true,&lt;br /&gt;
    [&#039;contribution-url&#039;] = true,&lt;br /&gt;
    [&#039;date&#039;] = true,&lt;br /&gt;
    [&#039;day&#039;] = false,&lt;br /&gt;
    [&#039;deadurl&#039;] = true,&lt;br /&gt;
    [&#039;degree&#039;] = true,&lt;br /&gt;
    [&#039;department&#039;] = true,&lt;br /&gt;
    [&#039;dictionary&#039;] = true,&lt;br /&gt;
    [&#039;displayauthors&#039;] = true,&lt;br /&gt;
    [&#039;display-authors&#039;] = true,&lt;br /&gt;
    [&#039;displayeditors&#039;] = true,&lt;br /&gt;
    [&#039;display-editors&#039;] = true,&lt;br /&gt;
    [&#039;docket&#039;] = true,&lt;br /&gt;
    [&#039;doi&#039;] = true,&lt;br /&gt;
    [&#039;DOI&#039;] = true,&lt;br /&gt;
    [&#039;DoiBroken&#039;] = true,&lt;br /&gt;
    [&#039;doi_brokendate&#039;] = true,&lt;br /&gt;
    [&#039;doi_inactivedate&#039;] = true,&lt;br /&gt;
    [&#039;edition&#039;] = true,&lt;br /&gt;
    [&#039;editor&#039;] = true,&lt;br /&gt;
    [&#039;Editor&#039;] = true,&lt;br /&gt;
    [&#039;editor-first&#039;] = true,&lt;br /&gt;
    [&#039;editorformat&#039;] = true,&lt;br /&gt;
    [&#039;editor-format&#039;] = true,&lt;br /&gt;
    [&#039;EditorGiven&#039;] = true,&lt;br /&gt;
    [&#039;editor-last&#039;] = true,&lt;br /&gt;
    [&#039;editorlink&#039;] = true,&lt;br /&gt;
    [&#039;editor-link&#039;] = true,&lt;br /&gt;
    [&#039;editormask&#039;] = true,&lt;br /&gt;
    [&#039;editor-mask&#039;] = true,&lt;br /&gt;
    [&#039;editor-name-separator&#039;] = true,&lt;br /&gt;
    [&#039;editors&#039;] = true,&lt;br /&gt;
    [&#039;editor-separator&#039;] = true,&lt;br /&gt;
    [&#039;EditorSurname&#039;] = true,&lt;br /&gt;
    [&#039;embargo&#039;] = true,&lt;br /&gt;
    [&#039;Embargo&#039;] = true,&lt;br /&gt;
    [&#039;encyclopaedia&#039;] = true,&lt;br /&gt;
    [&#039;encyclopedia&#039;] = true,&lt;br /&gt;
    [&#039;entry&#039;] = true,&lt;br /&gt;
    [&#039;episodelink&#039;] = true,&lt;br /&gt;
    [&#039;first&#039;] = true,&lt;br /&gt;
    [&#039;format&#039;] = true,&lt;br /&gt;
    [&#039;given&#039;] = true,&lt;br /&gt;
    [&#039;id&#039;] = true,&lt;br /&gt;
    [&#039;ID&#039;] = true,&lt;br /&gt;
    [&#039;ignoreisbnerror&#039;] = true,&lt;br /&gt;
    [&#039;ignore-isbn-error&#039;] = true,&lt;br /&gt;
    [&#039;in&#039;] = true,&lt;br /&gt;
    [&#039;inset&#039;] = true,&lt;br /&gt;
    [&#039;institution&#039;] = true,&lt;br /&gt;
    [&#039;isbn&#039;] = true,&lt;br /&gt;
    [&#039;ISBN&#039;] = true,&lt;br /&gt;
    [&#039;isbn13&#039;] = true,&lt;br /&gt;
    [&#039;ISBN13&#039;] = true,&lt;br /&gt;
    [&#039;issn&#039;] = true,&lt;br /&gt;
    [&#039;ISSN&#039;] = true,&lt;br /&gt;
    [&#039;issue&#039;] = true,&lt;br /&gt;
    [&#039;jfm&#039;] = true,&lt;br /&gt;
    [&#039;JFM&#039;] = true,&lt;br /&gt;
    [&#039;journal&#039;] = true,&lt;br /&gt;
    [&#039;jstor&#039;] = true,&lt;br /&gt;
    [&#039;JSTOR&#039;] = true,&lt;br /&gt;
    [&#039;language&#039;] = true,&lt;br /&gt;
    [&#039;last&#039;] = true,&lt;br /&gt;
    [&#039;lastauthoramp&#039;] = true,&lt;br /&gt;
    [&#039;laydate&#039;] = true,&lt;br /&gt;
    [&#039;laysource&#039;] = true,&lt;br /&gt;
    [&#039;laysummary&#039;] = true,&lt;br /&gt;
    [&#039;layurl&#039;] = true,&lt;br /&gt;
    [&#039;lccn&#039;] = true,&lt;br /&gt;
    [&#039;LCCN&#039;] = true,&lt;br /&gt;
    [&#039;location&#039;] = true,&lt;br /&gt;
    [&#039;magazine&#039;] = true,&lt;br /&gt;
    [&#039;medium&#039;] = true,&lt;br /&gt;
    [&#039;minutes&#039;] = true,&lt;br /&gt;
    [&#039;month&#039;] = false,&lt;br /&gt;
    [&#039;mr&#039;] = true,&lt;br /&gt;
    [&#039;MR&#039;] = true,&lt;br /&gt;
    [&#039;name-separator&#039;] = true,&lt;br /&gt;
    [&#039;network&#039;] = true,&lt;br /&gt;
    [&#039;newspaper&#039;] = true,&lt;br /&gt;
    [&#039;nocat&#039;] = true,&lt;br /&gt;
    [&#039;nopp&#039;] = true,&lt;br /&gt;
    [&#039;notracking&#039;] = true,&lt;br /&gt;
    [&#039;no-tracking&#039;] = true,&lt;br /&gt;
    [&#039;number&#039;] = true,&lt;br /&gt;
    [&#039;oclc&#039;] = true,&lt;br /&gt;
    [&#039;OCLC&#039;] = true,&lt;br /&gt;
    [&#039;ol&#039;] = true,&lt;br /&gt;
    [&#039;OL&#039;] = true,&lt;br /&gt;
    [&#039;origyear&#039;] = true,&lt;br /&gt;
    [&#039;osti&#039;] = true,&lt;br /&gt;
    [&#039;OSTI&#039;] = true,&lt;br /&gt;
    [&#039;others&#039;] = true,&lt;br /&gt;
    [&#039;p&#039;] = true,&lt;br /&gt;
    [&#039;page&#039;] = true,&lt;br /&gt;
    [&#039;pages&#039;] = true,&lt;br /&gt;
    [&#039;people&#039;] = true,&lt;br /&gt;
    [&#039;periodical&#039;] = true,&lt;br /&gt;
    [&#039;place&#039;] = true,&lt;br /&gt;
    [&#039;pmc&#039;] = true,&lt;br /&gt;
    [&#039;PMC&#039;] = true,&lt;br /&gt;
    [&#039;pmid&#039;] = true,&lt;br /&gt;
    [&#039;PMID&#039;] = true,&lt;br /&gt;
    [&#039;postscript&#039;] = true,&lt;br /&gt;
    [&#039;pp&#039;] = true,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = true,&lt;br /&gt;
    [&#039;PPrefix&#039;] = true,&lt;br /&gt;
    [&#039;publicationdate&#039;] = true,&lt;br /&gt;
    [&#039;publication-date&#039;] = true,&lt;br /&gt;
    [&#039;publicationplace&#039;] = true,&lt;br /&gt;
    [&#039;publication-place&#039;] = true,&lt;br /&gt;
    [&#039;publisher&#039;] = true,&lt;br /&gt;
    [&#039;quotation&#039;] = true,&lt;br /&gt;
    [&#039;quote&#039;] = true,&lt;br /&gt;
    [&#039;ref&#039;] = true,&lt;br /&gt;
    [&#039;Ref&#039;] = true,&lt;br /&gt;
    [&#039;registration&#039;] = true,&lt;br /&gt;
    [&#039;rfc&#039;] = true,&lt;br /&gt;
    [&#039;RFC&#039;] = true,&lt;br /&gt;
    [&#039;scale&#039;] = true,&lt;br /&gt;
    [&#039;season&#039;] = true,&lt;br /&gt;
    [&#039;section&#039;] = true,&lt;br /&gt;
    [&#039;sectionurl&#039;] = true,&lt;br /&gt;
    [&#039;separator&#039;] = true,&lt;br /&gt;
    [&#039;series&#039;] = true,&lt;br /&gt;
    [&#039;serieslink&#039;] = true,&lt;br /&gt;
    [&#039;seriesno&#039;] = true,&lt;br /&gt;
    [&#039;seriesnumber&#039;] = true,&lt;br /&gt;
    [&#039;series-separator&#039;] = true,&lt;br /&gt;
    [&#039;ssrn&#039;] = true,&lt;br /&gt;
    [&#039;SSRN&#039;] = true,&lt;br /&gt;
    [&#039;station&#039;] = true,&lt;br /&gt;
    [&#039;subscription&#039;] = true,&lt;br /&gt;
    [&#039;surname&#039;] = true,&lt;br /&gt;
    [&#039;template doc demo&#039;] = true,&lt;br /&gt;
    [&#039;time&#039;] = true,&lt;br /&gt;
    [&#039;timecaption&#039;] = true,&lt;br /&gt;
    [&#039;title&#039;] = true,&lt;br /&gt;
    [&#039;titlelink&#039;] = true,&lt;br /&gt;
    [&#039;trans_chapter&#039;] = true,&lt;br /&gt;
    [&#039;trans-chapter&#039;] = true,&lt;br /&gt;
    [&#039;transcript&#039;] = true,&lt;br /&gt;
    [&#039;transcripturl&#039;] = true,&lt;br /&gt;
    [&#039;transcript-url&#039;] = true,&lt;br /&gt;
    [&#039;trans_title&#039;] = true,&lt;br /&gt;
    [&#039;trans-title&#039;] = true,&lt;br /&gt;
    [&#039;type&#039;] = true,&lt;br /&gt;
    [&#039;url&#039;] = true,&lt;br /&gt;
    [&#039;URL&#039;] = true,&lt;br /&gt;
    [&#039;version&#039;] = true,&lt;br /&gt;
    [&#039;via&#039;] = true,&lt;br /&gt;
    [&#039;volume&#039;] = true,&lt;br /&gt;
    [&#039;website&#039;] = true,&lt;br /&gt;
    [&#039;work&#039;] = true,&lt;br /&gt;
    [&#039;year&#039;] = true,&lt;br /&gt;
    [&#039;zbl&#039;] = true,&lt;br /&gt;
    [&#039;ZBL&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
numbered_arguments = {&lt;br /&gt;
    [&#039;author#&#039;] = true,&lt;br /&gt;
    [&#039;Author#&#039;] = true,&lt;br /&gt;
    [&#039;author-first#&#039;] = true,&lt;br /&gt;
    [&#039;author#-first&#039;] = true,&lt;br /&gt;
    [&#039;author-last#&#039;] = true,&lt;br /&gt;
    [&#039;author#-last&#039;] = true,&lt;br /&gt;
    [&#039;author-link#&#039;] = true,&lt;br /&gt;
    [&#039;author#link&#039;] = true,&lt;br /&gt;
    [&#039;author#-link&#039;] = true,&lt;br /&gt;
    [&#039;authorlink#&#039;] = true,&lt;br /&gt;
    [&#039;author-mask#&#039;] = true,&lt;br /&gt;
    [&#039;author#mask&#039;] = true,&lt;br /&gt;
    [&#039;author#-mask&#039;] = true,&lt;br /&gt;
    [&#039;authormask#&#039;] = true,&lt;br /&gt;
    [&#039;authors#&#039;] = true,&lt;br /&gt;
    [&#039;editor#&#039;] = true,&lt;br /&gt;
    [&#039;Editor#&#039;] = true,&lt;br /&gt;
    [&#039;editor-first#&#039;] = true,&lt;br /&gt;
    [&#039;editor#-first&#039;] = true,&lt;br /&gt;
    [&#039;EditorGiven#&#039;] = true,&lt;br /&gt;
    [&#039;editor-last#&#039;] = true,&lt;br /&gt;
    [&#039;editor#-last&#039;] = true,&lt;br /&gt;
    [&#039;editor-link#&#039;] = true,&lt;br /&gt;
    [&#039;editor#link&#039;] = true,&lt;br /&gt;
    [&#039;editor#-link&#039;] = true,&lt;br /&gt;
    [&#039;editorlink#&#039;] = true,&lt;br /&gt;
    [&#039;editor-mask#&#039;] = true,&lt;br /&gt;
    [&#039;editor#mask&#039;] = true,&lt;br /&gt;
    [&#039;editor#-mask&#039;] = true,&lt;br /&gt;
    [&#039;editormask#&#039;] = true,&lt;br /&gt;
    [&#039;editors#&#039;] = true,&lt;br /&gt;
    [&#039;EditorSurname#&#039;] = true,&lt;br /&gt;
    [&#039;first#&#039;] = true,&lt;br /&gt;
    [&#039;given#&#039;] = true,&lt;br /&gt;
    [&#039;last#&#039;] = true,&lt;br /&gt;
    [&#039;surname#&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return whitelist;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate.css&amp;diff=23270</id>
		<title>MediaWiki:Gadget-SidebarTranslate.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate.css&amp;diff=23270"/>
		<updated>2013-12-13T22:01:01Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Move some CSS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*  _____________________________________________________________________________&lt;br /&gt;
 * |                                                                             |&lt;br /&gt;
 * |                    === WARNING: GLOBAL GADGET FILE ===                      |&lt;br /&gt;
 * |                  Changes to this page affect many users.                    |&lt;br /&gt;
 * | Please discuss changes on the talk page or on [[WT:Gadget]] before editing. |&lt;br /&gt;
 * |_____________________________________________________________________________|&lt;br /&gt;
 *&lt;br /&gt;
 * Imported from [[User:Equazcion/SidebarTranslate.css]] on 2013-11-27&lt;br /&gt;
 * See [[User:Equazcion/SidebarTranslate]]&lt;br /&gt;
 */&lt;br /&gt;
.gTrans:hover {&lt;br /&gt;
	text-decoration:none; &lt;br /&gt;
}&lt;br /&gt;
.gTrans {&lt;br /&gt;
	display: none; &lt;br /&gt;
	font-family: serif; &lt;br /&gt;
	cursor: pointer; &lt;br /&gt;
	color: white; &lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
	border-radius: 2px; &lt;br /&gt;
	padding: 0 2px; &lt;br /&gt;
	margin-left: 5px; &lt;br /&gt;
	transition:&lt;br /&gt;
		margin-left 200ms ease-out, &lt;br /&gt;
		background-color 100ms ease-out, &lt;br /&gt;
		color 100ms ease-out;&lt;br /&gt;
}&lt;br /&gt;
#p-lang ul {&lt;br /&gt;
	width:115%;&lt;br /&gt;
}&lt;br /&gt;
#p-lang li.interlanguage-link {&lt;br /&gt;
	font-family: inherit;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Noticeboard_links&amp;diff=23032</id>
		<title>Template:Noticeboard links</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Noticeboard_links&amp;diff=23032"/>
		<updated>2013-12-13T03:20:24Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: + spam blacklist and whitelist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
| name = Noticeboard links&lt;br /&gt;
| state = {{{state|uncollapsed}}}&lt;br /&gt;
| title = [[Wikipedia:Noticeboards|Noticeboards]], etc.&lt;br /&gt;
| listclass = hlist&lt;br /&gt;
| titlestyle = {{{titlestyle|}}}&lt;br /&gt;
| groupstyle = {{{groupstyle|}}}&lt;br /&gt;
| abovestyle = {{#if: {{{abovestyle|}}} | {{{abovestyle}}} | {{{groupstyle}}} }}&lt;br /&gt;
| belowstyle = {{#if: {{{belowstyle|}}} | {{{belowstyle}}} | {{{groupstyle}}} }}&lt;br /&gt;
| style = {{{style|}}}&lt;br /&gt;
| above = Wikipedia&#039;s centralized discussion, request, and help venues. See the [[Wikipedia:Dashboard|dashboard]] for an expanded listing.&lt;br /&gt;
| below = &#039;&#039;&#039; [[:Category:Wikipedia noticeboards]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
| group1 = General&lt;br /&gt;
| list1 = &lt;br /&gt;
* Administrators&#039; noticeboard&lt;br /&gt;
** [[Wikipedia:Administrators&#039; noticeboard|main]]&lt;br /&gt;
** [[Wikipedia:Administrators&#039; noticeboard/Incidents|incidents]]&lt;br /&gt;
* [[Wikipedia:Bot owners&#039; noticeboard|Bot owners]]&lt;br /&gt;
* [[Wikipedia:Administrators&#039; noticeboard/Requests for closure|Closure]]&lt;br /&gt;
* Education&lt;br /&gt;
** [[Wikipedia:Education noticeboard|main]]&lt;br /&gt;
** [[Wikipedia:Education noticeboard/Incidents|incidents]]&lt;br /&gt;
* [[Wikipedia:Requests for page importation|Importing pages]]&lt;br /&gt;
* [[Wikipedia:Main Page/Errors|Main Page errors]]&lt;br /&gt;
* [[Wikipedia:WikiProject on open proxies|Open proxies]]&lt;br /&gt;
* [[Wikipedia:OTRS noticeboard|OTRS]]&lt;br /&gt;
* [[Wikipedia:Requests for oversight|Oversight]]&lt;br /&gt;
* [[Wikipedia:Requests for page protection|Page protection]]&lt;br /&gt;
&lt;br /&gt;
| group2 = Articles and content&lt;br /&gt;
| list2 = &lt;br /&gt;
* [[Wikipedia:Biographies_of_living_persons/Noticeboard|Biographies of living persons]]&lt;br /&gt;
* Copyrights&lt;br /&gt;
** [[Wikipedia:Non-free content review|file review]]&lt;br /&gt;
** [[Wikipedia:Media copyright questions|questions on media]]&lt;br /&gt;
** [[Wikipedia:Copyright problems|problems]]&lt;br /&gt;
* [[Wikipedia:Dispute resolution noticeboard|Dispute resolution]] &lt;br /&gt;
* [[Wikipedia:External links/Noticeboard|External links]]&lt;br /&gt;
* [[Wikipedia:Fringe theories/Noticeboard|Fringe theories]]&lt;br /&gt;
* [[Wikipedia:Proposed mergers|Mergers]]&lt;br /&gt;
* [[Wikipedia:Requested moves|Moves]]&lt;br /&gt;
* [[Wikipedia:Neutral point of view/Noticeboard|Neutral point of view]]&lt;br /&gt;
* [[Wikipedia:No original research/Noticeboard|Original research]]&lt;br /&gt;
* [[Wikipedia:Reliable sources/Noticeboard|Reliable sources]]&lt;br /&gt;
* [[Wikipedia:WikiProject Resource Exchange/Resource Request|Resource requests]]&lt;br /&gt;
* [[Wikipedia talk:WikiProject Spam|Spam]]&lt;br /&gt;
** [[MediaWiki talk:Spam-blacklist|blacklist]]&lt;br /&gt;
** [[MediaWiki talk:Spam-whitelist|whitelist]]&lt;br /&gt;
&lt;br /&gt;
| group3 = User conduct&lt;br /&gt;
| list3 = &lt;br /&gt;
* Abuse&lt;br /&gt;
** [[Wikipedia:Long-term abuse|long-term cases]]&lt;br /&gt;
* [[Wikipedia:General sanctions|Article sanctions]] &lt;br /&gt;
* [[Wikipedia:Conflict of interest/Noticeboard|Conflict of interest]]&lt;br /&gt;
* [[Wikipedia:Contributor copyright investigations|Contributor copyright]]&lt;br /&gt;
* [[Wikipedia:Administrators&#039; noticeboard/Edit warring|Edit warring &amp;amp; 3RR]]&lt;br /&gt;
* [[Wikipedia:Editing restrictions|Editor restrictions]] &lt;br /&gt;
* [[Wikipedia:Editor review|Editor review]]&lt;br /&gt;
* [[Wikipedia:WikiProject Cooperation/Paid editor help|Paid editing]]&lt;br /&gt;
* [[Wikipedia:Sockpuppet investigations|Sockpuppets]]&lt;br /&gt;
* [[Wikipedia:Usernames for administrator attention|Usernames]]&lt;br /&gt;
* [[Wikipedia:Administrator intervention against vandalism|Vandalism]]&lt;br /&gt;
&lt;br /&gt;
| group4 = Other&lt;br /&gt;
| list4 = &lt;br /&gt;
* Arbitration&lt;br /&gt;
** [[Wikipedia:Arbitration Committee/Noticeboard|Committee noticeboard]]&lt;br /&gt;
** [[Wikipedia:Arbitration/Requests|requests]]&lt;br /&gt;
** [[Wikipedia:Arbitration/Requests/Enforcement|enforcement]]&lt;br /&gt;
* [[Wikipedia:Requests for mediation|Mediation]]&lt;br /&gt;
* Questions&lt;br /&gt;
** [[Wikipedia:Editor assistance/Requests|editor assistance]]&lt;br /&gt;
** [[Wikipedia:Help desk|Help desk]]&lt;br /&gt;
** [[Wikipedia:WikiProject Articles for creation/Help desk|new articles]]&lt;br /&gt;
** [[Wikipedia:New contributors&#039; help page|new editors]]&lt;br /&gt;
** [[Wikipedia:Teahouse|Teahouse]]&lt;br /&gt;
* [[Wikipedia:Requests for comment/All|Requests for comment]]&lt;br /&gt;
* Village pump&lt;br /&gt;
** [[Wikipedia:Village pump (idea lab)|ideas]]&lt;br /&gt;
** [[Wikipedia:Village pump (policy)|policy]]&lt;br /&gt;
** [[Wikipedia:Village pump (proposals)|proposals]]&lt;br /&gt;
** [[Wikipedia:Village pump (technical)|technical]]&lt;br /&gt;
** [[Wikipedia:Village pump (miscellaneous)|miscellaneous]]&lt;br /&gt;
&lt;br /&gt;
}}{{#ifeq:{{{nostb}}}|yes|&amp;lt;!-- nothing --&amp;gt;|{{stb|notoc={{#ifeq:{{{notoc|}}}|yes|yes|&amp;lt;!-- nothing --&amp;gt;}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
{{pp-template}}&lt;br /&gt;
[[Category:Wikipedia administration templates]]&lt;br /&gt;
[[Category:Wikipedia dispute resolution|*]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Broken_ref&amp;diff=23561</id>
		<title>Template:Broken ref</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Broken_ref&amp;diff=23561"/>
		<updated>2013-12-09T00:21:43Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Use ω, which is easily distinguishable, but τ was not distinguishable from t.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#if:{{{prefix|}}}&lt;br /&gt;
|{{namespace detect showall&lt;br /&gt;
| 1 = {{{prefix|}}}&lt;br /&gt;
| 2 = {{{prefix|}}}&lt;br /&gt;
| 3 = {{{prefix|}}}&lt;br /&gt;
| 4 = &amp;lt;span class=&amp;quot;brokenref&amp;quot;&amp;gt;{{{prefix|}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
| main     = 1&lt;br /&gt;
| template = 2&lt;br /&gt;
| category = 2&lt;br /&gt;
| help     = 2&lt;br /&gt;
| file     = 2&lt;br /&gt;
| user     = 3&lt;br /&gt;
| other    = 4&lt;br /&gt;
}}&lt;br /&gt;
|{{namespace detect showall&lt;br /&gt;
| 1 = {{broken ref/lang |msg={{{msg|}}} |lang={{{lang|}}} |help={{{help|}}}}}{{#if:{{{nocat|}}}||{{#if:{{{cat|}}}|[[Category:{{{cat|}}}|{{PAGENAME}}]]|[[Category:Pages with incorrect ref formatting|{{PAGENAME}}]]}}}}&lt;br /&gt;
| 2 = {{broken ref/lang |msg={{{msg|}}} |lang={{{lang|}}} |help={{{help|}}}}}{{#if:{{{nocat|}}}||{{#if:{{{cat|}}}|[[Category:{{{cat|}}}|ω{{PAGENAME}}]]|[[Category:Pages with incorrect ref formatting|ω{{PAGENAME}}]]}}}}&lt;br /&gt;
| 3 = {{broken ref/lang |msg={{{msg|}}} |lang={{{lang|}}} |help={{{help|}}}}}&lt;br /&gt;
| 4 = &amp;lt;span class=&amp;quot;brokenref&amp;quot;&amp;gt;{{broken ref/lang |msg={{{msg|}}} |lang={{{lang|}}} |help={{{help|}}}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
| main     = 1&lt;br /&gt;
| template = 2&lt;br /&gt;
| category = 2&lt;br /&gt;
| help     = 2&lt;br /&gt;
| file     = 2&lt;br /&gt;
| user     = 3&lt;br /&gt;
| other    = 4&lt;br /&gt;
}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
{{reflist}} &amp;lt;!-- dummy to steer automated tools away from this template --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box&amp;diff=15631</id>
		<title>Template:Documentation/end box</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box&amp;diff=15631"/>
		<updated>2013-12-08T19:37:39Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: merge with link box, supporting module namespace&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
  Link box below for the doc meta-data:&lt;br /&gt;
--&amp;gt;{{#if: &lt;br /&gt;
  &amp;lt;!--Check if we should show the link box--&amp;gt;&lt;br /&gt;
  {{#ifeq: {{{link box|}}} | off&lt;br /&gt;
  |&lt;br /&gt;
  | {{{doc exist|yes}}}{{&lt;br /&gt;
    #switch: {{SUBJECTSPACE}}&lt;br /&gt;
    | {{ns:User}}&lt;br /&gt;
    | {{ns:Module}}&lt;br /&gt;
    | {{ns:Template}} = yes&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| {{fmbox&lt;br /&gt;
  | id = documentation-meta-data&lt;br /&gt;
  | image = none&lt;br /&gt;
  | style = background-color: #ecfcf4;&lt;br /&gt;
  | textstyle = font-style: italic;&lt;br /&gt;
  | text = &lt;br /&gt;
    {{#if: {{{link box|}}}&lt;br /&gt;
    | {{{link box}}}   &amp;lt;!--Use custom link box content--&amp;gt;&lt;br /&gt;
    | {{#if: {{{doc exist|yes}}}&lt;br /&gt;
      | &amp;lt;!--/doc exists, link to it--&amp;gt;&lt;br /&gt;
        The above [[Wikipedia:Template documentation|documentation]] is [[Wikipedia:Transclusion|transcluded]] from [[{{{docpage|{{FULLPAGENAME}}/doc}}}]]. &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=edit}} edit] &amp;amp;#124; [{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=history}} history])&amp;lt;/small&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
      |&amp;lt;!-- /doc does not exist, ask to create one?&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
         | {{ns:Module}} = You might want to [{{fullurl: {{{docpage| {{FULLPAGENAME}}/doc }}} | action=edit&amp;amp;preload=Template:Documentation/preload-module-doc }} create] a documentation page for this [[Wikipedia:Lua|Scribunto module]]&amp;lt;br&amp;gt;&lt;br /&gt;
         | #default =&lt;br /&gt;
          }}&lt;br /&gt;
      }}&amp;lt;!-- &lt;br /&gt;
        Add links to /sandbox and /testcases when appropriate:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:User}}&lt;br /&gt;
      | {{ns:Module}}&lt;br /&gt;
      | {{ns:Template}} = &lt;br /&gt;
        Editors can experiment in this {{#switch: {{SUBJECTSPACE}} | {{ns:module}} = module&#039;s | #default = template&#039;s}} {{&lt;br /&gt;
        #ifexist: {{{sandbox| {{FULLPAGENAME}}/sandbox }}}&lt;br /&gt;
        | [[{{{sandbox| {{FULLPAGENAME}}/sandbox }}}|sandbox]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit }} edit] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl:Special:ComparePages | page1={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;page2={{urlencode:{{{sandbox|{{FULLPAGENAME}}/sandbox}}}}}}} diff])&amp;lt;/small&amp;gt; &lt;br /&gt;
        | sandbox &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload=Template:Documentation/preload-{{#ifeq: {{SUBJECTSPACE}}|{{ns:Module}}|module-}}sandbox }} create] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;summary={{urlencode:Create sandbox version of [[{{{template page|{{FULLPAGENAME}}}}}]]}} }} mirror])&amp;lt;/small&amp;gt;&lt;br /&gt;
        }} and {{&lt;br /&gt;
        #ifexist: {{{testcases| {{FULLPAGENAME}}/testcases }}}&lt;br /&gt;
        | [[{{{testcases| {{FULLPAGENAME}}/testcases }}}|testcases]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit }} edit])&amp;lt;/small&amp;gt;&lt;br /&gt;
        | testcases &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit&amp;amp;preload=Template:Documentation/preload-{{#ifeq: {{SUBJECTSPACE}}|{{ns:Module}}|module-}}testcases }} create])&amp;lt;/small&amp;gt;&lt;br /&gt;
        }} pages. &amp;lt;br /&amp;gt;&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the cats text, but not &lt;br /&gt;
        if &amp;quot;content&amp;quot; fed or &amp;quot;docname fed&amp;quot; since then it is &lt;br /&gt;
        unclear where to add the cats.&lt;br /&gt;
   --&amp;gt;{{#if: {{{content|}}} {{{docname fed|}}}&lt;br /&gt;
      | &lt;br /&gt;
      | Please add categories to the [[{{{docpage|{{FULLPAGENAME}}/doc}}}|/doc]] subpage.&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the &amp;quot;Subpages&amp;quot; link:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:File}} =   &amp;lt;!--Don&#039;t show it--&amp;gt;&lt;br /&gt;
      | {{ns:Module}} = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this module]].&lt;br /&gt;
      | {{ns:Template}} = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this template]].&lt;br /&gt;
      | #default = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this page]].&lt;br /&gt;
      }}&lt;br /&gt;
    }}{{#ifexist:{{FULLPAGENAME}}/Print&lt;br /&gt;
     |&amp;lt;br /&amp;gt;A [[Help:Books/for experts#Improving the book layout|print version]] of this template exists at [[/Print]]. If you make a change to this template, please update the print version as well.[[Category:Templates with print versions]]&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;!--End link box--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
  Detect and report strange usage:&lt;br /&gt;
--&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!--Check if {{documentation}} is transcluded &lt;br /&gt;
      on a /doc or /testcases page--&amp;gt;&lt;br /&gt;
  {{#switch: {{SUBPAGENAME}}&lt;br /&gt;
  | doc&lt;br /&gt;
  | testcases = strange&lt;br /&gt;
  }}&lt;br /&gt;
  &amp;lt;!--More checks can be added here, just return anything&lt;br /&gt;
      to make the surrounding if-case trigger--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;includeonly&amp;gt;[[Category:Wikipedia pages with strange ((documentation)) usage|{{main other|Main:}}{{FULLPAGENAME}}]]&amp;lt;!-- Sort on namespace --&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box2&amp;diff=15624</id>
		<title>Template:Documentation/end box2</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Documentation/end_box2&amp;diff=15624"/>
		<updated>2013-12-08T19:37:37Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: move the end of documentation wrapper into this template, from endbox. Allows for reuse of endbox in Module namespace.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--So right or left floating items don&#039;t stick out of the doc box.--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!--End of green doc box--&amp;gt;&amp;lt;!--&lt;br /&gt;
  Link box below for the doc meta-data:&lt;br /&gt;
--&amp;gt;{{documentation/end box&lt;br /&gt;
| preload = {{{preload|}}}   &amp;lt;!--Allow custom preloads--&amp;gt;&lt;br /&gt;
| content = {{{content|}}}&lt;br /&gt;
| link box = {{{link box|}}}   &amp;lt;!--So &amp;quot;link box=off&amp;quot; works--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| docpage = &lt;br /&gt;
  {{#if: {{{1|}}}&lt;br /&gt;
  | {{{1|}}}&lt;br /&gt;
  | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
  }}&lt;br /&gt;
| doc exist = &lt;br /&gt;
  {{#ifexist: &lt;br /&gt;
    {{#if: {{{1|}}}&lt;br /&gt;
    | {{{1|}}}   &amp;lt;!--Other docname fed--&amp;gt;&lt;br /&gt;
    | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
    }}&lt;br /&gt;
  | yes&lt;br /&gt;
  }}&lt;br /&gt;
| docname fed =&lt;br /&gt;
  {{#if: {{{1|}}}&lt;br /&gt;
  | yes&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| sandbox = &lt;br /&gt;
  {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/sandbox&lt;br /&gt;
| testcases = &lt;br /&gt;
  {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/testcases&lt;br /&gt;
&lt;br /&gt;
| template page = &lt;br /&gt;
  {{NAMESPACE}}:{{{template page|{{PAGENAME}}}}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{pp-template}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21863</id>
		<title>MediaWiki:InterwikiMapBackup</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21863"/>
		<updated>2013-12-07T00:26:59Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Robot: delete: encyclopediadramatica, rationalwiki, wikiapiary; modify: b, m, meta, n, oldwikisource, q, s, v, w&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Do not edit this page. It will be automatically revised by the maintenance script when the interwiki table is updated.&lt;br /&gt;
--&amp;gt;{{MediaWiki:interwikimap-backup-desc}}&lt;br /&gt;
&lt;br /&gt;
==Current interwiki map==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;plainlinks&amp;quot;&lt;br /&gt;
!Prefix&lt;br /&gt;
!URL&lt;br /&gt;
!Forward&lt;br /&gt;
!Transclude&lt;br /&gt;
!API URL&lt;br /&gt;
!Wiki ID&lt;br /&gt;
|-&lt;br /&gt;
| aa || https://aa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ab || https://ab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| abbenormal || http://johnabbe.wagn.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ace || https://ace.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| acronym || http://www.acronymfinder.com/af-query.asp?String=exact&amp;amp;Acronym=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advisory || https://advisory.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advogato || http://www.advogato.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aew || http://wiki.arabeyes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| af || https://af.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ak || https://ak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| als || https://als.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| am || https://am.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| an || https://an.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ang || https://ang.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| appropedia || http://www.appropedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aquariumwiki || http://www.theaquariumwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ar || https://ar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arborwiki || http://arborwiki.org/city/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arc || https://arc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arxiv || http://arxiv.org/abs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arz || https://arz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| as || https://as.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ast || https://ast.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| atmwiki || http://www.otterstedt.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| av || https://av.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ay || https://ay.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| az || https://az.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| b || https://en.wikibooks.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ba || https://ba.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bar || https://bar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bat-smg || https://bat-smg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| battlestarwiki || http://en.battlestarwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcl || https://bcl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcnbio || http://historiapolitica.bcn.cl/resenas_parlamentarias/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be || https://be.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be-x-old || https://be-x-old.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| beacha || http://www.beachapedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawikiversity || https://beta.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bg || https://bg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bh || https://bh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bi || https://bi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| biblewiki || http://bible.tmtm.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bjn || https://bjn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bluwiki || http://bluwiki.com/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| blw || http://britainloveswikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bm || https://bm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bn || https://bn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bo || https://bo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| botwiki || http://botwiki.sno.cc/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| boxrec || http://www.boxrec.com/media/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bpy || https://bpy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| br || https://br.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| brickwiki || http://www.brickwiki.info/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bs || https://bs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bug || https://bug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bugzilla || https://bugzilla.wikimedia.org/show_bug.cgi?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bulba || http://bulbapedia.bulbagarden.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buzztard || http://buzztard.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bxr || https://bxr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bytesmiths || http://www.Bytesmiths.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2 || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2find || http://c2.com/cgi/wiki?FindPage&amp;amp;value=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ca || https://ca.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cache || https://www.google.com/search?q=cache:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cbk-zam || https://cbk-zam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cdo || https://cdo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ce || https://ce.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ceb || https://ceb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cellwiki || http://cell.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| centralwikia || http://community.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ch || https://ch.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chapter || https://en.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cho || https://cho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| choralwiki || http://www.cpdl.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chr || https://chr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chy || https://chy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| citizendium || http://en.citizendium.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckb || https://ckb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckwiss || http://www.ck-wissen.de/ckwiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| co || https://co.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comixpedia || http://www.comixpedia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| commons || https://commons.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communityscheme || http://community.schemewiki.org/?c=s&amp;amp;key=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communitywiki || http://www.communitywiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comune || http://rete.comuni-italiani.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| corpknowpedia || http://corpknowpedia.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cr || https://cr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crazyhacks || http://www.crazy-hacks.org/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommons || https://creativecommons.org/licenses/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommonswiki || http://wiki.creativecommons.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creatureswiki || http://creatures.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crh || https://crh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cs || https://cs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| csb || https://csb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cu || https://cu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cv || https://cv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cxej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cy || https://cy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cz || https://cz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| d || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| da || https://da.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dbdump || http://download.wikimedia.org/$1/latest/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcc || http://www.dccwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcdatabase || http://dc.wikia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcma || http://christian-morgenstern.de/dcma/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| de || https://de.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dejanews || http://www.deja.com/=dnc/getdoc.xp?AN=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| delicious || https://www.delicious.com/tag/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| devmo || https://developer.mozilla.org/en/docs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dict || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dictionary || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| diq || https://diq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| disinfopedia || http://www.sourcewatch.org/wiki.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreaders || http://www.pgdp.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreadersca || http://www.pgdpcanada.net/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dk || https://dk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmoz || http://www.dmoz.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmozs || http://www.dmoz.org/cgi-bin/search?search=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| docbook || http://wiki.docbook.org/topic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doi || http://dx.doi.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| donate || https://donate.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doom_wiki || http://doom.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| download || http://download.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drae || http://lema.rae.es/drae/?val=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dreamhost || http://wiki.dreamhost.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drumcorpswiki || http://www.drumcorpswiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dsb || https://dsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dv || https://dv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dwjwiki || http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dz || https://dz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecoreality || http://www.EcoReality.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecxei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ee || https://ee.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| el || https://el.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| elibre || http://enciclopedia.us.es/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emacswiki || http://www.emacswiki.org/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eml || https://eml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| en || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyc || http://encyc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| energiewiki || http://www.netzwerk-energieberater.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| englyphwiki || http://en.glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eo || https://eo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eokulturcentro || http://esperanto.toulouse.free.fr/nova/wikini/wakka.php?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| epo || https://epo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| es || https://es.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| et || https://et.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| etherpad || https://etherpad.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologue || https://www.ethnologue.com/show_language.asp?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologuefamily || https://www.ethnologue.com/show_family.asp?subid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eu || https://eu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| evowiki || http://wiki.cotch.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| exotica || http://www.exotica.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ext || https://ext.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eĉei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fa || https://fa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fanimutationwiki || http://wiki.animutationportal.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ff || https://ff.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fi || https://fi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalempire || http://final-empire.sourceforge.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalfantasy || http://finalfantasy.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finnix || http://www.finnix.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fiu-vro || https://fiu-vro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fj || https://fj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickrphoto || http://www.flickr.com/photo.gne?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickruser || http://www.flickr.com/people/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| floralwiki || http://www.floralwiki.co.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flyerwiki-de || http://de.flyerwiki.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fo || https://fo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foldoc || http://foldoc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| forthfreak || http://wiki.forthfreak.net/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foundation || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foxwiki || http://fox.wikis.com/wc.dll?Wiki~$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fr || https://fr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebio || http://freebiology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebsdman || http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;amp;query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freeculturewiki || http://wiki.freeculture.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freedomdefined || http://freedomdefined.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freefeel || http://freefeel.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freekiwiki || http://wiki.freegeek.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freenode || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frp || https://frp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frr || https://frr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fur || https://fur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fy || https://fy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ga || https://ga.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gag || https://gag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gan || https://gan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ganfyd || http://ganfyd.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gardenology || http://www.gardenology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gausswiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gd || https://gd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gentoo-wiki || http://gentoo-wiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| genwiki || http://wiki.genealogy.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gerrit || https://gerrit.wikimedia.org/r/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| git || https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/$1;a=log;h=refs/heads/master || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gl || https://gl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glk || https://glk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| globalvoices || http://cyber.law.harvard.edu/dyn/globalvoices/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarwiki || http://glossar.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarywiki || http://glossary.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gn || https://gn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| google || https://www.google.com/search?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googledefine || https://www.google.com/search?q=define:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googlegroups || https://groups.google.com/groups?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| got || https://got.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gotamac || http://www.got-a-mac.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| greatlakeswiki || http://greatlakeswiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gu || https://gu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwarswiki || http://wiki.guildwars.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwiki || http://guildwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenberg || http://www.gutenberg.org/etext/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenbergwiki || http://www.gutenberg.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gv || https://gv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| h2wiki || http://halowiki.net/p/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ha || https://ha.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hackerspaces || http://hackerspaces.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hak || https://hak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hammondwiki || http://www.dairiki.org/HammondWiki/index.php3?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| haw || https://haw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| he || https://he.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| heroeswiki || http://heroeswiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hi || https://hi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hif || https://hif.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ho || https://ho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hr || https://hr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrfwiki || http://fanstuff.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrwiki || http://www.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hsb || https://hsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ht || https://ht.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hu || https://hu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hupwiki || http://wiki.hup.hu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hy || https://hy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hz || https://hz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ia || https://ia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iarchive || https://archive.org/details/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| id || https://id.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ie || https://ie.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ig || https://ig.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ii || https://ii.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ik || https://ik.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ilo || https://ilo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcharacter || http://www.imdb.com/character/ch$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcompany || http://www.imdb.com/company/co$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbname || http://www.imdb.com/name/nm$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbtitle || http://www.imdb.com/title/tt$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| incubator || https://incubator.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infoanarchy || http://www.infoanarchy.org/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosecpedia || http://infosecpedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosphere || http://theinfosphere.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| io || https://io.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| irc || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ircrc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| is || https://is.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iso639-3 || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| issn || http://www.worldcat.org/issn/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| it || https://it.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iu || https://iu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iuridictum || http://iuridictum.pecina.cz/w/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ja || https://ja.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jaglyphwiki || http://glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jameshoward || http://jameshoward.us/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javanet || http://wiki.java.net/bin/view/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javapedia || http://wiki.java.net/bin/view/Javapedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jbo || https://jbo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jefo || http://esperanto-jeunes.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jiniwiki || http://www.cdegroot.com/cgi-bin/jini?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jira || https://jira.toolserver.org/browse/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jp || https://jp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jspwiki || http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jstor || http://www.jstor.org/journals/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jv || https://jv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ka || https://ka.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kaa || https://kaa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kab || https://kab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kamelo || http://kamelopedia.mormo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| karlsruhe || http://ka.stadtwiki.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kbd || https://kbd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kerimwiki || http://wiki.oxus.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kg || https://kg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ki || https://ki.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kinowiki || http://kino.skripov.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kj || https://kj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kk || https://kk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kl || https://kl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| km || https://km.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kmwiki || https://kmwiki.wikispaces.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kn || https://kn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ko || https://ko.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koi || https://koi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kontuwiki || http://kontu.merri.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koslarwiki || http://wiki.koslar.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kpopwiki || http://www.kpopwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kr || https://kr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| krc || https://krc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ks || https://ks.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ksh || https://ksh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ku || https://ku.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kv || https://kv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kw || https://kw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ky || https://ky.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| la || https://la.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| labsconsole || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lad || https://lad.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lb || https://lb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lbe || https://lbe.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lez || https://lez.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lg || https://lg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| li || https://li.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| libreplanet || https://libreplanet.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lij || https://lij.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linguistlist || https://linguistlist.org/forms/langs/LLDescription.cfm?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwiki || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwikide || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| liswiki || http://liswiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| literateprograms || http://en.literateprograms.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| livepedia || http://www.livepedia.gr/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lmo || https://lmo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ln || https://ln.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lo || https://lo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lojban || http://www.lojban.org/tiki/tiki-index.php?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lostpedia || http://lostpedia.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lqwiki || http://wiki.linuxquestions.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lt || https://lt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ltg || https://ltg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lugkr || http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| luxo || https://tools.wmflabs.org/guc/?user=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lv || https://lv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| m || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mail || https://lists.wikimedia.org/mailman/listinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mailarchive || http://lists.wikimedia.org/pipermail/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| map-bms || https://map-bms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mariowiki || http://www.mariowiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| marveldatabase || http://www.marveldatabase.com/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mdf || https://mdf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meatball || http://meatballwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediawikiwiki || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediazilla || https://bugzilla.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| memoryalpha || http://memory-alpha.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meta || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawiki || http://sunir.org/apps/meta.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawikipedia || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mg || https://mg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mh || https://mh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mhr || https://mhr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mi || https://mi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| min || https://min.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mineralienatlas || http://www.mineralienatlas.de/lexikon/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| minnan || https://minnan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mk || https://mk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ml || https://ml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mn || https://mn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mo || https://mo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| moinmoin || http://moinmo.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| monstropedia || http://www.monstropedia.org/?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mosapedia || http://mosapedia.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozcom || http://mozilla.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillawiki || https://wiki.mozilla.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillazinekb || http://kb.mozillazine.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mr || https://mr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mrj || https://mrj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ms || https://ms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mt || https://mt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mus || https://mus.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| musicbrainz || http://musicbrainz.org/doc/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mw || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwl || https://mwl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwod || http://www.merriam-webster.com/cgi-bin/dictionary?book=Dictionary&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwot || http://www.merriam-webster.com/cgi-bin/thesaurus?book=Thesaurus&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| my || https://my.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| myv || https://myv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mzn || https://mzn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| n || https://en.wikinews.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| na || https://na.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nah || https://nah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nan || https://nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nap || https://nap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nara || http://research.archives.gov/description/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nb || https://nb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds || https://nds.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds-nl || https://nds-nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ne || https://ne.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| new || https://new.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ng || https://ng.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nkcells || http://www.nkcells.info/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nl || https://nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nn || https://nn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| no || https://no.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nosmoke || http://no-smok.net/nsmk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nost || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nostalgia || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nov || https://nov.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nrm || https://nrm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nso || https://nso.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nv || https://nv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ny || https://ny.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oc || https://oc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oeis || https://oeis.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oldwikisource || https://wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| olpc || http://wiki.laptop.org/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| om || https://om.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| onelook || http://www.onelook.com/?ls=b&amp;amp;w=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openfacts || http://openfacts.berlios.de/index-en.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openlibrary || http://openlibrary.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openstreetmap || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwetware || http://openwetware.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwiki || http://openwiki.com/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| opera7wiki || http://operawiki.info/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| or || https://or.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| organicdesign || http://www.organicdesign.co.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| orthodoxwiki || http://orthodoxwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| os || https://os.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osi_reference_model || http://wiki.tigma.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osmwiki || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrs || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketID=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrswiki || https://otrs-wiki.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ourmedia || https://www.socialtext.net/ourmedia/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreach || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreachwiki || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pa || https://pa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pag || https://pag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pam || https://pam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| panawiki || http://wiki.alairelibre.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pap || https://pap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| patwiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pcd || https://pcd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pdc || https://pdc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| perlnet || http://perl.net.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| personaltelco || http://www.personaltelco.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pfl || https://pfl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phpwiki || http://phpwiki.sourceforge.net/phpwiki/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phwiki || http://www.pocketheaven.com/ph/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pi || https://pi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pih || https://pih.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pl || https://pl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| planetmath || http://planetmath.org/node/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pmeg || http://www.bertilow.com/pmeg/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pms || https://pms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnb || https://pnb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnt || https://pnt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ps || https://ps.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| psycle || http://psycle.sourceforge.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pt || https://pt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pyrev || https://www.mediawiki.org/wiki/Special:Code/pywikipedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythoninfo || http://www.python.org/cgi-bin/moinmoin/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythonwiki || http://www.pythonwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pywiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| q || https://en.wikiquote.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| qu || https://qu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| quality || https://quality.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rcirc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| reuterswiki || http://glossary.reuters.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rev || https://www.mediawiki.org/wiki/Special:Code/MediaWiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| revo || http://purl.org/NET/voko/revo/art/$1.html || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rfc || https://tools.ietf.org/html/rfc$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rheinneckar || http://rhein-neckar-wiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rm || https://rm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rmy || https://rmy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rn || https://rn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ro || https://ro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-rup || https://roa-rup.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-tara || https://roa-tara.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| robowiki || http://robowiki.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rowiki || http://wiki.rennkuckuck.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rt || https://rt.wikimedia.org/Ticket/Display.html?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rtfm || ftp://rtfm.mit.edu/pub/faqs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ru || https://ru.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rue || https://rue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rw || https://rw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s || https://en.wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s23wiki || http://s23.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sa || https://sa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sah || https://sah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sc || https://sc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scholar || http://scholar.google.com/scholar?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| schoolswp || http://schools-wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scn || https://scn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sco || https://sco.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scores || http://imslp.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scoutwiki || http://en.scoutwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scramble || http://www.scramble.nl/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sd || https://sd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| se || https://se.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seapig || http://www.seapig.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewiki || http://seattlewiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewireless || http://seattlewireless.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| securewikidc || https://secure.wikidc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| semantic-mw || https://www.semantic-mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| senseislibrary || http://senseis.xmp.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sep11 || https://sep11.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sg || https://sg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sh || https://sh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharemap || http://sharemap.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| si || https://si.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| silcode || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| simple || https://simple.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sk || https://sk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sl || https://sl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slashdot || http://slashdot.org/article.pl?sid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slwiki || http://wiki.secondlife.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sm || https://sm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| smikipedia || http://www.smiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sn || https://sn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| so || https://so.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sourceforge || http://sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| spcom || https://spcom.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| species || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sq || https://sq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| squeak || http://wiki.squeak.org/squeak/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sr || https://sr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| srn || https://srn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ss || https://ss.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| st || https://st.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stats || http://stats.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stewardry || https://toolserver.org/~pathoschild/stewardry/?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stq || https://stq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategy || https://strategy.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategywiki || http://strategywiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| su || https://su.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sulutil || https://toolserver.org/~quentinv57/sulinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sv || https://sv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svgwiki || http://wiki.svg.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svn || https://svn.wikimedia.org/viewvc/mediawiki/$1?view=log || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sw || https://sw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swinbrain || http://mercury.it.swin.edu.au/swinbrain/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swingwiki || http://www.swingwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swtrain || http://train.spottingworld.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| szl || https://szl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ta || https://ta.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tabwiki || http://www.tabwiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tavi || http://tavi.sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tclerswiki || http://wiki.tcl.tk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| te || https://te.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| technorati || http://www.technorati.com/search/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tenwiki || https://ten.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tesoltaiwan || http://www.tesol-taiwan.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| test2wiki || https://test2.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwiki || https://test.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwikidata || https://test.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tet || https://tet.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tg || https://tg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| th || https://th.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thelemapedia || http://www.thelemapedia.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| theopedia || http://www.theopedia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thinkwiki || http://www.thinkwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ti || https://ti.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tibiawiki || http://tibia.erig.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ticket || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketNumber=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tk || https://tk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tl || https://tl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmbw || http://tmbw.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmnet || http://www.technomanifestos.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmwiki || http://www.EasyTopicMaps.com/?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tn || https://tn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| to || https://to.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| toollabs || https://tools.wmflabs.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tools || https://toolserver.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tpi || https://tpi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tr || https://tr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| translatewiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ts || https://ts.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tswiki || https://wiki.toolserver.org/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tt || https://tt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tum || https://tum.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tviv || http://tviv.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tvtropes || http://www.tvtropes.org/pmwiki/pmwiki.php/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tw || https://tw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| twiki || http://twiki.org/cgi-bin/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ty || https://ty.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyv || https://tyv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyvawiki || http://www.tyvawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| udm || https://udm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ug || https://ug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uk || https://uk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unihan || http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unreal || http://wiki.beyondunreal.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ur || https://ur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| urbandict || http://www.urbandictionary.com/define.php?term=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usability || https://usability.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usej || http://www.tejo.org/usej/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usemod || http://www.usemod.com/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uz || https://uz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| v || https://en.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ve || https://ve.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vec || https://vec.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vep || https://vep.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vi || https://vi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viaf || http://viaf.org/viaf/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vinismo || http://vinismo.com/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vkol || http://kol.coldfront.net/thekolwiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vlos || http://www.thuvienkhoahoc.com/tusach/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vls || https://vls.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vo || https://vo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voipinfo || http://www.voip-info.org/wiki/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voy || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| w || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wa || https://wa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| war || https://war.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| webisodes || http://www.webisodes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| werelate || http://www.werelate.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wg || http://wg.en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikia || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiasite || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikibooks || https://en.wikibooks.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichat || http://www.wikichat.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichristian || http://www.wikichristian.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicities || http://www.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicity || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikidata || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikif1 || http://www.wikif1.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikifur || http://en.wikifur.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikihow || http://www.wikihow.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiindex || http://wikiindex.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilemon || http://wiki.illemonati.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilivres || http://wikilivres.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimac-de || http://apfelwiki.de/wiki/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimedia || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinews || https://en.wikinews.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinfo || http://www.wikinfo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinvest || http://www.wikinvest.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiotics || https://wikiotics.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipaltz || http://www.wikipaltz.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipedia || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipediawikipedia || https://en.wikipedia.org/wiki/Wikipedia:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiquote || https://en.wikiquote.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikischool || http://www.wikischool.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiskripta || http://www.wikiskripta.eu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisophia || http://wikisophia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisource || https://en.wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispecies || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispot || http://wikispot.org/?action=gotowikipage&amp;amp;v=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitech || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiti || http://wikiti.denglend.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitree || http://wikitree.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiversity || https://en.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikivoyage || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiweet || http://wikiweet.nl/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiwikiweb || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikt || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiktionary || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wipipedia || http://www.londonfetishscene.com/wipi/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wlug || http://www.wlug.org.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2005 || https://wikimania2005.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2006 || https://wikimania2006.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2007 || https://wikimania2007.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2008 || https://wikimania2008.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2009 || https://wikimania2009.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2010 || https://wikimania2010.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2011 || https://wikimania2011.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2012 || https://wikimania2012.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2013 || https://wikimania2013.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2014 || https://wikimania2014.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmania || https://wikimania.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmar || http://www.wikimedia.org.ar/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmau || http://wikimedia.org.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbd || https://bd.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbe || https://be.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbr || https://br.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmca || http://wikimedia.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmch || http://www.wikimedia.ch/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcl || http://www.wikimediachile.cl/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmco || https://co.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcz || https://meta.wikimedia.org/wiki/Wikimedia_Czech_Republic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdc || http://wikimediadc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmde || https://wikimedia.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdeblog || https://blog.wikimedia.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdk || https://dk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmee || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmes || http://www.wikimedia.org.es/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmet || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmf || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfblog || https://blog.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfi || https://fi.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfr || http://wikimedia.fr/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhk || http://wikimedia.hk/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhu || http://wikimedia.hu/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmid || http://www.wikimedia.or.id/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmil || http://www.wikimedia.org.il/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmin || http://wiki.wikimedia.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmit || http://wiki.wikimedia.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmke || http://wikimedia.or.ke/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmk || https://mk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmx || https://mx.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnl || https://nl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmno || https://no.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnyc || https://nyc.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpa-us || https://pa-us.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmph || http://wikimedia.org.ph/wmph/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpl || https://pl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpt || http://wikimedia.pt/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmrs || https://rs.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmru || https://ru.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmse || https://se.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmsk || http://wikimedia.sk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmteam || https://wikimaniateam.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtr || https://tr.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtw || http://wikimedia.tw/wiki/index.php5/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmua || https://ua.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmuk || https://wiki.wikimedia.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmve || http://wikimedia.org.ve/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmza || http://wikimedia.org.za/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wo || https://wo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wookieepedia || http://starwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wowwiki || http://www.wowwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wqy || http://wqy.sourceforge.net/cgi-bin/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wurmpedia || http://wurmpedia.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wuu || https://wuu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xal || https://xal.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xh || https://xh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xmf || https://xmf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yi || https://yi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yo || https://yo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| za || https://za.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zea || https://zea.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cfr || https://zh-cfr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-classical || https://zh-classical.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cn || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-min-nan || https://zh-min-nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-tw || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-yue || https://zh-yue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zrhwiki || http://www.zrhwiki.ch/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zu || https://zu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zum || http://wiki.zum.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zwiki || http://www.zwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zzz_wiki || http://wiki.zzz.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ĉej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-dropdown-menus.js&amp;diff=23467</id>
		<title>MediaWiki:Gadget-dropdown-menus.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-dropdown-menus.js&amp;diff=23467"/>
		<updated>2013-12-06T12:03:36Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Undid revision 584335428 by Callanecc (talk): doesn&amp;#039;t seem to be working&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*********************************************************************&lt;br /&gt;
**                ***WARNING: GLOBAL GADGET FILE***                 **&lt;br /&gt;
**         any changes to this file will affect many users          **&lt;br /&gt;
**          please discuss changes on the talk page or at           **&lt;br /&gt;
**             [[Wikipedia talk:Gadget]] before editing             **&lt;br /&gt;
**     (consider dropping the script author a note as well...)      **&lt;br /&gt;
**                                                                  **&lt;br /&gt;
**********************************************************************&lt;br /&gt;
**             Script:        Drop-down menus                       **&lt;br /&gt;
**            Version:        4.51g                                 **&lt;br /&gt;
**             Author:        Haza-w                                **&lt;br /&gt;
**      Documentation:        [[User:Haza-w/Drop-down menus]]       **&lt;br /&gt;
**                                                                  **&lt;br /&gt;
*********************************************************************/&lt;br /&gt;
&lt;br /&gt;
// &amp;quot;Fail gracefully&amp;quot; if skin not supported&lt;br /&gt;
switch (skin) {&lt;br /&gt;
    case &#039;modern&#039;: case &#039;monobook&#039;: case &#039;vector&#039;:&lt;br /&gt;
&lt;br /&gt;
    // Global variables&lt;br /&gt;
    var _cactions = {&lt;br /&gt;
        admin: wgUserGroups.join().indexOf(&#039;sysop&#039;) &amp;gt; -1 ? true : false,&lt;br /&gt;
        areqs: [],&lt;br /&gt;
        hovms: skin == &#039;vector&#039; ? 50 : 400,&lt;br /&gt;
        menus: [],&lt;br /&gt;
        mouse: null,&lt;br /&gt;
        pname: encodeURIComponent(wgPageName),&lt;br /&gt;
        timer: [],&lt;br /&gt;
        vectr: skin == &#039;vector&#039; ? true : false&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Process XMLHttpRequests&lt;br /&gt;
    function xhr(request,url,orsc) {&lt;br /&gt;
        with (request) {&lt;br /&gt;
            open(&#039;GET&#039;,url,true);&lt;br /&gt;
            onreadystatechange = orsc;&lt;br /&gt;
            send(null);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Find absolute position of element&lt;br /&gt;
    function findPos(eid,offset) {&lt;br /&gt;
        var obj = document.getElementById(eid), pos = [0,0];&lt;br /&gt;
        do with (obj) {&lt;br /&gt;
            pos[0] += offsetLeft;&lt;br /&gt;
            pos[1] += offsetTop;&lt;br /&gt;
        } while (obj = obj.offsetParent);&lt;br /&gt;
        pos[0] += offset[0]; pos[1] += offset[1];&lt;br /&gt;
        return pos;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Create menu div element&lt;br /&gt;
    function createMenu(mid,vectorise,html) {&lt;br /&gt;
        var menu = document.createElement(&#039;div&#039;);&lt;br /&gt;
        with (menu) {&lt;br /&gt;
            id = &#039;opt-&#039; + mid;&lt;br /&gt;
            className = &#039;ca-menu&#039;;&lt;br /&gt;
            style.display = &#039;none&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        menu.onmouseover = function () {showMenu(&#039;opt-&#039;+mid)};&lt;br /&gt;
        menu.onmouseout = function () {hideMenu(&#039;opt-&#039;+mid)};&lt;br /&gt;
&lt;br /&gt;
        var elements = {&lt;br /&gt;
            ul: document.createElement(&#039;ul&#039;),&lt;br /&gt;
            li: null,&lt;br /&gt;
            a: null,&lt;br /&gt;
            txt: null&lt;br /&gt;
        };&lt;br /&gt;
        with (elements) {&lt;br /&gt;
            for (var i = 0; i &amp;lt; html.length; i++) if (html[i].length) {&lt;br /&gt;
                li = document.createElement(&#039;li&#039;); li.id = html[i][0];&lt;br /&gt;
                a = document.createElement(&#039;a&#039;); a.href = html[i][2];&lt;br /&gt;
                txt = document.createTextNode(html[i][1]);&lt;br /&gt;
                a.appendChild(txt); li.appendChild(a); ul.appendChild(li);&lt;br /&gt;
            }&lt;br /&gt;
            menu.appendChild(ul);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(menu);&lt;br /&gt;
        if (vectorise) createTab(mid);&lt;br /&gt;
&lt;br /&gt;
        return &#039;opt-&#039; + mid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Create cactions LI tab&lt;br /&gt;
    function createTab(mid) {&lt;br /&gt;
        var mtitle = mid.charAt(0).toUpperCase() + mid.substr(1);&lt;br /&gt;
&lt;br /&gt;
        if (_cactions.vectr) {&lt;br /&gt;
            var cid = &#039;p-&#039; + mid;&lt;br /&gt;
            var elements = {&lt;br /&gt;
                div: document.createElement(&#039;div&#039;),&lt;br /&gt;
                h3: document.createElement(&#039;h3&#039;),&lt;br /&gt;
                span: document.createElement(&#039;span&#039;),&lt;br /&gt;
                a: document.createElement(&#039;a&#039;),&lt;br /&gt;
                txt: null&lt;br /&gt;
            };&lt;br /&gt;
            with (elements) {&lt;br /&gt;
                div.id = cid;&lt;br /&gt;
                div.className = &#039;vectorMenu extraMenu&#039;;&lt;br /&gt;
&lt;br /&gt;
                txt = document.createTextNode(mtitle);&lt;br /&gt;
                span.appendChild(txt); h3.appendChild(span);&lt;br /&gt;
&lt;br /&gt;
                a.href = &#039;#&#039;;&lt;br /&gt;
                a.onmouseover = function () {showMenu(&#039;opt-&#039;+mid,findPos(cid,[0,40]))};&lt;br /&gt;
                a.onmouseout = function () {hideMenu(&#039;opt-&#039;+mid)};&lt;br /&gt;
&lt;br /&gt;
                span = document.createElement(&#039;span&#039;);&lt;br /&gt;
                txt = document.createTextNode(mtitle);&lt;br /&gt;
                span.appendChild(txt); a.appendChild(span); h3.appendChild(a);&lt;br /&gt;
&lt;br /&gt;
                div.appendChild(h3);&lt;br /&gt;
                document.getElementById(&#039;right-navigation&#039;).insertBefore(div,document.getElementById(&#039;p-search&#039;));&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            var cid = &#039;ca-&#039; + mid;&lt;br /&gt;
            var elements = {&lt;br /&gt;
                li: document.createElement(&#039;li&#039;),&lt;br /&gt;
                a: document.createElement(&#039;a&#039;),&lt;br /&gt;
                txt: document.createTextNode(mtitle)&lt;br /&gt;
            };&lt;br /&gt;
            with (elements) {&lt;br /&gt;
                li.id = cid;&lt;br /&gt;
                a.href = &#039;#&#039;;&lt;br /&gt;
                a.onmouseover = function () {showMenu(&#039;opt-&#039;+mid,findPos(cid,[-10,20]))};&lt;br /&gt;
                a.onmouseout = function () {hideMenu(&#039;opt-&#039;+mid)};&lt;br /&gt;
                a.appendChild(txt); li.appendChild(a);&lt;br /&gt;
&lt;br /&gt;
                document.getElementById(&#039;p-cactions&#039;).getElementsByTagName(&#039;div&#039;)[0].getElementsByTagName(&#039;ul&#039;)[0].appendChild(li);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // CSS hide elements&lt;br /&gt;
    function hideElements(elements,conditionals) {&lt;br /&gt;
        if (typeof(conditionals) == &#039;undefined&#039;) {&lt;br /&gt;
            for (var i = 0; i &amp;lt; elements.length; i++) if (document.getElementById(elements[i])) document.getElementById(elements[i]).style.display = &#039;none&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        else for (var i = 0; i &amp;lt; elements.length; i++) if (document.getElementById(elements[i])) {&lt;br /&gt;
            document.getElementById(elements[i]).style.display = &#039;none&#039;;&lt;br /&gt;
            if (conditionals[i]) document.getElementById(conditionals[i]).style.display = &#039;none&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Show/hide menu functions&lt;br /&gt;
    function showMenu(mid,pos) {&lt;br /&gt;
        with (_cactions) {&lt;br /&gt;
            mouse = mid;&lt;br /&gt;
            if (pos) for (var i = 0; i &amp;lt; menus.length; i++) {&lt;br /&gt;
                if (timer[menus[i]]) {&lt;br /&gt;
                    clearTimeout(timer[menus[i]]);&lt;br /&gt;
                    timer[menus[i]] = null;&lt;br /&gt;
                }&lt;br /&gt;
                if (mid.replace(/-[^-]+$/,&#039;&#039;) == menus[i]) continue;&lt;br /&gt;
                document.getElementById(menus[i]).style.display = &#039;none&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            if (!timer[mid]) with (document.getElementById(mid).style) {&lt;br /&gt;
                display = &#039;&#039;;&lt;br /&gt;
                if (pos) {&lt;br /&gt;
                    left = pos[0]+&#039;px&#039;;&lt;br /&gt;
                    top = pos[1]+&#039;px&#039;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                clearTimeout(timer[mid]);&lt;br /&gt;
                timer[mid] = null;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function hideMenu(mid) {&lt;br /&gt;
        with (_cactions) {&lt;br /&gt;
            if (mid == mouse.replace(/-[^-]+$/,&#039;&#039;)) timer[mid] = null;&lt;br /&gt;
&lt;br /&gt;
            if (timer[mid]) {&lt;br /&gt;
                timer[mid] = null;&lt;br /&gt;
                document.getElementById(mid).style.display = &#039;none&#039;;&lt;br /&gt;
                if (mid == mouse &amp;amp;&amp;amp; mid.search(/opt-.*-/) != -1) document.getElementById(mid.replace(/-[^-]+$/,&#039;&#039;)).style.display = &#039;none&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            else timer[mid] = setTimeout(&#039;hideMenu(\&#039;&#039;+mid+&#039;\&#039;);&#039;,hovms);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Delink element&lt;br /&gt;
    function removeLink(eid) {&lt;br /&gt;
        var element = document.getElementById(eid);&lt;br /&gt;
        if (!element.getElementsByTagName(&#039;a&#039;).length) return false;&lt;br /&gt;
&lt;br /&gt;
        var a = element.getElementsByTagName(&#039;a&#039;)[0];&lt;br /&gt;
        element.appendChild(a.removeChild(a.firstChild));&lt;br /&gt;
        element.removeChild(a);&lt;br /&gt;
&lt;br /&gt;
        element.className = &#039;ca-disabled&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // User options hook&lt;br /&gt;
    addOnloadHook(function () {&lt;br /&gt;
        switch (wgNamespaceNumber) {&lt;br /&gt;
            case 2: case 3: _cactions[&#039;uname&#039;] = encodeURIComponent(wgTitle.split(&#039;/&#039;)[0].replace(/ /g,&#039;_&#039;));&lt;br /&gt;
        }&lt;br /&gt;
        if (wgCanonicalSpecialPageName == &#039;Contributions&#039;) for (var i = 0, hl; hl = document.getElementById(&#039;contentSub&#039;).getElementsByTagName(&#039;a&#039;)[i]; i++) {&lt;br /&gt;
            if (hl.href.indexOf(&#039;user=&#039;) &amp;gt; -1) {&lt;br /&gt;
                _cactions[&#039;uname&#039;] = hl.href.split(&#039;user=&#039;)[1].split(&#039;&amp;amp;amp;&#039;)[0];&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (_cactions.uname) {&lt;br /&gt;
            with (_cactions) {&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;user&#039;,true,Array(&lt;br /&gt;
                    [&#039;c-u-logs&#039;,        &#039;User logs &amp;gt;&#039;,      &#039;#&#039;]                                                                                                            ,&lt;br /&gt;
                    [&#039;c-u-rfx&#039;,         &#039;Links to RfX &amp;gt;&#039;,   &#039;#&#039;]                                                                                                            ,&lt;br /&gt;
                    [&#039;c-u-blocks&#039;,      &#039;Blocks &amp;gt;&#039;,         &#039;#&#039;]                                                                                                            ,&lt;br /&gt;
                    [&#039;c-u-contribs&#039;,    &#039;Contributions&#039;,    wgScript+&#039;?title=Special:Contributions/&#039;+uname+&#039;&amp;amp;action=view&#039;]                                                  ,&lt;br /&gt;
                    [&#039;c-u-editcount&#039;,   &#039;Edit count&#039;,       &#039;//tools.wmflabs.org/xtools/pcount/index.php?lang=en&amp;amp;wiki=wikipedia&amp;amp;name=&#039;+uname.replace(/_/g,&#039;+&#039;)]         ,&lt;br /&gt;
                    [&#039;c-u-editsum&#039;,     &#039;Edit summaries&#039;,   &#039;//tools.wmflabs.org/xtools/editsummary/index.php?lang=en&amp;amp;wiki=wikipedia&amp;amp;name=&#039;+uname.replace(/_/g,&#039;+&#039;)]   ,&lt;br /&gt;
                    [&#039;c-u-wcuser&#039;,      &#039;Edit analysis&#039;,    &#039;http://en.wikichecker.com/user/?l=all&amp;amp;t=&#039;+uname]                                                               ,&lt;br /&gt;
                    [&#039;c-u-sul&#039;,         &#039;SUL status&#039;,       &#039;//toolserver.org/~vvv/sulutil.php?user=&#039;+uname]                                                           ,&lt;br /&gt;
                    [&#039;c-u-subpages&#039;,    &#039;Userspace&#039;,        wgScript+&#039;?title=Special:PrefixIndex/User:&#039;+uname+&#039;/&amp;amp;action=view&#039;]                                              ,&lt;br /&gt;
                    [&#039;c-u-email&#039;,       &#039;Email user&#039;,      wgScript+&#039;?title=Special:EmailUser/&#039;+uname+&#039;&amp;amp;action=view&#039;]                                                      ,&lt;br /&gt;
                    [&#039;c-u-groups&#039;,      &#039;User groups&#039;,      wgScript+&#039;?title=Special:ListUsers&amp;amp;action=view&amp;amp;limit=1&amp;amp;username=&#039;+uname]                                        ,&lt;br /&gt;
                    [&#039;c-u-rightslog&#039;,   &#039;Rights changes&#039;,   wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=rights&amp;amp;page=User:&#039;+uname]&lt;br /&gt;
                ));&lt;br /&gt;
&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;user-logs&#039;,false,Array(&lt;br /&gt;
                    [&#039;c-ul-logs&#039;,       &#039;All user logs&#039;,    wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;user=&#039;+uname]              ,&lt;br /&gt;
                    [&#039;c-ul-blocks&#039;,     &#039;Blocks&#039;,           wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=block&amp;amp;user=&#039;+uname]   ,&lt;br /&gt;
                    [&#039;c-ul-deletes&#039;,    &#039;Deletions&#039;,        wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=delete&amp;amp;user=&#039;+uname]  ,&lt;br /&gt;
                    [&#039;c-ul-moves&#039;,      &#039;Moves&#039;,            wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=move&amp;amp;user=&#039;+uname]    ,&lt;br /&gt;
                    [&#039;c-ul-patrols&#039;,    &#039;Patrols&#039;,          wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=patrol&amp;amp;user=&#039;+uname]  ,&lt;br /&gt;
                    [&#039;c-ul-protects&#039;,   &#039;Protections&#039;,      wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=protect&amp;amp;user=&#039;+uname] ,&lt;br /&gt;
                    [&#039;c-ul-uploads&#039;,    &#039;Uploads&#039;,          wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=upload&amp;amp;user=&#039;+uname]  ,&lt;br /&gt;
                    [&#039;c-ul-rights&#039;,     &#039;User rights&#039;,      wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=rights&amp;amp;user=&#039;+uname]&lt;br /&gt;
                ));&lt;br /&gt;
&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;user-rfx&#039;,false,Array(&lt;br /&gt;
                    [&#039;c-ux-rfa&#039;,        &#039;RfAs&#039;,             wgScript+&#039;?title=Special:PrefixIndex/Wikipedia:Requests_for_adminship/&#039;+uname+&#039;&amp;amp;action=view&#039;]       ,&lt;br /&gt;
                    [&#039;c-ux-rfb&#039;,        &#039;RfBs&#039;,             wgScript+&#039;?title=Special:PrefixIndex/Wikipedia:Requests_for_bureaucratship/&#039;+uname+&#039;&amp;amp;action=view&#039;]  ,&lt;br /&gt;
                    [&#039;c-ux-rfar&#039;,       &#039;RfAr&#039;,             wgScript+&#039;?title=Wikipedia:Requests_for_arbitration/&#039;+uname+&#039;&amp;amp;action=view&#039;]                         ,&lt;br /&gt;
                    [&#039;c-ux-rfc&#039;,        &#039;RfC&#039;,              wgScript+&#039;?title=Wikipedia:Requests_for_comment/&#039;+uname+&#039;&amp;amp;action=view&#039;]                             ,&lt;br /&gt;
                    [&#039;c-ux-rfcu&#039;,       &#039;RfCU&#039;,             wgScript+&#039;?title=Wikipedia:Requests_for_checkuser/Case/&#039;+uname+&#039;&amp;amp;action=view&#039;]                      ,&lt;br /&gt;
                    [&#039;c-ux-spi&#039;,        &#039;SPI&#039;,              wgScript+&#039;?title=Wikipedia:Sockpuppet_investigations/&#039;+uname+&#039;&amp;amp;action=view&#039;]&lt;br /&gt;
                ));&lt;br /&gt;
&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;user-blocks&#039;,false,Array(&lt;br /&gt;
                    admin?          [&#039;c-ub-block&#039;,          &#039;Block user&#039;,       wgScript+&#039;?title=Special:BlockIP/&#039;+uname+&#039;&amp;amp;action=view&#039;]            :[] ,&lt;br /&gt;
                    admin?          [&#039;c-ub-unblock&#039;,        &#039;Unblock user&#039;,     wgScript+&#039;?title=Special:IPBlockList&amp;amp;action=unblock&amp;amp;ip=&#039;+uname]     :[] ,&lt;br /&gt;
                                    [&#039;c-ub-ipblock&#039;,        &#039;View block&#039;,       wgScript+&#039;?title=Special:IPBlockList&amp;amp;action=view&amp;amp;ip=&#039;+uname]            ,&lt;br /&gt;
                                    [&#039;c-ub-blocklog&#039;,       &#039;Block log&#039;,        wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=block&amp;amp;page=User:&#039;+uname]&lt;br /&gt;
                ));&lt;br /&gt;
&lt;br /&gt;
                if (sajax_init_object() &amp;amp;&amp;amp; wgEnableAPI) {&lt;br /&gt;
                    if (uname.search(/(?:\d{1,3}\.){3}\d{1,3}/) == 0) {&lt;br /&gt;
                        areqs[&#039;ip&#039;] = new sajax_init_object();&lt;br /&gt;
                        xhr(areqs[&#039;ip&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=blocks&amp;amp;bkusers=&#039;+uname+&#039;&amp;amp;bkprop=id&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                            with (areqs[&#039;ip&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                                var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                                if (api.query.blocks.length) {&lt;br /&gt;
                                    hideElements([&#039;c-ub-block&#039;]);&lt;br /&gt;
                                    document.getElementById(&#039;c-ub-ipblock&#039;).getElementsByTagName(&#039;a&#039;)[0].style.color = &#039;#EE1111&#039;;&lt;br /&gt;
                                }&lt;br /&gt;
                                else {&lt;br /&gt;
                                    hideElements([&#039;c-ub-unblock&#039;]);&lt;br /&gt;
                                    removeLink(&#039;c-ub-ipblock&#039;);&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        } );&lt;br /&gt;
                    }&lt;br /&gt;
                    else {&lt;br /&gt;
                        areqs[&#039;user&#039;] = new sajax_init_object();&lt;br /&gt;
                        xhr(areqs[&#039;user&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=users&amp;amp;ususers=&#039;+uname+&#039;&amp;amp;usprop=blockinfo|groups&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                            with (areqs[&#039;user&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                                var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                                with (api.query.users[0]) {&lt;br /&gt;
                                    if (typeof(missing) != &#039;undefined&#039;) hideElements([&#039;ca-user&#039;]);&lt;br /&gt;
                                    else {&lt;br /&gt;
                                        if (typeof(blockedby) != &#039;undefined&#039;) {&lt;br /&gt;
                                            hideElements([&#039;c-ub-block&#039;]);&lt;br /&gt;
                                            document.getElementById(&#039;c-ub-ipblock&#039;).getElementsByTagName(&#039;a&#039;)[0].style.color = &#039;#EE1111&#039;;&lt;br /&gt;
                                        }&lt;br /&gt;
                                        else {&lt;br /&gt;
                                            hideElements([&#039;c-ub-unblock&#039;]);&lt;br /&gt;
                                            removeLink(&#039;c-ub-ipblock&#039;);&lt;br /&gt;
                                        }&lt;br /&gt;
&lt;br /&gt;
                                        if (typeof(groups) == &#039;undefined&#039; || groups.join().indexOf(&#039;sysop&#039;) == -1) hideElements([&#039;c-ul-blocks&#039;,&#039;c-ul-deletes&#039;,&#039;c-ul-protects&#039;,&#039;c-ul-rights&#039;]);&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
                        areqs[&#039;rfa&#039;] = new sajax_init_object();&lt;br /&gt;
                        xhr(areqs[&#039;rfa&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=allpages&amp;amp;apprefix=Requests_for_adminship%2F&#039;+uname+&#039;&amp;amp;apnamespace=4&amp;amp;aplimit=1&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                            with (areqs[&#039;rfa&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                                var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                                if (!api.query.allpages.length) removeLink(&#039;c-ux-rfa&#039;);&lt;br /&gt;
                            }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
                        areqs[&#039;rfb&#039;] = new sajax_init_object();&lt;br /&gt;
                        xhr(areqs[&#039;rfb&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=allpages&amp;amp;apprefix=Requests_for_bureaucratship%2F&#039;+uname+&#039;&amp;amp;apnamespace=4&amp;amp;aplimit=1&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                            with (areqs[&#039;rfb&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                                var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                                if (!api.query.allpages.length) removeLink(&#039;c-ux-rfb&#039;);&lt;br /&gt;
                            }&lt;br /&gt;
                        } );&lt;br /&gt;
&lt;br /&gt;
                        areqs[&#039;uspace&#039;] = new sajax_init_object();&lt;br /&gt;
                        xhr(areqs[&#039;uspace&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=allpages&amp;amp;apprefix=&#039;+uname+&#039;%2F&amp;amp;apnamespace=2&amp;amp;aplimit=1&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                            with (areqs[&#039;uspace&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                                var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                                if (!api.query.allpages.length) removeLink(&#039;c-u-subpages&#039;);&lt;br /&gt;
                            }&lt;br /&gt;
                        } );&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    areqs[&#039;rfx&#039;] = new sajax_init_object();&lt;br /&gt;
                    xhr(areqs[&#039;rfx&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;titles=Wikipedia:Requests_for_arbitration/&#039;+uname+&#039;|Wikipedia:Requests_for_comment/&#039;+uname+&#039;|Wikipedia:Requests_for_checkuser/Case/&#039;+uname+&#039;|Wikipedia:Sockpuppet_investigations/&#039;+uname+&#039;&amp;amp;letype=block&amp;amp;letitle=User:&#039;+uname+&#039;&amp;amp;prop=info&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                        with (areqs[&#039;rfx&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                            var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                            for (i in api.query.pages) switch (api.query.pages[i].title.split(&#039;/&#039;)[0]) {&lt;br /&gt;
                                case &#039;Wikipedia:Requests for arbitration&#039;: if (typeof(api.query.pages[i].missing) != &#039;undefined&#039;) removeLink(&#039;c-ux-rfar&#039;); break;&lt;br /&gt;
                                case &#039;Wikipedia:Requests for comment&#039;: if (typeof(api.query.pages[i].missing) != &#039;undefined&#039;) removeLink(&#039;c-ux-rfc&#039;); break;&lt;br /&gt;
                                case &#039;Wikipedia:Requests for checkuser&#039;: if (typeof(api.query.pages[i].missing) != &#039;undefined&#039;) removeLink(&#039;c-ux-rfcu&#039;); break;&lt;br /&gt;
                                case &#039;Wikipedia:Sockpuppet investigations&#039;: if (typeof(api.query.pages[i].missing) != &#039;undefined&#039;) removeLink(&#039;c-ux-spi&#039;); break;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    } );&lt;br /&gt;
&lt;br /&gt;
                    areqs[&#039;ublocks&#039;] = new sajax_init_object();&lt;br /&gt;
                    xhr(areqs[&#039;ublocks&#039;],wgScriptPath+&#039;/api.php?format=json&amp;amp;action=query&amp;amp;list=logevents&amp;amp;letype=block&amp;amp;letitle=User:&#039;+uname+&#039;&amp;amp;lelimit=1&amp;amp;xhr=&#039;+Math.random(),function () {&lt;br /&gt;
                        with (areqs[&#039;ublocks&#039;]) if (readyState == 4 &amp;amp;&amp;amp; status == 200) {&lt;br /&gt;
                            var api = eval(&#039;(&#039;+responseText+&#039;)&#039;);&lt;br /&gt;
                            if (!api.query.logevents.length) removeLink(&#039;c-ub-blocklog&#039;);&lt;br /&gt;
                        }&lt;br /&gt;
                    } );&lt;br /&gt;
                }&lt;br /&gt;
                else hideElements([&#039;c-ub-ipblock&#039;,&#039;c-ul-blocks&#039;,&#039;c-ul-deletes&#039;,&#039;c-ul-protects&#039;,&#039;c-ul-rights&#039;]);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            hideElements([&#039;t-contributions&#039;,&#039;t-log&#039;,&#039;t-emailuser&#039;]);&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&#039;c-u-logs&#039;).onmouseover = function () {showMenu(&#039;opt-user-logs&#039;,findPos(&#039;c-u-logs&#039;,[40,0]))};&lt;br /&gt;
            document.getElementById(&#039;c-u-logs&#039;).onmouseout = function () {hideMenu(&#039;opt-user-logs&#039;)};&lt;br /&gt;
            document.getElementById(&#039;c-u-logs&#039;).style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&#039;c-u-rfx&#039;).onmouseover = function () {showMenu(&#039;opt-user-rfx&#039;,findPos(&#039;c-u-rfx&#039;,[40,0]))};&lt;br /&gt;
            document.getElementById(&#039;c-u-rfx&#039;).onmouseout = function () {hideMenu(&#039;opt-user-rfx&#039;)};&lt;br /&gt;
            document.getElementById(&#039;c-u-rfx&#039;).style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
            document.getElementById(&#039;opt-user-rfx&#039;).style.width = &#039;50px&#039;;&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&#039;c-u-blocks&#039;).onmouseover = function () {showMenu(&#039;opt-user-blocks&#039;,findPos(&#039;c-u-blocks&#039;,[40,0]))};&lt;br /&gt;
            document.getElementById(&#039;c-u-blocks&#039;).onmouseout = function () {hideMenu(&#039;opt-user-blocks&#039;)};&lt;br /&gt;
            document.getElementById(&#039;c-u-blocks&#039;).style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
&lt;br /&gt;
            if (_cactions.uname.search(/(?:\d{1,3}\.){3}\d{1,3}/) == 0) hideElements([&#039;c-u-logs&#039;,&#039;c-ux-rfa&#039;,&#039;c-ux-rfb&#039;,&#039;c-u-editcount&#039;,&#039;c-u-editsum&#039;,&#039;c-u-wcuser&#039;,&#039;c-u-subpages&#039;,&#039;c-u-email&#039;,&#039;c-u-groups&#039;,&#039;c-u-rightslog&#039;]);&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Page options hook&lt;br /&gt;
    addOnloadHook(function () {&lt;br /&gt;
        if (!wgCanonicalSpecialPageName) {&lt;br /&gt;
            with (_cactions) {&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;page&#039;,true,Array(&lt;br /&gt;
                                    [&#039;c-p-logs&#039;,        &#039;Page logs &amp;gt;&#039;,      &#039;#&#039;],&lt;br /&gt;
                    wgArticleId?    [&#039;c-p-history&#039;,     &#039;History&#039;,          wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=history&#039;]                     :[] ,&lt;br /&gt;
                    wgArticleId?    [&#039;c-p-move&#039;,        &#039;Move page&#039;,        wgScript+&#039;?title=Special:Movepage/&#039;+pname+&#039;&amp;amp;action=view&#039;]       :[] ,&lt;br /&gt;
                    !vectr?         [&#039;c-p-watch&#039;,       &#039;Watch page&#039;,       wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=watch&#039;]                       :[] ,&lt;br /&gt;
                    !vectr?         [&#039;c-p-unwatch&#039;,     &#039;Unwatch page&#039;,     wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=unwatch&#039;]                     :[] ,&lt;br /&gt;
                    admin?          [&#039;c-p-protect&#039;,     &#039;Protect page&#039;,     wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=protect&#039;]                     :[] ,&lt;br /&gt;
                    admin?          [&#039;c-p-unprotect&#039;,   &#039;Unprotect page&#039;,   wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=unprotect&#039;]                   :[] ,&lt;br /&gt;
                    admin?          [&#039;c-p-delete&#039;,      &#039;Delete page&#039;,      wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=delete&#039;]                      :[] ,&lt;br /&gt;
                    admin?          [&#039;c-p-undelete&#039;,    &#039;Undelete page&#039;,    wgScript+&#039;?title=Special:Undelete/&#039;+pname+&#039;&amp;amp;action=view&#039;]       :[] ,&lt;br /&gt;
                    wgArticleId?    [&#039;c-p-diff&#039;,        &#039;Latest diff&#039;,      wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=view&amp;amp;diff=&#039;+wgCurRevisionId]  :[] ,&lt;br /&gt;
                    wgArticleId?    [&#039;c-p-editzero&#039;,    &#039;Edit intro&#039;,       wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=edit&amp;amp;section=0&#039;]              :[] ,&lt;br /&gt;
                    wgArticleId?    [&#039;c-p-wcpage&#039;,      &#039;Page analysis&#039;,    &#039;http://en.wikichecker.com/article/?a=&#039;+pname]                  :[] ,&lt;br /&gt;
                                    [&#039;c-p-purge&#039;,       &#039;Purge cache&#039;,      wgScript+&#039;?title=&#039;+pname+&#039;&amp;amp;action=purge&#039;]&lt;br /&gt;
                ));&lt;br /&gt;
&lt;br /&gt;
                menus[menus.length] = createMenu(&#039;page-logs&#039;,false,Array(&lt;br /&gt;
                                                [&#039;c-pl-logs&#039;,       &#039;All page logs&#039;,    wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;page=&#039;+pname]                  ,&lt;br /&gt;
                                                [&#039;c-pl-deletes&#039;,    &#039;Deletion log&#039;,     wgScript+&#039;?title=Special:Log&amp;amp;type=delete&amp;amp;page=&#039;+pname]                  ,&lt;br /&gt;
                                                [&#039;c-pl-moves&#039;,      &#039;Move log&#039;,         wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=move&amp;amp;page=&#039;+pname]        ,&lt;br /&gt;
                    wgArticleId?                [&#039;c-pl-patrols&#039;,    &#039;Patrol log&#039;,       wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=patrol&amp;amp;page=&#039;+pname]  :[] ,&lt;br /&gt;
                                                [&#039;c-pl-protects&#039;,   &#039;Protection log&#039;,   wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=protect&amp;amp;page=&#039;+pname]     ,&lt;br /&gt;
                    wgNamespaceNumber == 6?     [&#039;c-pl-uploads&#039;,    &#039;Upload log&#039;,       wgScript+&#039;?title=Special:Log&amp;amp;action=view&amp;amp;type=upload&amp;amp;page=&#039;+pname]  :[]&lt;br /&gt;
                ));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            hideElements([&#039;ca-protect&#039;,&#039;ca-unprotect&#039;,&#039;ca-delete&#039;,&#039;ca-undelete&#039;,&#039;ca-history&#039;,&#039;ca-move&#039;],[&#039;c-p-unprotect&#039;,&#039;c-p-protect&#039;,&#039;c-p-undelete&#039;,&#039;p-c-delete&#039;]);&lt;br /&gt;
            if (!_cactions.vectr) hideElements([&#039;ca-watch&#039;,&#039;ca-unwatch&#039;],[&#039;c-p-unwatch&#039;,&#039;c-p-watch&#039;]);&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&#039;c-p-logs&#039;).onmouseover = function () {showMenu(&#039;opt-page-logs&#039;,findPos(&#039;c-p-logs&#039;,[40,0]))};&lt;br /&gt;
            document.getElementById(&#039;c-p-logs&#039;).onmouseout = function () {hideMenu(&#039;opt-page-logs&#039;)};&lt;br /&gt;
            document.getElementById(&#039;c-p-logs&#039;).style.fontWeight = &#039;bold&#039;;&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21862</id>
		<title>MediaWiki:InterwikiMapBackup</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:InterwikiMapBackup&amp;diff=21862"/>
		<updated>2013-12-03T17:40:20Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Robot: add: beacha, hackerspaces, iarchive, libreplanet, unihan; modify: luxo, nkcells, planetmath, semantic-mw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--Do not edit this page. It will be automatically revised by the maintenance script when the interwiki table is updated.&lt;br /&gt;
--&amp;gt;{{MediaWiki:interwikimap-backup-desc}}&lt;br /&gt;
&lt;br /&gt;
==Current interwiki map==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;plainlinks&amp;quot;&lt;br /&gt;
!Prefix&lt;br /&gt;
!URL&lt;br /&gt;
!Forward&lt;br /&gt;
!Transclude&lt;br /&gt;
!API URL&lt;br /&gt;
!Wiki ID&lt;br /&gt;
|-&lt;br /&gt;
| aa || https://aa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ab || https://ab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| abbenormal || http://johnabbe.wagn.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ace || https://ace.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| acronym || http://www.acronymfinder.com/af-query.asp?String=exact&amp;amp;Acronym=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advisory || https://advisory.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| advogato || http://www.advogato.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aew || http://wiki.arabeyes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| af || https://af.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ak || https://ak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| als || https://als.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| am || https://am.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| an || https://an.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ang || https://ang.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| appropedia || http://www.appropedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| aquariumwiki || http://www.theaquariumwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ar || https://ar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arborwiki || http://arborwiki.org/city/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arc || https://arc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arxiv || http://arxiv.org/abs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| arz || https://arz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| as || https://as.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ast || https://ast.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| atmwiki || http://www.otterstedt.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| av || https://av.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ay || https://ay.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| az || https://az.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| b || https://en.wikibooks.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ba || https://ba.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bar || https://bar.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bat-smg || https://bat-smg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| battlestarwiki || http://en.battlestarwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcl || https://bcl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bcnbio || http://historiapolitica.bcn.cl/resenas_parlamentarias/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be || https://be.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| be-x-old || https://be-x-old.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| beacha || http://www.beachapedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| betawikiversity || https://beta.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bg || https://bg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bh || https://bh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bi || https://bi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| biblewiki || http://bible.tmtm.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bjn || https://bjn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bluwiki || http://bluwiki.com/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| blw || http://britainloveswikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bm || https://bm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bn || https://bn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bo || https://bo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| botwiki || http://botwiki.sno.cc/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| boxrec || http://www.boxrec.com/media/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bpy || https://bpy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| br || https://br.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| brickwiki || http://www.brickwiki.info/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bs || https://bs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bug || https://bug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bugzilla || https://bugzilla.wikimedia.org/show_bug.cgi?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bulba || http://bulbapedia.bulbagarden.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buzztard || http://buzztard.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bxr || https://bxr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| bytesmiths || http://www.Bytesmiths.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2 || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| c2find || http://c2.com/cgi/wiki?FindPage&amp;amp;value=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ca || https://ca.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cache || https://www.google.com/search?q=cache:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cbk-zam || https://cbk-zam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cdo || https://cdo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ce || https://ce.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ceb || https://ceb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cellwiki || http://cell.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| centralwikia || http://community.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ch || https://ch.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chapter || https://en.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cho || https://cho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| choralwiki || http://www.cpdl.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chr || https://chr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chy || https://chy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| citizendium || http://en.citizendium.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckb || https://ckb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ckwiss || http://www.ck-wissen.de/ckwiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| co || https://co.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comixpedia || http://www.comixpedia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| commons || https://commons.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communityscheme || http://community.schemewiki.org/?c=s&amp;amp;key=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| communitywiki || http://www.communitywiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| comune || http://rete.comuni-italiani.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| corpknowpedia || http://corpknowpedia.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cr || https://cr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crazyhacks || http://www.crazy-hacks.org/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommons || https://creativecommons.org/licenses/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creativecommonswiki || http://wiki.creativecommons.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| creatureswiki || http://creatures.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| crh || https://crh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cs || https://cs.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| csb || https://csb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cu || https://cu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cv || https://cv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cxej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cy || https://cy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| cz || https://cz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| d || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| da || https://da.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dbdump || http://download.wikimedia.org/$1/latest/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcc || http://www.dccwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcdatabase || http://dc.wikia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dcma || http://christian-morgenstern.de/dcma/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| de || https://de.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dejanews || http://www.deja.com/=dnc/getdoc.xp?AN=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| delicious || https://www.delicious.com/tag/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| devmo || https://developer.mozilla.org/en/docs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dict || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dictionary || http://www.dict.org/bin/Dict?Database=*&amp;amp;Form=Dict1&amp;amp;Strategy=*&amp;amp;Query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| diq || https://diq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| disinfopedia || http://www.sourcewatch.org/wiki.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreaders || http://www.pgdp.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| distributedproofreadersca || http://www.pgdpcanada.net/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dk || https://dk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmoz || http://www.dmoz.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dmozs || http://www.dmoz.org/cgi-bin/search?search=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| docbook || http://wiki.docbook.org/topic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doi || http://dx.doi.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| donate || https://donate.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| doom_wiki || http://doom.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| download || http://download.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drae || http://lema.rae.es/drae/?val=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dreamhost || http://wiki.dreamhost.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| drumcorpswiki || http://www.drumcorpswiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dsb || https://dsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dv || https://dv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dwjwiki || http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| dz || https://dz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecoreality || http://www.EcoReality.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ecxei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ee || https://ee.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| el || https://el.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| elibre || http://enciclopedia.us.es/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emacswiki || http://www.emacswiki.org/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eml || https://eml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| en || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyc || http://encyc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| encyclopediadramatica || https://encyclopediadramatica.es/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| energiewiki || http://www.netzwerk-energieberater.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| englyphwiki || http://en.glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eo || https://eo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eokulturcentro || http://esperanto.toulouse.free.fr/nova/wikini/wakka.php?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| epo || https://epo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| es || https://es.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| et || https://et.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| etherpad || https://etherpad.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologue || https://www.ethnologue.com/show_language.asp?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ethnologuefamily || https://www.ethnologue.com/show_family.asp?subid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eu || https://eu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| evowiki || http://wiki.cotch.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| exotica || http://www.exotica.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ext || https://ext.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| eĉei || http://www.ikso.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fa || https://fa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fanimutationwiki || http://wiki.animutationportal.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ff || https://ff.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fi || https://fi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalempire || http://final-empire.sourceforge.net/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finalfantasy || http://finalfantasy.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| finnix || http://www.finnix.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fiu-vro || https://fiu-vro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fj || https://fj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickrphoto || http://www.flickr.com/photo.gne?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flickruser || http://www.flickr.com/people/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| floralwiki || http://www.floralwiki.co.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| flyerwiki-de || http://de.flyerwiki.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fo || https://fo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foldoc || http://foldoc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| forthfreak || http://wiki.forthfreak.net/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foundation || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| foxwiki || http://fox.wikis.com/wc.dll?Wiki~$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fr || https://fr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebio || http://freebiology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freebsdman || http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;amp;query=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freeculturewiki || http://wiki.freeculture.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freedomdefined || http://freedomdefined.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freefeel || http://freefeel.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freekiwiki || http://wiki.freegeek.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| freenode || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frp || https://frp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| frr || https://frr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fur || https://fur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fy || https://fy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ga || https://ga.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gag || https://gag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gan || https://gan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ganfyd || http://ganfyd.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gardenology || http://www.gardenology.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gausswiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gd || https://gd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gentoo-wiki || http://gentoo-wiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| genwiki || http://wiki.genealogy.net/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gerrit || https://gerrit.wikimedia.org/r/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| git || https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/$1;a=log;h=refs/heads/master || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gl || https://gl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glk || https://glk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| globalvoices || http://cyber.law.harvard.edu/dyn/globalvoices/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarwiki || http://glossar.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| glossarywiki || http://glossary.hs-augsburg.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gn || https://gn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| google || https://www.google.com/search?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googledefine || https://www.google.com/search?q=define:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| googlegroups || https://groups.google.com/groups?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| got || https://got.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gotamac || http://www.got-a-mac.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| greatlakeswiki || http://greatlakeswiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gu || https://gu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwarswiki || http://wiki.guildwars.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| guildwiki || http://guildwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenberg || http://www.gutenberg.org/etext/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gutenbergwiki || http://www.gutenberg.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| gv || https://gv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| h2wiki || http://halowiki.net/p/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ha || https://ha.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hackerspaces || http://hackerspaces.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hak || https://hak.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hammondwiki || http://www.dairiki.org/HammondWiki/index.php3?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| haw || https://haw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| he || https://he.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| heroeswiki || http://heroeswiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hi || https://hi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hif || https://hif.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ho || https://ho.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hr || https://hr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrfwiki || http://fanstuff.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hrwiki || http://www.hrwiki.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hsb || https://hsb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ht || https://ht.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hu || https://hu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hupwiki || http://wiki.hup.hu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hy || https://hy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| hz || https://hz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ia || https://ia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iarchive || https://archive.org/details/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| id || https://id.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ie || https://ie.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ig || https://ig.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ii || https://ii.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ik || https://ik.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ilo || https://ilo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcharacter || http://www.imdb.com/character/ch$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbcompany || http://www.imdb.com/company/co$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbname || http://www.imdb.com/name/nm$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| imdbtitle || http://www.imdb.com/title/tt$1/ || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| incubator || https://incubator.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infoanarchy || http://www.infoanarchy.org/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosecpedia || http://infosecpedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| infosphere || http://theinfosphere.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| io || https://io.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| irc || irc://irc.freenode.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ircrc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| is || https://is.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iso639-3 || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| issn || http://www.worldcat.org/issn/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| it || https://it.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iu || https://iu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| iuridictum || http://iuridictum.pecina.cz/w/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ja || https://ja.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jaglyphwiki || http://glyphwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jameshoward || http://jameshoward.us/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javanet || http://wiki.java.net/bin/view/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| javapedia || http://wiki.java.net/bin/view/Javapedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jbo || https://jbo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jefo || http://esperanto-jeunes.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jiniwiki || http://www.cdegroot.com/cgi-bin/jini?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jira || https://jira.toolserver.org/browse/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jp || https://jp.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jspwiki || http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jstor || http://www.jstor.org/journals/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| jv || https://jv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ka || https://ka.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kaa || https://kaa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kab || https://kab.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kamelo || http://kamelopedia.mormo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| karlsruhe || http://ka.stadtwiki.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kbd || https://kbd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kerimwiki || http://wiki.oxus.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kg || https://kg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ki || https://ki.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kinowiki || http://kino.skripov.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kj || https://kj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kk || https://kk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kl || https://kl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| km || https://km.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kmwiki || https://kmwiki.wikispaces.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kn || https://kn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ko || https://ko.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koi || https://koi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kontuwiki || http://kontu.merri.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| koslarwiki || http://wiki.koslar.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kpopwiki || http://www.kpopwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kr || https://kr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| krc || https://krc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ks || https://ks.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ksh || https://ksh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ku || https://ku.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kv || https://kv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| kw || https://kw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ky || https://ky.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| la || https://la.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| labsconsole || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lad || https://lad.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lb || https://lb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lbe || https://lbe.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lez || https://lez.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lg || https://lg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| li || https://li.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| libreplanet || https://libreplanet.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lij || https://lij.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linguistlist || https://linguistlist.org/forms/langs/LLDescription.cfm?code=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwiki || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| linuxwikide || http://www.linuxwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| liswiki || http://liswiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| literateprograms || http://en.literateprograms.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| livepedia || http://www.livepedia.gr/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lmo || https://lmo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ln || https://ln.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lo || https://lo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lojban || http://www.lojban.org/tiki/tiki-index.php?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lostpedia || http://lostpedia.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lqwiki || http://wiki.linuxquestions.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lt || https://lt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ltg || https://ltg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lugkr || http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| luxo || https://tools.wmflabs.org/guc/?user=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| lv || https://lv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| m || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mail || https://lists.wikimedia.org/mailman/listinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mailarchive || http://lists.wikimedia.org/pipermail/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| map-bms || https://map-bms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mariowiki || http://www.mariowiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| marveldatabase || http://www.marveldatabase.com/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mdf || https://mdf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meatball || http://meatballwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediawikiwiki || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mediazilla || https://bugzilla.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| memoryalpha || http://memory-alpha.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| meta || https://meta.wikimedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawiki || http://sunir.org/apps/meta.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| metawikipedia || https://meta.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mg || https://mg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mh || https://mh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mhr || https://mhr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mi || https://mi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| min || https://min.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mineralienatlas || http://www.mineralienatlas.de/lexikon/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| minnan || https://minnan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mk || https://mk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ml || https://ml.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mn || https://mn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mo || https://mo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| moinmoin || http://moinmo.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| monstropedia || http://www.monstropedia.org/?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mosapedia || http://mosapedia.de/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozcom || http://mozilla.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillawiki || https://wiki.mozilla.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mozillazinekb || http://kb.mozillazine.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mr || https://mr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mrj || https://mrj.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ms || https://ms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mt || https://mt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mus || https://mus.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| musicbrainz || http://musicbrainz.org/doc/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mw || https://www.mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwl || https://mwl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwod || http://www.merriam-webster.com/cgi-bin/dictionary?book=Dictionary&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mwot || http://www.merriam-webster.com/cgi-bin/thesaurus?book=Thesaurus&amp;amp;va=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| my || https://my.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| myv || https://myv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| mzn || https://mzn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| n || https://en.wikinews.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| na || https://na.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nah || https://nah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nan || https://nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nap || https://nap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nara || http://research.archives.gov/description/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nb || https://nb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds || https://nds.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nds-nl || https://nds-nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ne || https://ne.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| new || https://new.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ng || https://ng.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nkcells || http://www.nkcells.info/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nl || https://nl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nn || https://nn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| no || https://no.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nosmoke || http://no-smok.net/nsmk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nost || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nostalgia || https://nostalgia.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nov || https://nov.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nrm || https://nrm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nso || https://nso.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| nv || https://nv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ny || https://ny.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oc || https://oc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oeis || https://oeis.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| oldwikisource || https://wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| olpc || http://wiki.laptop.org/go/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| om || https://om.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| onelook || http://www.onelook.com/?ls=b&amp;amp;w=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openfacts || http://openfacts.berlios.de/index-en.phtml?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openlibrary || http://openlibrary.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openstreetmap || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwetware || http://openwetware.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| openwiki || http://openwiki.com/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| opera7wiki || http://operawiki.info/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| or || https://or.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| organicdesign || http://www.organicdesign.co.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| orthodoxwiki || http://orthodoxwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| os || https://os.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osi_reference_model || http://wiki.tigma.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| osmwiki || https://wiki.openstreetmap.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrs || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketID=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| otrswiki || https://otrs-wiki.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ourmedia || https://www.socialtext.net/ourmedia/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreach || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| outreachwiki || https://outreach.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pa || https://pa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pag || https://pag.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pam || https://pam.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| panawiki || http://wiki.alairelibre.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pap || https://pap.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| patwiki || http://gauss.ffii.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pcd || https://pcd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pdc || https://pdc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| perlnet || http://perl.net.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| personaltelco || http://www.personaltelco.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pfl || https://pfl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phpwiki || http://phpwiki.sourceforge.net/phpwiki/index.php?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| phwiki || http://www.pocketheaven.com/ph/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pi || https://pi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pih || https://pih.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pl || https://pl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| planetmath || http://planetmath.org/node/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pmeg || http://www.bertilow.com/pmeg/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pms || https://pms.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnb || https://pnb.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pnt || https://pnt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ps || https://ps.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| psycle || http://psycle.sourceforge.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pt || https://pt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pyrev || https://www.mediawiki.org/wiki/Special:Code/pywikipedia/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythoninfo || http://www.python.org/cgi-bin/moinmoin/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pythonwiki || http://www.pythonwiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pywiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| q || https://en.wikiquote.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| qu || https://qu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| quality || https://quality.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rationalwiki || http://rationalwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rcirc || irc://irc.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| reuterswiki || http://glossary.reuters.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rev || https://www.mediawiki.org/wiki/Special:Code/MediaWiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| revo || http://purl.org/NET/voko/revo/art/$1.html || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rfc || https://tools.ietf.org/html/rfc$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rheinneckar || http://rhein-neckar-wiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rm || https://rm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rmy || https://rmy.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rn || https://rn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ro || https://ro.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-rup || https://roa-rup.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| roa-tara || https://roa-tara.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| robowiki || http://robowiki.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rowiki || http://wiki.rennkuckuck.de/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rt || https://rt.wikimedia.org/Ticket/Display.html?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rtfm || ftp://rtfm.mit.edu/pub/faqs/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ru || https://ru.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rue || https://rue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rw || https://rw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s || https://en.wikisource.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| s23wiki || http://s23.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sa || https://sa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sah || https://sah.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sc || https://sc.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scholar || http://scholar.google.com/scholar?q=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| schoolswp || http://schools-wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scn || https://scn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sco || https://sco.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scores || http://imslp.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scoutwiki || http://en.scoutwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| scramble || http://www.scramble.nl/wiki/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sd || https://sd.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| se || https://se.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seapig || http://www.seapig.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewiki || http://seattlewiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| seattlewireless || http://seattlewireless.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| securewikidc || https://secure.wikidc.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| semantic-mw || https://www.semantic-mediawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| senseislibrary || http://senseis.xmp.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sep11 || https://sep11.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sg || https://sg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sh || https://sh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharemap || http://sharemap.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| si || https://si.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| silcode || http://www.sil.org/iso639-3/documentation.asp?id=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| simple || https://simple.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sk || https://sk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sl || https://sl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slashdot || http://slashdot.org/article.pl?sid=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| slwiki || http://wiki.secondlife.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sm || https://sm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| smikipedia || http://www.smiki.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sn || https://sn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| so || https://so.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sourceforge || http://sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| spcom || https://spcom.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| species || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sq || https://sq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| squeak || http://wiki.squeak.org/squeak/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sr || https://sr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| srn || https://srn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ss || https://ss.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| st || https://st.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stats || http://stats.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stewardry || https://toolserver.org/~pathoschild/stewardry/?wiki=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| stq || https://stq.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategy || https://strategy.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| strategywiki || http://strategywiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| su || https://su.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sulutil || https://toolserver.org/~quentinv57/sulinfo/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sv || https://sv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svgwiki || http://wiki.svg.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| svn || https://svn.wikimedia.org/viewvc/mediawiki/$1?view=log || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sw || https://sw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swinbrain || http://mercury.it.swin.edu.au/swinbrain/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swingwiki || http://www.swingwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| swtrain || http://train.spottingworld.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| szl || https://szl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ta || https://ta.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tabwiki || http://www.tabwiki.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tavi || http://tavi.sourceforge.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tclerswiki || http://wiki.tcl.tk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| te || https://te.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| technorati || http://www.technorati.com/search/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tenwiki || https://ten.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tesoltaiwan || http://www.tesol-taiwan.org/wiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| test2wiki || https://test2.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwiki || https://test.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| testwikidata || https://test.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tet || https://tet.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tg || https://tg.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| th || https://th.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thelemapedia || http://www.thelemapedia.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| theopedia || http://www.theopedia.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| thinkwiki || http://www.thinkwiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ti || https://ti.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tibiawiki || http://tibia.erig.net/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ticket || https://ticket.wikimedia.org/otrs/index.pl?Action=AgentTicketZoom&amp;amp;TicketNumber=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tk || https://tk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tl || https://tl.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmbw || http://tmbw.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmnet || http://www.technomanifestos.net/?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tmwiki || http://www.EasyTopicMaps.com/?page=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tn || https://tn.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| to || https://to.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| toollabs || https://tools.wmflabs.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tools || https://toolserver.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tpi || https://tpi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tr || https://tr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| translatewiki || https://translatewiki.net/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ts || https://ts.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tswiki || https://wiki.toolserver.org/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tt || https://tt.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tum || https://tum.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tviv || http://tviv.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tvtropes || http://www.tvtropes.org/pmwiki/pmwiki.php/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tw || https://tw.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| twiki || http://twiki.org/cgi-bin/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ty || https://ty.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyv || https://tyv.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tyvawiki || http://www.tyvawiki.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| udm || https://udm.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ug || https://ug.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uk || https://uk.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unihan || http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unreal || http://wiki.beyondunreal.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ur || https://ur.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| urbandict || http://www.urbandictionary.com/define.php?term=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usability || https://usability.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usej || http://www.tejo.org/usej/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| usemod || http://www.usemod.com/cgi-bin/wiki.pl?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| uz || https://uz.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| v || https://en.wikiversity.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ve || https://ve.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vec || https://vec.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vep || https://vep.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vi || https://vi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viaf || http://viaf.org/viaf/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vinismo || http://vinismo.com/en/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vkol || http://kol.coldfront.net/thekolwiki/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vlos || http://www.thuvienkhoahoc.com/tusach/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vls || https://vls.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| vo || https://vo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voipinfo || http://www.voip-info.org/wiki/view/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| voy || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| w || https://en.wikipedia.org/wiki/$1 || 1 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wa || https://wa.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| war || https://war.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| webisodes || http://www.webisodes.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| werelate || http://www.werelate.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wg || http://wg.en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiki || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikia || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiapiary || http://wikiapiary.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiasite || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikibooks || https://en.wikibooks.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichat || http://www.wikichat.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikichristian || http://www.wikichristian.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicities || http://www.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikicity || http://www.wikia.com/wiki/c:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikidata || https://www.wikidata.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikif1 || http://www.wikif1.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikifur || http://en.wikifur.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikihow || http://www.wikihow.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiindex || http://wikiindex.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilemon || http://wiki.illemonati.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikilivres || http://wikilivres.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimac-de || http://apfelwiki.de/wiki/Main/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikimedia || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinews || https://en.wikinews.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinfo || http://www.wikinfo.org/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikinvest || http://www.wikinvest.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiotics || https://wikiotics.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipaltz || http://www.wikipaltz.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipedia || https://en.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikipediawikipedia || https://en.wikipedia.org/wiki/Wikipedia:$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiquote || https://en.wikiquote.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikischool || http://www.wikischool.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiskripta || http://www.wikiskripta.eu/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisophia || http://wikisophia.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikisource || https://en.wikisource.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispecies || https://species.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikispot || http://wikispot.org/?action=gotowikipage&amp;amp;v=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitech || https://wikitech.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiti || http://wikiti.denglend.net/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikitree || http://wikitree.org/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiversity || https://en.wikiversity.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikivoyage || https://en.wikivoyage.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiweet || http://wikiweet.nl/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikiwikiweb || http://c2.com/cgi/wiki?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wikt || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wiktionary || https://en.wiktionary.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wipipedia || http://www.londonfetishscene.com/wipi/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wlug || http://www.wlug.org.nz/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2005 || https://wikimania2005.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2006 || https://wikimania2006.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2007 || https://wikimania2007.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2008 || https://wikimania2008.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2009 || https://wikimania2009.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2010 || https://wikimania2010.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2011 || https://wikimania2011.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2012 || https://wikimania2012.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2013 || https://wikimania2013.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wm2014 || https://wikimania2014.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmania || https://wikimania.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmar || http://www.wikimedia.org.ar/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmau || http://wikimedia.org.au/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbd || https://bd.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbe || https://be.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmbr || https://br.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmca || http://wikimedia.ca/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmch || http://www.wikimedia.ch/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcl || http://www.wikimediachile.cl/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmco || https://co.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmcz || https://meta.wikimedia.org/wiki/Wikimedia_Czech_Republic/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdc || http://wikimediadc.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmde || https://wikimedia.de/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdeblog || https://blog.wikimedia.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmdk || https://dk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmee || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmes || http://www.wikimedia.org.es/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmet || https://et.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmf || https://wikimediafoundation.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfblog || https://blog.wikimedia.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfi || https://fi.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmfr || http://wikimedia.fr/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhk || http://wikimedia.hk/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmhu || http://wikimedia.hu/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmid || http://www.wikimedia.or.id/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmil || http://www.wikimedia.org.il/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmin || http://wiki.wikimedia.in/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmit || http://wiki.wikimedia.it/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmke || http://wikimedia.or.ke/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmk || https://mk.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmmx || https://mx.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnl || https://nl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmno || https://no.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmnyc || https://nyc.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpa-us || https://pa-us.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmph || http://wikimedia.org.ph/wmph/index.php?title=$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpl || https://pl.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmpt || http://wikimedia.pt/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmrs || https://rs.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmru || https://ru.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmse || https://se.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmsk || http://wikimedia.sk/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmteam || https://wikimaniateam.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtr || https://tr.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmtw || http://wikimedia.tw/wiki/index.php5/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmua || https://ua.wikimedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmuk || https://wiki.wikimedia.org.uk/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmve || http://wikimedia.org.ve/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wmza || http://wikimedia.org.za/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wo || https://wo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wookieepedia || http://starwars.wikia.com/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wowwiki || http://www.wowwiki.com/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wqy || http://wqy.sourceforge.net/cgi-bin/index.cgi?$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wurmpedia || http://wurmpedia.com/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| wuu || https://wuu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xal || https://xal.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xh || https://xh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| xmf || https://xmf.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yi || https://yi.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| yo || https://yo.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| za || https://za.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zea || https://zea.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cfr || https://zh-cfr.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-classical || https://zh-classical.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-cn || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-min-nan || https://zh-min-nan.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-tw || https://zh.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zh-yue || https://zh-yue.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zrhwiki || http://www.zrhwiki.ch/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zu || https://zu.wikipedia.org/wiki/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zum || http://wiki.zum.de/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zwiki || http://www.zwiki.org/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| zzz_wiki || http://wiki.zzz.ee/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
| ĉej || http://esperanto.blahus.cz/cxej/vikio/index.php/$1 || 0 || 0 ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Navbar&amp;diff=22771</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Navbar&amp;diff=22771"/>
		<updated>2013-12-03T17:17:17Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Does not work, now hidden in MediaWiki:Print.css&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local HtmlBuilder = require(&#039;Module:HtmlBuilder&#039;)&lt;br /&gt;
&lt;br /&gt;
function trim(s)&lt;br /&gt;
    return mw.ustring.match( s, &amp;quot;^%s*(.-)%s*$&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function error(s)&lt;br /&gt;
    local span = HtmlBuilder.create(&#039;span&#039;)&lt;br /&gt;
&lt;br /&gt;
    span&lt;br /&gt;
        .addClass(&#039;error&#039;)&lt;br /&gt;
        .css(&#039;float&#039;, &#039;left&#039;)&lt;br /&gt;
        .css(&#039;white-space&#039;, &#039;nowrap&#039;)&lt;br /&gt;
        .wikitext(&#039;Error: &#039; .. s)&lt;br /&gt;
&lt;br /&gt;
    return tostring(span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTitle( pageName )&lt;br /&gt;
    pageName = trim( pageName );&lt;br /&gt;
    local page_title, talk_page_title;&lt;br /&gt;
    &lt;br /&gt;
    if mw.ustring.sub(pageName, 1, 1) == &#039;:&#039; then&lt;br /&gt;
        page_title = mw.title.new( mw.ustring.sub(pageName, 2) );&lt;br /&gt;
    else&lt;br /&gt;
        page_title = mw.title.new( pageName, &#039;Template&#039; );&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    if page_title then &lt;br /&gt;
        talk_page_title = page_title.talkPageTitle;&lt;br /&gt;
    else&lt;br /&gt;
        talk_page_title = nil;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return page_title, talk_page_title;    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _navbar( args )&lt;br /&gt;
    if not args[1] then&lt;br /&gt;
        return error(&#039;No name provided&#039;)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local good, title, talk_title;&lt;br /&gt;
    good, title, talk_title = pcall( getTitle, args[1] );&lt;br /&gt;
    if not good then&lt;br /&gt;
        return error(title);&lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
    if not title then&lt;br /&gt;
        return error(&#039;Page does not exist&#039;)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local mainpage = title.fullText;&lt;br /&gt;
    local talkpage = talk_title and talk_title.fullText or &#039;&#039;&lt;br /&gt;
    local editurl = title:fullUrl( &#039;action=edit&#039; ); &lt;br /&gt;
 &lt;br /&gt;
    local viewLink, talkLink, editLink = &#039;view&#039;, &#039;talk&#039;, &#039;edit&#039;&lt;br /&gt;
    if args.mini then&lt;br /&gt;
        viewLink, talkLink, editLink = &#039;v&#039;, &#039;t&#039;, &#039;e&#039;&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local div = HtmlBuilder.create( &#039;div&#039; )&lt;br /&gt;
    div&lt;br /&gt;
        .addClass( &#039;plainlinks&#039; )&lt;br /&gt;
        .addClass( &#039;hlist&#039; )&lt;br /&gt;
        .addClass( &#039;navbar&#039;)&lt;br /&gt;
        .cssText( args.style )&lt;br /&gt;
 &lt;br /&gt;
    if args.mini then div.addClass(&#039;mini&#039;) end&lt;br /&gt;
 &lt;br /&gt;
    if not (args.mini or args.plain) then&lt;br /&gt;
        div&lt;br /&gt;
            .tag( &#039;span&#039; )&lt;br /&gt;
                .css( &#039;word-spacing&#039;, 0 )&lt;br /&gt;
                .cssText( args.fontstyle )&lt;br /&gt;
                .wikitext( args.text or &#039;This box:&#039; )&lt;br /&gt;
                .wikitext( &#039; &#039; )&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args.brackets then&lt;br /&gt;
        div&lt;br /&gt;
            .tag(&#039;span&#039;)&lt;br /&gt;
                .css(&#039;margin-right&#039;, &#039;-0.125em&#039;)&lt;br /&gt;
                .cssText( args.fontstyle )&lt;br /&gt;
                .wikitext( &#039;&amp;amp;#91;&#039; )&lt;br /&gt;
                .newline();&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local ul = div.tag(&#039;ul&#039;);&lt;br /&gt;
 &lt;br /&gt;
    ul&lt;br /&gt;
        .tag( &#039;li&#039; )&lt;br /&gt;
            .addClass( &#039;nv-view&#039; )&lt;br /&gt;
            .wikitext( &#039;[[&#039; .. mainpage .. &#039;|&#039; )&lt;br /&gt;
            .tag( &#039;span &#039; )&lt;br /&gt;
                .attr( &#039;title&#039;, &#039;View this template&#039; )&lt;br /&gt;
                .cssText( args.fontstyle or &#039;&#039; )&lt;br /&gt;
                .wikitext( viewLink )&lt;br /&gt;
                .done()&lt;br /&gt;
            .wikitext( &#039;]]&#039; )&lt;br /&gt;
            .done()&lt;br /&gt;
        .tag( &#039;li&#039; )&lt;br /&gt;
            .addClass( &#039;nv-talk&#039; )&lt;br /&gt;
            .wikitext( &#039;[[&#039; .. talkpage .. &#039;|&#039; )&lt;br /&gt;
            .tag( &#039;span &#039; )&lt;br /&gt;
                .attr( &#039;title&#039;, &#039;Discuss this template&#039; )&lt;br /&gt;
                .cssText( args.fontstyle or &#039;&#039; )&lt;br /&gt;
                .wikitext( talkLink )&lt;br /&gt;
                .done()&lt;br /&gt;
            .wikitext( &#039;]]&#039; );&lt;br /&gt;
 &lt;br /&gt;
    if not args.noedit then &lt;br /&gt;
        ul&lt;br /&gt;
            .tag( &#039;li&#039; )&lt;br /&gt;
                .addClass( &#039;nv-edit&#039; )&lt;br /&gt;
                .wikitext( &#039;[&#039; .. editurl .. &#039; &#039; )&lt;br /&gt;
                .tag( &#039;span &#039; )&lt;br /&gt;
                    .attr( &#039;title&#039;, &#039;Edit this template&#039; )&lt;br /&gt;
                    .cssText( args.fontstyle or &#039;&#039; )&lt;br /&gt;
                    .wikitext( editLink )&lt;br /&gt;
                    .done()&lt;br /&gt;
                .wikitext( &#039;]&#039; );&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args.brackets then&lt;br /&gt;
        div&lt;br /&gt;
            .tag(&#039;span&#039;)&lt;br /&gt;
                .css(&#039;margin-left&#039;, &#039;-0.125em&#039;)&lt;br /&gt;
                .cssText( args.fontstyle or &#039;&#039; )&lt;br /&gt;
                .wikitext( &#039;&amp;amp;#93;&#039; )&lt;br /&gt;
                .newline();&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return tostring(div)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
    local origArgs&lt;br /&gt;
    -- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
    -- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        origArgs = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        origArgs = frame&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    -- ParserFunctions considers the empty string to be false, so to preserve the previous &lt;br /&gt;
    -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider&lt;br /&gt;
    -- them false too.&lt;br /&gt;
    args = {}&lt;br /&gt;
    for k, v in pairs(origArgs) do&lt;br /&gt;
        if v ~= &#039;&#039; then&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return _navbar(args)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:UserLinks&amp;diff=23557</id>
		<title>Module:UserLinks</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:UserLinks&amp;diff=23557"/>
		<updated>2013-12-02T02:07:36Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: switch the edit count link from the Toolserver to Labs, per protected edit request by User:DHeyward&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local ToolbarBuilder = require(&#039;Module:Toolbar&#039;)&lt;br /&gt;
local interwikiTable = mw.loadData(&amp;quot;Module:InterwikiTable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local u = {} -- Table for user-data helper strings.&lt;br /&gt;
local trackingCategories = {} -- Table for storing the tracking categories.&lt;br /&gt;
local demo&lt;br /&gt;
&lt;br /&gt;
-- Define a custom error message for this module.&lt;br /&gt;
local function err(msg, section)&lt;br /&gt;
    local help&lt;br /&gt;
    if section then&lt;br /&gt;
        help = &#039; ([[Template:User-multi#&#039; .. section .. &#039;|help]])&#039;&lt;br /&gt;
    else&lt;br /&gt;
        help = &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    local cat&lt;br /&gt;
    if demo == &#039;yes&#039; then&lt;br /&gt;
        cat = &#039;&#039;&lt;br /&gt;
    else&lt;br /&gt;
        cat = &#039;[[Category:UserLinks transclusions with errors]]&#039;&lt;br /&gt;
    end&lt;br /&gt;
    return &#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;[[Template:User-multi|User-multi]] error: &#039; .. msg &lt;br /&gt;
        .. help .. &#039;.&amp;lt;/span&amp;gt;&#039; .. cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--      To add more link types, write a function that produces an individual link, and put  --&lt;br /&gt;
--      it at the bottom of the list below. Then, add a link code for your function to the  --&lt;br /&gt;
--      &amp;quot;linktypes&amp;quot; table. Try and make the code three letters or less. There are a number  --&lt;br /&gt;
--      of helper strings available for writing the functions:                       --&lt;br /&gt;
--                                                                                          --&lt;br /&gt;
--      u.username          The plain username. If the username is not present then the     --&lt;br /&gt;
--                          module returns an error.                                        --&lt;br /&gt;
--      u.usernameHtml      The username html-encoded. Spaces are encoded with plus signs.  --&lt;br /&gt;
--      u.project           The project name. Nil if not specified.                         --&lt;br /&gt;
--      u.lang              The language code. Nil if not specified.                        --&lt;br /&gt;
--      u.interwiki         The interwiki prefix, consisting of the project and language    --&lt;br /&gt;
--                          values, separated by colons, e.g. &amp;quot;:wikt:es:&amp;quot;. If no project    --&lt;br /&gt;
--                          or language values are found, this is the blank string, &amp;quot;&amp;quot;.     --&lt;br /&gt;
--      u.projectCode       If a valid project is specified, this is the code for that      --&lt;br /&gt;
--                          project in [[Module:InterwikiTable]]. Otherwise this is nil.    --&lt;br /&gt;
--      u.projectLong       The long project name, e.g. &amp;quot;wikipedia&amp;quot; or &amp;quot;wikibooks&amp;quot;. If      --&lt;br /&gt;
--                          not specified the default is &amp;quot;wikipedia&amp;quot;.                       --&lt;br /&gt;
--      u.toolLang          The language code for use with toolserver or labs tools. The    --&lt;br /&gt;
--                          default is &amp;quot;en&amp;quot;.                                                --&lt;br /&gt;
--                                                                                          --&lt;br /&gt;
--      If you want more helper strings, you can define them in the generateUserDataStrings --&lt;br /&gt;
--      function below.                                                                     --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--                                LINK FUNCTIONS START                                      --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeUserLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;User:&#039; .. u.username .. &#039;|&#039; .. u.username .. &#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTalkLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;User talk:&#039; .. u.username .. &#039;|talk]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeContribsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Contributions/&#039; .. u.username .. &#039;|contribs]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeCountLink()&lt;br /&gt;
    return &#039;[//tools.wmflabs.org/xtools/pcount/index.php?name=&#039; .. u.usernameHtml&lt;br /&gt;
        .. &#039;&amp;amp;lang=&#039; .. u.toolLang&lt;br /&gt;
        .. &#039;&amp;amp;wiki=&#039; .. u.projectLong&lt;br /&gt;
        .. &#039; count]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeMovesLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/move/&#039; .. u.username .. &#039;|page&amp;amp;nbsp;moves]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeLogsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/&#039; .. u.username .. &#039;|logs]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlockLogLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. &#039;Special:Log/block&#039;, &#039;page=User:&#039; .. u.usernameHtml)&lt;br /&gt;
    return &#039;[&#039; .. tostring(url) .. &#039; block&amp;amp;nbsp;log]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlocksLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/block/&#039; .. u.username .. &#039;|blocks]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeBlockUserLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Block/&#039; .. u.username .. &#039;|block&amp;amp;nbsp;user]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeCentralAuthLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:CentralAuth/&#039; .. u.username .. &#039;|central&amp;amp;nbsp;auth]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeDeletedContribsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:DeletedContributions/&#039; .. u.username .. &#039;|deleted&amp;amp;nbsp;contribs]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEmailLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Emailuser/&#039; .. u.username .. &#039;|email]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditSummariesLink()&lt;br /&gt;
    return &#039;[http://tools.wmflabs.org/xtools/editsummary/index.php?name=&#039; .. u.usernameHtml&lt;br /&gt;
        .. &#039;&amp;amp;lang=&#039; .. u.toolLang&lt;br /&gt;
        .. &#039;&amp;amp;wiki=&#039; .. u.projectLong&lt;br /&gt;
        .. &#039; edit&amp;amp;nbsp;summaries]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeDeletionsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/delete/&#039; .. u.username .. &#039;|deletions]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeListUserLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. &#039;Special:ListUsers&#039;, &#039;limit=1&amp;amp;username=&#039; .. u.usernameHtml)&lt;br /&gt;
    return &#039;[&#039; .. tostring(url) .. &#039; list&amp;amp;nbsp;user]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeSulLink()&lt;br /&gt;
    return &#039;[[sulutil:&#039; .. u.username .. &#039;|global&amp;amp;nbsp;contribs]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeTargetLogsLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. &#039;Special:Log&#039;, &#039;page=User:&#039; .. u.usernameHtml)&lt;br /&gt;
    return &#039;[&#039; .. tostring(url) .. &#039; target&amp;amp;nbsp;logs]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeEditFilterLogLink()&lt;br /&gt;
    local url = mw.uri.fullUrl(u.interwiki .. &#039;Special:AbuseLog&#039;, &#039;wpSearchUser=&#039; .. u.usernameHtml)&lt;br /&gt;
    return &#039;[&#039; .. tostring(url) .. &#039; edit&amp;amp;nbsp;filter&amp;amp;nbsp;log]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeProtectionsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/protect/&#039; .. u.username .. &#039;|protections]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRightsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/rights/&#039; .. u.username .. &#039;|rights]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRenamesLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:Log/renameuser/&#039; .. u.username .. &#039;|renames]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeRfaLink()&lt;br /&gt;
    if u.project or u.lang then&lt;br /&gt;
        table.insert( trackingCategories, &#039;[[Category:UserLinks transclusions with unresolvable interwiki links]]&#039; )&lt;br /&gt;
    end&lt;br /&gt;
    return &#039;[[Special:PrefixIndex/Wikipedia:Requests for adminship/&#039; .. u.username .. &#039;|RfA]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeApiLink()&lt;br /&gt;
    -- Find the full domain, as the API can&#039;t be accessed through the interwiki system.&lt;br /&gt;
    local fulldomain&lt;br /&gt;
    local lang = u.lang or &#039;en&#039;&lt;br /&gt;
    if u.projectCode then&lt;br /&gt;
        local domain = interwikiTable[u.projectCode].domain&lt;br /&gt;
        local takesLangPrefix = interwikiTable[u.projectCode].takes_lang_prefix&lt;br /&gt;
        if not takesLangPrefix then&lt;br /&gt;
            fulldomain = domain&lt;br /&gt;
        else&lt;br /&gt;
            fulldomain = lang .. &#039;.&#039; .. domain&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        fulldomain = lang .. &#039;.wikipedia.org&#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Return the API link&lt;br /&gt;
    return &#039;[//&#039; .. fulldomain .. &#039;/w/api.php?action=query&amp;amp;list=users&amp;amp;usprop=editcount&amp;amp;ususers=&#039; .. u.usernameHtml .. &#039; api]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeUploadsLink()&lt;br /&gt;
    return &#039;[[&#039; .. u.interwiki .. &#039;Special:ListFiles/&#039; .. u.username .. &#039;|uploads]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
--                                   LINK FUNCTIONS END                                     --&lt;br /&gt;
--      To enable new link functions, add the code to the &amp;quot;linktypes&amp;quot; table directly below. --&lt;br /&gt;
----------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local linktypes = {&lt;br /&gt;
    {&#039;t&#039;   , makeTalkLink},&lt;br /&gt;
    {&#039;c&#039;   , makeContribsLink},&lt;br /&gt;
    {&#039;ct&#039;  , makeCountLink},&lt;br /&gt;
    {&#039;m&#039;   , makeMovesLink},&lt;br /&gt;
    {&#039;l&#039;   , makeLogsLink},&lt;br /&gt;
    {&#039;bl&#039;  , makeBlockLogLink},&lt;br /&gt;
    {&#039;bls&#039; , makeBlocksLink},&lt;br /&gt;
    {&#039;bu&#039;  , makeBlockUserLink},&lt;br /&gt;
    {&#039;ca&#039;  , makeCentralAuthLink},&lt;br /&gt;
    {&#039;dc&#039;  , makeDeletedContribsLink},&lt;br /&gt;
    {&#039;e&#039;   , makeEmailLink},&lt;br /&gt;
    {&#039;es&#039;  , makeEditSummariesLink},&lt;br /&gt;
    {&#039;del&#039; , makeDeletionsLink},&lt;br /&gt;
    {&#039;lu&#039;  , makeListUserLink},&lt;br /&gt;
    {&#039;sul&#039; , makeSulLink},&lt;br /&gt;
    {&#039;tl&#039;  , makeTargetLogsLink},&lt;br /&gt;
    {&#039;efl&#039; , makeEditFilterLogLink},&lt;br /&gt;
    {&#039;pr&#039;  , makeProtectionsLink},&lt;br /&gt;
    {&#039;rl&#039;  , makeRightsLink},&lt;br /&gt;
    {&#039;ren&#039; , makeRenamesLink},&lt;br /&gt;
    {&#039;rfa&#039; , makeRfaLink},&lt;br /&gt;
    {&#039;api&#039; , makeApiLink},&lt;br /&gt;
    {&#039;up&#039;  , makeUploadsLink}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function getLink(linktype)&lt;br /&gt;
    local linkNumber&lt;br /&gt;
    for i, value in ipairs(linktypes) do&lt;br /&gt;
        if value[1] == linktype then&lt;br /&gt;
            linkNumber = i&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not linkNumber then&lt;br /&gt;
        return err(&#039;&amp;quot;&#039; .. linktype .. &#039;&amp;quot; is not a valid link code&#039;, &#039;Not a valid link code&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local result = linktypes[linkNumber][2]()&lt;br /&gt;
    if type(result) ~= &#039;string&#039; then&lt;br /&gt;
        return err(&lt;br /&gt;
            &#039;the function for code &amp;quot;&#039; .. linktype .. &#039;&amp;quot; did not return a string value&#039;,&lt;br /&gt;
            &#039;Function did not return a string value&#039;&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(args)&lt;br /&gt;
    local targs = {}&lt;br /&gt;
    local numArgsExist = false&lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        if type(k) == &#039;number&#039; then&lt;br /&gt;
            numArgsExist = true&lt;br /&gt;
            targs[k] = getLink(v)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    targs.style = args.small and &#039;font-size: 90%;&#039;&lt;br /&gt;
    targs.separator = args.separator or &#039;dot&#039;&lt;br /&gt;
    &lt;br /&gt;
    if numArgsExist == false then&lt;br /&gt;
        return nil -- Don&#039;t return a toolbar if no numeric arguments exist.&lt;br /&gt;
    else&lt;br /&gt;
        return ToolbarBuilder.main(targs)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This function finds whether a string is a valid interwiki project prefix.&lt;br /&gt;
-- If the string is valid, the function outputs two values: true, and the site code&lt;br /&gt;
-- used in [[Module:InterwikiTable]]. If the string is valid, the function outputs&lt;br /&gt;
-- false and nil.&lt;br /&gt;
local function isKnownProject(prefix)&lt;br /&gt;
    for projectCode, projectVal in pairs(interwikiTable) do&lt;br /&gt;
        for _, iwCode in ipairs(projectVal.iw_prefix) do&lt;br /&gt;
            if iwCode == prefix then&lt;br /&gt;
                return true, projectCode&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generateUserDataStrings(args)&lt;br /&gt;
    -- If the username is absent or blank, return an error and a tracking category.&lt;br /&gt;
    if args.user == &#039;&#039; or (not args.user and (not args.User or args.User == &#039;&#039;)) then&lt;br /&gt;
        return err(&#039;no username detected&#039;, &#039;No username detected&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        u.username = args.user or args.User&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Get other basic user data strings.&lt;br /&gt;
    u.project = args.Project or args.project&lt;br /&gt;
    u.lang = args.lang or args.Lang&lt;br /&gt;
    if u.lang then&lt;br /&gt;
        if mw.language.isKnownLanguageTag(u.lang) then&lt;br /&gt;
            table.insert(trackingCategories, &#039;[[Category:UserLinks transclusions with language parameters]]&#039;)&lt;br /&gt;
        else&lt;br /&gt;
            return err(&#039;&amp;quot;&#039; .. u.lang .. &#039;&amp;quot; is not a valid language code&#039;, &#039;Not a valid language code&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Process the project value if it is present.&lt;br /&gt;
    if u.project then&lt;br /&gt;
        table.insert( trackingCategories, &#039;[[Category:UserLinks transclusions with project parameters]]&#039; )&lt;br /&gt;
        &lt;br /&gt;
        -- If u.project is a known project, we only need to get the project code. If the project &lt;br /&gt;
        -- isn&#039;t known, first check whether it is a valid language code, and if not then see if it&#039;s&lt;br /&gt;
        -- an interwiki code separated by colons, e.g. &amp;quot;wikt:es&amp;quot;.&lt;br /&gt;
        local uprojectIsKnownProject, uprojectProjectCode = isKnownProject(u.project)&lt;br /&gt;
        if uprojectIsKnownProject then&lt;br /&gt;
            u.projectCode = uprojectProjectCode&lt;br /&gt;
        else&lt;br /&gt;
            if mw.language.isKnownLanguageTag(u.project) then&lt;br /&gt;
                u.lang = u.project&lt;br /&gt;
                u.project = nil&lt;br /&gt;
            else&lt;br /&gt;
                local pref1, pref2 = mw.ustring.match( u.project, &#039;^(%w+):(%w+)$&#039; )&lt;br /&gt;
                if pref1 and pref2 then&lt;br /&gt;
                    local pref1IsKnownProject, pref1ProjectCode = isKnownProject(pref1)&lt;br /&gt;
                    local pref2IsKnownProject, pref2ProjectCode = isKnownProject(pref2)&lt;br /&gt;
                    if pref1IsKnownProject&lt;br /&gt;
                        and mw.language.isKnownLanguageTag(pref2)&lt;br /&gt;
                        and interwikiTable[pref1ProjectCode].takes_lang_prefix then&lt;br /&gt;
                        u.project = pref1&lt;br /&gt;
                        u.lang = pref2&lt;br /&gt;
                        u.projectCode = pref1ProjectCode&lt;br /&gt;
                        table.insert(&lt;br /&gt;
                            trackingCategories,&lt;br /&gt;
                            &#039;[[Category:UserLinks transclusions with project parameters containing language codes]]&#039;&lt;br /&gt;
                        )&lt;br /&gt;
                    elseif pref2IsKnownProject&lt;br /&gt;
                        and mw.language.isKnownLanguageTag(pref1)&lt;br /&gt;
                        and interwikiTable[pref2ProjectCode].takes_lang_prefix then&lt;br /&gt;
                        u.project = pref2&lt;br /&gt;
                        u.lang = pref1&lt;br /&gt;
                        u.projectCode = pref2ProjectCode&lt;br /&gt;
                        table.insert(&lt;br /&gt;
                            trackingCategories,&lt;br /&gt;
                            &#039;[[Category:UserLinks transclusions with project parameters containing language codes]]&#039;&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        return err(&lt;br /&gt;
                            &#039;&amp;quot;&#039; .. u.project .. &#039;&amp;quot; is not a valid interwiki prefix&#039;,&lt;br /&gt;
                            &#039;Not a valid interwiki prefix&#039;&lt;br /&gt;
                        )&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    return err(&lt;br /&gt;
                        &#039;&amp;quot;&#039; .. u.project .. &#039;&amp;quot; is not a valid interwiki prefix&#039;,&lt;br /&gt;
                        &#039;Not a valid interwiki prefix&#039;&lt;br /&gt;
                    )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Generate the interwiki prefix. This includes colons.&lt;br /&gt;
    if u.project or u.lang then&lt;br /&gt;
        u.interwiki = &#039;&#039;&lt;br /&gt;
        if u.project then&lt;br /&gt;
            u.interwiki = u.interwiki .. &#039;:&#039; .. u.project&lt;br /&gt;
        end&lt;br /&gt;
        if u.lang then&lt;br /&gt;
            u.interwiki = u.interwiki .. &#039;:&#039; .. u.lang&lt;br /&gt;
        end&lt;br /&gt;
        u.interwiki = u.interwiki .. &#039;:&#039;&lt;br /&gt;
    else&lt;br /&gt;
        u.interwiki = &#039;&#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Generate the other helper strings.&lt;br /&gt;
    u.usernameHtml = mw.uri.encode(u.username) -- Html-encoded username. Spaces are encoded as pluses.&lt;br /&gt;
    if u.project then&lt;br /&gt;
        local prefixes = interwikiTable[u.projectCode].iw_prefix&lt;br /&gt;
        u.projectLong = prefixes[2] or prefixes[1] -- A bit of a hack, but should find the long prefix name most of the time.&lt;br /&gt;
    else&lt;br /&gt;
        u.projectLong = &#039;wikipedia&#039;&lt;br /&gt;
    end&lt;br /&gt;
    u.toolLang = u.lang or &#039;en&#039; -- set the default language for tools on the toolserver or labs.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function generateTrackingCategories()&lt;br /&gt;
    if demo == &#039;yes&#039; then&lt;br /&gt;
        return &#039;&#039;&lt;br /&gt;
    else&lt;br /&gt;
        return table.concat(trackingCategories)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This function generates a table of all available link types, with their previews.&lt;br /&gt;
-- It is used in the module documentation.&lt;br /&gt;
local function getLinkTable(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Build a table of all of the links.&lt;br /&gt;
    local result = &#039;&amp;lt;table class=&amp;quot;wikitable plainlinks sortable&amp;quot;&amp;gt;&#039;&lt;br /&gt;
        .. &#039;\n&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Code&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Preview&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
    for i, value in ipairs(linktypes) do&lt;br /&gt;
        local code = value[1]&lt;br /&gt;
        result = result .. &amp;quot;\n&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&#039;&#039;&#039;&amp;quot; .. code .. &amp;quot;&#039;&#039;&#039;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. getLink(code) .. &#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#039;&lt;br /&gt;
    end&lt;br /&gt;
    result = result .. &#039;\n&amp;lt;/table&amp;gt;&#039;&lt;br /&gt;
    &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSingleLink(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local linktype = args[1]&lt;br /&gt;
    if not linktype then &lt;br /&gt;
        return err(&#039;no link type specified&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local result = getLink(linktype)&lt;br /&gt;
    result = result .. generateTrackingCategories()&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLinks(args)&lt;br /&gt;
    demo = args.demo -- Set the demo variable.&lt;br /&gt;
    -- Generate the user data strings and return any errors.&lt;br /&gt;
    local dataStringError = generateUserDataStrings(args)&lt;br /&gt;
    if dataStringError then&lt;br /&gt;
        return dataStringError&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    -- Build the template output.&lt;br /&gt;
    local result = makeToolbar(args) -- Get the toolbar contents.&lt;br /&gt;
    if result then&lt;br /&gt;
        if args.sup then&lt;br /&gt;
            result = &#039;&amp;lt;sup&amp;gt;&#039; .. result .. &#039;&amp;lt;/sup&amp;gt;&#039;&lt;br /&gt;
        end&lt;br /&gt;
        result = &#039;&amp;amp;nbsp;&#039; .. result&lt;br /&gt;
    else&lt;br /&gt;
        result = &#039;&#039; -- If there are no links specified, don&#039;t return the toolbar at all.&lt;br /&gt;
    end&lt;br /&gt;
    result = &#039;&amp;lt;span&amp;gt;&#039; .. makeUserLink() .. result .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
    result = result .. generateTrackingCategories()&lt;br /&gt;
    &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getExampleLinks(args)&lt;br /&gt;
    -- This function enables example output without having to specify any&lt;br /&gt;
    -- parameters to #invoke.&lt;br /&gt;
    args.demo = &#039;yes&#039;&lt;br /&gt;
    args.user = &#039;Example&#039;&lt;br /&gt;
    args.User = nil&lt;br /&gt;
    return getLinks(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWrapper(func)&lt;br /&gt;
    return function (frame)&lt;br /&gt;
        -- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
        -- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
        local origArgs&lt;br /&gt;
        if frame == mw.getCurrentFrame() then&lt;br /&gt;
            origArgs = frame:getParent().args&lt;br /&gt;
            for k, v in pairs(frame.args) do&lt;br /&gt;
                origArgs = frame.args&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            origArgs = frame&lt;br /&gt;
        end&lt;br /&gt;
 &lt;br /&gt;
        -- Strip whitespace, and treat blank arguments as nil.&lt;br /&gt;
        -- &#039;user&#039;, &#039;User&#039;, and &#039;separator&#039; have different behaviour depending on&lt;br /&gt;
        -- whether they are blank or nil, so keep them as they are.&lt;br /&gt;
        local args = {}&lt;br /&gt;
        for k, v in pairs(origArgs) do&lt;br /&gt;
            v = mw.text.trim(v)&lt;br /&gt;
            if v ~= &#039;&#039; or k == &#039;user&#039; or k == &#039;User&#039; or k == &#039;separator&#039; then&lt;br /&gt;
                args[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    &lt;br /&gt;
        return func(args)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
    main = makeWrapper(getLinks),&lt;br /&gt;
    single = makeWrapper(getSingleLink),&lt;br /&gt;
    linktable = makeWrapper(getLinkTable),&lt;br /&gt;
    example = makeWrapper(getExampleLinks)&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Infobox_website&amp;diff=23877</id>
		<title>Template:Infobox website</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Infobox_website&amp;diff=23877"/>
		<updated>2013-12-01T18:14:02Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: This is better, given the state of articles... Still, no one is using it yet, so no harm is done.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox&lt;br /&gt;
| title   = {{{websitename|{{{name|&amp;lt;includeonly&amp;gt;{{PAGENAME}}&amp;lt;/includeonly&amp;gt; }}} }}}&lt;br /&gt;
| image    = {{#invoke:InfoboxImage|InfoboxImage|image={{{websitelogo|{{{logo|}}} }}}|size={{{logo_size|}}}|sizedefault=250px|alt={{{logo_alt|}}}}}&lt;br /&gt;
| caption  = {{{logocaption|}}}&lt;br /&gt;
| image2   = {{#if:{{{collapsible|}}}|{{hidden begin|title={{{collapsetext|Screenshot}}}|titlestyle=text-align:center}}}}{{#invoke:InfoboxImage|InfoboxImage|image={{{screenshot|}}}|size={{{screenshot_size|}}}|sizedefault=300px|alt={{{screenshot_alt|}}}}}&lt;br /&gt;
| caption2 = {{{caption|}}}{{#if:{{{collapsible|}}}|{{hidden end}}}}&lt;br /&gt;
| label1   = [[Uniform resource locator|Web address]]&lt;br /&gt;
| data1    = {{{url|}}}&lt;br /&gt;
| label2   = [[Slogan]]&lt;br /&gt;
| data2    = {{{slogan|}}}&lt;br /&gt;
| label3   = Commercial?&lt;br /&gt;
| data3    = {{{commercial|}}}&lt;br /&gt;
| label4   = Type of site&lt;br /&gt;
| data4    = {{{type|}}}&lt;br /&gt;
| label5   = Registration&lt;br /&gt;
| data5    = {{{reg|{{{registration|}}} }}}&lt;br /&gt;
| label6   = Available [[natural language|language(s)]]&lt;br /&gt;
| data6    = {{{language|}}}&lt;br /&gt;
| label7   = [[Registered user|Users]]&lt;br /&gt;
| data7    = {{{num_users|}}}&lt;br /&gt;
| label8   = Content license&lt;br /&gt;
| data8    = {{{content_license|{{{content license|}}} }}}&lt;br /&gt;
| label9   = Content licence&lt;br /&gt;
| data9    = {{{content_licence|{{{content licence|}}} }}}&lt;br /&gt;
| label10  = Written in&lt;br /&gt;
| data10   = {{{programming language|{{{programming_language|}}}}}} &lt;br /&gt;
| label11  = Owner&lt;br /&gt;
| data11   = {{{owner|}}}&lt;br /&gt;
| label12  = Created by&lt;br /&gt;
| data12   = {{{author|}}}&lt;br /&gt;
| label13  = Editor&lt;br /&gt;
| data13   = {{{editor|}}}&lt;br /&gt;
| label14  = Launched&lt;br /&gt;
| data14   = {{{date_of_launch|{{{launch date|{{{launch_date|}}}}}}}}}&lt;br /&gt;
| label15  = [[Revenue]]&lt;br /&gt;
| data15   = {{{rev|{{{revenue|}}}}}}&lt;br /&gt;
| label16  = [[Alexa Internet|Alexa]] rank&lt;br /&gt;
| data16   = {{{alexa|}}}&lt;br /&gt;
| label17  = [[IP address]]&lt;br /&gt;
| data17   = {{{ip|}}}&lt;br /&gt;
| label18  = Current status&lt;br /&gt;
| data18   = {{{current_status|{{{current status|}}} }}}&lt;br /&gt;
| below    = {{{footnotes|}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Template:Person_infobox_header&amp;diff=23853</id>
		<title>Template:Person infobox header</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Template:Person_infobox_header&amp;diff=23853"/>
		<updated>2013-11-29T11:29:22Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Ambox. Tmbox categorizes pages in talk page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox|type=content|text=The design and content of biographical infoboxes should follow Wikipedia&#039;s [[WP:V|verifiability policy]], [[WP:Manual of Style (infoboxes)|infobox style guideline]] and [[WP:Manual of Style (biographies)|biographical style guideline]].&lt;br /&gt;
&lt;br /&gt;
All content displayed in this template must adhere to the &#039;&#039;&#039;[[Wikipedia:Biographies of living persons|biographies of living persons]]&#039;&#039;&#039; policy if applicable. Unsourced or [[Wikipedia:Verifiability|poorly sourced]] contentious material about living persons &#039;&#039;&#039;must be removed immediately&#039;&#039;&#039; from the article and its talk page, especially if potentially [[Wikipedia:Libel|libellous]].}}&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadgets-definition&amp;diff=23222</id>
		<title>MediaWiki:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadgets-definition&amp;diff=23222"/>
		<updated>2013-11-28T14:30:53Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: SidebarTranslate seems to work fine with ResourceLoader&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&#039;&#039;&#039;Changes to this page should first be discussed on [[Wikipedia:Gadget/proposals]] or [[Wikipedia_talk:Gadget]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please add an entry for any new gadget to the table at [[Wikipedia:Gadget#Currently installed gadgets]] to make maintenance easier. You can review and edit the descriptions on [[Special:Gadgets]].&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== browsing ==&lt;br /&gt;
&lt;br /&gt;
* modrollback|modrollback.js&lt;br /&gt;
* removeAccessKeys|removeAccessKeys.js&lt;br /&gt;
* searchFocus|searchFocus.js&lt;br /&gt;
* GoogleTrans|GoogleTrans.js&lt;br /&gt;
* ImageAnnotator|ImageAnnotator.js&lt;br /&gt;
* imagelinks|imagelinks.js&lt;br /&gt;
* Navigation_popups|popups.js|navpop.css&lt;br /&gt;
* exlinks[ResourceLoader|dependencies=mediawiki.util]|exlinks.js&lt;br /&gt;
* search-new-tab[ResourceLoader]|search-new-tab.js&lt;br /&gt;
* PrintOptions[ResourceLoader|dependencies=jquery.ui.dialog]|PrintOptions.js&lt;br /&gt;
* revisionjumper|revisionjumper.js&lt;br /&gt;
* Twinkle[ResourceLoader|dependencies=mediawiki.user,mediawiki.util,jquery.ui.dialog,jquery.tipsy|rights=autoconfirmed]|moment.js|morebits.js|morebits.css|Twinkle.js|twinkleprod.js|twinkleimage.js|twinklebatchundelete.js|twinklewarn.js|twinklespeedy.js|friendlyshared.js|twinklediff.js|twinkleunlink.js|twinkledelimages.js|friendlytag.js|twinkledeprod.js|friendlywelcome.js|twinklexfd.js|twinklebatchdelete.js|twinklebatchprotect.js|twinkleconfig.js|twinklefluff.js|twinkleprotect.js|twinklearv.js|friendlytalkback.js&lt;br /&gt;
* HideFundraisingNotice|HideFundraisingNotice.js|HideFundraisingNotice.css&lt;br /&gt;
* teahouse[ResourceLoader|default]|teahouse.js|teahouse.css&lt;br /&gt;
* ReferenceTooltips[ResourceLoader|default]|ReferenceTooltips.js|ReferenceTooltips.css&lt;br /&gt;
&lt;br /&gt;
== watchlist ==&lt;br /&gt;
&lt;br /&gt;
* WatchlistNoMarkers[ResourceLoader]|WatchlistNoMarkers.css&lt;br /&gt;
* WatchlistChangesBold[ResourceLoader]|WatchlistChangesBold.js|WatchlistChangesBold.css&lt;br /&gt;
&lt;br /&gt;
== editing ==&lt;br /&gt;
&lt;br /&gt;
* defaultsummaries|defaultsummaries.js&lt;br /&gt;
* citations|citations.js&lt;br /&gt;
* DotsSyntaxHighlighter[ResourceLoader]|DotsSyntaxHighlighter.js&lt;br /&gt;
* HotCat[ResourceLoader|rights=edit,purge]|HotCat.js &amp;lt;!-- purge is a work-around to default-enable only for logged-in users. --&amp;gt;&lt;br /&gt;
* wikEdDiff|wikEdDiff.js&lt;br /&gt;
* ProveIt[ResourceLoader|dependencies=jquery.ui.tabs,jquery.ui.button,jquery.effects.highlight,jquery.textSelection]|ProveIt.css|ProveIt.js&lt;br /&gt;
* wikEd|wikEd.js&lt;br /&gt;
* afchelper[ResourceLoader|dependencies=mediawiki.api,mediawiki.user,jquery.chosen]|afchelper.js&lt;br /&gt;
* DRN-wizard[ResourceLoader|default]|DRN-wizard-loader.js&lt;br /&gt;
* charinsert[ResourceLoader|default]|charinsert.js|charinsert.css&lt;br /&gt;
&lt;br /&gt;
== appearance ==&lt;br /&gt;
&lt;br /&gt;
* edittop[ResourceLoader|dependencies=user.options]|edittop.js|edittop.css&lt;br /&gt;
* UTCLiveClock[ResourceLoader]|UTCLiveClock.js&lt;br /&gt;
* mySandbox[ResourceLoader|dependencies=mediawiki.util,mediawiki.Title,mediawiki.Uri|default|rights=createpage]|mySandbox.js&lt;br /&gt;
* purgetab[ResourceLoader|dependencies=mediawiki.util]|purgetab.js&lt;br /&gt;
* ExternalSearch|externalsearch.js&lt;br /&gt;
* dropdown-menus|dropdown-menus.js|dropdown-menus.css&lt;br /&gt;
* CategoryAboveAll|CategoryAboveAll.js&lt;br /&gt;
* addsection-plus|addsection-plus.js&lt;br /&gt;
* CommentsInLocalTime|CommentsInLocalTime.js&lt;br /&gt;
* OldDiff[ResourceLoader]|OldDiff.css&lt;br /&gt;
* NoAnimations[ResourceLoader]|NoAnimations.js&lt;br /&gt;
* NoSmallFonts[ResourceLoader]|NoSmallFonts.css&lt;br /&gt;
* metadata|metadata.js&lt;br /&gt;
* MenuTabsToggle[ResourceLoader|dependencies=jquery.cookie]|MenuTabsToggle.js|MenuTabsToggle.css&lt;br /&gt;
* righteditlinks[ResourceLoader]|righteditlinks.css&lt;br /&gt;
* PrettyLog|PrettyLog.js&lt;br /&gt;
* SidebarTranslate[ResourceLoader]|SidebarTranslate.js|SidebarTranslate.css&lt;br /&gt;
* Blackskin[ResourceLoader]|Blackskin.css&lt;br /&gt;
* widensearch[ResourceLoader]|widensearch.css&lt;br /&gt;
* topalert[ResourceLoader]|topalert.js|topalert.css&lt;br /&gt;
&lt;br /&gt;
== compatibility ==&lt;br /&gt;
&lt;br /&gt;
* DejaVu_Sans[ResourceLoader]|DejaVu_Sans.css&lt;br /&gt;
* JSL|JSL.js&lt;br /&gt;
&lt;br /&gt;
== advanced ==&lt;br /&gt;
&lt;br /&gt;
* RegexMenuFramework|RegexMenuFramework.js&lt;br /&gt;
* ShowMessageNames[ResourceLoader|dependencies=mediawiki.util]|ShowMessageNames.js&lt;br /&gt;
* DebugMode[ResourceLoader|dependencies=mediawiki.util]|DebugMode.js&lt;br /&gt;
* contribsrange|contribsrange.js&lt;br /&gt;
* BugStatusUpdate[ResourceLoader]|BugStatusUpdate.js&lt;br /&gt;
* RTRC[ResourceLoader]|RTRC.js&lt;br /&gt;
&lt;br /&gt;
== test ==&lt;br /&gt;
&lt;br /&gt;
== deprecated ==&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate&amp;diff=23112</id>
		<title>MediaWiki:Gadget-SidebarTranslate</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-SidebarTranslate&amp;diff=23112"/>
		<updated>2013-11-27T18:41:26Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: copied from User:Equazcion/SidebarTranslate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:Equazcion/SidebarTranslate|SidebarTranslate]], changes the language links in the sidebar so their text is displayed in English&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Yesno/doc&amp;diff=22931</id>
		<title>Module:Yesno/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Yesno/doc&amp;diff=22931"/>
		<updated>2013-11-22T10:06:49Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: Update high-risk counter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{High-risk|5,300,000}}&lt;br /&gt;
&lt;br /&gt;
This module provides a consistent interface for processing boolean or boolean-style string input. While Lua allows the &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; boolean values, wikicode templates can only express boolean values through strings such as &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc. This module processes these kinds of strings and turns them into boolean input for Lua to process. It also returns &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values as &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, to allow for distinctions between &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. The module also accepts other Lua structures as input, i.e. booleans, numbers, tables, and functions. If it is passed input that it does not recognise as boolean or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, it is possible to specify a default value to return.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;yesno(value, default)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is the value to be tested. Boolean input or boolean-style input (see below) always evaluates to either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; always evaluates to &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. Other values evaluate to &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
First, load the module. Note that it can only be loaded from other Lua modules, not from normal wiki pages. For normal wiki pages you can use {{tl|yesno}} instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some input values always return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, and some always return &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; values always return &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- These always return true:&lt;br /&gt;
yesno(&#039;yes&#039;)&lt;br /&gt;
yesno(&#039;y&#039;)&lt;br /&gt;
yesno(&#039;true&#039;)&lt;br /&gt;
yesno(&#039;1&#039;)&lt;br /&gt;
yesno(1)&lt;br /&gt;
yesno(true)&lt;br /&gt;
&lt;br /&gt;
-- These always return false:&lt;br /&gt;
yesno(&#039;no&#039;)&lt;br /&gt;
yesno(&#039;n&#039;)&lt;br /&gt;
yesno(&#039;false&#039;)&lt;br /&gt;
yesno(&#039;0&#039;)&lt;br /&gt;
yesno(0)&lt;br /&gt;
yesno(false)&lt;br /&gt;
&lt;br /&gt;
-- Nil values always return nil:&lt;br /&gt;
yesno(nil)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String values are converted to lower case before they are matched:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- These always return true:&lt;br /&gt;
yesno(&#039;Yes&#039;)&lt;br /&gt;
yesno(&#039;YES&#039;)&lt;br /&gt;
yesno(&#039;yEs&#039;)&lt;br /&gt;
yesno(&#039;Y&#039;)&lt;br /&gt;
yesno(&#039;tRuE&#039;)&lt;br /&gt;
&lt;br /&gt;
-- These always return false:&lt;br /&gt;
yesno(&#039;No&#039;)&lt;br /&gt;
yesno(&#039;NO&#039;)&lt;br /&gt;
yesno(&#039;nO&#039;)&lt;br /&gt;
yesno(&#039;N&#039;)&lt;br /&gt;
yesno(&#039;fALsE&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can specify a default value if yesno receives input other than that listed above. If you don&#039;t supply a default, the module will return &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; for these inputs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- These return nil:&lt;br /&gt;
yesno(&#039;foo&#039;)&lt;br /&gt;
yesno({})&lt;br /&gt;
yesno(5)&lt;br /&gt;
yesno(function() return &#039;This is a function.&#039; end)&lt;br /&gt;
&lt;br /&gt;
-- These return true:&lt;br /&gt;
yesno(&#039;foo&#039;, true)&lt;br /&gt;
yesno({}, true)&lt;br /&gt;
yesno(5, true)&lt;br /&gt;
yesno(function() return &#039;This is a function.&#039; end, true)&lt;br /&gt;
&lt;br /&gt;
-- These return &amp;quot;bar&amp;quot;:&lt;br /&gt;
yesno(&#039;foo&#039;, &#039;bar&#039;)&lt;br /&gt;
yesno({}, &#039;bar&#039;)&lt;br /&gt;
yesno(5, &#039;bar&#039;)&lt;br /&gt;
yesno(function() return &#039;This is a function.&#039; end, &#039;bar&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the blank string also functions this way:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
yesno(&#039;&#039;)        -- Returns nil.&lt;br /&gt;
yesno(&#039;&#039;, true)  -- Returns true.&lt;br /&gt;
yesno(&#039;&#039;, &#039;bar&#039;) -- Returns &amp;quot;bar&amp;quot;.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Although the blank string usually evaluates to false in wikitext, it evaluates to true in Lua. This module prefers the Lua behaviour over the wikitext behaviour. If treating the blank string as false is important for your module, you will need to remove blank arguments at an earlier stage of processing.&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Navbox&amp;diff=22775</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Navbox&amp;diff=22775"/>
		<updated>2013-11-21T22:41:58Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: add hlist vevent to tracking options as per edit request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module will implement {{Navbox}}&lt;br /&gt;
--&lt;br /&gt;
 &lt;br /&gt;
local p = {}&lt;br /&gt;
 &lt;br /&gt;
local HtmlBuilder = require(&#039;Module:HtmlBuilder&#039;)&lt;br /&gt;
local Navbar = require(&#039;Module:Navbar&#039;)&lt;br /&gt;
&lt;br /&gt;
local args&lt;br /&gt;
local frame&lt;br /&gt;
local tableRowAdded = false&lt;br /&gt;
local border&lt;br /&gt;
local listnums = {}&lt;br /&gt;
 &lt;br /&gt;
function trim(s)&lt;br /&gt;
    return (mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addTableRow(tbl)&lt;br /&gt;
    -- If any other rows have already been added, then we add a 2px gutter row.&lt;br /&gt;
    if tableRowAdded then&lt;br /&gt;
        tbl&lt;br /&gt;
            .tag(&#039;tr&#039;)&lt;br /&gt;
                .css(&#039;height&#039;, &#039;2px&#039;)&lt;br /&gt;
                .tag(&#039;td&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    tableRowAdded = true&lt;br /&gt;
    &lt;br /&gt;
    return tbl.tag(&#039;tr&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
function renderTitleRow(tbl)&lt;br /&gt;
    if not args.title then return end&lt;br /&gt;
 &lt;br /&gt;
    local titleRow = addTableRow(tbl)&lt;br /&gt;
     &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleRow&lt;br /&gt;
            .tag(&#039;th&#039;)&lt;br /&gt;
                .attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
                .addClass(&#039;navbox-group&#039;)&lt;br /&gt;
                .addClass(args.titlegroupclass)&lt;br /&gt;
                .cssText(args.basestyle)&lt;br /&gt;
                .cssText(args.groupstyle)&lt;br /&gt;
                .cssText(args.titlegroupstyle)&lt;br /&gt;
                .wikitext(args.titlegroup)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleCell = titleRow.tag(&#039;th&#039;).attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
            &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleCell&lt;br /&gt;
            .css(&#039;border-left&#039;, &#039;2px solid #fdfdfd&#039;)&lt;br /&gt;
            .css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleColspan = 2&lt;br /&gt;
    if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
    &lt;br /&gt;
    titleCell&lt;br /&gt;
        .cssText(args.basestyle)&lt;br /&gt;
        .cssText(args.titlestyle)&lt;br /&gt;
        .addClass(&#039;navbox-title&#039;)&lt;br /&gt;
        .attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
 &lt;br /&gt;
     renderNavBar(titleCell)&lt;br /&gt;
 &lt;br /&gt;
     titleCell&lt;br /&gt;
         .tag(&#039;div&#039;)&lt;br /&gt;
             .addClass(args.titleclass)&lt;br /&gt;
             .css(&#039;font-size&#039;, &#039;110%&#039;)&lt;br /&gt;
             .newline()&lt;br /&gt;
             .wikitext(args.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderNavBar(titleCell)&lt;br /&gt;
    -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left&lt;br /&gt;
    -- or right to keep the title centered.&lt;br /&gt;
    local spacerSide = nil&lt;br /&gt;
&lt;br /&gt;
    if args.navbar == &#039;off&#039; then&lt;br /&gt;
        -- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there&#039;s&lt;br /&gt;
        -- also no show/hide link, then we need a spacer on the right to achieve the left shift.&lt;br /&gt;
        if args.state == &#039;plain&#039; then spacerSide = &#039;right&#039; end&lt;br /&gt;
    elseif args.navbar == &#039;plain&#039; or args.navbar == &#039;off&#039; or (not args.name and (border == &#039;subgroup&#039; or border == &#039;child&#039; or border == &#039;none&#039;)) then&lt;br /&gt;
        -- No navbar. Need a spacer on the left to balance out the width of the show/hide link.&lt;br /&gt;
        if args.state ~= &#039;plain&#039; then spacerSide = &#039;left&#039; end&lt;br /&gt;
    else&lt;br /&gt;
        -- Will render navbar (or error message). If there&#039;s no show/hide link, need a spacer on the right&lt;br /&gt;
        -- to balance out the width of the navbar.&lt;br /&gt;
        if args.state == &#039;plain&#039; then spacerSide = &#039;right&#039; end&lt;br /&gt;
&lt;br /&gt;
        titleCell.wikitext(Navbar.navbar({ &lt;br /&gt;
            args.name, &lt;br /&gt;
            mini = 1, &lt;br /&gt;
            fontstyle = (args.basestyle or &#039;&#039;) .. &#039;;&#039; .. (args.titlestyle or &#039;&#039;) ..  &#039;;background:none transparent;border:none;&#039;&lt;br /&gt;
        }))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Render the spacer div.&lt;br /&gt;
    if spacerSide then&lt;br /&gt;
        titleCell&lt;br /&gt;
            .tag(&#039;span&#039;)&lt;br /&gt;
                .css(&#039;float&#039;, spacerSide)&lt;br /&gt;
                .css(&#039;width&#039;, &#039;6em&#039;)&lt;br /&gt;
                .wikitext(&#039;&amp;amp;nbsp;&#039;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
function renderAboveRow(tbl)&lt;br /&gt;
    if not args.above then return end&lt;br /&gt;
 &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        .tag(&#039;td&#039;)&lt;br /&gt;
            .addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
            .addClass(args.aboveclass)&lt;br /&gt;
            .cssText(args.basestyle)&lt;br /&gt;
            .cssText(args.abovestyle)&lt;br /&gt;
            .attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
            .tag(&#039;div&#039;)&lt;br /&gt;
                .newline()&lt;br /&gt;
                .wikitext(args.above)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderBelowRow(tbl)&lt;br /&gt;
    if not args.below then return end&lt;br /&gt;
    &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        .tag(&#039;td&#039;)&lt;br /&gt;
            .addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
            .addClass(args.belowclass)&lt;br /&gt;
            .cssText(args.basestyle)&lt;br /&gt;
            .cssText(args.belowstyle)&lt;br /&gt;
            .attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
            .tag(&#039;div&#039;)&lt;br /&gt;
                .newline()&lt;br /&gt;
                .wikitext(args.below)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getAboveBelowColspan()&lt;br /&gt;
    local ret = 2&lt;br /&gt;
    if args.imageleft then ret = ret + 1 end&lt;br /&gt;
    if args.image then ret = ret + 1 end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
function renderListRow(tbl, listnum)&lt;br /&gt;
    local row = addTableRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    if listnum == 1 and args.imageleft then&lt;br /&gt;
        row&lt;br /&gt;
            .tag(&#039;td&#039;)&lt;br /&gt;
                .addClass(&#039;navbox-image&#039;)&lt;br /&gt;
                .addClass(args.imageclass)&lt;br /&gt;
                .css(&#039;width&#039;, &#039;0%&#039;)&lt;br /&gt;
                .css(&#039;padding&#039;, &#039;0px 2px 0px 0px&#039;)&lt;br /&gt;
                .cssText(args.imageleftstyle)&lt;br /&gt;
                .attr(&#039;rowspan&#039;, 2 * #listnums - 1)&lt;br /&gt;
                .tag(&#039;div&#039;)&lt;br /&gt;
                    .newline()&lt;br /&gt;
                    .wikitext(args.imageleft)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args[&#039;group&#039; .. listnum] then&lt;br /&gt;
        local groupCell = row.tag(&#039;th&#039;)&lt;br /&gt;
        &lt;br /&gt;
        groupCell&lt;br /&gt;
               .attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
               .addClass(&#039;navbox-group&#039;)&lt;br /&gt;
               .addClass(args.groupclass)&lt;br /&gt;
               .cssText(args.basestyle)&lt;br /&gt;
               &lt;br /&gt;
        if args.groupwidth then&lt;br /&gt;
            groupCell.css(&#039;width&#039;, args.groupwidth)&lt;br /&gt;
        end&lt;br /&gt;
           &lt;br /&gt;
        groupCell&lt;br /&gt;
            .cssText(args.groupstyle)&lt;br /&gt;
            .cssText(args[&#039;group&#039; .. listnum .. &#039;style&#039;])&lt;br /&gt;
            .wikitext(args[&#039;group&#039; .. listnum])&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local listCell = row.tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
    if args[&#039;group&#039; .. listnum] then&lt;br /&gt;
        listCell&lt;br /&gt;
            .css(&#039;text-align&#039;, &#039;left&#039;)&lt;br /&gt;
            .css(&#039;border-left-width&#039;, &#039;2px&#039;)&lt;br /&gt;
            .css(&#039;border-left-style&#039;, &#039;solid&#039;)&lt;br /&gt;
    else&lt;br /&gt;
        listCell.attr(&#039;colspan&#039;, 2)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not args.groupwidth then &lt;br /&gt;
        listCell.css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local isOdd = (listnum % 2) == 1&lt;br /&gt;
    local rowstyle = args.evenstyle&lt;br /&gt;
    if isOdd then rowstyle = args.oddstyle end&lt;br /&gt;
 &lt;br /&gt;
    local evenOdd&lt;br /&gt;
    if args.evenodd == &#039;swap&#039; then&lt;br /&gt;
        if isOdd then evenOdd = &#039;even&#039; else evenOdd = &#039;odd&#039; end&lt;br /&gt;
    else&lt;br /&gt;
        if isOdd then evenOdd = args.evenodd or &#039;odd&#039; else evenOdd = args.evenodd or &#039;even&#039; end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    listCell&lt;br /&gt;
        .css(&#039;padding&#039;, &#039;0px&#039;)&lt;br /&gt;
        .cssText(args.liststyle)&lt;br /&gt;
        .cssText(rowstyle)&lt;br /&gt;
        .cssText(args[&#039;list&#039; .. listnum .. &#039;style&#039;])&lt;br /&gt;
        .addClass(&#039;navbox-list&#039;)&lt;br /&gt;
        .addClass(&#039;navbox-&#039; .. evenOdd)&lt;br /&gt;
        .addClass(args.listclass)&lt;br /&gt;
        .tag(&#039;div&#039;)&lt;br /&gt;
            .css(&#039;padding&#039;, (listnum == 1 and args.list1padding) or args.listpadding or &#039;0em 0.25em&#039;)&lt;br /&gt;
            .newline()&lt;br /&gt;
            .wikitext(args[&#039;list&#039; .. listnum])&lt;br /&gt;
&lt;br /&gt;
    if listnum == 1 and args.image then&lt;br /&gt;
        row&lt;br /&gt;
            .tag(&#039;td&#039;)&lt;br /&gt;
                .addClass(&#039;navbox-image&#039;)&lt;br /&gt;
                .addClass(args.imageclass)&lt;br /&gt;
                .css(&#039;width&#039;, &#039;0%&#039;)&lt;br /&gt;
                .css(&#039;padding&#039;, &#039;0px 0px 0px 2px&#039;)&lt;br /&gt;
                .cssText(args.imagestyle)&lt;br /&gt;
                .attr(&#039;rowspan&#039;, 2 * #listnums - 1)&lt;br /&gt;
                .tag(&#039;div&#039;)&lt;br /&gt;
                    .newline()&lt;br /&gt;
                    .wikitext(args.image)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
function renderTrackingCategories(builder)&lt;br /&gt;
    local frame = mw.getCurrentFrame()&lt;br /&gt;
    &lt;br /&gt;
    if not frame then return end&lt;br /&gt;
    &lt;br /&gt;
    local s = frame:preprocess(&#039;{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}&#039;)&lt;br /&gt;
    if mw.ustring.sub(s, 1, 1) == &#039;0&#039; then return end -- not in template space&lt;br /&gt;
    local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))&lt;br /&gt;
    if subpage == &#039;doc&#039; or subpage == &#039;sandbox&#039; or subpage == &#039;testcases&#039; then return end&lt;br /&gt;
    &lt;br /&gt;
    for i, cat in ipairs(getTrackingCategories()) do&lt;br /&gt;
        builder.wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;) &lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTrackingCategories()&lt;br /&gt;
    local cats = {}&lt;br /&gt;
    if needsHorizontalLists() then table.insert(cats, &#039;Navigational boxes without horizontal lists&#039;) end&lt;br /&gt;
    if hasBackgroundColors() then table.insert(cats, &#039;Navboxes using background colours&#039;) end&lt;br /&gt;
    return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function needsHorizontalLists()&lt;br /&gt;
    if border == &#039;child&#039; or border == &#039;subgroup&#039;  or args.tracking == &#039;no&#039; then return false end&lt;br /&gt;
    &lt;br /&gt;
    local listClasses = {&#039;plainlist&#039;, &#039;hlist&#039;, &#039;hlist hnum&#039;, &#039;hlist hwrap&#039;, &#039;hlist vcard&#039;, &#039;vcard hlist&#039;, &#039;hlist vevent&#039;}&lt;br /&gt;
    for i, cls in ipairs(listClasses) do&lt;br /&gt;
        if args.listclass == cls or args.bodyclass == cls then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hasBackgroundColors()&lt;br /&gt;
    return args.titlestyle or args.groupstyle&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
function renderMainTable()&lt;br /&gt;
    local tbl = HtmlBuilder.create(&#039;table&#039;)&lt;br /&gt;
        .attr(&#039;cellspacing&#039;, 0)&lt;br /&gt;
        .addClass(&#039;nowraplinks&#039;)&lt;br /&gt;
        .addClass(args.bodyclass)&lt;br /&gt;
             &lt;br /&gt;
    if args.title and (args.state ~= &#039;plain&#039; and args.state ~= &#039;off&#039;) then&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass(&#039;collapsible&#039;)&lt;br /&gt;
            .addClass(args.state or &#039;autocollapse&#039;)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    tbl.css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
    if border == &#039;subgroup&#039; or border == &#039;child&#039; or border == &#039;none&#039; then&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass(&#039;navbox-subgroup&#039;)&lt;br /&gt;
            .cssText(args.bodystyle)&lt;br /&gt;
            .cssText(args.style)&lt;br /&gt;
    else -- regular navobx - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass(&#039;navbox-inner&#039;)&lt;br /&gt;
            .css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
            .css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
    end&lt;br /&gt;
    tbl.cssText(args.innerstyle)&lt;br /&gt;
 &lt;br /&gt;
    renderTitleRow(tbl)&lt;br /&gt;
    renderAboveRow(tbl)&lt;br /&gt;
    for i, listnum in ipairs(listnums) do&lt;br /&gt;
        renderListRow(tbl, listnum) &lt;br /&gt;
    end&lt;br /&gt;
    renderBelowRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
    args = navboxArgs&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        local listnum = (&#039;&#039; .. k):match(&#039;^list(%d+)$&#039;)&lt;br /&gt;
        if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(listnums)&lt;br /&gt;
 &lt;br /&gt;
    border = trim(args.border or args[1] or &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
    -- render the main body of the navbox&lt;br /&gt;
    local tbl = renderMainTable()&lt;br /&gt;
&lt;br /&gt;
    -- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
    local res = HtmlBuilder.create()&lt;br /&gt;
    if border == &#039;none&#039; then&lt;br /&gt;
        res.node(tbl)&lt;br /&gt;
    elseif border == &#039;subgroup&#039; or border == &#039;child&#039; then&lt;br /&gt;
        -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
        -- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
        -- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
        res&lt;br /&gt;
            .tag(&#039;/div&#039;, {unclosed = true})&lt;br /&gt;
                .done()&lt;br /&gt;
            .node(tbl)&lt;br /&gt;
            .tag(&#039;div&#039;, {unclosed = true})&lt;br /&gt;
    else&lt;br /&gt;
        res&lt;br /&gt;
            .tag(&#039;table&#039;)&lt;br /&gt;
                .attr(&#039;cellspacing&#039;, 0)&lt;br /&gt;
                .addClass(&#039;navbox&#039;)&lt;br /&gt;
                .css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
                .cssText(args.bodystyle)&lt;br /&gt;
                .cssText(args.style)&lt;br /&gt;
                .tag(&#039;tr&#039;)&lt;br /&gt;
                    .tag(&#039;td&#039;)&lt;br /&gt;
                        .css(&#039;padding&#039;, &#039;2px&#039;)&lt;br /&gt;
                        .node(tbl)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    renderTrackingCategories(res)&lt;br /&gt;
 &lt;br /&gt;
    return tostring(res)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
    -- ParserFunctions considers the empty string to be false, so to preserve the previous &lt;br /&gt;
    -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider&lt;br /&gt;
    -- them false too.&lt;br /&gt;
    local args = {}&lt;br /&gt;
    local parent_args = frame:getParent().args;&lt;br /&gt;
&lt;br /&gt;
    -- Out of order parsing bug.&lt;br /&gt;
    local temp;&lt;br /&gt;
    temp = parent_args.title;&lt;br /&gt;
    temp = parent_args.above;&lt;br /&gt;
    for i = 1, 20 do&lt;br /&gt;
        temp = parent_args[&amp;quot;group&amp;quot; .. tostring(i)];&lt;br /&gt;
        temp = parent_args[&amp;quot;list&amp;quot; .. tostring(i)];&lt;br /&gt;
    end    &lt;br /&gt;
    temp = parent_args.below;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(parent_args) do&lt;br /&gt;
        if v ~= &#039;&#039; then&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklearv.js&amp;diff=23365</id>
		<title>MediaWiki:Gadget-twinklearv.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklearv.js&amp;diff=23365"/>
		<updated>2013-11-19T10:15:12Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklearv.js: ARV module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;ARV&amp;quot;)&lt;br /&gt;
 * Active on:              Existing and non-existing user pages, user talk pages, contributions pages&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv = function twinklearv() {&lt;br /&gt;
	var username = Morebits.getPageAssociatedUser();&lt;br /&gt;
	if ( username === false ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var title = Morebits.isIPAddress( username ) ? &#039;Report IP to administrators&#039; : &#039;Report user to administrators&#039;;&lt;br /&gt;
&lt;br /&gt;
	Twinkle.addPortletLink( function(){ Twinkle.arv.callback(username); }, &amp;quot;ARV&amp;quot;, &amp;quot;tw-arv&amp;quot;, title );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv.callback = function ( uid ) {&lt;br /&gt;
	if ( uid === mw.config.get(&#039;wgUserName&#039;) ) {&lt;br /&gt;
		alert( &#039;You don\&#039;t want to report yourself, do you?&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 600, 500 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Advance Reporting and Vetting&amp;quot; ); //Backronym&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Guide to AIV&amp;quot;, &amp;quot;WP:GAIV&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;UAA instructions&amp;quot;, &amp;quot;WP:UAAI&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;About SPI&amp;quot;, &amp;quot;WP:SPI&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#arv&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.arv.callback.evaluate );&lt;br /&gt;
	var categories = form.append( {&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;category&#039;,&lt;br /&gt;
			label: &#039;Select report type: &#039;,&lt;br /&gt;
			event: Twinkle.arv.callback.changeCategory&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Vandalism (WP:AIV)&#039;,&lt;br /&gt;
			value: &#039;aiv&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Username (WP:UAA)&#039;,&lt;br /&gt;
			value: &#039;username&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Sockpuppeteer (WP:SPI)&#039;,&lt;br /&gt;
			value: &#039;sock&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Sockpuppet (WP:SPI)&#039;,&lt;br /&gt;
			value: &#039;puppet&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	categories.append( {&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Edit warring (WP:AN3)&#039;,&lt;br /&gt;
			value: &#039;an3&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			label: &#039;Work area&#039;,&lt;br /&gt;
			name: &#039;work_area&#039;&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( { type: &#039;submit&#039; } );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;hidden&#039;,&lt;br /&gt;
			name: &#039;uid&#039;,&lt;br /&gt;
			value: uid&lt;br /&gt;
		} );&lt;br /&gt;
	&lt;br /&gt;
	var result = form.render();&lt;br /&gt;
	Window.setContent( result );&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	// We must init the&lt;br /&gt;
	var evt = document.createEvent( &amp;quot;Event&amp;quot; );&lt;br /&gt;
	evt.initEvent( &#039;change&#039;, true, true );&lt;br /&gt;
	result.category.dispatchEvent( evt );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv.callback.changeCategory = function (e) {&lt;br /&gt;
	var value = e.target.value;&lt;br /&gt;
	var root = e.target.form;&lt;br /&gt;
	var old_area = Morebits.quickForm.getElements(root, &amp;quot;work_area&amp;quot;)[0];&lt;br /&gt;
	var work_area = null;&lt;br /&gt;
&lt;br /&gt;
	switch( value ) {&lt;br /&gt;
	case &#039;aiv&#039;:&lt;br /&gt;
		/* falls through */&lt;br /&gt;
	default:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Report user for vandalism&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;page&#039;,&lt;br /&gt;
				label: &#039;Primary linked page: &#039;,&lt;br /&gt;
				tooltip: &#039;Leave blank to not link to the page in the report&#039;,&lt;br /&gt;
				value: Morebits.queryString.exists( &#039;vanarticle&#039; ) ? Morebits.queryString.get( &#039;vanarticle&#039; ) : &#039;&#039;,&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var value = e.target.value;&lt;br /&gt;
					var root = e.target.form;&lt;br /&gt;
					if( value === &#039;&#039; ) {&lt;br /&gt;
						root.badid.disabled = root.goodid.disabled = true;&lt;br /&gt;
					} else {&lt;br /&gt;
						root.badid.disabled = false;&lt;br /&gt;
						root.goodid.disabled = root.badid.value === &#039;&#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;badid&#039;,&lt;br /&gt;
				label: &#039;Revision ID for target page when vandalised: &#039;,&lt;br /&gt;
				tooltip: &#039;Leave blank for no diff link&#039;,&lt;br /&gt;
				value: Morebits.queryString.exists( &#039;vanarticlerevid&#039; ) ? Morebits.queryString.get( &#039;vanarticlerevid&#039; ) : &#039;&#039;,&lt;br /&gt;
				disabled: !Morebits.queryString.exists( &#039;vanarticle&#039; ),&lt;br /&gt;
				event: function(e) {&lt;br /&gt;
					var value = e.target.value;&lt;br /&gt;
					var root = e.target.form;&lt;br /&gt;
					root.goodid.disabled = value === &#039;&#039;;&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;goodid&#039;,&lt;br /&gt;
				label: &#039;Last good revision ID before vandalism of target page: &#039;,&lt;br /&gt;
				tooltip: &#039;Leave blank for diff link to previous revision&#039;,&lt;br /&gt;
				value: Morebits.queryString.exists( &#039;vanarticlegoodrevid&#039; ) ? Morebits.queryString.get( &#039;vanarticlegoodrevid&#039; ) : &#039;&#039;,&lt;br /&gt;
				disabled: !Morebits.queryString.exists( &#039;vanarticle&#039; ) || Morebits.queryString.exists( &#039;vanarticlerevid&#039; )&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				name: &#039;arvtype&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Vandalism after final (level 4 or 4im) warning given&#039;,&lt;br /&gt;
						value: &#039;final&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Vandalism after recent (within 1 day) release of block&#039;,&lt;br /&gt;
						value: &#039;postblock&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Evidently a vandalism-only account&#039;,&lt;br /&gt;
						value: &#039;vandalonly&#039;,&lt;br /&gt;
						disabled: Morebits.isIPAddress( root.uid.value )&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Account is evidently a spambot or a compromised account&#039;,&lt;br /&gt;
						value: &#039;spambot&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Account is a promotion-only account&#039;,&lt;br /&gt;
						value: &#039;promoonly&#039;&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;textarea&#039;,&lt;br /&gt;
				name: &#039;reason&#039;,&lt;br /&gt;
				label: &#039;Comment: &#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;username&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Report username violation&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append ( {&lt;br /&gt;
				type: &#039;header&#039;,&lt;br /&gt;
				label: &#039;Type(s) of inappropriate username&#039;,&lt;br /&gt;
				tooltip: &#039;Wikipedia does not allow usernames that are misleading, promotional, offensive or disruptive. Domain names and email addresses are likewise prohibited. These criteria apply to both usernames and signatures. Usernames that are inappropriate in another language, or that represent an inappropriate name with misspellings and substitutions, or do so indirectly or by implication, are still considered inappropriate.&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				name: &#039;arvtype&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Misleading username&#039;,&lt;br /&gt;
						value: &#039;misleading&#039;,&lt;br /&gt;
						tooltip: &#039;Misleading usernames imply relevant, misleading things about the contributor. For example, misleading points of fact, an impression of undue authority, or the suggestion that the account is operated by a group, project or collective rather than one individual.&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Promotional username&#039;,&lt;br /&gt;
						value: &#039;promotional&#039;,&lt;br /&gt;
						tooltip: &#039;Promotional usernames are advertisements for a company, website or group. Please do not report these names to UAA unless the user has also made promotional edits related to the name.&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Offensive username&#039;,&lt;br /&gt;
						value: &#039;offensive&#039;,&lt;br /&gt;
						tooltip: &#039;Offensive usernames make harmonious editing difficult or impossible.&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Disruptive username&#039;,&lt;br /&gt;
						value: &#039;disruptive&#039;,&lt;br /&gt;
						tooltip: &#039;Disruptive usernames include outright trolling or personal attacks, or otherwise show a clear intent to disrupt Wikipedia.&#039;&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;textarea&#039;,&lt;br /&gt;
				name: &#039;reason&#039;,&lt;br /&gt;
				label: &#039;Comment:&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
&lt;br /&gt;
	case &#039;puppet&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Report suspected sockpuppet&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append(&lt;br /&gt;
			{&lt;br /&gt;
				type: &#039;input&#039;,&lt;br /&gt;
				name: &#039;sockmaster&#039;,&lt;br /&gt;
				label: &#039;Sockpuppeteer&#039;,&lt;br /&gt;
				tooltip: &#039;The username of the sockpuppeteer (sockmaster) without the User:-prefix&#039;&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;textarea&#039;,&lt;br /&gt;
				label: &#039;Evidence:&#039;,&lt;br /&gt;
				name: &#039;evidence&#039;,&lt;br /&gt;
				tooltip: &#039;Enter your evidence. It should make clear that each of these users is likely to be abusing multiple accounts. Usually this means diffs, page histories or other information that justifies why the users are a) the same and b) disruptive. This should purely be evidence and information needed to judge the matter. Avoid all other discussion that is not evidence of sockpuppetry or other multiple account abuse.&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Request CheckUser evidence&#039;,&lt;br /&gt;
						name: &#039;checkuser&#039;,&lt;br /&gt;
						tooltip: &#039;CheckUser is a tool used to obtain technical evidence related to a sock-puppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why CheckUser is appropriate.&#039;&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						label: &#039;Notify reported users&#039;,&lt;br /&gt;
						name: &#039;notify&#039;,&lt;br /&gt;
						tooltip: &#039;Notification is not mandatory. In many cases, especially of chronic sockpuppeteers, notification may be counterproductive. However, especially in less egregious cases involving users who has not been reported before, notification may make the cases fairer and also appear to be fairer in the eyes of the accused. Use your judgment.&#039;&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			} );&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	case &#039;sock&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;field&#039;,&lt;br /&gt;
				label: &#039;Report suspected sockpuppeteer&#039;,&lt;br /&gt;
				name: &#039;work_area&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append(&lt;br /&gt;
			{&lt;br /&gt;
				type: &#039;dyninput&#039;,&lt;br /&gt;
				name: &#039;sockpuppet&#039;,&lt;br /&gt;
				label: &#039;Sockpuppets&#039;,&lt;br /&gt;
				sublabel: &#039;Sock: &#039;,&lt;br /&gt;
				tooltip: &#039;The username of the sockpuppet without the User:-prefix&#039;,&lt;br /&gt;
				min: 2&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;textarea&#039;,&lt;br /&gt;
				label: &#039;Evidence:&#039;,&lt;br /&gt;
				name: &#039;evidence&#039;,&lt;br /&gt;
				tooltip: &#039;Enter your evidence. It should make clear that each of these users is likely to be abusing multiple accounts. Usually this means diffs, page histories or other information that justifies why the users are a) the same and b) disruptive. This should purely be evidence and information needed to judge the matter. Avoid all other discussion that is not evidence of sockpuppetry or other multiple account abuse.&#039;&lt;br /&gt;
			} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
				type: &#039;checkbox&#039;,&lt;br /&gt;
				list: [ {&lt;br /&gt;
					label: &#039;Request CheckUser evidence&#039;,&lt;br /&gt;
					name: &#039;checkuser&#039;,&lt;br /&gt;
					tooltip: &#039;CheckUser is a tool used to obtain technical evidence related to a sock-puppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why CheckUser is appropriate.&#039;&lt;br /&gt;
				}, {&lt;br /&gt;
					label: &#039;Notify reported users&#039;,&lt;br /&gt;
					name: &#039;notify&#039;,&lt;br /&gt;
					tooltip: &#039;Notification is not mandatory. In many cases, especially of chronic sockpuppeteers, notification may be counterproductive. However, especially in less egregious cases involving users who has not been reported before, notification may make the cases fairer and also appear to be fairer in the eyes of the accused. Use your judgment.&#039;&lt;br /&gt;
				} ]&lt;br /&gt;
			} );&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
        break;&lt;br /&gt;
	case &#039;an3&#039;:&lt;br /&gt;
		work_area = new Morebits.quickForm.element( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			label: &#039;Report edit warring&#039;,&lt;br /&gt;
			name: &#039;work_area&#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;input&#039;,&lt;br /&gt;
			name: &#039;page&#039;,&lt;br /&gt;
			label: &#039;Page&#039;,&lt;br /&gt;
			tooltip: &#039;The page being reported&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;button&#039;,&lt;br /&gt;
			name: &#039;load&#039;,&lt;br /&gt;
			label: &#039;Load&#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				var root = e.target.form;&lt;br /&gt;
				var value = root.page.value;&lt;br /&gt;
				var uid = root.uid.value;&lt;br /&gt;
				var $diffs = $(root).find(&#039;[name=diffs]&#039;);&lt;br /&gt;
				$diffs.find(&#039;.entry&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
				var date = new Date();&lt;br /&gt;
				date.setHours(-36); // all since 36 hours&lt;br /&gt;
&lt;br /&gt;
				var api = new mw.Api();&lt;br /&gt;
				api.get({&lt;br /&gt;
					action: &#039;query&#039;,&lt;br /&gt;
					prop: &#039;revisions&#039;,&lt;br /&gt;
					format: &#039;json&#039;,&lt;br /&gt;
					rvprop: &#039;sha1|ids|timestamp|parsedcomment|comment&#039;,&lt;br /&gt;
					rvlimit: 500,&lt;br /&gt;
					rvend: date.toISOString(),&lt;br /&gt;
					rvuser: uid,&lt;br /&gt;
					indexpageids: true,&lt;br /&gt;
					redirects: true,&lt;br /&gt;
					titles: value&lt;br /&gt;
				}).done(function(data){&lt;br /&gt;
					var pageid = data.query.pageids[0];&lt;br /&gt;
					var page = data.query.pages[pageid];&lt;br /&gt;
					if(!page.revisions) {&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					for(var i = 0; i &amp;lt; page.revisions.length; ++i) {&lt;br /&gt;
						var rev = page.revisions[i];&lt;br /&gt;
						var $entry = $(&#039;&amp;lt;div/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;class&#039;: &#039;entry&#039;&lt;br /&gt;
						});&lt;br /&gt;
						var $input = $(&#039;&amp;lt;input/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;type&#039;: &#039;checkbox&#039;,&lt;br /&gt;
							&#039;name&#039;: &#039;s_diffs&#039;,&lt;br /&gt;
							&#039;value&#039;: rev.revid&lt;br /&gt;
						});&lt;br /&gt;
						$input.data(&#039;revinfo&#039;,rev);&lt;br /&gt;
						$input.appendTo($entry);&lt;br /&gt;
						$entry.append(&#039;&amp;lt;span&amp;gt;&amp;quot;&#039;+rev.parsedcomment+&#039;&amp;quot; at &amp;lt;a href=&amp;quot;&#039;+mw.config.get(&#039;wgScript&#039;)+&#039;?diff=&#039;+rev.revid+&#039;&amp;quot;&amp;gt;&#039;+moment(rev.timestamp).calendar()+&#039;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;).appendTo($diffs);&lt;br /&gt;
					}&lt;br /&gt;
				}).fail(function(data){&lt;br /&gt;
					console.log( &#039;API failed :(&#039;, error );&lt;br /&gt;
				});&lt;br /&gt;
				var $warnings = $(root).find(&#039;[name=warnings]&#039;);&lt;br /&gt;
				$warnings.find(&#039;.entry&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
				api.get({&lt;br /&gt;
					action: &#039;query&#039;,&lt;br /&gt;
					prop: &#039;revisions&#039;,&lt;br /&gt;
					format: &#039;json&#039;,&lt;br /&gt;
					rvprop: &#039;sha1|ids|timestamp|parsedcomment|comment&#039;,&lt;br /&gt;
					rvlimit: 500,&lt;br /&gt;
					rvend: date.toISOString(),&lt;br /&gt;
					rvuser: mw.config.get(&#039;wgUserName&#039;),&lt;br /&gt;
					indexpageids: true,&lt;br /&gt;
					redirects: true,&lt;br /&gt;
					titles: &#039;User talk:&#039; + uid&lt;br /&gt;
				}).done(function(data){&lt;br /&gt;
					var pageid = data.query.pageids[0];&lt;br /&gt;
					var page = data.query.pages[pageid];&lt;br /&gt;
					if(!page.revisions) {&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					for(var i = 0; i &amp;lt; page.revisions.length; ++i) {&lt;br /&gt;
						var rev = page.revisions[i];&lt;br /&gt;
						var $entry = $(&#039;&amp;lt;div/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;class&#039;: &#039;entry&#039;&lt;br /&gt;
						});&lt;br /&gt;
						var $input = $(&#039;&amp;lt;input/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;type&#039;: &#039;checkbox&#039;,&lt;br /&gt;
							&#039;name&#039;: &#039;s_warnings&#039;,&lt;br /&gt;
							&#039;value&#039;: rev.revid&lt;br /&gt;
						});&lt;br /&gt;
						$input.data(&#039;revinfo&#039;,rev);&lt;br /&gt;
						$input.appendTo($entry);&lt;br /&gt;
						$entry.append(&#039;&amp;lt;span&amp;gt;&amp;quot;&#039;+rev.parsedcomment+&#039;&amp;quot; at &amp;lt;a href=&amp;quot;&#039;+mw.config.get(&#039;wgScript&#039;)+&#039;?diff=&#039;+rev.revid+&#039;&amp;quot;&amp;gt;&#039;+moment(rev.timestamp).calendar()+&#039;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;).appendTo($warnings);&lt;br /&gt;
					}&lt;br /&gt;
				}).fail(function(data){&lt;br /&gt;
					console.log( &#039;API failed :(&#039;, error );&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
				var $resolves = $(root).find(&#039;[name=resolves]&#039;);&lt;br /&gt;
				$resolves.find(&#039;.entry&#039;).remove();&lt;br /&gt;
&lt;br /&gt;
				var t = new mw.Title(value);&lt;br /&gt;
				var ns = t.getNamespaceId();&lt;br /&gt;
				talk_page = (new mw.Title(t.getMain(), ns%2? ns : ns+1)).getPrefixedText();&lt;br /&gt;
&lt;br /&gt;
				api.get({&lt;br /&gt;
					action: &#039;query&#039;,&lt;br /&gt;
					prop: &#039;revisions&#039;,&lt;br /&gt;
					format: &#039;json&#039;,&lt;br /&gt;
					rvprop: &#039;sha1|ids|timestamp|parsedcomment|comment&#039;,&lt;br /&gt;
					rvlimit: 500,&lt;br /&gt;
					rvend: date.toISOString(),&lt;br /&gt;
					rvuser: mw.config.get(&#039;wgUserName&#039;),&lt;br /&gt;
					indexpageids: true,&lt;br /&gt;
					redirects: true,&lt;br /&gt;
					titles: talk_page&lt;br /&gt;
				}).done(function(data){&lt;br /&gt;
					var pageid = data.query.pageids[0];&lt;br /&gt;
					var page = data.query.pages[pageid];&lt;br /&gt;
					if(!page.revisions) {&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					for(var i = 0; i &amp;lt; page.revisions.length; ++i) {&lt;br /&gt;
						var rev = page.revisions[i];&lt;br /&gt;
						var $entry = $(&#039;&amp;lt;div/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;class&#039;: &#039;entry&#039;&lt;br /&gt;
						});&lt;br /&gt;
						var $input = $(&#039;&amp;lt;input/&amp;gt;&#039;, {&lt;br /&gt;
							&#039;type&#039;: &#039;checkbox&#039;,&lt;br /&gt;
							&#039;name&#039;: &#039;s_resolves&#039;,&lt;br /&gt;
							&#039;value&#039;: rev.revid&lt;br /&gt;
						});&lt;br /&gt;
						$input.data(&#039;revinfo&#039;,rev);&lt;br /&gt;
						$input.appendTo($entry);&lt;br /&gt;
						$entry.append(&#039;&amp;lt;span&amp;gt;&amp;quot;&#039;+rev.parsedcomment+&#039;&amp;quot; at &amp;lt;a href=&amp;quot;&#039;+mw.config.get(&#039;wgScript&#039;)+&#039;?diff=&#039;+rev.revid+&#039;&amp;quot;&amp;gt;&#039;+moment(rev.timestamp).calendar()+&#039;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;).appendTo($resolves);&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// add free form input&lt;br /&gt;
					var $free_entry = $(&#039;&amp;lt;div/&amp;gt;&#039;, {&lt;br /&gt;
						&#039;class&#039;: &#039;entry&#039;&lt;br /&gt;
					});&lt;br /&gt;
					var $free_input = $(&#039;&amp;lt;input/&amp;gt;&#039;, {&lt;br /&gt;
						&#039;type&#039;: &#039;text&#039;,&lt;br /&gt;
						&#039;name&#039;: &#039;s_resolves_free&#039;&lt;br /&gt;
					});&lt;br /&gt;
&lt;br /&gt;
					var $free_label = $(&#039;&amp;lt;label/&amp;gt;&#039;, {&lt;br /&gt;
						&#039;for&#039;: &#039;s_resolves_free&#039;,&lt;br /&gt;
						&#039;html&#039;: &#039;Diff to additional discussions: &#039;&lt;br /&gt;
					});&lt;br /&gt;
					$free_entry.append($free_label).append($free_input).appendTo($resolves);&lt;br /&gt;
&lt;br /&gt;
				}).fail(function(data){&lt;br /&gt;
					console.log( &#039;API failed :(&#039;, error );&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			name: &#039;diffs&#039;,&lt;br /&gt;
			label: &#039;User\&#039;s reverts&#039;,&lt;br /&gt;
			tooltip: &#039;Select the edits you believe are reverts&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			name: &#039;warnings&#039;,&lt;br /&gt;
			label: &#039;Warnings given to subject&#039;,&lt;br /&gt;
			tooltip: &#039;You must have warned the subject before reporting&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			name: &#039;resolves&#039;,&lt;br /&gt;
			label: &#039;Resolution initiatives&#039;,&lt;br /&gt;
			tooltip: &#039;You should have tried to resolve the issue on the talk page first&#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		work_area.append( {&lt;br /&gt;
			type: &#039;textarea&#039;,&lt;br /&gt;
			label: &#039;Comment:&#039;,&lt;br /&gt;
			name: &#039;comment&#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		work_area = work_area.render();&lt;br /&gt;
		old_area.parentNode.replaceChild( work_area, old_area );&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv.callback.evaluate = function(e) {&lt;br /&gt;
	var form = e.target;&lt;br /&gt;
	var reason = &amp;quot;&amp;quot;;&lt;br /&gt;
	var comment = &amp;quot;&amp;quot;;&lt;br /&gt;
	if ( form.reason ) {&lt;br /&gt;
		comment = form.reason.value;&lt;br /&gt;
	}&lt;br /&gt;
	var uid = form.uid.value;&lt;br /&gt;
&lt;br /&gt;
	var types;&lt;br /&gt;
	switch( form.category.value ) {&lt;br /&gt;
&lt;br /&gt;
		// Report user for vandalism&lt;br /&gt;
		case &#039;aiv&#039;:&lt;br /&gt;
			/* falls through */&lt;br /&gt;
		default:&lt;br /&gt;
			types = form.getChecked( &#039;arvtype&#039; );&lt;br /&gt;
			if( !types.length &amp;amp;&amp;amp; comment === &#039;&#039; ) {&lt;br /&gt;
				alert( &#039;You must specify some reason&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			types = types.map( function(v) {&lt;br /&gt;
					switch(v) {&lt;br /&gt;
						case &#039;final&#039;:&lt;br /&gt;
							return &#039;vandalism after final warning&#039;;&lt;br /&gt;
						case &#039;postblock&#039;:&lt;br /&gt;
							return &#039;vandalism after recent release of block&#039;;&lt;br /&gt;
						case &#039;spambot&#039;:&lt;br /&gt;
							return &#039;account is evidently a spambot or a compromised account&#039;;&lt;br /&gt;
						case &#039;vandalonly&#039;:&lt;br /&gt;
							return &#039;actions evidently indicate a vandalism-only account&#039;;&lt;br /&gt;
						case &#039;promoonly&#039;:&lt;br /&gt;
							return &#039;account is being used only for promotional purposes&#039;;&lt;br /&gt;
						default:&lt;br /&gt;
							return &#039;unknown reason&#039;;&lt;br /&gt;
					}&lt;br /&gt;
				} ).join( &#039;; &#039; );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			if ( form.page.value !== &#039;&#039; ) {&lt;br /&gt;
			&lt;br /&gt;
				// add a leading : on linked page namespace to prevent transclusion&lt;br /&gt;
				reason = &#039;On [[&#039; + form.page.value.replace( /^(Image|Category|File):/i, &#039;:$1:&#039; ) + &#039;]]&#039;;&lt;br /&gt;
&lt;br /&gt;
				if ( form.badid.value !== &#039;&#039; ) {&lt;br /&gt;
					var query = {&lt;br /&gt;
						&#039;title&#039;: form.page.value,&lt;br /&gt;
						&#039;diff&#039;: form.badid.value,&lt;br /&gt;
						&#039;oldid&#039;: form.goodid.value&lt;br /&gt;
					};&lt;br /&gt;
					reason += &#039; ({{diff|&#039; + form.page.value + &#039;|&#039; + form.badid.value + &#039;|&#039; + form.goodid.value + &#039;|diff}})&#039;;&lt;br /&gt;
				}&lt;br /&gt;
				reason += &#039;:&#039;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( types ) {&lt;br /&gt;
				reason += &amp;quot; &amp;quot; + types;&lt;br /&gt;
			}&lt;br /&gt;
			if (comment !== &amp;quot;&amp;quot; ) {&lt;br /&gt;
				reason += (reason === &amp;quot;&amp;quot; ? &amp;quot;&amp;quot; : &amp;quot;. &amp;quot;) + comment;&lt;br /&gt;
			}&lt;br /&gt;
			reason = reason.trim();&lt;br /&gt;
			if (reason.search(/[.?!;]$/) === -1) {&lt;br /&gt;
				reason += &amp;quot;.&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			reason += &amp;quot; ~~~~&amp;quot;;&lt;br /&gt;
			reason = reason.replace(/\r?\n/g, &amp;quot;\n*:&amp;quot;);  // indent newlines&lt;br /&gt;
&lt;br /&gt;
			Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
			Morebits.status.init( form );&lt;br /&gt;
&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = &amp;quot;Wikipedia:Administrator intervention against vandalism&amp;quot;;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Reporting complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			var aivPage = new Morebits.wiki.page( &#039;Wikipedia:Administrator intervention against vandalism&#039;, &#039;Processing AIV request&#039; );&lt;br /&gt;
			aivPage.setPageSection( 1 );&lt;br /&gt;
			aivPage.setFollowRedirect( true );&lt;br /&gt;
			&lt;br /&gt;
			aivPage.load( function() {&lt;br /&gt;
				var text = aivPage.getPageText();&lt;br /&gt;
&lt;br /&gt;
				// check if user has already been reported&lt;br /&gt;
				if (new RegExp( &amp;quot;\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*&amp;quot; + RegExp.escape( uid, true ) + &amp;quot;\\s*\\}\\}&amp;quot; ).test(text)) {&lt;br /&gt;
					aivPage.getStatusElement().info( &#039;Report already present, will not add a new one&#039; );&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				aivPage.getStatusElement().status( &#039;Adding new report...&#039; );&lt;br /&gt;
				aivPage.setEditSummary( &#039;Reporting [[Special:Contributions/&#039; + uid + &#039;|&#039; + uid + &#039;]].&#039; + Twinkle.getPref(&#039;summaryAd&#039;) );&lt;br /&gt;
				aivPage.setAppendText( &#039;\n*{{&#039; + ( Morebits.isIPAddress( uid ) ? &#039;IPvandal&#039; : &#039;vandal&#039; ) + &#039;|&#039; + (/\=/.test( uid ) ? &#039;1=&#039; : &#039;&#039; ) + uid + &#039;}} &amp;amp;ndash; &#039; + reason );&lt;br /&gt;
				aivPage.append();&lt;br /&gt;
			} );&lt;br /&gt;
			break;&lt;br /&gt;
			&lt;br /&gt;
		// Report inappropriate username&lt;br /&gt;
		case &#039;username&#039;:&lt;br /&gt;
			types = form.getChecked( &#039;arvtype&#039; );&lt;br /&gt;
			if( !types.length ) {&lt;br /&gt;
				alert( &#039;You must specify at least one breached violation&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			types = types.map( Morebits.string.toLowerCaseFirstChar );&lt;br /&gt;
&lt;br /&gt;
			if ( types.length &amp;lt;= 2 ) {&lt;br /&gt;
				types = types.join( &#039; and &#039; );&lt;br /&gt;
			} else {&lt;br /&gt;
				types = [ types.slice( 0, -1 ).join( &#039;, &#039; ), types.slice( -1 ) ].join( &#039; and &#039; );&lt;br /&gt;
			}&lt;br /&gt;
			var article = &#039;a&#039;;&lt;br /&gt;
			if ( /[aeiouwyh]/.test( types[0] ) ) { // non 100% correct, but whatever, inlcuding &#039;h&#039; for Cockney&lt;br /&gt;
				article = &#039;an&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			reason = &amp;quot;*{{user-uaa|1=&amp;quot; + uid + &amp;quot;}} &amp;amp;ndash; Violation of the username policy as &amp;quot; + article + &amp;quot; &amp;quot; + types + &amp;quot; username. &amp;quot;;&lt;br /&gt;
			if (comment !== &#039;&#039; ) {&lt;br /&gt;
				reason += Morebits.string.toUpperCaseFirstChar(comment) + &amp;quot;. &amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			reason += &amp;quot;~~~~&amp;quot;;&lt;br /&gt;
			reason = reason.replace(/\r?\n/g, &amp;quot;\n*:&amp;quot;);  // indent newlines&lt;br /&gt;
&lt;br /&gt;
			Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
			Morebits.status.init( form );&lt;br /&gt;
&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = &amp;quot;Wikipedia:Usernames for administrator attention&amp;quot;;&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;Reporting complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			var uaaPage = new Morebits.wiki.page( &#039;Wikipedia:Usernames for administrator attention&#039;, &#039;Processing UAA request&#039; );&lt;br /&gt;
			uaaPage.setFollowRedirect( true );&lt;br /&gt;
&lt;br /&gt;
			uaaPage.load( function() {&lt;br /&gt;
				var text = uaaPage.getPageText();&lt;br /&gt;
				&lt;br /&gt;
				// check if user has already been reported&lt;br /&gt;
				if (new RegExp( &amp;quot;\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?&amp;quot; + RegExp.escape(uid, true) + &amp;quot;\\s*(\\||\\})&amp;quot; ).test(text)) {&lt;br /&gt;
					uaaPage.getStatusElement().error( &#039;User is already listed.&#039; );&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				uaaPage.getStatusElement().status( &#039;Adding new report...&#039; );&lt;br /&gt;
				uaaPage.setEditSummary( &#039;Reporting [[Special:Contributions/&#039; + uid + &#039;|&#039; + uid + &#039;]].&#039;+ Twinkle.getPref(&#039;summaryAd&#039;) );&lt;br /&gt;
				uaaPage.setPageText( text.replace( /List begins below this line.\s*--&amp;gt;\s*/, &amp;quot;List begins below this line.\n--&amp;gt;\n&amp;quot; + reason + &amp;quot;\n\n&amp;quot; ) );  // add at top&lt;br /&gt;
				uaaPage.save();&lt;br /&gt;
			} );&lt;br /&gt;
			break;&lt;br /&gt;
			&lt;br /&gt;
		// WP:SPI&lt;br /&gt;
		case &amp;quot;sock&amp;quot;:&lt;br /&gt;
			/* falls through */&lt;br /&gt;
		case &amp;quot;puppet&amp;quot;:&lt;br /&gt;
			var sockParameters = {&lt;br /&gt;
				evidence: form.evidence.value.trim(),&lt;br /&gt;
				checkuser: form.checkuser.checked,&lt;br /&gt;
				notify: form.notify.checked&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			var puppetReport = form.category.value === &amp;quot;puppet&amp;quot;;&lt;br /&gt;
			if (puppetReport &amp;amp;&amp;amp; !(form.sockmaster.value.trim())) {&lt;br /&gt;
				if (!confirm(&amp;quot;You have not entered a sockmaster account for this puppet. Do you want to report this account as a sockpuppeteer instead?&amp;quot;)) {&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				puppetReport = false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			sockParameters.uid = puppetReport ? form.sockmaster.value.trim() : uid;&lt;br /&gt;
			sockParameters.sockpuppets = puppetReport ? [uid] : $.map( $(&#039;input:text[name=sockpuppet]&#039;,form), function(o){ return $(o).val() || null; });&lt;br /&gt;
&lt;br /&gt;
			Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
			Morebits.status.init( form );&lt;br /&gt;
			Twinkle.arv.processSock( sockParameters );&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &#039;an3&#039;:&lt;br /&gt;
			var diffs = $.map( $(&#039;input:checkbox[name=s_diffs]:checked&#039;,form), function(o){ return $(o).data(&#039;revinfo&#039;); });&lt;br /&gt;
&lt;br /&gt;
			if (diffs.length &amp;lt; 3 &amp;amp;&amp;amp; !confirm(&amp;quot;You have selected fewer than three offending edits. Do you wish to make the report anyway?&amp;quot;)) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var warnings = $.map( $(&#039;input:checkbox[name=s_warnings]:checked&#039;,form), function(o){ return $(o).data(&#039;revinfo&#039;); });&lt;br /&gt;
&lt;br /&gt;
			if(!warnings.length &amp;amp;&amp;amp; !confirm(&amp;quot;You have not selected any edits where you warned the offender. Do you wish to make the report anyway?&amp;quot;)) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var resolves = $.map( $(&#039;input:checkbox[name=s_resolves]:checked&#039;,form), function(o){ return $(o).data(&#039;revinfo&#039;); });&lt;br /&gt;
			var free_resolves = $(&#039;input[name=s_resolves_free]&#039;).val();&lt;br /&gt;
&lt;br /&gt;
			var an3_next = function(free_resolves) {&lt;br /&gt;
				if(!resolves.length &amp;amp;&amp;amp; !free_resolves &amp;amp;&amp;amp; !confirm(&amp;quot;You have not selected any edits where you tried to resolve the issue. Do you wish to make the report anyway?&amp;quot;)) {&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				var an3Parameters = {&lt;br /&gt;
					&#039;uid&#039;: uid,&lt;br /&gt;
					&#039;page&#039;: form.page.value.trim(),&lt;br /&gt;
					&#039;comment&#039;: form.comment.value.trim(),&lt;br /&gt;
					&#039;diffs&#039;: diffs,&lt;br /&gt;
					&#039;warnings&#039;: warnings,&lt;br /&gt;
					&#039;resolves&#039;: resolves,&lt;br /&gt;
					&#039;free_resolves&#039;: free_resolves&lt;br /&gt;
				};&lt;br /&gt;
&lt;br /&gt;
				Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
				Morebits.status.init( form );&lt;br /&gt;
				Twinkle.arv.processAN3( an3Parameters );&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			if(free_resolves) {&lt;br /&gt;
				var oldid=mw.util.getParamValue(&#039;oldid&#039;,free_resolves);&lt;br /&gt;
				var api = new mw.Api();&lt;br /&gt;
				api.get({&lt;br /&gt;
					action: &#039;query&#039;,&lt;br /&gt;
					prop: &#039;revisions&#039;,&lt;br /&gt;
					format: &#039;json&#039;,&lt;br /&gt;
					rvprop: &#039;ids|timestamp|comment&#039;,&lt;br /&gt;
					indexpageids: true,&lt;br /&gt;
					revids: oldid&lt;br /&gt;
				}).done(function(data){&lt;br /&gt;
					var pageid = data.query.pageids[0];&lt;br /&gt;
					var page = data.query.pages[pageid];&lt;br /&gt;
					an3_next(page);&lt;br /&gt;
				}).fail(function(data){&lt;br /&gt;
					console.log( &#039;API failed :(&#039;, error );&lt;br /&gt;
				});&lt;br /&gt;
			} else {&lt;br /&gt;
				an3_next();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv.processSock = function( params ) {&lt;br /&gt;
	Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous &amp;quot;action completed&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	// notify all user accounts if requested&lt;br /&gt;
	if (params.notify &amp;amp;&amp;amp; params.sockpuppets.length&amp;gt;0) {&lt;br /&gt;
	&lt;br /&gt;
		var notifyEditSummary = &amp;quot;Notifying about suspicion of sockpuppeteering.&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;);&lt;br /&gt;
		var notifyText = &amp;quot;\n\n{{subst:socksuspectnotice|1=&amp;quot; + params.uid + &amp;quot;}} ~~~~&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		// notify user&#039;s master account&lt;br /&gt;
		var masterTalkPage = new Morebits.wiki.page( &#039;User talk:&#039; + params.uid, &#039;Notifying suspected sockpuppeteer&#039; );&lt;br /&gt;
		masterTalkPage.setFollowRedirect( true );&lt;br /&gt;
		masterTalkPage.setEditSummary( notifyEditSummary );&lt;br /&gt;
		masterTalkPage.setAppendText( notifyText );&lt;br /&gt;
		masterTalkPage.append();&lt;br /&gt;
&lt;br /&gt;
		var statusIndicator = new Morebits.status( &#039;Notifying suspected sockpuppets&#039;, &#039;0%&#039; );&lt;br /&gt;
		var total = params.sockpuppets.length;&lt;br /&gt;
		var current =   0;&lt;br /&gt;
		&lt;br /&gt;
		// display status of notifications as they progress&lt;br /&gt;
		var onSuccess = function( sockTalkPage ) {&lt;br /&gt;
			var now = parseInt( 100 * ++(current)/total, 10 ) + &#039;%&#039;;&lt;br /&gt;
			statusIndicator.update( now );&lt;br /&gt;
			sockTalkPage.getStatusElement().unlink();&lt;br /&gt;
			if ( current &amp;gt;= total ) {&lt;br /&gt;
				statusIndicator.info( now + &#039; (completed)&#039; );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
		&lt;br /&gt;
		var socks = params.sockpuppets;&lt;br /&gt;
&lt;br /&gt;
		// notify each puppet account&lt;br /&gt;
		for( var i = 0; i &amp;lt; socks.length; ++i ) {&lt;br /&gt;
			var sockTalkPage = new Morebits.wiki.page( &#039;User talk:&#039; + socks[i], &amp;quot;Notification for &amp;quot; +  socks[i] );&lt;br /&gt;
			sockTalkPage.setFollowRedirect( true );&lt;br /&gt;
			sockTalkPage.setEditSummary( notifyEditSummary );&lt;br /&gt;
			sockTalkPage.setAppendText( notifyText );&lt;br /&gt;
			sockTalkPage.append( onSuccess );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// prepare the SPI report&lt;br /&gt;
	var text = &amp;quot;\n\n{{subst:SPI report|socksraw=&amp;quot; +&lt;br /&gt;
		params.sockpuppets.map( function(v) {&lt;br /&gt;
				return &amp;quot;* {{&amp;quot; + ( Morebits.isIPAddress( v ) ? &amp;quot;checkip&amp;quot; : &amp;quot;checkuser&amp;quot; ) + &amp;quot;|1=&amp;quot; + v + &amp;quot;}}&amp;quot;;&lt;br /&gt;
			} ).join( &amp;quot;\n&amp;quot; ) + &amp;quot;\n|evidence=&amp;quot; + params.evidence + &amp;quot; \n&amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
	if ( params.checkuser ) {&lt;br /&gt;
		text += &amp;quot;|checkuser=yes&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	text += &amp;quot;}}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var reportpage = &#039;Wikipedia:Sockpuppet investigations/&#039; + params.uid;&lt;br /&gt;
&lt;br /&gt;
	Morebits.wiki.actionCompleted.redirect = reportpage;&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &amp;quot;Reporting complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var spiPage = new Morebits.wiki.page( reportpage, &#039;Retrieving discussion page&#039; );&lt;br /&gt;
	spiPage.setFollowRedirect( true );&lt;br /&gt;
	spiPage.setEditSummary( &#039;Adding new report for [[Special:Contributions/&#039; + params.uid + &#039;|&#039; + params.uid + &#039;]].&#039;+ Twinkle.getPref(&#039;summaryAd&#039;) );&lt;br /&gt;
	spiPage.setAppendText( text );&lt;br /&gt;
	switch( Twinkle.getPref( &#039;spiWatchReport&#039; ) ) {&lt;br /&gt;
		case &#039;yes&#039;:&lt;br /&gt;
			spiPage.setWatchlist( true );&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;no&#039;:&lt;br /&gt;
			spiPage.setWatchlistFromPreferences( false );&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			spiPage.setWatchlistFromPreferences( true );&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
	spiPage.append();&lt;br /&gt;
	&lt;br /&gt;
	Morebits.wiki.removeCheckpoint();  // all page updates have been started&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.arv.processAN3 = function( params ) {&lt;br /&gt;
	// prepare the AN3 report&lt;br /&gt;
	var sha1, minid;&lt;br /&gt;
	for(var i = 0; i &amp;lt; params.diffs.length; ++i) {&lt;br /&gt;
		if( params.diffs[i].parentid &amp;amp;&amp;amp; (!minid || params.diffs[i].parentid &amp;lt; minid)) {&lt;br /&gt;
			minid = params.diffs[i].parentid;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var api = new mw.Api();&lt;br /&gt;
	api.get({&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		prop: &#039;revisions&#039;,&lt;br /&gt;
		format: &#039;json&#039;,&lt;br /&gt;
		rvprop: &#039;sha1|ids|timestamp|comment&#039;,&lt;br /&gt;
		rvlimit: 100,&lt;br /&gt;
		rvstartid: minid,&lt;br /&gt;
		rvexcludeuser: params.uid,&lt;br /&gt;
		indexpageids: true,&lt;br /&gt;
		redirects: true,&lt;br /&gt;
		titles: params.page&lt;br /&gt;
	}).done(function(data){&lt;br /&gt;
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous &amp;quot;action completed&amp;quot;&lt;br /&gt;
		var orig;&lt;br /&gt;
		if(data.length) {&lt;br /&gt;
			var sha1 = data[0].sha1;&lt;br /&gt;
			for(var i = 1; i &amp;lt; data.length; ++i) {&lt;br /&gt;
				if(data[i].sha1 == sha1) {&lt;br /&gt;
					orig = data[i];&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(!orig) {&lt;br /&gt;
				orig = data[0];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		origtext = &amp;quot;&amp;quot;;&lt;br /&gt;
		if(orig) {&lt;br /&gt;
			origtext = &#039;{{diff2|&#039; + orig.revid + &#039;|&#039; + orig.timestamp + &#039;}} &amp;quot;&#039; + orig.comment + &#039;&amp;quot;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var grouped_diffs = {};&lt;br /&gt;
&lt;br /&gt;
		var revid, parentid, lastid;&lt;br /&gt;
		for(var j = 0; j &amp;lt; params.diffs.length; ++j) {&lt;br /&gt;
			var cur = params.diffs[j];&lt;br /&gt;
			if( cur.revid &amp;amp;&amp;amp; cur.revid != parentid || lastid === null ) {&lt;br /&gt;
				lastid = cur.revid;&lt;br /&gt;
				grouped_diffs[lastid] = [];&lt;br /&gt;
			}&lt;br /&gt;
			parentid = cur.parentid;&lt;br /&gt;
			grouped_diffs[lastid].push(cur);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var difftext = $.map(grouped_diffs, function(sub, index){&lt;br /&gt;
			var ret = &amp;quot;&amp;quot;;&lt;br /&gt;
			if(sub.length &amp;gt;= 2) {&lt;br /&gt;
				var last = sub[0];&lt;br /&gt;
				var first = sub.slice(-1)[0];&lt;br /&gt;
				var label = &amp;quot;Consecutive edits made from &amp;quot; + moment(first.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;) + &amp;quot; to &amp;quot; + moment(last.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;);&lt;br /&gt;
				ret = &amp;quot;# {{diff|oldid=&amp;quot;+first.parentid+&amp;quot;|diff=&amp;quot;+last.revid+&amp;quot;|label=&amp;quot;+label+&amp;quot;}}\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			ret += sub.reverse().map(function(v){&lt;br /&gt;
				return (sub.length &amp;gt;= 2 ? &#039;#&#039; : &#039;&#039;) + &#039;# {{diff2|&#039; + v.revid + &#039;|&#039; + moment(v.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;) + &#039;}} &amp;quot;&#039; + v.comment + &#039;&amp;quot;&#039;;&lt;br /&gt;
			}).join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
			return ret;&lt;br /&gt;
		}).reverse().join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		var warningtext = params.warnings.reverse().map(function(v){&lt;br /&gt;
			return &#039;# &#039; + &#039; {{diff2|&#039; + v.revid + &#039;|&#039; + moment(v.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;) + &#039;}} &amp;quot;&#039; + v.comment + &#039;&amp;quot;&#039;;&lt;br /&gt;
		}).join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		var resolvetext = params.resolves.reverse().map(function(v){&lt;br /&gt;
			return &#039;# &#039; + &#039; {{diff2|&#039; + v.revid + &#039;|&#039; + moment(v.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;) + &#039;}} &amp;quot;&#039; + v.comment + &#039;&amp;quot;&#039;;&lt;br /&gt;
		}).join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		if(params.free_resolves) {&lt;br /&gt;
			var page = params.free_resolves;&lt;br /&gt;
			var rev = page.revisions[0];&lt;br /&gt;
			resolvetext += &amp;quot;\n# &amp;quot; + &#039; {{diff2|&#039; + rev.revid + &#039;|&#039; + moment(rev.timestamp).utc().format(&#039;HH:mm, D MMMM YYYY [(UTC)]&#039;) + &#039; on &#039; + page.title +  &#039;}} &amp;quot;&#039; + rev.comment + &#039;&amp;quot;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var comment = params.comment.replace(/~*$/g, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
		if(comment) {&lt;br /&gt;
			comment += &amp;quot; ~~~~&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var text = &amp;quot;\n\n&amp;quot;+&#039;{{subst:AN3 report|diffs=&#039;+difftext+&#039;|warnings=&#039;+warningtext+&#039;|resolves=&#039;+resolvetext+&#039;|pagename=&#039;+params.page+&#039;|orig=&#039;+origtext+&#039;|comment=&#039;+comment+&#039;|uid=&#039;+params.uid+&#039;}}&#039;;&lt;br /&gt;
&lt;br /&gt;
		var reportpage = &#039;Wikipedia:Administrators\&#039; noticeboard/Edit warring&#039;;&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.actionCompleted.redirect = reportpage;&lt;br /&gt;
		Morebits.wiki.actionCompleted.notice = &amp;quot;Reporting complete&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var an3Page = new Morebits.wiki.page( reportpage, &#039;Retrieving discussion page&#039; );&lt;br /&gt;
		an3Page.setFollowRedirect( true );&lt;br /&gt;
		an3Page.setEditSummary( &#039;Adding new report for [[Special:Contributions/&#039; + params.uid + &#039;|&#039; + params.uid + &#039;]].&#039;+ Twinkle.getPref(&#039;summaryAd&#039;) );&lt;br /&gt;
		an3Page.setAppendText( text );&lt;br /&gt;
		an3Page.append();&lt;br /&gt;
&lt;br /&gt;
		// notify user&lt;br /&gt;
&lt;br /&gt;
		var notifyEditSummary = &amp;quot;Notifying about edit warring noticeboard discussion.&amp;quot; + Twinkle.getPref(&#039;summaryAd&#039;);&lt;br /&gt;
		var notifyText = &amp;quot;\n\n{{subst:an3-notice|1=&amp;quot; + mw.util.wikiUrlencode(params.uid) + &amp;quot;|auto=1}} ~~~~&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var talkPage = new Morebits.wiki.page( &#039;User talk:&#039; + params.uid, &#039;Notifying edit warrior&#039; );&lt;br /&gt;
		talkPage.setFollowRedirect( true );&lt;br /&gt;
		talkPage.setEditSummary( notifyEditSummary );&lt;br /&gt;
		talkPage.setAppendText( notifyText );&lt;br /&gt;
		talkPage.append();&lt;br /&gt;
		Morebits.wiki.removeCheckpoint();  // all page updates have been started&lt;br /&gt;
	}).fail(function(data){&lt;br /&gt;
		console.log( &#039;API failed :(&#039;, error );&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinkleconfig.js&amp;diff=23525</id>
		<title>MediaWiki:Gadget-twinkleconfig.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinkleconfig.js&amp;diff=23525"/>
		<updated>2013-11-19T10:15:08Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinkleconfig.js: Preferences module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Adds configuration form to Wikipedia:Twinkle/Preferences and user &lt;br /&gt;
                           subpages named &amp;quot;/Twinkle preferences&amp;quot;, and adds ad box to the top of user &lt;br /&gt;
                           subpages belonging to the currently logged-in user which end in &#039;.js&#039;&lt;br /&gt;
 * Active on:              What I just said.  Yeah.&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
&lt;br /&gt;
 I, [[User:This, that and the other]], originally wrote this.  If the code is misbehaving, or you have any&lt;br /&gt;
 questions, don&#039;t hesitate to ask me.  (This doesn&#039;t at all imply [[WP:OWN]]ership - it&#039;s just meant to&lt;br /&gt;
 point you in the right direction.)  -- TTO&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.config = {};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.commonEnums = {&lt;br /&gt;
	watchlist: { yes: &amp;quot;Add to watchlist&amp;quot;, no: &amp;quot;Don&#039;t add to watchlist&amp;quot;, &amp;quot;default&amp;quot;: &amp;quot;Follow your site preferences&amp;quot; },&lt;br /&gt;
	talkPageMode: { window: &amp;quot;In a window, replacing other user talks&amp;quot;, tab: &amp;quot;In a new tab&amp;quot;, blank: &amp;quot;In a totally new window&amp;quot; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.commonSets = {&lt;br /&gt;
	csdCriteria: {&lt;br /&gt;
		db: &amp;quot;Custom rationale ({{db}})&amp;quot;,&lt;br /&gt;
		g1: &amp;quot;G1&amp;quot;, g2: &amp;quot;G2&amp;quot;, g3: &amp;quot;G3&amp;quot;, g4: &amp;quot;G4&amp;quot;, g5: &amp;quot;G5&amp;quot;, g6: &amp;quot;G6&amp;quot;, g7: &amp;quot;G7&amp;quot;, g8: &amp;quot;G8&amp;quot;, g10: &amp;quot;G10&amp;quot;, g11: &amp;quot;G11&amp;quot;, g12: &amp;quot;G12&amp;quot;, g13: &amp;quot;G13&amp;quot;,&lt;br /&gt;
		a1: &amp;quot;A1&amp;quot;, a2: &amp;quot;A2&amp;quot;, a3: &amp;quot;A3&amp;quot;, a5: &amp;quot;A5&amp;quot;, a7: &amp;quot;A7&amp;quot;, a9: &amp;quot;A9&amp;quot;, a10: &amp;quot;A10&amp;quot;, a11: &amp;quot;A11&amp;quot;,&lt;br /&gt;
		u1: &amp;quot;U1&amp;quot;, u2: &amp;quot;U2&amp;quot;, u3: &amp;quot;U3&amp;quot;,&lt;br /&gt;
		f1: &amp;quot;F1&amp;quot;, f2: &amp;quot;F2&amp;quot;, f3: &amp;quot;F3&amp;quot;, f7: &amp;quot;F7&amp;quot;, f8: &amp;quot;F8&amp;quot;, f9: &amp;quot;F9&amp;quot;, f10: &amp;quot;F10&amp;quot;,&lt;br /&gt;
		c1: &amp;quot;C1&amp;quot;,&lt;br /&gt;
		t2: &amp;quot;T2&amp;quot;, t3: &amp;quot;T3&amp;quot;,&lt;br /&gt;
		r2: &amp;quot;R2&amp;quot;, r3: &amp;quot;R3&amp;quot;,&lt;br /&gt;
		p1: &amp;quot;P1&amp;quot;, p2: &amp;quot;P2&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	csdCriteriaDisplayOrder: [&lt;br /&gt;
		&amp;quot;db&amp;quot;,&lt;br /&gt;
		&amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g5&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g7&amp;quot;, &amp;quot;g8&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;g13&amp;quot;,&lt;br /&gt;
		&amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;,&lt;br /&gt;
		&amp;quot;u1&amp;quot;, &amp;quot;u2&amp;quot;, &amp;quot;u3&amp;quot;,&lt;br /&gt;
		&amp;quot;f1&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f8&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;f10&amp;quot;,&lt;br /&gt;
		&amp;quot;c1&amp;quot;,&lt;br /&gt;
		&amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;,&lt;br /&gt;
		&amp;quot;r2&amp;quot;, &amp;quot;r3&amp;quot;,&lt;br /&gt;
		&amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	csdCriteriaNotification: {&lt;br /&gt;
		db: &amp;quot;Custom rationale ({{db}})&amp;quot;,&lt;br /&gt;
		g1: &amp;quot;G1&amp;quot;, g2: &amp;quot;G2&amp;quot;, g3: &amp;quot;G3&amp;quot;, g4: &amp;quot;G4&amp;quot;, g6: &#039;G6 (&amp;quot;unnecessary disambig.&amp;quot; and &amp;quot;copy-paste move&amp;quot; only)&#039;,&lt;br /&gt;
		g10: &amp;quot;G10&amp;quot;, g11: &amp;quot;G11&amp;quot;, g12: &amp;quot;G12&amp;quot;, g13: &amp;quot;G13&amp;quot;,&lt;br /&gt;
		a1: &amp;quot;A1&amp;quot;, a2: &amp;quot;A2&amp;quot;, a3: &amp;quot;A3&amp;quot;, a5: &amp;quot;A5&amp;quot;, a7: &amp;quot;A7&amp;quot;, a9: &amp;quot;A9&amp;quot;, a10: &amp;quot;A10&amp;quot;, a11: &amp;quot;A11&amp;quot;,&lt;br /&gt;
		u3: &amp;quot;U3&amp;quot;,&lt;br /&gt;
		f1: &amp;quot;F1&amp;quot;, f2: &amp;quot;F2&amp;quot;, f3: &amp;quot;F3&amp;quot;, f7: &amp;quot;F7&amp;quot;, f8: &amp;quot;F8&amp;quot;, f9: &amp;quot;F9&amp;quot;, f10: &amp;quot;F10&amp;quot;,&lt;br /&gt;
		c1: &amp;quot;C1&amp;quot;,&lt;br /&gt;
		t2: &amp;quot;T2&amp;quot;, t3: &amp;quot;T3&amp;quot;,&lt;br /&gt;
		r2: &amp;quot;R2&amp;quot;, r3: &amp;quot;R3&amp;quot;,&lt;br /&gt;
		p1: &amp;quot;P1&amp;quot;, p2: &amp;quot;P2&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	csdCriteriaNotificationDisplayOrder: [&lt;br /&gt;
		&amp;quot;db&amp;quot;,&lt;br /&gt;
		&amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;g13&amp;quot;,&lt;br /&gt;
		&amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;,&lt;br /&gt;
		&amp;quot;u3&amp;quot;,&lt;br /&gt;
		&amp;quot;f1&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;f10&amp;quot;,&lt;br /&gt;
		&amp;quot;c1&amp;quot;,&lt;br /&gt;
		&amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;,&lt;br /&gt;
		&amp;quot;r2&amp;quot;, &amp;quot;r3&amp;quot;,&lt;br /&gt;
		&amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	csdAndDICriteria: {&lt;br /&gt;
		db: &amp;quot;Custom rationale ({{db}})&amp;quot;,&lt;br /&gt;
		g1: &amp;quot;G1&amp;quot;, g2: &amp;quot;G2&amp;quot;, g3: &amp;quot;G3&amp;quot;, g4: &amp;quot;G4&amp;quot;, g5: &amp;quot;G5&amp;quot;, g6: &amp;quot;G6&amp;quot;, g7: &amp;quot;G7&amp;quot;, g8: &amp;quot;G8&amp;quot;, g10: &amp;quot;G10&amp;quot;, g11: &amp;quot;G11&amp;quot;, g12: &amp;quot;G12&amp;quot;, g13: &amp;quot;G13&amp;quot;,&lt;br /&gt;
		a1: &amp;quot;A1&amp;quot;, a2: &amp;quot;A2&amp;quot;, a3: &amp;quot;A3&amp;quot;, a5: &amp;quot;A5&amp;quot;, a7: &amp;quot;A7&amp;quot;, a9: &amp;quot;A9&amp;quot;, a10: &amp;quot;A10&amp;quot;, a11: &amp;quot;A11&amp;quot;,&lt;br /&gt;
		u1: &amp;quot;U1&amp;quot;, u2: &amp;quot;U2&amp;quot;, u3: &amp;quot;U3&amp;quot;,&lt;br /&gt;
		f1: &amp;quot;F1&amp;quot;, f2: &amp;quot;F2&amp;quot;, f3: &amp;quot;F3&amp;quot;, f4: &amp;quot;F4&amp;quot;, f5: &amp;quot;F5&amp;quot;, f6: &amp;quot;F6&amp;quot;, f7: &amp;quot;F7&amp;quot;, f8: &amp;quot;F8&amp;quot;, f9: &amp;quot;F9&amp;quot;, f10: &amp;quot;F10&amp;quot;, f11: &amp;quot;F11&amp;quot;,&lt;br /&gt;
		c1: &amp;quot;C1&amp;quot;,&lt;br /&gt;
		t2: &amp;quot;T2&amp;quot;, t3: &amp;quot;T3&amp;quot;,&lt;br /&gt;
		r2: &amp;quot;R2&amp;quot;, r3: &amp;quot;R3&amp;quot;,&lt;br /&gt;
		p1: &amp;quot;P1&amp;quot;, p2: &amp;quot;P2&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	csdAndDICriteriaDisplayOrder: [&lt;br /&gt;
		&amp;quot;db&amp;quot;,&lt;br /&gt;
		&amp;quot;g1&amp;quot;, &amp;quot;g2&amp;quot;, &amp;quot;g3&amp;quot;, &amp;quot;g4&amp;quot;, &amp;quot;g5&amp;quot;, &amp;quot;g6&amp;quot;, &amp;quot;g7&amp;quot;, &amp;quot;g8&amp;quot;, &amp;quot;g10&amp;quot;, &amp;quot;g11&amp;quot;, &amp;quot;g12&amp;quot;, &amp;quot;g13&amp;quot;,&lt;br /&gt;
		&amp;quot;a1&amp;quot;, &amp;quot;a2&amp;quot;, &amp;quot;a3&amp;quot;, &amp;quot;a5&amp;quot;, &amp;quot;a7&amp;quot;, &amp;quot;a9&amp;quot;, &amp;quot;a10&amp;quot;, &amp;quot;a11&amp;quot;,&lt;br /&gt;
		&amp;quot;u1&amp;quot;, &amp;quot;u2&amp;quot;, &amp;quot;u3&amp;quot;,&lt;br /&gt;
		&amp;quot;f1&amp;quot;, &amp;quot;f2&amp;quot;, &amp;quot;f3&amp;quot;, &amp;quot;f4&amp;quot;, &amp;quot;f5&amp;quot;, &amp;quot;f6&amp;quot;, &amp;quot;f7&amp;quot;, &amp;quot;f8&amp;quot;, &amp;quot;f9&amp;quot;, &amp;quot;f10&amp;quot;, &amp;quot;f11&amp;quot;,&lt;br /&gt;
		&amp;quot;c1&amp;quot;,&lt;br /&gt;
		&amp;quot;t2&amp;quot;, &amp;quot;t3&amp;quot;,&lt;br /&gt;
		&amp;quot;r2&amp;quot;, &amp;quot;r3&amp;quot;,&lt;br /&gt;
		&amp;quot;p1&amp;quot;, &amp;quot;p2&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	namespacesNoSpecial: {&lt;br /&gt;
		&amp;quot;0&amp;quot;: &amp;quot;Article&amp;quot;,&lt;br /&gt;
		&amp;quot;1&amp;quot;: &amp;quot;Talk (article)&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;: &amp;quot;User&amp;quot;,&lt;br /&gt;
		&amp;quot;3&amp;quot;: &amp;quot;User talk&amp;quot;,&lt;br /&gt;
		&amp;quot;4&amp;quot;: &amp;quot;Wikipedia&amp;quot;,&lt;br /&gt;
		&amp;quot;5&amp;quot;: &amp;quot;Wikipedia talk&amp;quot;,&lt;br /&gt;
		&amp;quot;6&amp;quot;: &amp;quot;File&amp;quot;,&lt;br /&gt;
		&amp;quot;7&amp;quot;: &amp;quot;File talk&amp;quot;,&lt;br /&gt;
		&amp;quot;8&amp;quot;: &amp;quot;MediaWiki&amp;quot;,&lt;br /&gt;
		&amp;quot;9&amp;quot;: &amp;quot;MediaWiki talk&amp;quot;,&lt;br /&gt;
		&amp;quot;10&amp;quot;: &amp;quot;Template&amp;quot;,&lt;br /&gt;
		&amp;quot;11&amp;quot;: &amp;quot;Template talk&amp;quot;,&lt;br /&gt;
		&amp;quot;12&amp;quot;: &amp;quot;Help&amp;quot;,&lt;br /&gt;
		&amp;quot;13&amp;quot;: &amp;quot;Help talk&amp;quot;,&lt;br /&gt;
		&amp;quot;14&amp;quot;: &amp;quot;Category&amp;quot;,&lt;br /&gt;
		&amp;quot;15&amp;quot;: &amp;quot;Category talk&amp;quot;,&lt;br /&gt;
		&amp;quot;100&amp;quot;: &amp;quot;Portal&amp;quot;,&lt;br /&gt;
		&amp;quot;101&amp;quot;: &amp;quot;Portal talk&amp;quot;,&lt;br /&gt;
		&amp;quot;108&amp;quot;: &amp;quot;Book&amp;quot;,&lt;br /&gt;
		&amp;quot;109&amp;quot;: &amp;quot;Book talk&amp;quot;,&lt;br /&gt;
		&amp;quot;710&amp;quot;: &amp;quot;TimedText&amp;quot;,&lt;br /&gt;
		&amp;quot;711&amp;quot;: &amp;quot;TimedText talk&amp;quot;,&lt;br /&gt;
		&amp;quot;828&amp;quot;: &amp;quot;Module&amp;quot;,&lt;br /&gt;
		&amp;quot;829&amp;quot;: &amp;quot;Module talk&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Section entry format:&lt;br /&gt;
 *&lt;br /&gt;
 * {&lt;br /&gt;
 *   title: &amp;lt;human-readable section title&amp;gt;,&lt;br /&gt;
 *   adminOnly: &amp;lt;true for admin-only sections&amp;gt;,&lt;br /&gt;
 *   hidden: &amp;lt;true for advanced preferences that rarely need to be changed - they can still be modified by manually editing twinkleoptions.js&amp;gt;,&lt;br /&gt;
 *   inFriendlyConfig: &amp;lt;true for preferences located under FriendlyConfig rather than TwinkleConfig&amp;gt;,&lt;br /&gt;
 *   preferences: [&lt;br /&gt;
 *     {&lt;br /&gt;
 *       name: &amp;lt;TwinkleConfig property name&amp;gt;,&lt;br /&gt;
 *       label: &amp;lt;human-readable short description - used as a form label&amp;gt;,&lt;br /&gt;
 *       helptip: &amp;lt;(optional) human-readable text (using valid HTML) that complements the description, like limits, warnings, etc.&amp;gt;&lt;br /&gt;
 *       adminOnly: &amp;lt;true for admin-only preferences&amp;gt;,&lt;br /&gt;
 *       type: &amp;lt;string|boolean|integer|enum|set|customList&amp;gt; (customList stores an array of JSON objects { value, label }),&lt;br /&gt;
 *       enumValues: &amp;lt;for type = &amp;quot;enum&amp;quot;: a JSON object where the keys are the internal names and the values are human-readable strings&amp;gt;,&lt;br /&gt;
 *       setValues: &amp;lt;for type = &amp;quot;set&amp;quot;: a JSON object where the keys are the internal names and the values are human-readable strings&amp;gt;,&lt;br /&gt;
 *       setDisplayOrder: &amp;lt;(optional) for type = &amp;quot;set&amp;quot;: an array containing the keys of setValues (as strings) in the order that they are displayed&amp;gt;,&lt;br /&gt;
 *       customListValueTitle: &amp;lt;for type = &amp;quot;customList&amp;quot;: the heading for the left &amp;quot;value&amp;quot; column in the custom list editor&amp;gt;,&lt;br /&gt;
 *       customListLabelTitle: &amp;lt;for type = &amp;quot;customList&amp;quot;: the heading for the right &amp;quot;label&amp;quot; column in the custom list editor&amp;gt;&lt;br /&gt;
 *     },&lt;br /&gt;
 *     . . .&lt;br /&gt;
 *   ]&lt;br /&gt;
 * },&lt;br /&gt;
 * . . .&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.sections = [&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;General&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.summaryAd (string)&lt;br /&gt;
		// Text to be appended to the edit summary of edits made using Twinkle&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;summaryAd&amp;quot;,&lt;br /&gt;
			label: &amp;quot;\&amp;quot;Ad\&amp;quot; to be appended to Twinkle&#039;s edit summaries&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;The summary ad should start with a space, and be kept short.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.deletionSummaryAd (string)&lt;br /&gt;
		// Text to be appended to the edit summary of deletions made using Twinkle&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deletionSummaryAd&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Summary ad to use for deletion summaries&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Normally the same as the edit summary ad above.&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.protectionSummaryAd (string)&lt;br /&gt;
		// Text to be appended to the edit summary of page protections made using Twinkle&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;protectionSummaryAd&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Summary ad to use for page protections&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Normally the same as the edit summary ad above.&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.userTalkPageMode may take arguments:&lt;br /&gt;
		// &#039;window&#039;: open a new window, remember the opened window&lt;br /&gt;
		// &#039;tab&#039;: opens in a new tab, if possible.&lt;br /&gt;
		// &#039;blank&#039;: force open in a new window, even if such a window exists&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;userTalkPageMode&amp;quot;,&lt;br /&gt;
			label: &amp;quot;When opening a user talk page, open it&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.talkPageMode&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.dialogLargeFont (boolean)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;dialogLargeFont&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Use larger text in Twinkle dialogs&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;ARV&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;spiWatchReport&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add sockpuppet report pages to watchlist&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Image deletion (DI)&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.notifyUserOnDeli (boolean)&lt;br /&gt;
		// If the user should be notified after placing a file deletion tag&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;notifyUserOnDeli&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Check the \&amp;quot;notify initial uploader\&amp;quot; box by default&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.deliWatchPage (string)&lt;br /&gt;
		// The watchlist setting of the page tagged for deletion. Either &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, or &amp;quot;default&amp;quot;. Default is &amp;quot;default&amp;quot; (Duh).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deliWatchPage&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add image page to watchlist when tagging&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.deliWatchUser (string)&lt;br /&gt;
		// The watchlist setting of the user talk page if a notification is placed. Either &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, or &amp;quot;default&amp;quot;. Default is &amp;quot;default&amp;quot; (Duh).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deliWatchUser&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add user talk page of initial uploader to watchlist when notifying&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Proposed deletion (PROD)&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.watchProdPages (boolean)&lt;br /&gt;
		// If, when applying prod template to page, to watch the page&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchProdPages&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add article to watchlist when tagging&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.prodReasonDefault (string)&lt;br /&gt;
		// The prefilled PROD reason.&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;prodReasonDefault&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Prefilled PROD reason&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;logProdPages&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Keep a log in userspace of all pages you tag for PROD&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you tag for PROD using Twinkle.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;prodLogPageName&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Keep the PROD userspace log at this user subpage&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Enter a subpage name in this box. You will find your PROD log at User:&amp;lt;i&amp;gt;username&amp;lt;/i&amp;gt;/&amp;lt;i&amp;gt;subpage name&amp;lt;/i&amp;gt;. Only works if you turn on the PROD userspace log.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Revert and rollback&amp;quot;,  // twinklefluff module&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.openTalkPage (array)&lt;br /&gt;
		// What types of actions that should result in opening of talk page&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;openTalkPage&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Open user talk page after these types of reversions&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: { agf: &amp;quot;AGF rollback&amp;quot;, norm: &amp;quot;Normal rollback&amp;quot;, vand: &amp;quot;Vandalism rollback&amp;quot;, torev: &amp;quot;\&amp;quot;Restore this version\&amp;quot;&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.openTalkPageOnAutoRevert (bool)&lt;br /&gt;
		// Defines if talk page should be opened when calling revert from contrib page, because from there, actions may be multiple, and opening talk page not suitable. If set to true, openTalkPage defines then if talk page will be opened.&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;openTalkPageOnAutoRevert&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Open user talk page when invoking rollback from user contributions&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Often, you may be rolling back many pages at a time from a vandal&#039;s contributions page, so it would be unsuitable to open the user talk page. Hence, this option is off by default. When this is on, the desired options must be enabled in the previous setting for this to work.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.markRevertedPagesAsMinor (array)&lt;br /&gt;
		// What types of actions that should result in marking edit as minor&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markRevertedPagesAsMinor&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Mark as minor edit for these types of reversions&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: { agf: &amp;quot;AGF rollback&amp;quot;, norm: &amp;quot;Normal rollback&amp;quot;, vand: &amp;quot;Vandalism rollback&amp;quot;, torev: &amp;quot;\&amp;quot;Restore this version\&amp;quot;&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.watchRevertedPages (array)&lt;br /&gt;
		// What types of actions that should result in forced addition to watchlist&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchRevertedPages&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add pages to watchlist for these types of reversions&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: { agf: &amp;quot;AGF rollback&amp;quot;, norm: &amp;quot;Normal rollback&amp;quot;, vand: &amp;quot;Vandalism rollback&amp;quot;, torev: &amp;quot;\&amp;quot;Restore this version\&amp;quot;&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.offerReasonOnNormalRevert (boolean)&lt;br /&gt;
		// If to offer a prompt for extra summary reason for normal reverts, default to true&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;offerReasonOnNormalRevert&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Prompt for reason for normal rollbacks&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;\&amp;quot;Normal\&amp;quot; rollbacks are the ones that are invoked from the middle [rollback] link.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;confirmOnFluff&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Provide a confirmation message before reverting&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;For users of pen or touch devices, and chronically indecisive people.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.showRollbackLinks (array)&lt;br /&gt;
		// Where Twinkle should show rollback links (diff, others, mine, contribs)&lt;br /&gt;
		// Note from TTO: |contribs| seems to be equal to |others| + |mine|, i.e. redundant, so I left it out heres&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;showRollbackLinks&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Show rollback links on these pages&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: { diff: &amp;quot;Diff pages&amp;quot;, others: &amp;quot;Contributions pages of other users&amp;quot;, mine: &amp;quot;My contributions page&amp;quot; }&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Shared IP tagging&amp;quot;,&lt;br /&gt;
	inFriendlyConfig: true,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markSharedIPAsMinor&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Mark shared IP tagging as a minor edit&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Speedy deletion (CSD)&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;speedySelectionStyle&amp;quot;,&lt;br /&gt;
			label: &amp;quot;When to go ahead and tag/delete the page&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: { &amp;quot;buttonClick&amp;quot;: &#039;When I click &amp;quot;Submit&amp;quot;&#039;, &amp;quot;radioClick&amp;quot;: &amp;quot;As soon as I click an option&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.watchSpeedyPages (array)&lt;br /&gt;
		// Whether to add speedy tagged pages to watchlist&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchSpeedyPages&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add page to watchlist when tagging with these criteria&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdCriteria,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaDisplayOrder&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.markSpeedyPagesAsPatrolled (boolean)&lt;br /&gt;
		// If, when applying speedy template to page, to mark the page as patrolled (if the page was reached from NewPages)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markSpeedyPagesAsPatrolled&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Mark page as patrolled when tagging (if possible)&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Due to technical limitations, pages are only marked as patrolled when they are reached via Special:NewPages.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.notifyUserOnSpeedyDeletionNomination (array)&lt;br /&gt;
		// What types of actions should result that the author of the page being notified of nomination&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;notifyUserOnSpeedyDeletionNomination&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Notify page creator only when tagging with these criteria&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Even if you choose to notify from the CSD screen, the notification will only take place for those criteria selected here.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdCriteriaNotification,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.welcomeUserOnSpeedyDeletionNotification (array of strings)&lt;br /&gt;
		// On what types of speedy deletion notifications shall the user be welcomed&lt;br /&gt;
		// with a &amp;quot;firstarticle&amp;quot; notice if his talk page has not yet been created.&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;welcomeUserOnSpeedyDeletionNotification&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Welcome page creator alongside notification when tagging with these criteria&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;The welcome is issued only if the user is notified about the deletion, and only if their talk page does not already exist. The template used is {{firstarticle}}.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdCriteriaNotification,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdCriteriaNotificationDisplayOrder&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.promptForSpeedyDeletionSummary (array of strings)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;promptForSpeedyDeletionSummary&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Allow editing of deletion summary when deleting under these criteria&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdAndDICriteria,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.openUserTalkPageOnSpeedyDelete (array of strings)&lt;br /&gt;
		// What types of actions that should result user talk page to be opened when speedily deleting (admin only)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;openUserTalkPageOnSpeedyDelete&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Open user talk page when deleting under these criteria&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdAndDICriteria,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.deleteTalkPageOnDelete (boolean)&lt;br /&gt;
		// If talk page if exists should also be deleted (CSD G8) when spedying a page (admin only)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deleteTalkPageOnDelete&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Check the \&amp;quot;also delete talk page\&amp;quot; box by default&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deleteRedirectsOnDelete&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Check the \&amp;quot;also delete redirects\&amp;quot; box by default&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.deleteSysopDefaultToTag (boolean)&lt;br /&gt;
		// Make the CSD screen default to &amp;quot;tag&amp;quot; instead of &amp;quot;delete&amp;quot; (admin only)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deleteSysopDefaultToTag&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Default to speedy tagging instead of outright deletion&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.speedyWindowWidth (integer)&lt;br /&gt;
		// Defines the width of the Twinkle SD window in pixels&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;speedyWindowWidth&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Width of speedy deletion window (pixels)&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.speedyWindowWidth (integer)&lt;br /&gt;
		// Defines the width of the Twinkle SD window in pixels&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;speedyWindowHeight&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Height of speedy deletion window (pixels)&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;If you have a big monitor, you might like to increase this.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;logSpeedyNominations&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Keep a log in userspace of all CSD nominations&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Since non-admins do not have access to their deleted contributions, the userspace log offers a good way to keep track of all pages you nominate for CSD using Twinkle. Files tagged using DI are also added to this log.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;speedyLogPageName&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Keep the CSD userspace log at this user subpage&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Enter a subpage name in this box. You will find your CSD log at User:&amp;lt;i&amp;gt;username&amp;lt;/i&amp;gt;/&amp;lt;i&amp;gt;subpage name&amp;lt;/i&amp;gt;. Only works if you turn on the CSD userspace log.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;noLogOnSpeedyNomination&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Do not create a userspace log entry when tagging with these criteria&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.csdAndDICriteria,&lt;br /&gt;
			setDisplayOrder: Twinkle.config.commonSets.csdAndDICriteriaDisplayOrder&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Tag&amp;quot;,&lt;br /&gt;
	inFriendlyConfig: true,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchTaggedPages&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add page to watchlist when tagging&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchMergeDiscussions&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add talk pages to watchlist when starting merge discussions&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markTaggedPagesAsMinor&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Mark addition of tags as a minor edit&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markTaggedPagesAsPatrolled&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Check the \&amp;quot;mark page as patrolled\&amp;quot; box by default&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;groupByDefault&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Check the \&amp;quot;group into {{multiple issues}}\&amp;quot; box by default&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;tagArticleSortOrder&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Default view order for article tags&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: { &amp;quot;cat&amp;quot;: &amp;quot;By categories&amp;quot;, &amp;quot;alpha&amp;quot;: &amp;quot;In alphabetical order&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;customTagList&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Custom article maintenance tags to display&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;These appear as additional options at the bottom of the list of tags. For example, you could add new maintenance tags which have not yet been added to Twinkle&#039;s defaults.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;customList&amp;quot;,&lt;br /&gt;
			customListValueTitle: &amp;quot;Template name (no curly brackets)&amp;quot;,&lt;br /&gt;
			customListLabelTitle: &amp;quot;Text to show in Tag dialog&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Talkback&amp;quot;,&lt;br /&gt;
	inFriendlyConfig: true,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;markTalkbackAsMinor&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Mark talkbacks as minor edits&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;insertTalkbackSignature&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Insert signature within talkbacks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;talkbackHeading&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Section heading to use for talkbacks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;adminNoticeHeading&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Section heading to use for administrators&#039; noticeboard notices&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Only relevant for AN and ANI.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;mailHeading&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Section heading to use for \&amp;quot;you&#039;ve got mail\&amp;quot; notices&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Unlink&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.unlinkNamespaces (array)&lt;br /&gt;
		// In what namespaces unlink should happen, default in 0 (article) and 100 (portal)&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;unlinkNamespaces&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Remove links from pages in these namespaces&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Avoid selecting any talk namespaces, as Twinkle might end up unlinking on talk archives (a big no-no).&amp;quot;,&lt;br /&gt;
			type: &amp;quot;set&amp;quot;,&lt;br /&gt;
			setValues: Twinkle.config.commonSets.namespacesNoSpecial&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Warn user&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.defaultWarningGroup (int)&lt;br /&gt;
		// if true, watch the page which has been dispatched an warning or notice, if false, default applies&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;defaultWarningGroup&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Default warning level&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: {&lt;br /&gt;
				&amp;quot;1&amp;quot;: &amp;quot;Level 1&amp;quot;,&lt;br /&gt;
				&amp;quot;2&amp;quot;: &amp;quot;Level 2&amp;quot;,&lt;br /&gt;
				&amp;quot;3&amp;quot;: &amp;quot;Level 3&amp;quot;,&lt;br /&gt;
				&amp;quot;4&amp;quot;: &amp;quot;Level 4&amp;quot;,&lt;br /&gt;
				&amp;quot;5&amp;quot;: &amp;quot;Level 4im&amp;quot;,&lt;br /&gt;
				&amp;quot;6&amp;quot;: &amp;quot;Single-issue notices&amp;quot;,&lt;br /&gt;
				&amp;quot;7&amp;quot;: &amp;quot;Single-issue warnings&amp;quot;,&lt;br /&gt;
				&amp;quot;9&amp;quot;: &amp;quot;Custom warnings&amp;quot;,&lt;br /&gt;
				&amp;quot;8&amp;quot;: &amp;quot;Block (admin only)&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.showSharedIPNotice may take arguments:&lt;br /&gt;
		// true: to show shared ip notice if an IP address&lt;br /&gt;
		// false: to not print the notice&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;showSharedIPNotice&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add extra notice on shared IP talk pages&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Notice used is {{SharedIPAdvice}}&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.watchWarnings (boolean)&lt;br /&gt;
		// if true, watch the page which has been dispatched an warning or notice, if false, default applies&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchWarnings&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add user talk page to watchlist when notifying&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.blankTalkpageOnIndefBlock (boolean)&lt;br /&gt;
		// if true, blank the talk page when issuing an indef block notice (per [[WP:UW#Indefinitely blocked users]])&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;blankTalkpageOnIndefBlock&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Blank the talk page when indefinitely blocking users&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;See &amp;lt;a href=\&amp;quot;&amp;quot; + mw.util.getUrl(&amp;quot;WP:UW#Indefinitely blocked users&amp;quot;) + &amp;quot;\&amp;quot;&amp;gt;WP:UW&amp;lt;/a&amp;gt; for more information.&amp;quot;,&lt;br /&gt;
			adminOnly: true,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;customWarningList&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Custom warning templates to display&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;You can add individual templates or user subpages. Custom warnings appear in the \&amp;quot;Custom warnings\&amp;quot; category within the warning dialog box.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;customList&amp;quot;,&lt;br /&gt;
			customListValueTitle: &amp;quot;Template name (no curly brackets)&amp;quot;,&lt;br /&gt;
			customListLabelTitle: &amp;quot;Text to show in warning list (also used as edit summary)&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Welcome user&amp;quot;,&lt;br /&gt;
	inFriendlyConfig: true,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;topWelcomes&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Place welcomes above existing content on user talk pages&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;watchWelcomes&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add user talk pages to watchlist when welcoming&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Doing so adds to the personal element of welcoming a user - you will be able to see how they are coping as a newbie, and possibly help them.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;insertUsername&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add your username to the template (where applicable)&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Some welcome templates have an opening sentence like \&amp;quot;Hi, I&#039;m &amp;amp;lt;username&amp;amp;gt;. Welcome\&amp;quot; etc. If you turn off this option, these templates will not display your username in that way.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;quickWelcomeMode&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Clicking the \&amp;quot;welcome\&amp;quot; link on a diff page will&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;If you choose to welcome automatically, the template you specify below will be used.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: { auto: &amp;quot;welcome automatically&amp;quot;, norm: &amp;quot;prompt you to select a template&amp;quot; }&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;quickWelcomeTemplate&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Template to use when welcoming automatically&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;Enter the name of a welcome template, without the curly brackets. A link to the given article will be added.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;customWelcomeList&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Custom welcome templates to display&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;You can add other welcome templates, or user subpages that are welcome templates (prefixed with \&amp;quot;User:\&amp;quot;). Don&#039;t forget that these templates are substituted onto user talk pages.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;customList&amp;quot;,&lt;br /&gt;
			customListValueTitle: &amp;quot;Template name (no curly brackets)&amp;quot;,&lt;br /&gt;
			customListLabelTitle: &amp;quot;Text to show in Welcome dialog&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;customWelcomeSignature&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Automatically sign custom welcome templates&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;If your custom welcome templates contain a built-in signature within the template, turn off this option.&amp;quot;,&lt;br /&gt;
			type: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;XFD (deletion discussions)&amp;quot;,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// TwinkleConfig.xfdWatchPage (string)&lt;br /&gt;
		// The watchlist setting of the page being nominated for XfD. Either &amp;quot;yes&amp;quot; (add to watchlist), &amp;quot;no&amp;quot; (don&#039;t&lt;br /&gt;
		// add to watchlist), or &amp;quot;default&amp;quot; (use setting from preferences). Default is &amp;quot;default&amp;quot; (duh).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;xfdWatchPage&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add the nominated page to watchlist&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.xfdWatchDiscussion (string)&lt;br /&gt;
		// The watchlist setting of the newly created XfD page (for those processes that create discussion pages for each nomination),&lt;br /&gt;
		// or the list page for the other processes.&lt;br /&gt;
		// Either &amp;quot;yes&amp;quot; (add to watchlist), &amp;quot;no&amp;quot; (don&#039;t add to watchlist), or &amp;quot;default&amp;quot; (use setting from preferences). Default is &amp;quot;default&amp;quot; (duh).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;xfdWatchDiscussion&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add the deletion discussion page to watchlist&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;This refers to the discussion subpage (for AfD and MfD) or the daily log page (for TfD, CfD, RfD and FfD)&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.xfdWatchList (string)&lt;br /&gt;
		// The watchlist setting of the XfD list page, *if* the discussion is on a separate page. Either &amp;quot;yes&amp;quot; (add to watchlist), &amp;quot;no&amp;quot; (don&#039;t&lt;br /&gt;
		// add to watchlist), or &amp;quot;default&amp;quot; (use setting from preferences). Default is &amp;quot;no&amp;quot; (Hehe. Seriously though, who wants to watch it?&lt;br /&gt;
		// Sorry in advance for any false positives.).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;xfdWatchList&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add the daily log/list page to the watchlist (where applicable)&amp;quot;,&lt;br /&gt;
			helptip: &amp;quot;This only applies for AfD and MfD, where the discussions are transcluded onto a daily log page (for AfD) or the main MfD page (for MfD).&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		// TwinkleConfig.xfdWatchUser (string)&lt;br /&gt;
		// The watchlist setting of the user if he receives a notification. Either &amp;quot;yes&amp;quot; (add to watchlist), &amp;quot;no&amp;quot; (don&#039;t&lt;br /&gt;
		// add to watchlist), or &amp;quot;default&amp;quot; (use setting from preferences). Default is &amp;quot;default&amp;quot; (duh).&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;xfdWatchUser&amp;quot;,&lt;br /&gt;
			label: &amp;quot;Add the user talk page to watchlist (when notifying)&amp;quot;,&lt;br /&gt;
			type: &amp;quot;enum&amp;quot;,&lt;br /&gt;
			enumValues: Twinkle.config.commonEnums.watchlist&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	title: &amp;quot;Hidden&amp;quot;,&lt;br /&gt;
	hidden: true,&lt;br /&gt;
	preferences: [&lt;br /&gt;
		// twinkle.header.js: portlet setup&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;portletArea&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;portletId&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;portletName&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;portletType&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;portletNext&amp;quot;,&lt;br /&gt;
			type: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklefluff.js: defines how many revision to query maximum, maximum possible is 50, default is 50&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;revertMaxRevisions&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchdelete.js: How many pages should be processed at a time&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchdeleteChunks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchdelete.js: How many pages left in the process of being completed should allow a new batch to be initialized&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchDeleteMinCutOff&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchdelete.js: How many pages should be processed maximum&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchMax&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchprotect.js: How many pages should be processed at a time&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchProtectChunks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchprotect.js: How many pages left in the process of being completed should allow a new batch to be initialized&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchProtectMinCutOff&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchundelete.js: How many pages should be processed at a time&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchundeleteChunks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinklebatchundelete.js: How many pages left in the process of being completed should allow a new batch to be initialized&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;batchUndeleteMinCutOff&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinkledelimages.js: How many files should be processed at a time&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deliChunks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinkledelimages.js: How many files should be processed maximum&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;deliMax&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		// twinkledeprod.js: How many pages should be processed at a time&lt;br /&gt;
		{&lt;br /&gt;
			name: &amp;quot;proddeleteChunks&amp;quot;,&lt;br /&gt;
			type: &amp;quot;integer&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
]; // end of Twinkle.config.sections&lt;br /&gt;
&lt;br /&gt;
//{&lt;br /&gt;
//			name: &amp;quot;&amp;quot;,&lt;br /&gt;
//			label: &amp;quot;&amp;quot;,&lt;br /&gt;
//			type: &amp;quot;&amp;quot;&lt;br /&gt;
//		},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.init = function twinkleconfigInit() {&lt;br /&gt;
&lt;br /&gt;
	if ((mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) === mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).project &amp;amp;&amp;amp; mw.config.get(&amp;quot;wgTitle&amp;quot;) === &amp;quot;Twinkle/Preferences&amp;quot; ||&lt;br /&gt;
			(mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) === mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).user &amp;amp;&amp;amp; mw.config.get(&amp;quot;wgTitle&amp;quot;).lastIndexOf(&amp;quot;/Twinkle preferences&amp;quot;) === (mw.config.get(&amp;quot;wgTitle&amp;quot;).length - 20))) &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&amp;quot;wgAction&amp;quot;) === &amp;quot;view&amp;quot;) {&lt;br /&gt;
		// create the config page at Wikipedia:Twinkle/Preferences, and at user subpages (for testing purposes)&lt;br /&gt;
&lt;br /&gt;
		if (!document.getElementById(&amp;quot;twinkle-config&amp;quot;)) {&lt;br /&gt;
			return;  // maybe the page is misconfigured, or something - but any attempt to modify it will be pointless&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// set style (the url() CSS function doesn&#039;t seem to work from wikicode - ?!)&lt;br /&gt;
		document.getElementById(&amp;quot;twinkle-config-titlebar&amp;quot;).style.backgroundImage = &amp;quot;url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB%2FqqA%2BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEhQTFRFr73ZobTPusjdsMHZp7nVwtDhzNbnwM3fu8jdq7vUt8nbxtDkw9DhpbfSvMrfssPZqLvVztbno7bRrr7W1d%2Fs1N7qydXk0NjpkW7Q%2BgAAADVJREFUeNoMwgESQCAAAMGLkEIi%2FP%2BnbnbpdB59app5Vdg0sXAoMZCpGoFbK6ciuy6FX4ABAEyoAef0BXOXAAAAAElFTkSuQmCC)&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var contentdiv = document.getElementById(&amp;quot;twinkle-config-content&amp;quot;);&lt;br /&gt;
		contentdiv.textContent = &amp;quot;&amp;quot;;  // clear children&lt;br /&gt;
&lt;br /&gt;
		// let user know about possible conflict with monobook.js/vector.js file&lt;br /&gt;
		// (settings in that file will still work, but they will be overwritten by twinkleoptions.js settings)&lt;br /&gt;
		var contentnotice = document.createElement(&amp;quot;p&amp;quot;);&lt;br /&gt;
		// I hate innerHTML, but this is one thing it *is* good for...&lt;br /&gt;
		contentnotice.innerHTML = &amp;quot;&amp;lt;b&amp;gt;Before modifying your preferences here,&amp;lt;/b&amp;gt; make sure you have removed any old &amp;lt;code&amp;gt;TwinkleConfig&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FriendlyConfig&amp;lt;/code&amp;gt; settings from your &amp;lt;a href=\&amp;quot;&amp;quot; + mw.util.getUrl(&amp;quot;Special:MyPage/skin.js&amp;quot;) + &amp;quot;\&amp;quot; title=\&amp;quot;Special:MyPage/skin.js\&amp;quot;&amp;gt;user JavaScript file&amp;lt;/a&amp;gt;.&amp;quot;;&lt;br /&gt;
		contentdiv.appendChild(contentnotice);&lt;br /&gt;
&lt;br /&gt;
		// look and see if the user does in fact have any old settings in their skin JS file&lt;br /&gt;
		var skinjs = new Morebits.wiki.page(&amp;quot;User:&amp;quot; + mw.config.get(&amp;quot;wgUserName&amp;quot;) + &amp;quot;/&amp;quot; + mw.config.get(&amp;quot;skin&amp;quot;) + &amp;quot;.js&amp;quot;);&lt;br /&gt;
		skinjs.setCallbackParameters(contentnotice);&lt;br /&gt;
		skinjs.load(Twinkle.config.legacyPrefsNotice);&lt;br /&gt;
&lt;br /&gt;
		// start a table of contents&lt;br /&gt;
		var toctable = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
		toctable.className = &amp;quot;toc&amp;quot;;&lt;br /&gt;
		toctable.style.marginLeft = &amp;quot;0.4em&amp;quot;;&lt;br /&gt;
		// create TOC title&lt;br /&gt;
		var toctitle = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
		toctitle.id = &amp;quot;toctitle&amp;quot;;&lt;br /&gt;
		var toch2 = document.createElement(&amp;quot;h2&amp;quot;);&lt;br /&gt;
		toch2.textContent = &amp;quot;Contents &amp;quot;;&lt;br /&gt;
		toctitle.appendChild(toch2);&lt;br /&gt;
		// add TOC show/hide link&lt;br /&gt;
		var toctoggle = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
		toctoggle.className = &amp;quot;toctoggle&amp;quot;;&lt;br /&gt;
		toctoggle.appendChild(document.createTextNode(&amp;quot;[&amp;quot;));&lt;br /&gt;
		var toctogglelink = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
		toctogglelink.className = &amp;quot;internal&amp;quot;;&lt;br /&gt;
		toctogglelink.setAttribute(&amp;quot;href&amp;quot;, &amp;quot;#tw-tocshowhide&amp;quot;);&lt;br /&gt;
		toctogglelink.textContent = &amp;quot;hide&amp;quot;;&lt;br /&gt;
		toctoggle.appendChild(toctogglelink);&lt;br /&gt;
		toctoggle.appendChild(document.createTextNode(&amp;quot;]&amp;quot;));&lt;br /&gt;
		toctitle.appendChild(toctoggle);&lt;br /&gt;
		toctable.appendChild(toctitle);&lt;br /&gt;
		// create item container: this is what we add stuff to&lt;br /&gt;
		var tocul = document.createElement(&amp;quot;ul&amp;quot;);&lt;br /&gt;
		toctogglelink.addEventListener(&amp;quot;click&amp;quot;, function twinkleconfigTocToggle() {&lt;br /&gt;
			var $tocul = $(tocul);&lt;br /&gt;
			$tocul.toggle();&lt;br /&gt;
			if ($tocul.find(&amp;quot;:visible&amp;quot;).length) {&lt;br /&gt;
				toctogglelink.textContent = &amp;quot;hide&amp;quot;;&lt;br /&gt;
			} else {&lt;br /&gt;
				toctogglelink.textContent = &amp;quot;show&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		}, false);&lt;br /&gt;
		toctable.appendChild(tocul);&lt;br /&gt;
		contentdiv.appendChild(toctable);&lt;br /&gt;
&lt;br /&gt;
		var tocnumber = 1;&lt;br /&gt;
&lt;br /&gt;
		var contentform = document.createElement(&amp;quot;form&amp;quot;);&lt;br /&gt;
		contentform.setAttribute(&amp;quot;action&amp;quot;, &amp;quot;javascript:void(0)&amp;quot;);  // was #tw-save - changed to void(0) to work around Chrome issue&lt;br /&gt;
		contentform.addEventListener(&amp;quot;submit&amp;quot;, Twinkle.config.save, true);&lt;br /&gt;
		contentdiv.appendChild(contentform);&lt;br /&gt;
&lt;br /&gt;
		var container = document.createElement(&amp;quot;table&amp;quot;);&lt;br /&gt;
		container.style.width = &amp;quot;100%&amp;quot;;&lt;br /&gt;
		contentform.appendChild(container);&lt;br /&gt;
&lt;br /&gt;
		$(Twinkle.config.sections).each(function(sectionkey, section) {&lt;br /&gt;
			if (section.hidden || (section.adminOnly &amp;amp;&amp;amp; !Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;))) {&lt;br /&gt;
				return true;  // i.e. &amp;quot;continue&amp;quot; in this context&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var configgetter;  // retrieve the live config values&lt;br /&gt;
			if (section.inFriendlyConfig) {&lt;br /&gt;
				configgetter = Twinkle.getFriendlyPref;&lt;br /&gt;
			} else {&lt;br /&gt;
				configgetter = Twinkle.getPref;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// add to TOC&lt;br /&gt;
			var tocli = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
			tocli.className = &amp;quot;toclevel-1&amp;quot;;&lt;br /&gt;
			var toca = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
			toca.setAttribute(&amp;quot;href&amp;quot;, &amp;quot;#twinkle-config-section-&amp;quot; + tocnumber.toString());&lt;br /&gt;
			toca.appendChild(document.createTextNode(section.title));&lt;br /&gt;
			tocli.appendChild(toca);&lt;br /&gt;
			tocul.appendChild(tocli);&lt;br /&gt;
&lt;br /&gt;
			var row = document.createElement(&amp;quot;tr&amp;quot;);&lt;br /&gt;
			var cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
			cell.setAttribute(&amp;quot;colspan&amp;quot;, &amp;quot;3&amp;quot;);&lt;br /&gt;
			var heading = document.createElement(&amp;quot;h4&amp;quot;);&lt;br /&gt;
			heading.style.borderBottom = &amp;quot;1px solid gray&amp;quot;;&lt;br /&gt;
			heading.style.marginTop = &amp;quot;0.2em&amp;quot;;&lt;br /&gt;
			heading.id = &amp;quot;twinkle-config-section-&amp;quot; + (tocnumber++).toString();&lt;br /&gt;
			heading.appendChild(document.createTextNode(section.title));&lt;br /&gt;
			cell.appendChild(heading);&lt;br /&gt;
			row.appendChild(cell);&lt;br /&gt;
			container.appendChild(row);&lt;br /&gt;
&lt;br /&gt;
			var rowcount = 1;  // for row banding&lt;br /&gt;
&lt;br /&gt;
			// add each of the preferences to the form&lt;br /&gt;
			$(section.preferences).each(function(prefkey, pref) {&lt;br /&gt;
				if (pref.adminOnly &amp;amp;&amp;amp; !Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;)) {&lt;br /&gt;
					return true;  // i.e. &amp;quot;continue&amp;quot; in this context&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				row = document.createElement(&amp;quot;tr&amp;quot;);&lt;br /&gt;
				row.style.marginBottom = &amp;quot;0.2em&amp;quot;;&lt;br /&gt;
				// create odd row banding&lt;br /&gt;
				if (rowcount++ % 2 === 0) {&lt;br /&gt;
					row.style.backgroundColor = &amp;quot;rgba(128, 128, 128, 0.1)&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
				var label, input;&lt;br /&gt;
				switch (pref.type) {&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;boolean&amp;quot;:  // create a checkbox&lt;br /&gt;
						cell.setAttribute(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
						label = document.createElement(&amp;quot;label&amp;quot;);&lt;br /&gt;
						input = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
						input.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;checkbox&amp;quot;);&lt;br /&gt;
						input.setAttribute(&amp;quot;id&amp;quot;, pref.name);&lt;br /&gt;
						input.setAttribute(&amp;quot;name&amp;quot;, pref.name);&lt;br /&gt;
						if (configgetter(pref.name) === true) {&lt;br /&gt;
							input.setAttribute(&amp;quot;checked&amp;quot;, &amp;quot;checked&amp;quot;);&lt;br /&gt;
						}&lt;br /&gt;
						label.appendChild(input);&lt;br /&gt;
						label.appendChild(document.createTextNode(&amp;quot; &amp;quot; + pref.label));&lt;br /&gt;
						cell.appendChild(label);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;string&amp;quot;:  // create an input box&lt;br /&gt;
					case &amp;quot;integer&amp;quot;:&lt;br /&gt;
						// add label to first column&lt;br /&gt;
						cell.style.textAlign = &amp;quot;right&amp;quot;;&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;0.5em&amp;quot;;&lt;br /&gt;
						label = document.createElement(&amp;quot;label&amp;quot;);&lt;br /&gt;
						label.setAttribute(&amp;quot;for&amp;quot;, pref.name);&lt;br /&gt;
						label.appendChild(document.createTextNode(pref.label + &amp;quot;:&amp;quot;));&lt;br /&gt;
						cell.appendChild(label);&lt;br /&gt;
						row.appendChild(cell);&lt;br /&gt;
&lt;br /&gt;
						// add input box to second column&lt;br /&gt;
						cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;1em&amp;quot;;&lt;br /&gt;
						input = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
						input.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;text&amp;quot;);&lt;br /&gt;
						input.setAttribute(&amp;quot;id&amp;quot;, pref.name);&lt;br /&gt;
						input.setAttribute(&amp;quot;name&amp;quot;, pref.name);&lt;br /&gt;
						if (pref.type === &amp;quot;integer&amp;quot;) {&lt;br /&gt;
							input.setAttribute(&amp;quot;size&amp;quot;, 6);&lt;br /&gt;
							input.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;number&amp;quot;);&lt;br /&gt;
							input.setAttribute(&amp;quot;step&amp;quot;, &amp;quot;1&amp;quot;);  // integers only&lt;br /&gt;
						}&lt;br /&gt;
						if (configgetter(pref.name)) {&lt;br /&gt;
							input.setAttribute(&amp;quot;value&amp;quot;, configgetter(pref.name));&lt;br /&gt;
						}&lt;br /&gt;
						cell.appendChild(input);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;enum&amp;quot;:  // create a combo box&lt;br /&gt;
						// add label to first column&lt;br /&gt;
						// note: duplicates the code above, under string/integer&lt;br /&gt;
						cell.style.textAlign = &amp;quot;right&amp;quot;;&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;0.5em&amp;quot;;&lt;br /&gt;
						label = document.createElement(&amp;quot;label&amp;quot;);&lt;br /&gt;
						label.setAttribute(&amp;quot;for&amp;quot;, pref.name);&lt;br /&gt;
						label.appendChild(document.createTextNode(pref.label + &amp;quot;:&amp;quot;));&lt;br /&gt;
						cell.appendChild(label);&lt;br /&gt;
						row.appendChild(cell);&lt;br /&gt;
&lt;br /&gt;
						// add input box to second column&lt;br /&gt;
						cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;1em&amp;quot;;&lt;br /&gt;
						input = document.createElement(&amp;quot;select&amp;quot;);&lt;br /&gt;
						input.setAttribute(&amp;quot;id&amp;quot;, pref.name);&lt;br /&gt;
						input.setAttribute(&amp;quot;name&amp;quot;, pref.name);&lt;br /&gt;
						$.each(pref.enumValues, function(enumvalue, enumdisplay) {&lt;br /&gt;
							var option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
							option.setAttribute(&amp;quot;value&amp;quot;, enumvalue);&lt;br /&gt;
							if (configgetter(pref.name) === enumvalue) {&lt;br /&gt;
								option.setAttribute(&amp;quot;selected&amp;quot;, &amp;quot;selected&amp;quot;);&lt;br /&gt;
							}&lt;br /&gt;
							option.appendChild(document.createTextNode(enumdisplay));&lt;br /&gt;
							input.appendChild(option);&lt;br /&gt;
						});&lt;br /&gt;
						cell.appendChild(input);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;set&amp;quot;:  // create a set of check boxes&lt;br /&gt;
						// add label first of all&lt;br /&gt;
						cell.setAttribute(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;);&lt;br /&gt;
						label = document.createElement(&amp;quot;label&amp;quot;);  // not really necessary to use a label element here, but we do it for consistency of styling&lt;br /&gt;
						label.appendChild(document.createTextNode(pref.label + &amp;quot;:&amp;quot;));&lt;br /&gt;
						cell.appendChild(label);&lt;br /&gt;
&lt;br /&gt;
						var checkdiv = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
						checkdiv.style.paddingLeft = &amp;quot;1em&amp;quot;;&lt;br /&gt;
						var worker = function(itemkey, itemvalue) {&lt;br /&gt;
							var checklabel = document.createElement(&amp;quot;label&amp;quot;);&lt;br /&gt;
							checklabel.style.marginRight = &amp;quot;0.7em&amp;quot;;&lt;br /&gt;
							checklabel.style.display = &amp;quot;inline-block&amp;quot;;&lt;br /&gt;
							var check = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
							check.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;checkbox&amp;quot;);&lt;br /&gt;
							check.setAttribute(&amp;quot;id&amp;quot;, pref.name + &amp;quot;_&amp;quot; + itemkey);&lt;br /&gt;
							check.setAttribute(&amp;quot;name&amp;quot;, pref.name + &amp;quot;_&amp;quot; + itemkey);&lt;br /&gt;
							if (configgetter(pref.name) &amp;amp;&amp;amp; configgetter(pref.name).indexOf(itemkey) !== -1) {&lt;br /&gt;
								check.setAttribute(&amp;quot;checked&amp;quot;, &amp;quot;checked&amp;quot;);&lt;br /&gt;
							}&lt;br /&gt;
							// cater for legacy integer array values for unlinkNamespaces (this can be removed a few years down the track...)&lt;br /&gt;
							if (pref.name === &amp;quot;unlinkNamespaces&amp;quot;) {&lt;br /&gt;
								if (configgetter(pref.name) &amp;amp;&amp;amp; configgetter(pref.name).indexOf(parseInt(itemkey, 10)) !== -1) {&lt;br /&gt;
									check.setAttribute(&amp;quot;checked&amp;quot;, &amp;quot;checked&amp;quot;);&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
							checklabel.appendChild(check);&lt;br /&gt;
							checklabel.appendChild(document.createTextNode(itemvalue));&lt;br /&gt;
							checkdiv.appendChild(checklabel);&lt;br /&gt;
						};&lt;br /&gt;
						if (pref.setDisplayOrder) {&lt;br /&gt;
							// add check boxes according to the given display order&lt;br /&gt;
							$.each(pref.setDisplayOrder, function(itemkey, item) {&lt;br /&gt;
								worker(item, pref.setValues[item]);&lt;br /&gt;
							});&lt;br /&gt;
						} else {&lt;br /&gt;
							// add check boxes according to the order it gets fed to us (probably strict alphabetical)&lt;br /&gt;
							$.each(pref.setValues, worker);&lt;br /&gt;
						}&lt;br /&gt;
						cell.appendChild(checkdiv);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;customList&amp;quot;:&lt;br /&gt;
						// add label to first column&lt;br /&gt;
						cell.style.textAlign = &amp;quot;right&amp;quot;;&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;0.5em&amp;quot;;&lt;br /&gt;
						label = document.createElement(&amp;quot;label&amp;quot;);&lt;br /&gt;
						label.setAttribute(&amp;quot;for&amp;quot;, pref.name);&lt;br /&gt;
						label.appendChild(document.createTextNode(pref.label + &amp;quot;:&amp;quot;));&lt;br /&gt;
						cell.appendChild(label);&lt;br /&gt;
						row.appendChild(cell);&lt;br /&gt;
&lt;br /&gt;
						// add button to second column&lt;br /&gt;
						cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
						cell.style.paddingRight = &amp;quot;1em&amp;quot;;&lt;br /&gt;
						var button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
						button.setAttribute(&amp;quot;id&amp;quot;, pref.name);&lt;br /&gt;
						button.setAttribute(&amp;quot;name&amp;quot;, pref.name);&lt;br /&gt;
						button.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;button&amp;quot;);&lt;br /&gt;
						button.addEventListener(&amp;quot;click&amp;quot;, Twinkle.config.listDialog.display, false);&lt;br /&gt;
						// use jQuery data on the button to store the current config value&lt;br /&gt;
						$(button).data({&lt;br /&gt;
							value: configgetter(pref.name),&lt;br /&gt;
							pref: pref,&lt;br /&gt;
							inFriendlyConfig: section.inFriendlyConfig&lt;br /&gt;
						});&lt;br /&gt;
						button.appendChild(document.createTextNode(&amp;quot;Edit items&amp;quot;));&lt;br /&gt;
						cell.appendChild(button);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					default:&lt;br /&gt;
						alert(&amp;quot;twinkleconfig: unknown data type for preference &amp;quot; + pref.name);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
				row.appendChild(cell);&lt;br /&gt;
&lt;br /&gt;
				// add help tip&lt;br /&gt;
				cell = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
				cell.style.fontSize = &amp;quot;90%&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
				cell.style.color = &amp;quot;gray&amp;quot;;&lt;br /&gt;
				if (pref.helptip) {&lt;br /&gt;
					// convert mentions of templates in the helptip to clickable links&lt;br /&gt;
					cell.innerHTML = pref.helptip.replace(/{{(.+?)}}/g,&lt;br /&gt;
						&#039;{{&amp;lt;a href=&amp;quot;&#039; + mw.util.getUrl(&amp;quot;Template:&amp;quot;) + &#039;$1&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;$1&amp;lt;/a&amp;gt;}}&#039;);&lt;br /&gt;
				}&lt;br /&gt;
				// add reset link (custom lists don&#039;t need this, as their config value isn&#039;t displayed on the form)&lt;br /&gt;
				if (pref.type !== &amp;quot;customList&amp;quot;) {&lt;br /&gt;
					var resetlink = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
					resetlink.setAttribute(&amp;quot;href&amp;quot;, &amp;quot;#tw-reset&amp;quot;);&lt;br /&gt;
					resetlink.setAttribute(&amp;quot;id&amp;quot;, &amp;quot;twinkle-config-reset-&amp;quot; + pref.name);&lt;br /&gt;
					resetlink.addEventListener(&amp;quot;click&amp;quot;, Twinkle.config.resetPrefLink, false);&lt;br /&gt;
					if (resetlink.style.styleFloat) {  // IE (inc. IE9)&lt;br /&gt;
						resetlink.style.styleFloat = &amp;quot;right&amp;quot;;&lt;br /&gt;
					} else {  // standards&lt;br /&gt;
						resetlink.style.cssFloat = &amp;quot;right&amp;quot;;&lt;br /&gt;
					}&lt;br /&gt;
					resetlink.style.margin = &amp;quot;0 0.6em&amp;quot;;&lt;br /&gt;
					resetlink.appendChild(document.createTextNode(&amp;quot;Reset&amp;quot;));&lt;br /&gt;
					cell.appendChild(resetlink);&lt;br /&gt;
				}&lt;br /&gt;
				row.appendChild(cell);&lt;br /&gt;
&lt;br /&gt;
				container.appendChild(row);&lt;br /&gt;
				return true;&lt;br /&gt;
			});&lt;br /&gt;
			return true;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		var footerbox = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
		footerbox.setAttribute(&amp;quot;id&amp;quot;, &amp;quot;twinkle-config-buttonpane&amp;quot;);&lt;br /&gt;
		footerbox.style.backgroundColor = &amp;quot;#BCCADF&amp;quot;;&lt;br /&gt;
		footerbox.style.padding = &amp;quot;0.5em&amp;quot;;&lt;br /&gt;
		var button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
		button.setAttribute(&amp;quot;id&amp;quot;, &amp;quot;twinkle-config-submit&amp;quot;);&lt;br /&gt;
		button.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
		button.appendChild(document.createTextNode(&amp;quot;Save changes&amp;quot;));&lt;br /&gt;
		footerbox.appendChild(button);&lt;br /&gt;
		var footerspan = document.createElement(&amp;quot;span&amp;quot;);&lt;br /&gt;
		footerspan.className = &amp;quot;plainlinks&amp;quot;;&lt;br /&gt;
		footerspan.style.marginLeft = &amp;quot;2.4em&amp;quot;;&lt;br /&gt;
		footerspan.style.fontSize = &amp;quot;90%&amp;quot;;&lt;br /&gt;
		var footera = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
		footera.setAttribute(&amp;quot;href&amp;quot;, &amp;quot;#tw-reset-all&amp;quot;);&lt;br /&gt;
		footera.setAttribute(&amp;quot;id&amp;quot;, &amp;quot;twinkle-config-resetall&amp;quot;);&lt;br /&gt;
		footera.addEventListener(&amp;quot;click&amp;quot;, Twinkle.config.resetAllPrefs, false);&lt;br /&gt;
		footera.appendChild(document.createTextNode(&amp;quot;Restore defaults&amp;quot;));&lt;br /&gt;
		footerspan.appendChild(footera);&lt;br /&gt;
		footerbox.appendChild(footerspan);&lt;br /&gt;
		contentform.appendChild(footerbox);&lt;br /&gt;
&lt;br /&gt;
		// since all the section headers exist now, we can try going to the requested anchor&lt;br /&gt;
		if (location.hash) {&lt;br /&gt;
			location.hash = location.hash;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	} else if (mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) === mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).user &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&amp;quot;wgTitle&amp;quot;).indexOf(mw.config.get(&amp;quot;wgUserName&amp;quot;)) === 0 &amp;amp;&amp;amp;&lt;br /&gt;
			mw.config.get(&amp;quot;wgPageName&amp;quot;).slice(-3) === &amp;quot;.js&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
		var box = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
		box.setAttribute(&amp;quot;id&amp;quot;, &amp;quot;twinkle-config-headerbox&amp;quot;);&lt;br /&gt;
		box.style.border = &amp;quot;1px #f60 solid&amp;quot;;&lt;br /&gt;
		box.style.background = &amp;quot;#fed&amp;quot;;&lt;br /&gt;
		box.style.padding = &amp;quot;0.6em&amp;quot;;&lt;br /&gt;
		box.style.margin = &amp;quot;0.5em auto&amp;quot;;&lt;br /&gt;
		box.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var link,&lt;br /&gt;
			scriptPageName = mw.config.get(&amp;quot;wgPageName&amp;quot;).slice(mw.config.get(&amp;quot;wgPageName&amp;quot;).lastIndexOf(&amp;quot;/&amp;quot;) + 1,&lt;br /&gt;
				mw.config.get(&amp;quot;wgPageName&amp;quot;).lastIndexOf(&amp;quot;.js&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		if (scriptPageName === &amp;quot;twinkleoptions&amp;quot;) {&lt;br /&gt;
			// place &amp;quot;why not try the preference panel&amp;quot; notice&lt;br /&gt;
			box.style.fontWeight = &amp;quot;bold&amp;quot;;&lt;br /&gt;
			box.style.width = &amp;quot;80%&amp;quot;;&lt;br /&gt;
			box.style.borderWidth = &amp;quot;2px&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			if (mw.config.get(&amp;quot;wgArticleId&amp;quot;) &amp;gt; 0) {  // page exists&lt;br /&gt;
				box.appendChild(document.createTextNode(&amp;quot;This page contains your Twinkle preferences. You can change them using the &amp;quot;));&lt;br /&gt;
			} else {  // page does not exist&lt;br /&gt;
				box.appendChild(document.createTextNode(&amp;quot;You can customize Twinkle to suit your preferences by using the &amp;quot;));&lt;br /&gt;
			}&lt;br /&gt;
			link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
			link.setAttribute(&amp;quot;href&amp;quot;, mw.util.getUrl(mw.config.get(&amp;quot;wgFormattedNamespaces&amp;quot;)[mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).project] + &amp;quot;:Twinkle/Preferences&amp;quot;) );&lt;br /&gt;
			link.appendChild(document.createTextNode(&amp;quot;Twinkle preferences panel&amp;quot;));&lt;br /&gt;
			box.appendChild(link);&lt;br /&gt;
			box.appendChild(document.createTextNode(&amp;quot;, or by editing this page.&amp;quot;));&lt;br /&gt;
			$(box).insertAfter($(&amp;quot;#contentSub&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		} else if ([&amp;quot;monobook&amp;quot;, &amp;quot;vector&amp;quot;, &amp;quot;cologneblue&amp;quot;, &amp;quot;modern&amp;quot;, &amp;quot;common&amp;quot;].indexOf(scriptPageName) !== -1) {&lt;br /&gt;
			// place &amp;quot;Looking for Twinkle options?&amp;quot; notice&lt;br /&gt;
			box.style.width = &amp;quot;60%&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			box.appendChild(document.createTextNode(&amp;quot;If you want to set Twinkle preferences, you can use the &amp;quot;));&lt;br /&gt;
			link = document.createElement(&amp;quot;a&amp;quot;);&lt;br /&gt;
			link.setAttribute(&amp;quot;href&amp;quot;, mw.util.getUrl(mw.config.get(&amp;quot;wgFormattedNamespaces&amp;quot;)[mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).project] + &amp;quot;:Twinkle/Preferences&amp;quot;) );&lt;br /&gt;
			link.appendChild(document.createTextNode(&amp;quot;Twinkle preferences panel&amp;quot;));&lt;br /&gt;
			box.appendChild(link);&lt;br /&gt;
			box.appendChild(document.createTextNode(&amp;quot;.&amp;quot;));&lt;br /&gt;
			$(box).insertAfter($(&amp;quot;#contentSub&amp;quot;));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Morebits.wiki.page callback from init code&lt;br /&gt;
Twinkle.config.legacyPrefsNotice = function twinkleconfigLegacyPrefsNotice(pageobj) {&lt;br /&gt;
	var text = pageobj.getPageText();&lt;br /&gt;
	var contentnotice = pageobj.getCallbackParameters();&lt;br /&gt;
	if (text.indexOf(&amp;quot;TwinkleConfig&amp;quot;) !== -1 || text.indexOf(&amp;quot;FriendlyConfig&amp;quot;) !== -1) {&lt;br /&gt;
		contentnotice.innerHTML = &#039;&amp;lt;table class=&amp;quot;plainlinks ombox ombox-content&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;mbox-image&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;img alt=&amp;quot;&amp;quot; src=&amp;quot;http://upload.wikimedia.org/wikipedia/en/3/38/Imbox_content.png&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;td class=&amp;quot;mbox-text&amp;quot;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Before modifying your settings here,&amp;lt;/b&amp;gt; you must remove your old Twinkle and Friendly settings from your personal skin JavaScript.&amp;lt;/big&amp;gt;&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;p&amp;gt;To do this, you can &amp;lt;a href=&amp;quot;&#039; + mw.config.get(&amp;quot;wgScript&amp;quot;) + &#039;?title=User:&#039; + encodeURIComponent(mw.config.get(&amp;quot;wgUserName&amp;quot;)) + &#039;/&#039; + mw.config.get(&amp;quot;skin&amp;quot;) + &#039;.js&amp;amp;action=edit&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;b&amp;gt;edit your personal JavaScript&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;, removing all lines of code that refer to &amp;lt;code&amp;gt;TwinkleConfig&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FriendlyConfig&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$(contentnotice).remove();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// custom list-related stuff&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.listDialog = {};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.listDialog.addRow = function twinkleconfigListDialogAddRow(dlgtable, value, label) {&lt;br /&gt;
	var contenttr = document.createElement(&amp;quot;tr&amp;quot;);&lt;br /&gt;
	// &amp;quot;remove&amp;quot; button&lt;br /&gt;
	var contenttd = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
	var removeButton = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
	removeButton.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;button&amp;quot;);&lt;br /&gt;
	removeButton.addEventListener(&amp;quot;click&amp;quot;, function() { $(contenttr).remove(); }, false);&lt;br /&gt;
	removeButton.textContent = &amp;quot;Remove&amp;quot;;&lt;br /&gt;
	contenttd.appendChild(removeButton);&lt;br /&gt;
	contenttr.appendChild(contenttd);&lt;br /&gt;
&lt;br /&gt;
	// value input box&lt;br /&gt;
	contenttd = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
	var input = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
	input.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;text&amp;quot;);&lt;br /&gt;
	input.className = &amp;quot;twinkle-config-customlist-value&amp;quot;;&lt;br /&gt;
	input.style.width = &amp;quot;97%&amp;quot;;&lt;br /&gt;
	if (value) {&lt;br /&gt;
		input.setAttribute(&amp;quot;value&amp;quot;, value);&lt;br /&gt;
	}&lt;br /&gt;
	contenttd.appendChild(input);&lt;br /&gt;
	contenttr.appendChild(contenttd);&lt;br /&gt;
&lt;br /&gt;
	// label input box&lt;br /&gt;
	contenttd = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
	input = document.createElement(&amp;quot;input&amp;quot;);&lt;br /&gt;
	input.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;text&amp;quot;);&lt;br /&gt;
	input.className = &amp;quot;twinkle-config-customlist-label&amp;quot;;&lt;br /&gt;
	input.style.width = &amp;quot;98%&amp;quot;;&lt;br /&gt;
	if (label) {&lt;br /&gt;
		input.setAttribute(&amp;quot;value&amp;quot;, label);&lt;br /&gt;
	}&lt;br /&gt;
	contenttd.appendChild(input);&lt;br /&gt;
	contenttr.appendChild(contenttd);&lt;br /&gt;
&lt;br /&gt;
	dlgtable.appendChild(contenttr);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.listDialog.display = function twinkleconfigListDialogDisplay(e) {&lt;br /&gt;
	var $prefbutton = $(e.target);&lt;br /&gt;
	var curvalue = $prefbutton.data(&amp;quot;value&amp;quot;);&lt;br /&gt;
	var curpref = $prefbutton.data(&amp;quot;pref&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	var dialog = new Morebits.simpleWindow(720, 400);&lt;br /&gt;
	dialog.setTitle(curpref.label);&lt;br /&gt;
	dialog.setScriptName(&amp;quot;Twinkle preferences&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	var dialogcontent = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	var dlgtable = document.createElement(&amp;quot;table&amp;quot;);&lt;br /&gt;
	dlgtable.className = &amp;quot;wikitable&amp;quot;;&lt;br /&gt;
	dlgtable.style.margin = &amp;quot;1.4em 1em&amp;quot;;&lt;br /&gt;
	dlgtable.style.width = &amp;quot;auto&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var dlgtbody = document.createElement(&amp;quot;tbody&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// header row&lt;br /&gt;
	var dlgtr = document.createElement(&amp;quot;tr&amp;quot;);&lt;br /&gt;
	// top-left cell&lt;br /&gt;
	var dlgth = document.createElement(&amp;quot;th&amp;quot;);&lt;br /&gt;
	dlgth.style.width = &amp;quot;5%&amp;quot;;&lt;br /&gt;
	dlgtr.appendChild(dlgth);&lt;br /&gt;
	// value column header&lt;br /&gt;
	dlgth = document.createElement(&amp;quot;th&amp;quot;);&lt;br /&gt;
	dlgth.style.width = &amp;quot;35%&amp;quot;;&lt;br /&gt;
	dlgth.textContent = (curpref.customListValueTitle ? curpref.customListValueTitle : &amp;quot;Value&amp;quot;);&lt;br /&gt;
	dlgtr.appendChild(dlgth);&lt;br /&gt;
	// label column header&lt;br /&gt;
	dlgth = document.createElement(&amp;quot;th&amp;quot;);&lt;br /&gt;
	dlgth.style.width = &amp;quot;60%&amp;quot;;&lt;br /&gt;
	dlgth.textContent = (curpref.customListLabelTitle ? curpref.customListLabelTitle : &amp;quot;Label&amp;quot;);&lt;br /&gt;
	dlgtr.appendChild(dlgth);&lt;br /&gt;
	dlgtbody.appendChild(dlgtr);&lt;br /&gt;
&lt;br /&gt;
	// content rows&lt;br /&gt;
	var gotRow = false;&lt;br /&gt;
	$.each(curvalue, function(k, v) {&lt;br /&gt;
		gotRow = true;&lt;br /&gt;
		Twinkle.config.listDialog.addRow(dlgtbody, v.value, v.label);&lt;br /&gt;
	});&lt;br /&gt;
	// if there are no values present, add a blank row to start the user off&lt;br /&gt;
	if (!gotRow) {&lt;br /&gt;
		Twinkle.config.listDialog.addRow(dlgtbody);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// final &amp;quot;add&amp;quot; button&lt;br /&gt;
	var dlgtfoot = document.createElement(&amp;quot;tfoot&amp;quot;);&lt;br /&gt;
	dlgtr = document.createElement(&amp;quot;tr&amp;quot;);&lt;br /&gt;
	var dlgtd = document.createElement(&amp;quot;td&amp;quot;);&lt;br /&gt;
	dlgtd.setAttribute(&amp;quot;colspan&amp;quot;, &amp;quot;3&amp;quot;);&lt;br /&gt;
	var addButton = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
	addButton.style.minWidth = &amp;quot;8em&amp;quot;;&lt;br /&gt;
	addButton.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;button&amp;quot;);&lt;br /&gt;
	addButton.addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
		Twinkle.config.listDialog.addRow(dlgtbody);&lt;br /&gt;
	}, false);&lt;br /&gt;
	addButton.textContent = &amp;quot;Add&amp;quot;;&lt;br /&gt;
	dlgtd.appendChild(addButton);&lt;br /&gt;
	dlgtr.appendChild(dlgtd);&lt;br /&gt;
	dlgtfoot.appendChild(dlgtr);&lt;br /&gt;
&lt;br /&gt;
	dlgtable.appendChild(dlgtbody);&lt;br /&gt;
	dlgtable.appendChild(dlgtfoot);&lt;br /&gt;
	dialogcontent.appendChild(dlgtable);&lt;br /&gt;
&lt;br /&gt;
	// buttonpane buttons: [Save changes] [Reset] [Cancel]&lt;br /&gt;
	var button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
	button.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;submit&amp;quot;);  // so Morebits.simpleWindow puts the button in the button pane&lt;br /&gt;
	button.addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
		Twinkle.config.listDialog.save($prefbutton, dlgtbody);&lt;br /&gt;
		dialog.close();&lt;br /&gt;
	}, false);&lt;br /&gt;
	button.textContent = &amp;quot;Save changes&amp;quot;;&lt;br /&gt;
	dialogcontent.appendChild(button);&lt;br /&gt;
	button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
	button.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;submit&amp;quot;);  // so Morebits.simpleWindow puts the button in the button pane&lt;br /&gt;
	button.addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
		Twinkle.config.listDialog.reset($prefbutton, dlgtbody);&lt;br /&gt;
	}, false);&lt;br /&gt;
	button.textContent = &amp;quot;Reset&amp;quot;;&lt;br /&gt;
	dialogcontent.appendChild(button);&lt;br /&gt;
	button = document.createElement(&amp;quot;button&amp;quot;);&lt;br /&gt;
	button.setAttribute(&amp;quot;type&amp;quot;, &amp;quot;submit&amp;quot;);  // so Morebits.simpleWindow puts the button in the button pane&lt;br /&gt;
	button.addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
		dialog.close();  // the event parameter on this function seems to be broken&lt;br /&gt;
	}, false);&lt;br /&gt;
	button.textContent = &amp;quot;Cancel&amp;quot;;&lt;br /&gt;
	dialogcontent.appendChild(button);&lt;br /&gt;
&lt;br /&gt;
	dialog.setContent(dialogcontent);&lt;br /&gt;
	dialog.display();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Resets the data value, re-populates based on the new (default) value, then saves the&lt;br /&gt;
// old data value again (less surprising behaviour)&lt;br /&gt;
Twinkle.config.listDialog.reset = function twinkleconfigListDialogReset(button, tbody) {&lt;br /&gt;
	// reset value on button&lt;br /&gt;
	var $button = $(button);&lt;br /&gt;
	var curpref = $button.data(&amp;quot;pref&amp;quot;);&lt;br /&gt;
	var oldvalue = $button.data(&amp;quot;value&amp;quot;);&lt;br /&gt;
	Twinkle.config.resetPref(curpref, $button.data(&amp;quot;inFriendlyConfig&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	// reset form&lt;br /&gt;
	var $tbody = $(tbody);&lt;br /&gt;
	$tbody.find(&amp;quot;tr&amp;quot;).slice(1).remove();  // all rows except the first (header) row&lt;br /&gt;
	// add the new values&lt;br /&gt;
	var curvalue = $button.data(&amp;quot;value&amp;quot;);&lt;br /&gt;
	$.each(curvalue, function(k, v) {&lt;br /&gt;
		Twinkle.config.listDialog.addRow(tbody, v.value, v.label);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	// save the old value&lt;br /&gt;
	$button.data(&amp;quot;value&amp;quot;, oldvalue);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.listDialog.save = function twinkleconfigListDialogSave(button, tbody) {&lt;br /&gt;
	var result = [];&lt;br /&gt;
	var current = {};&lt;br /&gt;
	$(tbody).find(&#039;input[type=&amp;quot;text&amp;quot;]&#039;).each(function(inputkey, input) {&lt;br /&gt;
		if ($(input).hasClass(&amp;quot;twinkle-config-customlist-value&amp;quot;)) {&lt;br /&gt;
			current = { value: input.value };&lt;br /&gt;
		} else {&lt;br /&gt;
			current.label = input.value;&lt;br /&gt;
			// exclude totally empty rows&lt;br /&gt;
			if (current.value || current.label) {&lt;br /&gt;
				result.push(current);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	$(button).data(&amp;quot;value&amp;quot;, result);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// reset/restore defaults&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.resetPrefLink = function twinkleconfigResetPrefLink(e) {&lt;br /&gt;
	var wantedpref = e.target.id.substring(21); // &amp;quot;twinkle-config-reset-&amp;quot; prefix is stripped&lt;br /&gt;
&lt;br /&gt;
	// search tactics&lt;br /&gt;
	$(Twinkle.config.sections).each(function(sectionkey, section) {&lt;br /&gt;
		if (section.hidden || (section.adminOnly &amp;amp;&amp;amp; !Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;))) {&lt;br /&gt;
			return true;  // continue: skip impossibilities&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var foundit = false;&lt;br /&gt;
&lt;br /&gt;
		$(section.preferences).each(function(prefkey, pref) {&lt;br /&gt;
			if (pref.name !== wantedpref) {&lt;br /&gt;
				return true;  // continue&lt;br /&gt;
			}&lt;br /&gt;
			Twinkle.config.resetPref(pref, section.inFriendlyConfig);&lt;br /&gt;
			foundit = true;&lt;br /&gt;
			return false;  // break&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		if (foundit) {&lt;br /&gt;
			return false;  // break&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	return false;  // stop link from scrolling page&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.resetPref = function twinkleconfigResetPref(pref, inFriendlyConfig) {&lt;br /&gt;
	switch (pref.type) {&lt;br /&gt;
&lt;br /&gt;
		case &amp;quot;boolean&amp;quot;:&lt;br /&gt;
			document.getElementById(pref.name).checked = (inFriendlyConfig ?&lt;br /&gt;
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &amp;quot;string&amp;quot;:&lt;br /&gt;
		case &amp;quot;integer&amp;quot;:&lt;br /&gt;
		case &amp;quot;enum&amp;quot;:&lt;br /&gt;
			document.getElementById(pref.name).value = (inFriendlyConfig ?&lt;br /&gt;
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &amp;quot;set&amp;quot;:&lt;br /&gt;
			$.each(pref.setValues, function(itemkey, itemvalue) {&lt;br /&gt;
				if (document.getElementById(pref.name + &amp;quot;_&amp;quot; + itemkey)) {&lt;br /&gt;
					document.getElementById(pref.name + &amp;quot;_&amp;quot; + itemkey).checked = ((inFriendlyConfig ?&lt;br /&gt;
						Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]).indexOf(itemkey) !== -1);&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &amp;quot;customList&amp;quot;:&lt;br /&gt;
			$(document.getElementById(pref.name)).data(&amp;quot;value&amp;quot;, (inFriendlyConfig ?&lt;br /&gt;
				Twinkle.defaultConfig.friendly[pref.name] : Twinkle.defaultConfig.twinkle[pref.name]));&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			alert(&amp;quot;twinkleconfig: unknown data type for preference &amp;quot; + pref.name);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.resetAllPrefs = function twinkleconfigResetAllPrefs() {&lt;br /&gt;
	// no confirmation message - the user can just refresh/close the page to abort&lt;br /&gt;
	$(Twinkle.config.sections).each(function(sectionkey, section) {&lt;br /&gt;
		if (section.hidden || (section.adminOnly &amp;amp;&amp;amp; !Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;))) {&lt;br /&gt;
			return true;  // continue: skip impossibilities&lt;br /&gt;
		}&lt;br /&gt;
		$(section.preferences).each(function(prefkey, pref) {&lt;br /&gt;
			if (!pref.adminOnly || Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;)) {&lt;br /&gt;
				Twinkle.config.resetPref(pref, section.inFriendlyConfig);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		return true;&lt;br /&gt;
	});&lt;br /&gt;
	return false;  // stop link from scrolling page&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.save = function twinkleconfigSave(e) {&lt;br /&gt;
	Morebits.status.init( document.getElementById(&amp;quot;twinkle-config-content&amp;quot;) );&lt;br /&gt;
&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &amp;quot;Save&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var userjs = mw.config.get(&amp;quot;wgFormattedNamespaces&amp;quot;)[mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).user] + &amp;quot;:&amp;quot; + mw.config.get(&amp;quot;wgUserName&amp;quot;) + &amp;quot;/twinkleoptions.js&amp;quot;;&lt;br /&gt;
	var wikipedia_page = new Morebits.wiki.page(userjs, &amp;quot;Saving preferences to &amp;quot; + userjs);&lt;br /&gt;
	wikipedia_page.setCallbackParameters(e.target);&lt;br /&gt;
	wikipedia_page.load(Twinkle.config.writePrefs);&lt;br /&gt;
&lt;br /&gt;
	return false;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// The JSON stringify method in the following code was excerpted from&lt;br /&gt;
// http://www.JSON.org/json2.js&lt;br /&gt;
// version of 2011-02-23&lt;br /&gt;
&lt;br /&gt;
// Douglas Crockford, the code&#039;s author, has released it into the Public Domain.&lt;br /&gt;
// See http://www.JSON.org/js.html&lt;br /&gt;
&lt;br /&gt;
var JSON;&lt;br /&gt;
if (!JSON) {&lt;br /&gt;
	JSON = {};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	var escapable = /[\\\&amp;quot;\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,&lt;br /&gt;
		gap,&lt;br /&gt;
		indent = &#039;  &#039;,  // hardcoded indent&lt;br /&gt;
		meta = { &#039;\b&#039;: &#039;\\b&#039;, &#039;\t&#039;: &#039;\\t&#039;, &#039;\n&#039;: &#039;\\n&#039;, &#039;\f&#039;: &#039;\\f&#039;, &#039;\r&#039;: &#039;\\r&#039;, &#039;&amp;quot;&#039; : &#039;\\&amp;quot;&#039;, &#039;\\&#039;: &#039;\\\\&#039; };&lt;br /&gt;
&lt;br /&gt;
	function quote(string) {&lt;br /&gt;
		escapable.lastIndex = 0;&lt;br /&gt;
		return escapable.test(string) ? &#039;&amp;quot;&#039; + string.replace(escapable, function (a) {&lt;br /&gt;
			var c = meta[a];&lt;br /&gt;
			return typeof c === &#039;string&#039; ? c :	&#039;\\u&#039; + (&#039;0000&#039; + a.charCodeAt(0).toString(16)).slice(-4);&lt;br /&gt;
		}) + &#039;&amp;quot;&#039; : &#039;&amp;quot;&#039; + string + &#039;&amp;quot;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function str(key, holder) {&lt;br /&gt;
		var i, k, v, length, mind = gap, partial, value = holder[key];&lt;br /&gt;
&lt;br /&gt;
		if (value &amp;amp;&amp;amp; typeof value === &#039;object&#039; &amp;amp;&amp;amp; $.isFunction(value.toJSON)) {&lt;br /&gt;
			value = value.toJSON(key);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		switch (typeof value) {&lt;br /&gt;
		case &#039;string&#039;:&lt;br /&gt;
			return quote(value);&lt;br /&gt;
		case &#039;number&#039;:&lt;br /&gt;
			return isFinite(value) ? String(value) : &#039;null&#039;;&lt;br /&gt;
		case &#039;boolean&#039;:&lt;br /&gt;
		case &#039;null&#039;:&lt;br /&gt;
			return String(value);&lt;br /&gt;
		case &#039;object&#039;:&lt;br /&gt;
			if (!value) {&lt;br /&gt;
				return &#039;null&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			gap += indent;&lt;br /&gt;
			partial = [];&lt;br /&gt;
			if ($.isArray(value)) {&lt;br /&gt;
				length = value.length;&lt;br /&gt;
				for (i = 0; i &amp;lt; length; ++i) {&lt;br /&gt;
					partial[i] = str(i, value) || &#039;null&#039;;&lt;br /&gt;
				}&lt;br /&gt;
				v = partial.length === 0 ? &#039;[]&#039; : gap ?&lt;br /&gt;
					&#039;[\n&#039; + gap + partial.join(&#039;,\n&#039; + gap) + &#039;\n&#039; + mind + &#039;]&#039; :&lt;br /&gt;
					&#039;[&#039; + partial.join(&#039;,&#039;) + &#039;]&#039;;&lt;br /&gt;
				gap = mind;&lt;br /&gt;
				return v;&lt;br /&gt;
			}&lt;br /&gt;
			for (k in value) {&lt;br /&gt;
				if (Object.prototype.hasOwnProperty.call(value, k)) {&lt;br /&gt;
					v = str(k, value);&lt;br /&gt;
					if (v) {&lt;br /&gt;
						partial.push(quote(k) + (gap ? &#039;: &#039; : &#039;:&#039;) + v);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			v = partial.length === 0 ? &#039;{}&#039; : gap ?&lt;br /&gt;
				&#039;{\n&#039; + gap + partial.join(&#039;,\n&#039; + gap) + &#039;\n&#039; + mind + &#039;}&#039; :&lt;br /&gt;
				&#039;{&#039; + partial.join(&#039;,&#039;) + &#039;}&#039;;&lt;br /&gt;
			gap = mind;&lt;br /&gt;
			return v;&lt;br /&gt;
		default:&lt;br /&gt;
			throw new Error( &amp;quot;JSON.stringify: unknown data type&amp;quot; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!$.isFunction(JSON.stringify)) {&lt;br /&gt;
		JSON.stringify = function (value, ignoredParam1, ignoredParam2) {&lt;br /&gt;
			ignoredParam1 = ignoredParam2;  // boredom&lt;br /&gt;
			gap = &#039;&#039;;&lt;br /&gt;
			return str(&#039;&#039;, {&#039;&#039;: value});&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
}());&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.writePrefs = function twinkleconfigWritePrefs(pageobj) {&lt;br /&gt;
	var form = pageobj.getCallbackParameters();&lt;br /&gt;
	var statelem = pageobj.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
	// this is the object which gets serialized into JSON&lt;br /&gt;
	var newConfig = {&lt;br /&gt;
		twinkle: {},&lt;br /&gt;
		friendly: {}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// keeping track of all preferences that we encounter&lt;br /&gt;
	// any others that are set in the user&#039;s current config are kept&lt;br /&gt;
	// this way, preferences that this script doesn&#039;t know about are not lost&lt;br /&gt;
	// (it does mean obsolete prefs will never go away, but... ah well...)&lt;br /&gt;
	var foundTwinklePrefs = [], foundFriendlyPrefs = [];&lt;br /&gt;
&lt;br /&gt;
	// a comparison function is needed later on&lt;br /&gt;
	// it is just enough for our purposes (i.e. comparing strings, numbers, booleans,&lt;br /&gt;
	// arrays of strings, and arrays of { value, label })&lt;br /&gt;
	// and it is not very robust: e.g. compare([2], [&amp;quot;2&amp;quot;]) === true, and&lt;br /&gt;
	// compare({}, {}) === false, but it&#039;s good enough for our purposes here&lt;br /&gt;
	var compare = function(a, b) {&lt;br /&gt;
		if ($.isArray(a)) {&lt;br /&gt;
			if (a.length !== b.length) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			var asort = a.sort(), bsort = b.sort();&lt;br /&gt;
			for (var i = 0; asort[i]; ++i) {&lt;br /&gt;
				// comparison of the two properties of custom lists&lt;br /&gt;
				if ((typeof asort[i] === &amp;quot;object&amp;quot;) &amp;amp;&amp;amp; (asort[i].label !== bsort[i].label ||&lt;br /&gt;
					asort[i].value !== bsort[i].value)) {&lt;br /&gt;
					return false;&lt;br /&gt;
				} else if (asort[i].toString() !== bsort[i].toString()) {&lt;br /&gt;
					return false;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return true;&lt;br /&gt;
		} else {&lt;br /&gt;
			return a === b;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	$(Twinkle.config.sections).each(function(sectionkey, section) {&lt;br /&gt;
		if (section.adminOnly &amp;amp;&amp;amp; !Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;)) {&lt;br /&gt;
			return;  // i.e. &amp;quot;continue&amp;quot; in this context&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// reach each of the preferences from the form&lt;br /&gt;
		$(section.preferences).each(function(prefkey, pref) {&lt;br /&gt;
			var userValue;  // = undefined&lt;br /&gt;
&lt;br /&gt;
			// only read form values for those prefs that have them&lt;br /&gt;
			if (!section.hidden &amp;amp;&amp;amp; (!pref.adminOnly || Morebits.userIsInGroup(&amp;quot;sysop&amp;quot;))) {&lt;br /&gt;
				switch (pref.type) {&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;boolean&amp;quot;:  // read from the checkbox&lt;br /&gt;
						userValue = form[pref.name].checked;&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;string&amp;quot;:  // read from the input box or combo box&lt;br /&gt;
					case &amp;quot;enum&amp;quot;:&lt;br /&gt;
						userValue = form[pref.name].value;&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;integer&amp;quot;:  // read from the input box&lt;br /&gt;
						userValue = parseInt(form[pref.name].value, 10);&lt;br /&gt;
						if (isNaN(userValue)) {&lt;br /&gt;
							Morebits.status.warn(&amp;quot;Saving&amp;quot;, &amp;quot;The value you specified for &amp;quot; + pref.name + &amp;quot; (&amp;quot; + pref.value + &amp;quot;) was invalid.  The save will continue, but the invalid data value will be skipped.&amp;quot;);&lt;br /&gt;
							userValue = null;&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;set&amp;quot;:  // read from the set of check boxes&lt;br /&gt;
						userValue = [];&lt;br /&gt;
						if (pref.setDisplayOrder) {&lt;br /&gt;
							// read only those keys specified in the display order&lt;br /&gt;
							$.each(pref.setDisplayOrder, function(itemkey, item) {&lt;br /&gt;
								if (form[pref.name + &amp;quot;_&amp;quot; + item].checked) {&lt;br /&gt;
									userValue.push(item);&lt;br /&gt;
								}&lt;br /&gt;
							});&lt;br /&gt;
						} else {&lt;br /&gt;
							// read all the keys in the list of values&lt;br /&gt;
							$.each(pref.setValues, function(itemkey, itemvalue) {&lt;br /&gt;
								if (form[pref.name + &amp;quot;_&amp;quot; + itemkey].checked) {&lt;br /&gt;
									userValue.push(itemkey);&lt;br /&gt;
								}&lt;br /&gt;
							});&lt;br /&gt;
						}&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					case &amp;quot;customList&amp;quot;:  // read from the jQuery data stored on the button object&lt;br /&gt;
						userValue = $(form[pref.name]).data(&amp;quot;value&amp;quot;);&lt;br /&gt;
						break;&lt;br /&gt;
&lt;br /&gt;
					default:&lt;br /&gt;
						alert(&amp;quot;twinkleconfig: unknown data type for preference &amp;quot; + pref.name);&lt;br /&gt;
						break;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// only save those preferences that are *different* from the default&lt;br /&gt;
			if (section.inFriendlyConfig) {&lt;br /&gt;
				if (userValue !== undefined &amp;amp;&amp;amp; !compare(userValue, Twinkle.defaultConfig.friendly[pref.name])) {&lt;br /&gt;
					newConfig.friendly[pref.name] = userValue;&lt;br /&gt;
				}&lt;br /&gt;
				foundFriendlyPrefs.push(pref.name);&lt;br /&gt;
			} else {&lt;br /&gt;
				if (userValue !== undefined &amp;amp;&amp;amp; !compare(userValue, Twinkle.defaultConfig.twinkle[pref.name])) {&lt;br /&gt;
					newConfig.twinkle[pref.name] = userValue;&lt;br /&gt;
				}&lt;br /&gt;
				foundTwinklePrefs.push(pref.name);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	if (Twinkle.prefs) {&lt;br /&gt;
		$.each(Twinkle.prefs.twinkle, function(tkey, tvalue) {&lt;br /&gt;
			if (foundTwinklePrefs.indexOf(tkey) === -1) {&lt;br /&gt;
				newConfig.twinkle[tkey] = tvalue;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		$.each(Twinkle.prefs.friendly, function(fkey, fvalue) {&lt;br /&gt;
			if (foundFriendlyPrefs.indexOf(fkey) === -1) {&lt;br /&gt;
				newConfig.friendly[fkey] = fvalue;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var text =&lt;br /&gt;
		&amp;quot;// twinkleoptions.js: personal Twinkle preferences file\n&amp;quot; +&lt;br /&gt;
		&amp;quot;//\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// NOTE: The easiest way to change your Twinkle preferences is by using the\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// Twinkle preferences panel, at [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]].\n&amp;quot; +&lt;br /&gt;
		&amp;quot;//\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// This file is AUTOMATICALLY GENERATED.  Any changes you make (aside from\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// changing the configuration parameters in a valid-JavaScript way) will be\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// overwritten the next time you click \&amp;quot;save\&amp;quot; in the Twinkle preferences\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// panel.  If modifying this file, make sure to use correct JavaScript.\n&amp;quot; +&lt;br /&gt;
		&amp;quot;\n&amp;quot; +&lt;br /&gt;
		&amp;quot;window.Twinkle.prefs = &amp;quot;;&lt;br /&gt;
	text += JSON.stringify(newConfig, null, 2);&lt;br /&gt;
	text +=&lt;br /&gt;
		&amp;quot;;\n&amp;quot; +&lt;br /&gt;
		&amp;quot;\n&amp;quot; +&lt;br /&gt;
		&amp;quot;// End of twinkleoptions.js\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	pageobj.setPageText(text);&lt;br /&gt;
	pageobj.setEditSummary(&amp;quot;Saving Twinkle preferences: automatic edit from [[&amp;quot; + Morebits.pageNameNorm + &amp;quot;]] ([[WP:TW|TW]])&amp;quot;);&lt;br /&gt;
	pageobj.setCreateOption(&amp;quot;recreate&amp;quot;);&lt;br /&gt;
	pageobj.save(Twinkle.config.saveSuccess);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.config.saveSuccess = function twinkleconfigSaveSuccess(pageobj) {&lt;br /&gt;
	pageobj.getStatusElement().info(&amp;quot;successful&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	var noticebox = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	noticebox.className = &amp;quot;successbox&amp;quot;;&lt;br /&gt;
	noticebox.style.fontSize = &amp;quot;100%&amp;quot;;&lt;br /&gt;
	noticebox.style.marginTop = &amp;quot;2em&amp;quot;;&lt;br /&gt;
	noticebox.innerHTML = &amp;quot;&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Your Twinkle preferences have been saved.&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;To see the changes, you will need to &amp;lt;b&amp;gt;clear your browser cache entirely&amp;lt;/b&amp;gt; (see &amp;lt;a href=\&amp;quot;&amp;quot; + mw.util.getUrl(&amp;quot;WP:BYPASS&amp;quot;) + &amp;quot;\&amp;quot; title=\&amp;quot;WP:BYPASS\&amp;quot;&amp;gt;WP:BYPASS&amp;lt;/a&amp;gt; for instructions).&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
	Morebits.status.root.appendChild(noticebox);&lt;br /&gt;
	var noticeclear = document.createElement(&amp;quot;br&amp;quot;);&lt;br /&gt;
	noticeclear.style.clear = &amp;quot;both&amp;quot;;&lt;br /&gt;
	Morebits.status.root.appendChild(noticeclear);&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=23206</id>
		<title>MediaWiki:Gadget-twinklebatchprotect.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=23206"/>
		<updated>2013-11-19T10:15:06Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklebatchprotect.js: Batch protect module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;P-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing project pages and user pages; existing and&lt;br /&gt;
 *                         non-existing categories; Special:PrefixIndex&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect = function twinklebatchprotect() {&lt;br /&gt;
	if( Morebits.userIsInGroup( &#039;sysop&#039; ) &amp;amp;&amp;amp; ((mw.config.get( &#039;wgArticleId&#039; ) &amp;gt; 0 &amp;amp;&amp;amp; (mw.config.get( &#039;wgNamespaceNumber&#039; ) === 2 ||&lt;br /&gt;
		mw.config.get( &#039;wgNamespaceNumber&#039; ) === 4)) || mw.config.get( &#039;wgNamespaceNumber&#039; ) === 14 ||&lt;br /&gt;
		mw.config.get( &#039;wgCanonicalSpecialPageName&#039; ) === &#039;Prefixindex&#039;) ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.batchprotect.callback, &amp;quot;P-batch&amp;quot;, &amp;quot;tw-pbatch&amp;quot;, &amp;quot;Protect pages linked from this page&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.unlinkCache = {};&lt;br /&gt;
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Batch protection&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	//Window.addFooterLink( &amp;quot;Protection templates&amp;quot;, &amp;quot;Template:Protection templates&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Protection policy&amp;quot;, &amp;quot;WP:PROT&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#protect&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.batchprotect.callback.evaluate );&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;checkbox&#039;,&lt;br /&gt;
			name: &#039;editmodify&#039;,&lt;br /&gt;
			event: Twinkle.protect.formevents.editmodify,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Modify edit protection&#039;,&lt;br /&gt;
					value: &#039;editmodify&#039;,&lt;br /&gt;
					tooltip: &#039;Only for existing pages.&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var editlevel = form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;editlevel&#039;,&lt;br /&gt;
			label: &#039;Edit protection:&#039;,&lt;br /&gt;
			event: Twinkle.protect.formevents.editlevel&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;All&#039;,&lt;br /&gt;
			value: &#039;all&#039;&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
			value: &#039;autoconfirmed&#039;&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Template editor&#039;,&lt;br /&gt;
			value: &#039;templateeditor&#039;&lt;br /&gt;
		});&lt;br /&gt;
	editlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Sysop&#039;,&lt;br /&gt;
			value: &#039;sysop&#039;,&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;editexpiry&#039;,&lt;br /&gt;
			label: &#039;Expires:&#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
				{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
				{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
				{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
				{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
				{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
				{ label: &#039;2 days&#039;, selected: true, value: &#039;2 days&#039; },&lt;br /&gt;
				{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
				{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
				{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
				{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
				{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
				{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
				{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
				{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
				{ label: &#039;indefinite&#039;, value:&#039;indefinite&#039; },&lt;br /&gt;
				{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;checkbox&#039;,&lt;br /&gt;
			name: &#039;movemodify&#039;,&lt;br /&gt;
			event: Twinkle.protect.formevents.movemodify,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Modify move protection&#039;,&lt;br /&gt;
					value: &#039;movemodify&#039;,&lt;br /&gt;
					tooltip: &#039;Only for existing pages.&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var movelevel = form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;movelevel&#039;,&lt;br /&gt;
			label: &#039;Move protection:&#039;,&lt;br /&gt;
			event: Twinkle.protect.formevents.movelevel&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;All&#039;,&lt;br /&gt;
			value: &#039;all&#039;&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
			value: &#039;autoconfirmed&#039;&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Template editor&#039;,&lt;br /&gt;
			value: &#039;templateeditor&#039;&lt;br /&gt;
		});&lt;br /&gt;
	movelevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Sysop&#039;,&lt;br /&gt;
			value: &#039;sysop&#039;,&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;moveexpiry&#039;,&lt;br /&gt;
			label: &#039;Expires:&#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
				{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
				{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
				{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
				{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
				{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
				{ label: &#039;2 days&#039;, selected: true, value: &#039;2 days&#039; },&lt;br /&gt;
				{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
				{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
				{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
				{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
				{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
				{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
				{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
				{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
				{ label: &#039;indefinite&#039;, value:&#039;indefinite&#039; },&lt;br /&gt;
				{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;checkbox&#039;,&lt;br /&gt;
			name: &#039;createmodify&#039;,&lt;br /&gt;
			event: function twinklebatchprotectFormCreatemodifyEvent(e) {&lt;br /&gt;
				e.target.form.createlevel.disabled = !e.target.checked;&lt;br /&gt;
				e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === &#039;all&#039;);&lt;br /&gt;
				e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? &amp;quot;&amp;quot; : &amp;quot;transparent&amp;quot;);&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Modify create protection&#039;,&lt;br /&gt;
					value: &#039;createmodify&#039;,&lt;br /&gt;
					tooltip: &#039;Only for pages that do not exist.&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
	var createlevel = form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;createlevel&#039;,&lt;br /&gt;
			label: &#039;Create protection:&#039;,&lt;br /&gt;
			event: Twinkle.protect.formevents.createlevel&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;All&#039;,&lt;br /&gt;
			value: &#039;all&#039;&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Autoconfirmed&#039;,&lt;br /&gt;
			value: &#039;autoconfirmed&#039;&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Template editor&#039;,&lt;br /&gt;
			value: &#039;templateeditor&#039;&lt;br /&gt;
		});&lt;br /&gt;
	createlevel.append({&lt;br /&gt;
			type: &#039;option&#039;,&lt;br /&gt;
			label: &#039;Sysop&#039;,&lt;br /&gt;
			value: &#039;sysop&#039;,&lt;br /&gt;
			selected: true&lt;br /&gt;
		});&lt;br /&gt;
	form.append({&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;createexpiry&#039;,&lt;br /&gt;
			label: &#039;Expires:&#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				if (e.target.value === &#039;custom&#039;) {&lt;br /&gt;
					Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			list: [&lt;br /&gt;
				{ label: &#039;1 hour&#039;, value: &#039;1 hour&#039; },&lt;br /&gt;
				{ label: &#039;2 hours&#039;, value: &#039;2 hours&#039; },&lt;br /&gt;
				{ label: &#039;3 hours&#039;, value: &#039;3 hours&#039; },&lt;br /&gt;
				{ label: &#039;6 hours&#039;, value: &#039;6 hours&#039; },&lt;br /&gt;
				{ label: &#039;12 hours&#039;, value: &#039;12 hours&#039; },&lt;br /&gt;
				{ label: &#039;1 day&#039;, value: &#039;1 day&#039; },&lt;br /&gt;
				{ label: &#039;2 days&#039;, value: &#039;2 days&#039; },&lt;br /&gt;
				{ label: &#039;3 days&#039;, value: &#039;3 days&#039; },&lt;br /&gt;
				{ label: &#039;4 days&#039;, value: &#039;4 days&#039; },&lt;br /&gt;
				{ label: &#039;1 week&#039;, value: &#039;1 week&#039; },&lt;br /&gt;
				{ label: &#039;2 weeks&#039;, value: &#039;2 weeks&#039; },&lt;br /&gt;
				{ label: &#039;1 month&#039;, value: &#039;1 month&#039; },&lt;br /&gt;
				{ label: &#039;2 months&#039;, value: &#039;2 months&#039; },&lt;br /&gt;
				{ label: &#039;3 months&#039;, value: &#039;3 months&#039; },&lt;br /&gt;
				{ label: &#039;1 year&#039;, value: &#039;1 year&#039; },&lt;br /&gt;
				{ label: &#039;indefinite&#039;, selected: true, value: &#039;indefinite&#039; },&lt;br /&gt;
				{ label: &#039;Custom...&#039;, value: &#039;custom&#039; }&lt;br /&gt;
			]&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;textarea&#039;,&lt;br /&gt;
			name: &#039;reason&#039;,&lt;br /&gt;
			label: &#039;Reason (for protection log): &#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var query;&lt;br /&gt;
&lt;br /&gt;
	if( mw.config.get( &#039;wgNamespaceNumber&#039; ) === 14 ) {  // categories&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;generator&#039;: &#039;categorymembers&#039;,&lt;br /&gt;
			&#039;gcmtitle&#039;: mw.config.get( &#039;wgPageName&#039; ),&lt;br /&gt;
			&#039;gcmlimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;prop&#039;: &#039;revisions&#039;,&lt;br /&gt;
			&#039;rvprop&#039;: &#039;size&#039;&lt;br /&gt;
		};&lt;br /&gt;
	} else if( mw.config.get( &#039;wgCanonicalSpecialPageName&#039; ) === &#039;Prefixindex&#039; ) {&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;generator&#039;: &#039;allpages&#039;,&lt;br /&gt;
			&#039;gapnamespace&#039;: Morebits.queryString.exists(&#039;namespace&#039;) ? Morebits.queryString.get( &#039;namespace&#039; ) : document.getElementById(&#039;namespace&#039;).value,&lt;br /&gt;
			&#039;gapprefix&#039;: Morebits.queryString.exists(&#039;from&#039;) ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( &#039;from&#039; ).replace(&#039;+&#039;, &#039; &#039;)) :&lt;br /&gt;
				Morebits.string.toUpperCaseFirstChar(document.getElementById(&#039;nsfrom&#039;).value),&lt;br /&gt;
			&#039;gaplimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;prop&#039;: &#039;revisions&#039;,&lt;br /&gt;
			&#039;rvprop&#039;: &#039;size&#039;&lt;br /&gt;
		};&lt;br /&gt;
	} else {&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;gpllimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;generator&#039;: &#039;links&#039;,&lt;br /&gt;
			&#039;titles&#039;: mw.config.get( &#039;wgPageName&#039; ),&lt;br /&gt;
			&#039;prop&#039;: &#039;revisions&#039;,&lt;br /&gt;
			&#039;rvprop&#039;: &#039;size&#039;&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	statusdiv.style.padding = &#039;15px&#039;;  // just so it doesn&#039;t look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	var statelem = new Morebits.status(&amp;quot;Grabbing list of pages&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &#039;loading...&#039;, query, function(apiobj) {&lt;br /&gt;
			var xml = apiobj.responseXML;&lt;br /&gt;
			var $pages = $(xml).find(&#039;page&#039;);&lt;br /&gt;
			var list = [];&lt;br /&gt;
			$pages.each(function(index, page) {&lt;br /&gt;
				var $page = $(page);&lt;br /&gt;
				var title = $page.attr(&#039;title&#039;);&lt;br /&gt;
				var isRedir = $page.attr(&#039;redirect&#039;) === &amp;quot;&amp;quot;; // XXX ??&lt;br /&gt;
				var missing = $page.attr(&#039;missing&#039;) === &amp;quot;&amp;quot;; // XXX ??&lt;br /&gt;
				var size = $page.find(&#039;rev&#039;).attr(&#039;size&#039;);&lt;br /&gt;
&lt;br /&gt;
				var metadata = [];&lt;br /&gt;
				if (missing) {&lt;br /&gt;
					metadata.push(&amp;quot;page does not exist&amp;quot;);&lt;br /&gt;
				} else {&lt;br /&gt;
					if (isRedir) {&lt;br /&gt;
						metadata.push(&amp;quot;redirect&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
					metadata.push(size + &amp;quot; bytes&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
				list.push( { label: title + (metadata.length ? (&#039; (&#039; + metadata.join(&#039;; &#039;) + &#039;)&#039;) : &#039;&#039; ), value: title, checked: true });&lt;br /&gt;
			});&lt;br /&gt;
			form.append({ type: &#039;header&#039;, label: &#039;Pages to protect&#039; });&lt;br /&gt;
			form.append( {&lt;br /&gt;
					type: &#039;checkbox&#039;,&lt;br /&gt;
					name: &#039;pages&#039;,&lt;br /&gt;
					list: list&lt;br /&gt;
				} );&lt;br /&gt;
			form.append( { type:&#039;submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
			var result = form.render();&lt;br /&gt;
			Window.setContent( result );&lt;br /&gt;
		}, statelem );&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.currentProtectCounter = 0;&lt;br /&gt;
Twinkle.batchprotect.currentprotector = 0;&lt;br /&gt;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {&lt;br /&gt;
	var pages = event.target.getChecked( &#039;pages&#039; );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var editmodify = event.target.editmodify.checked;&lt;br /&gt;
	var editlevel = event.target.editlevel.value;&lt;br /&gt;
	var editexpiry = event.target.editexpiry.value;&lt;br /&gt;
	var movemodify = event.target.movemodify.checked;&lt;br /&gt;
	var movelevel = event.target.movelevel.value;&lt;br /&gt;
	var moveexpiry = event.target.moveexpiry.value;&lt;br /&gt;
	var createmodify = event.target.createmodify.checked;&lt;br /&gt;
	var createlevel = event.target.createlevel.value;&lt;br /&gt;
	var createexpiry = event.target.createexpiry.value;&lt;br /&gt;
&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		alert(&amp;quot;You&#039;ve got to give a reason, you rouge admin!&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
&lt;br /&gt;
	if( !pages ) {&lt;br /&gt;
		Morebits.status.error( &#039;Error&#039;, &#039;Nothing to protect, aborting&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var toCall = function twinklebatchprotectToCall( work ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp; Twinkle.batchprotect.currentProtectCounter &amp;lt;= 0 ) {&lt;br /&gt;
			Morebits.status.info( &#039;work done&#039; );&lt;br /&gt;
			window.clearInterval( Twinkle.batchprotect.currentprotector );&lt;br /&gt;
			Twinkle.batchprotect.currentprotector = Twinkle.batchprotect.currentProtectCounter = 0;&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; Twinkle.batchprotect.currentProtectCounter &amp;lt;= Twinkle.getPref(&#039;batchProtectMinCutOff&#039;) ) {&lt;br /&gt;
			var pages = work.shift();&lt;br /&gt;
			Twinkle.batchprotect.currentProtectCounter += pages.length;&lt;br /&gt;
			for( var i = 0; i &amp;lt; pages.length; ++i ) {&lt;br /&gt;
				var page = pages[i];&lt;br /&gt;
				var query = {&lt;br /&gt;
					&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
					&#039;titles&#039;: page&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( &#039;Checking if page &#039; + page + &#039; exists&#039;, query, Twinkle.batchprotect.callbacks.main );&lt;br /&gt;
				wikipedia_api.params = {&lt;br /&gt;
					page: page,&lt;br /&gt;
					reason: reason,&lt;br /&gt;
					editmodify: editmodify,&lt;br /&gt;
					editlevel: editlevel,&lt;br /&gt;
					editexpiry: editexpiry,&lt;br /&gt;
					movemodify: movemodify,&lt;br /&gt;
					movelevel: movelevel,&lt;br /&gt;
					moveexpiry: moveexpiry,&lt;br /&gt;
					createmodify: createmodify,&lt;br /&gt;
					createlevel: createlevel,&lt;br /&gt;
					createexpiry: createexpiry&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	var work = Morebits.array.chunk( pages, Twinkle.getPref(&#039;batchProtectChunks&#039;) );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.batchprotect.currentprotector = window.setInterval( toCall, 1000, work );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.callbacks = {&lt;br /&gt;
	main: function( apiobj ) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var normal = $(xml).find(&#039;normalized n&#039;).attr(&#039;to&#039;);&lt;br /&gt;
		if( normal ) {&lt;br /&gt;
			apiobj.params.page = normal;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var exists = ($(xml).find(&#039;page&#039;).attr(&#039;missing&#039;) !== &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page(apiobj.params.page, &amp;quot;Protecting &amp;quot; + apiobj.params.page);&lt;br /&gt;
		var takenAction = false;&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.editmodify) {&lt;br /&gt;
			page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.movemodify) {&lt;br /&gt;
			page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!exists &amp;amp;&amp;amp; apiobj.params.createmodify) {&lt;br /&gt;
			page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!takenAction) {&lt;br /&gt;
			Morebits.status.warn(&amp;quot;Protecting &amp;quot; + apiobj.params.page, &amp;quot;page &amp;quot; + (exists ? &amp;quot;exists&amp;quot; : &amp;quot;does not exist&amp;quot;) + &amp;quot;; nothing to do, skipping&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		page.setEditSummary(apiobj.params.reason);&lt;br /&gt;
&lt;br /&gt;
		page.protect(function(pageobj) {&lt;br /&gt;
			--Twinkle.batchprotect.currentProtectCounter;&lt;br /&gt;
			var link = document.createElement( &#039;a&#039; );&lt;br /&gt;
			link.setAttribute( &#039;href&#039;, mw.util.getUrl( apiobj.params.page ) );&lt;br /&gt;
			link.appendChild( document.createTextNode( apiobj.params.page ) );&lt;br /&gt;
			pageobj.getStatusElement().info( [ &#039;completed (&#039; , link , &#039;)&#039; ] );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=23523</id>
		<title>MediaWiki:Gadget-twinklebatchdelete.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=23523"/>
		<updated>2013-11-19T10:15:04Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklebatchdelete.js: Batch delete module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;D-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing and non-existing non-articles, and Special:PrefixIndex&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete = function twinklebatchdelete() {&lt;br /&gt;
	if( Morebits.userIsInGroup( &#039;sysop&#039; ) &amp;amp;&amp;amp; (mw.config.get( &#039;wgNamespaceNumber&#039; ) &amp;gt; 0 || mw.config.get( &#039;wgCanonicalSpecialPageName&#039; ) === &#039;Prefixindex&#039;) ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.batchdelete.callback, &amp;quot;D-batch&amp;quot;, &amp;quot;tw-batch&amp;quot;, &amp;quot;Delete pages found in this category/on this page&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.unlinkCache = {};&lt;br /&gt;
Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Batch deletion&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#batchdelete&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.batchdelete.callback.evaluate );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;checkbox&#039;,&lt;br /&gt;
			list: [&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Delete pages&#039;,&lt;br /&gt;
					name: &#039;delete_page&#039;,&lt;br /&gt;
					value: &#039;delete&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Remove backlinks to the page&#039;,&lt;br /&gt;
					name: &#039;unlink_page&#039;,&lt;br /&gt;
					value: &#039;unlink&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					label: &#039;Delete redirects to deleted pages&#039;,&lt;br /&gt;
					name: &#039;delete_redirects&#039;,&lt;br /&gt;
					value: &#039;delete_redirects&#039;,&lt;br /&gt;
					checked: true&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		} );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;textarea&#039;,&lt;br /&gt;
			name: &#039;reason&#039;,&lt;br /&gt;
			label: &#039;Reason: &#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var query;&lt;br /&gt;
	if( mw.config.get( &#039;wgNamespaceNumber&#039; ) === 14 ) {  // Category:&lt;br /&gt;
&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;generator&#039;: &#039;categorymembers&#039;,&lt;br /&gt;
			&#039;gcmtitle&#039;: mw.config.get( &#039;wgPageName&#039; ),&lt;br /&gt;
			&#039;gcmlimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;prop&#039;: [ &#039;categories&#039;, &#039;revisions&#039; ],&lt;br /&gt;
			&#039;rvprop&#039;: [ &#039;size&#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	} else if( mw.config.get( &#039;wgCanonicalSpecialPageName&#039; ) === &#039;Prefixindex&#039; ) {&lt;br /&gt;
&lt;br /&gt;
		var gapnamespace, gapprefix;&lt;br /&gt;
		if(Morebits.queryString.exists( &#039;from&#039; ) )&lt;br /&gt;
		{&lt;br /&gt;
			gapnamespace = Morebits.queryString.get( &#039;namespace&#039; );&lt;br /&gt;
			gapprefix = Morebits.string.toUpperCaseFirstChar( Morebits.queryString.get( &#039;from&#039; ) );&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			var pathSplit = decodeURIComponent(location.pathname).split(&#039;/&#039;);&lt;br /&gt;
			if (pathSplit.length &amp;lt; 3 || pathSplit[2] !== &amp;quot;Special:PrefixIndex&amp;quot;) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var titleSplit = pathSplit[3].split(&#039;:&#039;);&lt;br /&gt;
			gapnamespace = mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;)[titleSplit[0].toLowerCase()];&lt;br /&gt;
			if ( titleSplit.length &amp;lt; 2 || typeof gapnamespace === &#039;undefined&#039; )&lt;br /&gt;
			{&lt;br /&gt;
				gapnamespace = 0;  // article namespace&lt;br /&gt;
				gapprefix = pathSplit.splice(3).join(&#039;/&#039;);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				pathSplit = pathSplit.splice(4);&lt;br /&gt;
				pathSplit.splice(0,0,titleSplit.splice(1).join(&#039;:&#039;));&lt;br /&gt;
				gapprefix = pathSplit.join(&#039;/&#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;generator&#039;: &#039;allpages&#039;,&lt;br /&gt;
			&#039;gapnamespace&#039;: gapnamespace ,&lt;br /&gt;
			&#039;gapprefix&#039;: gapprefix,&lt;br /&gt;
			&#039;gaplimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;prop&#039; : [&#039;categories&#039;, &#039;revisions&#039; ],&lt;br /&gt;
			&#039;rvprop&#039;: [ &#039;size&#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	} else {&lt;br /&gt;
		query = {&lt;br /&gt;
			&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
			&#039;generator&#039;: &#039;links&#039;,&lt;br /&gt;
			&#039;titles&#039;: mw.config.get( &#039;wgPageName&#039; ),&lt;br /&gt;
			&#039;gpllimit&#039; : Twinkle.getPref(&#039;batchMax&#039;), // the max for sysops&lt;br /&gt;
			&#039;prop&#039;: [ &#039;categories&#039;, &#039;revisions&#039; ],&lt;br /&gt;
			&#039;rvprop&#039;: [ &#039;size&#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement( &#039;div&#039; );&lt;br /&gt;
	statusdiv.style.padding = &#039;15px&#039;;  // just so it doesn&#039;t look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	var statelem = new Morebits.status(&amp;quot;Grabbing list of pages&amp;quot;);&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &#039;loading...&#039;, query, function( self ) {&lt;br /&gt;
			var xmlDoc = self.responseXML;&lt;br /&gt;
			var snapshot = xmlDoc.evaluate(&#039;//page[@ns != &amp;quot;6&amp;quot; and not(@missing)]&#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );  // 6 = File: namespace&lt;br /&gt;
			var list = [];&lt;br /&gt;
			for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
				var object = snapshot.snapshotItem(i);&lt;br /&gt;
				var page = xmlDoc.evaluate( &#039;@title&#039;, object, null, XPathResult.STRING_TYPE, null ).stringValue;&lt;br /&gt;
				var size = xmlDoc.evaluate( &#039;revisions/rev/@size&#039;, object, null, XPathResult.NUMBER_TYPE, null ).numberValue;&lt;br /&gt;
&lt;br /&gt;
				var disputed = xmlDoc.evaluate( &#039;boolean(categories/cl[@title=&amp;quot;Category:Contested candidates for speedy deletion&amp;quot;])&#039;, object, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;&lt;br /&gt;
				list.push( {label:page + &#039; (&#039; + size + &#039; bytes)&#039; + ( disputed ? &#039; (DISPUTED CSD)&#039; : &#039;&#039; ), value:page, checked:!disputed });&lt;br /&gt;
			}&lt;br /&gt;
			self.params.form.append( {&lt;br /&gt;
					type: &#039;checkbox&#039;,&lt;br /&gt;
					name: &#039;pages&#039;,&lt;br /&gt;
					list: list&lt;br /&gt;
				} );&lt;br /&gt;
			self.params.form.append( { type:&#039;submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
			var result = self.params.form.render();&lt;br /&gt;
			self.params.Window.setContent( result );&lt;br /&gt;
		}, statelem );&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.params = { form:form, Window:Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.currentDeleteCounter = 0;&lt;br /&gt;
Twinkle.batchdelete.currentUnlinkCounter = 0;&lt;br /&gt;
Twinkle.batchdelete.currentdeletor = 0;&lt;br /&gt;
Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &#039;Status&#039;;&lt;br /&gt;
	Morebits.wiki.actionCompleted.postfix = &#039;batch deletion is now complete&#039;;&lt;br /&gt;
&lt;br /&gt;
	var pages = event.target.getChecked( &#039;pages&#039; );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var delete_page = event.target.delete_page.checked;&lt;br /&gt;
	var unlink_page = event.target.unlink_page.checked;&lt;br /&gt;
	var delete_redirects = event.target.delete_redirects.checked;&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
	if( !pages ) {&lt;br /&gt;
		Morebits.status.error( &#039;Error&#039;, &#039;nothing to delete, aborting&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toCall( work ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp;  Twinkle.batchdelete.currentDeleteCounter &amp;lt;= 0 &amp;amp;&amp;amp; Twinkle.batchdelete.currentUnlinkCounter &amp;lt;= 0 ) {&lt;br /&gt;
			window.clearInterval( Twinkle.batchdelete.currentdeletor );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; ( Twinkle.batchdelete.currentDeleteCounter &amp;lt;= Twinkle.getPref(&#039;batchDeleteMinCutOff&#039;) || Twinkle.batchdelete.currentUnlinkCounter &amp;lt;= Twinkle.getPref(&#039;batchDeleteMinCutOff&#039;)  ) ) {&lt;br /&gt;
			Twinkle.batchdelete.unlinkCache = []; // Clear the cache&lt;br /&gt;
			var pages = work.shift();&lt;br /&gt;
			Twinkle.batchdelete.currentDeleteCounter += pages.length;&lt;br /&gt;
			Twinkle.batchdelete.currentUnlinkCounter += pages.length;&lt;br /&gt;
			for( var i = 0; i &amp;lt; pages.length; ++i ) {&lt;br /&gt;
				var page = pages[i];&lt;br /&gt;
				var query = {&lt;br /&gt;
					&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
					&#039;titles&#039;: page&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( &#039;Checking if page &#039; + page + &#039; exists&#039;, query, Twinkle.batchdelete.callbacks.main );&lt;br /&gt;
				wikipedia_api.params = { page:page, reason:reason, unlink_page:unlink_page, delete_page:delete_page, delete_redirects:delete_redirects };&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var work = Morebits.array.chunk( pages, Twinkle.getPref(&#039;batchdeleteChunks&#039;) );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.batchdelete.currentdeletor = window.setInterval( toCall, 1000, work );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callbacks = {&lt;br /&gt;
	main: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var normal = xmlDoc.evaluate( &#039;//normalized/n/@to&#039;, xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;&lt;br /&gt;
		if( normal ) {&lt;br /&gt;
			self.params.page = normal;&lt;br /&gt;
		}&lt;br /&gt;
		var exists = xmlDoc.evaluate( &#039;boolean(//pages/page[not(@missing)])&#039;, xmlDoc, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;&lt;br /&gt;
&lt;br /&gt;
		if( ! exists ) {&lt;br /&gt;
			self.statelem.error( &amp;quot;It seems that the page doesn&#039;t exist, perhaps it has already been deleted&amp;quot; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query, wikipedia_api;&lt;br /&gt;
		if( self.params.unlink_page ) {&lt;br /&gt;
			query = {&lt;br /&gt;
				&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
				&#039;list&#039;: &#039;backlinks&#039;,&lt;br /&gt;
				&#039;blfilterredir&#039;: &#039;nonredirects&#039;,&lt;br /&gt;
				&#039;blnamespace&#039;: [0, 100], // main space and portal space only&lt;br /&gt;
				&#039;bltitle&#039;: self.params.page,&lt;br /&gt;
				&#039;bllimit&#039;: Morebits.userIsInGroup( &#039;sysop&#039; ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api( &#039;Grabbing backlinks&#039;, query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain );&lt;br /&gt;
			wikipedia_api.params = self.params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		} else {&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
		}&lt;br /&gt;
		if( self.params.delete_page ) {&lt;br /&gt;
			if (self.params.delete_redirects)&lt;br /&gt;
			{&lt;br /&gt;
				query = {&lt;br /&gt;
					&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
					&#039;list&#039;: &#039;backlinks&#039;,&lt;br /&gt;
					&#039;blfilterredir&#039;: &#039;redirects&#039;,&lt;br /&gt;
					&#039;bltitle&#039;: self.params.page,&lt;br /&gt;
					&#039;bllimit&#039;: Morebits.userIsInGroup( &#039;sysop&#039; ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api = new Morebits.wiki.api( &#039;Grabbing redirects&#039;, query, Twinkle.batchdelete.callbacks.deleteRedirectsMain );&lt;br /&gt;
				wikipedia_api.params = self.params;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( self.params.page, &#039;Deleting page &#039; + self.params.page );&lt;br /&gt;
			wikipedia_page.setEditSummary(self.params.reason + Twinkle.getPref(&#039;deletionSummaryAd&#039;));&lt;br /&gt;
			wikipedia_page.deletePage(function( apiobj ) {&lt;br /&gt;
					--Twinkle.batchdelete.currentDeleteCounter;&lt;br /&gt;
					var link = document.createElement( &#039;a&#039; );&lt;br /&gt;
					link.setAttribute( &#039;href&#039;, mw.util.getUrl(self.params.page) );&lt;br /&gt;
					link.setAttribute( &#039;title&#039;, self.params.page );&lt;br /&gt;
					link.appendChild( document.createTextNode( self.params.page ) );&lt;br /&gt;
					apiobj.statelem.info( [ &#039;completed (&#039; , link , &#039;)&#039; ] );&lt;br /&gt;
				} );&lt;br /&gt;
		} else {&lt;br /&gt;
			--Twinkle.batchdelete.currentDeleteCounter;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	deleteRedirectsMain: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var snapshot = xmlDoc.evaluate(&#039;//backlinks/bl/@title&#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;
&lt;br /&gt;
		var total = snapshot.snapshotLength;&lt;br /&gt;
&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var statusIndicator = new Morebits.status(&#039;Deleting redirects for &#039; + self.params.page, &#039;0%&#039;);&lt;br /&gt;
&lt;br /&gt;
		var onsuccess = function( self ) {&lt;br /&gt;
			var obj = self.params.obj;&lt;br /&gt;
			var total = self.params.total;&lt;br /&gt;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + &#039;%&#039;;&lt;br /&gt;
			obj.update( now );&lt;br /&gt;
			self.statelem.unlink();&lt;br /&gt;
			if( self.params.current &amp;gt;= total ) {&lt;br /&gt;
				obj.info( now + &#039; (completed)&#039; );&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			statusIndicator.info( &#039;100% (completed)&#039; );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var params = $.extend({}, self.params);&lt;br /&gt;
		params.current = 0;&lt;br /&gt;
		params.total = total;&lt;br /&gt;
		params.obj = statusIndicator;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
			var title = snapshot.snapshotItem(i).value;&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( title, &amp;quot;Deleting &amp;quot; + title );&lt;br /&gt;
			wikipedia_page.setEditSummary(&#039;[[WP:CSD#G8|G8]]: Redirect to deleted page &amp;quot;&#039; + self.params.page + &#039;&amp;quot;&#039; + Twinkle.getPref(&#039;deletionSummaryAd&#039;));&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.deletePage(onsuccess);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinksMain: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var snapshot = xmlDoc.evaluate(&#039;//backlinks/bl/@title&#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;
&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var statusIndicator = new Morebits.status(&#039;Unlinking backlinks to &#039; + self.params.page, &#039;0%&#039;);&lt;br /&gt;
&lt;br /&gt;
		var total = snapshot.snapshotLength * 2;&lt;br /&gt;
&lt;br /&gt;
		var onsuccess = function( self ) {&lt;br /&gt;
			var obj = self.params.obj;&lt;br /&gt;
			var total = self.params.total;&lt;br /&gt;
			var now = parseInt( 100 * ++(self.params.current)/total, 10 ) + &#039;%&#039;;&lt;br /&gt;
			obj.update( now );&lt;br /&gt;
			self.statelem.unlink();&lt;br /&gt;
			if( self.params.current &amp;gt;= total ) {&lt;br /&gt;
				obj.info( now + &#039; (completed)&#039; );&lt;br /&gt;
				--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
				Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.addCheckpoint();&lt;br /&gt;
		if( snapshot.snapshotLength === 0 ) {&lt;br /&gt;
			statusIndicator.info( &#039;100% (completed)&#039; );&lt;br /&gt;
			--Twinkle.batchdelete.currentUnlinkCounter;&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		self.params.total = total;&lt;br /&gt;
		self.params.obj = statusIndicator;&lt;br /&gt;
		self.params.current =   0;&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
			var title = snapshot.snapshotItem(i).value;&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page( title, &amp;quot;Unlinking on &amp;quot; + title );&lt;br /&gt;
			var params = $.extend( {}, self.params );&lt;br /&gt;
			params.title = title;&lt;br /&gt;
			params.onsuccess = onsuccess;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinks: function( pageobj ) {&lt;br /&gt;
		var params = pageobj.getCallbackParameters();&lt;br /&gt;
		if( ! pageobj.exists() ) {&lt;br /&gt;
			// we probably just deleted it, as a recursive backlink&lt;br /&gt;
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );&lt;br /&gt;
			Morebits.wiki.actionCompleted();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var text;&lt;br /&gt;
&lt;br /&gt;
		if( params.title in Twinkle.batchdelete.unlinkCache ) {&lt;br /&gt;
			text = Twinkle.batchdelete.unlinkCache[ params.title ];&lt;br /&gt;
		} else {&lt;br /&gt;
			text = pageobj.getPageText();&lt;br /&gt;
		}&lt;br /&gt;
		var old_text = text;&lt;br /&gt;
		var wikiPage = new Morebits.wikitext.page( text );&lt;br /&gt;
		wikiPage.removeLink( params.page );&lt;br /&gt;
&lt;br /&gt;
		text = wikiPage.getText();&lt;br /&gt;
		Twinkle.batchdelete.unlinkCache[ params.title ] = text;&lt;br /&gt;
		if( text === old_text ) {&lt;br /&gt;
			// Nothing to do, return&lt;br /&gt;
			params.onsuccess( { params: params, statelem: pageobj.getStatusElement() } );&lt;br /&gt;
			Morebits.wiki.actionCompleted();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		pageobj.setEditSummary(&#039;Removing link(s) to deleted page &#039; + self.params.page + Twinkle.getPref(&#039;deletionSummaryAd&#039;));&lt;br /&gt;
		pageobj.setPageText(text);&lt;br /&gt;
		pageobj.setCreateOption(&#039;nocreate&#039;);&lt;br /&gt;
		pageobj.save(params.onsuccess);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklewarn.js&amp;diff=23214</id>
		<title>MediaWiki:Gadget-twinklewarn.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklewarn.js&amp;diff=23214"/>
		<updated>2013-11-19T10:14:50Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklewarn.js: Warn module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;Warn&amp;quot;)&lt;br /&gt;
 * Active on:              User talk pages&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn = function twinklewarn() {&lt;br /&gt;
	if( mw.config.get(&#039;wgNamespaceNumber&#039;) === 3 ) {&lt;br /&gt;
			Twinkle.addPortletLink( Twinkle.warn.callback, &amp;quot;Warn&amp;quot;, &amp;quot;tw-warn&amp;quot;, &amp;quot;Warn/notify user&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// modify URL of talk page on rollback success pages&lt;br /&gt;
	if( mw.config.get(&#039;wgAction&#039;) === &#039;rollback&#039; ) {&lt;br /&gt;
		var $vandalTalkLink = $(&amp;quot;#mw-rollback-success&amp;quot;).find(&amp;quot;.mw-usertoollinks a&amp;quot;).first();&lt;br /&gt;
		$vandalTalkLink.css(&amp;quot;font-weight&amp;quot;, &amp;quot;bold&amp;quot;);&lt;br /&gt;
		$vandalTalkLink.wrapInner($(&amp;quot;&amp;lt;span/&amp;gt;&amp;quot;).attr(&amp;quot;title&amp;quot;, &amp;quot;If appropriate, you can use Twinkle to warn the user about their edits to this page.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
		var extraParam = &amp;quot;vanarticle=&amp;quot; + mw.util.rawurlencode(Morebits.pageNameNorm);&lt;br /&gt;
		var href = $vandalTalkLink.attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
		if (href.indexOf(&amp;quot;?&amp;quot;) === -1) {&lt;br /&gt;
			$vandalTalkLink.attr(&amp;quot;href&amp;quot;, href + &amp;quot;?&amp;quot; + extraParam);&lt;br /&gt;
		} else {&lt;br /&gt;
			$vandalTalkLink.attr(&amp;quot;href&amp;quot;, href + &amp;quot;&amp;amp;&amp;quot; + extraParam);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.callback = function twinklewarnCallback() {&lt;br /&gt;
	if( mw.config.get(&#039;wgTitle&#039;).split( &#039;/&#039; )[0] === mw.config.get(&#039;wgUserName&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
			!confirm( &#039;You are about to warn yourself! Are you sure you want to proceed?&#039; ) ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 600, 440 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Warn/notify user&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Choosing a warning level&amp;quot;, &amp;quot;WP:UWUL#Levels&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#warn&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.warn.callback.evaluate );&lt;br /&gt;
	var main_select = form.append( {&lt;br /&gt;
			type: &#039;field&#039;,&lt;br /&gt;
			label: &#039;Choose type of warning/notice to issue&#039;,&lt;br /&gt;
			tooltip: &#039;First choose a main warning group, then the specific warning to issue.&#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var main_group = main_select.append( {&lt;br /&gt;
			type: &#039;select&#039;,&lt;br /&gt;
			name: &#039;main_group&#039;,&lt;br /&gt;
			event:Twinkle.warn.callback.change_category&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var defaultGroup = parseInt(Twinkle.getPref(&#039;defaultWarningGroup&#039;), 10);&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;General note (1)&#039;, value: &#039;level1&#039;, selected: ( defaultGroup === 1 || defaultGroup &amp;lt; 1 || ( Morebits.userIsInGroup( &#039;sysop&#039; ) ? defaultGroup &amp;gt; 8 : defaultGroup &amp;gt; 7 ) ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Caution (2)&#039;, value: &#039;level2&#039;, selected: ( defaultGroup === 2 ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Warning (3)&#039;, value: &#039;level3&#039;, selected: ( defaultGroup === 3 ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Final warning (4)&#039;, value: &#039;level4&#039;, selected: ( defaultGroup === 4 ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Only warning (4im)&#039;, value: &#039;level4im&#039;, selected: ( defaultGroup === 5 ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Single issue notices&#039;, value: &#039;singlenotice&#039;, selected: ( defaultGroup === 6 ) } );&lt;br /&gt;
	main_group.append( { type: &#039;option&#039;, label: &#039;Single issue warnings&#039;, value: &#039;singlewarn&#039;, selected: ( defaultGroup === 7 ) } );&lt;br /&gt;
	if( Twinkle.getPref( &#039;customWarningList&#039; ).length ) {&lt;br /&gt;
		main_group.append( { type: &#039;option&#039;, label: &#039;Custom warnings&#039;, value: &#039;custom&#039;, selected: ( defaultGroup === 9 ) } );&lt;br /&gt;
	}&lt;br /&gt;
	if( Morebits.userIsInGroup( &#039;sysop&#039; ) ) {&lt;br /&gt;
		main_group.append( { type: &#039;option&#039;, label: &#039;Blocking&#039;, value: &#039;block&#039;, selected: ( defaultGroup === 8 ) } );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	main_select.append( { type: &#039;select&#039;, name: &#039;sub_group&#039;, event:Twinkle.warn.callback.change_subcategory } ); //Will be empty to begin with.&lt;br /&gt;
&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;input&#039;,&lt;br /&gt;
			name: &#039;article&#039;,&lt;br /&gt;
			label: &#039;Linked article&#039;,&lt;br /&gt;
			value:( Morebits.queryString.exists( &#039;vanarticle&#039; ) ? Morebits.queryString.get( &#039;vanarticle&#039; ) : &#039;&#039; ),&lt;br /&gt;
			tooltip: &#039;An article can be linked within the notice, perhaps because it was a revert to said article that dispatched this notice. Leave empty for no article to be linked.&#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var more = form.append( { type: &#039;field&#039;, name: &#039;reasonGroup&#039;, label: &#039;Warning information&#039; } );&lt;br /&gt;
	more.append( { type: &#039;textarea&#039;, label: &#039;Optional message:&#039;, name: &#039;reason&#039;, tooltip: &#039;Perhaps a reason, or that a more detailed notice must be appended&#039; } );&lt;br /&gt;
&lt;br /&gt;
	var previewlink = document.createElement( &#039;a&#039; );&lt;br /&gt;
	$(previewlink).click(function(){&lt;br /&gt;
		Twinkle.warn.callbacks.preview(result);  // |result| is defined below&lt;br /&gt;
	});&lt;br /&gt;
	previewlink.style.cursor = &amp;quot;pointer&amp;quot;;&lt;br /&gt;
	previewlink.textContent = &#039;Preview&#039;;&lt;br /&gt;
	more.append( { type: &#039;div&#039;, id: &#039;warningpreview&#039;, label: [ previewlink ] } );&lt;br /&gt;
	more.append( { type: &#039;div&#039;, id: &#039;twinklewarn-previewbox&#039;, style: &#039;display: none&#039; } );&lt;br /&gt;
&lt;br /&gt;
	more.append( { type: &#039;submit&#039;, label: &#039;Submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
	var result = form.render();&lt;br /&gt;
	Window.setContent( result );&lt;br /&gt;
	Window.display();&lt;br /&gt;
	result.main_group.root = result;&lt;br /&gt;
	result.previewer = new Morebits.wiki.preview($(result).find(&#039;div#twinklewarn-previewbox&#039;).last()[0]);&lt;br /&gt;
&lt;br /&gt;
	// We must init the first choice (General Note);&lt;br /&gt;
	var evt = document.createEvent( &amp;quot;Event&amp;quot; );&lt;br /&gt;
	evt.initEvent( &#039;change&#039;, true, true );&lt;br /&gt;
	result.main_group.dispatchEvent( evt );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// This is all the messages that might be dispatched by the code&lt;br /&gt;
// Each of the individual templates require the following information:&lt;br /&gt;
//   label (required): A short description displayed in the dialog&lt;br /&gt;
//   summary (required): The edit summary used. If an article name is entered, the summary is postfixed with &amp;quot;on [[article]]&amp;quot;, and it is always postfixed with &amp;quot;. $summaryAd&amp;quot;&lt;br /&gt;
//   suppressArticleInSummary (optional): Set to true to suppress showing the article name in the edit summary. Useful if the warning relates to attack pages, or some such.&lt;br /&gt;
Twinkle.warn.messages = {&lt;br /&gt;
	level1: {&lt;br /&gt;
		&amp;quot;Common warnings&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-vandalism1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Unconstructive editing&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-disruptive1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Disruptive editing&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Unconstructive editing&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-test1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Editing tests&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Editing tests&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-delete1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of content, blanking&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removal of content, blanking&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior in articles&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-biog1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding unreferenced controversial information about living persons&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Adding unreferenced controversial information about living persons&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-defam1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of defamatory content&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Addition of defamatory content&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-error1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Introducing deliberate factual errors&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Introducing factual errors&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-genre1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Frequent or mass changes to genres without consensus or references&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Frequent or mass changes to genres without consensus or references&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-image1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Image-related vandalism in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Image-related vandalism in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-joke1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using improper humor in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Using improper humor in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-nor1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding original research, including unpublished syntheses of sources&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Adding original research, including unpublished syntheses of sources&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-notcensored1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Censorship of material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Censorship of material&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-own1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Ownership of articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Ownership of articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tdel1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of maintenance templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removal of maintenance templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-unsourced1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of unsourced or improperly cited material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Addition of unsourced or improperly cited material&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Promotions and spam&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-advert1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using Wikipedia for advertising or promotion&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Using Wikipedia for advertising or promotion&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npov1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not adhering to neutral point of view&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Not adhering to neutral point of view&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-spam1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding spam links&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Adding spam links&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior towards other editors&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-agf1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not assuming good faith&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Not assuming good faith&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-harass1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Harassment of other users&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Harassment of other users&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npa1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Personal attack directed at a specific editor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Personal attack directed at a specific editor&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tempabuse1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Improper use of warning or blocking template&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Improper use of warning or blocking template&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Removal of deletion tags&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-afd1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{afd}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removing {{afd}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-blpprod1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{blp prod}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removing {{blp prod}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-idt1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing file deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removing file deletion tags&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-speedy1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing speedy deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Removing speedy deletion tags&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Other&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-chat1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using talk page as forum&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Using talk page as forum&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-create1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating inappropriate pages&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Creating inappropriate pages&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-mos1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Manual of style&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Formatting, date, language, etc (Manual of style)&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-move1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Page moves against naming conventions or consensus&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Page moves against naming conventions or consensus&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tpv1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Refactoring others&#039; talk page comments&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Refactoring others&#039; talk page comments&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-upload1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading unencyclopedic images&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Uploading unencyclopedic images&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}/*,&lt;br /&gt;
		&amp;quot;To be removed from Twinkle&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-redirect1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating malicious redirects&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Creating malicious redirects&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-ics1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading files missing copyright status&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Uploading files missing copyright status&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-af1&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Inappropriate feedback through the Article Feedback Tool&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;General note: Inappropriate feedback through the Article Feedback Tool&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}*/&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	level2: {&lt;br /&gt;
		&amp;quot;Common warnings&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-vandalism2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Unconstructive editing&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-disruptive2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Disruptive editing&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Unconstructive editing&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-test2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Editing tests&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Editing tests&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-delete2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of content, blanking&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removal of content, blanking&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior in articles&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-biog2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding unreferenced controversial information about living persons&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Adding unreferenced controversial information about living persons&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-defam2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of defamatory content&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Addition of defamatory content&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-error2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Introducing deliberate factual errors&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Introducing factual errors&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-genre2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Frequent or mass changes to genres without consensus or references&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Frequent or mass changes to genres without consensus or references&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-image2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Image-related vandalism in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Image-related vandalism in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-joke2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using improper humor in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Using improper humor in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-nor2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding original research, including unpublished syntheses of sources&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Adding original research, including unpublished syntheses of sources&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-notcensored2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Censorship of material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Censorship of material&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-own2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Ownership of articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Ownership of articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tdel2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of maintenance templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removal of maintenance templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-unsourced2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of unsourced or improperly cited material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Addition of unsourced or improperly cited material&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Promotions and spam&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-advert2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using Wikipedia for advertising or promotion&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Using Wikipedia for advertising or promotion&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npov2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not adhering to neutral point of view&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Not adhering to neutral point of view&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-spam2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding spam links&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Adding spam links&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior towards other editors&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-agf2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not assuming good faith&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Not assuming good faith&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-harass2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Harassment of other users&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Harassment of other users&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npa2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Personal attack directed at a specific editor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Personal attack directed at a specific editor&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tempabuse2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Improper use of warning or blocking template&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Improper use of warning or blocking template&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Removal of deletion tags&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-afd2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{afd}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removing {{afd}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-blpprod2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{blp prod}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removing {{blp prod}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-idt2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing file deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removing file deletion tags&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-speedy2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing speedy deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Removing speedy deletion tags&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Other&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-chat2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using talk page as forum&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Using talk page as forum&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-create2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating inappropriate pages&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Creating inappropriate pages&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-mos2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Manual of style&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Formatting, date, language, etc (Manual of style)&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-move2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Page moves against naming conventions or consensus&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Page moves against naming conventions or consensus&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tpv2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Refactoring others&#039; talk page comments&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Refactoring others&#039; talk page comments&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-upload2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading unencyclopedic images&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Uploading unencyclopedic images&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}/*,&lt;br /&gt;
		&amp;quot;To be removed from Twinkle&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-redirect2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating malicious redirects&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Creating malicious redirects&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-ics2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading files missing copyright status&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Uploading files missing copyright status&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-af2&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Inappropriate feedback through the Article Feedback Tool&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Caution: Inappropriate feedback through the Article Feedback Tool&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}*/&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	level3: {&lt;br /&gt;
		&amp;quot;Common warnings&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-vandalism3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Vandalism&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-disruptive3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Disruptive editing&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Disruptive editing&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-test3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Editing tests&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Editing tests&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-delete3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of content, blanking&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removal of content, blanking&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior in articles&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-biog3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding unreferenced controversial/defamatory information about living persons&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Adding unreferenced controversial information about living persons&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-defam3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of defamatory content&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Addition of defamatory content&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-error3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Introducing deliberate factual errors&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Introducing deliberate factual errors&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-genre3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Frequent or mass changes to genres without consensus or reference&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Frequent or mass changes to genres without consensus or reference&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-image3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Image-related vandalism in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Image-related vandalism in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-joke3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using improper humor in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Using improper humor in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-nor3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding original research, including unpublished syntheses of sources&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Adding original research, including unpublished syntheses of sources&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-notcensored3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Censorship of material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Censorship of material&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-own3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Ownership of articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Ownership of articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tdel3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of maintenance templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removal of maintenance templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-unsourced3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of unsourced or improperly cited material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Addition of unsourced or improperly cited material&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Promotions and spam&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-advert3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using Wikipedia for advertising or promotion&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Using Wikipedia for advertising or promotion&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npov3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not adhering to neutral point of view&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Not adhering to neutral point of view&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-spam3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding spam links&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Adding spam links&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior towards other users&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-agf3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not assuming good faith&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Not assuming good faith&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-harass3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Harassment of other users&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Harassment of other users&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npa3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Personal attack directed at a specific editor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Personal attack directed at a specific editor&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Removal of deletion tags&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-afd3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{afd}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removing {{afd}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-blpprod3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{blpprod}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removing {{blpprod}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-idt3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing file deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removing file deletion tags&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-speedy3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing speedy deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Removing speedy deletion tags&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Other&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-chat3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using talk page as forum&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Using talk page as forum&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-create3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating inappropriate pages&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Creating inappropriate pages&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-mos3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Manual of style&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Formatting, date, language, etc (Manual of style)&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-move3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Page moves against naming conventions or consensus&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Page moves against naming conventions or consensus&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tpv3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Refactoring others&#039; talk page comments&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Refactoring others&#039; talk page comments&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-upload3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading unencyclopedic images&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Uploading unencyclopedic images&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}/*,&lt;br /&gt;
		&amp;quot;To be removed fomr Twinkle&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-af3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Inappropriate feedback through the Article Feedback Tool&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Inappropriate feedback through the Article Feedback Tool&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-ics3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading files missing copyright status&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Uploading files missing copyright status&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-redirect3&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating malicious redirects&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Warning: Creating malicious redirects&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}*/&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	level4: {&lt;br /&gt;
		&amp;quot;Common warnings&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-generic4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Generic warning (for template series missing level 4)&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning notice&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-vandalism4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Vandalism&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-delete4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of content, blanking&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removal of content, blanking&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior in articles&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-biog4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding unreferenced defamatory information about living persons&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Adding unreferenced controversial information about living persons&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-defam4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of defamatory content&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Addition of defamatory content&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-error4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Introducing deliberate factual errors&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Introducing deliberate factual errors&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-genre4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Frequent or mass changes to genres without consensus or reference&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Frequent or mass changes to genres without consensus or reference&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-image4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Image-related vandalism in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Image-related vandalism in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-joke4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using improper humor in articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Using improper humor in articles&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-nor4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding original research, including unpublished syntheses of sources&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Adding original research, including unpublished syntheses of sources&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tdel4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of maintenance templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removal of maintenance templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-unsourced4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of unsourced or improperly cited material&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Addition of unsourced or improperly cited material&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Promotions and spam&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-advert4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using Wikipedia for advertising or promotion&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Using Wikipedia for advertising or promotion&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npov4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Not adhering to neutral point of view&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Not adhering to neutral point of view&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-spam4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding spam links&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Adding spam links&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior towards other editors&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-harass4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Harassment of other users&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Harassment of other users&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npa4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Personal attack directed at a specific editor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Personal attack directed at a specific editor&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Removal of deletion tags&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-afd4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{afd}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removing {{afd}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-blpprod4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing {{blp prod}} templates&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removing {{blp prod}} templates&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-idt4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing file deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removing file deletion tags&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-speedy4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removing speedy deletion tags&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Removing speedy deletion tags&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Other&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-chat4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using talk page as forum&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Using talk page as forum&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-create4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating inappropriate pages&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Creating inappropriate pages&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-mos4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Manual of style&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Formatting, date, language, etc (Manual of style)&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-move4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Page moves against naming conventions or consensus&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Page moves against naming conventions or consensus&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-tpv4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Refactoring others&#039; talk page comments&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Refactoring others&#039; talk page comments&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-upload4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading unencyclopedic images&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Uploading unencyclopedic images&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}/*,&lt;br /&gt;
		&amp;quot;To be removed from Twinkle&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-redirect4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating malicious redirects&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Creating malicious redirects&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-ics4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading files missing copyright status&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Uploading files missing copyright status&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-af4&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Inappropriate feedback through the Article Feedback Tool&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Final warning: Inappropriate feedback through the Article Feedback Tool&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}*/&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	level4im: {&lt;br /&gt;
		&amp;quot;Common warnings&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-vandalism4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Vandalism&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-delete4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Removal of content, blanking&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Removal of content, blanking&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior in articles&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-biog4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding unreferenced defamatory information about living persons&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Adding unreferenced controversial information about living persons&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-defam4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Addition of defamatory content&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Addition of defamatory content&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-image4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Image-related vandalism&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Image-related vandalism&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-joke4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using improper humor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Using improper humor&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-own4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Ownership of articles&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Ownership of articles&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Promotions and spam&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-advert4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Using Wikipedia for advertising or promotion&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Using Wikipedia for advertising or promotion&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-spam4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Adding spam links&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Adding spam links&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Behavior towards other editors&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-harass4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Harassment of other users&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Harassment of other users&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-npa4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Personal attack directed at a specific editor&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Personal attack directed at a specific editor&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;Other&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-create4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating inappropriate pages&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Creating inappropriate pages&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-move4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Page moves against naming conventions or consensus&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Page moves against naming conventions or consensus&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-upload4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Uploading unencyclopedic images&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Uploading unencyclopedic images&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}/*,&lt;br /&gt;
		&amp;quot;To be removed from Twinkle&amp;quot;: {&lt;br /&gt;
			&amp;quot;uw-af4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Inappropriate feedback through the Article Feedback Tool&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Inappropriate feedback through the Article Feedback Tool&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;uw-redirect4im&amp;quot;: {&lt;br /&gt;
				label: &amp;quot;Creating malicious redirects&amp;quot;,&lt;br /&gt;
				summary: &amp;quot;Only warning: Creating malicious redirects&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}*/&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	singlenotice: {&lt;br /&gt;
		&amp;quot;uw-2redirect&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating double redirects through bad page moves&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Creating double redirects through bad page moves&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-af-contact&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Attempting to contact the subject of an article via article feedback&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Contacting the subject of an article via article feedback&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-af-personalinfo&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Including personal info in article feedback&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Including personal info in article feedback&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-af-question&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Asking questions in article feedback&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Asking questions in article feedback&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-aiv&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Bad AIV report&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Bad AIV report&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-articlesig&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding signatures to article space&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Adding signatures to article space&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-autobiography&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating autobiographies&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Creating autobiographies&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-badcat&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding incorrect categories&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Adding incorrect categories&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-badlistentry&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding inappropriate entries to lists&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Adding inappropriate entries to lists&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-bite&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;\&amp;quot;Biting\&amp;quot; newcomers&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: \&amp;quot;Biting\&amp;quot; newcomers&amp;quot;,&lt;br /&gt;
			suppressArticleInSummary: true  // non-standard (user name, not article), and not necessary&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-coi&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Conflict of Interest&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Conflict of Interest&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-controversial&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Introducing controversial material&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Introducing controversial material&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copying&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Copying text to another page&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Copying text to another page&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-crystal&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding speculative or unconfirmed information&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Adding speculative or unconfirmed information&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-csd&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Speedy deletion declined&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Speedy deletion declined&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-c&amp;amp;pmove&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Cut and paste moves&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Cut and paste moves&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-dab&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Incorrect edit to a disambiguation page&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Incorrect edit to a disambiguation page&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-date&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Unnecessarily changing date formats&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Unnecessarily changing date formats&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-deadlink&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Removing proper sources containing dead links&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Removing proper sources containing dead links&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-directcat&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Applying stub categories manually&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Applying stub categories manually&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-draftfirst&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;User should draft in userspace without the risk of speedy deletion&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Consider drafting your article in [[Help:Userspace draft|userspace]]&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-editsummary&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Not using edit summary&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Not using edit summary&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-english&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Not communicating in English&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Not communicating in English&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-fuir&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Fair use image has been removed from your userpage&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: A fair use image has been removed from your userpage&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-hasty&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Hasty addition of speedy deletion tags&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Allow creators time to improve their articles before tagging them for deletion&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-imageuse&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Incorrect image linking&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Incorrect image linking&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-incompleteAFD&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Incomplete AFD&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Incomplete AFD&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-inline-el&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding external links to the body of an article&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Keep external links to External links sections at the bottom of an article&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-italicize&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Italicize books, films, albums, magazines, TV series, etc within articles&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Italicize books, films, albums, magazines, TV series, etc within articles&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-lang&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Unnecessarily changing between British and American English&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Unnecessarily changing between British and American English&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-linking&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Excessive addition of redlinks or repeated blue links&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Excessive addition of redlinks or repeated blue links&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-minor&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Incorrect use of minor edits check box&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Incorrect use of minor edits check box&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-nonfree&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Uploading replaceable non-free images&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Uploading replaceable non-free images&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-notaiv&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Do not report complex abuse to AIV&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Do not report complex abuse to AIV&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-notenglish&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating non-English articles&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Creating non-English articles&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-notifysd&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Notify authors of speedy deletion tagged articles&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Please notify authors of articles tagged for speedy deletion&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-notvand&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Mislabelling edits as vandalism&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Misidentifying edits as vandalism&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-notvote&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;We use consensus, not voting&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: We use consensus, not voting&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-patrolled&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Mark newpages as patrolled when patrolling&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Mark newpages as patrolled when patrolling&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-plagiarism&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Copying from public domain sources without attribution&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Copying from public domain sources without attribution&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-preview&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Use preview button to avoid mistakes&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Use preview button to avoid mistakes&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-probation&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Article is on probation&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Article is on probation&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-redlink&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Indiscriminate removal of redlinks&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Be careful when removing redlinks&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-refimprove&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating unverifiable articles&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Creating unverifiable articles&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-removevandalism&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Incorrect vandalism removal&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Incorrect vandalism removal&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-repost&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Recreating material previously deleted via XfD process&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Recreating previously deleted material&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-salt&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Recreating salted articles under a different title&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Recreating salted articles under a different title&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-samename&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Rename request impossible&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Rename request impossible&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-selfrevert&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Reverting self tests&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Reverting self tests&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-socialnetwork&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Wikipedia is not a social network&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Wikipedia is not a social network&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-sofixit&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Be bold and fix things yourself&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: You can be bold and fix things yourself&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-spoiler&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding spoiler alerts or removing spoilers from appropriate sections&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Don&#039;t delete or flag potential &#039;spoilers&#039; in Wikipedia articles&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-subst&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Remember to subst: templates&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Remember to subst: templates&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-talkinarticle&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Talk in article&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Talk in article&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-tilde&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Not signing posts&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Not signing posts&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-toppost&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Posting at the top of talk pages&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Posting at the top of talk pages&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-uaa&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Reporting of username to WP:UAA not accepted&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Reporting of username to WP:UAA not accepted&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-upincat&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Accidentally including user page/subpage in a content category&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Informing user that one of his/her pages had accidentally been included in a content category&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-uploadfirst&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Attempting to display an external image on a page&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Attempting to display an external image on a page&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-userspace draft finish&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Stale userspace draft&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Stale userspace draft&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-userspacenoindex&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;User page/subpage isn&#039;t appropriate for search engine indexing&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: User (sub)page isn&#039;t appropriate for search engine indexing&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-vgscope&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Adding video game walkthroughs, cheats or instructions&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Adding video game walkthroughs, cheats or instructions&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-warn&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Place user warning templates when reverting vandalism&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: You can use user warning templates when reverting vandalism&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	singlewarn: {&lt;br /&gt;
		&amp;quot;uw-3rr&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Violating the three-revert rule; see also uw-ew&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Violating the three-revert rule&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-affiliate&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Affiliate marketing&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Affiliate marketing&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-agf-sock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Use of multiple accounts (assuming good faith)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Using multiple accounts&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-attack&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating attack pages&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Creating attack pages&amp;quot;,&lt;br /&gt;
			suppressArticleInSummary: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-attempt&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Triggering the edit filter&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Triggering the edit filter&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-bizlist&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Business promotion&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Promoting a business&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-botun&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Bot username&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Bot username&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-canvass&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Canvassing&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Canvassing&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copyright&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Copyright violation&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Copyright violation&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copyright-link&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Linking to copyrighted works violation&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Linking to copyrighted works violation&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copyright-new&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Copyright violation (with explanation for new users)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Notice: Avoiding copyright problems&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copyright-remove&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Removing {{copyvio}} template from articles&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Removing {{copyvio}} templates&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-efsummary&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Edit summary triggering the edit filter&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Edit summary triggering the edit filter&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ew&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Edit warring (stronger wording)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Edit warring&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ewsoft&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Edit warring (softer wording for newcomers)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Edit warring&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-hoax&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating hoaxes&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Creating hoaxes&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-legal&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Making legal threats&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Making legal threats&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-login&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Editing while logged out&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Editing while logged out&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-longterm&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Long term pattern of vandalism&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Long term pattern of vandalism&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-multipleIPs&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Usage of multiple IPs&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Usage of multiple IPs&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-pinfo&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Personal info&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Personal info&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-socksuspect&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Sockpuppetry&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: You are a suspected [[WP:SOCK|sockpuppet]]&amp;quot;  // of User:...&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-upv&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Userpage vandalism&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Userpage vandalism&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-username&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Username is against policy&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Your username might be against policy&amp;quot;,&lt;br /&gt;
			suppressArticleInSummary: true  // not relevant for this template&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-coi-username&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Username is against policy, and conflict of interest&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Username and conflict of interest policy&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-userpage&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Userpage or subpage is against policy&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Userpage or subpage is against policy&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-wrongsummary&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Using inaccurate or inappropriate edit summaries&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Warning: Using inaccurate or inappropriate edit summaries&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	block: {&lt;br /&gt;
		&amp;quot;uw-block&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing&amp;quot;,&lt;br /&gt;
			pageParam: true,&lt;br /&gt;
			reasonParam: true,  // allows editing of reason for generic templates&lt;br /&gt;
			suppressArticleInSummary: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-blocknotalk&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Block - talk page disabled&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing and your user talk page has been disabled&amp;quot;,&lt;br /&gt;
			pageParam: true,&lt;br /&gt;
			reasonParam: true,&lt;br /&gt;
			suppressArticleInSummary: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-blockindef&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Block - indefinite&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			pageParam: true,&lt;br /&gt;
			reasonParam: true,&lt;br /&gt;
			suppressArticleInSummary: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ablock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Block - IP address&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;Your IP address has been blocked from editing&amp;quot;,&lt;br /&gt;
			pageParam: true,&lt;br /&gt;
			suppressArticleInSummary: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-vblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Vandalism block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for persistent [[WP:VAND|vandalism]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-voablock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Vandalism-only account block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being [[WP:VOA|used only for vandalism]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-bioblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;BLP violations block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for violations of Wikipedia&#039;s [[WP:BLP|biographies of living persons policy]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-sblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Spam block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for using Wikipedia for [[WP:SPAM|spam]] purposes&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-adblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Advertising block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for [[WP:SOAP|advertising or self-promotion]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-soablock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Spam/advertising-only account block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being used only for [[WP:SPAM|spam, advertising, or promotion]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-npblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Creating nonsense pages block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for creating [[WP:PN|nonsense pages]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-copyrightblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Copyright violation block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for continued [[WP:COPYVIO|copyright infringement]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-spoablock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Sockpuppet account block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being used only for [[WP:SOCK|sock puppetry]]&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-hblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Harassment block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for attempting to [[WP:HARASS|harass]] other users&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ewblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Edit warring block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing to prevent further [[WP:DE|disruption]] caused by your engagement in an [[WP:EW|edit war]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-3block&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Three-revert rule violation block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for violation of the [[WP:3RR|three-revert rule]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-disruptblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Disruptive editing block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for [[WP:DE|disruptive editing]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-deoablock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Disruption/trolling-only account block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being used only for [[WP:DE|trolling, disruption or harassment]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-lblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Legal threat block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing for making [[WP:NLT|legal threats or taking legal action]]&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-aeblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Arbitration enforcement block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for violating an [[WP:Arbitration|arbitration decision]] with your edits&amp;quot;,&lt;br /&gt;
			pageParam: true,&lt;br /&gt;
			reasonParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-efblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Edit filter-related block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for making disruptive edits that repeatedly triggered the [[WP:EF|edit filter]]&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-myblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Social networking block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for using user and/or article pages as a [[WP:NOTMYSPACE|blog, web host, social networking site or forum]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-dblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Deletion/removal of content block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing for continued [[WP:VAND|removal of material]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-compblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Possible compromised account block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because it is believed that your [[WP:SECURE|account has been compromised]]&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-botblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Unapproved bot block&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been blocked from editing because it appears you are running a [[WP:BOT|bot script]] without [[WP:BRFA|approval]]&amp;quot;,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ublock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your username is a violation of the [[WP:U|username policy]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			reasonParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-uhblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Username hard block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your username is a blatant violation of the [[WP:U|username policy]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			reasonParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-softerblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Promotional username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] gives the impression that the account represents a group, organization or website&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-causeblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Promotional username soft block, for charitable causes (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] gives the impression that the account represents a group, organization or website&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-botublock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Bot username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] indicates this is a [[WP:BOT|bot]] account, which is currently not approved&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-memorialblock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Memorial username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] indicates this account may be used as a memorial or tribute to someone&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ublock-famous&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Famous username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] matches the name of a well-known living individual&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-ublock-double&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Similar username soft block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] is too similar to the username of another Wikipedia user&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-uhblock-double&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Username impersonation hard block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your [[WP:U|username]] appears to impersonate another established Wikipedia user&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-vaublock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Vandalism-only account and username hard block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being [[WP:VOA|used only for vandalism]] and your username is a blatant violation of the [[WP:U|username policy]]&amp;quot;,&lt;br /&gt;
			indefinite: true,&lt;br /&gt;
			pageParam: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;uw-spamublock&amp;quot;: {&lt;br /&gt;
			label: &amp;quot;Spam-only account and promotional username hard block (indefinite)&amp;quot;,&lt;br /&gt;
			summary: &amp;quot;You have been indefinitely blocked from editing because your account is being used only for [[WP:SPAM|spam or advertising]] and your username is a violation of the [[WP:U|username policy]]&amp;quot;,&lt;br /&gt;
			indefinite: true&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.prev_block_timer = null;&lt;br /&gt;
Twinkle.warn.prev_block_reason = null;&lt;br /&gt;
Twinkle.warn.prev_article = null;&lt;br /&gt;
Twinkle.warn.prev_reason = null;&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.callback.change_category = function twinklewarnCallbackChangeCategory(e) {&lt;br /&gt;
	var value = e.target.value;&lt;br /&gt;
	var sub_group = e.target.root.sub_group;&lt;br /&gt;
	sub_group.main_group = value;&lt;br /&gt;
	var old_subvalue = sub_group.value;&lt;br /&gt;
	var old_subvalue_re;&lt;br /&gt;
	if( old_subvalue ) {&lt;br /&gt;
		old_subvalue = old_subvalue.replace(/\d*(im)?$/, &#039;&#039; );&lt;br /&gt;
		old_subvalue_re = new RegExp( $.escapeRE( old_subvalue ) + &amp;quot;(\\d*(?:im)?)$&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while( sub_group.hasChildNodes() ){&lt;br /&gt;
		sub_group.removeChild( sub_group.firstChild );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// worker function to create the combo box entries&lt;br /&gt;
	var createEntries = function( contents, container ) {&lt;br /&gt;
		$.each( contents, function( itemKey, itemProperties ) {&lt;br /&gt;
			var key = (typeof itemKey === &amp;quot;string&amp;quot;) ? itemKey : itemProperties.value;&lt;br /&gt;
&lt;br /&gt;
			var selected = false;&lt;br /&gt;
			if( old_subvalue &amp;amp;&amp;amp; old_subvalue_re.test( key ) ) {&lt;br /&gt;
				selected = true;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var elem = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;option&#039;,&lt;br /&gt;
				label: &amp;quot;{{&amp;quot; + key + &amp;quot;}}: &amp;quot; + itemProperties.label,&lt;br /&gt;
				value: key,&lt;br /&gt;
				selected: selected&lt;br /&gt;
			} );&lt;br /&gt;
			var elemRendered = container.appendChild( elem.render() );&lt;br /&gt;
			$(elemRendered).data(&amp;quot;messageData&amp;quot;, itemProperties);&lt;br /&gt;
		} );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	if( value === &amp;quot;singlenotice&amp;quot; || value === &amp;quot;singlewarn&amp;quot; || value === &amp;quot;block&amp;quot; ) {&lt;br /&gt;
		// no categories, just create the options right away&lt;br /&gt;
		createEntries( Twinkle.warn.messages[ value ], sub_group );&lt;br /&gt;
	} else if( value === &amp;quot;custom&amp;quot; ) {&lt;br /&gt;
		createEntries( Twinkle.getPref(&amp;quot;customWarningList&amp;quot;), sub_group );&lt;br /&gt;
	} else {&lt;br /&gt;
		// create the option-groups&lt;br /&gt;
		$.each( Twinkle.warn.messages[ value ], function( groupLabel, groupContents ) {&lt;br /&gt;
			var optgroup = new Morebits.quickForm.element( {&lt;br /&gt;
				type: &#039;optgroup&#039;,&lt;br /&gt;
				label: groupLabel&lt;br /&gt;
			} );&lt;br /&gt;
			optgroup = optgroup.render();&lt;br /&gt;
			sub_group.appendChild( optgroup );&lt;br /&gt;
			// create the options&lt;br /&gt;
			createEntries( groupContents, optgroup );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if( value === &#039;block&#039; ) {&lt;br /&gt;
		// create the block-related fields&lt;br /&gt;
		var more = new Morebits.quickForm.element( { type: &#039;div&#039;, id: &#039;block_fields&#039; } );&lt;br /&gt;
		more.append( {&lt;br /&gt;
			type: &#039;input&#039;,&lt;br /&gt;
			name: &#039;block_timer&#039;,&lt;br /&gt;
			label: &#039;Period of blocking: &#039;,&lt;br /&gt;
			tooltip: &#039;The period the blocking is due for, for example 24 hours, 2 weeks, indefinite etc...&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		more.append( {&lt;br /&gt;
			type: &#039;input&#039;,&lt;br /&gt;
			name: &#039;block_reason&#039;,&lt;br /&gt;
			label: &#039;&amp;quot;You have been blocked for ...&amp;quot; &#039;,&lt;br /&gt;
			tooltip: &#039;An optional reason, to replace the default generic reason. Only available for the generic block templates.&#039;&lt;br /&gt;
		} );&lt;br /&gt;
		e.target.root.insertBefore( more.render(), e.target.root.lastChild );&lt;br /&gt;
&lt;br /&gt;
		// restore saved values of fields&lt;br /&gt;
		if(Twinkle.warn.prev_block_timer !== null) {&lt;br /&gt;
			e.target.root.block_timer.value = Twinkle.warn.prev_block_timer;&lt;br /&gt;
			Twinkle.warn.prev_block_timer = null;&lt;br /&gt;
		}&lt;br /&gt;
		if(Twinkle.warn.prev_block_reason !== null) {&lt;br /&gt;
			e.target.root.block_reason.value = Twinkle.warn.prev_block_reason;&lt;br /&gt;
			Twinkle.warn.prev_block_reason = null;&lt;br /&gt;
		}&lt;br /&gt;
		if(Twinkle.warn.prev_article === null) {&lt;br /&gt;
			Twinkle.warn.prev_article = e.target.root.article.value;&lt;br /&gt;
		}&lt;br /&gt;
		e.target.root.article.disabled = false;&lt;br /&gt;
&lt;br /&gt;
		$(e.target.root.reason).parent().hide();&lt;br /&gt;
		e.target.root.previewer.closePreview();&lt;br /&gt;
	} else if( e.target.root.block_timer ) {&lt;br /&gt;
		// hide the block-related fields&lt;br /&gt;
		if(!e.target.root.block_timer.disabled &amp;amp;&amp;amp; Twinkle.warn.prev_block_timer === null) {&lt;br /&gt;
			Twinkle.warn.prev_block_timer = e.target.root.block_timer.value;&lt;br /&gt;
		}&lt;br /&gt;
		if(!e.target.root.block_reason.disabled &amp;amp;&amp;amp; Twinkle.warn.prev_block_reason === null) {&lt;br /&gt;
			Twinkle.warn.prev_block_reason = e.target.root.block_reason.value;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// hack to fix something really weird - removed elements seem to somehow keep an association with the form&lt;br /&gt;
		e.target.root.block_reason = null;&lt;br /&gt;
&lt;br /&gt;
		$(e.target.root).find(&amp;quot;#block_fields&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
		if(e.target.root.article.disabled &amp;amp;&amp;amp; Twinkle.warn.prev_article !== null) {&lt;br /&gt;
			e.target.root.article.value = Twinkle.warn.prev_article;&lt;br /&gt;
			Twinkle.warn.prev_article = null;&lt;br /&gt;
		}&lt;br /&gt;
		e.target.root.article.disabled = false;&lt;br /&gt;
&lt;br /&gt;
		$(e.target.root.reason).parent().show();&lt;br /&gt;
		e.target.root.previewer.closePreview();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// clear overridden label on article textbox&lt;br /&gt;
	Morebits.quickForm.setElementTooltipVisibility(e.target.root.article, true);&lt;br /&gt;
	Morebits.quickForm.resetElementLabel(e.target.root.article);&lt;br /&gt;
&lt;br /&gt;
	// hide the big red notice&lt;br /&gt;
	$(&amp;quot;#tw-warn-red-notice&amp;quot;).remove();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.callback.change_subcategory = function twinklewarnCallbackChangeSubcategory(e) {&lt;br /&gt;
	var main_group = e.target.form.main_group.value;&lt;br /&gt;
	var value = e.target.form.sub_group.value;&lt;br /&gt;
&lt;br /&gt;
	if( main_group === &#039;singlenotice&#039; || main_group === &#039;singlewarn&#039; ) {&lt;br /&gt;
		if( value === &#039;uw-bite&#039; || value === &#039;uw-username&#039; || value === &#039;uw-socksuspect&#039; ) {&lt;br /&gt;
			if(Twinkle.warn.prev_article === null) {&lt;br /&gt;
				Twinkle.warn.prev_article = e.target.form.article.value;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.article.notArticle = true;&lt;br /&gt;
			e.target.form.article.value = &#039;&#039;;&lt;br /&gt;
		} else if( e.target.form.article.notArticle ) {&lt;br /&gt;
			if(Twinkle.warn.prev_article !== null) {&lt;br /&gt;
				e.target.form.article.value = Twinkle.warn.prev_article;&lt;br /&gt;
				Twinkle.warn.prev_article = null;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.article.notArticle = false;&lt;br /&gt;
		}&lt;br /&gt;
	} else if( main_group === &#039;block&#039; ) {&lt;br /&gt;
		if( Twinkle.warn.messages.block[value].indefinite ) {&lt;br /&gt;
			if(Twinkle.warn.prev_block_timer === null) {&lt;br /&gt;
				Twinkle.warn.prev_block_timer = e.target.form.block_timer.value;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.block_timer.disabled = true;&lt;br /&gt;
			e.target.form.block_timer.value = &#039;indefinite&#039;;&lt;br /&gt;
		} else if( e.target.form.block_timer.disabled ) {&lt;br /&gt;
			if(Twinkle.warn.prev_block_timer !== null) {&lt;br /&gt;
				e.target.form.block_timer.value = Twinkle.warn.prev_block_timer;&lt;br /&gt;
				Twinkle.warn.prev_block_timer = null;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.block_timer.disabled = false;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( Twinkle.warn.messages.block[value].pageParam ) {&lt;br /&gt;
			if(Twinkle.warn.prev_article !== null) {&lt;br /&gt;
				e.target.form.article.value = Twinkle.warn.prev_article;&lt;br /&gt;
				Twinkle.warn.prev_article = null;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.article.disabled = false;&lt;br /&gt;
		} else if( !e.target.form.article.disabled ) {&lt;br /&gt;
			if(Twinkle.warn.prev_article === null) {&lt;br /&gt;
				Twinkle.warn.prev_article = e.target.form.article.value;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.article.disabled = true;&lt;br /&gt;
			e.target.form.article.value = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( Twinkle.warn.messages.block[value].reasonParam ) {&lt;br /&gt;
			if(Twinkle.warn.prev_block_reason !== null) {&lt;br /&gt;
				e.target.form.block_reason.value = Twinkle.warn.prev_block_reason;&lt;br /&gt;
				Twinkle.warn.prev_block_reason = null;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.block_reason.disabled = false;&lt;br /&gt;
		} else if( !e.target.form.block_reason.disabled ) {&lt;br /&gt;
			if(Twinkle.warn.prev_block_reason === null) {&lt;br /&gt;
				Twinkle.warn.prev_block_reason = e.target.form.block_reason.value;&lt;br /&gt;
			}&lt;br /&gt;
			e.target.form.block_reason.disabled = true;&lt;br /&gt;
			e.target.form.block_reason.value = &#039;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// change form labels according to the warning selected&lt;br /&gt;
	if (value === &amp;quot;uw-socksuspect&amp;quot;) {&lt;br /&gt;
		Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);&lt;br /&gt;
		Morebits.quickForm.overrideElementLabel(e.target.form.article, &amp;quot;Username of sock master, if known (without User:) &amp;quot;);&lt;br /&gt;
	} else if (value === &amp;quot;uw-username&amp;quot;) {&lt;br /&gt;
		Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);&lt;br /&gt;
		Morebits.quickForm.overrideElementLabel(e.target.form.article, &amp;quot;Username violates policy because... &amp;quot;);&lt;br /&gt;
	} else if (value === &amp;quot;uw-bite&amp;quot;) {&lt;br /&gt;
		Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, false);&lt;br /&gt;
		Morebits.quickForm.overrideElementLabel(e.target.form.article, &amp;quot;Username of &#039;bitten&#039; user (without User:) &amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		Morebits.quickForm.setElementTooltipVisibility(e.target.form.article, true);&lt;br /&gt;
		Morebits.quickForm.resetElementLabel(e.target.form.article);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// add big red notice, warning users about how to use {{uw-[coi-]username}} appropriately&lt;br /&gt;
	$(&amp;quot;#tw-warn-red-notice&amp;quot;).remove();&lt;br /&gt;
&lt;br /&gt;
	var $redWarning;&lt;br /&gt;
	if (value === &amp;quot;uw-username&amp;quot;) {&lt;br /&gt;
		$redWarning = $(&amp;quot;&amp;lt;div style=&#039;color: red;&#039; id=&#039;tw-warn-red-notice&#039;&amp;gt;{{uw-username}} should &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; be used for &amp;lt;b&amp;gt;blatant&amp;lt;/b&amp;gt; username policy violations. &amp;quot; +&lt;br /&gt;
			&amp;quot;Blatant violations should be reported directly to UAA (via Twinkle&#039;s ARV tab). &amp;quot; +&lt;br /&gt;
			&amp;quot;{{uw-username}} should only be used in edge cases in order to engage in discussion with the user.&amp;lt;/div&amp;gt;&amp;quot;);&lt;br /&gt;
		$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));&lt;br /&gt;
	} else if (value === &amp;quot;uw-coi-username&amp;quot;) {&lt;br /&gt;
		$redWarning = $(&amp;quot;&amp;lt;div style=&#039;color: red;&#039; id=&#039;tw-warn-red-notice&#039;&amp;gt;{{uw-coi-username}} should &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; be used for &amp;lt;b&amp;gt;blatant&amp;lt;/b&amp;gt; username policy violations. &amp;quot; +&lt;br /&gt;
			&amp;quot;Blatant violations should be reported directly to UAA (via Twinkle&#039;s ARV tab). &amp;quot; +&lt;br /&gt;
			&amp;quot;{{uw-coi-username}} should only be used in edge cases in order to engage in discussion with the user.&amp;lt;/div&amp;gt;&amp;quot;);&lt;br /&gt;
		$redWarning.insertAfter(Morebits.quickForm.getElementLabelObject(e.target.form.reasonGroup));&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.callbacks = {&lt;br /&gt;
	getWarningWikitext: function(templateName, article, reason) {&lt;br /&gt;
		var text = &amp;quot;{{subst:&amp;quot; + templateName;&lt;br /&gt;
&lt;br /&gt;
		if (article) {&lt;br /&gt;
			// add linked article for user warnings (non-block templates)&lt;br /&gt;
			text += &#039;|1=&#039; + article;&lt;br /&gt;
		}&lt;br /&gt;
		text += &#039;}}&#039;;&lt;br /&gt;
&lt;br /&gt;
		// add extra message for non-block templates&lt;br /&gt;
		if (reason) {&lt;br /&gt;
			text += &amp;quot; &#039;&#039;&amp;quot; + reason + &amp;quot;&#039;&#039;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return text;&lt;br /&gt;
	},&lt;br /&gt;
	getBlockNoticeWikitext: function(templateName, article, blockTime, blockReason, isIndefTemplate) {&lt;br /&gt;
		var text = &amp;quot;{{subst:&amp;quot; + templateName;&lt;br /&gt;
&lt;br /&gt;
		if (article &amp;amp;&amp;amp; Twinkle.warn.messages.block[templateName].pageParam) {&lt;br /&gt;
			text += &#039;|page=&#039; + article;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (!/te?mp|^\s*$|min/.exec(blockTime) &amp;amp;&amp;amp; !isIndefTemplate) {&lt;br /&gt;
			if (/indef|\*|max/.exec(blockTime)) {&lt;br /&gt;
				text += &#039;|indef=yes&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				text += &#039;|time=&#039; + blockTime;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (blockReason) {&lt;br /&gt;
			text += &#039;|reason=&#039; + blockReason;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		text += &amp;quot;|sig=true}}&amp;quot;;&lt;br /&gt;
		return text;&lt;br /&gt;
	},&lt;br /&gt;
	preview: function(form) {&lt;br /&gt;
		var templatename = form.sub_group.value;&lt;br /&gt;
		var linkedarticle = form.article.value;&lt;br /&gt;
		var templatetext;&lt;br /&gt;
&lt;br /&gt;
		if (templatename in Twinkle.warn.messages.block) {&lt;br /&gt;
			templatetext = Twinkle.warn.callbacks.getBlockNoticeWikitext(templatename, linkedarticle, form.block_timer.value,&lt;br /&gt;
				form.block_reason.value, Twinkle.warn.messages.block[templatename].indefinite);&lt;br /&gt;
		} else {&lt;br /&gt;
			templatetext = Twinkle.warn.callbacks.getWarningWikitext(templatename, linkedarticle, form.reason.value);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		form.previewer.beginRender(templatetext);&lt;br /&gt;
	},&lt;br /&gt;
	main: function( pageobj ) {&lt;br /&gt;
		var text = pageobj.getPageText();&lt;br /&gt;
		var params = pageobj.getCallbackParameters();&lt;br /&gt;
		var messageData = params.messageData;&lt;br /&gt;
&lt;br /&gt;
		var history_re = /&amp;lt;!-- Template:(uw-.*?) --&amp;gt;.*?(\d{1,2}:\d{1,2}, \d{1,2} \w+ \d{4}) \(UTC\)/g;&lt;br /&gt;
		var history = {};&lt;br /&gt;
		var latest = { date: new Date( 0 ), type: &#039;&#039; };&lt;br /&gt;
		var current;&lt;br /&gt;
&lt;br /&gt;
		while( ( current = history_re.exec( text ) ) ) {&lt;br /&gt;
			var current_date = new Date( current[2] + &#039; UTC&#039; );&lt;br /&gt;
			if( !( current[1] in history ) ||  history[ current[1] ] &amp;lt; current_date ) {&lt;br /&gt;
				history[ current[1] ] = current_date;&lt;br /&gt;
			}&lt;br /&gt;
			if( current_date &amp;gt; latest.date ) {&lt;br /&gt;
				latest.date = current_date;&lt;br /&gt;
				latest.type = current[1];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var date = new Date();&lt;br /&gt;
&lt;br /&gt;
		if( params.sub_group in history ) {&lt;br /&gt;
			var temp_time = new Date( history[ params.sub_group ] );&lt;br /&gt;
			temp_time.setUTCHours( temp_time.getUTCHours() + 24 );&lt;br /&gt;
&lt;br /&gt;
			if( temp_time &amp;gt; date ) {&lt;br /&gt;
				if( !confirm( &amp;quot;An identical &amp;quot; + params.sub_group + &amp;quot; has been issued in the last 24 hours.  \nWould you still like to add this warning/notice?&amp;quot; ) ) {&lt;br /&gt;
					pageobj.statelem.info( &#039;aborted per user request&#039; );&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		latest.date.setUTCMinutes( latest.date.getUTCMinutes() + 1 ); // after long debate, one minute is max&lt;br /&gt;
&lt;br /&gt;
		if( latest.date &amp;gt; date ) {&lt;br /&gt;
			if( !confirm( &amp;quot;A &amp;quot; + latest.type + &amp;quot; has been issued in the last minute.  \nWould you still like to add this warning/notice?&amp;quot; ) ) {&lt;br /&gt;
				pageobj.statelem.info( &#039;aborted per user request&#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var headerRe = new RegExp( &amp;quot;^==+\\s*(?:&amp;quot; + date.getUTCMonthName() + &#039;|&#039; + date.getUTCMonthNameAbbrev() +  &amp;quot;)\\s+&amp;quot; + date.getUTCFullYear() + &amp;quot;\\s*==+&amp;quot;, &#039;m&#039; );&lt;br /&gt;
&lt;br /&gt;
		if( text.length &amp;gt; 0 ) {&lt;br /&gt;
			text += &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( params.main_group === &#039;block&#039; ) {&lt;br /&gt;
			if( Twinkle.getPref(&#039;blankTalkpageOnIndefBlock&#039;) &amp;amp;&amp;amp; params.sub_group !== &#039;uw-lblock&#039; &amp;amp;&amp;amp; ( messageData.indefinite || (/indef|\*|max/).exec( params.block_timer ) ) ) {&lt;br /&gt;
				Morebits.status.info( &#039;Info&#039;, &#039;Blanking talk page per preferences and creating a new level 2 heading for the date&#039; );&lt;br /&gt;
				text = &amp;quot;== &amp;quot; + date.getUTCMonthName() + &amp;quot; &amp;quot; + date.getUTCFullYear() + &amp;quot; ==\n&amp;quot;;&lt;br /&gt;
			} else if( !headerRe.exec( text ) ) {&lt;br /&gt;
				Morebits.status.info( &#039;Info&#039;, &#039;Will create a new level 2 heading for the date, as none was found for this month&#039; );&lt;br /&gt;
				text += &amp;quot;== &amp;quot; + date.getUTCMonthName() + &amp;quot; &amp;quot; + date.getUTCFullYear() + &amp;quot; ==\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			text += Twinkle.warn.callbacks.getBlockNoticeWikitext(params.sub_group, params.article, params.block_timer, params.reason, messageData.indefinite);&lt;br /&gt;
		} else {&lt;br /&gt;
			if( !headerRe.exec( text ) ) {&lt;br /&gt;
				Morebits.status.info( &#039;Info&#039;, &#039;Will create a new level 2 heading for the date, as none was found for this month&#039; );&lt;br /&gt;
				text += &amp;quot;== &amp;quot; + date.getUTCMonthName() + &amp;quot; &amp;quot; + date.getUTCFullYear() + &amp;quot; ==\n&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
			text += Twinkle.warn.callbacks.getWarningWikitext(params.sub_group, params.article, params.reason) + &amp;quot; ~~~~&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( Twinkle.getPref(&#039;showSharedIPNotice&#039;) &amp;amp;&amp;amp; Morebits.isIPAddress( mw.config.get(&#039;wgTitle&#039;) ) ) {&lt;br /&gt;
			Morebits.status.info( &#039;Info&#039;, &#039;Adding a shared IP notice&#039; );&lt;br /&gt;
			text +=  &amp;quot;\n{{subst:SharedIPAdvice}}&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// build the edit summary&lt;br /&gt;
		var summary;&lt;br /&gt;
		if( params.main_group === &#039;custom&#039; ) {&lt;br /&gt;
			switch( params.sub_group.substr( -1 ) ) {&lt;br /&gt;
				case &amp;quot;1&amp;quot;:&lt;br /&gt;
					summary = &amp;quot;General note&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;quot;2&amp;quot;:&lt;br /&gt;
					summary = &amp;quot;Caution&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;quot;3&amp;quot;:&lt;br /&gt;
					summary = &amp;quot;Warning&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;quot;4&amp;quot;:&lt;br /&gt;
					summary = &amp;quot;Final warning&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;quot;m&amp;quot;:&lt;br /&gt;
					if( params.sub_group.substr( -3 ) === &amp;quot;4im&amp;quot; ) {&lt;br /&gt;
						summary = &amp;quot;Only warning&amp;quot;;&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
					summary = &amp;quot;Notice&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					summary = &amp;quot;Notice&amp;quot;;&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			summary += &amp;quot;: &amp;quot; + Morebits.string.toUpperCaseFirstChar(messageData.label);&lt;br /&gt;
		} else {&lt;br /&gt;
			summary = messageData.summary;&lt;br /&gt;
			if ( messageData.suppressArticleInSummary !== true &amp;amp;&amp;amp; params.article ) {&lt;br /&gt;
				if ( params.sub_group === &amp;quot;uw-socksuspect&amp;quot; ) {  // this template requires a username&lt;br /&gt;
					summary += &amp;quot; of [[User:&amp;quot; + params.article + &amp;quot;]]&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					summary += &amp;quot; on [[&amp;quot; + params.article + &amp;quot;]]&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		summary += &amp;quot;.&amp;quot; + Twinkle.getPref(&amp;quot;summaryAd&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		pageobj.setPageText( text );&lt;br /&gt;
		pageobj.setEditSummary( summary );&lt;br /&gt;
		pageobj.setWatchlist( Twinkle.getPref(&#039;watchWarnings&#039;) );&lt;br /&gt;
		pageobj.save();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.warn.callback.evaluate = function twinklewarnCallbackEvaluate(e) {&lt;br /&gt;
&lt;br /&gt;
	// First, check to make sure a reason was filled in if uw-username was selected&lt;br /&gt;
&lt;br /&gt;
	if(e.target.sub_group.value === &#039;uw-username&#039; &amp;amp;&amp;amp; e.target.article.value.trim() === &#039;&#039;) {&lt;br /&gt;
		alert(&amp;quot;You must supply a reason for the {{uw-username}} template.&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Find the selected &amp;lt;option&amp;gt; element so we can fetch the data structure&lt;br /&gt;
	var selectedEl = $(e.target.sub_group).find(&#039;option[value=&amp;quot;&#039; + $(e.target.sub_group).val() + &#039;&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
	// Then, grab all the values provided by the form&lt;br /&gt;
	var params = {&lt;br /&gt;
		reason: e.target.block_reason ? e.target.block_reason.value : e.target.reason.value,&lt;br /&gt;
		main_group: e.target.main_group.value,&lt;br /&gt;
		sub_group: e.target.sub_group.value,&lt;br /&gt;
		article: e.target.article.value,  // .replace( /^(Image|Category):/i, &#039;:$1:&#039; ),  -- apparently no longer needed...&lt;br /&gt;
		block_timer: e.target.block_timer ? e.target.block_timer.value : null,&lt;br /&gt;
		messageData: selectedEl.data(&amp;quot;messageData&amp;quot;)&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
	Morebits.status.init( e.target );&lt;br /&gt;
&lt;br /&gt;
	Morebits.wiki.actionCompleted.redirect = mw.config.get(&#039;wgPageName&#039;);&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &amp;quot;Warning complete, reloading talk page in a few seconds&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	var wikipedia_page = new Morebits.wiki.page( mw.config.get(&#039;wgPageName&#039;), &#039;User talk page modification&#039; );&lt;br /&gt;
	wikipedia_page.setCallbackParameters( params );&lt;br /&gt;
	wikipedia_page.setFollowRedirect( true );&lt;br /&gt;
	wikipedia_page.load( Twinkle.warn.callbacks.main );&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchundelete.js&amp;diff=23367</id>
		<title>MediaWiki:Gadget-twinklebatchundelete.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-twinklebatchundelete.js&amp;diff=23367"/>
		<updated>2013-11-19T10:14:48Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: v2.0-646-g981a645: warn: Add {{Template:uw-inline-el|uw-inline-el}}; batchprotect: Add templateeditor protection level; Migrate from deprecated wikiGetlink to getUrl; arv: AIV reports can end in ? ! ;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklebatchundelete.js: Batch undelete module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;Und-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing user pages&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete = function twinklebatchundelete() {&lt;br /&gt;
	if( mw.config.get(&amp;quot;wgNamespaceNumber&amp;quot;) !== mw.config.get(&amp;quot;wgNamespaceIds&amp;quot;).user || &lt;br /&gt;
		!mw.config.get(&amp;quot;wgArticleId&amp;quot;) ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if( Morebits.userIsInGroup( &#039;sysop&#039; ) ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.batchundelete.callback, &amp;quot;Und-batch&amp;quot;, &amp;quot;tw-batch-undel&amp;quot;, &amp;quot;Undelete &#039;em all&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setScriptName(&amp;quot;Twinkle&amp;quot;);&lt;br /&gt;
	Window.setTitle(&amp;quot;Batch undelete&amp;quot;)&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.batchundelete.callback.evaluate );&lt;br /&gt;
	form.append( {&lt;br /&gt;
			type: &#039;textarea&#039;,&lt;br /&gt;
			name: &#039;reason&#039;,&lt;br /&gt;
			label: &#039;Reason: &#039;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
	var query = {&lt;br /&gt;
		&#039;action&#039;: &#039;query&#039;,&lt;br /&gt;
		&#039;generator&#039;: &#039;links&#039;,&lt;br /&gt;
		&#039;titles&#039;: mw.config.get(&amp;quot;wgPageName&amp;quot;),&lt;br /&gt;
		&#039;gpllimit&#039; : Twinkle.getPref(&#039;batchMax&#039;) // the max for sysops&lt;br /&gt;
	};&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &#039;Grabbing pages&#039;, query, function( self ) {&lt;br /&gt;
			var xmlDoc = self.responseXML;&lt;br /&gt;
			var snapshot = xmlDoc.evaluate(&#039;//page[@missing]&#039;, xmlDoc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );&lt;br /&gt;
			var list = [];&lt;br /&gt;
			for ( var i = 0; i &amp;lt; snapshot.snapshotLength; ++i ) {&lt;br /&gt;
				var object = snapshot.snapshotItem(i);&lt;br /&gt;
				var page = xmlDoc.evaluate( &#039;@title&#039;, object, null, XPathResult.STRING_TYPE, null ).stringValue;&lt;br /&gt;
				list.push( {label:page, value:page, checked: true });&lt;br /&gt;
			}&lt;br /&gt;
			self.params.form.append( {&lt;br /&gt;
					type: &#039;checkbox&#039;,&lt;br /&gt;
					name: &#039;pages&#039;,&lt;br /&gt;
					list: list&lt;br /&gt;
				}&lt;br /&gt;
			);&lt;br /&gt;
			self.params.form.append( { type:&#039;submit&#039; } );&lt;br /&gt;
&lt;br /&gt;
			var result = self.params.form.render();&lt;br /&gt;
			self.params.Window.setContent( result );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		}  );&lt;br /&gt;
	wikipedia_api.params = { form:form, Window:Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
	var root = document.createElement( &#039;div&#039; );&lt;br /&gt;
	Morebits.status.init( root );&lt;br /&gt;
	Window.setContent( root );&lt;br /&gt;
	Window.display();&lt;br /&gt;
};&lt;br /&gt;
Twinkle.batchundelete.currentUndeleteCounter = 0;&lt;br /&gt;
Twinkle.batchundelete.currentundeletor = 0;&lt;br /&gt;
Twinkle.batchundelete.callback.evaluate = function( event ) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &#039;Status&#039;;&lt;br /&gt;
	Morebits.wiki.actionCompleted.postfix = &#039;batch undeletion is now completed&#039;;&lt;br /&gt;
&lt;br /&gt;
	var pages = event.target.getChecked( &#039;pages&#039; );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		alert(&amp;quot;You need to give a reason, you cabal crony!&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
&lt;br /&gt;
	if( !pages ) {&lt;br /&gt;
		Morebits.status.error( &#039;Error&#039;, &#039;nothing to undelete, aborting&#039; );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var work = Morebits.array.chunk( pages, Twinkle.getPref(&#039;batchUndeleteChunks&#039;) );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.batchundelete.currentundeletor = window.setInterval( Twinkle.batchundelete.callbacks.main, 1000, work, reason );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete.callbacks = {&lt;br /&gt;
	main: function( work, reason ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp; Twinkle.batchundelete.currentUndeleteCounter &amp;lt;= 0 ) {&lt;br /&gt;
			Morebits.status.info( &#039;work done&#039; );&lt;br /&gt;
			window.clearInterval( Twinkle.batchundelete.currentundeletor );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; Twinkle.batchundelete.currentUndeleteCounter &amp;lt;= Twinkle.getPref(&#039;batchUndeleteMinCutOff&#039;) ) {&lt;br /&gt;
			var pages = work.shift();&lt;br /&gt;
			Twinkle.batchundelete.currentUndeleteCounter += pages.length;&lt;br /&gt;
			for( var i = 0; i &amp;lt; pages.length; ++i ) {&lt;br /&gt;
				var title = pages[i];&lt;br /&gt;
				var query = { &lt;br /&gt;
					&#039;token&#039;: mw.user.tokens.get().editToken,&lt;br /&gt;
					&#039;title&#039;: title,&lt;br /&gt;
					&#039;action&#039;: &#039;undelete&#039;,&lt;br /&gt;
					&#039;reason&#039;: reason + Twinkle.getPref(&#039;deletionSummaryAd&#039;)&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( &amp;quot;Undeleting &amp;quot; + title, query, function( self ) { &lt;br /&gt;
						--Twinkle.batchundelete.currentUndeleteCounter;&lt;br /&gt;
						var link = document.createElement( &#039;a&#039; );&lt;br /&gt;
						link.setAttribute( &#039;href&#039;, mw.util.getUrl(self.itsTitle) );&lt;br /&gt;
						link.setAttribute( &#039;title&#039;, self.itsTitle );&lt;br /&gt;
						link.appendChild( document.createTextNode(self.itsTitle) );&lt;br /&gt;
						self.statelem.info( [&#039;completed (&#039;,link,&#039;)&#039;] );&lt;br /&gt;
&lt;br /&gt;
					});&lt;br /&gt;
				wikipedia_api.itsTitle = title;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-purgetab.js&amp;diff=23333</id>
		<title>MediaWiki:Gadget-purgetab.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=MediaWiki:Gadget-purgetab.js&amp;diff=23333"/>
		<updated>2013-11-18T16:41:31Z</updated>

		<summary type="html">&lt;p&gt;0.0.0.0: update deprecated function wikiGetLink&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * Action link: Purge (Action menu)&lt;br /&gt;
 *&lt;br /&gt;
 * @source: http://www.mediawiki.org/wiki/Snippets/Purge_action&lt;br /&gt;
 * @rev: 5&lt;br /&gt;
 */&lt;br /&gt;
$( function() {&lt;br /&gt;
    if ( !$( &#039;#ca-purge&#039; ).length &amp;amp;&amp;amp; mw.config.get( &#039;wgIsArticle&#039; ) ) {&lt;br /&gt;
        mw.util.addPortletLink(&lt;br /&gt;
            &#039;p-cactions&#039;,&lt;br /&gt;
            mw.util.getUrl( mw.config.get( &#039;wgPageName&#039; ), { action: &#039;purge&#039; } ),&lt;br /&gt;
            mw.config.get( &#039;skin&#039; ) == &#039;vector&#039; ? &#039;Purge&#039; : &#039;*&#039;,&lt;br /&gt;
            &#039;ca-purge&#039;,&lt;br /&gt;
            &#039;Purge the server cache of this page&#039;,&lt;br /&gt;
            &#039;*&#039;&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
</feed>