<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.microindex.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Oxitain</id>
	<title>MicroIndex - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.microindex.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Oxitain"/>
	<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php/Special:Contributions/Oxitain"/>
	<updated>2026-09-09T16:35:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Protected_page/config&amp;diff=476</id>
		<title>Module:Protected page/config</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Protected_page/config&amp;diff=476"/>
		<updated>2026-09-09T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides configuration data for [[Module:Protection banner]].&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                                BANNER DATA&lt;br /&gt;
--&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Banner data consists of six fields:&lt;br /&gt;
-- * text - the main protection text that appears at the top of protection&lt;br /&gt;
--   banners.&lt;br /&gt;
-- * explanation - the text that appears below the main protection text, used&lt;br /&gt;
--   to explain the details of the protection.&lt;br /&gt;
-- * tooltip - the tooltip text you see when you move the mouse over a small&lt;br /&gt;
--   padlock icon.&lt;br /&gt;
-- * link - the page that the small padlock icon links to.&lt;br /&gt;
-- * alt - the alt text for the small padlock icon. This is also used as tooltip&lt;br /&gt;
--   text for the large protection banners.&lt;br /&gt;
-- * image - the padlock image used in both protection banners and small padlock&lt;br /&gt;
--   icons.&lt;br /&gt;
--&lt;br /&gt;
-- The module checks in three separate tables to find a value for each field.&lt;br /&gt;
-- First it checks the banners table, which has values specific to the reason&lt;br /&gt;
-- for the page being protected. Then the module checks the defaultBanners&lt;br /&gt;
-- table, which has values specific to each protection level. Finally, the&lt;br /&gt;
-- module checks the masterBanner table, which holds data for protection&lt;br /&gt;
-- templates to use if no data has been found in the previous two tables.&lt;br /&gt;
--&lt;br /&gt;
-- The values in the banner data can take parameters. These are specified&lt;br /&gt;
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name&lt;br /&gt;
-- enclosed in curly braces).&lt;br /&gt;
--&lt;br /&gt;
--                          Available parameters:&lt;br /&gt;
--&lt;br /&gt;
-- ${CURRENTVERSION} - a link to the page history or the move log, with the&lt;br /&gt;
-- display message &amp;quot;current-version-edit-display&amp;quot; or&lt;br /&gt;
-- &amp;quot;current-version-move-display&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${EDITREQUEST} - a link to create an edit request for the current page.&lt;br /&gt;
--&lt;br /&gt;
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. &amp;quot;Please discuss any changes&lt;br /&gt;
-- on the talk page; you may submit a request to ask an administrator to make&lt;br /&gt;
-- an edit if it is minor or supported by consensus.&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${IMAGELINK} - a link to set the image to, depending on the protection&lt;br /&gt;
-- action and protection level.&lt;br /&gt;
--&lt;br /&gt;
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry&lt;br /&gt;
-- is set. E.g. &amp;quot;Editing of this page by new or unregistered users is currently &lt;br /&gt;
-- disabled until dd Month YYYY.&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation&lt;br /&gt;
-- so that it can be used in run-on sentences.&lt;br /&gt;
--&lt;br /&gt;
-- ${PAGETYPE} - the type of the page, e.g. &amp;quot;article&amp;quot; or &amp;quot;template&amp;quot;.&lt;br /&gt;
-- Defined in the cfg.pagetypes table.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.&lt;br /&gt;
-- &amp;quot;Editing of this page by new or unregistered users is currently disabled&amp;quot;&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the&lt;br /&gt;
-- template.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONLEVEL} - the protection level, e.g. &amp;quot;fully protected&amp;quot; or&lt;br /&gt;
-- &amp;quot;semi-protected&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,&lt;br /&gt;
-- depending on the protection action.&lt;br /&gt;
--&lt;br /&gt;
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links&lt;br /&gt;
-- straight to that talk page section.&lt;br /&gt;
--&lt;br /&gt;
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to&lt;br /&gt;
-- create a blurb like &amp;quot;This template is semi-protected&amp;quot;, or &amp;quot;This article is&lt;br /&gt;
-- move-protected until DD Month YYYY&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- ${VANDAL} - links for the specified username (or the root page name)&lt;br /&gt;
-- using Module:Vandal-m.&lt;br /&gt;
--&lt;br /&gt;
--                                 Functions&lt;br /&gt;
--&lt;br /&gt;
-- For advanced users, it is possible to use Lua functions instead of strings&lt;br /&gt;
-- in the banner config tables. Using functions gives flexibility that is not&lt;br /&gt;
-- possible just by using parameters. Functions take two arguments, the&lt;br /&gt;
-- protection object and the template arguments, and they must output a string.&lt;br /&gt;
--&lt;br /&gt;
-- For example:&lt;br /&gt;
--&lt;br /&gt;
-- text = function (protectionObj, args)&lt;br /&gt;
--     if protectionObj.level == &#039;autoconfirmed&#039; then&lt;br /&gt;
--         return &#039;foo&#039;&lt;br /&gt;
--     else&lt;br /&gt;
--         return &#039;bar&#039;&lt;br /&gt;
--     end&lt;br /&gt;
-- end&lt;br /&gt;
--&lt;br /&gt;
-- Some protection object properties and methods that may be useful:&lt;br /&gt;
-- protectionObj.action - the protection action&lt;br /&gt;
-- protectionObj.level - the protection level&lt;br /&gt;
-- protectionObj.reason - the protection reason&lt;br /&gt;
-- protectionObj.expiry - the expiry. Nil if unset, the string &amp;quot;indef&amp;quot; if set&lt;br /&gt;
--     to indefinite, and the protection time in unix time if temporary.&lt;br /&gt;
-- protectionObj.protectionDate - the protection date in unix time, or nil if&lt;br /&gt;
--     unspecified.&lt;br /&gt;
-- protectionObj.bannerConfig - the banner config found by the module. Beware&lt;br /&gt;
--     of editing the config field used by the function, as it could create an&lt;br /&gt;
--     infinite loop.&lt;br /&gt;
-- protectionObj:isProtected - returns a boolean showing whether the page is&lt;br /&gt;
--     protected.&lt;br /&gt;
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is&lt;br /&gt;
--     temporary.&lt;br /&gt;
-- protectionObj:isIncorrect - returns a boolean showing whether the protection&lt;br /&gt;
--     template is incorrect.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- The master banner data, used if no values have been found in banners or&lt;br /&gt;
-- defaultBanners.&lt;br /&gt;
masterBanner = {&lt;br /&gt;
	text = &#039;${INTROBLURB}&#039;,&lt;br /&gt;
	explanation = &#039;${EXPLANATIONBLURB}&#039;,&lt;br /&gt;
	tooltip = &#039;${TOOLTIPBLURB}&#039;,&lt;br /&gt;
	link = &#039;${IMAGELINK}&#039;,&lt;br /&gt;
	alt = &#039;Page ${PROTECTIONLEVEL}&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The default banner data. This holds banner data for different protection&lt;br /&gt;
-- levels.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
defaultBanners = {&lt;br /&gt;
	edit = {},&lt;br /&gt;
	move = {},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = {&lt;br /&gt;
			alt = &#039;Page protected with pending changes&#039;,&lt;br /&gt;
			tooltip = &#039;All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users&#039;,&lt;br /&gt;
			image = &#039;Pending-protection-shackle.svg&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	upload = {}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The banner data. This holds banner data for different protection reasons.&lt;br /&gt;
-- In fact, the reasons specified in this table control which reasons are&lt;br /&gt;
-- valid inputs to the first positional parameter.&lt;br /&gt;
--&lt;br /&gt;
-- There is also a non-standard &amp;quot;description&amp;quot; field that can be used for items&lt;br /&gt;
-- in this table. This is a description of the protection reason for use in the&lt;br /&gt;
-- module documentation.&lt;br /&gt;
--&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
banners = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		blp = {&lt;br /&gt;
			description = &#039;For pages protected to promote compliance with the&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Biographies of living persons&#039;&lt;br /&gt;
				.. &#039;|biographies of living persons]] policy&#039;,&lt;br /&gt;
			text = &#039;${INTROFRAGMENT} to promote compliance with&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Biographies of living persons&#039;&lt;br /&gt;
				.. &amp;quot;|Wikipedia&#039;s&amp;amp;nbsp;policy on&amp;amp;nbsp;the&amp;amp;nbsp;biographies&amp;quot;&lt;br /&gt;
				.. &#039; of&amp;amp;nbsp;living&amp;amp;nbsp;people]].&#039;,&lt;br /&gt;
			tooltip = &#039;${TOOLTIPFRAGMENT} to promote compliance with the policy on&#039;&lt;br /&gt;
				.. &#039; biographies of living persons&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		deceased = {&lt;br /&gt;
			description = &#039;For user pages of Wikipedia users who are deceased&#039;,&lt;br /&gt;
			text = &#039;${INTROFRAGMENT} to prevent vandalism of a deceased&#039;&lt;br /&gt;
				.. &#039; Wikipedian\&#039;s user page.&#039;&lt;br /&gt;
				.. &#039; A family member who wishes to edit this user page can use this&#039;&lt;br /&gt;
				.. &#039; user\&#039;s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the&#039;&lt;br /&gt;
				.. &#039; Volunteer Response Team]].&#039;,&lt;br /&gt;
			tooltip = &#039;${TOOLTIPFRAGMENT} because this Wikipedian is deceased&#039;&lt;br /&gt;
		},&lt;br /&gt;
		dmca = {&lt;br /&gt;
			description = &#039;For pages protected by the Wikimedia Foundation&#039;&lt;br /&gt;
				.. &#039; due to [[Digital Millennium Copyright Act]] takedown requests&#039;,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;Pursuant to a rights owner notice under the Digital&#039;&lt;br /&gt;
					.. &#039; Millennium Copyright Act (DMCA) regarding some content&#039;&lt;br /&gt;
					.. &#039; in this article, the Wikimedia Foundation acted under&#039;&lt;br /&gt;
					.. &#039; applicable law and took down and restricted the content&#039;&lt;br /&gt;
					.. &#039; in question.&#039;&lt;br /&gt;
				if args.notice then&lt;br /&gt;
					ret = ret .. &#039; A copy of the received notice can be found here: &#039;&lt;br /&gt;
						.. args.notice .. &#039;.&#039;&lt;br /&gt;
				end&lt;br /&gt;
				ret = ret .. &#039; For more information, including websites discussing&#039;&lt;br /&gt;
					.. &#039; how to file a counter-notice, please see&#039;&lt;br /&gt;
					.. &amp;quot; [[Wikipedia:Office actions]] and the article&#039;s ${TALKPAGE}.&amp;quot;&lt;br /&gt;
					.. &amp;quot;&#039;&#039;&#039;Do not remove this template from the article until the&amp;quot;&lt;br /&gt;
					.. &amp;quot; restrictions are withdrawn&#039;&#039;&#039;.&amp;quot;&lt;br /&gt;
				return ret&lt;br /&gt;
			end,&lt;br /&gt;
			image = &#039;Office-protection-shackle.svg&#039;,&lt;br /&gt;
			link = &#039;Wikipedia:Protection policy#office&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		dispute = {&lt;br /&gt;
			description = &#039;For pages protected due to editing disputes&#039;,&lt;br /&gt;
			text = function (protectionObj, args)&lt;br /&gt;
				-- Find the value of &amp;quot;disputes&amp;quot;.&lt;br /&gt;
				local display = &#039;disputes&#039;&lt;br /&gt;
				local disputes&lt;br /&gt;
				if args.section then&lt;br /&gt;
					disputes = string.format(&lt;br /&gt;
						&#039;[[%s:%s#%s|%s]]&#039;,&lt;br /&gt;
						mw.site.namespaces[protectionObj.title.namespace].talk.name,&lt;br /&gt;
						protectionObj.title.text,&lt;br /&gt;
						args.section,&lt;br /&gt;
						display&lt;br /&gt;
					)&lt;br /&gt;
				else&lt;br /&gt;
					disputes = display&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- Make the blurb, depending on the expiry.&lt;br /&gt;
				local msg&lt;br /&gt;
				if type(protectionObj.expiry) == &#039;number&#039; then&lt;br /&gt;
					msg = &#039;${INTROFRAGMENT} or until editing %s have been resolved.&#039;&lt;br /&gt;
				else&lt;br /&gt;
					msg = &#039;${INTROFRAGMENT} until editing %s have been resolved.&#039;&lt;br /&gt;
				end&lt;br /&gt;
				return string.format(msg, disputes)&lt;br /&gt;
			end,&lt;br /&gt;
			explanation = &amp;quot;This protection is &#039;&#039;&#039;not&#039;&#039;&#039; an endorsement of the&amp;quot;&lt;br /&gt;
				.. &#039; ${CURRENTVERSION}. ${EXPLANATIONBLURB}&#039;,&lt;br /&gt;
			tooltip = &#039;${TOOLTIPFRAGMENT} due to editing disputes&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		ecp = {&lt;br /&gt;
			description = &#039;For articles in topic areas authorized by&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Arbitration Committee|ArbCom]] or&#039;&lt;br /&gt;
				.. &#039; meets the criteria for community use&#039;,&lt;br /&gt;
			alt = &#039;Extended-protected ${PAGETYPE}&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		mainpage = {&lt;br /&gt;
			description = &#039;For pages protected for being displayed on the [[Main Page]]&#039;,&lt;br /&gt;
			text = &#039;This file is currently&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:This page is protected|protected]] from&#039;&lt;br /&gt;
				.. &#039; editing because it is currently or will soon be displayed&#039;&lt;br /&gt;
				.. &#039; on the [[Main Page]].&#039;,&lt;br /&gt;
			explanation = &#039;Images on the Main Page are protected due to their high&#039;&lt;br /&gt;
				.. &#039; visibility. Please discuss any necessary changes on the ${TALKPAGE}.&#039;&lt;br /&gt;
				.. &#039;&amp;lt;br /&amp;gt;&amp;lt;span style=&amp;quot;font-size:90%;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
				.. &amp;quot;&#039;&#039;&#039;Administrators:&#039;&#039;&#039; Once this image is definitely off the Main Page,&amp;quot;&lt;br /&gt;
				.. &#039; please unprotect this file, or reduce to semi-protection,&#039;&lt;br /&gt;
				.. &#039; as appropriate.&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		office = {&lt;br /&gt;
			description = &#039;For pages protected by the Wikimedia Foundation&#039;,&lt;br /&gt;
			text = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;This ${PAGETYPE} is currently under the&#039;&lt;br /&gt;
					.. &#039; scrutiny of the&#039;&lt;br /&gt;
					.. &#039; [[Wikipedia:Office actions|Wikimedia Foundation Office]]&#039;&lt;br /&gt;
					.. &#039; and is protected.&#039;&lt;br /&gt;
				if protectionObj.protectionDate then&lt;br /&gt;
					ret = ret .. &#039; It has been protected since ${PROTECTIONDATE}.&#039;&lt;br /&gt;
				end&lt;br /&gt;
				return ret&lt;br /&gt;
			end,&lt;br /&gt;
			explanation = &amp;quot;If you can edit this page, please discuss all changes and&amp;quot;&lt;br /&gt;
				.. &amp;quot; additions on the ${TALKPAGE} first. &#039;&#039;&#039;Do not remove protection from this&amp;quot;&lt;br /&gt;
				.. &amp;quot; page unless you are authorized by the Wikimedia Foundation to do&amp;quot;&lt;br /&gt;
				.. &amp;quot; so.&#039;&#039;&#039;&amp;quot;,&lt;br /&gt;
			image = &#039;Office-protection-shackle.svg&#039;,&lt;br /&gt;
			link = &#039;Wikipedia:Protection policy#office&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		reset = {&lt;br /&gt;
			description = &#039;For pages protected by the Wikimedia Foundation and&#039;&lt;br /&gt;
				.. &#039; &amp;quot;reset&amp;quot; to a bare-bones version&#039;,&lt;br /&gt;
 			text = &#039;This ${PAGETYPE} is currently under the&#039;&lt;br /&gt;
					.. &#039; scrutiny of the&#039;&lt;br /&gt;
					.. &#039; [[Wikipedia:Office actions|Wikimedia Foundation Office]]&#039;&lt;br /&gt;
					.. &#039; and is protected.&#039;,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;&#039;&lt;br /&gt;
				if protectionObj.protectionDate then&lt;br /&gt;
					ret = ret .. &#039;On ${PROTECTIONDATE} this ${PAGETYPE} was&#039;&lt;br /&gt;
				else&lt;br /&gt;
					ret = ret .. &#039;This ${PAGETYPE} has been&#039;&lt;br /&gt;
				end&lt;br /&gt;
				ret = ret .. &#039; reduced to a&#039;&lt;br /&gt;
				.. &#039; simplified, &amp;quot;bare bones&amp;quot; version so that it may be completely&#039;&lt;br /&gt;
				.. &#039; rewritten to ensure it meets the policies of&#039;&lt;br /&gt;
				.. &#039; [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].&#039;&lt;br /&gt;
				.. &#039; Standard Wikipedia policies will apply to its rewriting—which&#039;&lt;br /&gt;
				.. &#039; will eventually be open to all editors—and will be strictly&#039;&lt;br /&gt;
				.. &#039; enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while&#039;&lt;br /&gt;
				.. &#039; it is being rebuilt.\n\n&#039;&lt;br /&gt;
				.. &#039;Any insertion of material directly from&#039;&lt;br /&gt;
				.. &#039; pre-protection revisions of the ${PAGETYPE} will be removed, as&#039;&lt;br /&gt;
				.. &#039; will any material added to the ${PAGETYPE} that is not properly&#039;&lt;br /&gt;
				.. &#039; sourced. The associated talk page(s) were also cleared on the&#039;&lt;br /&gt;
				.. &amp;quot; same date.\n\n&amp;quot;&lt;br /&gt;
				.. &amp;quot;If you can edit this page, please discuss all changes and&amp;quot;&lt;br /&gt;
				.. &amp;quot; additions on the ${TALKPAGE} first. &#039;&#039;&#039;Do not override&amp;quot;&lt;br /&gt;
				.. &amp;quot; this action, and do not remove protection from this page,&amp;quot;&lt;br /&gt;
				.. &amp;quot; unless you are authorized by the Wikimedia Foundation&amp;quot;&lt;br /&gt;
				.. &amp;quot; to do so. No editor may remove this notice.&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				return ret&lt;br /&gt;
			end,&lt;br /&gt;
			image = &#039;Office-protection-shackle.svg&#039;,&lt;br /&gt;
			link = &#039;Wikipedia:Protection policy#office&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		sock = {&lt;br /&gt;
			description = &#039;For pages protected due to&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Sock puppetry|sock puppetry]]&#039;,&lt;br /&gt;
			text = &#039;${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Blocking policy|blocked]] or&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Banning policy|banned users]]&#039;&lt;br /&gt;
				.. &#039; from editing it.&#039;,&lt;br /&gt;
			tooltip = &#039;${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from&#039;&lt;br /&gt;
				.. &#039; editing it&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		template = {&lt;br /&gt;
			description = &#039;For [[Wikipedia:High-risk templates|high-risk]]&#039;&lt;br /&gt;
				.. &#039; templates and Lua modules&#039;,&lt;br /&gt;
			text = &#039;This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},&#039;&lt;br /&gt;
				.. &#039; as it is [[Wikipedia:High-risk templates|high-risk]].&#039;,&lt;br /&gt;
			explanation = &#039;Please discuss any changes on the ${TALKPAGE}; you may&#039;&lt;br /&gt;
				.. &#039; ${EDITREQUEST} to ask an&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Administrators|administrator]] or&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Template editor|template editor]] to make an edit if&#039;&lt;br /&gt;
				.. &#039; it is [[Help:Minor edit#When to mark an edit as a minor edit&#039;&lt;br /&gt;
				.. &#039;|uncontroversial]] or supported by&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Consensus|consensus]]. You can also&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection|request]] that the page be&#039;&lt;br /&gt;
				.. &#039; unprotected.&#039;,&lt;br /&gt;
			tooltip = &#039;This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}&#039;&lt;br /&gt;
				.. &#039; to prevent vandalism&#039;,&lt;br /&gt;
			alt = &#039;Permanently protected ${PAGETYPE}&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		usertalk = {&lt;br /&gt;
			description = &#039;For pages protected against disruptive edits by a&#039;&lt;br /&gt;
				.. &#039; particular user&#039;,&lt;br /&gt;
			text = &#039;${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,&#039;&lt;br /&gt;
				.. &#039; such as abusing the&#039;&lt;br /&gt;
				.. &#039; &amp;amp;#123;&amp;amp;#123;[[Template:unblock|unblock]]&amp;amp;#125;&amp;amp;#125; template.&#039;,&lt;br /&gt;
			explanation = &#039;If you cannot edit this user talk page and you need to&#039;&lt;br /&gt;
				.. &#039; make a change or leave a message, you can&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for edits to a protected page&#039;&lt;br /&gt;
				.. &#039;|request an edit]],&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request unprotection]],&#039;&lt;br /&gt;
				.. &#039; [[Special:Userlogin|log in]],&#039;&lt;br /&gt;
				.. &#039; or [[Special:UserLogin/signup|create an account]].&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		vandalism = {&lt;br /&gt;
			description = &#039;For pages protected against&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Vandalism|vandalism]]&#039;,&lt;br /&gt;
			text = &#039;${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].&#039;,&lt;br /&gt;
			explanation = function (protectionObj, args)&lt;br /&gt;
				local ret = &#039;&#039;&lt;br /&gt;
				if protectionObj.level == &#039;sysop&#039; then&lt;br /&gt;
					ret = ret .. &amp;quot;This protection is &#039;&#039;&#039;not&#039;&#039;&#039; an endorsement of the&amp;quot;&lt;br /&gt;
						.. &#039; ${CURRENTVERSION}. &#039;&lt;br /&gt;
				end&lt;br /&gt;
				return ret .. &#039;${EXPLANATIONBLURB}&#039;&lt;br /&gt;
			end,&lt;br /&gt;
			tooltip = &#039;${TOOLTIPFRAGMENT} due to vandalism&#039;,&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		dispute = {&lt;br /&gt;
			description = &#039;For pages protected against page moves due to&#039;&lt;br /&gt;
				.. &#039; disputes over the page title&#039;,&lt;br /&gt;
			explanation = &amp;quot;This protection is &#039;&#039;&#039;not&#039;&#039;&#039; an endorsement of the&amp;quot;&lt;br /&gt;
				.. &#039; ${CURRENTVERSION}. ${EXPLANATIONBLURB}&#039;,&lt;br /&gt;
			image = &#039;Move-protection-shackle.svg&#039;&lt;br /&gt;
		},&lt;br /&gt;
		vandalism = {&lt;br /&gt;
			description = &#039;For pages protected against&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Vandalism#Page-move vandalism&#039;&lt;br /&gt;
				.. &#039; |page-move vandalism]]&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {},&lt;br /&gt;
	upload = {}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                            GENERAL DATA TABLES&lt;br /&gt;
--&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection blurbs&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the protection blurbs available with the&lt;br /&gt;
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and&lt;br /&gt;
-- protection level, and is checked by the module in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
protectionBlurbs = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|&#039;&lt;br /&gt;
			.. &#039;protected]] from editing&#039;,&lt;br /&gt;
		templateeditor = &#039;This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template&#039;&lt;br /&gt;
			.. &#039;|protected]] from editing&#039;,&lt;br /&gt;
		autoconfirmed = &#039;Editing of this ${PAGETYPE} by [[Wikipedia:User access&#039;&lt;br /&gt;
			.. &#039; levels#New users|new]] or [[Wikipedia:User access levels#Unregistered&#039;&lt;br /&gt;
			.. &#039; users|unregistered]] users is currently [[Wikipedia:Protection&#039;&lt;br /&gt;
			.. &#039; policy#semi|disabled]]&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;This ${PAGETYPE} is currently under [[Wikipedia:Protection&#039;&lt;br /&gt;
			.. &#039; policy#extended|extended confirmed protection]]&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move&#039;&lt;br /&gt;
			.. &#039; protection|protected]] from [[Help:Moving a page|page moves]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;All edits made to this ${PAGETYPE} by&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:User access levels#New users|new]] or&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:User access levels#Unregistered users|unregistered]]&#039;&lt;br /&gt;
			.. &#039; users are currently&#039;&lt;br /&gt;
			.. &#039; [[Wikipedia:Pending changes|subject to review]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;Uploading new versions of this ${PAGETYPE} is currently disabled&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Explanation blurbs&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the explanation blurbs available with the&lt;br /&gt;
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,&lt;br /&gt;
-- protection level, and whether the page is a talk page or not. If the page is&lt;br /&gt;
-- a talk page it will have a talk key of &amp;quot;talk&amp;quot;; otherwise it will have a talk&lt;br /&gt;
-- key of &amp;quot;subject&amp;quot;. The table is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level, page&#039;s talk key&lt;br /&gt;
-- 2. page&#039;s protection action, page&#039;s protection level, default talk key&lt;br /&gt;
-- 3. page&#039;s protection action, default protection level, page&#039;s talk key&lt;br /&gt;
-- 4. page&#039;s protection action, default protection level, default talk key&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
explanationBlurbs = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		autoconfirmed = {&lt;br /&gt;
			subject = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details. If you&#039;&lt;br /&gt;
				.. &#039; cannot edit this ${PAGETYPE} and you wish to make a change, you can&#039;&lt;br /&gt;
				.. &#039; ${EDITREQUEST}, discuss changes on the ${TALKPAGE},&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request unprotection]], [[Special:Userlogin|log in]], or&#039;&lt;br /&gt;
				.. &#039; [[Special:UserLogin/signup|create an account]].&#039;,&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details. If you&#039;&lt;br /&gt;
				.. &#039; cannot edit this ${PAGETYPE} and you wish to make a change, you can&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request unprotection]], [[Special:Userlogin|log in]], or&#039;&lt;br /&gt;
				.. &#039; [[Special:UserLogin/signup|create an account]].&#039;,&lt;br /&gt;
		},&lt;br /&gt;
		extendedconfirmed = {&lt;br /&gt;
			default = &#039;Extended confirmed protection prevents edits from all unregistered editors&#039;&lt;br /&gt;
				.. &#039; and registered users with fewer than 30 days tenure and 500 edits.&#039;&lt;br /&gt;
				.. &#039; The [[Wikipedia:Protection policy#extended|policy on community use]]&#039;&lt;br /&gt;
				.. &#039; specifies that extended confirmed protection can be applied to combat&#039;&lt;br /&gt;
				.. &#039; disruption, if semi-protection has proven to be ineffective.&#039;&lt;br /&gt;
				.. &#039; Extended confirmed protection may also be applied to enforce&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Arbitration Committee|arbitration sanctions]].&#039;&lt;br /&gt;
				.. &#039; Please discuss any changes on the ${TALKPAGE}; you may&#039;&lt;br /&gt;
				.. &#039; ${EDITREQUEST} to ask for uncontroversial changes supported by&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Consensus|consensus]].&#039;&lt;br /&gt;
		},&lt;br /&gt;
		default = {&lt;br /&gt;
			subject = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; Please discuss any changes on the ${TALKPAGE}; you&#039;&lt;br /&gt;
				.. &#039; may ${EDITREQUEST} to ask an&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Administrators|administrator]] to make an edit if it&#039;&lt;br /&gt;
				.. &#039; is [[Help:Minor edit#When to mark an edit as a minor edit&#039;&lt;br /&gt;
				.. &#039;|uncontroversial]] or supported by [[Wikipedia:Consensus&#039;&lt;br /&gt;
				.. &#039;|consensus]]. You may also [[Wikipedia:Requests for&#039;&lt;br /&gt;
				.. &#039; page protection#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request]] that this page be unprotected.&#039;,&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; You may [[Wikipedia:Requests for page&#039;&lt;br /&gt;
				.. &#039; protection#Current requests for edits to a protected page|request an&#039;&lt;br /&gt;
				.. &#039; edit]] to this page, or [[Wikipedia:Requests for&#039;&lt;br /&gt;
				.. &#039; page protection#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|ask]] for it to be unprotected.&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = {&lt;br /&gt;
			subject = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; The page may still be edited but cannot be moved&#039;&lt;br /&gt;
				.. &#039; until unprotected. Please discuss any suggested moves on the&#039;&lt;br /&gt;
				.. &#039; ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection|request]] that the page be&#039;&lt;br /&gt;
				.. &#039; unprotected.&#039;,&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; The page may still be edited but cannot be moved&#039;&lt;br /&gt;
				.. &#039; until unprotected. Please discuss any suggested moves at&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requested moves]]. You can also&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection|request]] that the page be&#039;&lt;br /&gt;
				.. &#039; unprotected.&#039;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = {&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; Edits to this ${PAGETYPE} by new and unregistered users&#039;&lt;br /&gt;
				.. &#039; will not be visible to readers until they are accepted by&#039;&lt;br /&gt;
				.. &#039; a reviewer. To avoid the need for your edits to be&#039;&lt;br /&gt;
				.. &#039; reviewed, you may&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Requests for page protection&#039;&lt;br /&gt;
				.. &#039;#Current requests for reduction in protection level&#039;&lt;br /&gt;
				.. &#039;|request unprotection]], [[Special:Userlogin|log in]], or&#039;&lt;br /&gt;
				.. &#039; [[Special:UserLogin/signup|create an account]].&#039;&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = {&lt;br /&gt;
			default = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
				.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
				.. &#039; The page may still be edited but new versions of the file&#039;&lt;br /&gt;
				.. &#039; cannot be uploaded until it is unprotected. You can&#039;&lt;br /&gt;
				.. &#039; request that a new version be uploaded by using a&#039;&lt;br /&gt;
				.. &#039; [[Wikipedia:Edit requests|protected edit request]], or you&#039;&lt;br /&gt;
				.. &#039; can  [[Wikipedia:Requests for page protection|request]]&#039;&lt;br /&gt;
				.. &#039; that the file be unprotected.&#039;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection levels&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which&lt;br /&gt;
-- produces a short label for different protection levels. It is sorted by&lt;br /&gt;
-- protection action and protection level, and is checked in the following&lt;br /&gt;
-- order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
protectionLevels = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;protected&#039;,&lt;br /&gt;
		templateeditor = &#039;template-protected&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;extended-confirmed-protected&#039;,&lt;br /&gt;
		autoconfirmed = &#039;semi-protected&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;move-protected&#039;&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;upload-protected&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Images&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table lists different padlock images for each protection action and&lt;br /&gt;
-- protection level. It is used if an image is not specified in any of the&lt;br /&gt;
-- banner data tables, and if the page does not satisfy the conditions for using&lt;br /&gt;
-- the [&#039;image-filename-indef&#039;] image. It is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
images = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;Full-protection-shackle.svg&#039;,&lt;br /&gt;
		templateeditor = &#039;Template-protection-shackle.svg&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Extended-protection-shackle.svg&#039;,&lt;br /&gt;
		autoconfirmed = &#039;Semi-protection-shackle.svg&#039;&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;Move-protection-shackle.svg&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;Pending-protection-shackle.svg&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;Upload-protection-shackle.svg&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- Pages with a reason specified in this table will show the special &amp;quot;indef&amp;quot;&lt;br /&gt;
-- padlock, defined in the &#039;image-filename-indef&#039; message, if no expiry is set.&lt;br /&gt;
indefImageReasons = {&lt;br /&gt;
	template = true&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Image links&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the data for the ${IMAGELINK} parameter, which gets&lt;br /&gt;
-- the image link for small padlock icons based on the page&#039;s protection action&lt;br /&gt;
-- and protection level. It is checked in the following order:&lt;br /&gt;
-- 1. page&#039;s protection action, page&#039;s protection level&lt;br /&gt;
-- 2. page&#039;s protection action, default protection level&lt;br /&gt;
-- 3. &amp;quot;edit&amp;quot; protection action, default protection level&lt;br /&gt;
--&lt;br /&gt;
-- It is possible to use banner parameters inside this table.&lt;br /&gt;
-- *required* - this table needs edit, move, autoreview and upload subtables.&lt;br /&gt;
imageLinks = {&lt;br /&gt;
	edit = {&lt;br /&gt;
		default = &#039;Wikipedia:Protection policy#full&#039;,&lt;br /&gt;
		templateeditor = &#039;Wikipedia:Protection policy#template&#039;,&lt;br /&gt;
		extendedconfirmed = &#039;Wikipedia:Protection policy#extended&#039;,&lt;br /&gt;
		autoconfirmed = &#039;Wikipedia:Protection policy#semi&#039;&lt;br /&gt;
	},&lt;br /&gt;
	move = {&lt;br /&gt;
		default = &#039;Wikipedia:Protection policy#move&#039;&lt;br /&gt;
	},&lt;br /&gt;
	autoreview = {&lt;br /&gt;
		default = &#039;Wikipedia:Protection policy#pending&#039;&lt;br /&gt;
	},&lt;br /&gt;
	upload = {&lt;br /&gt;
		default = &#039;Wikipedia:Protection policy#upload&#039;&lt;br /&gt;
	}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Padlock indicator names&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table provides the &amp;quot;name&amp;quot; attribute for the &amp;lt;indicator&amp;gt; extension tag&lt;br /&gt;
-- with which small padlock icons are generated. All indicator tags on a page&lt;br /&gt;
-- are displayed in alphabetical order based on this attribute, and with&lt;br /&gt;
-- indicator tags with duplicate names, the last tag on the page wins.&lt;br /&gt;
-- The attribute is chosen based on the protection action; table keys must be a&lt;br /&gt;
-- protection action name or the string &amp;quot;default&amp;quot;.&lt;br /&gt;
padlockIndicatorNames = {&lt;br /&gt;
	autoreview = &#039;pp-autoreview&#039;,&lt;br /&gt;
	default = &#039;pp-default&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection categories&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- The protection categories are stored in the protectionCategories table.&lt;br /&gt;
-- Keys to this table are made up of the following strings:&lt;br /&gt;
--&lt;br /&gt;
-- 1. the expiry date&lt;br /&gt;
-- 2. the namespace&lt;br /&gt;
-- 3. the protection reason (e.g. &amp;quot;dispute&amp;quot; or &amp;quot;vandalism&amp;quot;)&lt;br /&gt;
-- 4. the protection level (e.g. &amp;quot;sysop&amp;quot; or &amp;quot;autoconfirmed&amp;quot;)&lt;br /&gt;
-- 5. the action (e.g. &amp;quot;edit&amp;quot; or &amp;quot;move&amp;quot;)&lt;br /&gt;
-- &lt;br /&gt;
-- When the module looks up a category in the table, first it will will check to&lt;br /&gt;
-- see a key exists that corresponds to all five parameters. For example, a&lt;br /&gt;
-- user page semi-protected from vandalism for two weeks would have the key&lt;br /&gt;
-- &amp;quot;temp-user-vandalism-autoconfirmed-edit&amp;quot;. If no match is found, the module&lt;br /&gt;
-- changes the first part of the key to &amp;quot;all&amp;quot; and checks the table again. It&lt;br /&gt;
-- keeps checking increasingly generic key combinations until it finds the&lt;br /&gt;
-- field, or until it reaches the key &amp;quot;all-all-all-all-all&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- The module uses a binary matrix to determine the order in which to search.&lt;br /&gt;
-- This is best demonstrated by a table. In this table, the &amp;quot;0&amp;quot; values&lt;br /&gt;
-- represent &amp;quot;all&amp;quot;, and the &amp;quot;1&amp;quot; values represent the original data (e.g.&lt;br /&gt;
-- &amp;quot;indef&amp;quot; or &amp;quot;file&amp;quot; or &amp;quot;vandalism&amp;quot;).&lt;br /&gt;
--&lt;br /&gt;
--        expiry    namespace reason   level     action&lt;br /&gt;
-- order&lt;br /&gt;
-- 1      1         1         1        1         1&lt;br /&gt;
-- 2      0         1         1        1         1&lt;br /&gt;
-- 3      1         0         1        1         1&lt;br /&gt;
-- 4      0         0         1        1         1&lt;br /&gt;
-- 5      1         1         0        1         1&lt;br /&gt;
-- 6      0         1         0        1         1&lt;br /&gt;
-- 7      1         0         0        1         1&lt;br /&gt;
-- 8      0         0         0        1         1&lt;br /&gt;
-- 9      1         1         1        0         1&lt;br /&gt;
-- 10     0         1         1        0         1&lt;br /&gt;
-- 11     1         0         1        0         1&lt;br /&gt;
-- 12     0         0         1        0         1&lt;br /&gt;
-- 13     1         1         0        0         1&lt;br /&gt;
-- 14     0         1         0        0         1&lt;br /&gt;
-- 15     1         0         0        0         1&lt;br /&gt;
-- 16     0         0         0        0         1&lt;br /&gt;
-- 17     1         1         1        1         0&lt;br /&gt;
-- 18     0         1         1        1         0&lt;br /&gt;
-- 19     1         0         1        1         0&lt;br /&gt;
-- 20     0         0         1        1         0&lt;br /&gt;
-- 21     1         1         0        1         0&lt;br /&gt;
-- 22     0         1         0        1         0&lt;br /&gt;
-- 23     1         0         0        1         0&lt;br /&gt;
-- 24     0         0         0        1         0&lt;br /&gt;
-- 25     1         1         1        0         0&lt;br /&gt;
-- 26     0         1         1        0         0&lt;br /&gt;
-- 27     1         0         1        0         0&lt;br /&gt;
-- 28     0         0         1        0         0&lt;br /&gt;
-- 29     1         1         0        0         0&lt;br /&gt;
-- 30     0         1         0        0         0&lt;br /&gt;
-- 31     1         0         0        0         0&lt;br /&gt;
-- 32     0         0         0        0         0&lt;br /&gt;
--&lt;br /&gt;
-- In this scheme the action has the highest priority, as it is the last&lt;br /&gt;
-- to change, and the expiry has the least priority, as it changes the most.&lt;br /&gt;
-- The priorities of the expiry, the protection level and the action are&lt;br /&gt;
-- fixed, but the priorities of the reason and the namespace can be swapped&lt;br /&gt;
-- through the use of the cfg.bannerDataNamespaceHasPriority table.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- If the reason specified to the template is listed in this table,&lt;br /&gt;
-- namespace data will take priority over reason data in the protectionCategories&lt;br /&gt;
-- table.&lt;br /&gt;
reasonsWithNamespacePriority = {&lt;br /&gt;
	vandalism = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-- The string to use as a namespace key for the protectionCategories table for each&lt;br /&gt;
-- namespace number.&lt;br /&gt;
categoryNamespaceKeys = {&lt;br /&gt;
	[  2] = &#039;user&#039;,&lt;br /&gt;
	[  3] = &#039;user&#039;,&lt;br /&gt;
	[  4] = &#039;project&#039;,&lt;br /&gt;
	[  6] = &#039;file&#039;,&lt;br /&gt;
	[  8] = &#039;mediawiki&#039;,&lt;br /&gt;
	[ 10] = &#039;template&#039;,&lt;br /&gt;
	[ 12] = &#039;project&#039;,&lt;br /&gt;
	[ 14] = &#039;category&#039;,&lt;br /&gt;
	[100] = &#039;portal&#039;,&lt;br /&gt;
	[828] = &#039;module&#039;,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
protectionCategories = {&lt;br /&gt;
	[&#039;all|all|all|all|all&#039;]                     = &#039;Wikipedia fully protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|office|all|all&#039;]                  = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|reset|all|all&#039;]                   = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|dmca|all|all&#039;]                    = &#039;Wikipedia Office-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|mainpage|all|all&#039;]                = &#039;Wikipedia fully protected main page files&#039;,&lt;br /&gt;
	[&#039;all|all|all|extendedconfirmed|all&#039;]       = &#039;Wikipedia extended-confirmed-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|ecp|extendedconfirmed|all&#039;]       = &#039;Wikipedia extended-confirmed-protected pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|all|edit&#039;]               = &#039;Wikipedia fully protected templates&#039;,&lt;br /&gt;
	[&#039;all|all|all|autoconfirmed|edit&#039;]          = &#039;Wikipedia semi-protected pages&#039;,&lt;br /&gt;
	[&#039;indef|all|all|autoconfirmed|edit&#039;]        = &#039;Wikipedia indefinitely semi-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|blp|autoconfirmed|edit&#039;]          = &#039;Wikipedia indefinitely semi-protected biographies of living people&#039;,&lt;br /&gt;
	[&#039;temp|all|blp|autoconfirmed|edit&#039;]         = &#039;Wikipedia temporarily semi-protected biographies of living people&#039;,&lt;br /&gt;
	[&#039;all|all|dispute|autoconfirmed|edit&#039;]      = &#039;Wikipedia pages semi-protected due to dispute&#039;,&lt;br /&gt;
	[&#039;all|all|sock|autoconfirmed|edit&#039;]         = &#039;Wikipedia pages semi-protected from banned users&#039;,&lt;br /&gt;
	[&#039;all|all|vandalism|autoconfirmed|edit&#039;]    = &#039;Wikipedia pages semi-protected against vandalism&#039;,&lt;br /&gt;
	[&#039;all|category|all|autoconfirmed|edit&#039;]     = &#039;Wikipedia semi-protected categories&#039;,&lt;br /&gt;
	[&#039;all|file|all|autoconfirmed|edit&#039;]         = &#039;Wikipedia semi-protected files&#039;,&lt;br /&gt;
	[&#039;all|portal|all|autoconfirmed|edit&#039;]       = &#039;Wikipedia semi-protected portals&#039;,&lt;br /&gt;
	[&#039;all|project|all|autoconfirmed|edit&#039;]      = &#039;Wikipedia semi-protected project pages&#039;,&lt;br /&gt;
	[&#039;all|talk|all|autoconfirmed|edit&#039;]         = &#039;Wikipedia semi-protected talk pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|autoconfirmed|edit&#039;]     = &#039;Wikipedia semi-protected templates&#039;,&lt;br /&gt;
	[&#039;all|user|all|autoconfirmed|edit&#039;]         = &#039;Wikipedia semi-protected user and user talk pages&#039;,&lt;br /&gt;
	[&#039;all|all|all|templateeditor|move&#039;]         = &#039;Wikipedia template-protected pages other than templates and modules&#039;,&lt;br /&gt;
	[&#039;all|all|all|templateeditor|edit&#039;]         = &#039;Wikipedia template-protected pages other than templates and modules&#039;,&lt;br /&gt;
	[&#039;all|template|all|templateeditor|edit&#039;]    = &#039;Wikipedia template-protected templates&#039;,&lt;br /&gt;
	[&#039;all|template|all|templateeditor|move&#039;]    = &#039;Wikipedia template-protected templates&#039;, -- move-protected templates&lt;br /&gt;
	[&#039;all|all|blp|sysop|edit&#039;]                  = &#039;Wikipedia indefinitely protected biographies of living people&#039;,&lt;br /&gt;
	[&#039;temp|all|blp|sysop|edit&#039;]                 = &#039;Wikipedia temporarily protected biographies of living people&#039;,&lt;br /&gt;
	[&#039;all|all|dispute|sysop|edit&#039;]              = &#039;Wikipedia pages protected due to dispute&#039;,&lt;br /&gt;
	[&#039;all|all|sock|sysop|edit&#039;]                 = &#039;Wikipedia pages protected from banned users&#039;,&lt;br /&gt;
	[&#039;all|all|vandalism|sysop|edit&#039;]            = &#039;Wikipedia pages protected against vandalism&#039;,&lt;br /&gt;
	[&#039;all|category|all|sysop|edit&#039;]             = &#039;Wikipedia fully protected categories&#039;,&lt;br /&gt;
	[&#039;all|file|all|sysop|edit&#039;]                 = &#039;Wikipedia fully protected files&#039;,&lt;br /&gt;
	[&#039;all|project|all|sysop|edit&#039;]              = &#039;Wikipedia fully protected project pages&#039;,&lt;br /&gt;
	[&#039;all|talk|all|sysop|edit&#039;]                 = &#039;Wikipedia fully protected talk pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|extendedconfirmed|edit&#039;] = &#039;Wikipedia extended-confirmed-protected templates&#039;,&lt;br /&gt;
	[&#039;all|template|all|extendedconfirmed|move&#039;] = &#039;Wikipedia extended-confirmed-protected templates&#039;,&lt;br /&gt;
	[&#039;all|template|all|sysop|edit&#039;]             = &#039;Wikipedia fully protected templates&#039;,&lt;br /&gt;
	[&#039;all|user|all|sysop|edit&#039;]                 = &#039;Wikipedia fully protected user and user talk pages&#039;,&lt;br /&gt;
	[&#039;all|module|all|all|edit&#039;]                 = &#039;Wikipedia fully protected modules&#039;,&lt;br /&gt;
	[&#039;all|module|all|templateeditor|edit&#039;]      = &#039;Wikipedia template-protected modules&#039;,&lt;br /&gt;
	[&#039;all|module|all|extendedconfirmed|edit&#039;]   = &#039;Wikipedia extended-confirmed-protected modules&#039;,&lt;br /&gt;
	[&#039;all|module|all|autoconfirmed|edit&#039;]       = &#039;Wikipedia semi-protected modules&#039;,&lt;br /&gt;
	[&#039;all|all|all|sysop|move&#039;]                  = &#039;Wikipedia move-protected pages&#039;,&lt;br /&gt;
	[&#039;indef|all|all|sysop|move&#039;]                = &#039;Wikipedia indefinitely move-protected pages&#039;,&lt;br /&gt;
	[&#039;all|all|dispute|sysop|move&#039;]              = &#039;Wikipedia pages move-protected due to dispute&#039;,&lt;br /&gt;
	[&#039;all|all|vandalism|sysop|move&#039;]            = &#039;Wikipedia pages move-protected due to vandalism&#039;,&lt;br /&gt;
	[&#039;all|portal|all|sysop|move&#039;]               = &#039;Wikipedia move-protected portals&#039;,&lt;br /&gt;
	[&#039;all|project|all|sysop|move&#039;]              = &#039;Wikipedia move-protected project pages&#039;,&lt;br /&gt;
	[&#039;all|talk|all|sysop|move&#039;]                 = &#039;Wikipedia move-protected talk pages&#039;,&lt;br /&gt;
	[&#039;all|template|all|sysop|move&#039;]             = &#039;Wikipedia move-protected templates&#039;,&lt;br /&gt;
	[&#039;all|user|all|sysop|move&#039;]                 = &#039;Wikipedia move-protected user and user talk pages&#039;,&lt;br /&gt;
	[&#039;all|all|all|autoconfirmed|autoreview&#039;]    = &#039;Wikipedia pending changes protected pages&#039;,&lt;br /&gt;
	[&#039;all|file|all|all|upload&#039;]                 = &#039;Wikipedia upload-protected files&#039;,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Expiry category config&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table configures the expiry category behaviour for each protection&lt;br /&gt;
-- action.&lt;br /&gt;
-- * If set to true, setting that action will always categorise the page if&lt;br /&gt;
--   an expiry parameter is not set.&lt;br /&gt;
-- * If set to false, setting that action will never categorise the page.&lt;br /&gt;
-- * If set to nil, the module will categorise the page if:&lt;br /&gt;
--   1) an expiry parameter is not set, and&lt;br /&gt;
--   2) a reason is provided, and&lt;br /&gt;
--   3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck&lt;br /&gt;
--      table.&lt;br /&gt;
&lt;br /&gt;
expiryCheckActions = {&lt;br /&gt;
	edit = nil,&lt;br /&gt;
	move = false,&lt;br /&gt;
	autoreview = true,&lt;br /&gt;
	upload = false&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
reasonsWithoutExpiryCheck = {&lt;br /&gt;
	blp = true,&lt;br /&gt;
	template = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Pagetypes&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table produces the page types available with the ${PAGETYPE} parameter.&lt;br /&gt;
-- Keys are namespace numbers, or the string &amp;quot;default&amp;quot; for the default value.&lt;br /&gt;
pagetypes = {&lt;br /&gt;
	[0] = &#039;article&#039;,&lt;br /&gt;
	[6] = &#039;file&#039;,&lt;br /&gt;
	[10] = &#039;template&#039;,&lt;br /&gt;
	[14] = &#039;category&#039;,&lt;br /&gt;
	[828] = &#039;module&#039;,&lt;br /&gt;
	default = &#039;page&#039;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Strings marking indefinite protection&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table contains values passed to the expiry parameter that mean the page&lt;br /&gt;
-- is protected indefinitely.&lt;br /&gt;
indefStrings = {&lt;br /&gt;
	[&#039;indef&#039;] = true,&lt;br /&gt;
	[&#039;indefinite&#039;] = true,&lt;br /&gt;
	[&#039;indefinitely&#039;] = true,&lt;br /&gt;
	[&#039;infinite&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Group hierarchy&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table maps each group to all groups that have a superset of the original&lt;br /&gt;
-- group&#039;s page editing permissions.&lt;br /&gt;
hierarchy = {&lt;br /&gt;
	sysop = {},&lt;br /&gt;
	reviewer = {&#039;sysop&#039;},&lt;br /&gt;
	filemover = {&#039;sysop&#039;},&lt;br /&gt;
	templateeditor = {&#039;sysop&#039;},&lt;br /&gt;
	extendedconfirmed = {&#039;sysop&#039;},&lt;br /&gt;
	autoconfirmed = {&#039;reviewer&#039;, &#039;filemover&#039;, &#039;templateeditor&#039;, &#039;extendedconfirmed&#039;},&lt;br /&gt;
	user = {&#039;autoconfirmed&#039;},&lt;br /&gt;
	[&#039;*&#039;] = {&#039;user&#039;}&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Wrapper templates and their default arguments&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This table contains wrapper templates used with the module, and their&lt;br /&gt;
-- default arguments. Templates specified in this table should contain the&lt;br /&gt;
-- following invocation, and no other template content:&lt;br /&gt;
--&lt;br /&gt;
-- {{#invoke:Protection banner|main}}&lt;br /&gt;
--&lt;br /&gt;
-- If other content is desired, it can be added between&lt;br /&gt;
-- &amp;lt;noinclude&amp;gt;...&amp;lt;/noinclude&amp;gt; tags.&lt;br /&gt;
--&lt;br /&gt;
-- When a user calls one of these wrapper templates, they will use the&lt;br /&gt;
-- default arguments automatically. However, users can override any of the&lt;br /&gt;
-- arguments.&lt;br /&gt;
wrappers = {&lt;br /&gt;
	[&#039;Template:Protected page&#039;]							= {},&lt;br /&gt;
	[&#039;Template:Extended confirmed–protected&#039;]			= {&#039;ecp&#039;},&lt;br /&gt;
	[&#039;Template:Protected biography of a living person&#039;]	= {&#039;blp&#039;},&lt;br /&gt;
	[&#039;Template:Protected due to a dispute&#039;]				= {&#039;dispute&#039;},&lt;br /&gt;
	[&#039;Template:Move-protected&#039;]							= {action = &#039;move&#039;, catonly = &#039;yes&#039;},&lt;br /&gt;
	[&#039;Template:Move-protected due to a dispute&#039;]		= {&#039;dispute&#039;, action = &#039;move&#039;, catonly = &#039;yes&#039;},&lt;br /&gt;
	[&#039;Template:Move-protected due to vandalism&#039;]		= {&#039;vandalism&#039;, action = &#039;move&#039;, catonly = &#039;yes&#039;},&lt;br /&gt;
	[&#039;Template:Office-protected&#039;]						= {&#039;office&#039;},&lt;br /&gt;
	[&#039;Template:Pending changes–protected&#039;]				= {action = &#039;autoreview&#039;, small = true},&lt;br /&gt;
	[&#039;Template:Semi-protected indefinitely&#039;]			= {small = true},&lt;br /&gt;
	[&#039;Template:Protected due to sockpuppetry&#039;]			= {&#039;sock&#039;},&lt;br /&gt;
	[&#039;Template:Template-protected&#039;]						= {&#039;template&#039;, small = true},&lt;br /&gt;
	[&#039;Template:Upload-protected&#039;]						= {action = &#039;upload&#039;},&lt;br /&gt;
	[&#039;Template:Protected talk page of a blocked user&#039;]	= {&#039;usertalk&#039;},&lt;br /&gt;
	[&#039;Template:Protected due to vandalism&#039;]				= {&#039;vandalism&#039;},&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- &lt;br /&gt;
--                                 MESSAGES&lt;br /&gt;
-- &lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
msg = {&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Intro blurb and intro fragment&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages specify what is produced by the ${INTROBLURB} and&lt;br /&gt;
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the&lt;br /&gt;
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use&lt;br /&gt;
-- intro-blurb-noexpiry or intro-fragment-noexpiry.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;intro-blurb-expiry&#039;] = &#039;${PROTECTIONBLURB} until ${EXPIRY}.&#039;,&lt;br /&gt;
[&#039;intro-blurb-noexpiry&#039;] = &#039;${PROTECTIONBLURB}.&#039;,&lt;br /&gt;
[&#039;intro-fragment-expiry&#039;] = &#039;${PROTECTIONBLURB} until ${EXPIRY},&#039;,&lt;br /&gt;
[&#039;intro-fragment-noexpiry&#039;] = &#039;${PROTECTIONBLURB}&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Tooltip blurb&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.&lt;br /&gt;
-- If the protection is temporary the tooltip-blurb-expiry message is used, and&lt;br /&gt;
-- if not the tooltip-blurb-noexpiry message is used.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;tooltip-blurb-expiry&#039;] = &#039;This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.&#039;,&lt;br /&gt;
[&#039;tooltip-blurb-noexpiry&#039;] = &#039;This ${PAGETYPE} is ${PROTECTIONLEVEL}.&#039;,&lt;br /&gt;
[&#039;tooltip-fragment-expiry&#039;] = &#039;This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},&#039;,&lt;br /&gt;
[&#039;tooltip-fragment-noexpiry&#039;] = &#039;This ${PAGETYPE} is ${PROTECTIONLEVEL}&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Special explanation blurb&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages&lt;br /&gt;
-- in the MediaWiki namespace.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;explanation-blurb-nounprotect&#039;] = &#039;See the [[Wikipedia:Protection policy|&#039;&lt;br /&gt;
	.. &#039;protection policy]] and ${PROTECTIONLOG} for more details.&#039;&lt;br /&gt;
	.. &#039; Please discuss any changes on the ${TALKPAGE}; you&#039;&lt;br /&gt;
	.. &#039; may ${EDITREQUEST} to ask an&#039;&lt;br /&gt;
	.. &#039; [[Wikipedia:Administrators|administrator]] to make an edit if it&#039;&lt;br /&gt;
	.. &#039; is [[Help:Minor edit#When to mark an edit as a minor edit&#039;&lt;br /&gt;
	.. &#039;|uncontroversial]] or supported by [[Wikipedia:Consensus&#039;&lt;br /&gt;
	.. &#039;|consensus]].&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection log display values&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine the display values for the protection log link&lt;br /&gt;
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;protection-log-display&#039;] = &#039;protection log&#039;,&lt;br /&gt;
[&#039;pc-log-display&#039;] = &#039;pending changes log&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Current version display values&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine the display values for the page history link&lt;br /&gt;
-- or the move log link produced by the ${CURRENTVERSION} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in these messages.&lt;br /&gt;
[&#039;current-version-move-display&#039;] = &#039;current title&#039;,&lt;br /&gt;
[&#039;current-version-edit-display&#039;] = &#039;current version&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Talk page&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This message determines the display value of the talk page link produced&lt;br /&gt;
-- with the ${TALKPAGE} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;talk-page-link-display&#039;] = &#039;talk page&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Edit requests&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This message determines the display value of the edit request link produced&lt;br /&gt;
-- with the ${EDITREQUEST} parameter.&lt;br /&gt;
-- It is possible to use banner parameters in this message.&lt;br /&gt;
[&#039;edit-request-display&#039;] = &#039;submit an edit request&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Expiry date format&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- This is the format for the blurb expiry date. It should be valid input for&lt;br /&gt;
-- the first parameter of the #time parser function.&lt;br /&gt;
[&#039;expiry-date-format&#039;] = &#039;F j, Y &amp;quot;at&amp;quot; H:i e&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These messages determine which tracking categories the module outputs.&lt;br /&gt;
[&#039;tracking-category-incorrect&#039;] = &#039;Wikipedia pages with incorrect protection templates&#039;,&lt;br /&gt;
[&#039;tracking-category-template&#039;] = &#039;Wikipedia template-protected pages other than templates and modules&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Images&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- These are images that are not defined by their protection action and protection level.&lt;br /&gt;
[&#039;image-filename-indef&#039;] = &#039;Full-protection-shackle.svg&#039;,&lt;br /&gt;
[&#039;image-filename-default&#039;] = &#039;Transparent.gif&#039;,&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End messages&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Protected_page&amp;diff=474</id>
		<title>Module:Protected page</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Protected_page&amp;diff=474"/>
		<updated>2026-09-09T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{pp-meta}} and its daughter templates such as&lt;br /&gt;
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.&lt;br /&gt;
&lt;br /&gt;
-- Initialise necessary modules.&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
local makeFileLink = require(&#039;Module:File link&#039;)._main&lt;br /&gt;
local effectiveProtectionLevel = require(&#039;Module:Effective protection level&#039;)._main&lt;br /&gt;
local effectiveProtectionExpiry = require(&#039;Module:Effective protection expiry&#039;)._main&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily initialise modules and objects we don&#039;t always need.&lt;br /&gt;
local getArgs, makeMessageBox, lang&lt;br /&gt;
&lt;br /&gt;
-- Set constants.&lt;br /&gt;
local CONFIG_MODULE = &#039;Module:Protected page/config&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	if cat then&lt;br /&gt;
		return string.format(&lt;br /&gt;
			&#039;[[%s:%s|%s]]&#039;,&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			cat,&lt;br /&gt;
			sort&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Validation function for the expiry and the protection date&lt;br /&gt;
local function validateDate(dateString, dateType)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = mw.language.getContentLanguage()&lt;br /&gt;
	end&lt;br /&gt;
	local success, result = pcall(lang.formatDate, lang, &#039;U&#039;, dateString)&lt;br /&gt;
	if success then&lt;br /&gt;
		result = tonumber(result)&lt;br /&gt;
		if result then&lt;br /&gt;
			return result&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	error(string.format(&lt;br /&gt;
		&#039;invalid %s: %s&#039;,&lt;br /&gt;
		dateType,&lt;br /&gt;
		tostring(dateString)&lt;br /&gt;
	), 4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeFullUrl(page, query, display)&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[%s %s]&#039;,&lt;br /&gt;
		tostring(mw.uri.fullUrl(page, query)),&lt;br /&gt;
		display&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a directed graph formatted as node -&amp;gt; table of direct successors,&lt;br /&gt;
-- get a table of all nodes reachable from a given node (though always&lt;br /&gt;
-- including the given node).&lt;br /&gt;
local function getReachableNodes(graph, start)&lt;br /&gt;
	local toWalk, retval = {[start] = true}, {}&lt;br /&gt;
	while true do&lt;br /&gt;
		-- Can&#039;t use pairs() since we&#039;re adding and removing things as we&#039;re iterating&lt;br /&gt;
		local k = next(toWalk) -- This always gets the &amp;quot;first&amp;quot; key&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return retval&lt;br /&gt;
		end&lt;br /&gt;
		toWalk[k] = nil&lt;br /&gt;
		retval[k] = true&lt;br /&gt;
		for _,v in ipairs(graph[k]) do&lt;br /&gt;
			if not retval[v] then&lt;br /&gt;
				toWalk[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Protection = {}&lt;br /&gt;
Protection.__index = Protection&lt;br /&gt;
&lt;br /&gt;
Protection.supportedActions = {&lt;br /&gt;
	edit = true,&lt;br /&gt;
	move = true,&lt;br /&gt;
	autoreview = true,&lt;br /&gt;
	upload = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Protection.bannerConfigFields = {&lt;br /&gt;
	&#039;text&#039;,&lt;br /&gt;
	&#039;explanation&#039;,&lt;br /&gt;
	&#039;tooltip&#039;,&lt;br /&gt;
	&#039;alt&#039;,&lt;br /&gt;
	&#039;link&#039;,&lt;br /&gt;
	&#039;image&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Protection.new(args, cfg, title)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
	obj.title = title or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set action&lt;br /&gt;
	if not args.action then&lt;br /&gt;
		obj.action = &#039;edit&#039;&lt;br /&gt;
	elseif Protection.supportedActions[args.action] then&lt;br /&gt;
		obj.action = args.action&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;invalid action: %s&#039;,&lt;br /&gt;
			tostring(args.action)&lt;br /&gt;
		), 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set level&lt;br /&gt;
	obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)&lt;br /&gt;
	if not obj.level or (obj.action == &#039;move&#039; and obj.level == &#039;autoconfirmed&#039;) then&lt;br /&gt;
		-- Users need to be autoconfirmed to move pages anyway, so treat&lt;br /&gt;
		-- semi-move-protected pages as unprotected.&lt;br /&gt;
		obj.level = &#039;*&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set expiry&lt;br /&gt;
	local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)&lt;br /&gt;
	if effectiveExpiry == &#039;infinity&#039; then&lt;br /&gt;
		obj.expiry = &#039;indef&#039;&lt;br /&gt;
	elseif effectiveExpiry ~= &#039;unknown&#039; then&lt;br /&gt;
		obj.expiry = validateDate(effectiveExpiry, &#039;expiry date&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set reason&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		obj.reason = mw.ustring.lower(args[1])&lt;br /&gt;
		if obj.reason:find(&#039;|&#039;) then&lt;br /&gt;
			error(&#039;reasons cannot contain the pipe character (&amp;quot;|&amp;quot;)&#039;, 3)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set protection date&lt;br /&gt;
	if args.date then&lt;br /&gt;
		obj.protectionDate = validateDate(args.date, &#039;protection date&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Set banner config&lt;br /&gt;
	do&lt;br /&gt;
		obj.bannerConfig = {}&lt;br /&gt;
		local configTables = {}&lt;br /&gt;
		if cfg.banners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]&lt;br /&gt;
		end&lt;br /&gt;
		if cfg.defaultBanners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default&lt;br /&gt;
		end&lt;br /&gt;
		configTables[#configTables + 1] = cfg.masterBanner&lt;br /&gt;
		for i, field in ipairs(Protection.bannerConfigFields) do&lt;br /&gt;
			for j, t in ipairs(configTables) do&lt;br /&gt;
				if t[field] then&lt;br /&gt;
					obj.bannerConfig[field] = t[field]&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, Protection)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isUserScript()&lt;br /&gt;
	-- Whether the page is a user JavaScript or CSS page.&lt;br /&gt;
	local title = self.title&lt;br /&gt;
	return title.namespace == 2 and (&lt;br /&gt;
		title.contentModel == &#039;javascript&#039; or title.contentModel == &#039;css&#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isProtected()&lt;br /&gt;
	return self.level ~= &#039;*&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:shouldShowLock()&lt;br /&gt;
	-- Whether we should output a banner/padlock&lt;br /&gt;
	return self:isProtected() and not self:isUserScript()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Whether this page needs a protection category.&lt;br /&gt;
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemporary()&lt;br /&gt;
	return type(self.expiry) == &#039;number&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeProtectionCategory()&lt;br /&gt;
	if not self:shouldHaveProtectionCategory() then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local cfg = self._cfg&lt;br /&gt;
	local title = self.title&lt;br /&gt;
	&lt;br /&gt;
	-- Get the expiry key fragment.&lt;br /&gt;
	local expiryFragment&lt;br /&gt;
	if self.expiry == &#039;indef&#039; then&lt;br /&gt;
		expiryFragment = self.expiry&lt;br /&gt;
	elseif type(self.expiry) == &#039;number&#039; then&lt;br /&gt;
		expiryFragment = &#039;temp&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the namespace key fragment.&lt;br /&gt;
	local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]&lt;br /&gt;
	if not namespaceFragment and title.namespace % 2 == 1 then&lt;br /&gt;
			namespaceFragment = &#039;talk&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define the order that key fragments are tested in. This is done with an&lt;br /&gt;
	-- array of tables containing the value to be tested, along with its&lt;br /&gt;
	-- position in the cfg.protectionCategories table.&lt;br /&gt;
	local order = {&lt;br /&gt;
		{val = expiryFragment,    keypos = 1},&lt;br /&gt;
		{val = namespaceFragment, keypos = 2},&lt;br /&gt;
		{val = self.reason,       keypos = 3},&lt;br /&gt;
		{val = self.level,        keypos = 4},&lt;br /&gt;
		{val = self.action,       keypos = 5}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- The old protection templates used an ad-hoc protection category system,&lt;br /&gt;
	-- with some templates prioritising namespaces in their categories, and&lt;br /&gt;
	-- others prioritising the protection reason. To emulate this in this module&lt;br /&gt;
	-- we use the config table cfg.reasonsWithNamespacePriority to set the&lt;br /&gt;
	-- reasons for which namespaces have priority over protection reason.&lt;br /&gt;
	-- If we are dealing with one of those reasons, move the namespace table to&lt;br /&gt;
	-- the end of the order table, i.e. give it highest priority. If not, the&lt;br /&gt;
	-- reason should have highest priority, so move that to the end of the table&lt;br /&gt;
	-- instead.&lt;br /&gt;
	--]]&lt;br /&gt;
	table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define the attempt order. Inactive subtables (subtables with nil &amp;quot;value&amp;quot;&lt;br /&gt;
	-- fields) are moved to the end, where they will later be given the key&lt;br /&gt;
	-- &amp;quot;all&amp;quot;. This is to cut down on the number of table lookups in&lt;br /&gt;
	-- cfg.protectionCategories, which grows exponentially with the number of&lt;br /&gt;
	-- non-nil keys. We keep track of the number of active subtables with the&lt;br /&gt;
	-- noActive parameter.&lt;br /&gt;
	--]]&lt;br /&gt;
	local noActive, attemptOrder&lt;br /&gt;
	do&lt;br /&gt;
		local active, inactive = {}, {}&lt;br /&gt;
		for i, t in ipairs(order) do&lt;br /&gt;
			if t.val then&lt;br /&gt;
				active[#active + 1] = t&lt;br /&gt;
			else&lt;br /&gt;
				inactive[#inactive + 1] = t&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		noActive = #active&lt;br /&gt;
		attemptOrder = active&lt;br /&gt;
		for i, t in ipairs(inactive) do&lt;br /&gt;
			attemptOrder[#attemptOrder + 1] = t&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check increasingly generic key combinations until we find a match. If a&lt;br /&gt;
	-- specific category exists for the combination of key fragments we are&lt;br /&gt;
	-- given, that match will be found first. If not, we keep trying different&lt;br /&gt;
	-- key fragment combinations until we match using the key&lt;br /&gt;
	-- &amp;quot;all-all-all-all-all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- To generate the keys, we index the key subtables using a binary matrix&lt;br /&gt;
	-- with indexes i and j. j is only calculated up to the number of active&lt;br /&gt;
	-- subtables. For example, if there were three active subtables, the matrix&lt;br /&gt;
	-- would look like this, with 0 corresponding to the key fragment &amp;quot;all&amp;quot;, and&lt;br /&gt;
	-- 1 corresponding to other key fragments.&lt;br /&gt;
	-- &lt;br /&gt;
	--   j 1  2  3&lt;br /&gt;
	-- i  &lt;br /&gt;
	-- 1   1  1  1&lt;br /&gt;
	-- 2   0  1  1&lt;br /&gt;
	-- 3   1  0  1&lt;br /&gt;
	-- 4   0  0  1&lt;br /&gt;
	-- 5   1  1  0&lt;br /&gt;
	-- 6   0  1  0&lt;br /&gt;
	-- 7   1  0  0&lt;br /&gt;
	-- 8   0  0  0&lt;br /&gt;
	-- &lt;br /&gt;
	-- Values of j higher than the number of active subtables are set&lt;br /&gt;
	-- to the string &amp;quot;all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- A key for cfg.protectionCategories is constructed for each value of i.&lt;br /&gt;
	-- The position of the value in the key is determined by the keypos field in&lt;br /&gt;
	-- each subtable.&lt;br /&gt;
	--]]&lt;br /&gt;
	local cats = cfg.protectionCategories&lt;br /&gt;
	for i = 1, 2^noActive do&lt;br /&gt;
		local key = {}&lt;br /&gt;
		for j, t in ipairs(attemptOrder) do&lt;br /&gt;
			if j &amp;gt; noActive then&lt;br /&gt;
				key[t.keypos] = &#039;all&#039;&lt;br /&gt;
			else&lt;br /&gt;
				local quotient = i / 2 ^ (j - 1)&lt;br /&gt;
				quotient = math.ceil(quotient)&lt;br /&gt;
				if quotient % 2 == 1 then&lt;br /&gt;
					key[t.keypos] = t.val&lt;br /&gt;
				else&lt;br /&gt;
					key[t.keypos] = &#039;all&#039;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		key = table.concat(key, &#039;|&#039;)&lt;br /&gt;
		local attempt = cats[key]&lt;br /&gt;
		if attempt then&lt;br /&gt;
			return makeCategoryLink(attempt, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isIncorrect()&lt;br /&gt;
	if not self:shouldHaveProtectionCategory() then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if type(self.expiry) ~= &#039;number&#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local expiry = os.date(&#039;*t&#039;, self.expiry)&lt;br /&gt;
	-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616&lt;br /&gt;
	local today = os.date(&#039;*t&#039;)&lt;br /&gt;
	return (expiry.year &amp;lt; today.year)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month &amp;lt; today.month)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month == today.month and expiry.day &amp;lt; today.day)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry &amp;lt; os.time())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemplateProtectedNonTemplate()&lt;br /&gt;
	local action, namespace = self.action, self.title.namespace&lt;br /&gt;
	return self.level == &#039;templateeditor&#039;&lt;br /&gt;
		and (&lt;br /&gt;
			(action ~= &#039;edit&#039; and action ~= &#039;move&#039;)&lt;br /&gt;
			or (namespace ~= 10 and namespace ~= 828)&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeCategoryLinks()&lt;br /&gt;
	local msg = self._cfg.msg&lt;br /&gt;
	local ret = {self:makeProtectionCategory()}&lt;br /&gt;
	if self:isIncorrect() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&#039;tracking-category-incorrect&#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	if self:isTemplateProtectedNonTemplate() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&#039;tracking-category-template&#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Blurb class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Blurb = {}&lt;br /&gt;
Blurb.__index = Blurb&lt;br /&gt;
&lt;br /&gt;
Blurb.bannerTextFields = {&lt;br /&gt;
	text = true,&lt;br /&gt;
	explanation = true,&lt;br /&gt;
	tooltip = true,&lt;br /&gt;
	alt = true,&lt;br /&gt;
	link = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	return setmetatable({&lt;br /&gt;
		_cfg = cfg,&lt;br /&gt;
		_protectionObj = protectionObj,&lt;br /&gt;
		_args = args&lt;br /&gt;
	}, Blurb)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Private methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:_formatDate(num)&lt;br /&gt;
	-- Formats a Unix timestamp into dd Month, YYYY format.&lt;br /&gt;
	lang = lang or mw.language.getContentLanguage()&lt;br /&gt;
	local success, date = pcall(&lt;br /&gt;
		lang.formatDate,&lt;br /&gt;
		lang,&lt;br /&gt;
		self._cfg.msg[&#039;expiry-date-format&#039;] or &#039;j F Y&#039;,&lt;br /&gt;
		&#039;@&#039; .. tostring(num)&lt;br /&gt;
	)&lt;br /&gt;
	if success then&lt;br /&gt;
		return date&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_getExpandedMessage(msgKey)&lt;br /&gt;
	return self:_substituteParameters(self._cfg.msg[msgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_substituteParameters(msg)&lt;br /&gt;
	if not self._params then&lt;br /&gt;
		local parameterFuncs = {}&lt;br /&gt;
&lt;br /&gt;
		parameterFuncs.CURRENTVERSION     = self._makeCurrentVersionParameter&lt;br /&gt;
		parameterFuncs.EDITREQUEST        = self._makeEditRequestParameter&lt;br /&gt;
		parameterFuncs.EXPIRY             = self._makeExpiryParameter&lt;br /&gt;
		parameterFuncs.EXPLANATIONBLURB   = self._makeExplanationBlurbParameter&lt;br /&gt;
		parameterFuncs.IMAGELINK          = self._makeImageLinkParameter&lt;br /&gt;
		parameterFuncs.INTROBLURB         = self._makeIntroBlurbParameter&lt;br /&gt;
		parameterFuncs.INTROFRAGMENT      = self._makeIntroFragmentParameter&lt;br /&gt;
		parameterFuncs.PAGETYPE           = self._makePagetypeParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONBLURB    = self._makeProtectionBlurbParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONDATE     = self._makeProtectionDateParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLEVEL    = self._makeProtectionLevelParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLOG      = self._makeProtectionLogParameter&lt;br /&gt;
		parameterFuncs.TALKPAGE           = self._makeTalkPageParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPBLURB       = self._makeTooltipBlurbParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPFRAGMENT    = self._makeTooltipFragmentParameter&lt;br /&gt;
		parameterFuncs.VANDAL             = self._makeVandalTemplateParameter&lt;br /&gt;
		&lt;br /&gt;
		self._params = setmetatable({}, {&lt;br /&gt;
			__index = function (t, k)&lt;br /&gt;
				local param&lt;br /&gt;
				if parameterFuncs[k] then&lt;br /&gt;
					param = parameterFuncs[k](self)&lt;br /&gt;
				end&lt;br /&gt;
				param = param or &#039;&#039;&lt;br /&gt;
				t[k] = param&lt;br /&gt;
				return param&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	msg = msg:gsub(&#039;${(%u+)}&#039;, self._params)&lt;br /&gt;
	return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeCurrentVersionParameter()&lt;br /&gt;
	-- A link to the page history or the move log, depending on the kind of&lt;br /&gt;
	-- protection.&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &#039;move&#039; then&lt;br /&gt;
		-- We need the move log link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;move&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;current-version-move-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the history link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			pagename,&lt;br /&gt;
			{action = &#039;history&#039;},&lt;br /&gt;
			self:_getExpandedMessage(&#039;current-version-edit-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeEditRequestParameter()&lt;br /&gt;
	local mEditRequest = require(&#039;Module:Submit an edit request&#039;)&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	&lt;br /&gt;
	-- Get the edit request type.&lt;br /&gt;
	local requestType&lt;br /&gt;
	if action == &#039;edit&#039; then&lt;br /&gt;
		if level == &#039;autoconfirmed&#039; then&lt;br /&gt;
			requestType = &#039;semi&#039;&lt;br /&gt;
		elseif level == &#039;extendedconfirmed&#039; then&lt;br /&gt;
			requestType = &#039;extended&#039;&lt;br /&gt;
		elseif level == &#039;templateeditor&#039; then&lt;br /&gt;
			requestType = &#039;template&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	requestType = requestType or &#039;full&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Get the display value.&lt;br /&gt;
	local display = self:_getExpandedMessage(&#039;edit-request-display&#039;)&lt;br /&gt;
&lt;br /&gt;
	return mEditRequest._link{type = requestType, display = display}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExpiryParameter()&lt;br /&gt;
	local expiry = self._protectionObj.expiry&lt;br /&gt;
	if type(expiry) == &#039;number&#039; then&lt;br /&gt;
		return self:_formatDate(expiry)&lt;br /&gt;
	else&lt;br /&gt;
		return expiry&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExplanationBlurbParameter()&lt;br /&gt;
	-- Cover special cases first.&lt;br /&gt;
	if self._protectionObj.title.namespace == 8 then&lt;br /&gt;
		-- MediaWiki namespace&lt;br /&gt;
		return self:_getExpandedMessage(&#039;explanation-blurb-nounprotect&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get explanation blurb table keys&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local talkKey = self._protectionObj.title.isTalkPage and &#039;talk&#039; or &#039;subject&#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find the message in the explanation blurb table and substitute any&lt;br /&gt;
	-- parameters.&lt;br /&gt;
	local explanations = self._cfg.explanationBlurbs&lt;br /&gt;
	local msg&lt;br /&gt;
	if explanations[action][level] and explanations[action][level][talkKey] then&lt;br /&gt;
		msg = explanations[action][level][talkKey]&lt;br /&gt;
	elseif explanations[action][level] and explanations[action][level].default then&lt;br /&gt;
		msg = explanations[action][level].default&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default[talkKey] then&lt;br /&gt;
		msg = explanations[action].default[talkKey]&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default.default then&lt;br /&gt;
		msg = explanations[action].default.default&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;could not find explanation blurb for action &amp;quot;%s&amp;quot;, level &amp;quot;%s&amp;quot; and talk key &amp;quot;%s&amp;quot;&#039;,&lt;br /&gt;
			action,&lt;br /&gt;
			level,&lt;br /&gt;
			talkKey&lt;br /&gt;
		), 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeImageLinkParameter()&lt;br /&gt;
	local imageLinks = self._cfg.imageLinks&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if imageLinks[action][level] then&lt;br /&gt;
		msg = imageLinks[action][level]&lt;br /&gt;
	elseif imageLinks[action].default then&lt;br /&gt;
		msg = imageLinks[action].default&lt;br /&gt;
	else&lt;br /&gt;
		msg = imageLinks.edit.default&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-blurb-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-blurb-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-fragment-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;intro-fragment-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makePagetypeParameter()&lt;br /&gt;
	local pagetypes = self._cfg.pagetypes&lt;br /&gt;
	return pagetypes[self._protectionObj.title.namespace]&lt;br /&gt;
		or pagetypes.default&lt;br /&gt;
		or error(&#039;no default pagetype defined&#039;, 8)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionBlurbParameter()&lt;br /&gt;
	local protectionBlurbs = self._cfg.protectionBlurbs&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionBlurbs[action][level] then&lt;br /&gt;
		msg = protectionBlurbs[action][level]&lt;br /&gt;
	elseif protectionBlurbs[action].default then&lt;br /&gt;
		msg = protectionBlurbs[action].default&lt;br /&gt;
	elseif protectionBlurbs.edit.default then&lt;br /&gt;
		msg = protectionBlurbs.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&#039;no protection blurb defined for protectionBlurbs.edit.default&#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionDateParameter()&lt;br /&gt;
	local protectionDate = self._protectionObj.protectionDate&lt;br /&gt;
	if type(protectionDate) == &#039;number&#039; then&lt;br /&gt;
		return self:_formatDate(protectionDate)&lt;br /&gt;
	else&lt;br /&gt;
		return protectionDate&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLevelParameter()&lt;br /&gt;
	local protectionLevels = self._cfg.protectionLevels&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionLevels[action][level] then&lt;br /&gt;
		msg = protectionLevels[action][level]&lt;br /&gt;
	elseif protectionLevels[action].default then&lt;br /&gt;
		msg = protectionLevels[action].default&lt;br /&gt;
	elseif protectionLevels.edit.default then&lt;br /&gt;
		msg = protectionLevels.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&#039;no protection level defined for protectionLevels.edit.default&#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLogParameter()&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &#039;autoreview&#039; then&lt;br /&gt;
		-- We need the pending changes log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;stable&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;pc-log-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the protection log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&#039;Special:Log&#039;,&lt;br /&gt;
			{type = &#039;protect&#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&#039;protection-log-display&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTalkPageParameter()&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[[%s:%s#%s|%s]]&#039;,&lt;br /&gt;
		mw.site.namespaces[self._protectionObj.title.namespace].talk.name,&lt;br /&gt;
		self._protectionObj.title.text,&lt;br /&gt;
		self._args.section or &#039;top&#039;,&lt;br /&gt;
		self:_getExpandedMessage(&#039;talk-page-link-display&#039;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-blurb-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-blurb-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-fragment-expiry&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&#039;tooltip-fragment-noexpiry&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeVandalTemplateParameter()&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
		title=&amp;quot;vandal-m&amp;quot;,&lt;br /&gt;
		args={self._args.user or self._protectionObj.title.baseText}&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Public methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:makeBannerText(key)&lt;br /&gt;
	-- Validate input.&lt;br /&gt;
	if not key or not Blurb.bannerTextFields[key] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;&amp;quot;%s&amp;quot; is not a valid banner config field&#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Generate the text.&lt;br /&gt;
	local msg = self._protectionObj.bannerConfig[key]&lt;br /&gt;
	if type(msg) == &#039;string&#039; then&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	elseif type(msg) == &#039;function&#039; then&lt;br /&gt;
		msg = msg(self._protectionObj, self._args)&lt;br /&gt;
		if type(msg) ~= &#039;string&#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&#039;bad output from banner config function with key &amp;quot;%s&amp;quot;&#039;&lt;br /&gt;
					.. &#039; (expected string, got %s)&#039;,&lt;br /&gt;
				tostring(key),&lt;br /&gt;
				type(msg)&lt;br /&gt;
			), 4)&lt;br /&gt;
		end&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- BannerTemplate class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local BannerTemplate = {}&lt;br /&gt;
BannerTemplate.__index = BannerTemplate&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate.new(protectionObj, cfg)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
&lt;br /&gt;
	-- Set the image filename.&lt;br /&gt;
	local imageFilename = protectionObj.bannerConfig.image&lt;br /&gt;
	if imageFilename then&lt;br /&gt;
		obj._imageFilename = imageFilename&lt;br /&gt;
	else&lt;br /&gt;
		-- If an image filename isn&#039;t specified explicitly in the banner config,&lt;br /&gt;
		-- generate it from the protection status and the namespace.&lt;br /&gt;
		local action = protectionObj.action&lt;br /&gt;
		local level = protectionObj.level&lt;br /&gt;
		local namespace = protectionObj.title.namespace&lt;br /&gt;
		local reason = protectionObj.reason&lt;br /&gt;
		&lt;br /&gt;
		-- Deal with special cases first.&lt;br /&gt;
		if (&lt;br /&gt;
			namespace == 10&lt;br /&gt;
			or namespace == 828&lt;br /&gt;
			or reason and obj._cfg.indefImageReasons[reason]&lt;br /&gt;
			)&lt;br /&gt;
			and action == &#039;edit&#039;&lt;br /&gt;
			and level == &#039;sysop&#039;&lt;br /&gt;
			and not protectionObj:isTemporary()&lt;br /&gt;
		then&lt;br /&gt;
			-- Fully protected modules and templates get the special red &amp;quot;indef&amp;quot;&lt;br /&gt;
			-- padlock.&lt;br /&gt;
			obj._imageFilename = obj._cfg.msg[&#039;image-filename-indef&#039;]&lt;br /&gt;
		else&lt;br /&gt;
			-- Deal with regular protection types.&lt;br /&gt;
			local images = obj._cfg.images&lt;br /&gt;
			if images[action] then&lt;br /&gt;
				if images[action][level] then&lt;br /&gt;
					obj._imageFilename = images[action][level]&lt;br /&gt;
				elseif images[action].default then&lt;br /&gt;
					obj._imageFilename = images[action].default&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, BannerTemplate)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate:renderImage()&lt;br /&gt;
	local filename = self._imageFilename&lt;br /&gt;
		or self._cfg.msg[&#039;image-filename-default&#039;]&lt;br /&gt;
		or &#039;Transparent.gif&#039;&lt;br /&gt;
	return makeFileLink{&lt;br /&gt;
		file = filename,&lt;br /&gt;
		size = (self.imageWidth or 20) .. &#039;px&#039;,&lt;br /&gt;
		alt = self._imageAlt,&lt;br /&gt;
		link = self._imageLink,&lt;br /&gt;
		caption = self.imageCaption&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Banner class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Banner = setmetatable({}, BannerTemplate)&lt;br /&gt;
Banner.__index = Banner&lt;br /&gt;
&lt;br /&gt;
function Banner.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&#039;t need the blurb.&lt;br /&gt;
	obj.imageWidth = 40&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&#039;alt&#039;) -- Large banners use the alt text for the tooltip.&lt;br /&gt;
	obj._reasonText = blurbObj:makeBannerText(&#039;text&#039;)&lt;br /&gt;
	obj._explanationText = blurbObj:makeBannerText(&#039;explanation&#039;)&lt;br /&gt;
	obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.&lt;br /&gt;
	return setmetatable(obj, Banner)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:__tostring()&lt;br /&gt;
	-- Renders the banner.&lt;br /&gt;
	makeMessageBox = makeMessageBox or require(&#039;Module:Message box&#039;).main&lt;br /&gt;
	local reasonText = self._reasonText or error(&#039;no reason text set&#039;, 2)&lt;br /&gt;
	local explanationText = self._explanationText&lt;br /&gt;
	local mbargs = {&lt;br /&gt;
		page = self._page,&lt;br /&gt;
		type = &#039;protection&#039;,&lt;br /&gt;
		image = self:renderImage(),&lt;br /&gt;
		text = string.format(&lt;br /&gt;
			&amp;quot;&#039;&#039;&#039;%s&#039;&#039;&#039;%s&amp;quot;,&lt;br /&gt;
			reasonText,&lt;br /&gt;
			explanationText and &#039;&amp;lt;br /&amp;gt;&#039; .. explanationText or &#039;&#039;&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	return makeMessageBox(&#039;mbox&#039;, mbargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Padlock class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Padlock = setmetatable({}, BannerTemplate)&lt;br /&gt;
Padlock.__index = Padlock&lt;br /&gt;
&lt;br /&gt;
function Padlock.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&#039;t need the blurb.&lt;br /&gt;
	obj.imageWidth = 20&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&#039;tooltip&#039;)&lt;br /&gt;
	obj._imageAlt = blurbObj:makeBannerText(&#039;alt&#039;)&lt;br /&gt;
	obj._imageLink = blurbObj:makeBannerText(&#039;link&#039;)&lt;br /&gt;
	obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]&lt;br /&gt;
		or cfg.padlockIndicatorNames.default&lt;br /&gt;
		or &#039;pp-default&#039;&lt;br /&gt;
	return setmetatable(obj, Padlock)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Padlock:__tostring()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- The nowiki tag helps prevent whitespace at the top of articles.&lt;br /&gt;
	return frame:extensionTag{name = &#039;nowiki&#039;} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;indicator&#039;,&lt;br /&gt;
		args = {name = self._indicatorName},&lt;br /&gt;
		content = self:renderImage()&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- This is used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		Protection = Protection,&lt;br /&gt;
		Blurb = Blurb,&lt;br /&gt;
		BannerTemplate = BannerTemplate,&lt;br /&gt;
		Banner = Banner,&lt;br /&gt;
		Padlock = Padlock,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, cfg, title)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	local protectionObj = Protection.new(args, cfg, title)&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- If a page&#039;s edit protection is equally or more restrictive than its&lt;br /&gt;
	-- protection from some other action, then don&#039;t bother displaying anything&lt;br /&gt;
	-- for the other action (except categories).&lt;br /&gt;
	if not yesno(args.catonly) and (protectionObj.action == &#039;edit&#039; or&lt;br /&gt;
		args.demolevel or&lt;br /&gt;
		not getReachableNodes(&lt;br /&gt;
			cfg.hierarchy,&lt;br /&gt;
			protectionObj.level&lt;br /&gt;
		)[effectiveProtectionLevel(&#039;edit&#039;, protectionObj.title)])&lt;br /&gt;
	then&lt;br /&gt;
		-- Initialise the blurb object&lt;br /&gt;
		local blurbObj = Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	&lt;br /&gt;
		-- Render the banner&lt;br /&gt;
		if protectionObj:shouldShowLock() then&lt;br /&gt;
			ret[#ret + 1] = tostring(&lt;br /&gt;
				(yesno(args.small) and Padlock or Banner)&lt;br /&gt;
				.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the categories&lt;br /&gt;
	if yesno(args.category) ~= false then&lt;br /&gt;
		ret[#ret + 1] = protectionObj:makeCategoryLinks()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them&lt;br /&gt;
	if protectionObj.level == &amp;quot;extendedconfirmed&amp;quot; then&lt;br /&gt;
		if require(&amp;quot;Module:TableTools&amp;quot;).inArray(protectionObj.title.talkPageTitle.categories, &amp;quot;Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict&amp;quot;) then&lt;br /&gt;
			ret[#ret + 1] = &amp;quot;&amp;lt;p class=&#039;PIA-flag&#039; style=&#039;display:none; visibility:hidden;&#039; title=&#039;This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.&#039;&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, cfg)&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	-- Find default args, if any.&lt;br /&gt;
	local parent = frame.getParent and frame:getParent()&lt;br /&gt;
	local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)]&lt;br /&gt;
&lt;br /&gt;
	-- Find user args, and use the parent frame if we are being called from a&lt;br /&gt;
	-- wrapper template.&lt;br /&gt;
	getArgs = getArgs or require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	local userArgs = getArgs(frame, {&lt;br /&gt;
		parentOnly = defaultArgs,&lt;br /&gt;
		frameOnly = not defaultArgs&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Build the args table. User-specified args overwrite default args.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(defaultArgs or {}) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(userArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args, cfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Param_value/styles.css&amp;diff=472</id>
		<title>Template:Param value/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Param_value/styles.css&amp;diff=472"/>
		<updated>2026-09-09T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template}} */&lt;br /&gt;
.tpl-pval__code {&lt;br /&gt;
	border: thin solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	background-color: var(--color-inverted, #fff);&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Hlist/styles.css&amp;diff=470</id>
		<title>Template:Hlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Hlist/styles.css&amp;diff=470"/>
		<updated>2026-09-09T09:48:29Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template}} */&lt;br /&gt;
/* &lt;br /&gt;
 * hlist styles are defined in core and Minerva and differ in Minerva. The&lt;br /&gt;
 * current definitions here (2023-01-01) are sufficient to override Minerva&lt;br /&gt;
 * without use of the hlist-separated class. The most problematic styles were&lt;br /&gt;
 * related to margin, padding, and the bullet. Check files listed at&lt;br /&gt;
 * [[MediaWiki talk:Common.css/to do#hlist-separated]]&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * TODO: When the majority of readership supports it (or some beautiful world&lt;br /&gt;
 * in which grade C support is above the minimum threshold), use :is()&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	/*&lt;br /&gt;
	 * don&#039;t trust the note that says margin doesn&#039;t work with inline&lt;br /&gt;
	 * removing margin: 0 makes dds have margins again&lt;br /&gt;
	 * We also want to reset margin-right in Minerva&lt;br /&gt;
	 */&lt;br /&gt;
	margin: 0; &lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display requested top-level lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist dl dl,&lt;br /&gt;
.hlist dl ol,&lt;br /&gt;
.hlist dl ul,&lt;br /&gt;
.hlist ol dl,&lt;br /&gt;
.hlist ol ol,&lt;br /&gt;
.hlist ol ul,&lt;br /&gt;
.hlist ul dl,&lt;br /&gt;
.hlist ul ol,&lt;br /&gt;
.hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide empty list items */&lt;br /&gt;
.hlist .mw-empty-li {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: :not() can maybe be used here to remove the later rule. naive test&lt;br /&gt;
 * seems to work. more testing needed. like so:&lt;br /&gt;
 *.hlist dt:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
 *}&lt;br /&gt;
 *.hlist dd:not(:last-child)::after,&lt;br /&gt;
 *.hlist li:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
 *	font-weight: bold;&lt;br /&gt;
 *}&lt;br /&gt;
 */&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt::after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd::after,&lt;br /&gt;
.hlist li::after {&lt;br /&gt;
	content: &amp;quot;\a0· &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd:last-child::after,&lt;br /&gt;
.hlist dt:last-child::after,&lt;br /&gt;
.hlist li:last-child::after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child::before,&lt;br /&gt;
.hlist dd dt:first-child::before,&lt;br /&gt;
.hlist dd li:first-child::before,&lt;br /&gt;
.hlist dt dd:first-child::before,&lt;br /&gt;
.hlist dt dt:first-child::before,&lt;br /&gt;
.hlist dt li:first-child::before,&lt;br /&gt;
.hlist li dd:first-child::before,&lt;br /&gt;
.hlist li dt:first-child::before,&lt;br /&gt;
.hlist li li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:last-child::after,&lt;br /&gt;
.hlist dd dt:last-child::after,&lt;br /&gt;
.hlist dd li:last-child::after,&lt;br /&gt;
.hlist dt dd:last-child::after,&lt;br /&gt;
.hlist dt dt:last-child::after,&lt;br /&gt;
.hlist dt li:last-child::after,&lt;br /&gt;
.hlist li dd:last-child::after,&lt;br /&gt;
.hlist li dt:last-child::after,&lt;br /&gt;
.hlist li li:last-child::after {&lt;br /&gt;
	content: &amp;quot;)&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li::before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:See_also/doc&amp;diff=468</id>
		<title>Template:See also/doc</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:See_also/doc&amp;diff=468"/>
		<updated>2026-09-09T09:48:28Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{documentation subpage}}&lt;br /&gt;
{{lua|Module:Labelled list hatnote}}&lt;br /&gt;
{{used in system|in [[MediaWiki:wantedpages-summary]]}}&lt;br /&gt;
&lt;br /&gt;
This template is used to create {{strong|[[WP:Hatnotes|hatnotes]] to point to a small number of other related titles}} at the {{strong|top of article &#039;&#039;[[Help:Section|sections]]&#039;&#039;}} (excluding the [[WP:LEAD|lead]]). It looks like this:&lt;br /&gt;
&lt;br /&gt;
{{See also|Wikipedia:Article title}}&lt;br /&gt;
&lt;br /&gt;
Do not use this template on top of a page, where hatnotes are for disambiguation and not for related topics (according to {{Section link|Wikipedia:Hatnote#Linking to articles that are related to the topic}}). Do not use this template inside [[Wikipedia:Manual of Style/Layout#&amp;quot;See also&amp;quot; section|the &#039;&#039;&amp;quot;See also&amp;quot; section&#039;&#039;]] at the end of an article, or for links to other articles or subsections of the same article within regular article text. Where subsections are linked to, [[Template:Section link]] may be suitable instead. For use on category pages, the corresponding template is [[Template:Category see also]].&lt;br /&gt;
&lt;br /&gt;
Refer to the examples below to see how the template handles link targets containing section links and commas.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
{{see|Wikipedia:Summary style#Hatnote}}&lt;br /&gt;
; Basic usage:&lt;br /&gt;
 &amp;amp;#123;{See also|&#039;&#039;page1&#039;&#039;|&#039;&#039;page2&#039;&#039;|&#039;&#039;page3&#039;&#039;|...}}&lt;br /&gt;
&lt;br /&gt;
; All parameters:&lt;br /&gt;
 &amp;amp;#123;{See also|&#039;&#039;page1&#039;&#039;|&#039;&#039;page2&#039;&#039;|&#039;&#039;page3&#039;&#039;| ...&lt;br /&gt;
 |label 1 = &#039;&#039;label 1&#039;&#039;|label 2 = &#039;&#039;label2&#039;&#039;|label 3 = &#039;&#039;label3&#039;&#039;| ...&lt;br /&gt;
 |l1 = &#039;&#039;label1&#039;&#039;|l2 = &#039;&#039;label2&#039;&#039;|l3 = &#039;&#039;label3&#039;&#039;| ...&lt;br /&gt;
 |selfref = &#039;&#039;yes&#039;&#039;|category = &#039;&#039;no&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
This template accepts the following parameters:&lt;br /&gt;
* {{para|1}}, {{para|2}}, {{para|3}}, ... – the pages to link to. At least one page name is required. Categories and files are automatically escaped with the [[Help:Colon trick|colon trick]], and links to sections are automatically formatted as &#039;&#039;page § section&#039;&#039;, rather than the MediaWiki default of &#039;&#039;page#section&#039;&#039;.&lt;br /&gt;
* {{para|label 1}}, {{para|label 2}}, {{para|label 3}}, ...; or {{para|l1}}, {{para|l2}}, {{para|l3}}, ...; optional labels for each of the pages to link to.&lt;br /&gt;
* {{para|selfref}} – if set to {{pval|yes}}, {{pval|y}}, {{pval|true}}, or {{pval|1}}, adds the CSS class &amp;lt;code&amp;gt;selfref&amp;lt;/code&amp;gt;. This is used to denote self-references to Wikipedia. See [[Template:Selfref]] for more information.&lt;br /&gt;
* {{para|category}} – if set to {{pval|no}}, {{pval|n}}, {{pval|false}}, or {{pval|0}}, suppresses the error tracking category ([[:Category:Hatnote templates with errors]]). This only has an effect if the first positional parameter (the page to link to) is omitted.&lt;br /&gt;
* {{para|ifexists}} - if set to {{pval|false}}, forgo the existence check for pages. Otherwise [[WP:EXPENSIVE|expensive parser function calls]] (theoretically 1, but empirically 2) are used to check for each target&#039;s existence, omitting them if nonexistent.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Article}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Article#Section}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Article#Section|label 1=Custom section label}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Article1|Article2|Article3}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Article1|l1=Custom label 1|Article2|l2=Custom label 2}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Veni, vidi, vici|Julius Caesar}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Veni, vidi, vici|Julius Caesar#Civil war}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Julius Caesar#Civil war|Veni, vidi, vici}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{nowiki template demo|format=inline|code=&amp;lt;nowiki&amp;gt;{{See also|Julius Caesar#Civil war|Crossing the Rubicon}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Errors==&lt;br /&gt;
If no page names are supplied, the template outputs the following message with the (help) wikilink pointing to the &amp;quot;Errors&amp;quot; section of this page: &lt;br /&gt;
*{{See also|category=no}}&lt;br /&gt;
&lt;br /&gt;
If you see this error message, it is for one of three reasons:&lt;br /&gt;
# No parameters were specified (the template code was &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; with no pipe character nor page to link to). Please use &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also|&amp;lt;/nowiki&amp;gt;&#039;&#039;page&#039;&#039;&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
# Some parameters were specified, but no page names were included. For example, the template text &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also|selfref=yes}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; will produce this error. Please use (for example) &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also|&amp;lt;/nowiki&amp;gt;&#039;&#039;page&#039;&#039;&amp;lt;nowiki&amp;gt;|selfref=yes}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
# A page name was specified, but it contains an equals sign (&amp;quot;=&amp;quot;). The equals sign has a special meaning in template code, and because of this it cannot be used in template parameters that do not specify a parameter name. For example, the template code &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also|1+1=2|2+2=4}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; will produce this error. To work around this, you can specify the parameter name explicitly by using &amp;lt;code&amp;gt;1=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, etc., before the page name, like this: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{See also|1=1+1=2|2=2+2=4}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you see this error message and are unsure of what to do, please post a message on [[WP:HD|the help desk (WP:HD)]], and someone should be able to help you.&lt;br /&gt;
&lt;br /&gt;
To see a list of wikilinks to articles that contain this error message, see the [[Wikipedia:Maintenance|maintenance category]]: [[:Category:Hatnote templates with errors]].&lt;br /&gt;
&lt;br /&gt;
==TemplateData==&lt;br /&gt;
{{Collapse top|[[Wikipedia:TemplateData|TemplateData]] documentation used by [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}&lt;br /&gt;
{{TemplateData header|noheader=1}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;This template creates a hatnote to point to a small number of related pages. It is placed at the top of a section, directly underneath the section heading.&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 1&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the first page that you want to link to.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Article name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 2&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the second page that you want to link to.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;3&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 3&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the third page that you want to link to. More pages can be added using the parameters \&amp;quot;4\&amp;quot;, \&amp;quot;5\&amp;quot;, \&amp;quot;6\&amp;quot;, etc.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;4&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 4&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the fourth page that you want to link to.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;5&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 5&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the fifth page that you want to link to.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;6&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Page 6&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The name of the sixth page that you want to link to.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 1&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the first linked article is to be displayed as. &amp;quot;,&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l1&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 2&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the second linked article is to be displayed as.&amp;quot;,&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l2&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 3&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l3&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 3&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the third linked article is to be displayed as. Other labels can be added by using increasing numbers (starting with \&amp;quot;label 4\&amp;quot; or \&amp;quot;l4\&amp;quot; for page 4) as parameter names.&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;selfref&amp;quot;: {&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Self reference&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Set to \&amp;quot;yes\&amp;quot; if the template is a self-reference to Wikipedia that would not make sense on mirrors or forks of the Wikipedia site.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;no&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;category&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Category&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Set to \&amp;quot;no\&amp;quot;, \&amp;quot;n\&amp;quot;, \&amp;quot;false\&amp;quot;, or \&amp;quot;0\&amp;quot; to suppresses the error tracking category (Category:Hatnote templates with errors). This only has an effect if no page names are specified.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;yes&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;no&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 4&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l4&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 4&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the fourth linked article is to be displayed as. &amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 5&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l5&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 5&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the fifth linked article is to be displayed as. &amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label 6&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;l6&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Label 6&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;What the sixth linked article is to be displayed as. &amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;ifexists&amp;quot;: {&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;true&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;,&lt;br /&gt;
		&amp;quot;3&amp;quot;,&lt;br /&gt;
		&amp;quot;4&amp;quot;,&lt;br /&gt;
		&amp;quot;5&amp;quot;,&lt;br /&gt;
		&amp;quot;6&amp;quot;,&lt;br /&gt;
		&amp;quot;label 1&amp;quot;,&lt;br /&gt;
		&amp;quot;label 2&amp;quot;,&lt;br /&gt;
		&amp;quot;label 3&amp;quot;,&lt;br /&gt;
		&amp;quot;label 4&amp;quot;,&lt;br /&gt;
		&amp;quot;label 5&amp;quot;,&lt;br /&gt;
		&amp;quot;label 6&amp;quot;,&lt;br /&gt;
		&amp;quot;selfref&amp;quot;,&lt;br /&gt;
		&amp;quot;category&amp;quot;,&lt;br /&gt;
		&amp;quot;ifexists&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
{{Collapse bottom}}&lt;br /&gt;
&lt;br /&gt;
==Interwiki links==&lt;br /&gt;
To link to articles on foreign language Wikipedias, see [[Template:Further#Interwiki links]]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
{{Div col|colwidth=16em}}&lt;br /&gt;
* {{Tl|Broader}}&lt;br /&gt;
* {{Tl|Category see also}}&lt;br /&gt;
* {{Tl|For}}&lt;br /&gt;
* {{Tl|For introduction}}&lt;br /&gt;
* {{Tl|For outline}}&lt;br /&gt;
* {{Tl|For timeline}}&lt;br /&gt;
* {{Tl|Further}}&lt;br /&gt;
* {{Tl|Further if exists}}&lt;br /&gt;
* {{Tl|Further interlanguage link}}&lt;br /&gt;
* {{Tl|Further-text}} (for custom text)&lt;br /&gt;
* {{Tl|Hatnote}}&lt;br /&gt;
* {{Tl|Main}}&lt;br /&gt;
* {{Tl|Main if exists}}&lt;br /&gt;
* {{Tl|Main list}}&lt;br /&gt;
* {{Tl|See also-text}} (for custom text)&lt;br /&gt;
* {{Tl|Template see also}}&lt;br /&gt;
{{Div col end}}&lt;br /&gt;
&lt;br /&gt;
{{Hatnote templates}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Categories go here and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
[[Category:Hatnote templates]]&lt;br /&gt;
[[Category:Related-topic templates]]&lt;br /&gt;
[[Category:Wikipedia page-section templates]]&lt;br /&gt;
[[Category:Wikipedia see also]]&lt;br /&gt;
[[Category:Variadic templates]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Nowiki_template_demo&amp;diff=466</id>
		<title>Template:Nowiki template demo</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Nowiki_template_demo&amp;diff=466"/>
		<updated>2026-09-09T09:48:28Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Template test case|main}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Transclusion_count/data/S&amp;diff=464</id>
		<title>Module:Transclusion count/data/S</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Transclusion_count/data/S&amp;diff=464"/>
		<updated>2026-09-09T09:48:28Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
[&amp;quot;S&amp;quot;] = 4300,&lt;br /&gt;
[&amp;quot;S-aca&amp;quot;] = 6700,&lt;br /&gt;
[&amp;quot;S-ach&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;S-aft&amp;quot;] = 230000,&lt;br /&gt;
[&amp;quot;S-aft/check&amp;quot;] = 231000,&lt;br /&gt;
[&amp;quot;S-aft/filter&amp;quot;] = 231000,&lt;br /&gt;
[&amp;quot;S-bef&amp;quot;] = 235000,&lt;br /&gt;
[&amp;quot;S-bef/check&amp;quot;] = 235000,&lt;br /&gt;
[&amp;quot;S-bef/filter&amp;quot;] = 235000,&lt;br /&gt;
[&amp;quot;S-break&amp;quot;] = 6600,&lt;br /&gt;
[&amp;quot;S-bus&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;S-civ&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;S-dip&amp;quot;] = 6000,&lt;br /&gt;
[&amp;quot;S-end&amp;quot;] = 262000,&lt;br /&gt;
[&amp;quot;S-gov&amp;quot;] = 8600,&lt;br /&gt;
[&amp;quot;S-hon&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;S-hou&amp;quot;] = 9800,&lt;br /&gt;
[&amp;quot;S-inc&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;S-legal&amp;quot;] = 9900,&lt;br /&gt;
[&amp;quot;S-line_label&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;S-mil&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;S-new&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;S-non&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;S-npo&amp;quot;] = 4200,&lt;br /&gt;
[&amp;quot;S-off&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;S-par&amp;quot;] = 52000,&lt;br /&gt;
[&amp;quot;S-par/en&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;S-par/gb&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;S-par/uk&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;S-par/us-hs&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;S-par/us-sen&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;S-ppo&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;S-prec&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;S-reg&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;S-rel&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;S-roy&amp;quot;] = 2800,&lt;br /&gt;
[&amp;quot;S-sports&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;S-start&amp;quot;] = 254000,&lt;br /&gt;
[&amp;quot;S-ttl&amp;quot;] = 242000,&lt;br /&gt;
[&amp;quot;S-ttl/check&amp;quot;] = 242000,&lt;br /&gt;
[&amp;quot;S-vac&amp;quot;] = 7800,&lt;br /&gt;
[&amp;quot;SAU&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;SCO&amp;quot;] = 3800,&lt;br /&gt;
[&amp;quot;SDcat&amp;quot;] = 6820000,&lt;br /&gt;
[&amp;quot;SECOND&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;SGP&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;SIA&amp;quot;] = 2500,&lt;br /&gt;
[&amp;quot;SLL&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;SLO&amp;quot;] = 4900,&lt;br /&gt;
[&amp;quot;SMS&amp;quot;] = 6900,&lt;br /&gt;
[&amp;quot;SMU&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;SPI_archive_notice&amp;quot;] = 85000,&lt;br /&gt;
[&amp;quot;SPIarchive_notice&amp;quot;] = 82000,&lt;br /&gt;
[&amp;quot;SPIcat&amp;quot;] = 3800,&lt;br /&gt;
[&amp;quot;SPIclose&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;SPIpriorcases&amp;quot;] = 78000,&lt;br /&gt;
[&amp;quot;SR/Olympics_profile&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;SRB&amp;quot;] = 4400,&lt;br /&gt;
[&amp;quot;SS&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;SSPa&amp;quot;] = 2600,&lt;br /&gt;
[&amp;quot;STN&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;SUBJECTSPACE_formatted&amp;quot;] = 45000,&lt;br /&gt;
[&amp;quot;SUI&amp;quot;] = 9600,&lt;br /&gt;
[&amp;quot;SVG&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;SVG-Logo&amp;quot;] = 26000,&lt;br /&gt;
[&amp;quot;SVG-Res&amp;quot;] = 24000,&lt;br /&gt;
[&amp;quot;SVG-logo&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;SVK&amp;quot;] = 8800,&lt;br /&gt;
[&amp;quot;SVN&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;SWE&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Salts_by_element&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Sandbox_other&amp;quot;] = 474000,&lt;br /&gt;
[&amp;quot;Saturday&amp;quot;] = 2800,&lt;br /&gt;
[&amp;quot;Saved_book&amp;quot;] = 52000,&lt;br /&gt;
[&amp;quot;Sc&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Scholia&amp;quot;] = 3700,&lt;br /&gt;
[&amp;quot;School_block&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;School_disambiguation&amp;quot;] = 3500,&lt;br /&gt;
[&amp;quot;Schoolblock&amp;quot;] = 6900,&lt;br /&gt;
[&amp;quot;Schooldis&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;Schoolip&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;Scientist_icon&amp;quot;] = 16000,&lt;br /&gt;
[&amp;quot;Scientist_icon2&amp;quot;] = 16000,&lt;br /&gt;
[&amp;quot;Sclass&amp;quot;] = 34000,&lt;br /&gt;
[&amp;quot;Sclass2&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Screen_reader-only&amp;quot;] = 108000,&lt;br /&gt;
[&amp;quot;Screen_reader-only/styles.css&amp;quot;] = 148000,&lt;br /&gt;
[&amp;quot;Script&amp;quot;] = 7600,&lt;br /&gt;
[&amp;quot;Script/Arabic&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Script/Hebrew&amp;quot;] = 4900,&lt;br /&gt;
[&amp;quot;Script/Nastaliq&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;Script/doc/id-unk&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;Script/doc/id-unk/core&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;Script/doc/id-unk/is-iso-alpha4&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;Script/doc/id-unk/name-to-alpha4&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;Script/styles.css&amp;quot;] = 3400,&lt;br /&gt;
[&amp;quot;Script/styles_arabic.css&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Script/styles_hebrew.css&amp;quot;] = 4900,&lt;br /&gt;
[&amp;quot;Sdash&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Search_box&amp;quot;] = 74000,&lt;br /&gt;
[&amp;quot;Search_link&amp;quot;] = 27000,&lt;br /&gt;
[&amp;quot;Section_link&amp;quot;] = 166000,&lt;br /&gt;
[&amp;quot;Section_sizes&amp;quot;] = 4400,&lt;br /&gt;
[&amp;quot;See&amp;quot;] = 8900,&lt;br /&gt;
[&amp;quot;See_also&amp;quot;] = 218000,&lt;br /&gt;
[&amp;quot;Seealso&amp;quot;] = 8000,&lt;br /&gt;
[&amp;quot;Seiner_Majestät_Schiff&amp;quot;] = 6900,&lt;br /&gt;
[&amp;quot;Seiner_Majestät_Unterseeboot&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Select_skin&amp;quot;] = 5500,&lt;br /&gt;
[&amp;quot;Selected&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;Selected_article&amp;quot;] = 2500,&lt;br /&gt;
[&amp;quot;Selected_picture&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Self&amp;quot;] = 44000,&lt;br /&gt;
[&amp;quot;Self-published_inline&amp;quot;] = 4700,&lt;br /&gt;
[&amp;quot;Self-published_source&amp;quot;] = 6100,&lt;br /&gt;
[&amp;quot;Self-reference&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Self-reference_tool&amp;quot;] = 8200,&lt;br /&gt;
[&amp;quot;Semi-protected_indefinitely&amp;quot;] = 4800,&lt;br /&gt;
[&amp;quot;Sent_off&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;Sentoff&amp;quot;] = 6300,&lt;br /&gt;
[&amp;quot;Separated_entries&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Sequence&amp;quot;] = 4100,&lt;br /&gt;
[&amp;quot;Series_overview&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Serif&amp;quot;] = 5000,&lt;br /&gt;
[&amp;quot;Set_category&amp;quot;] = 38000,&lt;br /&gt;
[&amp;quot;Set_index_article&amp;quot;] = 6300,&lt;br /&gt;
[&amp;quot;Sets_taxobox_colour&amp;quot;] = 3400,&lt;br /&gt;
[&amp;quot;Sfn&amp;quot;] = 210000,&lt;br /&gt;
[&amp;quot;SfnRef&amp;quot;] = 165000,&lt;br /&gt;
[&amp;quot;Sfn_whitelist&amp;quot;] = 2600,&lt;br /&gt;
[&amp;quot;Sfnm&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Sfnp&amp;quot;] = 24000,&lt;br /&gt;
[&amp;quot;Sfnref&amp;quot;] = 18000,&lt;br /&gt;
[&amp;quot;Sfrac&amp;quot;] = 5100,&lt;br /&gt;
[&amp;quot;Sfrac/styles.css&amp;quot;] = 5200,&lt;br /&gt;
[&amp;quot;SharedIPEDU&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;Shared_IP&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Shared_IP_corp&amp;quot;] = 4100,&lt;br /&gt;
[&amp;quot;Shared_IP_edu&amp;quot;] = 186000,&lt;br /&gt;
[&amp;quot;Shared_IP_gov&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;Sharedip&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Sharedipedu&amp;quot;] = 3800,&lt;br /&gt;
[&amp;quot;Sherdog&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;Ship&amp;quot;] = 42000,&lt;br /&gt;
[&amp;quot;Ship_index&amp;quot;] = 7600,&lt;br /&gt;
[&amp;quot;Shipboxflag&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Shipboxflag/core&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Shipwrecks_navbox_footer&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Shipwrecks_navbox_footer/link&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Short_description&amp;quot;] = 6960000,&lt;br /&gt;
[&amp;quot;Short_description/lowercasecheck&amp;quot;] = 6960000,&lt;br /&gt;
[&amp;quot;Shortcut&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;Should_be_SVG&amp;quot;] = 8100,&lt;br /&gt;
[&amp;quot;Shy&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Sic&amp;quot;] = 39000,&lt;br /&gt;
[&amp;quot;Side_box&amp;quot;] = 1250000,&lt;br /&gt;
[&amp;quot;Sidebar&amp;quot;] = 320000,&lt;br /&gt;
[&amp;quot;Sidebar_games_events&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;Sidebar_person&amp;quot;] = 4900,&lt;br /&gt;
[&amp;quot;Sidebar_person/styles.css&amp;quot;] = 6300,&lt;br /&gt;
[&amp;quot;Sidebar_with_collapsible_lists&amp;quot;] = 83000,&lt;br /&gt;
[&amp;quot;Sigfig&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Significant_figures&amp;quot;] = 5600,&lt;br /&gt;
[&amp;quot;Significant_figures/rnd&amp;quot;] = 5200,&lt;br /&gt;
[&amp;quot;Signpost-subscription&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;Signpost-subscription/styles.css&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;Signpost/item&amp;quot;] = 49000,&lt;br /&gt;
[&amp;quot;Signpost/item/core&amp;quot;] = 49000,&lt;br /&gt;
[&amp;quot;Signpost/snippet-nopic&amp;quot;] = 3400,&lt;br /&gt;
[&amp;quot;Signpost/snippet/styles.css&amp;quot;] = 3700,&lt;br /&gt;
[&amp;quot;Sildb_prim&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Silver02&amp;quot;] = 18000,&lt;br /&gt;
[&amp;quot;Silver2&amp;quot;] = 46000,&lt;br /&gt;
[&amp;quot;Silver_medal&amp;quot;] = 6700,&lt;br /&gt;
[&amp;quot;Silver_medal_icon&amp;quot;] = 60000,&lt;br /&gt;
[&amp;quot;Similar_names&amp;quot;] = 3400,&lt;br /&gt;
[&amp;quot;Single+double&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Single+space&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;Single-innings_cricket_match&amp;quot;] = 4100,&lt;br /&gt;
[&amp;quot;Single_chart&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;Single_namespace&amp;quot;] = 339000,&lt;br /&gt;
[&amp;quot;Single_source&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Singlechart&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;Singles&amp;quot;] = 49000,&lt;br /&gt;
[&amp;quot;Sister-inline&amp;quot;] = 223000,&lt;br /&gt;
[&amp;quot;Sister-inline/styles.css&amp;quot;] = 223000,&lt;br /&gt;
[&amp;quot;Sister_project&amp;quot;] = 1130000,&lt;br /&gt;
[&amp;quot;Sister_project/styles.css&amp;quot;] = 1130000,&lt;br /&gt;
[&amp;quot;Sister_project_links&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Skip_to_talk&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;Skip_to_talk/styles.css&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;Sky&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;Sky/styles.css&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;Slink&amp;quot;] = 66000,&lt;br /&gt;
[&amp;quot;Slovak_municipality&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Slovak_municipality/geo&amp;quot;] = 2800,&lt;br /&gt;
[&amp;quot;Small&amp;quot;] = 652000,&lt;br /&gt;
[&amp;quot;Small_Solar_System_bodies&amp;quot;] = 3600,&lt;br /&gt;
[&amp;quot;Smallcaps&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Smallcaps/styles.css&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;Smalldiv&amp;quot;] = 44000,&lt;br /&gt;
[&amp;quot;Smaller&amp;quot;] = 79000,&lt;br /&gt;
[&amp;quot;Smiley&amp;quot;] = 54000,&lt;br /&gt;
[&amp;quot;Snd&amp;quot;] = 613000,&lt;br /&gt;
[&amp;quot;Snds&amp;quot;] = 6500,&lt;br /&gt;
[&amp;quot;Soccer_icon&amp;quot;] = 124000,&lt;br /&gt;
[&amp;quot;Soccer_icon2&amp;quot;] = 124000,&lt;br /&gt;
[&amp;quot;Soccer_icon4&amp;quot;] = 3500,&lt;br /&gt;
[&amp;quot;Soccerbase&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;Soccerbase_season&amp;quot;] = 8100,&lt;br /&gt;
[&amp;quot;Soccerway&amp;quot;] = 84000,&lt;br /&gt;
[&amp;quot;Sock&amp;quot;] = 56000,&lt;br /&gt;
[&amp;quot;Sock_list&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Sockcat&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;Sockmaster&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Sockpuppet&amp;quot;] = 287000,&lt;br /&gt;
[&amp;quot;Sockpuppet/altmaster&amp;quot;] = 3700,&lt;br /&gt;
[&amp;quot;Sockpuppet/categorise&amp;quot;] = 287000,&lt;br /&gt;
[&amp;quot;SockpuppetCheckuser&amp;quot;] = 5500,&lt;br /&gt;
[&amp;quot;Sockpuppet_category&amp;quot;] = 52000,&lt;br /&gt;
[&amp;quot;Sockpuppet_category/confirmed&amp;quot;] = 28000,&lt;br /&gt;
[&amp;quot;Sockpuppet_category/suspected&amp;quot;] = 24000,&lt;br /&gt;
[&amp;quot;Sockpuppetcheckuser&amp;quot;] = 3600,&lt;br /&gt;
[&amp;quot;Sockpuppeteer&amp;quot;] = 29000,&lt;br /&gt;
[&amp;quot;Soft_hyphen&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;Soft_redirect&amp;quot;] = 6500,&lt;br /&gt;
[&amp;quot;Soft_redirect_protection&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Softredirect&amp;quot;] = 3300,&lt;br /&gt;
[&amp;quot;Solar_luminosity&amp;quot;] = 5200,&lt;br /&gt;
[&amp;quot;Solar_mass&amp;quot;] = 6500,&lt;br /&gt;
[&amp;quot;Solar_radius&amp;quot;] = 5200,&lt;br /&gt;
[&amp;quot;Soldier_icon&amp;quot;] = 3900,&lt;br /&gt;
[&amp;quot;Soldier_icon2&amp;quot;] = 3900,&lt;br /&gt;
[&amp;quot;Songs_category&amp;quot;] = 9600,&lt;br /&gt;
[&amp;quot;Songs_category/core&amp;quot;] = 9600,&lt;br /&gt;
[&amp;quot;Sort&amp;quot;] = 122000,&lt;br /&gt;
[&amp;quot;Sort_under&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Sort_under/styles.css&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Sortname&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Source-attribution&amp;quot;] = 9200,&lt;br /&gt;
[&amp;quot;Source_assess&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;Source_assess_table&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;Source_attribution&amp;quot;] = 39000,&lt;br /&gt;
[&amp;quot;Source_check&amp;quot;] = 927000,&lt;br /&gt;
[&amp;quot;Sourcecheck&amp;quot;] = 927000,&lt;br /&gt;
[&amp;quot;Sources&amp;quot;] = 3600,&lt;br /&gt;
[&amp;quot;Sources_exist&amp;quot;] = 4300,&lt;br /&gt;
[&amp;quot;South_America_topic&amp;quot;] = 2700,&lt;br /&gt;
[&amp;quot;Sp&amp;quot;] = 165000,&lt;br /&gt;
[&amp;quot;Space&amp;quot;] = 130000,&lt;br /&gt;
[&amp;quot;Space+apostrophe+s&amp;quot;] = 27000,&lt;br /&gt;
[&amp;quot;Space+double&amp;quot;] = 7200,&lt;br /&gt;
[&amp;quot;Space+single&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;Spaced_en_dash&amp;quot;] = 647000,&lt;br /&gt;
[&amp;quot;Spaced_en_dash_space&amp;quot;] = 6600,&lt;br /&gt;
[&amp;quot;Spaced_ndash&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;Spaces&amp;quot;] = 735000,&lt;br /&gt;
[&amp;quot;Spain_metadata_Wikidata&amp;quot;] = 7400,&lt;br /&gt;
[&amp;quot;Spamlink&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Species_Latin_name_abbreviation_disambiguation&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Species_list&amp;quot;] = 25000,&lt;br /&gt;
[&amp;quot;Speciesbox&amp;quot;] = 394000,&lt;br /&gt;
[&amp;quot;Speciesbox/checkgenus&amp;quot;] = 392000,&lt;br /&gt;
[&amp;quot;Speciesbox/getGenus&amp;quot;] = 395000,&lt;br /&gt;
[&amp;quot;Speciesbox/getSpecies&amp;quot;] = 394000,&lt;br /&gt;
[&amp;quot;Speciesbox/name&amp;quot;] = 394000,&lt;br /&gt;
[&amp;quot;Speciesbox/parameterCheck&amp;quot;] = 394000,&lt;br /&gt;
[&amp;quot;Speciesbox/trim&amp;quot;] = 394000,&lt;br /&gt;
[&amp;quot;Specieslist&amp;quot;] = 9300,&lt;br /&gt;
[&amp;quot;Split_article&amp;quot;] = 4200,&lt;br /&gt;
[&amp;quot;Spnd&amp;quot;] = 4800,&lt;br /&gt;
[&amp;quot;Spoken_Wikipedia&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Sport_icon&amp;quot;] = 16000,&lt;br /&gt;
[&amp;quot;Sport_icon2&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;SportsYearCatUSstate&amp;quot;] = 6700,&lt;br /&gt;
[&amp;quot;Sports_club_or_team_people_category_header&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Sports_club_or_team_people_category_header/category1&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Sports_club_or_team_people_category_header/club_name&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Sports_links&amp;quot;] = 81000,&lt;br /&gt;
[&amp;quot;Sports_reference&amp;quot;] = 5100,&lt;br /&gt;
[&amp;quot;Squad_maintenance&amp;quot;] = 3800,&lt;br /&gt;
[&amp;quot;Sronly&amp;quot;] = 49000,&lt;br /&gt;
[&amp;quot;Srt&amp;quot;] = 7300,&lt;br /&gt;
[&amp;quot;Stack&amp;quot;] = 30000,&lt;br /&gt;
[&amp;quot;Stack/styles.css&amp;quot;] = 42000,&lt;br /&gt;
[&amp;quot;Stack_begin&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;Stack_end&amp;quot;] = 12000,&lt;br /&gt;
[&amp;quot;StaleIP&amp;quot;] = 3600,&lt;br /&gt;
[&amp;quot;StandardEbooks&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Standings_table_end&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Standings_table_entry&amp;quot;] = 25000,&lt;br /&gt;
[&amp;quot;Standings_table_entry/record&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Standings_table_start&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Standings_table_start/colheader&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Standings_table_start/colspan&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Standings_table_start/styles.css&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Starbox_astrometry&amp;quot;] = 5700,&lt;br /&gt;
[&amp;quot;Starbox_begin&amp;quot;] = 5800,&lt;br /&gt;
[&amp;quot;Starbox_catalog&amp;quot;] = 5700,&lt;br /&gt;
[&amp;quot;Starbox_character&amp;quot;] = 5700,&lt;br /&gt;
[&amp;quot;Starbox_detail&amp;quot;] = 5600,&lt;br /&gt;
[&amp;quot;Starbox_end&amp;quot;] = 5800,&lt;br /&gt;
[&amp;quot;Starbox_image&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Starbox_observe&amp;quot;] = 5800,&lt;br /&gt;
[&amp;quot;Starbox_reference&amp;quot;] = 5700,&lt;br /&gt;
[&amp;quot;Start-Class&amp;quot;] = 18000,&lt;br /&gt;
[&amp;quot;Start-date&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;Start_and_end_dates&amp;quot;] = 3700,&lt;br /&gt;
[&amp;quot;Start_box&amp;quot;] = 5500,&lt;br /&gt;
[&amp;quot;Start_date&amp;quot;] = 548000,&lt;br /&gt;
[&amp;quot;Start_date_and_age&amp;quot;] = 188000,&lt;br /&gt;
[&amp;quot;Start_date_and_years_ago&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Start_date_text&amp;quot;] = 3900,&lt;br /&gt;
[&amp;quot;Start_of_course_timeline&amp;quot;] = 5800,&lt;br /&gt;
[&amp;quot;Start_of_course_week&amp;quot;] = 6000,&lt;br /&gt;
[&amp;quot;Start_tab&amp;quot;] = 6700,&lt;br /&gt;
[&amp;quot;Startflatlist&amp;quot;] = 163000,&lt;br /&gt;
[&amp;quot;Startplainlist&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Static_IP&amp;quot;] = 5000,&lt;br /&gt;
[&amp;quot;Static_row_numbers&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Static_row_numbers/styles.css&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Station&amp;quot;] = 22000,&lt;br /&gt;
[&amp;quot;Station_link&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;Stdinchicite&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Steady&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;Sticky_header&amp;quot;] = 9700,&lt;br /&gt;
[&amp;quot;Sticky_header/styles.css&amp;quot;] = 27000,&lt;br /&gt;
[&amp;quot;Stl&amp;quot;] = 17000,&lt;br /&gt;
[&amp;quot;Stn&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Stn_art_lnk&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Stnlnk&amp;quot;] = 35000,&lt;br /&gt;
[&amp;quot;Stop&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;Store_norske_leksikon&amp;quot;] = 2500,&lt;br /&gt;
[&amp;quot;Storm_colour&amp;quot;] = 5800,&lt;br /&gt;
[&amp;quot;Storm_name&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Storm_path&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Stortingetbio&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;StoryTeleplay&amp;quot;] = 3200,&lt;br /&gt;
[&amp;quot;Str_count&amp;quot;] = 166000,&lt;br /&gt;
[&amp;quot;Str_endswith&amp;quot;] = 236000,&lt;br /&gt;
[&amp;quot;Str_find&amp;quot;] = 283000,&lt;br /&gt;
[&amp;quot;Str_index&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;Str_left&amp;quot;] = 339000,&lt;br /&gt;
[&amp;quot;Str_len&amp;quot;] = 167000,&lt;br /&gt;
[&amp;quot;Str_letter&amp;quot;] = 184000,&lt;br /&gt;
[&amp;quot;Str_letter/trim&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Str_number&amp;quot;] = 7200,&lt;br /&gt;
[&amp;quot;Str_number/trim&amp;quot;] = 226000,&lt;br /&gt;
[&amp;quot;Str_rep&amp;quot;] = 299000,&lt;br /&gt;
[&amp;quot;Str_right&amp;quot;] = 7100,&lt;br /&gt;
[&amp;quot;Str_startswith&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Str_trim&amp;quot;] = 4200,&lt;br /&gt;
[&amp;quot;Str_≠_len&amp;quot;] = 48000,&lt;br /&gt;
[&amp;quot;Str_≤_len&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Str_≥_len&amp;quot;] = 105000,&lt;br /&gt;
[&amp;quot;Strfind_short&amp;quot;] = 5400,&lt;br /&gt;
[&amp;quot;Strike&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;Strikethrough&amp;quot;] = 20000,&lt;br /&gt;
[&amp;quot;String_split&amp;quot;] = 5400,&lt;br /&gt;
[&amp;quot;Strip_tags&amp;quot;] = 41000,&lt;br /&gt;
[&amp;quot;Strong&amp;quot;] = 215000,&lt;br /&gt;
[&amp;quot;Structurae&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;Stub-Class&amp;quot;] = 18000,&lt;br /&gt;
[&amp;quot;Stub_Category&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Stub_category&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Stub_documentation&amp;quot;] = 42000,&lt;br /&gt;
[&amp;quot;Student_editor&amp;quot;] = 27000,&lt;br /&gt;
[&amp;quot;Student_sandbox&amp;quot;] = 4300,&lt;br /&gt;
[&amp;quot;Student_table_row&amp;quot;] = 7200,&lt;br /&gt;
[&amp;quot;Students_table&amp;quot;] = 7200,&lt;br /&gt;
[&amp;quot;Su&amp;quot;] = 4800,&lt;br /&gt;
[&amp;quot;Su-census1989&amp;quot;] = 4600,&lt;br /&gt;
[&amp;quot;Sub&amp;quot;] = 4600,&lt;br /&gt;
[&amp;quot;Subinfobox_bodystyle&amp;quot;] = 75000,&lt;br /&gt;
[&amp;quot;Subject_bar&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Suboff&amp;quot;] = 7500,&lt;br /&gt;
[&amp;quot;Subon&amp;quot;] = 7600,&lt;br /&gt;
[&amp;quot;Subpage_other&amp;quot;] = 411000,&lt;br /&gt;
[&amp;quot;Subscription_required&amp;quot;] = 35000,&lt;br /&gt;
[&amp;quot;Subsidebar_bodystyle&amp;quot;] = 6400,&lt;br /&gt;
[&amp;quot;Subst_only&amp;quot;] = 5500,&lt;br /&gt;
[&amp;quot;Substituted_comment&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;Succession_box&amp;quot;] = 119000,&lt;br /&gt;
[&amp;quot;Succession_box/check&amp;quot;] = 119000,&lt;br /&gt;
[&amp;quot;Succession_links&amp;quot;] = 218000,&lt;br /&gt;
[&amp;quot;Summer_Olympics_by_year_category_navigation&amp;quot;] = 2600,&lt;br /&gt;
[&amp;quot;Summer_Olympics_by_year_category_navigation/core&amp;quot;] = 2600,&lt;br /&gt;
[&amp;quot;Sunday&amp;quot;] = 2800,&lt;br /&gt;
[&amp;quot;Sup&amp;quot;] = 95000,&lt;br /&gt;
[&amp;quot;Suppress_categories&amp;quot;] = 6600,&lt;br /&gt;
[&amp;quot;Surname&amp;quot;] = 81000,&lt;br /&gt;
[&amp;quot;Swiss_metadata_Wikidata&amp;quot;] = 2900,&lt;br /&gt;
[&amp;quot;Swiss_populations&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Swiss_populations_NC&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Swiss_populations_YM&amp;quot;] = 2300,&lt;br /&gt;
[&amp;quot;Swiss_populations_ref&amp;quot;] = 2400,&lt;br /&gt;
[&amp;quot;Switcher&amp;quot;] = 8400,&lt;br /&gt;
[&amp;quot;Sz&amp;quot;] = 2500,&lt;br /&gt;
[&amp;quot;Module:SDcat&amp;quot;] = 6820000,&lt;br /&gt;
[&amp;quot;Module:SPI_archive_notice&amp;quot;] = 39000,&lt;br /&gt;
[&amp;quot;Module:SST&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;Module:SST/hosts&amp;quot;] = 13000,&lt;br /&gt;
[&amp;quot;Module:SST/registry&amp;quot;] = 275000,&lt;br /&gt;
[&amp;quot;Module:SST/shards/sets/COLLEDGE_SHIPS_RN&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Module:SST/shards/sets/TALBERT_BARRINGTON_ATLAS&amp;quot;] = 2100,&lt;br /&gt;
[&amp;quot;Module:Science_redirect&amp;quot;] = 322000,&lt;br /&gt;
[&amp;quot;Module:Science_redirect/conf&amp;quot;] = 322000,&lt;br /&gt;
[&amp;quot;Module:Section_link&amp;quot;] = 166000,&lt;br /&gt;
[&amp;quot;Module:Section_sizes&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Module:See_also_if_exists&amp;quot;] = 95000,&lt;br /&gt;
[&amp;quot;Module:Self&amp;quot;] = 44000,&lt;br /&gt;
[&amp;quot;Module:Self/license_migration_data.json&amp;quot;] = 23000,&lt;br /&gt;
[&amp;quot;Module:Self/styles.css&amp;quot;] = 44000,&lt;br /&gt;
[&amp;quot;Module:Separated_entries&amp;quot;] = 2770000,&lt;br /&gt;
[&amp;quot;Module:Series_overview&amp;quot;] = 10000,&lt;br /&gt;
[&amp;quot;Module:Settlement_Wikidata&amp;quot;] = 52000,&lt;br /&gt;
[&amp;quot;Module:Settlement_short_description&amp;quot;] = 729000,&lt;br /&gt;
[&amp;quot;Module:Shortcut&amp;quot;] = 29000,&lt;br /&gt;
[&amp;quot;Module:Shortcut/config&amp;quot;] = 29000,&lt;br /&gt;
[&amp;quot;Module:Shortcut/styles.css&amp;quot;] = 29000,&lt;br /&gt;
[&amp;quot;Module:Side_box&amp;quot;] = 1280000,&lt;br /&gt;
[&amp;quot;Module:Side_box/styles.css&amp;quot;] = 1280000,&lt;br /&gt;
[&amp;quot;Module:Sidebar&amp;quot;] = 435000,&lt;br /&gt;
[&amp;quot;Module:Sidebar/configuration&amp;quot;] = 435000,&lt;br /&gt;
[&amp;quot;Module:Sidebar/styles.css&amp;quot;] = 441000,&lt;br /&gt;
[&amp;quot;Module:Sidebar_games_events&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;Module:Sidebar_games_events/styles.css&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;Module:Singles&amp;quot;] = 49000,&lt;br /&gt;
[&amp;quot;Module:Sister_project_links&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Module:Sister_project_links/bar/styles.css&amp;quot;] = 7300,&lt;br /&gt;
[&amp;quot;Module:Sister_project_links/config&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Module:Sister_project_links/styles.css&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Module:Sister_project_logo&amp;quot;] = 1360000,&lt;br /&gt;
[&amp;quot;Module:Sister_project_logo/data&amp;quot;] = 1360000,&lt;br /&gt;
[&amp;quot;Module:Slovak_municipality&amp;quot;] = 3000,&lt;br /&gt;
[&amp;quot;Module:Sock_list&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Module:Sort&amp;quot;] = 156000,&lt;br /&gt;
[&amp;quot;Module:Sort_title&amp;quot;] = 40000,&lt;br /&gt;
[&amp;quot;Module:Sortkey&amp;quot;] = 105000,&lt;br /&gt;
[&amp;quot;Module:Split_article&amp;quot;] = 4200,&lt;br /&gt;
[&amp;quot;Module:Spoken_Wikipedia&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Module:Spoken_Wikipedia/configuration&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Module:Spoken_Wikipedia/styles.css&amp;quot;] = 2200,&lt;br /&gt;
[&amp;quot;Module:Sports_career&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Module:Sports_color&amp;quot;] = 79000,&lt;br /&gt;
[&amp;quot;Module:Sports_color/baseball&amp;quot;] = 36000,&lt;br /&gt;
[&amp;quot;Module:Sports_color/basketball&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;Module:Sports_color/ice_hockey&amp;quot;] = 3400,&lt;br /&gt;
[&amp;quot;Module:Sports_color/international_football&amp;quot;] = 43000,&lt;br /&gt;
[&amp;quot;Module:Sports_rbr_table&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;Module:Sports_rbr_table/styles.css&amp;quot;] = 15000,&lt;br /&gt;
[&amp;quot;Module:Sports_reference&amp;quot;] = 5100,&lt;br /&gt;
[&amp;quot;Module:Sports_results&amp;quot;] = 19000,&lt;br /&gt;
[&amp;quot;Module:Sports_results/styles.css&amp;quot;] = 11000,&lt;br /&gt;
[&amp;quot;Module:Sports_table&amp;quot;] = 74000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/Volleyball&amp;quot;] = 2500,&lt;br /&gt;
[&amp;quot;Module:Sports_table/WDL&amp;quot;] = 64000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/WDL_OT&amp;quot;] = 4000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/WL&amp;quot;] = 5500,&lt;br /&gt;
[&amp;quot;Module:Sports_table/WL_OT&amp;quot;] = 3100,&lt;br /&gt;
[&amp;quot;Module:Sports_table/argcheck&amp;quot;] = 74000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/styles.css&amp;quot;] = 74000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/sub&amp;quot;] = 74000,&lt;br /&gt;
[&amp;quot;Module:Sports_table/totalscheck&amp;quot;] = 52000,&lt;br /&gt;
[&amp;quot;Module:Stock_tickers/NYSE&amp;quot;] = 2000,&lt;br /&gt;
[&amp;quot;Module:Storm_categories&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Module:Storm_categories/categories&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Module:Storm_categories/colors&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Module:Storm_categories/icons&amp;quot;] = 5900,&lt;br /&gt;
[&amp;quot;Module:String&amp;quot;] = 14200000,&lt;br /&gt;
[&amp;quot;Module:String2&amp;quot;] = 2090000,&lt;br /&gt;
[&amp;quot;Module:Su&amp;quot;] = 14000,&lt;br /&gt;
[&amp;quot;Module:Subject_bar&amp;quot;] = 21000,&lt;br /&gt;
[&amp;quot;Module:Suppress_categories&amp;quot;] = 6600,&lt;br /&gt;
[&amp;quot;Module:Switcher&amp;quot;] = 8400,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Hatnote_templates&amp;diff=462</id>
		<title>Template:Hatnote templates</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Hatnote_templates&amp;diff=462"/>
		<updated>2026-09-09T09:48:28Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
| name = Hatnote templates&lt;br /&gt;
| state = {{{state|expanded}}}&lt;br /&gt;
| bodyclass = hlist&lt;br /&gt;
| belowclass = hlist&lt;br /&gt;
| title  = [[WP:Hatnote#Hatnote templates|Hatnote templates]]&lt;br /&gt;
&lt;br /&gt;
| above =&lt;br /&gt;
*[[Wikipedia:Hatnote]]&lt;br /&gt;
*[[Wikipedia:Disambiguation]]&lt;br /&gt;
*[[Wikipedia:Redirect]]&lt;br /&gt;
&lt;br /&gt;
| group1 = Generic&lt;br /&gt;
| list1 =&lt;br /&gt;
*{{tl|Hatnote}}&lt;br /&gt;
*{{tl|Hatnote group}}&lt;br /&gt;
*{{tl|Self-reference}}&lt;br /&gt;
&lt;br /&gt;
| group2 = For and about&lt;br /&gt;
| list2 =&lt;br /&gt;
*{{tl|For}}&lt;br /&gt;
*{{tl|For-text}} (for custom text)&lt;br /&gt;
*{{tl|For-multi}} (for multiple uses)&lt;br /&gt;
*{{tl|About}}&lt;br /&gt;
{{navbox|subgroup|&lt;br /&gt;
 | group1 = Variations&lt;br /&gt;
 | list1 = *{{tl|Other uses}}&lt;br /&gt;
*{{tl|Other uses of}}&lt;br /&gt;
*{{tl|Redirect-distinguish-for}}&lt;br /&gt;
*{{tl|About-distinguish}}&lt;br /&gt;
*{{tl|About-distinguish-text}}&lt;br /&gt;
}}&lt;br /&gt;
| group3 = Other topics&lt;br /&gt;
| list3 =&lt;br /&gt;
*{{tl|Other people}}&lt;br /&gt;
*{{tl|About other people}} (adds &amp;quot;about&amp;quot; description)&lt;br /&gt;
*{{tl|Similar names}}&lt;br /&gt;
*{{tl|Other storms}}&lt;br /&gt;
*{{tl|Other stars by Bayer designation}}&lt;br /&gt;
*{{tl|Other places}}&lt;br /&gt;
*{{tl|Other ships}}&lt;br /&gt;
&lt;br /&gt;
| group4 = Redirect&lt;br /&gt;
| list4 =&lt;br /&gt;
*{{tl|Redirect}}&lt;br /&gt;
*{{tl|Redirect2}} (for two redirects)&lt;br /&gt;
*{{tl|Redirect-multi}} (for multiple redirects)&lt;br /&gt;
*{{tl|Redirect-several}} (for several redirects, without listing each)&lt;br /&gt;
*{{tl|Redirect-synonym}}&lt;br /&gt;
*{{tl|Redirect-distinguish}}&lt;br /&gt;
*{{tl|Redirect-distinguish-text}}&lt;br /&gt;
*{{tl|Redirect-distinguish-for}}&lt;br /&gt;
*{{tl|Technical reasons}}&lt;br /&gt;
&lt;br /&gt;
| group5 = Distinguish&lt;br /&gt;
| list5 =&lt;br /&gt;
*{{tl|Distinguish}} (supports custom text)&lt;br /&gt;
*{{tl|About-distinguish}}&lt;br /&gt;
*{{tl|About-distinguish-text}} (for custom text)&lt;br /&gt;
*{{tl|Redirect-distinguish}}&lt;br /&gt;
*{{tl|Redirect-distinguish-text}} (for custom text)&lt;br /&gt;
*{{tl|Redirect-distinguish-for}}&lt;br /&gt;
&lt;br /&gt;
| group6 = For use in sections&lt;br /&gt;
| list6 =&lt;br /&gt;
*{{tl|Main}}&lt;br /&gt;
*{{tl|Main if exists}}&lt;br /&gt;
*{{tl|Main list}}&lt;br /&gt;
*{{tl|Further}}&lt;br /&gt;
*{{tl|Further-text}} (for custom text)&lt;br /&gt;
*{{tl|Further interlanguage link}}&lt;br /&gt;
*{{tl|See also}}&lt;br /&gt;
*{{tl|See also-text}} (for custom text)&lt;br /&gt;
*{{tl|For outline}}&lt;br /&gt;
*{{tl|For timeline}}&lt;br /&gt;
&lt;br /&gt;
| group7 = Special&lt;br /&gt;
| list7 =&lt;br /&gt;
*{{tl|Broader}}&lt;br /&gt;
*{{tl|For introduction}}&lt;br /&gt;
*{{tl|On Wikipedia}}&lt;br /&gt;
*{{tl|See Wiktionary}}&lt;br /&gt;
*{{tl|Transcluding article}}&lt;br /&gt;
*{{tl|Transcluded section}}&lt;br /&gt;
&lt;br /&gt;
| group8 = Subject specific&lt;br /&gt;
| list8 = &lt;br /&gt;
*{{tl|About year}}&lt;br /&gt;
*{{tl|Highway detail hatnote}}&lt;br /&gt;
*{{tl|For LMST}}&lt;br /&gt;
*{{tl|WikiIPA}}&lt;br /&gt;
&lt;br /&gt;
| below =&lt;br /&gt;
*{{Icon|cat}} [[:Category:Hatnote templates]]&lt;br /&gt;
**[[:Category:Hatnote modules|modules]]&lt;br /&gt;
**[[:Category:Hatnote templates for names|for [family] names]]&lt;br /&gt;
**[[:Category:Hatnote templates for lists|for lists]]&lt;br /&gt;
*[[Template:Category hatnote templates|hatnote templates for category pages]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Navbox documentation|expanded|hatnotes=&lt;br /&gt;
{{See also|Wikipedia:Hatnote#Hatnote templates}}&lt;br /&gt;
}}&lt;br /&gt;
{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Add categories below this line, and interwikis at Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Hatnote templates| ]]&lt;br /&gt;
[[Category:Documentation see also templates]]&lt;br /&gt;
}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Used_in_system&amp;diff=460</id>
		<title>Template:Used in system</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Used_in_system&amp;diff=460"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:High-use|main|1=|2={{{2|}}}|system={{#if:{{{1|}}}|{{{1}}}|in system messages}}&amp;lt;noinclude&amp;gt;|nocat=true&amp;lt;/noinclude&amp;gt;}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&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>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Pval&amp;diff=458</id>
		<title>Template:Pval</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Pval&amp;diff=458"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Param value]]&lt;br /&gt;
&lt;br /&gt;
{{Rcat shell|&lt;br /&gt;
{{R shortcut}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Param_value&amp;diff=456</id>
		<title>Template:Param value</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Param_value&amp;diff=456"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:Param value/styles.css&amp;quot;/&amp;gt;&amp;lt;span class=&amp;quot;tpl-pval__wrapper&amp;quot;&amp;gt;&amp;lt;code class=&amp;quot;tpl-pval__code&amp;quot; style=&amp;quot;{{#if:{{{border|{{{b|}}}}}}|border:{{{border|{{{b|}}}}}};}} {{#if:{{{bg-color|}}}|background-color: {{{bg-color}}}; color: {{Greater color contrast ratio|{{{bg-color}}}}};}} {{#if:{{{bg|}}}|color: {{Greater color contrast ratio|{{{bg}}}}};}} {{#ifexpr:{{str len|{{{1|}}}}} &amp;gt; 25|white-space: wrap;|}} {{{style|}}}&amp;quot;&amp;gt;{{replace|{{replace|{{replace|{{replace|{{replace|&amp;lt;includeonly&amp;gt;⊗ϑ{{{1|}}}⊗ϑ&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;value&amp;lt;/noinclude&amp;gt;| |{{{space|{{{sp|&amp;amp;nbsp;}}}}}}}}|#|&amp;amp;#35;}}|*|&amp;amp;#42;}}|:|&amp;amp;#58;}}|⊗ϑ|}}&amp;lt;/code&amp;gt;&amp;lt;/span&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>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Template_invocation&amp;diff=454</id>
		<title>Module:Template invocation</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Template_invocation&amp;diff=454"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides functions for making MediaWiki template invocations.&lt;br /&gt;
&lt;br /&gt;
local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--         Name:  p.name&lt;br /&gt;
--      Purpose:  Find a template invocation name from a page name or a&lt;br /&gt;
--                mw.title object.&lt;br /&gt;
--  Description:  This function detects whether a string or a mw.title&lt;br /&gt;
--                object has been passed in, and uses that to find a&lt;br /&gt;
--                template name as it is used in template invocations.&lt;br /&gt;
--   Parameters:  title - full page name or mw.title object for the&lt;br /&gt;
--                template (string or mw.title object)&lt;br /&gt;
--      Returns:  String&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.name(title)&lt;br /&gt;
	if type(title) == &#039;string&#039; then&lt;br /&gt;
		title = mw.title.new(title)&lt;br /&gt;
		if not title or #title.prefixedText == 0 or #title.interwiki &amp;gt; 0 then&lt;br /&gt;
			error(&amp;quot;invalid title in parameter #1 of function &#039;name&#039;&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(title) ~= &#039;table&#039; or type(title.getContent) ~= &#039;function&#039; then&lt;br /&gt;
		error(&amp;quot;parameter #1 of function &#039;name&#039; must be a string or a mw.title object&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if title.namespace == 10 then&lt;br /&gt;
		local text = title.text&lt;br /&gt;
		local check = mw.title.new(text, 10)&lt;br /&gt;
		-- Exclude the prefix, unless we have something like &amp;quot;Template:Category:Foo&amp;quot;, which can&#039;t be abbreviated to &amp;quot;Category:Foo&amp;quot;.&lt;br /&gt;
		return check and mw.title.equals(title, check) and text or title.prefixedText&lt;br /&gt;
	elseif title.namespace == 0 then&lt;br /&gt;
		return &#039;:&#039; .. title.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return title.prefixedText&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--         Name:  p.invocation&lt;br /&gt;
--      Purpose:  Construct a MediaWiki template invocation.&lt;br /&gt;
--  Description:  This function makes a template invocation from the&lt;br /&gt;
--                name and the arguments given. Note that it isn&#039;t&lt;br /&gt;
--                perfect: we have no way of knowing what whitespace was&lt;br /&gt;
--                in the original invocation, the named parameters will be&lt;br /&gt;
--                alphabetically sorted, and any parameters with duplicate keys&lt;br /&gt;
--                will be removed.&lt;br /&gt;
--   Parameters:  name - the template name, formatted as it will appear&lt;br /&gt;
--                    in the invocation. (string)&lt;br /&gt;
--                args - a table of template arguments. (table)&lt;br /&gt;
--                format - formatting options. (string, optional)&lt;br /&gt;
--                    Set to &amp;quot;nowiki&amp;quot; to escape, curly braces, pipes and&lt;br /&gt;
--                    equals signs with their HTML entities. The default&lt;br /&gt;
--                    is unescaped.&lt;br /&gt;
--      Returns:  String&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.invocation(name, args, format)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 1, name, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 3, format, &#039;string&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	-- Validate the args table and make a copy to work from. We need to&lt;br /&gt;
	-- make a copy of the table rather than just using the original, as&lt;br /&gt;
	-- some of the values may be erased when building the invocation.&lt;br /&gt;
	local invArgs = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local typek = type(k)&lt;br /&gt;
		local typev = type(v)&lt;br /&gt;
		if typek ~= &#039;string&#039; and typek ~= &#039;number&#039;&lt;br /&gt;
			or typev ~= &#039;string&#039; and typev ~= &#039;number&#039;&lt;br /&gt;
		then&lt;br /&gt;
			error(&amp;quot;invalid arguments table in parameter #2 of &amp;quot; ..&lt;br /&gt;
			&amp;quot;&#039;invocation&#039; (keys and values must be strings or numbers)&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		invArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the separators to use.&lt;br /&gt;
	local seps = {&lt;br /&gt;
		openb = &#039;{{&#039;,&lt;br /&gt;
		closeb = &#039;}}&#039;,&lt;br /&gt;
		pipe = &#039;|&#039;,&lt;br /&gt;
		equals = &#039;=&#039;&lt;br /&gt;
	}&lt;br /&gt;
	if format == &#039;nowiki&#039; then&lt;br /&gt;
		for k, v in pairs(seps) do&lt;br /&gt;
			seps[k] = mw.text.nowiki(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Build the invocation body with numbered args first, then named.&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	ret[#ret + 1] = seps.openb&lt;br /&gt;
	ret[#ret + 1] = name&lt;br /&gt;
	for k, v in ipairs(invArgs) do&lt;br /&gt;
		if type(v) == &#039;string&#039; and v:find(&#039;=&#039;, 1, true) then&lt;br /&gt;
			-- Likely something like 1=foo=bar which needs to be displayed as a named arg.&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = seps.pipe&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
			invArgs[k] = nil -- Erase the key so that we don&#039;t add the value twice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local keys = {} -- sort parameter list; better than arbitrary order&lt;br /&gt;
	for k, _ in pairs(invArgs) do&lt;br /&gt;
		keys[#keys + 1] = k&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(keys,&lt;br /&gt;
		function (a, b)&lt;br /&gt;
			-- Sort with keys of type number first, then string.&lt;br /&gt;
			if type(a) == type(b) then&lt;br /&gt;
				return a &amp;lt; b&lt;br /&gt;
			elseif type(a) == &#039;number&#039; then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	local maybeSpace = &#039;&#039; -- First named parameter should not be separated by a space&lt;br /&gt;
	for _, v in ipairs(keys) do -- Add named args based on sorted parameter list&lt;br /&gt;
		ret[#ret + 1] = maybeSpace .. seps.pipe&lt;br /&gt;
		ret[#ret + 1] = tostring(v)&lt;br /&gt;
		ret[#ret + 1] = seps.equals&lt;br /&gt;
		ret[#ret + 1] = invArgs[v]&lt;br /&gt;
		maybeSpace = &#039; &#039;&lt;br /&gt;
	end&lt;br /&gt;
	ret[#ret + 1] = seps.closeb&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Template_test_case/config&amp;diff=452</id>
		<title>Module:Template test case/config</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Template_test_case/config&amp;diff=452"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-------------------------------------------------------------------------------&lt;br /&gt;
--                    Module:Template test case/config&lt;br /&gt;
-- This module holds configuration data for [[Module:Template test case]].&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Options&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- The magic word used in place of the template name when making nowiki&lt;br /&gt;
-- invocations.&lt;br /&gt;
templateNameMagicWord = &#039;__TEMPLATENAME__&#039;,&lt;br /&gt;
&lt;br /&gt;
-- The subpage that sandboxes are typically stored on. Used when loading&lt;br /&gt;
-- wrapper template config and when guessing the sandbox template name.&lt;br /&gt;
sandboxSubpage = &#039;sandbox&#039;,&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Messages&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
msg = {&lt;br /&gt;
&lt;br /&gt;
-- The default header for test cases rendered in columns.&lt;br /&gt;
[&#039;columns-header&#039;] = &#039;Side by side comparison&#039;,&lt;br /&gt;
&lt;br /&gt;
-- The error message to use if a template option is missing.&lt;br /&gt;
-- $1 - the number of the missing template option.&lt;br /&gt;
[&#039;missing-template-option-error&#039;] = &amp;quot;one or more options ending in &#039;$1&#039; &amp;quot; ..&lt;br /&gt;
	&amp;quot;were detected, but no &#039;template$1&#039; option was found&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
-- The error message to use if a nowiki invocation is used but the template&lt;br /&gt;
-- name magic word is not found.&lt;br /&gt;
-- $1 - the value of the template name magic word&lt;br /&gt;
[&#039;nowiki-magic-word-error&#039;] = &amp;quot;the template invocation must include &#039;$1&#039; in &amp;quot; ..&lt;br /&gt;
	&amp;quot;place of the template name&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Wrapper template config.&lt;br /&gt;
-- The wrapper template config is a table with wrapper template names as keys,&lt;br /&gt;
-- and subtables containing two fields:&lt;br /&gt;
--   func - the function name to be used with that template. This must be a&lt;br /&gt;
--       function exported by the main module. This is optional: the default&lt;br /&gt;
--       value is &amp;quot;table&amp;quot;.&lt;br /&gt;
--   args - a table of default arguments to be used with that template. This is&lt;br /&gt;
--       is optional.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
wrappers = {&lt;br /&gt;
	[&#039;Template:Test case&#039;] = {},&lt;br /&gt;
	[&#039;Template:Testcase table&#039;] = {&lt;br /&gt;
		args = {_format = &#039;columns&#039;}&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Testcase rows&#039;] = {&lt;br /&gt;
		args = {_format = &#039;rows&#039;}&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Test case nowiki&#039;] = {&lt;br /&gt;
		func = &#039;nowiki&#039;&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Nowiki template demo&#039;] = {&lt;br /&gt;
		func = &#039;nowiki&#039;,&lt;br /&gt;
		args = {showheader = false, showtemplate2 = false}&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Collapsible test case&#039;] = {&lt;br /&gt;
		args = {_collapsible = true}&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Collapsible 2 test case&#039;] = {&lt;br /&gt;
		args = {_collapsible = true, _wantdiff = true}&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;Template:Inline test case&#039;] = {&lt;br /&gt;
		args = {_format = &#039;inline&#039;, _showcode = true}&lt;br /&gt;
	},&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- End config&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Template_test_case/data&amp;diff=450</id>
		<title>Module:Template test case/data</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Template_test_case/data&amp;diff=450"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module processes configuration data for use in&lt;br /&gt;
-- [[Module:Template test case]]. It is loaded from the main module with&lt;br /&gt;
-- mw.loadData.&lt;br /&gt;
&lt;br /&gt;
local cfg = require(&#039;Module:Template test case/config&#039;)&lt;br /&gt;
&lt;br /&gt;
local function escapePattern(s)&lt;br /&gt;
	s = s:gsub(&#039;%p&#039;, &#039;%%%0&#039;)&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape config items that need to be used as patterns. Doing it here is more&lt;br /&gt;
-- efficient, as mw.loadData saves them from having to be computed for every&lt;br /&gt;
-- test case on a page.&lt;br /&gt;
cfg.templateNameMagicWordPattern = escapePattern(cfg.templateNameMagicWord)&lt;br /&gt;
cfg.sandboxSubpagePattern = &#039;/&#039; .. escapePattern(cfg.sandboxSubpage) .. &#039;$&#039;&lt;br /&gt;
&lt;br /&gt;
return cfg&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Template_test_case&amp;diff=448</id>
		<title>Module:Template test case</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Template_test_case&amp;diff=448"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
   A module for generating test case templates.&lt;br /&gt;
&lt;br /&gt;
   This module incorporates code from the English Wikipedia&#039;s &amp;quot;Testcase table&amp;quot;&lt;br /&gt;
   module,[1] written by Frietjes [2] with contributions by Mr. Stradivarius [3]&lt;br /&gt;
   and Jackmcbarn,[4] and the English Wikipedia&#039;s &amp;quot;Testcase rows&amp;quot; module,[5]&lt;br /&gt;
   written by Mr. Stradivarius.&lt;br /&gt;
&lt;br /&gt;
   The &amp;quot;Testcase table&amp;quot; and &amp;quot;Testcase rows&amp;quot; modules are released under the&lt;br /&gt;
   CC BY-SA 3.0 License [6] and the GFDL.[7]&lt;br /&gt;
&lt;br /&gt;
   License: CC BY-SA 3.0 and the GFDL&lt;br /&gt;
   Author: Mr. Stradivarius&lt;br /&gt;
&lt;br /&gt;
   [1] https://en.wikipedia.org/wiki/Module:Testcase_table&lt;br /&gt;
   [2] https://en.wikipedia.org/wiki/User:Frietjes&lt;br /&gt;
   [3] https://en.wikipedia.org/wiki/User:Mr._Stradivarius&lt;br /&gt;
   [4] https://en.wikipedia.org/wiki/User:Jackmcbarn&lt;br /&gt;
   [5] https://en.wikipedia.org/wiki/Module:Testcase_rows&lt;br /&gt;
   [6] https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License&lt;br /&gt;
   [7] https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Set constants&lt;br /&gt;
local DATA_MODULE = &#039;Module:Template test case/data&#039;&lt;br /&gt;
local SYNTAXHIGHLIGHT_IS_PRESENT = mw.getCurrentFrame():preprocess( &amp;quot;&amp;lt;syntaxhighlight lang=\&amp;quot;text\&amp;quot;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&amp;quot; ) ~= &amp;quot;&amp;lt;syntaxhighlight lang=\&amp;quot;text\&amp;quot;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Shared methods&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function message(self, key, ...)&lt;br /&gt;
	-- This method is added to classes that need to deal with messages from the&lt;br /&gt;
	-- config module.&lt;br /&gt;
	local msg = self.cfg.msg[key]&lt;br /&gt;
	if select(1, ...) then&lt;br /&gt;
		return mw.message.newRawMessage(msg, ...):plain()&lt;br /&gt;
	else&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Template class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Template = {}&lt;br /&gt;
&lt;br /&gt;
Template.memoizedMethods = {&lt;br /&gt;
	-- Names of methods to be memoized in each object. This table should only&lt;br /&gt;
	-- hold methods with no parameters.&lt;br /&gt;
	getFullPage = true,&lt;br /&gt;
	getName = true,&lt;br /&gt;
	makeHeader = true,&lt;br /&gt;
	getOutput = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Template.new(invocationObj, options)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	-- Set input&lt;br /&gt;
	for k, v in pairs(options or {}) do&lt;br /&gt;
		if not Template[k] then&lt;br /&gt;
			obj[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	obj._invocation = invocationObj&lt;br /&gt;
&lt;br /&gt;
	-- Validate input&lt;br /&gt;
	if not obj.template and not obj.title then&lt;br /&gt;
		error(&#039;no template or title specified&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Memoize expensive method calls&lt;br /&gt;
	local memoFuncs = {}&lt;br /&gt;
	return setmetatable(obj, {&lt;br /&gt;
		__index = function (t, key)&lt;br /&gt;
			if Template.memoizedMethods[key] then&lt;br /&gt;
				local func = memoFuncs[key]&lt;br /&gt;
				if not func then&lt;br /&gt;
					local val = Template[key](t)&lt;br /&gt;
					func = function () return val end&lt;br /&gt;
					memoFuncs[key] = func&lt;br /&gt;
				end&lt;br /&gt;
				return func&lt;br /&gt;
			else&lt;br /&gt;
				return Template[key]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:getFullPage()&lt;br /&gt;
	if not self.template then&lt;br /&gt;
		return self.title.prefixedText&lt;br /&gt;
	elseif self.template:sub(1, 7) == &#039;#invoke&#039; then&lt;br /&gt;
		return &#039;Module&#039; .. self.template:sub(8):gsub(&#039;|.*&#039;, &#039;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		local strippedTemplate, hasColon = self.template:gsub(&#039;^:&#039;, &#039;&#039;, 1)&lt;br /&gt;
		hasColon = hasColon &amp;gt; 0&lt;br /&gt;
		local ns = strippedTemplate:match(&#039;^(.-):&#039;)&lt;br /&gt;
		ns = ns and mw.site.namespaces[ns]&lt;br /&gt;
		if ns then&lt;br /&gt;
			return strippedTemplate&lt;br /&gt;
		elseif hasColon then&lt;br /&gt;
			return strippedTemplate -- Main namespace&lt;br /&gt;
		else&lt;br /&gt;
			return mw.site.namespaces[10].name .. &#039;:&#039; .. strippedTemplate&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:getName()&lt;br /&gt;
	if self.template then&lt;br /&gt;
		return self.template&lt;br /&gt;
	else&lt;br /&gt;
		return require(&#039;Module:Template invocation&#039;).name(self.title)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:makeLink(display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return string.format(&#039;[[:%s|%s]]&#039;, self:getFullPage(), display)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&#039;[[:%s]]&#039;, self:getFullPage())&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:makeBraceLink(display)&lt;br /&gt;
	display = display or self:getName()&lt;br /&gt;
	local link = self:makeLink(display)&lt;br /&gt;
	return mw.text.nowiki(&#039;{{&#039;) .. link .. mw.text.nowiki(&#039;}}&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:makeHeader()&lt;br /&gt;
	return self.heading or self:makeBraceLink()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:getInvocation(format)&lt;br /&gt;
	format = format or &#039;&#039;&lt;br /&gt;
	local invocation = self._invocation:getInvocation{&lt;br /&gt;
		template = self:getName(),&lt;br /&gt;
		requireMagicWord = self.requireMagicWord,&lt;br /&gt;
	}&lt;br /&gt;
	if format == &#039;code&#039; or (not SYNTAXHIGHLIGHT_IS_PRESENT and format == &#039;inline&#039;) then&lt;br /&gt;
		-- if syntaxhighlight not present and inline required use code&lt;br /&gt;
		invocation = &#039;&amp;lt;code&amp;gt;&#039; .. mw.text.nowiki(invocation) .. &#039;&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
	elseif format == &#039;kbd&#039; then&lt;br /&gt;
		invocation = &#039;&amp;lt;kbd&amp;gt;&#039; .. mw.text.nowiki(invocation) .. &#039;&amp;lt;/kbd&amp;gt;&#039;&lt;br /&gt;
	elseif format == &#039;plain&#039; then&lt;br /&gt;
		invocation = mw.text.nowiki(invocation)&lt;br /&gt;
	elseif format == &#039;pre&#039; or not SYNTAXHIGHLIGHT_IS_PRESENT then&lt;br /&gt;
		-- if syntaxhighlight not present and block required use pre&lt;br /&gt;
		invocation = mw.text.encode(invocation, &#039;&amp;amp;&#039;)&lt;br /&gt;
		invocation = &#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039; .. invocation .. &#039;&amp;lt;/pre&amp;gt;&#039;&lt;br /&gt;
		invocation = mw.getCurrentFrame():preprocess(invocation)&lt;br /&gt;
	else&lt;br /&gt;
		-- use syntaxhighlight as default if present&lt;br /&gt;
		invocation = mw.text.encode(invocation, &#039;&amp;amp;&#039;)&lt;br /&gt;
		invocation = mw.getCurrentFrame():preprocess( &#039;&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&#039; .. ( format == &#039;inline&#039; and &#039; inline&#039; or &#039;&#039;) .. &#039;&amp;gt;&#039; .. invocation .. &#039;&amp;lt;/syntaxhighlight&amp;gt;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return invocation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Template:getOutput()&lt;br /&gt;
	local protect = require(&#039;Module:Protect&#039;)&lt;br /&gt;
	-- calling self._invocation:getOutput{...}&lt;br /&gt;
	return protect(self._invocation.getOutput)(self._invocation, {&lt;br /&gt;
		template = self:getName(),&lt;br /&gt;
		requireMagicWord = self.requireMagicWord,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- TestCase class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local TestCase = {}&lt;br /&gt;
TestCase.__index = TestCase&lt;br /&gt;
TestCase.message = message -- add the message method&lt;br /&gt;
&lt;br /&gt;
TestCase.renderMethods = {&lt;br /&gt;
	-- Keys in this table are values of the &amp;quot;format&amp;quot; option, values are the&lt;br /&gt;
	-- method for rendering that format.&lt;br /&gt;
	columns = &#039;renderColumns&#039;,&lt;br /&gt;
	rows = &#039;renderRows&#039;,&lt;br /&gt;
	tablerows = &#039;renderRows&#039;,&lt;br /&gt;
	inline = &#039;renderInline&#039;,&lt;br /&gt;
	cells = &#039;renderCells&#039;,&lt;br /&gt;
	default = &#039;renderDefault&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function TestCase.new(invocationObj, options, cfg)&lt;br /&gt;
	local obj = setmetatable({}, TestCase)&lt;br /&gt;
	obj.cfg = cfg&lt;br /&gt;
&lt;br /&gt;
	-- Separate general options from template options. Template options are&lt;br /&gt;
	-- numbered, whereas general options are not.&lt;br /&gt;
	local generalOptions, templateOptions = {}, {}&lt;br /&gt;
	for k, v in pairs(options) do&lt;br /&gt;
		local prefix, num&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			prefix, num = k:match(&#039;^(.-)([1-9][0-9]*)$&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if prefix then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			templateOptions[num] = templateOptions[num] or {}&lt;br /&gt;
			templateOptions[num][prefix] = v&lt;br /&gt;
		else&lt;br /&gt;
			generalOptions[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set general options&lt;br /&gt;
	generalOptions.showcode = yesno(generalOptions.showcode)&lt;br /&gt;
	generalOptions.showheader = yesno(generalOptions.showheader) ~= false&lt;br /&gt;
	generalOptions.showcaption = yesno(generalOptions.showcaption) ~= false&lt;br /&gt;
	generalOptions.collapsible = yesno(generalOptions.collapsible)&lt;br /&gt;
	generalOptions.notcollapsed = yesno(generalOptions.notcollapsed)&lt;br /&gt;
	generalOptions.wantdiff = yesno(generalOptions.wantdiff) &lt;br /&gt;
	obj.options = generalOptions&lt;br /&gt;
&lt;br /&gt;
	-- Preprocess template args&lt;br /&gt;
	for num, t in pairs(templateOptions) do&lt;br /&gt;
		if t.showtemplate ~= nil then&lt;br /&gt;
			t.showtemplate = yesno(t.showtemplate)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set up first two template options tables, so that if only the&lt;br /&gt;
	-- &amp;quot;template3&amp;quot; is specified it isn&#039;t made the first template when the&lt;br /&gt;
	-- the table options array is compressed.&lt;br /&gt;
	templateOptions[1] = templateOptions[1] or {}&lt;br /&gt;
	templateOptions[2] = templateOptions[2] or {}&lt;br /&gt;
&lt;br /&gt;
	-- Allow the &amp;quot;template&amp;quot; option to override the &amp;quot;template1&amp;quot; option for&lt;br /&gt;
	-- backwards compatibility with [[Module:Testcase table]].&lt;br /&gt;
	if generalOptions.template then&lt;br /&gt;
		templateOptions[1].template = generalOptions.template&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add default template options&lt;br /&gt;
	if templateOptions[1].template and not templateOptions[2].template then&lt;br /&gt;
		templateOptions[2].template = templateOptions[1].template ..&lt;br /&gt;
			&#039;/&#039; .. obj.cfg.sandboxSubpage&lt;br /&gt;
	end&lt;br /&gt;
	if not templateOptions[1].template then&lt;br /&gt;
		templateOptions[1].title = mw.title.getCurrentTitle().basePageTitle&lt;br /&gt;
	end&lt;br /&gt;
	if not templateOptions[2].template then&lt;br /&gt;
		templateOptions[2].title = templateOptions[1].title:subPageTitle(&lt;br /&gt;
			obj.cfg.sandboxSubpage&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove template options for any templates where the showtemplate&lt;br /&gt;
	-- argument is false. This prevents any output for that template.&lt;br /&gt;
	for num, t in pairs(templateOptions) do&lt;br /&gt;
		if t.showtemplate == false then&lt;br /&gt;
			templateOptions[num] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for missing template names.&lt;br /&gt;
	for num, t in pairs(templateOptions) do&lt;br /&gt;
		if not t.template and not t.title then&lt;br /&gt;
			error(obj:message(&lt;br /&gt;
				&#039;missing-template-option-error&#039;,&lt;br /&gt;
				num, num&lt;br /&gt;
			), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Compress templateOptions table so we can iterate over it with ipairs.&lt;br /&gt;
	templateOptions = (function (t)&lt;br /&gt;
		local nums = {}&lt;br /&gt;
		for num in pairs(t) do&lt;br /&gt;
			nums[#nums + 1] = num&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(nums)&lt;br /&gt;
		local ret = {}&lt;br /&gt;
		for i, num in ipairs(nums) do&lt;br /&gt;
			ret[i] = t[num]&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end)(templateOptions)&lt;br /&gt;
&lt;br /&gt;
	-- Don&#039;t require the __TEMPLATENAME__ magic word for nowiki invocations if&lt;br /&gt;
	-- there is only one template being output.&lt;br /&gt;
	if #templateOptions &amp;lt;= 1 then&lt;br /&gt;
		templateOptions[1].requireMagicWord = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	mw.logObject(templateOptions)&lt;br /&gt;
&lt;br /&gt;
	-- Make the template objects&lt;br /&gt;
	obj.templates = {}&lt;br /&gt;
	for i, options in ipairs(templateOptions) do&lt;br /&gt;
		table.insert(obj.templates, Template.new(invocationObj, options))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add tracking categories. At the moment we are only tracking templates&lt;br /&gt;
	-- that use any &amp;quot;heading&amp;quot; parameters or an &amp;quot;output&amp;quot; parameter.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	for k, v in pairs(options) do&lt;br /&gt;
		if type(k) == &#039;string&#039; and k:find(&#039;heading&#039;) then&lt;br /&gt;
			obj.categories[&#039;Test cases using heading parameters&#039;] = true&lt;br /&gt;
		elseif k == &#039;output&#039; then&lt;br /&gt;
			obj.categories[&#039;Test cases using output parameter&#039;] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:getTemplateOutput(templateObj)&lt;br /&gt;
	local output = templateObj:getOutput()&lt;br /&gt;
	if self.options.resetRefs then&lt;br /&gt;
		mw.getCurrentFrame():extensionTag(&#039;references&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:templateOutputIsEqual()&lt;br /&gt;
	-- Returns a boolean showing whether all of the template outputs are equal.&lt;br /&gt;
	-- The random parts of strip markers (see [[Help:Strip markers]]) are&lt;br /&gt;
	-- removed before comparison. This means a strip marker can contain anything&lt;br /&gt;
	-- and still be treated as equal, but it solves the problem of otherwise&lt;br /&gt;
	-- identical wikitext not returning as exactly equal.&lt;br /&gt;
	local function normaliseOutput(obj)&lt;br /&gt;
		local out = obj:getOutput()&lt;br /&gt;
		-- Remove the random parts from strip markers.&lt;br /&gt;
		out = out:gsub(&#039;(\127[^\127]*UNIQ%-%-%l+%-)%x+(%-%-?QINU[^\127]*\127)&#039;, &#039;%1%2&#039;)&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	local firstOutput = normaliseOutput(self.templates[1])&lt;br /&gt;
	for i = 2, #self.templates do&lt;br /&gt;
		local output = normaliseOutput(self.templates[i])&lt;br /&gt;
		if output ~= firstOutput then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:makeCollapsible(s)&lt;br /&gt;
	local title = self.options.title or self.templates[1]:makeHeader()&lt;br /&gt;
	if self.options.titlecode then&lt;br /&gt;
		title = self.templates[1]:getInvocation(&#039;kbd&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local isEqual = self:templateOutputIsEqual()&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;,&lt;br /&gt;
			args = { src = &#039;Module:Template test case/styles.css&#039; },&lt;br /&gt;
		})&lt;br /&gt;
		:addClass(&#039;mw-collapsible&#039;)&lt;br /&gt;
		:addClass(&#039;test-case-collapsible&#039;)&lt;br /&gt;
		:addClass(self.options.notcollapsed == false and &#039;mw-collapsed&#039; or nil)&lt;br /&gt;
	if self.options.wantdiff then&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(isEqual and &#039;test-case-collapsible-b1&#039; or &#039;test-case-collapsible-b2&#039;)&lt;br /&gt;
				:wikitext(title)&lt;br /&gt;
				:done()&lt;br /&gt;
	else&lt;br /&gt;
		if self.options.notcollapsed ~= true or false then&lt;br /&gt;
			root&lt;br /&gt;
				:addClass(isEqual and &#039;mw-collapsed&#039; or nil)&lt;br /&gt;
		end&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(isEqual and &#039;test-case-collapsible-b3&#039; or &#039;test-case-collapsible-b1&#039;)&lt;br /&gt;
				:wikitext(title)&lt;br /&gt;
				:done()&lt;br /&gt;
	end&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(&#039;mw-collapsible-content&#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(s)&lt;br /&gt;
			:newline()&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:renderColumns()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	if self.options.showcode then&lt;br /&gt;
		root&lt;br /&gt;
			:wikitext(self.templates[1]:getInvocation())&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tableroot = root:tag(&#039;table&#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.options.showheader then&lt;br /&gt;
		-- Caption&lt;br /&gt;
		if self.options.showcaption then&lt;br /&gt;
			tableroot&lt;br /&gt;
				:addClass(self.options.class)&lt;br /&gt;
				:cssText(self.options.style)&lt;br /&gt;
				:tag(&#039;caption&#039;)&lt;br /&gt;
					:wikitext(self.options.caption or self:message(&#039;columns-header&#039;))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Headers&lt;br /&gt;
		local headerRow = tableroot:tag(&#039;tr&#039;)&lt;br /&gt;
		if self.options.rowheader then&lt;br /&gt;
			-- rowheader is correct here. We need to add another th cell if&lt;br /&gt;
			-- rowheader is set further down, even if heading0 is missing.&lt;br /&gt;
			headerRow:tag(&#039;th&#039;):wikitext(self.options.heading0)&lt;br /&gt;
		end&lt;br /&gt;
		local width&lt;br /&gt;
		if #self.templates &amp;gt; 0 then&lt;br /&gt;
			width = tostring(math.floor(100 / #self.templates)) .. &#039;%&#039;&lt;br /&gt;
		else&lt;br /&gt;
			width = &#039;100%&#039;&lt;br /&gt;
		end&lt;br /&gt;
		for i, obj in ipairs(self.templates) do&lt;br /&gt;
			headerRow&lt;br /&gt;
				:tag(&#039;th&#039;)&lt;br /&gt;
					:css(&#039;width&#039;, width)&lt;br /&gt;
					:wikitext(obj:makeHeader())&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Row header&lt;br /&gt;
	local dataRow = tableroot:tag(&#039;tr&#039;):css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
	if self.options.rowheader then&lt;br /&gt;
		dataRow:tag(&#039;th&#039;)&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:wikitext(self.options.rowheader)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Template output&lt;br /&gt;
	for i, obj in ipairs(self.templates) do&lt;br /&gt;
		if self.options.output == &#039;nowiki+&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.options.before)&lt;br /&gt;
				:wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
				:wikitext(self.options.after)&lt;br /&gt;
				:wikitext(&#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039;)&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(&#039;&amp;lt;/pre&amp;gt;&#039;)&lt;br /&gt;
		elseif self.options.output == &#039;nowiki&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.options.before)&lt;br /&gt;
				:wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
				:wikitext(self.options.after)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:renderRows()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	if self.options.showcode then&lt;br /&gt;
		root&lt;br /&gt;
			:wikitext(self.templates[1]:getInvocation())&lt;br /&gt;
			:newline()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tableroot = root:tag(&#039;table&#039;)&lt;br /&gt;
	tableroot&lt;br /&gt;
		:addClass(self.options.class)&lt;br /&gt;
		:cssText(self.options.style)&lt;br /&gt;
&lt;br /&gt;
	if self.options.caption then&lt;br /&gt;
		tableroot&lt;br /&gt;
			:tag(&#039;caption&#039;)&lt;br /&gt;
				:wikitext(self.options.caption)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, obj in ipairs(self.templates) do&lt;br /&gt;
		local dataRow = tableroot:tag(&#039;tr&#039;)&lt;br /&gt;
		&lt;br /&gt;
		-- Header&lt;br /&gt;
		if self.options.showheader then&lt;br /&gt;
			if self.options.format == &#039;tablerows&#039; then&lt;br /&gt;
				dataRow:tag(&#039;th&#039;)&lt;br /&gt;
					:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
					:css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, &#039;left&#039;)&lt;br /&gt;
					:wikitext(obj:makeHeader())&lt;br /&gt;
				dataRow:tag(&#039;td&#039;)&lt;br /&gt;
					:css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 1em&#039;)&lt;br /&gt;
					:wikitext(&#039;→&#039;)&lt;br /&gt;
			else&lt;br /&gt;
				dataRow:tag(&#039;td&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, &#039;center&#039;)&lt;br /&gt;
					:css(&#039;font-weight&#039;, &#039;bold&#039;)&lt;br /&gt;
					:wikitext(obj:makeHeader())&lt;br /&gt;
				dataRow = tableroot:tag(&#039;tr&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Template output&lt;br /&gt;
		if self.options.output == &#039;nowiki+&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
                :wikitext(self.options.before)&lt;br /&gt;
                :wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
                :wikitext(self.options.after)&lt;br /&gt;
                :wikitext(&#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039;)&lt;br /&gt;
                :wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
                :wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
                :wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
                :wikitext(&#039;&amp;lt;/pre&amp;gt;&#039;)&lt;br /&gt;
		elseif self.options.output == &#039;nowiki&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.options.before)&lt;br /&gt;
				:wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
				:wikitext(self.options.after)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:renderInline()&lt;br /&gt;
	local arrow = mw.language.getContentLanguage():getArrow(&#039;forwards&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, obj in ipairs(self.templates) do&lt;br /&gt;
		local line = {}&lt;br /&gt;
		line[#line + 1] = self.options.prefix or &#039;* &#039;&lt;br /&gt;
		if self.options.showcode then&lt;br /&gt;
			line[#line + 1] = obj:getInvocation(&#039;inline&#039;)&lt;br /&gt;
			line[#line + 1] = &#039; &#039;&lt;br /&gt;
			line[#line + 1] = arrow&lt;br /&gt;
			line[#line + 1] = &#039; &#039;&lt;br /&gt;
		end&lt;br /&gt;
		if self.options.output == &#039;nowiki+&#039; then&lt;br /&gt;
			line[#line + 1] = self.options.before or &amp;quot;&amp;quot;&lt;br /&gt;
			line[#line + 1] = self:getTemplateOutput(obj)&lt;br /&gt;
			line[#line + 1] = self.options.after or &amp;quot;&amp;quot;&lt;br /&gt;
			line[#line + 1] = &#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;)&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;)&lt;br /&gt;
			line[#line + 1] = &#039;&amp;lt;/pre&amp;gt;&#039;&lt;br /&gt;
		elseif self.options.output == &#039;nowiki&#039; then&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;)&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))&lt;br /&gt;
			line[#line + 1] = mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			line[#line + 1] = self.options.before or &amp;quot;&amp;quot;&lt;br /&gt;
			line[#line + 1] = self:getTemplateOutput(obj)&lt;br /&gt;
			line[#line + 1] = self.options.after or &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret + 1] = table.concat(line)&lt;br /&gt;
	end&lt;br /&gt;
	if self.options.addline then&lt;br /&gt;
		local line = {}&lt;br /&gt;
		line[#line + 1] = self.options.prefix or &#039;* &#039;&lt;br /&gt;
		line[#line + 1] = self.options.addline&lt;br /&gt;
		ret[#ret + 1] = table.concat(line)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret, &#039;\n&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:renderCells()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	local dataRow = root:tag(&#039;tr&#039;)&lt;br /&gt;
	dataRow&lt;br /&gt;
		:css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
		:addClass(self.options.class)&lt;br /&gt;
		:cssText(self.options.style)&lt;br /&gt;
&lt;br /&gt;
	-- Row header&lt;br /&gt;
	if self.options.rowheader then&lt;br /&gt;
		dataRow:tag(&#039;th&#039;)&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(self.options.rowheader or self:message(&#039;row-header&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	-- Caption&lt;br /&gt;
	if self.options.showcaption then&lt;br /&gt;
		dataRow:tag(&#039;th&#039;)&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(self.options.caption or self:message(&#039;columns-header&#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Show code&lt;br /&gt;
	if self.options.showcode then&lt;br /&gt;
		dataRow:tag(&#039;td&#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(self:getInvocation(&#039;inline&#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Template output&lt;br /&gt;
	for i, obj in ipairs(self.templates) do&lt;br /&gt;
		if self.options.output == &#039;nowiki+&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.options.before)&lt;br /&gt;
				:wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
				:wikitext(self.options.after)&lt;br /&gt;
				:wikitext(&#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039;)&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(&#039;&amp;lt;/pre&amp;gt;&#039;)&lt;br /&gt;
		elseif self.options.output == &#039;nowiki&#039; then&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))&lt;br /&gt;
				:wikitext(mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			dataRow:tag(&#039;td&#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.options.before)&lt;br /&gt;
				:wikitext(self:getTemplateOutput(obj))&lt;br /&gt;
				:wikitext(self.options.after)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:renderDefault()&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	if self.options.showcode then&lt;br /&gt;
		ret[#ret + 1] = self.templates[1]:getInvocation()&lt;br /&gt;
	end&lt;br /&gt;
	for i, obj in ipairs(self.templates) do&lt;br /&gt;
		ret[#ret + 1] = &#039;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		if self.options.showheader then&lt;br /&gt;
			ret[#ret + 1] = obj:makeHeader()&lt;br /&gt;
		end&lt;br /&gt;
		if self.options.output == &#039;nowiki+&#039; then&lt;br /&gt;
			ret[#ret + 1] = (self.options.before or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			self:getTemplateOutput(obj) ..&lt;br /&gt;
			(self.options.after or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			&#039;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&#039; ..&lt;br /&gt;
			mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			mw.text.nowiki(self:getTemplateOutput(obj)) ..&lt;br /&gt;
			mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;) .. &#039;&amp;lt;/pre&amp;gt;&#039;&lt;br /&gt;
		elseif self.options.output == &#039;nowiki&#039; then&lt;br /&gt;
			ret[#ret + 1] = mw.text.nowiki(self.options.before or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			mw.text.nowiki(self:getTemplateOutput(obj)) ..&lt;br /&gt;
			mw.text.nowiki(self.options.after or &amp;quot;&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = (self.options.before or &amp;quot;&amp;quot;) ..&lt;br /&gt;
			self:getTemplateOutput(obj) ..&lt;br /&gt;
			(self.options.after or &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret, &#039;\n\n&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TestCase:__tostring()&lt;br /&gt;
	local format = self.options.format&lt;br /&gt;
	local method = format and TestCase.renderMethods[format] or &#039;renderDefault&#039;&lt;br /&gt;
	local ret = self[method](self)&lt;br /&gt;
	if self.options.collapsible then&lt;br /&gt;
		ret = self:makeCollapsible(ret)&lt;br /&gt;
	end&lt;br /&gt;
	for cat in pairs(self.categories) do&lt;br /&gt;
		ret = ret .. string.format(&#039;[[Category:%s]]&#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Nowiki invocation class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local NowikiInvocation = {}&lt;br /&gt;
NowikiInvocation.__index = NowikiInvocation&lt;br /&gt;
NowikiInvocation.message = message -- Add the message method&lt;br /&gt;
&lt;br /&gt;
function NowikiInvocation.new(invocation, cfg)&lt;br /&gt;
	local obj = setmetatable({}, NowikiInvocation)&lt;br /&gt;
	obj.cfg = cfg&lt;br /&gt;
	invocation = mw.text.unstrip(invocation)&lt;br /&gt;
	-- Decode HTML entities for &amp;lt;, &amp;gt;, and &amp;quot;. This means that HTML entities in&lt;br /&gt;
	-- the original code must be escaped as e.g. &amp;amp;amp;lt;, which is unfortunate,&lt;br /&gt;
	-- but it is the best we can do as the distinction between &amp;lt;, &amp;gt;, &amp;quot; and &amp;amp;lt;,&lt;br /&gt;
	-- &amp;amp;gt;, &amp;amp;quot; is lost during the original nowiki operation.&lt;br /&gt;
	invocation = invocation:gsub(&#039;&amp;amp;lt;&#039;, &#039;&amp;lt;&#039;)&lt;br /&gt;
	invocation = invocation:gsub(&#039;&amp;amp;gt;&#039;, &#039;&amp;gt;&#039;)&lt;br /&gt;
	invocation = invocation:gsub(&#039;&amp;amp;quot;&#039;, &#039;&amp;quot;&#039;)&lt;br /&gt;
	obj.invocation = invocation&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function NowikiInvocation:getInvocation(options)&lt;br /&gt;
	local template = options.template:gsub(&#039;%%&#039;, &#039;%%%%&#039;) -- Escape &amp;quot;%&amp;quot; with &amp;quot;%%&amp;quot;&lt;br /&gt;
	local invocation, count = self.invocation:gsub(&lt;br /&gt;
		self.cfg.templateNameMagicWordPattern,&lt;br /&gt;
		template&lt;br /&gt;
	)&lt;br /&gt;
	if options.requireMagicWord ~= false and count &amp;lt; 1 then&lt;br /&gt;
		error(self:message(&lt;br /&gt;
			&#039;nowiki-magic-word-error&#039;,&lt;br /&gt;
			self.cfg.templateNameMagicWord&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
	return invocation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function NowikiInvocation:getOutput(options)&lt;br /&gt;
	local invocation = self:getInvocation(options)&lt;br /&gt;
	return mw.getCurrentFrame():preprocess(invocation)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Table invocation class&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local TableInvocation = {}&lt;br /&gt;
TableInvocation.__index = TableInvocation&lt;br /&gt;
TableInvocation.message = message -- Add the message method&lt;br /&gt;
&lt;br /&gt;
function TableInvocation.new(invokeArgs, nowikiCode, cfg)&lt;br /&gt;
	local obj = setmetatable({}, TableInvocation)&lt;br /&gt;
	obj.cfg = cfg&lt;br /&gt;
	obj.invokeArgs = invokeArgs&lt;br /&gt;
	obj.code = nowikiCode&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TableInvocation:getInvocation(options)&lt;br /&gt;
	if self.code then&lt;br /&gt;
		local nowikiObj = NowikiInvocation.new(self.code, self.cfg)&lt;br /&gt;
		return nowikiObj:getInvocation(options)&lt;br /&gt;
	else&lt;br /&gt;
		return require(&#039;Module:Template invocation&#039;).invocation(&lt;br /&gt;
			options.template,&lt;br /&gt;
			self.invokeArgs&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function TableInvocation:getOutput(options)&lt;br /&gt;
	if (options.template:sub(1, 7) == &#039;#invoke&#039;) then&lt;br /&gt;
		local moduleCall = mw.text.split(options.template, &#039;|&#039;, true)&lt;br /&gt;
		local args = mw.clone(self.invokeArgs)&lt;br /&gt;
		table.insert(args, 1, moduleCall[2])&lt;br /&gt;
		return mw.getCurrentFrame():callParserFunction(moduleCall[1], args)&lt;br /&gt;
	end&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
		title = options.template,&lt;br /&gt;
		args = self.invokeArgs&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Bridge functions&lt;br /&gt;
--&lt;br /&gt;
-- These functions translate template arguments into forms that can be accepted&lt;br /&gt;
-- by the different classes, and return the results.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local bridge = {}&lt;br /&gt;
&lt;br /&gt;
function bridge.table(args, cfg)&lt;br /&gt;
	cfg = cfg or mw.loadData(DATA_MODULE)&lt;br /&gt;
&lt;br /&gt;
	local options, invokeArgs = {}, {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local optionKey = type(k) == &#039;string&#039; and k:match(&#039;^_(.*)$&#039;)&lt;br /&gt;
		if optionKey then&lt;br /&gt;
			if type(v) == &#039;string&#039; then&lt;br /&gt;
				v = v:match(&#039;^%s*(.-)%s*$&#039;) -- trim whitespace&lt;br /&gt;
			end&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				options[optionKey] = v&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			invokeArgs[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Allow passing a nowiki invocation as an option. While this means users&lt;br /&gt;
	-- have to pass in the code twice, whitespace is preserved and &amp;amp;lt; etc.&lt;br /&gt;
	-- will work as intended.&lt;br /&gt;
	local nowikiCode = options.code&lt;br /&gt;
	options.code = nil&lt;br /&gt;
&lt;br /&gt;
	local invocationObj = TableInvocation.new(invokeArgs, nowikiCode, cfg)&lt;br /&gt;
	local testCaseObj = TestCase.new(invocationObj, options, cfg)&lt;br /&gt;
	return tostring(testCaseObj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function bridge.nowiki(args, cfg)&lt;br /&gt;
	cfg = cfg or mw.loadData(DATA_MODULE)&lt;br /&gt;
	&lt;br /&gt;
	-- Convert args beginning with _ for consistency with the normal bridge&lt;br /&gt;
	local newArgs = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local normalName = type(k) == &amp;quot;string&amp;quot; and string.match(k, &amp;quot;^_(.*)$&amp;quot;)&lt;br /&gt;
		if normalName then&lt;br /&gt;
			newArgs[normalName] = v&lt;br /&gt;
		else&lt;br /&gt;
			newArgs[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local code = newArgs.code or newArgs[1]&lt;br /&gt;
	local invocationObj = NowikiInvocation.new(code, cfg)&lt;br /&gt;
	newArgs.code = nil&lt;br /&gt;
	newArgs[1] = nil&lt;br /&gt;
	-- Assume we want to see the code as we already passed it in.&lt;br /&gt;
	newArgs.showcode = newArgs.showcode or true&lt;br /&gt;
	local testCaseObj = TestCase.new(invocationObj, newArgs, cfg)&lt;br /&gt;
	return tostring(testCaseObj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, cfg)&lt;br /&gt;
	cfg = cfg or mw.loadData(DATA_MODULE)&lt;br /&gt;
&lt;br /&gt;
	-- Load the wrapper config, if any.&lt;br /&gt;
	local wrapperConfig&lt;br /&gt;
	if frame.getParent then&lt;br /&gt;
		local title = frame:getParent():getTitle()&lt;br /&gt;
		local template = title:gsub(cfg.sandboxSubpagePattern, &#039;&#039;)&lt;br /&gt;
		wrapperConfig = cfg.wrappers[template]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Work out the function we will call, use it to generate the config for&lt;br /&gt;
	-- Module:Arguments, and use Module:Arguments to find the arguments passed&lt;br /&gt;
	-- by the user.&lt;br /&gt;
	local func = wrapperConfig and wrapperConfig.func or &#039;table&#039;&lt;br /&gt;
	local userArgs = require(&#039;Module:Arguments&#039;).getArgs(frame, {&lt;br /&gt;
		parentOnly = wrapperConfig,&lt;br /&gt;
		frameOnly = not wrapperConfig,&lt;br /&gt;
		trim = func ~= &#039;table&#039;,&lt;br /&gt;
		removeBlanks = func ~= &#039;table&#039;&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Get default args and build the args table. User-specified args overwrite&lt;br /&gt;
	-- default args.&lt;br /&gt;
	local defaultArgs = wrapperConfig and wrapperConfig.args or {}&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(defaultArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(userArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return bridge[func](args, cfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses() -- For testing&lt;br /&gt;
	return {&lt;br /&gt;
		Template = Template,&lt;br /&gt;
		TestCase = TestCase,&lt;br /&gt;
		NowikiInvocation = NowikiInvocation,&lt;br /&gt;
		TableInvocation = TableInvocation&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:High-use&amp;diff=446</id>
		<title>Module:High-use</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:High-use&amp;diff=446"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local _fetch = require(&#039;Module:Transclusion_count&#039;)._fetch -- _fetch looks at the &#039;demo&#039; argument&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local lang_obj = mw.getContentLanguage() -- this here because the language object is used multiple places in the module&lt;br /&gt;
local large_count_cutoff = 100000&lt;br /&gt;
local approx_num_total_pages = 66000000&lt;br /&gt;
&lt;br /&gt;
local user_subpage_info_page = &#039;Wikipedia:User pages#SUB&#039;&lt;br /&gt;
local sandbox_module_page = &#039;Module:Sandbox&#039;&lt;br /&gt;
local system_messages_cat = &#039;Pages used in system messages needing protection&#039;&lt;br /&gt;
local sandbox_word = &#039;sandbox&#039;&lt;br /&gt;
local testcases_word = &#039;testcases&#039;&lt;br /&gt;
local doc_word = &#039;doc&#039;&lt;br /&gt;
&lt;br /&gt;
local function count_from_args(args)&lt;br /&gt;
	if tonumber(args.count) then -- check if function has already been used&lt;br /&gt;
		return tonumber(args.count) -- early exit if so&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local count&lt;br /&gt;
	&lt;br /&gt;
	if yesno(args[&#039;fetch&#039;]) ~= false then&lt;br /&gt;
		count = _fetch(args) -- fetch transclusion count&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- use explicitly-provided count when fetch fails&lt;br /&gt;
	if count == nil and args[1] ~= nil and args[1] ~= &#039;&#039; then&lt;br /&gt;
		-- convert local language number string to a number understandable by Lua&lt;br /&gt;
		count = mw.ustring.gsub(args[1], &#039;+$&#039;, &#039;&#039;)&lt;br /&gt;
		count = lang_obj:parseFormattedNumber(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- in case someone writes a non-positive number&lt;br /&gt;
	if count and count &amp;gt; 0 then&lt;br /&gt;
		return count&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Actions if there is a large (greater than or equal to 100,000) transclusion count&lt;br /&gt;
local function risk_boolean(args)&lt;br /&gt;
	if args.risk == true or args.risk == false then&lt;br /&gt;
		return args.risk&lt;br /&gt;
	elseif args[1]  == &#039;risk&#039; then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		local count = count_from_args(args)&lt;br /&gt;
		if count and count &amp;gt;= large_count_cutoff 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 retained for backwards compatibility&lt;br /&gt;
function p._risk(args)&lt;br /&gt;
	return risk_boolean(args) and &#039;risk&#039; or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- function retained for backwards compatibility&lt;br /&gt;
function p.risk(frame)&lt;br /&gt;
	return p._risk(getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- count and no_percent arguments retained for backwards compatibility&lt;br /&gt;
function p._num(args, count, no_percent)&lt;br /&gt;
	if count == nil then&lt;br /&gt;
		count = count_from_args(args)&lt;br /&gt;
	end&lt;br /&gt;
	args.count = count&lt;br /&gt;
	args.risk = risk_boolean(args)&lt;br /&gt;
	&lt;br /&gt;
	-- Build output string&lt;br /&gt;
	local return_value = &#039;&#039;&lt;br /&gt;
	if args.count == nil and args.risk then&lt;br /&gt;
		return &#039;a very large number of&#039;&lt;br /&gt;
	elseif args.count == nil then&lt;br /&gt;
		return &#039;many&#039;&lt;br /&gt;
	else&lt;br /&gt;
		-- Use 2 significant figures for smaller numbers and 3 for larger ones&lt;br /&gt;
		local sigfig = 2&lt;br /&gt;
		if args.count &amp;gt;= large_count_cutoff then&lt;br /&gt;
			sigfig = 3&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Prepare to round to appropriate number of sigfigs&lt;br /&gt;
		local f = math.floor(math.log10(args.count)) - sigfig + 1&lt;br /&gt;
		&lt;br /&gt;
		-- Round and insert &#039;approximately&#039; or &#039;+&#039; when appropriate&lt;br /&gt;
		if yesno(args[2]) == true or (type(args[1]) == &#039;string&#039; and (mw.ustring.sub(args[1], -1) == &#039;+&#039;)) then&lt;br /&gt;
			-- Round down&lt;br /&gt;
			return_value = string.format(&#039;%s+&#039;, lang_obj:formatNum(math.floor( (args.count / 10^(f)) ) * (10^(f))) )&lt;br /&gt;
		else&lt;br /&gt;
			-- Round to nearest&lt;br /&gt;
			return_value = string.format(&#039;approximately&amp;amp;#x20;%s&#039;, lang_obj:formatNum(math.floor( (args.count / 10^(f)) + 0.5) * (10^(f))) )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Insert percentage of pages if that is likely to be &amp;gt;= 1% and when |no-percent= not set to yes&lt;br /&gt;
		no_percent = yesno(no_percent or args[&#039;no-percent&#039;])&lt;br /&gt;
		if args.count and args.count &amp;gt;= approx_num_total_pages/100 and not no_percent then&lt;br /&gt;
			local num_total_pages = mw.getCurrentFrame():callParserFunction(&#039;NUMBEROFPAGES&#039;, &#039;R&#039;)&lt;br /&gt;
			local total_percent = math.floor( ( ( args.count/num_total_pages ) * 100) + 0.5)&lt;br /&gt;
			&lt;br /&gt;
			if total_percent &amp;gt;= 1 then&lt;br /&gt;
				return_value = string.format(&#039;%s&amp;amp;#x20;pages, or roughly %s%% of all&#039;, return_value, total_percent)&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return return_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- used by [[Template:Stub documentation]] and other pages&lt;br /&gt;
-- count argument retained for backwards compatibility&lt;br /&gt;
function p.num(frame, count)&lt;br /&gt;
	return p._num(getArgs(frame), count)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- count argument retained for backwards compatibility&lt;br /&gt;
function p._text(args, count)&lt;br /&gt;
	--[=[&lt;br /&gt;
		Only show the information about how this template gets updated&lt;br /&gt;
		if someone is actually editing the page and maybe trying to update the count.&lt;br /&gt;
	]=]&lt;br /&gt;
	local bot_text = (mw.getCurrentFrame():preprocess(&#039;{{REVISIONID}}&#039;) == &#039;&#039;) and (&amp;quot;\n\n----\n&#039;&#039;&#039;Preview message&#039;&#039;&#039;:&amp;quot; .. &#039; Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]]).&#039;) or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	if count == nil then&lt;br /&gt;
		count = count_from_args(args)&lt;br /&gt;
	end&lt;br /&gt;
	args.count = count&lt;br /&gt;
	args.risk = risk_boolean(args)&lt;br /&gt;
	&lt;br /&gt;
	-- trim /doc, /sandbox and /testcases&lt;br /&gt;
	local title = args.title or (args.demo and args.demo ~= &#039;&#039; and mw.title.new(args.demo, &#039;Template&#039;)) or mw.title.getCurrentTitle()&lt;br /&gt;
	if title.subpageText == doc_word or title.subpageText == sandbox_word or title.subpageText == testcases_word then&lt;br /&gt;
		title = title.basePageTitle&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- use /testcases of base template&lt;br /&gt;
	local testcases_page = mw.title.new(title.prefixedText .. &#039;/&#039; .. testcases_word)&lt;br /&gt;
	-- exists is expensive&lt;br /&gt;
	while testcases_page.basePageTitle.isSubpage and not testcases_page.exists do&lt;br /&gt;
		testcases_page = mw.title.new(testcases_page.basePageTitle.basePageTitle.prefixedText .. &#039;/&#039; .. testcases_word)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local systemMessages = (args[&#039;system&#039;] or &#039;&#039;) ~= &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- This retrieves the project URL automatically to simplify localization.&lt;br /&gt;
	local templateCount = (&#039;on [https://linkcount.toolforge.org/?project=%s&amp;amp;page=%s#transclusions %s pages]&#039;):format(&lt;br /&gt;
		title:fullUrl():gsub(&#039;//(.-)/.*&#039;, &#039;%1&#039;),&lt;br /&gt;
		mw.uri.encode(title.fullText), p._num(args))&lt;br /&gt;
	local used_on_text = &amp;quot;&#039;&#039;&#039;This &amp;quot; .. (title:inNamespace(&#039;Module&#039;) and &#039;Lua module&#039; or &#039;template&#039;) .. &#039; is used &#039;&lt;br /&gt;
	if systemMessages then&lt;br /&gt;
		used_on_text = used_on_text .. args[&#039;system&#039;] ..&lt;br /&gt;
			((args.count and args.count &amp;gt; 2000) and (&amp;quot;&#039;&#039;&#039;, and &amp;quot; .. templateCount) or (&amp;quot;&#039;&#039;&#039;&amp;quot;))&lt;br /&gt;
	else&lt;br /&gt;
		used_on_text = used_on_text .. templateCount .. &amp;quot;&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sandbox_text = (&#039;%s\&#039;s [[%s/sandbox|/sandbox]] or [[%s|/testcases]] subpages, or in your own [[%s]]. &#039;):format(&lt;br /&gt;
		title:inNamespace(&#039;Module&#039;) and &#039;module&#039; or &#039;template&#039;,&lt;br /&gt;
		title.fullText,&lt;br /&gt;
		testcases_page.fullText,&lt;br /&gt;
		title:inNamespace(&#039;Module&#039;) and (sandbox_module_page .. &#039;|module sandbox&#039;) or (user_subpage_info_page .. &#039;|user subpage&#039;)&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	local infoArg = args[&#039;info&#039;] ~= &#039;&#039; and args[&#039;info&#039;]&lt;br /&gt;
	if (systemMessages or args.risk) then&lt;br /&gt;
		local info = &#039;.&#039;&lt;br /&gt;
		if systemMessages then&lt;br /&gt;
			info = info .. &#039;&amp;lt;br /&amp;gt;Changes to it can cause immediate changes to the &#039; .. mw.site.namespaces.Project.name .. &#039; user interface.&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if infoArg then&lt;br /&gt;
			info = info .. &#039;&amp;lt;br /&amp;gt;&#039; .. infoArg&lt;br /&gt;
		end&lt;br /&gt;
		sandbox_text = info .. &#039;&amp;lt;br /&amp;gt; To avoid major disruption&#039; ..&lt;br /&gt;
			(args.count and args.count &amp;gt;= large_count_cutoff and &#039; and server load&#039; or &#039;&#039;) .. -- should this use args.risk?&lt;br /&gt;
			&#039;, any changes should be tested in the &#039; .. sandbox_text ..&lt;br /&gt;
			&#039;The tested changes can be added to this page in a single edit. &#039;&lt;br /&gt;
	else&lt;br /&gt;
		sandbox_text = (infoArg and (&#039;.&amp;lt;br /&amp;gt;&#039; .. infoArg .. &#039; C&#039;) or &#039; and c&#039;) ..&lt;br /&gt;
			&#039;hanges may be widely noticed. Test changes in the &#039; .. sandbox_text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local discussion_text = systemMessages and &#039;Please discuss changes &#039; or &#039;Consider discussing changes &#039;&lt;br /&gt;
	if args[2] ~= nil and args[2] ~= &#039;&#039; and yesno(args[2]) == nil then&lt;br /&gt;
		discussion_text = string.format(&#039;%sat [[%s]]&#039;, discussion_text, args[2])&lt;br /&gt;
	else&lt;br /&gt;
		discussion_text = string.format(&#039;%son the [[%s|talk page]]&#039;, discussion_text, title.talkPageTitle.fullText)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return used_on_text .. sandbox_text .. discussion_text .. &#039; before implementing them.&#039; .. bot_text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- used by [[Template:R from high-use template]]&lt;br /&gt;
-- count argument retained for backwards compatibility&lt;br /&gt;
function p.text(frame, count)&lt;br /&gt;
	return p._text(getArgs(frame), count)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- nocat argument retained for backwards compatibility&lt;br /&gt;
function p._main(args, nocat)&lt;br /&gt;
	args.count = count_from_args(args)&lt;br /&gt;
	args.risk = risk_boolean(args)&lt;br /&gt;
	args.title = (args.demo and args.demo ~= &#039;&#039; and mw.title.new(args.demo, &#039;Template&#039;)) or mw.title.getCurrentTitle()&lt;br /&gt;
	&lt;br /&gt;
	local image = &#039;Ambox warning yellow.svg&#039;&lt;br /&gt;
	local type_param = &#039;style&#039;&lt;br /&gt;
	local epilogue = &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	if args[&#039;system&#039;] and args[&#039;system&#039;] ~= &#039;&#039; then&lt;br /&gt;
		image = &#039;Ambox important.svg&#039;&lt;br /&gt;
		type_param = &#039;content&#039;&lt;br /&gt;
		if yesno(nocat or args[&#039;nocat&#039;]) ~= true and not args.title.isRedirect then&lt;br /&gt;
			local protection_action = (args.title:inNamespace(&#039;File&#039;) and &#039;upload&#039;) or &#039;edit&#039;&lt;br /&gt;
			local protection_level = require(&#039;Module:Effective protection level&#039;)._main(protection_action, args.title.fullText)&lt;br /&gt;
			&lt;br /&gt;
			if protection_level ~= &#039;sysop&#039; and protection_level ~= &#039;templateeditor&#039; and protection_level ~= &#039;interfaceadmin&#039; then&lt;br /&gt;
				epilogue = mw.getCurrentFrame():expandTemplate {&lt;br /&gt;
					title = &#039;sandbox other&#039;,&lt;br /&gt;
					args = {&lt;br /&gt;
						[2] = &#039;[[Category:&#039; .. system_messages_cat .. &#039;]]&#039;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif args.risk then&lt;br /&gt;
		image = &#039;Ambox warning orange.svg&#039;&lt;br /&gt;
		type_param = &#039;content&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	image = &#039;[[File:&#039; .. image .. &#039;|40px|alt=Warning|link=]]&#039;&lt;br /&gt;
	if args[&#039;form&#039;] == &#039;editnotice&#039; then&lt;br /&gt;
		return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
				title = &#039;editnotice&#039;,&lt;br /&gt;
				args = {&lt;br /&gt;
						[&#039;image&#039;] = image,&lt;br /&gt;
						[&#039;text&#039;] = p._text(args),&lt;br /&gt;
						[&#039;expiry&#039;] = (args[&#039;expiry&#039;] or &#039;&#039;)&lt;br /&gt;
				}&lt;br /&gt;
		} .. epilogue&lt;br /&gt;
	else&lt;br /&gt;
		return require(&#039;Module:Message box&#039;).main(&#039;ombox&#039;, {&lt;br /&gt;
			type = type_param,&lt;br /&gt;
			image = image,&lt;br /&gt;
			text = p._text(args),&lt;br /&gt;
			expiry = (args[&#039;expiry&#039;] or &#039;&#039;)&lt;br /&gt;
		}) .. epilogue&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p._main(getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Str_len&amp;diff=444</id>
		<title>Template:Str len</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Str_len&amp;diff=444"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:String|len|s={{{1|}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:See&amp;diff=442</id>
		<title>Template:See</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:See&amp;diff=442"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Further]]&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Protect&amp;diff=440</id>
		<title>Module:Protect</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Protect&amp;diff=440"/>
		<updated>2026-09-09T09:48:27Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local function processResult(options, success, ...)&lt;br /&gt;
	if not success then&lt;br /&gt;
		local message = tostring(... or &#039;(no message)&#039;)&lt;br /&gt;
		if options.removeLocation then&lt;br /&gt;
			message = string.gsub(message, &#039;^Module:[^:]+:%d+: &#039;, &#039;&#039;, 1)&lt;br /&gt;
		end&lt;br /&gt;
		return string.format(options.errFormat, message)&lt;br /&gt;
	end&lt;br /&gt;
	return ...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function protect(func, errFormat, options)&lt;br /&gt;
	if type(errFormat) == &#039;table&#039; then&lt;br /&gt;
		options = options or errFormat&lt;br /&gt;
		errFormat = nil&lt;br /&gt;
	end&lt;br /&gt;
	options = mw.clone(options) or {}&lt;br /&gt;
	options.errFormat = errFormat or options.errFormat or &#039;Error: %s&#039;&lt;br /&gt;
	if not options.raw then&lt;br /&gt;
		options.errFormat = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;&#039; .. options.errFormat .. &#039;&amp;lt;/strong&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	options.removeLocation = options.removeLocation == nil or options.removeLocation&lt;br /&gt;
	&lt;br /&gt;
	return function (...)&lt;br /&gt;
		return processResult(options, pcall(func, ...))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return protect&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Color_contrast/colors&amp;diff=438</id>
		<title>Module:Color contrast/colors</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Color_contrast/colors&amp;diff=438"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aliceblue            = 0.92880068253475,&lt;br /&gt;
	antiquewhite         = 0.84646951707754,&lt;br /&gt;
	aqua                 = 0.7874,&lt;br /&gt;
	aquamarine           = 0.8078549208338,&lt;br /&gt;
	azure                = 0.97265264954166,&lt;br /&gt;
	beige                = 0.8988459998705,&lt;br /&gt;
	bisque               = 0.80732327372979,&lt;br /&gt;
	black                = 0,&lt;br /&gt;
	blanchedalmond       = 0.85084439608156,&lt;br /&gt;
	blue                 = 0.0722,&lt;br /&gt;
	blueviolet           = 0.12622014321946,&lt;br /&gt;
	brown                = 0.098224287876511,&lt;br /&gt;
	burlywood            = 0.51559844533893,&lt;br /&gt;
	cadetblue            = 0.29424681085422,&lt;br /&gt;
	chartreuse           = 0.76032025902623,&lt;br /&gt;
	chocolate            = 0.23898526114557,&lt;br /&gt;
	coral                = 0.37017930872924,&lt;br /&gt;
	cornflowerblue       = 0.30318641994179,&lt;br /&gt;
	cornsilk             = 0.93562110372965,&lt;br /&gt;
	crimson              = 0.16042199953026,&lt;br /&gt;
	cyan                 = 0.7874,&lt;br /&gt;
	darkblue             = 0.018640801980939,&lt;br /&gt;
	darkcyan             = 0.20329317839046,&lt;br /&gt;
	darkgoldenrod        = 0.27264703559993,&lt;br /&gt;
	darkgray             = 0.39675523072563,&lt;br /&gt;
	darkgreen            = 0.091143429047575,&lt;br /&gt;
	darkgrey             = 0.39675523072563,&lt;br /&gt;
	darkkhaki            = 0.45747326349994,&lt;br /&gt;
	darkmagenta          = 0.07353047651207,&lt;br /&gt;
	darkolivegreen       = 0.12651920884889,&lt;br /&gt;
	darkorange           = 0.40016167026524,&lt;br /&gt;
	darkorchid           = 0.13413142174857,&lt;br /&gt;
	darkred              = 0.054889674531132,&lt;br /&gt;
	darksalmon           = 0.40541471563381,&lt;br /&gt;
	darkseagreen         = 0.43789249325969,&lt;br /&gt;
	darkslateblue        = 0.065792846227988,&lt;br /&gt;
	darkslategray        = 0.067608151928044,&lt;br /&gt;
	darkslategrey        = 0.067608151928044,&lt;br /&gt;
	darkturquoise        = 0.4874606277449,&lt;br /&gt;
	darkviolet           = 0.10999048339343,&lt;br /&gt;
	deeppink             = 0.23866895828276,&lt;br /&gt;
	deepskyblue          = 0.44481603395575,&lt;br /&gt;
	dimgray              = 0.14126329114027,&lt;br /&gt;
	dimgrey              = 0.14126329114027,&lt;br /&gt;
	dodgerblue           = 0.27442536991456,&lt;br /&gt;
	firebrick            = 0.10724525535015,&lt;br /&gt;
	floralwhite          = 0.95922484825004,&lt;br /&gt;
	forestgreen          = 0.18920812076002,&lt;br /&gt;
	fuchsia              = 0.2848,&lt;br /&gt;
	gainsboro            = 0.71569350050648,&lt;br /&gt;
	ghostwhite           = 0.94311261886323,&lt;br /&gt;
	gold                 = 0.69860877428159,&lt;br /&gt;
	goldenrod            = 0.41919977809569,&lt;br /&gt;
	gray                 = 0.2158605001139,&lt;br /&gt;
	green                = 0.15438342968146,&lt;br /&gt;
	greenyellow          = 0.80609472611453,&lt;br /&gt;
	grey                 = 0.2158605001139,&lt;br /&gt;
	honeydew             = 0.96336535554782,&lt;br /&gt;
	hotpink              = 0.34658438169715,&lt;br /&gt;
	indianred            = 0.21406134963884,&lt;br /&gt;
	indigo               = 0.03107561486337,&lt;br /&gt;
	ivory                = 0.99071270600615,&lt;br /&gt;
	khaki                = 0.77012343394121,&lt;br /&gt;
	lavender             = 0.80318750514521,&lt;br /&gt;
	lavenderblush        = 0.90172748631046,&lt;br /&gt;
	lawngreen            = 0.73905893124963,&lt;br /&gt;
	lemonchiffon         = 0.94038992245622,&lt;br /&gt;
	lightblue            = 0.63709141280807,&lt;br /&gt;
	lightcoral           = 0.35522120733135,&lt;br /&gt;
	lightcyan            = 0.94587293494829,&lt;br /&gt;
	lightgoldenrodyellow = 0.93348351018297,&lt;br /&gt;
	lightgray            = 0.65140563741982,&lt;br /&gt;
	lightgreen           = 0.69091979956865,&lt;br /&gt;
	lightgrey            = 0.65140563741982,&lt;br /&gt;
	lightpink            = 0.58566152734898,&lt;br /&gt;
	lightsalmon          = 0.4780675225206,&lt;br /&gt;
	lightseagreen        = 0.35050145117042,&lt;br /&gt;
	lightskyblue         = 0.56195637618331,&lt;br /&gt;
	lightslategray       = 0.23830165007287,&lt;br /&gt;
	lightslategrey       = 0.23830165007287,&lt;br /&gt;
	lightsteelblue       = 0.53983888284666,&lt;br /&gt;
	lightyellow          = 0.98161818392882,&lt;br /&gt;
	lime                 = 0.7152,&lt;br /&gt;
	limegreen            = 0.44571042246098,&lt;br /&gt;
	linen                = 0.88357340984379,&lt;br /&gt;
	magenta              = 0.2848,&lt;br /&gt;
	maroon               = 0.045891942324215,&lt;br /&gt;
	mediumaquamarine     = 0.49389703310801,&lt;br /&gt;
	mediumblue           = 0.044077780212328,&lt;br /&gt;
	mediumorchid         = 0.21639251153773,&lt;br /&gt;
	mediumpurple         = 0.22905858091648,&lt;br /&gt;
	mediumseagreen       = 0.34393112338131,&lt;br /&gt;
	mediumslateblue      = 0.20284629471622,&lt;br /&gt;
	mediumspringgreen    = 0.70704308194184,&lt;br /&gt;
	mediumturquoise      = 0.5133827926448,&lt;br /&gt;
	mediumvioletred      = 0.14371899849357,&lt;br /&gt;
	midnightblue         = 0.02071786635086,&lt;br /&gt;
	mintcream            = 0.97834604947588,&lt;br /&gt;
	mistyrose            = 0.82183047859185,&lt;br /&gt;
	moccasin             = 0.80083000991567,&lt;br /&gt;
	navajowhite          = 0.76519682342785,&lt;br /&gt;
	navy                 = 0.015585128108224,&lt;br /&gt;
	oldlace              = 0.91900633405549,&lt;br /&gt;
	olive                = 0.20027537200568,&lt;br /&gt;
	olivedrab            = 0.22593150951929,&lt;br /&gt;
	orange               = 0.4817026703631,&lt;br /&gt;
	orangered            = 0.25516243753416,&lt;br /&gt;
	orchid               = 0.31348806761439,&lt;br /&gt;
	palegoldenrod        = 0.78792647887614,&lt;br /&gt;
	palegreen            = 0.77936759006353,&lt;br /&gt;
	paleturquoise        = 0.76436077921714,&lt;br /&gt;
	palevioletred        = 0.28754994117889,&lt;br /&gt;
	papayawhip           = 0.87797100199835,&lt;br /&gt;
	peachpuff            = 0.74905589878251,&lt;br /&gt;
	peru                 = 0.30113074877936,&lt;br /&gt;
	pink                 = 0.63271070702466,&lt;br /&gt;
	plum                 = 0.45734221587969,&lt;br /&gt;
	powderblue           = 0.68254586500605,&lt;br /&gt;
	purple               = 0.061477070432439,&lt;br /&gt;
	rebeccapurple        = 0.07492341159447,&lt;br /&gt;
	red                  = 0.2126,&lt;br /&gt;
	rosybrown            = 0.32319457649407,&lt;br /&gt;
	royalblue            = 0.16663210743188,&lt;br /&gt;
	saddlebrown          = 0.097922285020521,&lt;br /&gt;
	salmon               = 0.36977241527596,&lt;br /&gt;
	sandybrown           = 0.46628543696283,&lt;br /&gt;
	seagreen             = 0.19734199706275,&lt;br /&gt;
	seashell             = 0.92737862206922,&lt;br /&gt;
	sienna               = 0.13697631337098,&lt;br /&gt;
	silver               = 0.52711512570581,&lt;br /&gt;
	skyblue              = 0.55291668518184,&lt;br /&gt;
	slateblue            = 0.14784278062136,&lt;br /&gt;
	slategray            = 0.20896704076536,&lt;br /&gt;
	slategrey            = 0.20896704076536,&lt;br /&gt;
	snow                 = 0.96533341834849,&lt;br /&gt;
	springgreen          = 0.73052306068529,&lt;br /&gt;
	steelblue            = 0.20562642207625,&lt;br /&gt;
	tan                  = 0.48237604163921,&lt;br /&gt;
	teal                 = 0.16996855778968,&lt;br /&gt;
	thistle              = 0.56818401093733,&lt;br /&gt;
	tomato               = 0.30638612719415,&lt;br /&gt;
	turquoise            = 0.5895536427578,&lt;br /&gt;
	violet               = 0.40315452986676,&lt;br /&gt;
	wheat                = 0.74909702820482,&lt;br /&gt;
	white                = 1,&lt;br /&gt;
	whitesmoke           = 0.91309865179342,&lt;br /&gt;
	yellow               = 0.9278,&lt;br /&gt;
	yellowgreen          = 0.50762957208707,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Color_contrast&amp;diff=436</id>
		<title>Module:Color contrast</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Color_contrast&amp;diff=436"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements&lt;br /&gt;
--  {{Color contrast ratio}}&lt;br /&gt;
--  {{Greater color contrast ratio}}&lt;br /&gt;
--  {{ColorToLum}}&lt;br /&gt;
--  {{RGBColorToLum}}&lt;br /&gt;
--&lt;br /&gt;
local p = {}&lt;br /&gt;
local HTMLcolor = mw.loadData( &#039;Module:Color contrast/colors&#039; )&lt;br /&gt;
&lt;br /&gt;
local function sRGB (v)&lt;br /&gt;
	if (v &amp;lt;= 0.03928) then&lt;br /&gt;
		v = v / 12.92&lt;br /&gt;
	else&lt;br /&gt;
		v = math.pow((v+0.055)/1.055, 2.4)&lt;br /&gt;
	end&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rgbdec2lum(R, G, B)&lt;br /&gt;
	if ( 0 &amp;lt;= R and R &amp;lt; 256 and 0 &amp;lt;= G and G &amp;lt; 256 and 0 &amp;lt;= B and B &amp;lt; 256 ) then&lt;br /&gt;
		return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hsl2lum(h, s, l)&lt;br /&gt;
	if ( 0 &amp;lt;= h and h &amp;lt; 360 and 0 &amp;lt;= s and s &amp;lt;= 1 and 0 &amp;lt;= l and l &amp;lt;= 1 ) then&lt;br /&gt;
		local c = (1 - math.abs(2*l - 1))*s&lt;br /&gt;
		local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )&lt;br /&gt;
		local m = l - c/2&lt;br /&gt;
&lt;br /&gt;
		local r, g, b = m, m, m&lt;br /&gt;
		if( 0 &amp;lt;= h and h &amp;lt; 60 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			g = g + x&lt;br /&gt;
		elseif( 60 &amp;lt;= h and h &amp;lt; 120 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			g = g + c&lt;br /&gt;
		elseif( 120 &amp;lt;= h and h &amp;lt; 180 ) then&lt;br /&gt;
			g = g + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		elseif( 180 &amp;lt;= h and h &amp;lt; 240 ) then&lt;br /&gt;
			g = g + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 240 &amp;lt;= h and h &amp;lt; 300 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 300 &amp;lt;= h and h &amp;lt; 360 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		end&lt;br /&gt;
		return rgbdec2lum(255*r, 255*g, 255*b)&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function color2lum(c)&lt;br /&gt;
&lt;br /&gt;
	if (c == nil) then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- html &#039;#&#039; entity&lt;br /&gt;
	c = c:gsub(&amp;quot;&amp;amp;#35;&amp;quot;, &amp;quot;#&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- whitespace&lt;br /&gt;
	c = c:match( &#039;^%s*(.-)[%s;]*$&#039; )&lt;br /&gt;
&lt;br /&gt;
	-- unstrip nowiki strip markers&lt;br /&gt;
	c = mw.text.unstripNoWiki(c)&lt;br /&gt;
&lt;br /&gt;
	-- lowercase&lt;br /&gt;
	c = c:lower()&lt;br /&gt;
&lt;br /&gt;
	-- first try to look it up&lt;br /&gt;
	local L = HTMLcolor[c]&lt;br /&gt;
	if (L ~= nil) then&lt;br /&gt;
		return L&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from hsl&lt;br /&gt;
	if mw.ustring.match(c,&#039;^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local h, s, l = mw.ustring.match(c,&#039;^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#039;)&lt;br /&gt;
		return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from rgb&lt;br /&gt;
	if mw.ustring.match(c,&#039;^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$&#039;)&lt;br /&gt;
		return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from rgb percent&lt;br /&gt;
	if mw.ustring.match(c,&#039;^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#039;)&lt;br /&gt;
		return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- remove leading # (if there is one) and whitespace&lt;br /&gt;
	c = mw.ustring.match(c, &#039;^[%s#]*([a-f0-9]*)[%s]*$&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- split into rgb&lt;br /&gt;
	local cs = mw.text.split(c or &#039;&#039;, &#039;&#039;)&lt;br /&gt;
	if( #cs == 6 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[4])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[5]) + tonumber(&#039;0x&#039; .. cs[6])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	elseif ( #cs == 3 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[1])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[2]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[3])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- failure, return blank&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This exports the function for use in other modules.&lt;br /&gt;
-- The colour is passed as a string.&lt;br /&gt;
function p._lum(color)&lt;br /&gt;
	return color2lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._greatercontrast(args)&lt;br /&gt;
	local bias = tonumber(args[&#039;bias&#039;] or &#039;0&#039;) or 0&lt;br /&gt;
	local css = (args[&#039;css&#039;] and args[&#039;css&#039;] ~= &#039;&#039;) and true or false&lt;br /&gt;
	local v1 = color2lum(args[1] or &#039;&#039;)&lt;br /&gt;
	local c2 = args[2] or &#039;white&#039;&lt;br /&gt;
	local v2 = color2lum(c2)&lt;br /&gt;
	local c3 = args[3] or &#039;black&#039;&lt;br /&gt;
	local v3 = color2lum(c3)&lt;br /&gt;
	local ratio1 = -1;&lt;br /&gt;
	local ratio2 = -1;&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#039;) then&lt;br /&gt;
		ratio1 = (v2 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio1 = (ratio1 &amp;lt; 1) and 1/ratio1 or ratio1&lt;br /&gt;
	end&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v3) == &#039;number&#039;) then&lt;br /&gt;
		ratio2 = (v3 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio2 = (ratio2 &amp;lt; 1) and 1/ratio2 or ratio2&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if css then&lt;br /&gt;
		local c1 = args[1] or &#039;&#039;&lt;br /&gt;
		if mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c1 = &#039;#&#039; .. c1&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c2 = &#039;#&#039; .. c2&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c3 = &#039;#&#039; .. c3&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;background-color:&#039; .. c1 .. &#039;; color:&#039; .. ((ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;) .. &#039;;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ratio(args)&lt;br /&gt;
	local v1 = color2lum(args[1])&lt;br /&gt;
	local v2 = color2lum(args[2])&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#039;) then&lt;br /&gt;
		-- v1 should be the brighter of the two.&lt;br /&gt;
		if v2 &amp;gt; v1 then&lt;br /&gt;
			v1, v2 = v2, v1&lt;br /&gt;
		end&lt;br /&gt;
		return (v1 + 0.05)/(v2 + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return args[&#039;error&#039;] or &#039;?&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._styleratio(args)&lt;br /&gt;
	local style = (args[1] or &#039;&#039;):lower()&lt;br /&gt;
	local bg, fg = &#039;white&#039;, &#039;black&#039;&lt;br /&gt;
	local lum_bg, lum_fg = 1, 0&lt;br /&gt;
&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local lum = color2lum(args[2])&lt;br /&gt;
		if lum ~= &#039;&#039; then bg, lum_bg = args[2], lum end&lt;br /&gt;
	end&lt;br /&gt;
	if args[3] then&lt;br /&gt;
		local lum = color2lum(args[3])&lt;br /&gt;
		if lum ~= &#039;&#039; then fg, lum_fg = args[3], lum end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or &#039;&#039;, &#039;&amp;amp;#[Xx]23;&#039;, &#039;#&#039;), &#039;&amp;amp;#35;&#039;, &#039;#&#039;), &#039;;&#039;)&lt;br /&gt;
	for k = 1,#slist do&lt;br /&gt;
		local s = slist[k]&lt;br /&gt;
		local k,v = s:match( &#039;^[%s]*([^:]-):([^:]-)[%s;]*$&#039; )&lt;br /&gt;
		k = k or &#039;&#039;&lt;br /&gt;
		v = v or &#039;&#039;&lt;br /&gt;
		if (k:match(&#039;^[%s]*(background)[%s]*$&#039;) or k:match(&#039;^[%s]*(background%-color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_bg = v, lum end&lt;br /&gt;
		elseif (k:match(&#039;^[%s]*(color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_fg = v, lum end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if lum_bg &amp;gt; lum_fg then&lt;br /&gt;
		return (lum_bg + 0.05)/(lum_fg + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return (lum_fg + 0.05)/(lum_bg + 0.05)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Use {{#invoke:Color contrast|somecolor}} directly or&lt;br /&gt;
{{#invoke:Color contrast}} from a wrapper template.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
	-- |1=	— required; A color to check.&lt;br /&gt;
--]]&lt;br /&gt;
function p.lum(frame)&lt;br /&gt;
	local color = frame.args[1] or frame:getParent().args[1]&lt;br /&gt;
	return p._lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._ratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.styleratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._styleratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.greatercontrast(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._greatercontrast(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Replace&amp;diff=434</id>
		<title>Template:Replace</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Replace&amp;diff=434"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{safesubst:#invoke:String|replace|source={{{1}}}|{{{2}}}|{{{3}}}|plain={{safesubst:#if:{{{plain|}}}|{{{plain}}}|true}}|count={{{count|}}}}}&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>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Strong&amp;diff=432</id>
		<title>Template:Strong</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Strong&amp;diff=432"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong {{#if:{{{role|}}}|role=&amp;quot;{{{role}}}&amp;quot;}} {{#if:{{{class|}}}|class=&amp;quot;{{{class}}}&amp;quot;}} {{#if:{{{id|}}}|id=&amp;quot;{{{id}}}&amp;quot;}} {{#if:{{{style|}}}|style=&amp;quot;{{{style}}}&amp;quot;}} {{#if:{{{title|}}}|title=&amp;quot;{{{title}}}&amp;quot;}}&amp;gt;{{{1}}}&amp;lt;/strong&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add cats and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Div_col_end&amp;diff=430</id>
		<title>Template:Div col end</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Div_col_end&amp;diff=430"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|Template:Div col/doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Div_col/styles.css&amp;diff=428</id>
		<title>Template:Div col/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Div_col/styles.css&amp;diff=428"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.div-col {&lt;br /&gt;
	margin-top: 0.3em;&lt;br /&gt;
	column-width: 30em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.div-col-small {&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.div-col-rules {&lt;br /&gt;
	column-rule: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reset top margin for lists in div col */&lt;br /&gt;
.div-col dl,&lt;br /&gt;
.div-col ol,&lt;br /&gt;
.div-col ul {&lt;br /&gt;
	margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Avoid elements breaking between columns&lt;br /&gt;
   See also Template:No col break */&lt;br /&gt;
.div-col li,&lt;br /&gt;
.div-col dd {&lt;br /&gt;
	page-break-inside: avoid; /* Removed from CSS in favor of break-inside c. 2020 */&lt;br /&gt;
	break-inside: avoid-column;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Div_col&amp;diff=426</id>
		<title>Template:Div col</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Div_col&amp;diff=426"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Div col/styles.css&amp;quot;/&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;div-col {{#ifeq:{{{small|}}}|yes|div-col-small}} {{#ifeq:{{{rules|}}}|yes|div-col-rules}} {{{class|}}}&amp;quot; &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{colwidth|}}}{{{gap|}}}{{{style|}}}|&amp;lt;!--&lt;br /&gt;
--&amp;gt;style=&amp;quot;{{#if:{{{colwidth|}}}|column-width: {{{colwidth}}};}}{{#if:{{{gap|}}}|column-gap: {{{gap}}};}}{{#if:{{{style|}}}|{{{style}}}}}&amp;quot;&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{content|}}}|{{{content}}}&amp;lt;/div&amp;gt;}}&amp;lt;!-- Inventory how many pages use small=yes &lt;br /&gt;
--&amp;gt;{{#ifeq:{{{small|}}}|yes|[[Category:Pages using div col with small parameter]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using div col with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Div col]] with unknown parameter &amp;quot;_VALUE_&amp;quot;; use colwidth= to specify column size |ignoreblank=y | class | colwidth | content | gap | rules | small | style }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Protection_banner&amp;diff=424</id>
		<title>Module:Protection banner</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Protection_banner&amp;diff=424"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return require [[Module:Protected page]]&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbox/styles.css&amp;diff=422</id>
		<title>Module:Navbox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbox/styles.css&amp;diff=422"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.navbox {&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	padding: 1px;&lt;br /&gt;
	margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbox {&lt;br /&gt;
	margin-top: 0; /* No top margin for nested navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox + .navbox-styles + .navbox,&lt;br /&gt;
/* category positions are wrapped in an &amp;quot;empty&amp;quot; span in Parsoid [[phab:T378906]] */ &lt;br /&gt;
.navbox + span.mw-empty-elt + .navbox-styles + .navbox {&lt;br /&gt;
	margin-top: -1px; /* Single pixel border between adjacent navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
	padding: 0.25em 1em;&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	background-color: #fdfdfd;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list {&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	border-color: #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list-with-group {&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	border-left-width: 2px;&lt;br /&gt;
	border-left-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* cell spacing for navbox cells */&lt;br /&gt;
/* Borders above 2nd, 3rd, etc. rows */&lt;br /&gt;
/* TODO: figure out how to replace tr as structure;&lt;br /&gt;
 * with div structure it should be just a matter of first-child */&lt;br /&gt;
tr + tr &amp;gt; .navbox-abovebelow,&lt;br /&gt;
tr + tr &amp;gt; .navbox-group,&lt;br /&gt;
tr + tr &amp;gt; .navbox-image,&lt;br /&gt;
tr + tr &amp;gt; .navbox-list {&lt;br /&gt;
	border-top: 2px solid #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title {&lt;br /&gt;
	background-color: #ccf; /* Level 1 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
	background-color: #ddf; /* Level 2 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
	background-color: #e6e6ff; /* Level 3 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-even {&lt;br /&gt;
	background-color: #f7f7f7;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: figure out how to remove reliance on td as structure */&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
	padding: 0.125em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
	display: block;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin-right: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** T367463 */&lt;br /&gt;
body.skin--responsive .navbox-image img {&lt;br /&gt;
	max-width: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	body.ns-0 .navbox {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbox/configuration&amp;diff=420</id>
		<title>Module:Navbox/configuration</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbox/configuration&amp;diff=420"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aria_label = &#039;Navbox&#039;,&lt;br /&gt;
	nowrap_item = &#039;%s&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
	templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = &#039;Module:Navbox/styles.css&#039; }&lt;br /&gt;
	},&lt;br /&gt;
	hlist_templatestyles = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	plainlist_templatestyles = &#039;Plainlist/styles.css&#039;,&lt;br /&gt;
	-- do not localize marker table&lt;br /&gt;
	marker = {&lt;br /&gt;
		oddeven = &#039;\127_ODDEVEN_\127&#039;,&lt;br /&gt;
		restart = &#039;\127_ODDEVEN0_\127&#039;,&lt;br /&gt;
		regex = &#039;\127_ODDEVEN(%d?)_\127&#039;&lt;br /&gt;
	},&lt;br /&gt;
	category = {&lt;br /&gt;
		orphan = &#039;[[Category:Navbox orphans]]&#039;,&lt;br /&gt;
		horizontal_lists = &#039;Navigational boxes without horizontal lists&#039;,&lt;br /&gt;
		background_colors = &#039;Navboxes using background colours&#039;,&lt;br /&gt;
		illegible = &#039;Potentially illegible navboxes&#039;,&lt;br /&gt;
		borders = &#039;Navboxes using borders&#039;,&lt;br /&gt;
		without_first_col = &#039;[[Category:Pages using navbox columns without the first column]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	keyword = {&lt;br /&gt;
		border_subgroup = &#039;subgroup&#039;,&lt;br /&gt;
		border_child = &#039;child&#039;,&lt;br /&gt;
		border_none = &#039;none&#039;,&lt;br /&gt;
		evenodd_swap = &#039;swap&#039;,&lt;br /&gt;
		navbar_off = &#039;off&#039;,&lt;br /&gt;
		navbar_plain = &#039;plain&#039;,&lt;br /&gt;
		nocat_false = &#039;false&#039;,&lt;br /&gt;
		nowrapitems_yes = &#039;yes&#039;,&lt;br /&gt;
		orphan_yes = &#039;yes&#039;,&lt;br /&gt;
		state_collapsed = &#039;collapsed&#039;,&lt;br /&gt;
		state_off = &#039;off&#039;,&lt;br /&gt;
		state_plain = &#039;plain&#039;,&lt;br /&gt;
		state_uncollapsed = &#039;uncollapsed&#039;,&lt;br /&gt;
		subgroups = {&#039;subgroup&#039;, &#039;child&#039;, &#039;&#039;},&lt;br /&gt;
		subpage_doc = &#039;doc&#039;,&lt;br /&gt;
		subpage_sandbox = &#039;sandbox&#039;,&lt;br /&gt;
		subpage_testcases = &#039;testcases&#039;,&lt;br /&gt;
		tracking_no = &#039;no&#039;,&lt;br /&gt;
		with_collapsible_groups = &#039;with collapsible groups&#039;,&lt;br /&gt;
		with_collapsible_groups_short = &#039;collapsible&#039;,&lt;br /&gt;
		with_columns = &#039;with columns&#039;,&lt;br /&gt;
		with_columns_short = &#039;columns&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	class = {&lt;br /&gt;
		autocollapse = &#039;autocollapse&#039;,&lt;br /&gt;
		collapsible = &#039;mw-collapsible&#039;,&lt;br /&gt;
		collapsed = &#039;mw-collapsed&#039;,&lt;br /&gt;
		-- Warning&lt;br /&gt;
		navbox = &#039;navbox&#039;, -- WMF currently hides &#039;navbox&#039; from mobile,&lt;br /&gt;
		-- so you probably shouldn&#039;t change the navbox class.&lt;br /&gt;
		navbox_abovebelow = &#039;navbox-abovebelow&#039;,&lt;br /&gt;
		navbox_group = &#039;navbox-group&#039;,&lt;br /&gt;
		navbox_image = &#039;navbox-image&#039;,&lt;br /&gt;
		navbox_inner = &#039;navbox-inner&#039;,&lt;br /&gt;
		navbox_list = &#039;navbox-list&#039;,&lt;br /&gt;
		navbox_list_with_group = &#039;navbox-list-with-group&#039;,&lt;br /&gt;
		navbox_part = &#039;navbox-&#039;, -- do not l10n&lt;br /&gt;
		navbox_styles = &#039;navbox-styles&#039;,&lt;br /&gt;
		navbox_subgroup = &#039;navbox-subgroup&#039;,&lt;br /&gt;
		navbox_title = &#039;navbox-title&#039;, -- l10n only if you change pattern.navbox_title below&lt;br /&gt;
		navbox_odd_part = &#039;odd&#039;, -- do not l10n&lt;br /&gt;
		navbox_even_part = &#039;even&#039;, -- do not l10n&lt;br /&gt;
		nomobile = &#039;nomobile&#039;,&lt;br /&gt;
		nowraplinks = &#039;nowraplinks&#039;,&lt;br /&gt;
		noviewer = &#039;noviewer&#039;, -- used to remove images from MediaViewer&lt;br /&gt;
		notheme = &#039;notheme&#039;&lt;br /&gt;
	},&lt;br /&gt;
	pattern = {&lt;br /&gt;
		class = &#039;class&#039;,&lt;br /&gt;
		colnum = &#039;^col(%d+)$&#039;,&lt;br /&gt;
		colheadernum = &#039;^col(%d+)header$&#039;,&lt;br /&gt;
		colfooternum = &#039;^col(%d+)footer$&#039;,&lt;br /&gt;
		contentnum = &#039;^content(%d+)$&#039;,&lt;br /&gt;
		groupnum = &#039;^group(%d+)$&#039;,&lt;br /&gt;
		hlist = &#039;hlist&#039;,&lt;br /&gt;
		listnum = &#039;^list(%d+)$&#039;,&lt;br /&gt;
		navbox = &#039;Template:Navbox&#039;,&lt;br /&gt;
		navbox_title = &#039;&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;&#039;,&lt;br /&gt;
		nowrap = &#039;^&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;,&lt;br /&gt;
		num = &#039;^%a+(%d+)$&#039;,&lt;br /&gt;
		plainlist = &#039;plainlist&#039;,&lt;br /&gt;
		sandbox = &#039;/sandbox$&#039;,&lt;br /&gt;
		sectionnum = &#039;^section(%d+)$&#039;,&lt;br /&gt;
		sectnum = &#039;^sect(%d+)$&#039;,&lt;br /&gt;
		style = &#039;style$&#039;,&lt;br /&gt;
		with_collapsible_groups = &#039;Template:Navbox with collapsible groups&#039;,&lt;br /&gt;
		with_columns = &#039;Template:Navbox with columns&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	arg = {&lt;br /&gt;
		abbr_and_num = &#039;abbr%d&#039;,&lt;br /&gt;
		above = &#039;above&#039;,&lt;br /&gt;
		aboveclass = &#039;aboveclass&#039;,&lt;br /&gt;
		abovestyle = &#039;abovestyle&#039;,&lt;br /&gt;
		basestyle = &#039;basestyle&#039;,&lt;br /&gt;
		below = &#039;below&#039;,&lt;br /&gt;
		belowclass = &#039;belowclass&#039;,&lt;br /&gt;
		belowstyle = &#039;belowstyle&#039;,&lt;br /&gt;
		bodyclass = &#039;bodyclass&#039;,&lt;br /&gt;
		bodystyle = &#039;bodystyle&#039;,&lt;br /&gt;
		border = &#039;border&#039;,&lt;br /&gt;
		content_and_num = &#039;content%d&#039;,&lt;br /&gt;
		contentstyle = &#039;contentstyle&#039;,&lt;br /&gt;
		contentstyle_and_num = &#039;content%dstyle&#039;,&lt;br /&gt;
		colheaderstyle = &#039;colheaderstyle&#039;,&lt;br /&gt;
		colheader_and_num = &#039;col%dheader&#039;,&lt;br /&gt;
		colheaderstyle_and_num = &#039;col%dheaderstyle&#039;,&lt;br /&gt;
		colheadercolspan_and_num = &#039;col%dheadercolspan&#039;,&lt;br /&gt;
		colstyle = &#039;colstyle&#039;,&lt;br /&gt;
		col_and_num = &#039;col%d&#039;,&lt;br /&gt;
		colstyle_and_num = &#039;col%dstyle&#039;,&lt;br /&gt;
		colwidth = &#039;colwidth&#039;,&lt;br /&gt;
		colwidth_and_num = &#039;col%dwidth&#039;,&lt;br /&gt;
		colfooterstyle = &#039;colfooterstyle&#039;,&lt;br /&gt;
		colfooter_and_num = &#039;col%dfooter&#039;,&lt;br /&gt;
		colfooterstyle_and_num = &#039;col%dfooterstyle&#039;,&lt;br /&gt;
		colfootercolspan_and_num = &#039;col%dfootercolspan&#039;,&lt;br /&gt;
		coltablestyle = &#039;coltablestyle&#039;,&lt;br /&gt;
		evencolstyle = &#039;evencolstyle&#039;,&lt;br /&gt;
		evenodd = &#039;evenodd&#039;,&lt;br /&gt;
		evenstyle = &#039;evenstyle&#039;,&lt;br /&gt;
		fullwidth = &#039;fullwidth&#039;,&lt;br /&gt;
		group1 = &#039;group1&#039;,&lt;br /&gt;
		group2 = &#039;group2&#039;,&lt;br /&gt;
		group_and_num = &#039;group%d&#039;,&lt;br /&gt;
		groupclass = &#039;groupclass&#039;,&lt;br /&gt;
		groupstyle = &#039;groupstyle&#039;,&lt;br /&gt;
		groupstyle_and_num = &#039;group%dstyle&#039;,&lt;br /&gt;
		groupwidth = &#039;groupwidth&#039;,&lt;br /&gt;
		image = &#039;image&#039;,&lt;br /&gt;
		image_and_num = &#039;image%d&#039;,&lt;br /&gt;
		imageclass = &#039;imageclass&#039;,&lt;br /&gt;
		imageleft = &#039;imageleft&#039;,&lt;br /&gt;
		imageleft_and_num = &#039;imageleft%d&#039;,&lt;br /&gt;
		imageleftstyle = &#039;imageleftstyle&#039;,&lt;br /&gt;
		imagestyle = &#039;imagestyle&#039;,&lt;br /&gt;
		innerstyle = &#039;innerstyle&#039;,&lt;br /&gt;
		list1padding = &#039;list1padding&#039;,&lt;br /&gt;
		list_and_num = &#039;list%d&#039;,&lt;br /&gt;
		listclass = &#039;listclass&#039;,&lt;br /&gt;
		listclass_and_num = &#039;list%dclass&#039;,&lt;br /&gt;
		listpadding = &#039;listpadding&#039;,&lt;br /&gt;
		liststyle = &#039;liststyle&#039;,&lt;br /&gt;
		liststyle_and_num = &#039;list%dstyle&#039;,&lt;br /&gt;
		name = &#039;name&#039;,&lt;br /&gt;
		navbar = &#039;navbar&#039;,&lt;br /&gt;
		navboxclass = &#039;navboxclass&#039;,&lt;br /&gt;
		nocat = &#039;nocat&#039;,&lt;br /&gt;
		nowrapitems = &#039;nowrapitems&#039;,&lt;br /&gt;
		oddcolstyle = &#039;oddcolstyle&#039;,&lt;br /&gt;
		oddstyle = &#039;oddstyle&#039;,&lt;br /&gt;
		orphan = &#039;orphan&#039;,&lt;br /&gt;
		padding = &#039;padding&#039;,&lt;br /&gt;
		sect_and_num = &#039;sect%d&#039;,&lt;br /&gt;
		section_and_num = &#039;section%d&#039;,&lt;br /&gt;
		sectiontitlestyle_and_num = &#039;section%dtitlestyle&#039;,&lt;br /&gt;
		secttitlestyle = &#039;secttitlestyle&#039;,&lt;br /&gt;
		selected = &#039;selected&#039;,&lt;br /&gt;
		state = &#039;state&#039;,&lt;br /&gt;
		state_and_num = &#039;state%d&#039;,&lt;br /&gt;
		style = &#039;style&#039;,&lt;br /&gt;
		subgroups_and_num = {&#039;subgroup%d&#039;, &#039;child%d&#039;, &#039;%d&#039;},&lt;br /&gt;
		templatestyles = &#039;templatestyles&#039;,&lt;br /&gt;
		child_templatestyles = &#039;child templatestyles&#039;,&lt;br /&gt;
		title = &#039;title&#039;,&lt;br /&gt;
		titleclass = &#039;titleclass&#039;,&lt;br /&gt;
		titlestyle = &#039;titlestyle&#039;,&lt;br /&gt;
		tracking = &#039;tracking&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	-- names of navbar arguments&lt;br /&gt;
	navbar = {&lt;br /&gt;
		name = 1,&lt;br /&gt;
		fontstyle = &#039;fontstyle&#039;,&lt;br /&gt;
		mini = &#039;mini&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbox&amp;diff=418</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbox&amp;diff=418"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbox/configuration&#039;)&lt;br /&gt;
local inArray = require(&amp;quot;Module:TableTools&amp;quot;).inArray&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local hiding_templatestyles = {} &lt;br /&gt;
&lt;br /&gt;
-- global passthrough variables&lt;br /&gt;
local passthrough = {&lt;br /&gt;
	[cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true,&lt;br /&gt;
	[cfg.arg.basestyle]=true,&lt;br /&gt;
	[cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true,&lt;br /&gt;
	[cfg.arg.bodyclass]=true,&lt;br /&gt;
	[cfg.arg.groupclass]=true,&lt;br /&gt;
	[cfg.arg.image]=true,[cfg.arg.imageclass]=true,[cfg.arg.imagestyle]=true,&lt;br /&gt;
	[cfg.arg.imageleft]=true,[cfg.arg.imageleftstyle]=true,&lt;br /&gt;
	[cfg.arg.listclass]=true,&lt;br /&gt;
	[cfg.arg.name]=true,&lt;br /&gt;
	[cfg.arg.navbar]=true,&lt;br /&gt;
	[cfg.arg.state]=true,&lt;br /&gt;
	[cfg.arg.title]=true,[cfg.arg.titleclass]=true,[cfg.arg.titlestyle]=true,&lt;br /&gt;
	argHash=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- helper functions&lt;br /&gt;
local andnum = function(s, n) return string.format(cfg.arg[s .. &#039;_and_num&#039;], n) end&lt;br /&gt;
local isblank = function(v) return (v or &#039;&#039;) == &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
local function concatstrings(s)&lt;br /&gt;
	local r = table.concat(s, &#039;&#039;)&lt;br /&gt;
	if r:match(&#039;^%s*$&#039;) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concatstyles(s)&lt;br /&gt;
	local r = &#039;&#039;&lt;br /&gt;
	for _, v in ipairs(s) do&lt;br /&gt;
		v = mw.text.trim(v, &amp;quot;%s;&amp;quot;)&lt;br /&gt;
		if not isblank(v) then r = r .. v .. &#039;;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
	if isblank(r) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSubgroup(args, listnum, listText, prefix)&lt;br /&gt;
	local subArgs = {&lt;br /&gt;
		[cfg.arg.border] = cfg.keyword.border_subgroup,&lt;br /&gt;
		[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
		argHash = 0&lt;br /&gt;
	}&lt;br /&gt;
	local hasSubArgs = false&lt;br /&gt;
	local subgroups_and_num = prefix and {prefix} or cfg.arg.subgroups_and_num&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		for _, w in ipairs(subgroups_and_num) do&lt;br /&gt;
			w = string.format(w, listnum) .. &amp;quot;_&amp;quot;&lt;br /&gt;
			if (#k &amp;gt; #w) and (k:sub(1, #w) == w) then&lt;br /&gt;
				subArgs[k:sub(#w + 1)] = v&lt;br /&gt;
				hasSubArgs = true&lt;br /&gt;
				subArgs.argHash = subArgs.argHash + (v and #v or 0)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return hasSubArgs and p._navbox(subArgs) or listText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main functions&lt;br /&gt;
function p._navbox(args)&lt;br /&gt;
	if args.type == cfg.keyword.with_collapsible_groups then&lt;br /&gt;
		return p._withCollapsibleGroups(args)&lt;br /&gt;
	elseif args.type == cfg.keyword.with_columns then&lt;br /&gt;
		return p._withColumns(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function striped(wikitext, border)&lt;br /&gt;
		-- Return wikitext with markers replaced for odd/even striping.&lt;br /&gt;
		-- Child (subgroup) navboxes are flagged with a category that is removed&lt;br /&gt;
		-- by parent navboxes. The result is that the category shows all pages&lt;br /&gt;
		-- where a child navbox is not contained in a parent navbox.&lt;br /&gt;
		local orphanCat = cfg.category.orphan&lt;br /&gt;
		if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then&lt;br /&gt;
			-- No change; striping occurs in outermost navbox.&lt;br /&gt;
			return wikitext .. orphanCat&lt;br /&gt;
		end&lt;br /&gt;
		local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part&lt;br /&gt;
		if args[cfg.arg.evenodd] then&lt;br /&gt;
			if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then&lt;br /&gt;
				first, second = second, first&lt;br /&gt;
			else&lt;br /&gt;
				first = args[cfg.arg.evenodd]&lt;br /&gt;
				second = first&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local changer&lt;br /&gt;
		if first == second then&lt;br /&gt;
			changer = first&lt;br /&gt;
		else&lt;br /&gt;
			local index = 0&lt;br /&gt;
			changer = function (code)&lt;br /&gt;
				if code == &#039;0&#039; then&lt;br /&gt;
					-- Current occurrence is for a group before a nested table.&lt;br /&gt;
					-- Set it to first as a valid although pointless class.&lt;br /&gt;
					-- The next occurrence will be the first row after a title&lt;br /&gt;
					-- in a subgroup and will also be first.&lt;br /&gt;
					index = 0&lt;br /&gt;
					return first&lt;br /&gt;
				end&lt;br /&gt;
				index = index + 1&lt;br /&gt;
				return index % 2 == 1 and first or second&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local regex = orphanCat:gsub(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
		return (wikitext:gsub(regex, &#039;&#039;):gsub(cfg.marker.regex, changer)) -- () omits gsub count&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function processItem(item, nowrapitems)&lt;br /&gt;
		if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
			-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
			-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if nowrapitems == cfg.keyword.nowrapitems_yes then&lt;br /&gt;
			local lines = {}&lt;br /&gt;
			for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
				local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
				if prefix and not content:match(cfg.pattern.nowrap) then&lt;br /&gt;
					line = string.format(cfg.nowrap_item, prefix, content)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(lines, line)&lt;br /&gt;
			end&lt;br /&gt;
			item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		return item&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_navbar()&lt;br /&gt;
		return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off&lt;br /&gt;
			and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain&lt;br /&gt;
			and (&lt;br /&gt;
				args[cfg.arg.name]&lt;br /&gt;
				or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, &#039;&#039;)&lt;br /&gt;
					~= cfg.pattern.navbox&lt;br /&gt;
			)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- extract text color from css, which is the only permitted inline CSS for the navbar&lt;br /&gt;
	local function extract_color(css_str)&lt;br /&gt;
		-- return nil because navbar takes its argument into mw.html which handles&lt;br /&gt;
		-- nil gracefully, removing the associated style attribute&lt;br /&gt;
		return mw.ustring.match(&#039;;&#039; .. css_str .. &#039;;&#039;, &#039;.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;&#039;) or nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderNavBar(titleCell)&lt;br /&gt;
		if has_navbar() then&lt;br /&gt;
			local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
			titleCell:wikitext(navbar{&lt;br /&gt;
				[cfg.navbar.name] = args[cfg.arg.name],&lt;br /&gt;
				[cfg.navbar.mini] = 1,&lt;br /&gt;
				[cfg.navbar.fontstyle] = extract_color(&lt;br /&gt;
					(args[cfg.arg.basestyle] or &#039;&#039;) .. &#039;;&#039; .. (args[cfg.arg.titlestyle] or &#039;&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTitleRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.title] then return end&lt;br /&gt;
&lt;br /&gt;
		local titleRow = tbl:tag(&#039;tr&#039;)&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;
		local titleColspan = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end&lt;br /&gt;
		if args[cfg.arg.image] then titleColspan = titleColspan + 1 end&lt;br /&gt;
&lt;br /&gt;
		titleCell&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.titlestyle])&lt;br /&gt;
			:addClass(cfg.class.navbox_title)&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;
				-- id for aria-labelledby attribute&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.title]) .. args.argHash)&lt;br /&gt;
				:addClass(args[cfg.arg.titleclass])&lt;br /&gt;
				:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
				:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.title]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getAboveBelowColspan()&lt;br /&gt;
		local ret = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then ret = ret + 1 end&lt;br /&gt;
		if args[cfg.arg.image] then ret = ret + 1 end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderAboveRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.above] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.aboveclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.abovestyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					-- id for aria-labelledby attribute, if no title&lt;br /&gt;
					:attr(&#039;id&#039;, (not args[cfg.arg.title]) and &lt;br /&gt;
						(mw.uri.anchorEncode(args[cfg.arg.above]) .. args.argHash)&lt;br /&gt;
						or nil)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderBelowRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.below] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.belowclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.belowstyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderListRow(tbl, index, listnum, listnums_size)&lt;br /&gt;
		local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.imageleft] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 2px 0 0&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imageleftstyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.imageleft]))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local group_and_num = andnum(&#039;group&#039;, listnum)&lt;br /&gt;
		local groupstyle_and_num = andnum(&#039;groupstyle&#039;, listnum)&lt;br /&gt;
		if args[group_and_num] then&lt;br /&gt;
			local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
			-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
			if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then&lt;br /&gt;
				groupCell&lt;br /&gt;
					:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.group1]) .. args.argHash)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_group)&lt;br /&gt;
				:addClass(args[cfg.arg.groupclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				-- If groupwidth not specified, minimize width&lt;br /&gt;
				:css(&#039;width&#039;, args[cfg.arg.groupwidth] or &#039;1%&#039;)&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:cssText(args[cfg.arg.groupstyle])&lt;br /&gt;
				:cssText(args[groupstyle_and_num])&lt;br /&gt;
				:wikitext(args[group_and_num])&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[group_and_num] then&lt;br /&gt;
			listCell&lt;br /&gt;
				:addClass(cfg.class.navbox_list_with_group)&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[cfg.arg.groupwidth] then&lt;br /&gt;
			listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
		if index % 2 == 1 then&lt;br /&gt;
			rowstyle = args[cfg.arg.oddstyle]&lt;br /&gt;
		else&lt;br /&gt;
			rowstyle = args[cfg.arg.evenstyle]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local list_and_num = andnum(&#039;list&#039;, listnum)&lt;br /&gt;
		local listText = inArray(cfg.keyword.subgroups, args[list_and_num])&lt;br /&gt;
			and getSubgroup(args, listnum, args[list_and_num]) or args[list_and_num]&lt;br /&gt;
&lt;br /&gt;
		local oddEven = cfg.marker.oddeven&lt;br /&gt;
		if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#039; then&lt;br /&gt;
			-- Assume list text is for a subgroup navbox so no automatic striping for this row.&lt;br /&gt;
			oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local liststyle_and_num = andnum(&#039;liststyle&#039;, listnum)&lt;br /&gt;
		local listclass_and_num = andnum(&#039;listclass&#039;, listnum)&lt;br /&gt;
		listCell&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;0&#039;)&lt;br /&gt;
			:cssText(args[cfg.arg.liststyle])&lt;br /&gt;
			:cssText(rowstyle)&lt;br /&gt;
			:cssText(args[liststyle_and_num])&lt;br /&gt;
			:addClass(cfg.class.navbox_list)&lt;br /&gt;
			:addClass(cfg.class.navbox_part .. oddEven)&lt;br /&gt;
			:addClass(args[cfg.arg.listclass])&lt;br /&gt;
			:addClass(args[listclass_and_num])&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:css(&#039;padding&#039;,&lt;br /&gt;
					(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or &#039;0 0.25em&#039;&lt;br /&gt;
				)&lt;br /&gt;
				:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.image] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 0 0 2px&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imagestyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.image]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_list_class(htmlclass)&lt;br /&gt;
		local patterns = {&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for arg, _ in pairs(args) do&lt;br /&gt;
			if type(arg) == &#039;string&#039; and mw.ustring.find(arg, cfg.pattern.class) then&lt;br /&gt;
				for _, pattern in ipairs(patterns) do&lt;br /&gt;
					if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
						return true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
	local function add_list_styles()&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
			if has_list_class(htmlclass) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				return &#039;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.hlist_templatestyles)&lt;br /&gt;
		local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.plainlist_templatestyles)&lt;br /&gt;
&lt;br /&gt;
		-- a second workaround for [[phab:T303378]]&lt;br /&gt;
		-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
		-- tag here if we want&lt;br /&gt;
		if has_navbar() and hlist_styles == &#039;&#039; then&lt;br /&gt;
			hlist_styles = frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering.&lt;br /&gt;
		-- this ordering is not a guarantee because most navboxes will emit only&lt;br /&gt;
		-- one of these classes [hlist_note]&lt;br /&gt;
		return hlist_styles .. plainlist_styles&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function needsHorizontalLists(border)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function hasBackgroundColors()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,&lt;br /&gt;
			cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;background&#039;, 1, true) 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;
	local function hasBorders()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,&lt;br /&gt;
			cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;border&#039;, 1, true) 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;
	local function isIllegible()&lt;br /&gt;
		local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
		for key, style in pairs(args) do&lt;br /&gt;
			if tostring(key):match(cfg.pattern.style) then&lt;br /&gt;
				if styleratio{mw.text.unstripNoWiki(style)} &amp;lt; 4.5 then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getTrackingCategories(border)&lt;br /&gt;
		local cats = {}&lt;br /&gt;
		if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end&lt;br /&gt;
		if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end&lt;br /&gt;
		if isIllegible() then table.insert(cats, cfg.category.illegible) end&lt;br /&gt;
		if hasBorders() then table.insert(cats, cfg.category.borders) end&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTrackingCategories(builder, border)&lt;br /&gt;
		local title = mw.title.getCurrentTitle()&lt;br /&gt;
		if title.namespace ~= 10 then return end -- not in template space&lt;br /&gt;
		local subpage = title.subpageText&lt;br /&gt;
		if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox&lt;br /&gt;
			or subpage == cfg.keyword.subpage_testcases then return end&lt;br /&gt;
&lt;br /&gt;
		for _, cat in ipairs(getTrackingCategories(border)) 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;
	local function renderMainTable(border, listnums)&lt;br /&gt;
		local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
			:addClass(cfg.class.nowraplinks)&lt;br /&gt;
			:addClass(args[cfg.arg.bodyclass])&lt;br /&gt;
&lt;br /&gt;
		local state = args[cfg.arg.state]&lt;br /&gt;
		if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then&lt;br /&gt;
			if state == cfg.keyword.state_collapsed then&lt;br /&gt;
				state = cfg.class.collapsed&lt;br /&gt;
			end&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.collapsible)&lt;br /&gt;
				:addClass(state or cfg.class.autocollapse)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_subgroup)&lt;br /&gt;
				:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
				:cssText(args[cfg.arg.style])&lt;br /&gt;
		else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_inner)&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[cfg.arg.innerstyle])&lt;br /&gt;
&lt;br /&gt;
		renderTitleRow(tbl)&lt;br /&gt;
		renderAboveRow(tbl)&lt;br /&gt;
		local listnums_size = #listnums&lt;br /&gt;
		for i, listnum in ipairs(listnums) do&lt;br /&gt;
			renderListRow(tbl, i, listnum, listnums_size)&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;
	local function add_navbox_styles(hiding_templatestyles)&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		-- This is a lambda so that it doesn&#039;t need the frame as a parameter&lt;br /&gt;
		local function add_user_styles(templatestyles)&lt;br /&gt;
			if not isblank(templatestyles) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- get templatestyles. load base from config so that Lua only needs to do&lt;br /&gt;
		-- the work once of parser tag expansion&lt;br /&gt;
		local base_templatestyles = cfg.templatestyles&lt;br /&gt;
		local templatestyles = add_user_styles(args[cfg.arg.templatestyles])&lt;br /&gt;
		local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])&lt;br /&gt;
&lt;br /&gt;
		-- The &#039;navbox-styles&#039; div exists to wrap the styles to work around T200206&lt;br /&gt;
		-- more elegantly. Instead of combinatorial rules, this ends up being linear&lt;br /&gt;
		-- number of CSS rules.&lt;br /&gt;
		return mw.html.create(&#039;div&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_styles)&lt;br /&gt;
			:wikitext(&lt;br /&gt;
				add_list_styles() .. -- see [hlist_note] applied to &#039;before base_templatestyles&#039;&lt;br /&gt;
				base_templatestyles ..&lt;br /&gt;
				templatestyles ..&lt;br /&gt;
				child_templatestyles ..&lt;br /&gt;
				table.concat(hiding_templatestyles)&lt;br /&gt;
			)&lt;br /&gt;
			:done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- work around [[phab:T303378]]&lt;br /&gt;
	-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
	-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	local argHash = 0&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; then&lt;br /&gt;
			for marker in string.gfind(arg, strip_marker_pattern) do&lt;br /&gt;
				table.insert(hiding_templatestyles, marker)&lt;br /&gt;
			end&lt;br /&gt;
			argHash = argHash + #arg&lt;br /&gt;
			args[k] = string.gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.argHash then args.argHash = argHash end&lt;br /&gt;
&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(cfg.pattern.listnum)&lt;br /&gt;
			if listnum and args[andnum(&#039;list&#039;, tonumber(listnum))] then&lt;br /&gt;
				table.insert(listnums, tonumber(listnum))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	local border = mw.text.trim(args[cfg.arg.border] or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == cfg.keyword.border_child then&lt;br /&gt;
		border = cfg.keyword.border_subgroup&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(border, listnums)&lt;br /&gt;
&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	-- render the appropriate wrapper for the navbox, based on the border param&lt;br /&gt;
&lt;br /&gt;
	if border == cfg.keyword.border_none then&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]&lt;br /&gt;
			and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == cfg.keyword.border_subgroup then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a&lt;br /&gt;
		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.&lt;br /&gt;
		-- We start with a &amp;lt;/div&amp;gt; to avoid the padding being applied, and at the&lt;br /&gt;
		-- 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;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox)&lt;br /&gt;
			:addClass(args[cfg.arg.navboxclass])&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above]&lt;br /&gt;
			or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then&lt;br /&gt;
		renderTrackingCategories(res, border)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res), border)&lt;br /&gt;
end --p._navbox&lt;br /&gt;
&lt;br /&gt;
function p._withCollapsibleGroups(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.bodystyle] = true,&lt;br /&gt;
		[cfg.arg.border] = true,&lt;br /&gt;
		[cfg.arg.style] = true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if k and type(k) == &#039;string&#039; then&lt;br /&gt;
			if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
				targs[k] = v&lt;br /&gt;
			elseif (k:match(cfg.pattern.num)) then&lt;br /&gt;
				local n = k:match(cfg.pattern.num)&lt;br /&gt;
				local list_and_num = andnum(&#039;list&#039;, n)&lt;br /&gt;
				if ((k:match(cfg.pattern.listnum) or k:match(cfg.pattern.contentnum))&lt;br /&gt;
						and targs[list_and_num] == nil&lt;br /&gt;
						and pargs[andnum(&#039;group&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;sect&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;section&#039;, n)] == nil) then&lt;br /&gt;
					targs[list_and_num] = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if (targs[list_and_num] and inArray(cfg.keyword.subgroups, targs[list_and_num])) then&lt;br /&gt;
						targs[list_and_num] = getSubgroup(pargs, n, targs[list_and_num])&lt;br /&gt;
					end&lt;br /&gt;
				elseif ((k:match(cfg.pattern.groupnum) or k:match(cfg.pattern.sectnum) or k:match(cfg.pattern.sectionnum))&lt;br /&gt;
						and targs[list_and_num] == nil) then&lt;br /&gt;
					local titlestyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.groupstyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.secttitlestyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;groupstyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;sectiontitlestyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local liststyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.liststyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.contentstyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;liststyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;contentstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local title = concatstrings({&lt;br /&gt;
						pargs[andnum(&#039;group&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;sect&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;section&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local list = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if list and inArray(cfg.keyword.subgroups, list) then&lt;br /&gt;
						list = getSubgroup(pargs, n, list)&lt;br /&gt;
					end&lt;br /&gt;
					local abbr_and_num = andnum(&#039;abbr&#039;, n)&lt;br /&gt;
					local state = (pargs[abbr_and_num] and pargs[abbr_and_num] == pargs[cfg.arg.selected]) &lt;br /&gt;
						and cfg.keyword.state_uncollapsed&lt;br /&gt;
						or (pargs[andnum(&#039;state&#039;, n)] or cfg.keyword.state_collapsed)&lt;br /&gt;
					&lt;br /&gt;
					targs[list_and_num] =p._navbox({&lt;br /&gt;
						cfg.keyword.border_child,&lt;br /&gt;
						[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
						[cfg.arg.state] = state,&lt;br /&gt;
						[cfg.arg.basestyle] = pargs[cfg.arg.basestyle],&lt;br /&gt;
						[cfg.arg.title] = title,&lt;br /&gt;
						[cfg.arg.titlestyle] = titlestyle,&lt;br /&gt;
						[andnum(&#039;list&#039;, 1)] = list,&lt;br /&gt;
						[cfg.arg.liststyle] = liststyle,&lt;br /&gt;
						[cfg.arg.listclass] = pargs[andnum(&#039;listclass&#039;, n)],&lt;br /&gt;
						[cfg.arg.image] = pargs[andnum(&#039;image&#039;, n)],&lt;br /&gt;
						[cfg.arg.imageleft] = pargs[andnum(&#039;imageleft&#039;, n)],&lt;br /&gt;
						[cfg.arg.listpadding] = pargs[cfg.arg.listpadding],&lt;br /&gt;
						argHash = pargs.argHash&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- ordering of style and bodystyle&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({targs[cfg.arg.style] or &#039;&#039;, targs[cfg.arg.bodystyle] or &#039;&#039;})&lt;br /&gt;
	targs[cfg.arg.bodystyle] = nil&lt;br /&gt;
&lt;br /&gt;
	-- child or subgroup&lt;br /&gt;
	if targs[cfg.arg.border] == nil then targs[cfg.arg.border] = pargs[1] end&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withCollapsibleGroups&lt;br /&gt;
&lt;br /&gt;
function p._withColumns(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- tables of column numbers&lt;br /&gt;
	local colheadernums = {}&lt;br /&gt;
	local colnums = {}&lt;br /&gt;
	local colfooternums = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.evenstyle]=true,&lt;br /&gt;
		[cfg.arg.groupstyle]=true,&lt;br /&gt;
		[cfg.arg.liststyle]=true,&lt;br /&gt;
		[cfg.arg.oddstyle]=true,&lt;br /&gt;
		[cfg.arg.state]=true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
			targs[k] = v&lt;br /&gt;
		elseif type(k) == &#039;string&#039; then&lt;br /&gt;
			if k:match(cfg.pattern.listnum) then&lt;br /&gt;
				local n = k:match(cfg.pattern.listnum)&lt;br /&gt;
				targs[andnum(&#039;liststyle&#039;, n + 2)] = pargs[andnum(&#039;liststyle&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;group&#039;, n + 2)] = pargs[andnum(&#039;group&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;groupstyle&#039;, n + 2)] = pargs[andnum(&#039;groupstyle&#039;, n)]&lt;br /&gt;
				if v and inArray(cfg.keyword.subgroups, v) then&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = getSubgroup(pargs, n, v)&lt;br /&gt;
				else&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = v&lt;br /&gt;
				end&lt;br /&gt;
			elseif (k:match(cfg.pattern.colheadernum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colheadernums, tonumber(k:match(cfg.pattern.colheadernum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colnum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colnums, tonumber(k:match(cfg.pattern.colnum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colfooternum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colfooternums, tonumber(k:match(cfg.pattern.colfooternum)))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(colheadernums)&lt;br /&gt;
	table.sort(colnums)&lt;br /&gt;
	table.sort(colfooternums)&lt;br /&gt;
&lt;br /&gt;
	-- HTML table for list1&lt;br /&gt;
	local coltable = mw.html.create( &#039;table&#039; ):addClass(&#039;navbox-columns-table&#039;)&lt;br /&gt;
	local row, col&lt;br /&gt;
&lt;br /&gt;
	local tablestyle = ( (#colheadernums &amp;gt; 0) or (not isblank(pargs[cfg.arg.fullwidth])) )&lt;br /&gt;
		and &#039;width:100%&#039;&lt;br /&gt;
		or &#039;width:auto; margin-left:auto; margin-right:auto&#039;&lt;br /&gt;
&lt;br /&gt;
	coltable:cssText(concatstyles({&lt;br /&gt;
		&#039;border-spacing: 0px; text-align:left&#039;,&lt;br /&gt;
		tablestyle,&lt;br /&gt;
		pargs[cfg.arg.coltablestyle] or &#039;&#039;&lt;br /&gt;
	}))&lt;br /&gt;
&lt;br /&gt;
	--- Header row ---&lt;br /&gt;
	if (#colheadernums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colheadernums) do&lt;br /&gt;
			col = row:tag(&#039;th&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colheaderstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colheaderstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colheadercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colheader&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Main columns ---&lt;br /&gt;
	row = coltable:tag(&#039;tr&#039;):css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
	for k, n in ipairs(colnums) do&lt;br /&gt;
		if k == 1 and isblank(pargs[andnum(&#039;colheader&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[andnum(&#039;colfooter&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[cfg.arg.fullwidth]) then&lt;br /&gt;
			local nopad = inArray(&lt;br /&gt;
				{&#039;off&#039;, &#039;0&#039;, &#039;0em&#039;, &#039;0px&#039;},&lt;br /&gt;
				mw.ustring.gsub(pargs[cfg.arg.padding] or &#039;&#039;, &#039;[;%%]&#039;, &#039;&#039;))&lt;br /&gt;
			if not nopad then&lt;br /&gt;
				row:tag(&#039;td&#039;):wikitext(&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;)&lt;br /&gt;
					:css(&#039;width&#039;, (pargs[cfg.arg.padding] or &#039;5em&#039;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		col = row:tag(&#039;td&#039;):addClass(&#039;navbox-list&#039;)&lt;br /&gt;
		col:cssText(concatstyles({&lt;br /&gt;
			(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
			&#039;padding:0px&#039;,&lt;br /&gt;
			pargs[cfg.arg.colstyle] or &#039;&#039;,&lt;br /&gt;
			((n%2 == 0) and pargs[cfg.arg.evencolstyle] or pargs[cfg.arg.oddcolstyle]) or &#039;&#039;,&lt;br /&gt;
			pargs[andnum(&#039;colstyle&#039;, n)] or &#039;&#039;,&lt;br /&gt;
			&#039;width:&#039; .. (pargs[andnum(&#039;colwidth&#039;, n)] or pargs[cfg.arg.colwidth] or &#039;10em&#039;)&lt;br /&gt;
		}))&lt;br /&gt;
		local wt = pargs[andnum(&#039;col&#039;, n)]&lt;br /&gt;
		if wt and inArray(cfg.keyword.subgroups, wt) then&lt;br /&gt;
			wt = getSubgroup(pargs, n, wt, cfg.arg.col_and_num)&lt;br /&gt;
		end&lt;br /&gt;
		col:tag(&#039;div&#039;):newline():wikitext(wt):newline()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Footer row ---&lt;br /&gt;
	if (#colfooternums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colfooternums) do&lt;br /&gt;
			col = row:tag(&#039;td&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colfooterstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colfooterstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colfootercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colfooter&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- assign table to list1&lt;br /&gt;
	targs[andnum(&#039;list&#039;, 1)] = tostring(coltable)&lt;br /&gt;
	if isblank(pargs[andnum(&#039;colheader&#039;, 1)]) &lt;br /&gt;
			and isblank(pargs[andnum(&#039;col&#039;, 1)])&lt;br /&gt;
			and isblank(pargs[andnum(&#039;colfooter&#039;, 1)]) then&lt;br /&gt;
		targs[andnum(&#039;list&#039;, 1)] = targs[andnum(&#039;list&#039;, 1)] ..&lt;br /&gt;
			cfg.category.without_first_col&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Other parameters&lt;br /&gt;
	targs[cfg.arg.border] = pargs[cfg.arg.border] or pargs[1]&lt;br /&gt;
	targs[cfg.arg.evenodd] = (not isblank(pargs[cfg.arg.evenodd])) and pargs[cfg.arg.evenodd] or nil&lt;br /&gt;
	targs[cfg.arg.list1padding] = &#039;0px&#039;&lt;br /&gt;
	targs[andnum(&#039;liststyle&#039;, 1)] = &#039;background:transparent;color:inherit;&#039;&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({pargs[cfg.arg.style], pargs[cfg.arg.bodystyle]})&lt;br /&gt;
	targs[cfg.arg.tracking] = &#039;no&#039;&lt;br /&gt;
	&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withColumns&lt;br /&gt;
&lt;br /&gt;
-- Template entry points&lt;br /&gt;
function p.navbox (frame, boxtype)&lt;br /&gt;
	local function readArgs(args, prefix)&lt;br /&gt;
		local function readSubgroups(element, i)&lt;br /&gt;
			if inArray(cfg.keyword.subgroups, args[prefix .. andnum(element, i)]) then&lt;br /&gt;
				for _, v in ipairs(cfg.arg.subgroups_and_num) do&lt;br /&gt;
					readArgs(args, prefix .. string.format(v, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				readArgs(args, prefix .. andnum(&#039;col&#039;, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
		-- Read the arguments in the order they&#039;ll be output in, to make references&lt;br /&gt;
		-- number in the right order.&lt;br /&gt;
		local _&lt;br /&gt;
		_ = args[prefix .. cfg.arg.title]&lt;br /&gt;
		_ = args[prefix .. cfg.arg.above]&lt;br /&gt;
		-- Limit this to 20 as covering &#039;most&#039; cases (that&#039;s a SWAG) and because&lt;br /&gt;
		-- iterator approach won&#039;t work here&lt;br /&gt;
		local boxtype = args.type or cfg.keyword[boxtype]&lt;br /&gt;
		if boxtype == cfg.keyword.with_columns then&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colheader&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				readSubgroups(&#039;col&#039;, i)&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colfooter&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, 20 do&lt;br /&gt;
			_ = args[prefix .. andnum(&#039;group&#039;, i)]&lt;br /&gt;
			readSubgroups(&#039;list&#039;, i)&lt;br /&gt;
		end&lt;br /&gt;
		_ = args[prefix .. cfg.arg.below]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(frame, {wrappers = {cfg.pattern[boxtype or &#039;navbox&#039;]}})&lt;br /&gt;
	readArgs(args, &amp;quot;&amp;quot;)&lt;br /&gt;
	args.argHash = nil -- we shouldn&#039;t accept argHash passed from a template&lt;br /&gt;
	args.type = args.type or cfg.keyword[boxtype]&lt;br /&gt;
	return p[&#039;_navbox&#039;](args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_collapsible_groups] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_collapsible_groups&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_columns] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_columns&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbar/styles.css&amp;diff=416</id>
		<title>Module:Navbar/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbar/styles.css&amp;diff=416"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.navbar {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-collapse {&lt;br /&gt;
	float: left;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-boxtext {&lt;br /&gt;
	word-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar ul {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::before {&lt;br /&gt;
	margin-right: -0.125em;&lt;br /&gt;
	content: &#039;[ &#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::after {&lt;br /&gt;
	margin-left: -0.125em;&lt;br /&gt;
	content: &#039; ]&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar li {&lt;br /&gt;
	word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar a &amp;gt; span,&lt;br /&gt;
.navbar a &amp;gt; abbr {&lt;br /&gt;
	text-decoration: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-mini abbr {&lt;br /&gt;
	font-variant: small-caps;&lt;br /&gt;
	border-bottom: none;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	cursor: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-full {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 7em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-mini {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* not the usual @media screen, we simply remove navbar in @media print */&lt;br /&gt;
html.skin-theme-clientpref-night .navbar li a abbr {&lt;br /&gt;
	color: var(--color-base) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
	html.skin-theme-clientpref-os .navbar li a abbr {&lt;br /&gt;
		color: var(--color-base) !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	.navbar {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbar/configuration&amp;diff=414</id>
		<title>Module:Navbar/configuration</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbar/configuration&amp;diff=414"/>
		<updated>2026-09-09T09:48:26Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	[&#039;templatestyles&#039;] = &#039;Module:Navbar/styles.css&#039;,&lt;br /&gt;
	[&#039;hlist_templatestyles&#039;] = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	[&#039;box_text&#039;] = &#039;This box: &#039;,			-- default text box when not plain or mini&lt;br /&gt;
	[&#039;title_namespace&#039;] = &#039;Template&#039;,		-- namespace to default to for title&lt;br /&gt;
	[&#039;invalid_title&#039;] = &#039;Invalid title &#039;,&lt;br /&gt;
	[&#039;classes&#039;] = { -- set a line to nil if you don&#039;t want it&lt;br /&gt;
		[&#039;navbar&#039;] = &#039;navbar&#039;,&lt;br /&gt;
		[&#039;plainlinks&#039;] = &#039;plainlinks&#039;, -- plainlinks&lt;br /&gt;
		[&#039;horizontal_list&#039;] = &#039;hlist&#039;, -- horizontal list class&lt;br /&gt;
		[&#039;mini&#039;] = &#039;navbar-mini&#039;, -- class indicating small links in the navbar&lt;br /&gt;
		[&#039;box_text&#039;] = &#039;navbar-boxtext&#039;,&lt;br /&gt;
		[&#039;brackets&#039;] = &#039;navbar-brackets&#039;,&lt;br /&gt;
		-- &#039;collapsible&#039; is the key for a class to indicate the navbar is&lt;br /&gt;
		-- setting up the collapsible element in addition to the normal&lt;br /&gt;
		-- navbar.&lt;br /&gt;
		[&#039;collapsible&#039;] = &#039;navbar-collapse&#039;,&lt;br /&gt;
		[&#039;collapsible_title_mini&#039;] = &#039;navbar-ct-mini&#039;,&lt;br /&gt;
		[&#039;collapsible_title_full&#039;] = &#039;navbar-ct-full&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Navbar&amp;diff=412</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Navbar&amp;diff=412"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local function get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_arg = 1&lt;br /&gt;
	if is_collapsible then title_arg = 2 end&lt;br /&gt;
	if template then title_arg = &#039;template&#039; end&lt;br /&gt;
	return title_arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function choose_links(template, args)&lt;br /&gt;
	-- The show table indicates the default displayed items.&lt;br /&gt;
	-- view, talk, edit, hist, move, watch&lt;br /&gt;
	-- TODO: Move to configuration.&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	if template then&lt;br /&gt;
		show[2] = false&lt;br /&gt;
		show[3] = false&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,&lt;br /&gt;
			talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		-- TODO: Consider removing TableTools dependency.&lt;br /&gt;
		for _, v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local remove_edit_link = args.noedit&lt;br /&gt;
	if remove_edit_link then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	return show&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_link(link_description, ul, is_mini, font_style)&lt;br /&gt;
	local l&lt;br /&gt;
	if link_description.url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039; .. link_description.full)&lt;br /&gt;
		:wikitext(l[1] .. link_description.link .. l[2])&lt;br /&gt;
		:tag(is_mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, link_description.html_title)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(is_mini and link_description.mini or link_description.full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(cfg.invalid_title .. title_text)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: Get link_descriptions and show into the configuration module.&lt;br /&gt;
	-- link_descriptions should be easier...&lt;br /&gt;
	local link_descriptions = {&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;v&#039;, [&#039;full&#039;] = &#039;view&#039;, [&#039;html_title&#039;] = &#039;View this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;t&#039;, [&#039;full&#039;] = &#039;talk&#039;, [&#039;html_title&#039;] = &#039;Discuss this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = talkpage, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;e&#039;, [&#039;full&#039;] = &#039;edit&#039;, [&#039;html_title&#039;] = &#039;Edit this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:EditPage/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;h&#039;, [&#039;full&#039;] = &#039;hist&#039;, [&#039;html_title&#039;] = &#039;History of this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:PageHistory/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;m&#039;, [&#039;full&#039;] = &#039;move&#039;, [&#039;html_title&#039;] = &#039;Move this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = mw.title.new(&#039;Special:Movepage&#039;):fullUrl(&#039;target=&#039;..title.fullText), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;w&#039;, [&#039;full&#039;] = &#039;watch&#039;, [&#039;html_title&#039;] = &#039;Watch this template&#039;, &lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=watch&#039;), [&#039;url&#039;] = true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local ul = mw.html.create(&#039;ul&#039;)&lt;br /&gt;
	if has_brackets then&lt;br /&gt;
		ul:addClass(cfg.classes.brackets)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, _ in ipairs(displayed_links) do&lt;br /&gt;
		if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end&lt;br /&gt;
	end&lt;br /&gt;
	return ul:done()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: We probably don&#039;t need both fontstyle and fontcolor...&lt;br /&gt;
	local font_style = args.fontstyle&lt;br /&gt;
	local font_color = args.fontcolor&lt;br /&gt;
	local is_collapsible = args.collapsible&lt;br /&gt;
	local is_mini = args.mini&lt;br /&gt;
	local is_plain = args.plain&lt;br /&gt;
	&lt;br /&gt;
	local collapsible_class = nil&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		collapsible_class = cfg.classes.collapsible&lt;br /&gt;
		if not is_plain then is_mini = 1 end&lt;br /&gt;
		if font_color then&lt;br /&gt;
			font_style = (font_style or &#039;&#039;) .. &#039;; color: &#039; .. font_color .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local navbar_style = args.style&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(cfg.classes.navbar)&lt;br /&gt;
		:addClass(cfg.classes.plainlinks)&lt;br /&gt;
		:addClass(cfg.classes.horizontal_list)&lt;br /&gt;
		:addClass(collapsible_class) -- we made the determination earlier&lt;br /&gt;
		:cssText(navbar_style)&lt;br /&gt;
&lt;br /&gt;
	if is_mini then div:addClass(cfg.classes.mini) end&lt;br /&gt;
&lt;br /&gt;
	local box_text = (args.text or cfg.box_text) .. &#039; &#039;&lt;br /&gt;
	 -- the concatenated space guarantees the box text is separated&lt;br /&gt;
	if not (is_mini or is_plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(cfg.classes.box_text)&lt;br /&gt;
				:cssText(font_style)&lt;br /&gt;
				:wikitext(box_text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local template = args.template&lt;br /&gt;
	local displayed_links = choose_links(template, args)&lt;br /&gt;
	local has_brackets = args.brackets&lt;br /&gt;
	local title_arg = get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_text = args[title_arg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	div:node(list)&lt;br /&gt;
&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		local title_text_class&lt;br /&gt;
		if is_mini then&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_mini&lt;br /&gt;
		else&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_full&lt;br /&gt;
		end&lt;br /&gt;
		div:done()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(title_text_class)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- hlist -&amp;gt; navbar is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	return frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
	} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.templatestyles }&lt;br /&gt;
	} .. tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	return p._navbar(require(&#039;Module:Arguments&#039;).getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Icon/data&amp;diff=410</id>
		<title>Module:Icon/data</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Icon/data&amp;diff=410"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module stores icon data for [[Module:Icon]].&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Icon data&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local data = {&lt;br /&gt;
	fa = {&lt;br /&gt;
		image = &amp;quot;Featured article star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	far = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	farc = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffa = {&lt;br /&gt;
		aliases = {&amp;quot;dfa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Featured article star - cross.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fac = {&lt;br /&gt;
		aliases = {&amp;quot;fan&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffac = {&lt;br /&gt;
		aliases = {&amp;quot;nofa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fl = {&lt;br /&gt;
		image = &amp;quot;Featured article star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	flrc = {&lt;br /&gt;
		aliases = {&amp;quot;flr&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffl = {&lt;br /&gt;
		aliases = {&amp;quot;dfl&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Featured article star - cross.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured list&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	flc = {&lt;br /&gt;
		aliases = {&amp;quot;fln&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured list candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fflc = {&lt;br /&gt;
		aliases = {&amp;quot;nofl&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured list candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	a = {&lt;br /&gt;
		image = &amp;quot;Symbol a class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;A-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	admin = {&lt;br /&gt;
		aliases = {&amp;quot;mop&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Wikipedia Administrator.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Administrator&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	dac = {&lt;br /&gt;
		aliases = {&amp;quot;daa&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol unsupport A vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Demoted A-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	acc = {&lt;br /&gt;
		aliases = {&amp;quot;acn&amp;quot;, &amp;quot;aac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;A candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;A-Class article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	noac = {&lt;br /&gt;
		aliases = {&amp;quot;faac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol unsupport A vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Failed A-Class article candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ga = {&lt;br /&gt;
		image = &amp;quot;Symbol support vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gar = {&lt;br /&gt;
		image = &amp;quot;GA Candidate Neutral vote(ChaosNil).svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article reassessment&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dga = {&lt;br /&gt;
		image = &amp;quot;Symbol unsupport vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Delisted good article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gan = {&lt;br /&gt;
		aliases = {&amp;quot;gac&amp;quot;},&lt;br /&gt;
		image = &amp;quot;GA candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article nominee&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	ga2 = {&lt;br /&gt;
		image = &amp;quot;Symbol neutral vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article, 2nd opinion&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gah = {&lt;br /&gt;
		image = &amp;quot;Symbol wait.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article on hold&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	fgan = {&lt;br /&gt;
		aliases = {&amp;quot;noga&amp;quot;, &amp;quot;gaf&amp;quot;, &amp;quot;gf&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol oppose vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former good article nominee&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	fp = {&lt;br /&gt;
		image = &amp;quot;Cscr-featured.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpc = {&lt;br /&gt;
		aliases = {&amp;quot;fpn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured picture candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffp = {&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	vp = {&lt;br /&gt;
		image = &amp;quot;ENWP VP Logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued picture&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	vpc = {&lt;br /&gt;
		image = &amp;quot;Valued pics 1.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued picture candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fs = {&lt;br /&gt;
		image = &amp;quot;Cscr-featured.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured sound&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffs = {&lt;br /&gt;
		image = &amp;quot;Cscr-former.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured sound&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fsc = {&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured sound candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpo = {&lt;br /&gt;
		image = &amp;quot;Linecons big-star.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Before the featured portal process ceased in 2017, this had been designated as a featured portal.&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpor = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured portal review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ffpo = {&lt;br /&gt;
		image = &amp;quot;Featured article star - cross.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured portal&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fpoc = {&lt;br /&gt;
		image = &amp;quot;Cscr-candidate.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured portal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ft = {&lt;br /&gt;
		image = &amp;quot;Cscr-featuredtopic.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ftrc = {&lt;br /&gt;
		image = &amp;quot;Cscr-star piece.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic removal candidate&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	fft = {&lt;br /&gt;
		aliases = {&amp;quot;dft&amp;quot;},&lt;br /&gt;
		image = &amp;quot;DFT candidate_cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Former featured topic&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ftc = {&lt;br /&gt;
		aliases = {&amp;quot;ftn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;FT candidate cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Featured topic candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gt = {&lt;br /&gt;
		image = &amp;quot;Support cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gtrc = {&lt;br /&gt;
		image = &amp;quot;Symbol unsupport vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic removal candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gtc = {&lt;br /&gt;
		aliases = {&amp;quot;gtn&amp;quot;},&lt;br /&gt;
		image = &amp;quot;GA candidate cluster.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good topic candidate&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	bplus = {&lt;br /&gt;
		aliases = {&amp;quot;b+&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol bplus class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Bplus-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	b = {&lt;br /&gt;
		image = &amp;quot;Symbol b class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;B-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	br = {&lt;br /&gt;
		aliases = {&amp;quot;bcr&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Bclass-checklist.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;B-Class review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	c = {&lt;br /&gt;
		image = &amp;quot;Symbol c class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;C-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	start = {&lt;br /&gt;
		image = &amp;quot;Symbol start class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Start-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	stub = {&lt;br /&gt;
		image = &amp;quot;Symbol stub class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Stub-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	list = {&lt;br /&gt;
		aliases = {&amp;quot;comparison&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol list class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;List-Class article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	no = {&lt;br /&gt;
		image = &amp;quot;Crystal button cancel.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Unknown-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	book = {&lt;br /&gt;
		image = &amp;quot;Symbol book class2.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikipedia book&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	category = {&lt;br /&gt;
		aliases = {&amp;quot;cat&amp;quot;, &amp;quot;categ&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol category class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Category&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	disambiguation = {&lt;br /&gt;
		aliases = {&amp;quot;dab&amp;quot;, &amp;quot;disamb&amp;quot;, &amp;quot;disambig&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol dab class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Disambiguation page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	image = {&lt;br /&gt;
		aliases = {&amp;quot;file&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol file class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;File&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	needed = {&lt;br /&gt;
		image = &amp;quot;Symbol needed class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Needed article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	outline = {&lt;br /&gt;
		image = &amp;quot;Global thinking.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Outline&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	portal = {&lt;br /&gt;
		image = &amp;quot;Symbol portal class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Portal&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	project = {&lt;br /&gt;
		image = &amp;quot;Symbol project class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Project page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	redirect = {&lt;br /&gt;
		aliases = {&amp;quot;red&amp;quot;, &amp;quot;redir&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol redirect vote2.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Redirect&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	template = {&lt;br /&gt;
		aliases = {&amp;quot;temp&amp;quot;, &amp;quot;templ&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol template class pink.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Template&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	essay = {&lt;br /&gt;
		image = &amp;quot;Essay.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Essay&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	na = {&lt;br /&gt;
		image = &amp;quot;Symbol na class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Non-article page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	aa = {&lt;br /&gt;
		image = &amp;quot;Yes check.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Audited article of limited subject matter&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	da = {&lt;br /&gt;
		image = &amp;quot;Symbol oppose vote.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Demoted article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dyk = {&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Did You Know?&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	dyk2 = {&lt;br /&gt;
		image = &amp;quot;DYK questionmark icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Did You Know?&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	pr = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps kedit.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Peer review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	ppr = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps kedit.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Portal peer review&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	q = {&lt;br /&gt;
		aliases = {&amp;quot;question&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Question&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	cleanup = {&lt;br /&gt;
		image = &amp;quot;Edit-clear.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Cleanup work&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	qi = {&lt;br /&gt;
		image = &amp;quot;Quality images logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Quality image on Wikimedia Commons&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	vi = {&lt;br /&gt;
		image = &amp;quot;Valued image seal.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Valued image on Wikimedia Commons&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	tfa = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Today&#039;s Featured Article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	tfl = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Today&#039;s Featured List&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	itn = {&lt;br /&gt;
		image = &amp;quot;Globe current.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;In The News&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	otd = {&lt;br /&gt;
		image = &amp;quot;Nuvola apps date.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;On This Day&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikiproject = {&lt;br /&gt;
		image = &amp;quot;People icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;WikiProject&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	goce = {&lt;br /&gt;
		image = &amp;quot;Writing Magnifying.PNG&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Guild of Copy Editors&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikipedia = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikipedia page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	commons = {&lt;br /&gt;
		image = &amp;quot;Commons-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Commons page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikiquote = {&lt;br /&gt;
		image = &amp;quot;Wikiquote-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikiquote page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	wikiversity = {&lt;br /&gt;
		image = &amp;quot;Wikiversity logo 2017.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikiversity page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikibooks = {&lt;br /&gt;
		image = &amp;quot;Wikibooks-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikibooks page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikisource = {&lt;br /&gt;
		image = &amp;quot;Wikisource-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikisource page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wiktionary = {&lt;br /&gt;
		image = &amp;quot;Wiktionary-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wiktionary page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikinews = {&lt;br /&gt;
		image = &amp;quot;Wikinews-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikinews page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikispecies = {&lt;br /&gt;
		image = &amp;quot;Wikispecies-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikispecies page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	wikidata = {&lt;br /&gt;
		image = &amp;quot;Wikidata-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikidata page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	wikivoyage = {&lt;br /&gt;
		image = &amp;quot;Wikivoyage-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Wikivoyage page&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	 mediawiki = {&lt;br /&gt;
		 image = &amp;quot;MediaWiki-2020-icon.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;MediaWiki&amp;quot;,&lt;br /&gt;
		 link = true,&lt;br /&gt;
	 },&lt;br /&gt;
	 phabricator = {&lt;br /&gt;
		 aliases = {&amp;quot;phab&amp;quot;},&lt;br /&gt;
		 image = &amp;quot;Favicon-Phabricator-WM.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;Phabricator&amp;quot;,&lt;br /&gt;
		 link = false,&lt;br /&gt;
	 },&lt;br /&gt;
	 wikitech = {&lt;br /&gt;
		 image = &amp;quot;Wikitech-2021-blue-icon.svg&amp;quot;,&lt;br /&gt;
		 tooltip = &amp;quot;Wikitech&amp;quot;,&lt;br /&gt;
		 link = true,&lt;br /&gt;
	 },&lt;br /&gt;
	meta = {&lt;br /&gt;
		image = &amp;quot;Wikimedia Community Logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Meta-wiki page&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	four = {&lt;br /&gt;
		aliases = {&amp;quot;4a&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Four Award with draft icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Four Award&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	million = {&lt;br /&gt;
		image = &amp;quot;Million award logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Million Award&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	module = {&lt;br /&gt;
		image = &amp;quot;Lua-logo-nolabel.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Module&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	vital = {&lt;br /&gt;
		image = &amp;quot;Círculos_Concéntricos.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Vital article&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	potd  = {&lt;br /&gt;
		image = &amp;quot;Wikipedia-logo.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Picture of the Day&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	draft = {&lt;br /&gt;
		image = &amp;quot;Symbol draft class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Draft-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	user = {&lt;br /&gt;
		image = &amp;quot;Symbol user class.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;User-Class article&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	info = {&lt;br /&gt;
		image = &amp;quot;Information icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Information&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	discussionnotificaion = {&lt;br /&gt;
		image = &amp;quot;Echo edit-user-talk icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Discussion&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	alert = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Black alert&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-imagewarning&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert image warning.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Alert&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-constructive&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert-constructive.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Green alert&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	[&#039;alert-blackred&#039;] = {&lt;br /&gt;
		image = &amp;quot;OOjs UI icon alert destructive black-darkred.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Black, white, and red alert&amp;quot;,&lt;br /&gt;
		link = true,&lt;br /&gt;
	},&lt;br /&gt;
	barnstar2 = {&lt;br /&gt;
		image = &amp;quot;Original Barnstar Hires.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Original barnstar hires&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	barnstar = {&lt;br /&gt;
		image = &amp;quot;Original Barnstar.png&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Original barnstar&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	gareview = {&lt;br /&gt;
		aliases = {&amp;quot;ganrv&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Good article review icon.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;Good article review&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	},&lt;br /&gt;
	new = {&lt;br /&gt;
		aliases = {&amp;quot;stork&amp;quot;},&lt;br /&gt;
		image = &amp;quot;Symbol Stork.svg&amp;quot;,&lt;br /&gt;
		tooltip = &amp;quot;New&amp;quot;,&lt;br /&gt;
		link = true&lt;br /&gt;
	},&lt;br /&gt;
	_DEFAULT = {&lt;br /&gt;
		image = &amp;quot;Symbol question.svg&amp;quot;,&lt;br /&gt;
		link = false,&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- End icon data&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Make aliases work the same as normal keys, and remove the &amp;quot;aliases&amp;quot; subtables.&lt;br /&gt;
local ret= {}&lt;br /&gt;
for code, iconData in pairs(data) do&lt;br /&gt;
	iconData.canonicalCode = code&lt;br /&gt;
	if iconData.aliases then&lt;br /&gt;
		for _, alias in ipairs(iconData.aliases) do&lt;br /&gt;
			ret[alias] = iconData&lt;br /&gt;
		end&lt;br /&gt;
		iconData.aliases = nil&lt;br /&gt;
	end&lt;br /&gt;
	ret[code] = iconData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ret&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Icon&amp;diff=408</id>
		<title>Module:Icon</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Icon&amp;diff=408"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements [[Template:Icon]].&lt;br /&gt;
&lt;br /&gt;
require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
local yesNo = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
local getArgs = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Determine whether we&#039;re being called from a sandbox&lt;br /&gt;
local sandbox = mw.getCurrentFrame():getTitle():find(&#039;sandbox&#039;, 1, true) and &#039;/sandbox&#039; or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-- Implements [[Template:Icon]]&lt;br /&gt;
-- Returns the icon image corresponding to a string (like &#039;B&#039;)&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	local data_module = &#039;Module:Icon/data&#039;..sandbox&lt;br /&gt;
	data = data or mw.loadData(data_module)&lt;br /&gt;
	local code = args.class or args[1]&lt;br /&gt;
	local iconData&lt;br /&gt;
	if code then&lt;br /&gt;
		code = code:match(&#039;^%s*(.-)%s*$&#039;):lower() -- trim whitespace and put in lower case&lt;br /&gt;
		iconData = data[code]&lt;br /&gt;
	end&lt;br /&gt;
	if not iconData then&lt;br /&gt;
		iconData = data._DEFAULT&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;[[File:%s%s%s|%s|class=noviewer|alt=%s]]&#039;,&lt;br /&gt;
		iconData.image,&lt;br /&gt;
		iconData.tooltip and &#039;|&#039; .. iconData.tooltip or &#039;&#039;,&lt;br /&gt;
		iconData.link == false and &#039;|link=&#039; or &#039;&#039;,&lt;br /&gt;
		args.size or &#039;16x16px&#039;,&lt;br /&gt;
		iconData.alt or &#039;&#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implements [[Template:Icon link]], a superset of [[Template:Icon]]&lt;br /&gt;
-- Returns an icon, plus a suitably formatted wikilink&lt;br /&gt;
function p._link(args, data)&lt;br /&gt;
	args.size = args.size or args.iconsize&lt;br /&gt;
	local icon = p._main(args, data)&lt;br /&gt;
	-- If no link given in args[2], default back to [[Template:Icon]]&lt;br /&gt;
	if not args[2] then&lt;br /&gt;
		return icon&lt;br /&gt;
	end&lt;br /&gt;
	-- Strip wiki markup out of link&lt;br /&gt;
	local getPlain = require(&amp;quot;Module:Text&amp;quot;).Text().getPlain&lt;br /&gt;
	local link = getPlain(args[2])&lt;br /&gt;
	local display = args[3] or args[2]&lt;br /&gt;
	-- italicize display string, if requested&lt;br /&gt;
	if yesNo(args.i) or yesNo(args.italic) or yesNo(args.italics) then&lt;br /&gt;
		display = &#039;&amp;lt;i&amp;gt;&#039;..display..&#039;&amp;lt;/i&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- if display is link, just use standard wlink&lt;br /&gt;
	if link == display then&lt;br /&gt;
		return &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;..icon..&#039; &amp;lt;/span&amp;gt;[[&#039;..link..&#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;..icon..&#039; &amp;lt;/span&amp;gt;[[&#039;..link..&#039;|&#039;..display..&#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame,{parentFirst=true})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
	local args = getArgs(frame,{parentFirst=true})&lt;br /&gt;
	return p._link(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;&#039;] = function (frame) return p._main(frame.args) end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:Hatnote/styles.css&amp;diff=406</id>
		<title>Module:Hatnote/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:Hatnote/styles.css&amp;diff=406"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.hatnote {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */&lt;br /&gt;
div.hatnote {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding-left: 1.6em;&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hatnote i {&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Templatestyles causes an &#039;empty&#039; span between hatnotes.&lt;br /&gt;
 * See also [[phab:T200206]] for later */&lt;br /&gt;
.hatnote + .mw-empty-elt + .hatnote {&lt;br /&gt;
	margin-top: -0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	body.ns-0 .hatnote {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Navbox&amp;diff=404</id>
		<title>Template:Navbox</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Navbox&amp;diff=404"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&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>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:Icon&amp;diff=402</id>
		<title>Template:Icon</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:Icon&amp;diff=402"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Icon|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Module:List&amp;diff=400</id>
		<title>Module:List</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Module:List&amp;diff=400"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local libUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&#039;bulleted&#039;] = true,&lt;br /&gt;
	[&#039;unbulleted&#039;] = true,&lt;br /&gt;
	[&#039;horizontal&#039;] = true,&lt;br /&gt;
	[&#039;ordered&#039;] = true,&lt;br /&gt;
	[&#039;horizontal_ordered&#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes and TemplateStyles&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	data.templatestyles = &#039;&#039;&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;hlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Hlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	elseif listType == &#039;unbulleted&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;plainlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Plainlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &#039;em&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&#039;list-style-type&#039;]&lt;br /&gt;
		data.type = args[&#039;type&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&#039;^%s*[1AaIi]%s*$&#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		data.listTag = &#039;ol&#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &#039;ul&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &#039;listitem &#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for _, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&#039;item&#039; .. tostring(num) .. &#039;_style&#039;]&lt;br /&gt;
			or args[&#039;item_style&#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&#039;item&#039; .. tostring(num) .. &#039;_value&#039;]&lt;br /&gt;
			or args[&#039;item_value&#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &#039;table&#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	for _, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&#039;margin-left&#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &#039;ul&#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&#039;counter-reset&#039;] = data.counterReset,&lt;br /&gt;
			[&#039;list-style-type&#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for _, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&#039;li&#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data.templatestyles .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &#039;makeList&#039; (&#039;%s&#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&#039;makeList&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	local list = p.renderList(data)&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame, {&lt;br /&gt;
			frameOnly = ((frame and frame.args and frame.args.frameonly or &#039;&#039;) ~= &#039;&#039;),&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
			if not value or not mw.ustring.find(value, &#039;%S&#039;) then return nil end&lt;br /&gt;
			if mw.ustring.find(value, &#039;^%s*[%*#;:]&#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return value:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		})&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:See_also&amp;diff=398</id>
		<title>Template:See also</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:See_also&amp;diff=398"/>
		<updated>2026-09-09T09:48:25Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Labelled list hatnote|labelledList|See also|ifexists={{{ifexists|true}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=File:Flag_of_Discord_logo.svg&amp;diff=396</id>
		<title>File:Flag of Discord logo.svg</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=File:Flag_of_Discord_logo.svg&amp;diff=396"/>
		<updated>2026-09-07T23:01:14Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Main_Page&amp;diff=395</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Main_Page&amp;diff=395"/>
		<updated>2026-09-07T23:00:56Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background-color:#f9f9f9; color:#000; margin:2em 0 6px 0; border:1px solid #ddd;clear:both;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;WELCOME TO WIKIPEDIA&amp;quot; AND ARTICLE COUNT        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:280px; margin: auto; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:280px; text-align:center; white-space:nowrap;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em;&amp;quot;&amp;gt;[[File:MicroIndex Wordmark.svg|200px|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em;&amp;quot;&amp;gt;Welcome to [[MicroIndex:About|MicroIndex]],&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;the free encyclopedia about micronationalism&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] articles&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--        PORTAL LIST ON RIGHT-HAND SIDE        --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{|style=&amp;quot;border-spacing:2px;margin:0px -2px;width:100%;&amp;quot;&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:50%;border:1.5px solid #cedff2;background-color:#F5FFFA;vertical-align:top; border-radius:10px&amp;quot;|&amp;lt;div style=&amp;quot;margin: 0px 0px 0px 0px; text-align: left;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#FFFAFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#FFF5EE; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #FAEBD7; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Featured article&lt;br /&gt;
|-&lt;br /&gt;
|id=&amp;quot;mp-tfa&amp;quot; style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | {{Featured article}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[HasanistanPedia:List of featured articles|More featured articles]]{{*}}[[HasanistanPedia:Nominate an article|Nominate an article]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FFFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#F0FFF0; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #D0F0C0; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Did you know...&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; |&amp;lt;div id=&amp;quot;mp-dyk&amp;quot;&amp;gt; {{MainPage Didyouknow}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[Template:MainPage Didyouknow|Add more facts]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FFFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#F0FFF0; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #D0F0C0; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Featured picture&lt;br /&gt;
|-&lt;br /&gt;
| id=&amp;quot;mf-tga&amp;quot; style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | {{Featured picture}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[HasanistanPedia:List of featured articles#Pictures|More featured pictures]]{{*}}[[HasanistanPedia:Nominate an article#Pictures|Nominate a picture]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:50%;border:1.5px solid #CEDFF2;background-color:#F5FAFF;vertical-align:top; border-radius:10px; border-radius:10px&amp;quot;|&amp;lt;div style=&amp;quot;margin: 0px 0px 0px 0px; text-align: left;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FAFF; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#CEDFF2; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #A3B0BF; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | News&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | &amp;lt;div id=&amp;quot;mp-itn&amp;quot;&amp;gt;{{MainPage News}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[Template:MainPage News|Add more news]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!----------------------------------------------------------&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align: top; background-color:#FFFFFF; border-radius:10px; border:1px solid #AAAAAA; margin-top:4px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#C8D8FF; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #AAAAAA; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | External links&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;div&amp;gt;&lt;br /&gt;
*{{flagicon image|Discord_logo|border=no|size=15px}} [https://discord.gg/6R5Xpcb2uf Official Discord]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__ __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=394</id>
		<title>Template:MainPage News</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=394"/>
		<updated>2026-08-09T14:58:39Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=393</id>
		<title>Template:MainPage News</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=393"/>
		<updated>2026-08-09T14:47:48Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Main_Page&amp;diff=392</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Main_Page&amp;diff=392"/>
		<updated>2026-08-07T00:21:14Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| id=&amp;quot;mp-topbanner&amp;quot; style=&amp;quot;width:100%; background-color:#f9f9f9; color:#000; margin:2em 0 6px 0; border:1px solid #ddd;clear:both;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:61%;&amp;quot; |&lt;br /&gt;
&amp;lt;!--        &amp;quot;WELCOME TO WIKIPEDIA&amp;quot; AND ARTICLE COUNT        --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:280px; margin: auto; border:none; background:none;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:280px; text-align:center; white-space:nowrap;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em;&amp;quot;&amp;gt;[[File:MicroIndex Wordmark.svg|200px|center]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:162%; border:none; margin:0; padding:.1em;&amp;quot;&amp;gt;Welcome to [[MicroIndex:About|MicroIndex]],&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;top:+0.2em; font-size:95%;&amp;quot;&amp;gt;the free encyclopedia about micronationalism&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;font-size:85%;&amp;quot;&amp;gt;[[Special:Statistics|{{NUMBEROFARTICLES}}]] articles&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!--        PORTAL LIST ON RIGHT-HAND SIDE        --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{|style=&amp;quot;border-spacing:2px;margin:0px -2px;width:100%;&amp;quot;&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:50%;border:1.5px solid #cedff2;background-color:#F5FFFA;vertical-align:top; border-radius:10px&amp;quot;|&amp;lt;div style=&amp;quot;margin: 0px 0px 0px 0px; text-align: left;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#FFFAFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#FFF5EE; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #FAEBD7; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Featured article&lt;br /&gt;
|-&lt;br /&gt;
|id=&amp;quot;mp-tfa&amp;quot; style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | {{Featured article}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[HasanistanPedia:List of featured articles|More featured articles]]{{*}}[[HasanistanPedia:Nominate an article|Nominate an article]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FFFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#F0FFF0; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #D0F0C0; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Did you know...&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; |&amp;lt;div id=&amp;quot;mp-dyk&amp;quot;&amp;gt; {{MainPage Didyouknow}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[Template:MainPage Didyouknow|Add more facts]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FFFA; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#F0FFF0; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #D0F0C0; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | Featured picture&lt;br /&gt;
|-&lt;br /&gt;
| id=&amp;quot;mf-tga&amp;quot; style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | {{Featured picture}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[HasanistanPedia:List of featured articles#Pictures|More featured pictures]]{{*}}[[HasanistanPedia:Nominate an article#Pictures|Nominate a picture]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:50%;border:1.5px solid #CEDFF2;background-color:#F5FAFF;vertical-align:top; border-radius:10px; border-radius:10px&amp;quot;|&amp;lt;div style=&amp;quot;margin: 0px 0px 0px 0px; text-align: left;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;5&amp;quot; style=&amp;quot;vertical-align:top; background-color:#F5FAFF; border-radius:10px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color:#CEDFF2; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #A3B0BF; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | News&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 90%; border-radius:10px&amp;quot; | &amp;lt;div id=&amp;quot;mp-itn&amp;quot;&amp;gt;{{MainPage News}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div align=&amp;quot;right&amp;quot; style=&amp;quot;font-size:xx-small;&amp;quot;&amp;gt;[[Template:MainPage News|Add more news]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!----------------------------------------------------------&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align: top; background-color:#FFFFFF; border-radius:10px; border:1px solid #AAAAAA; margin-top:4px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#C8D8FF; font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 100%; border: 1px solid #AAAAAA; text-align: left; padding-left: 7px; border-radius:10px&amp;quot; | External links&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;div&amp;gt;&lt;br /&gt;
*{{flagicon image|Applications-internet.svg|border=no|size=15px}} [http://hasanistan-gov.blogspot.com/ Official Website]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
__NOTOC__ __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=File:Flag_of_USA.svg&amp;diff=391</id>
		<title>File:Flag of USA.svg</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=File:Flag_of_USA.svg&amp;diff=391"/>
		<updated>2026-08-07T00:19:49Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=File:Featured_article_star.svg&amp;diff=390</id>
		<title>File:Featured article star.svg</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=File:Featured_article_star.svg&amp;diff=390"/>
		<updated>2026-08-07T00:19:01Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=389</id>
		<title>Template:MainPage News</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:MainPage_News&amp;diff=389"/>
		<updated>2026-08-07T00:12:37Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: Replaced content with &amp;quot;* {{flagicon|USA}} Test Tes : THis is a test }}&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* {{flagicon|USA}} Test Tes&lt;br /&gt;
: THis is a test&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:In_the_news/footer&amp;diff=388</id>
		<title>Template:In the news/footer</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:In_the_news/footer&amp;diff=388"/>
		<updated>2026-08-07T00:11:17Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: Oxitain moved page Template:In the news/footer to Template:MainPage News/footer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:MainPage News/footer]]&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
	<entry>
		<id>https://www.microindex.net/index.php?title=Template:MainPage_News/footer&amp;diff=387</id>
		<title>Template:MainPage News/footer</title>
		<link rel="alternate" type="text/html" href="https://www.microindex.net/index.php?title=Template:MainPage_News/footer&amp;diff=387"/>
		<updated>2026-08-07T00:11:17Z</updated>

		<summary type="html">&lt;p&gt;Oxitain: Oxitain moved page Template:In the news/footer to Template:MainPage News/footer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;itn-footer&amp;quot; style=&amp;quot;margin-top: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ongoing --&amp;gt;&amp;lt;div&amp;gt;{{#if:{{{currentevents|}}}&lt;br /&gt;
 |&#039;&#039;&#039;Ongoing&#039;&#039;&#039;: {{Flatlist|class=inline}}&lt;br /&gt;
{{{currentevents}}}{{endflatlist}}&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- recent deaths --&amp;gt;&amp;lt;div&amp;gt;{{#if:{{{recentdeaths|}}}&lt;br /&gt;
 |{{#ifexist:Deaths in {{CURRENTYEAR}}&lt;br /&gt;
  |&#039;&#039;&#039;[[Deaths in {{CURRENTYEAR}}|Recent deaths]]&#039;&#039;&#039;&lt;br /&gt;
  |&#039;&#039;&#039;[[Deaths in {{#time:Y|-1 years}}|Recent deaths]]&#039;&#039;&#039;&lt;br /&gt;
}}&amp;amp;#58; {{Flatlist|class=inline}}&lt;br /&gt;
{{{recentdeaths}}}{{endflatlist}}&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- rhs links --&amp;gt;{{Flatlist|class=itn-footer noprint|style=text-align:right;}}{{#if:{{{recentdeaths|}}}&lt;br /&gt;
 ||{{#ifexist:Deaths in {{CURRENTYEAR}}&lt;br /&gt;
   |*&#039;&#039;&#039;[[Deaths in {{CURRENTYEAR}}|Recent deaths]]&#039;&#039;&#039;&lt;br /&gt;
   |*&#039;&#039;&#039;[[Deaths in {{#time:Y|-1 years}}|Recent deaths]]&#039;&#039;&#039;&lt;br /&gt;
}}}}{{#if:{{{nocurrenteventslink|}}}||&lt;br /&gt;
*&#039;&#039;&#039;[[Portal:Current events|More current events]]&#039;&#039;&#039;}}&lt;br /&gt;
*&#039;&#039;&#039;[[Wikipedia:In the news/Candidates|Nominate an article]]&#039;&#039;&#039;&lt;br /&gt;
{{endflatlist}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxitain</name></author>
	</entry>
</feed>