<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.rexvalkering.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rex</id>
	<title>Complex Systems Simulation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rexvalkering.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rex"/>
	<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php/Special:Contributions/Rex"/>
	<updated>2026-04-09T19:11:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Indegree_resize.gif&amp;diff=77</id>
		<title>File:Indegree resize.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Indegree_resize.gif&amp;diff=77"/>
		<updated>2019-09-23T12:35:15Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=76</id>
		<title>Hacking the Wiki Game</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=76"/>
		<updated>2019-09-23T12:14:19Z</updated>

		<summary type="html">&lt;p&gt;Rex: /* Wikipedia as a scale-free network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;infobox&amp;quot;&amp;gt;{{Infobox&lt;br /&gt;
 | name = Simple English Wikipedia network&lt;br /&gt;
 | image = [[File:Gephitest.png|200px]]&lt;br /&gt;
 | title      = Simple English Wikipedia network&lt;br /&gt;
 | header1 = Database statistics&lt;br /&gt;
 | label2 = Total pagecount&lt;br /&gt;
 | data2 = 369,481&lt;br /&gt;
 | label3 = # of articles&lt;br /&gt;
 | data3 = 113,202&lt;br /&gt;
 | label4 = # of article redirects&lt;br /&gt;
 | data4 = 46,928&lt;br /&gt;
 | label5 = # number of pagelinks&lt;br /&gt;
 | data5 = 7,959,934&lt;br /&gt;
 | label6 = # of acticle pagelinks&lt;br /&gt;
 | data6 = 4,525,556&lt;br /&gt;
 | header7 = Network statistics&lt;br /&gt;
 | label8 = # of zero indegree articles&lt;br /&gt;
 | data8 = 12,492&lt;br /&gt;
 | label9 = Str. conn. component size&lt;br /&gt;
 | data9 = 86.2%&lt;br /&gt;
 | label10 = Full diameter&lt;br /&gt;
 | data10 = 18&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The [[wikipedia:Wiki_Game|Wiki Game]] is a hypertextual game designed to work specifically with [[wikipedia:Main_Page|Wikipedia]]. The Wiki Game (or Wikirace, Wikispeedia, WikiLadders) requires only a computer, access to Wikipedia and a web browser to play. The objective is to reach a given home article in the smallest number of clicks, starting from the [[Special:Random|Random page]] link of Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Its origin is unclear, but one of the first occurences on the web dates as far back as 2008.&amp;lt;ref name=&amp;quot;hitlergame&amp;quot;&amp;gt;http://www.nintendoworldreport.com/forums/index.php?topic=26255.0&amp;lt;/ref&amp;gt; Many variations exist, but arguably the most famous one is '''Six Degrees to Hitler''', where the objective is to reach the article of [[wikipedia:Adolf Hitler|Adolf Hitler]]. The name is a play on the [[wikipedia:Six Degrees of Separation|Six Degrees of Separation]] theory (stating that everyone on [[wikipedia:Earth|Earth]] is six or fewer steps away, by way of introduction, from any other person in the world).&lt;br /&gt;
&lt;br /&gt;
Our goal was to analyse this game by studying the network of Wikipedia pages and links between them, using tools such as [http://python.org Python], [http://gephi.org Gephi], [http://snap.stanford.edu SNAP]. As the English Wikipedia database contains 36,615,821 pages with 4,905,818 articles,&amp;lt;ref name=&amp;quot;wikistats&amp;quot;&amp;gt;https://en.wikipedia.org/wiki/Wikipedia:Statistics&amp;lt;/ref&amp;gt; analysis is very slow. We chose to study the [[wikipedia:simple:Main_Page|Simple English Wikipedia]] network instead.&amp;lt;ref name=&amp;quot;simplewikidump&amp;quot;&amp;gt;https://dumps.wikimedia.org/simplewiki/latest/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simple English Wiki network: birds-eye view ==&lt;br /&gt;
=== Wikipedia as a scale-free network ===&lt;br /&gt;
The Wikipedia network contains [[special:random|many]] [[wikipedia:Adolf_Hitler|special]] [[wikipedia:SixDegrees|pages]]. Therefore, pages are given a [[wikipedia:namespace|namespace]]; a namespace equal to 0 signifies an article. Links between pages exist in two forms: [[wikipedia:University_of_Amsterdam|regular links]] appear as blue, while a [[link to a nonexistent page]] appears as red. Often, a link redirects a [[wikipedia:uk|page]] to [[wikipedia:united_Kingdom|another page]]. Removing all redirects, and retaining only the articles and links between them significantly reduces the data size (see the [[#infobox|infobox]]). The resulting network of 113,202 nodes and 4,525,556 links was the starting point of our analyses.&lt;br /&gt;
&lt;br /&gt;
As [[wikipedia:Scale-free_network|scale-free networks]] are known to be prone to attacks,&amp;lt;ref name=&amp;quot;bb&amp;quot;&amp;gt;Barabási, Albert-László, ''Network Science'', 2015.&amp;lt;/ref&amp;gt; and our goal is to attack the network as to disrupt the Wiki Game, our first goal was to study the scale-free property. The indegree distribution of the Simple English wiki and a polynomial fit (found using [https://pypi.python.org/pypi/powerlaw powerlaw]) is shown on the left; the indegree distribution of the English wiki network of 2007 is shown on the right. The apparent outliers in the left graph can be explained by the existence of very poorly connected [[wikipedia:Clique|cliques]] of large degree (e.g. [[wikipedia:simple:Ablon|Ablon]] is part of a degree-704 clique).&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Simple_distr.png|thumb|none|500px|Indegree distribution of the pages in the Simple English wikipedia network, with a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:English_distr.png|thumb|none|500px|Indegree distribution of the pages in the English wikipedia network, with a powerlaw fit. Notice that this graph contains no outliers.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The right fit is very nice: it immediately shows the scale-free property in the Wikipedia network. The left fit is somewhat unsatisfactory; &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; is somewhat high and the fit is not very close. This urged us to look at the inner workings of this fitting procedure.&amp;lt;ref name=&amp;quot;bb&amp;quot; /&amp;gt; It works by considering all possible values for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;, computing the best powerlaw fit &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; for this specific value. It then chooses the value&lt;br /&gt;
:&amp;lt;math&amp;gt;k_{min} := \arg \min D_k, \quad D_k := \max_{k'\geq k} |S(k') - p_{k'}|.&amp;lt;/math&amp;gt;&lt;br /&gt;
This procedure is called the [[wikipedia:%E2%80%93Smirnov_test|Kolmogorov-Smirnov test]]. A visualisation of this procedure is given in the figure below. We see that while this value for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; yields a slightly unfortunate result, there is no &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; for which the goodness of fit is close. Of course, this fit can be made much better by excluding the outliers.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Fit.gif|thumb|left|900px|An animation visualizing the Kolmogorov-Smirnov test to determine the optimal &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;-value of a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We conclude that both the English and the Simple English Wikipedia network are scale-free. Both exponents are smaller than 2, which is impossible for &amp;lt;math&amp;gt;|V| \to \infty&amp;lt;/math&amp;gt;, because the average degree diverges with system size. Apparently our networks aren't large enough to exhibit this: the largest indegree is [[wikipedia:simple:United_States|17222]] and 101110,&amp;lt;ref&amp;gt;We were unable to determine with 100% accuracy which page this is as the network data was anonymized; we suspect however that it is [[wikipedia:United_States|United States]]&amp;lt;/ref&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
=== Wikipedia diameter ===&lt;br /&gt;
[[File:diameter_wiki.png|300px|right|thumb|Histogram of the geodesic lengths to each node in the simple English wikipeida]]&lt;br /&gt;
As we can fairly quickly determine the path length distribution for any node in the network, we can also look at the distribution of the longest shortest path to any target node. The figure on the right shows the longest shortest path distribution. We can see two clear spikes, one centered around zero, and one centered around 8. Pages belonging to the mass centered around zero are pages that are very poorly connected, so while the longest path to get to such a page is very low, the number of pages that can reach such a page is also very low.&lt;br /&gt;
&lt;br /&gt;
The Simple English Wikipedia shows a diameter of 18; the English Wikipedia has at least 77; this is due to [[wikipedia:List_of_minor_planets/145701–145800|long chains of articles]].&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;http://mu.netsoc.ie/wiki/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disrupting the wiki game ==&lt;br /&gt;
As a mathematical problem, we can restate the Wiki Game as follows. Given a [[wikipedia:Graph_(mathematics)|network]] &amp;lt;math&amp;gt;G = (V,E)&amp;lt;/math&amp;gt;, a target &amp;lt;math&amp;gt; t \in V&amp;lt;/math&amp;gt; and a source &amp;lt;math&amp;gt; s \in V&amp;lt;/math&amp;gt;, we opt to find a shortest path &amp;lt;math&amp;gt;P(s,t) = (s, v_1, \ldots, v_n, t)&amp;lt;/math&amp;gt; of length &amp;lt;math&amp;gt;|P(s,t)| := n+1&amp;lt;/math&amp;gt; from &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. As the source is a random element from &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, one interesting measure is the shortest path length distribution&lt;br /&gt;
[[File:Indegree_resize.gif|400px|right|link=http://rexvalkering.nl/wiki/index.php/File:Indegree.gif|thumb|Path length distribution of the Simple English wikipedia network with Adolf Hitler as target page after sustained removal of nodes based on indegree.]]&lt;br /&gt;
:&amp;lt;math&amp;gt;N(t, p) := \#\{s \in V |~|P(s,t)| = p\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
With this, we can look at average shortest path length&lt;br /&gt;
:&amp;lt;math&amp;gt;\overline N(t) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)&amp;lt;/math&amp;gt;&lt;br /&gt;
and the variance&lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{Var}(N(t)) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)[p - \overline N(t)]^2.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, our goal is to disrupt the Wiki Game as efficiently as possible. The probability of starting the game from a page &amp;lt;math&amp;gt;s \in V&amp;lt;/math&amp;gt; must equal &amp;lt;math&amp;gt;1/|V|&amp;lt;/math&amp;gt;; this means that we want to find pages or pagelinks which, if deleted, increase the average path length the most. The size of our network forces us to find a smart attack strategy rather than simply trying each page or link. Effectivity of an attack algorithm on a page is measured by the number of pages/links that it removes before increasing &amp;lt;math&amp;gt;\overline N(t)&amp;lt;/math&amp;gt; by 0.5. We define this as the '''page robustness''' with respect to this attack.&lt;br /&gt;
&lt;br /&gt;
Taking a highest indegree attack strategy as an example, we can calculate &amp;lt;math&amp;gt;N(t,p), \overline N(t), \operatorname{Var}(N(t))&amp;lt;/math&amp;gt; with target node Hitler as it is being attacked. This yields the figure to the right. We see that this distribution is more or less [[wikipedia:Binomial_distribution|binomial]].&lt;br /&gt;
&lt;br /&gt;
=== Relative betweenness ===&lt;br /&gt;
[[File:Examplegraph1.png|300px|right|thumb|An unweighted, directed graph with a target node.]]&lt;br /&gt;
[[File:Examplegraph2.png|300px|right|thumb|Same graph, but reconstructed using breadth-first search to get all geodesic paths.]]&lt;br /&gt;
[[File:Examplegraph3.png|300px|right|thumb|Same graph, with the relative betweenness for all nodes and edges.]]&lt;br /&gt;
We define the '''relative betweenness''' of a node or edge as the number of shortest paths to target node &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; that pass through the node or edge&amp;lt;ref name=&amp;quot;brandes2001&amp;quot;&amp;gt;http://www.sciencedirect.com/science/article/pii/S0378873307000731#&amp;lt;/ref&amp;gt;. In order to find the relative betweenness of a node or edge, we define the following variables and sets:&lt;br /&gt;
&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{P}(v)&amp;lt;/math&amp;gt; as the set of predecessors of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{S}(w)&amp;lt;/math&amp;gt; as the set of successors of &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The geodesic weight &amp;lt;math&amp;gt;z(w) = \sum_{v \in \mathcal{S}(w)} z(v)&amp;lt;/math&amp;gt; (with &amp;lt;math&amp;gt;z(t) = 1&amp;lt;/math&amp;gt;);&lt;br /&gt;
:The relative betweenness of an edge: &amp;lt;math&amp;gt;C_B(w,v) = \begin{cases}\frac{z(v)}{z(w)} \cdot (1 + C_B(w)) \text{ if } v \in \mathcal{S}(w)\\ 0 \text{ otherwise } \end{cases}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The relative betweenness of a node: &amp;lt;math&amp;gt;C_B(v) = \sum_{w \in \mathcal{P}(v)} C_B(w,v)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Relative betweenness attack strategy ====&lt;br /&gt;
&lt;br /&gt;
# Do a breadth-first search to get geodesic lengths for every node.&lt;br /&gt;
# Calculate the weight &amp;lt;math&amp;gt;z(w)&amp;lt;/math&amp;gt; for every node &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;&lt;br /&gt;
# Calculate the average geodesic length&lt;br /&gt;
# While average geodesic length has not increased with at least 0.5:&lt;br /&gt;
## For all nodes &amp;lt;math&amp;gt;v \in V&amp;lt;/math&amp;gt; in reverse order of geodesic length:&lt;br /&gt;
### Calculate relative edge betweenness of all edges &amp;lt;math&amp;gt;(v,w)&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;w \in \mathcal{S}(v)&amp;lt;/math&amp;gt;&lt;br /&gt;
### Calculate relative node betweenness of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
## Remove node or edge with highest betweenness&lt;br /&gt;
## Update geodesic lengths and node weights for affected nodes&lt;br /&gt;
&lt;br /&gt;
=== Attacking nodes ===&lt;br /&gt;
Node attacks were done using the following strategies:&lt;br /&gt;
; Highest indegree : &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree; executing one attack takes milliseconds, as we only have to loop over the predecessors of &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative betweenness : &amp;lt;math&amp;gt;w \in V&amp;lt;/math&amp;gt; with highest &amp;lt;math&amp;gt;C_B(w)&amp;lt;/math&amp;gt;; takes a few seconds, as we have to traverse all nodes that can reach &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We quickly realized that while of theoretical relevance, attacking nodes would never work in practice as it requires removing entire Wikipedia pages. Therefore we moved on to the more realistic edge attack strategies.&lt;br /&gt;
&lt;br /&gt;
=== Attacking edges ===&lt;br /&gt;
We execute attacks on edges using the following metrics:&lt;br /&gt;
; Highest indegree : Choose the &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree and remove &amp;lt;math&amp;gt;(w,t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative node betweenness :  Edge on shortest path coming from node with highest relative node betweenness; we select the node &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with highest relative betweenness, and pick &amp;lt;math&amp;gt;w \in \mathcal S(v)&amp;lt;/math&amp;gt; with highest node betweenness.&lt;br /&gt;
; Highest relative edge betweenness : This is self-explanatory.&lt;br /&gt;
; Greedy : loops over all nodes &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; and chooses the edge which removal increases the average path length the most.&lt;br /&gt;
&lt;br /&gt;
The definition of relative betweenness implies that for &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; it holds that &amp;lt;math&amp;gt; C_B(w, t) = z(w)(1 + C_B(w)) = 1 + C_B(w)&amp;lt;/math&amp;gt;, so that the second and third algorithm attack the same edge in all cases.&lt;br /&gt;
&lt;br /&gt;
=== Numerical results ===&lt;br /&gt;
The size of the network made it impossible to test our attack strategies on all pages. Moreover, the majority of pages is hardly robust at all. We ultimately chose the 48 [[wikipedia:simple:Time_Person_of_the_Year|Time People of the Year]] as test subjects; this list includes [[wikipedia:simple:Mahatma Gandhi|Mahatma Gandhi]], our beloved [[wikipedia:simple:Adolf Hitler|Adolf]], [[wikipedia:simple:Elizabeth II|Queen Elizabeth II]], and [[wikipedia:simple:Mark Zuckerberg|Mark Zuckerberg]]. These 48 pages are all relatively well-connected with indegrees ranging from 14 to 649, and average geodesic lengths ranging from 2.83 to 3.65.&lt;br /&gt;
&lt;br /&gt;
Looking at the first figure below, we see that (relative) betweenness is the attack strategy producing the lowest average robustness. Moreover, attacks based on indegree perform badly.&lt;br /&gt;
&lt;br /&gt;
Before simulating, we conjectured that the greedy algorithm would find optimal results, seeing it attacks the locally optimal edge. Looking at the middle figure, this conjecture is approximately correct. In the right figure however, we see that the greedy and betweenness strategy (blue resp. green line in the graph) attack the same edge in iterations 1 to 4. We also see that the green line stalls at iteration 4 to surge again from iteration 5 onward. Apparently, choosing the local optimum in iteration 4 does not imply a global optimum.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Avgs.png|thumb|none|350px|Average page robustness with respect to our five attack strategies. The pages considered are the 48 Time People of the Year.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Hitler_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Adolf Hitler.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Charles_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Charles de Gaulle.]]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Wiki Game in practice ==&lt;br /&gt;
[[File:Angela.png|300px|left|thumb|A failed first try in attacking the page of [[wikipedia:Germany|German]] politician [[wikipedia:simple:Angela_Merkel|Angela Merkel]].&amp;lt;ref&amp;gt;https://simple.wikipedia.org/w/index.php?title=Angela_Merkel&amp;amp;type=revision&amp;amp;diff=5163294&amp;amp;oldid=5163092&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
After working with all this data, we decided it would be fun to test out how feasible an actual Wiki attack was. Of course, node attacks imply removing a Wikipedia page which is completely undoable. Removing edges however is easily done.&lt;br /&gt;
&lt;br /&gt;
Removing links from articles was spotted and reverted quickly (see Figure to the left) so we decided to rewrite the sentences containing the links instead. &lt;br /&gt;
&lt;br /&gt;
=== Attacking Justin Bieber ===&lt;br /&gt;
Nobody actually likes Justin Bieber&amp;lt;sup&amp;gt;[[https://en.wikipedia.org/wiki/Citation_needed ''citation needed'']]&amp;lt;/sup&amp;gt; and as such he was an obvious target. Fortunately his page is somewhat poorly connected, with only [https://simple.wikipedia.org/w/index.php?title=Special%3AWhatLinksHere&amp;amp;target=Justin+Bieber&amp;amp;namespace=0| 14 links] pointing to his article. His relative betweenness robustness was found to be just two by removing &lt;br /&gt;
[[File:justin_edit.png|300px|right|thumb|Stealthy removal of Justin Bieber from Wikipedia English.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1994&amp;amp;type=revision&amp;amp;diff=5166171&amp;amp;oldid=5014657| (1994, Justin Bieber)] and &lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=March_1&amp;amp;type=revision&amp;amp;diff=5166189&amp;amp;oldid=5128111| (March 1, Justin Bieber)].&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
! &amp;lt;math&amp;gt;\overline N(\text{Justin Bieber})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0  || 3.8563&lt;br /&gt;
|-&lt;br /&gt;
|1 || 4.0103&lt;br /&gt;
|-&lt;br /&gt;
|2|| 4.5282&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As was to be expected, Justin Bieber is a very easy target; we needed just 2 links to increase his average path length with a half.&lt;br /&gt;
&lt;br /&gt;
=== Eurozone? όχι! ===&lt;br /&gt;
While everybody is voting for or against #GREXIT, we decided to take a stand on this issue by removing not Greece from the Eurozone but the Eurozone from Wikipedia. Our relative betweenness attack strategy yielded a robustness of 7, with&lt;br /&gt;
[[File:Montenegro.png|300px|right|thumb|Successful removal of a link to Eurozone.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=European_Union&amp;amp;type=revision&amp;amp;diff=5166234&amp;amp;oldid=5140218| (European Union, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=ISO_4217&amp;amp;type=revision&amp;amp;diff=5166222&amp;amp;oldid=4407302| (ISO 4217, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Bulgaria&amp;amp;type=revision&amp;amp;diff=5166208&amp;amp;oldid=5166207| (Bulgaria, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Montenegro&amp;amp;type=revision&amp;amp;diff=5166225&amp;amp;oldid=4978173| (Montenegro, Eurozone)]&lt;br /&gt;
* (Euro, Eurozone)&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1999&amp;amp;type=revision&amp;amp;diff=5166232&amp;amp;oldid=5150104| (1999, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=2010&amp;amp;type=revision&amp;amp;diff=5166231&amp;amp;oldid=5166229| (2010, Eurozone)]&lt;br /&gt;
The [[wikipedia:simple:Euro|Euro]] page has 6 explicit mentions of Eurozone, so we opted to remove [https://simple.wikipedia.org/w/index.php?title=2015&amp;amp;type=revision&amp;amp;diff=5166241&amp;amp;oldid=5158867| (2015, Eurozone)] instead.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack Results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Eurozone})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0 || 3.2545&lt;br /&gt;
|-&lt;br /&gt;
|1|| 3.2848&lt;br /&gt;
|-&lt;br /&gt;
|2 || 3.3751&lt;br /&gt;
|-&lt;br /&gt;
|3||3.4691&lt;br /&gt;
|-&lt;br /&gt;
|4||3.5611&lt;br /&gt;
|-&lt;br /&gt;
|5||3.6191&lt;br /&gt;
|-&lt;br /&gt;
|6||3.6670&lt;br /&gt;
|-&lt;br /&gt;
|7||3.7359&lt;br /&gt;
|-&lt;br /&gt;
|8&amp;lt;ref&amp;gt;Not actually performed.&amp;lt;/ref&amp;gt;||3.9015&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We see that as The Eurozone article is reasonably well connected, we have to remove 7 links to increase its average path length by a half.&lt;br /&gt;
&lt;br /&gt;
===Mending the Wiki Game: putting Britney back in the spotlight===&lt;br /&gt;
[[File:Britney.png|300px|right|thumb|Successful addition of a link to Britney Spears from the United States page.]]&lt;br /&gt;
Rather than removing links to make a page less visible, we can also add links to improve the visibility of a page. This is a  very different problem, as edge not yet existing in the network could be added. So the goal was to both find links that would be reasonable to add, and find a fast heuristic to find links the would provide a good improvement on the average geodesic length.&lt;br /&gt;
&lt;br /&gt;
We decided to see if we could improve the average geodesic length of famous singer [[wikipedia:Britney_Spears|Britney Spears]]. To this end we selected various nodes which themselves have a very low average geodesic length, and where a link to Britney could be added. [https://simple.wikipedia.org/w/index.php?title=United_States&amp;amp;type=revision&amp;amp;diff=5165763&amp;amp;oldid=5163040| United States] and [https://simple.wikipedia.org/w/index.php?title=Americans&amp;amp;type=revision&amp;amp;diff=5165767&amp;amp;oldid=5078214| Americans] seemed the best candidates.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Mending Results&lt;br /&gt;
|-&lt;br /&gt;
!Links added from&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Britney Spears})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||| 3.4018&lt;br /&gt;
|-&lt;br /&gt;
| United States|| 2.9342&lt;br /&gt;
|-&lt;br /&gt;
|United States, Americans || 2.8943&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Adding links to Britney Spears to these pages reduced the average geodesic length by more than 0.5. An important advantage of adding links, rather than removing them, is that it is not considered vandalism if the information is correct. This last note makes algorithmic selection of pages more challenging, as most pairs of pages are not directly related, making it hard to add relevant information about that page. For example, it would be harder to add content that would link Britney Spears to Germany.&lt;br /&gt;
&lt;br /&gt;
==Attacking the wiki network with ulterior motives==&lt;br /&gt;
We have seen that editing a Wikipedia page is possible, and will have a real effect on the average geodesic length of the page. While these examples are purely for academic purposes, it is very possible an editor can have an ulterior motive behind making an edit. A good example of such an edit would be for a person to add links in Wikipedia to their own page as a form of [[wikipedia:Public Relations|PR]].&lt;br /&gt;
&lt;br /&gt;
As it turns out, [[wikipedia:Conflict-of-interest_editing_on_Wikipedia|Conflict of interest editing]] happens a lot on Wikipedia. There are many known cases&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Conflict-of-interest_editing_on_Wikipedia#Incidents&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.bbc.com/news/technology-28481876&amp;lt;/ref&amp;gt; where large companies and political parties have made edits to Wikipedia pages to either improve their own brand or to try to deface the pages of their competitors.&lt;br /&gt;
&lt;br /&gt;
A big difference between the edits made by these parties and our strategy is that they are often aimed at modifying the content of a page, while we modifying the link connectivity of a page. Often these edits are very childish and are quickly reverted; see figure. [[File:Rick_Santorum.png|300px|right|thumb|A very professional edit made to the page of US Politician Rick Santorum.]]&lt;br /&gt;
&lt;br /&gt;
== Final thoughts ==&lt;br /&gt;
&lt;br /&gt;
Even though our research mentions Wikipedia, we did most of the analysis on the Simple English Wiki. We did not have the hardware available to import and process recent data of Wikipedia and run our algorithms. With a computationally stronger system and optimized algorithms, this would be more feasible.&lt;br /&gt;
&lt;br /&gt;
The focus of this research was mainly on disrupting the Wiki Game by edge removal. Investigating algorithms for edge addition was not inside the scope of this research, as removing links from Wikipedia pages is easier to achieve than strategically adding links to pages (as this would require that the links are relevant). With more information, however, it would be possible to develop an algorithm that suggests pages of the same category, or that suggests to link to pages that already link to the target page.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=75</id>
		<title>Hacking the Wiki Game</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=75"/>
		<updated>2019-09-23T12:12:54Z</updated>

		<summary type="html">&lt;p&gt;Rex: /* Attacking Justin Bieber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;infobox&amp;quot;&amp;gt;{{Infobox&lt;br /&gt;
 | name = Simple English Wikipedia network&lt;br /&gt;
 | image = [[File:Gephitest.png|200px]]&lt;br /&gt;
 | title      = Simple English Wikipedia network&lt;br /&gt;
 | header1 = Database statistics&lt;br /&gt;
 | label2 = Total pagecount&lt;br /&gt;
 | data2 = 369,481&lt;br /&gt;
 | label3 = # of articles&lt;br /&gt;
 | data3 = 113,202&lt;br /&gt;
 | label4 = # of article redirects&lt;br /&gt;
 | data4 = 46,928&lt;br /&gt;
 | label5 = # number of pagelinks&lt;br /&gt;
 | data5 = 7,959,934&lt;br /&gt;
 | label6 = # of acticle pagelinks&lt;br /&gt;
 | data6 = 4,525,556&lt;br /&gt;
 | header7 = Network statistics&lt;br /&gt;
 | label8 = # of zero indegree articles&lt;br /&gt;
 | data8 = 12,492&lt;br /&gt;
 | label9 = Str. conn. component size&lt;br /&gt;
 | data9 = 86.2%&lt;br /&gt;
 | label10 = Full diameter&lt;br /&gt;
 | data10 = 18&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The [[wikipedia:Wiki_Game|Wiki Game]] is a hypertextual game designed to work specifically with [[wikipedia:Main_Page|Wikipedia]]. The Wiki Game (or Wikirace, Wikispeedia, WikiLadders) requires only a computer, access to Wikipedia and a web browser to play. The objective is to reach a given home article in the smallest number of clicks, starting from the [[Special:Random|Random page]] link of Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Its origin is unclear, but one of the first occurences on the web dates as far back as 2008.&amp;lt;ref name=&amp;quot;hitlergame&amp;quot;&amp;gt;http://www.nintendoworldreport.com/forums/index.php?topic=26255.0&amp;lt;/ref&amp;gt; Many variations exist, but arguably the most famous one is '''Six Degrees to Hitler''', where the objective is to reach the article of [[wikipedia:Adolf Hitler|Adolf Hitler]]. The name is a play on the [[wikipedia:Six Degrees of Separation|Six Degrees of Separation]] theory (stating that everyone on [[wikipedia:Earth|Earth]] is six or fewer steps away, by way of introduction, from any other person in the world).&lt;br /&gt;
&lt;br /&gt;
Our goal was to analyse this game by studying the network of Wikipedia pages and links between them, using tools such as [http://python.org Python], [http://gephi.org Gephi], [http://snap.stanford.edu SNAP]. As the English Wikipedia database contains 36,615,821 pages with 4,905,818 articles,&amp;lt;ref name=&amp;quot;wikistats&amp;quot;&amp;gt;https://en.wikipedia.org/wiki/Wikipedia:Statistics&amp;lt;/ref&amp;gt; analysis is very slow. We chose to study the [[wikipedia:simple:Main_Page|Simple English Wikipedia]] network instead.&amp;lt;ref name=&amp;quot;simplewikidump&amp;quot;&amp;gt;https://dumps.wikimedia.org/simplewiki/latest/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simple English Wiki network: birds-eye view ==&lt;br /&gt;
=== Wikipedia as a scale-free network ===&lt;br /&gt;
The Wikipedia network contains [[special:random|many]] [[Adolf_Hitler|special]] [[wikipedia:SixDegrees|pages]]. Therefore, pages are given a [[wikipedia:namespace|namespace]]; a namespace equal to 0 signifies an article. Links between pages exist in two forms: [[wikipedia:University_of_Amsterdam|regular links]] appear as blue, while a [[link to a nonexistent page]] appears as red. Often, a link redirects a [[wikipedia:uk|page]] to [[wikipedia:united_Kingdom|another page]]. Removing all redirects, and retaining only the articles and links between them significantly reduces the data size (see the [[#infobox|infobox]]). The resulting network of 113,202 nodes and 4,525,556 links was the starting point of our analyses.&lt;br /&gt;
&lt;br /&gt;
As [[wikipedia:Scale-free_network|scale-free networks]] are known to be prone to attacks,&amp;lt;ref name=&amp;quot;bb&amp;quot;&amp;gt;Barabási, Albert-László, ''Network Science'', 2015.&amp;lt;/ref&amp;gt; and our goal is to attack the network as to disrupt the Wiki Game, our first goal was to study the scale-free property. The indegree distribution of the Simple English wiki and a polynomial fit (found using [https://pypi.python.org/pypi/powerlaw powerlaw]) is shown on the left; the indegree distribution of the English wiki network of 2007 is shown on the right. The apparent outliers in the left graph can be explained by the existence of very poorly connected [[wikipedia:Clique|cliques]] of large degree (e.g. [[wikipedia:simple:Ablon|Ablon]] is part of a degree-704 clique).&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Simple_distr.png|thumb|none|500px|Indegree distribution of the pages in the Simple English wikipedia network, with a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:English_distr.png|thumb|none|500px|Indegree distribution of the pages in the English wikipedia network, with a powerlaw fit. Notice that this graph contains no outliers.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The right fit is very nice: it immediately shows the scale-free property in the Wikipedia network. The left fit is somewhat unsatisfactory; &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; is somewhat high and the fit is not very close. This urged us to look at the inner workings of this fitting procedure.&amp;lt;ref name=&amp;quot;bb&amp;quot; /&amp;gt; It works by considering all possible values for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;, computing the best powerlaw fit &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; for this specific value. It then chooses the value&lt;br /&gt;
:&amp;lt;math&amp;gt;k_{min} := \arg \min D_k, \quad D_k := \max_{k'\geq k} |S(k') - p_{k'}|.&amp;lt;/math&amp;gt;&lt;br /&gt;
This procedure is called the [[wikipedia:%E2%80%93Smirnov_test|Kolmogorov-Smirnov test]]. A visualisation of this procedure is given in the figure below. We see that while this value for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; yields a slightly unfortunate result, there is no &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; for which the goodness of fit is close. Of course, this fit can be made much better by excluding the outliers.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Fit.gif|thumb|left|900px|An animation visualizing the Kolmogorov-Smirnov test to determine the optimal &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;-value of a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We conclude that both the English and the Simple English Wikipedia network are scale-free. Both exponents are smaller than 2, which is impossible for &amp;lt;math&amp;gt;|V| \to \infty&amp;lt;/math&amp;gt;, because the average degree diverges with system size. Apparently our networks aren't large enough to exhibit this: the largest indegree is [[wikipedia:simple:United_States|17222]] and 101110,&amp;lt;ref&amp;gt;We were unable to determine with 100% accuracy which page this is as the network data was anonymized; we suspect however that it is [[wikipedia:United_States|United States]]&amp;lt;/ref&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
=== Wikipedia diameter ===&lt;br /&gt;
[[File:diameter_wiki.png|300px|right|thumb|Histogram of the geodesic lengths to each node in the simple English wikipeida]]&lt;br /&gt;
As we can fairly quickly determine the path length distribution for any node in the network, we can also look at the distribution of the longest shortest path to any target node. The figure on the right shows the longest shortest path distribution. We can see two clear spikes, one centered around zero, and one centered around 8. Pages belonging to the mass centered around zero are pages that are very poorly connected, so while the longest path to get to such a page is very low, the number of pages that can reach such a page is also very low.&lt;br /&gt;
&lt;br /&gt;
The Simple English Wikipedia shows a diameter of 18; the English Wikipedia has at least 77; this is due to [[wikipedia:List_of_minor_planets/145701–145800|long chains of articles]].&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;http://mu.netsoc.ie/wiki/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disrupting the wiki game ==&lt;br /&gt;
As a mathematical problem, we can restate the Wiki Game as follows. Given a [[wikipedia:Graph_(mathematics)|network]] &amp;lt;math&amp;gt;G = (V,E)&amp;lt;/math&amp;gt;, a target &amp;lt;math&amp;gt; t \in V&amp;lt;/math&amp;gt; and a source &amp;lt;math&amp;gt; s \in V&amp;lt;/math&amp;gt;, we opt to find a shortest path &amp;lt;math&amp;gt;P(s,t) = (s, v_1, \ldots, v_n, t)&amp;lt;/math&amp;gt; of length &amp;lt;math&amp;gt;|P(s,t)| := n+1&amp;lt;/math&amp;gt; from &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. As the source is a random element from &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, one interesting measure is the shortest path length distribution&lt;br /&gt;
[[File:Indegree_resize.gif|400px|right|link=http://rexvalkering.nl/wiki/index.php/File:Indegree.gif|thumb|Path length distribution of the Simple English wikipedia network with Adolf Hitler as target page after sustained removal of nodes based on indegree.]]&lt;br /&gt;
:&amp;lt;math&amp;gt;N(t, p) := \#\{s \in V |~|P(s,t)| = p\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
With this, we can look at average shortest path length&lt;br /&gt;
:&amp;lt;math&amp;gt;\overline N(t) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)&amp;lt;/math&amp;gt;&lt;br /&gt;
and the variance&lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{Var}(N(t)) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)[p - \overline N(t)]^2.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, our goal is to disrupt the Wiki Game as efficiently as possible. The probability of starting the game from a page &amp;lt;math&amp;gt;s \in V&amp;lt;/math&amp;gt; must equal &amp;lt;math&amp;gt;1/|V|&amp;lt;/math&amp;gt;; this means that we want to find pages or pagelinks which, if deleted, increase the average path length the most. The size of our network forces us to find a smart attack strategy rather than simply trying each page or link. Effectivity of an attack algorithm on a page is measured by the number of pages/links that it removes before increasing &amp;lt;math&amp;gt;\overline N(t)&amp;lt;/math&amp;gt; by 0.5. We define this as the '''page robustness''' with respect to this attack.&lt;br /&gt;
&lt;br /&gt;
Taking a highest indegree attack strategy as an example, we can calculate &amp;lt;math&amp;gt;N(t,p), \overline N(t), \operatorname{Var}(N(t))&amp;lt;/math&amp;gt; with target node Hitler as it is being attacked. This yields the figure to the right. We see that this distribution is more or less [[wikipedia:Binomial_distribution|binomial]].&lt;br /&gt;
&lt;br /&gt;
=== Relative betweenness ===&lt;br /&gt;
[[File:Examplegraph1.png|300px|right|thumb|An unweighted, directed graph with a target node.]]&lt;br /&gt;
[[File:Examplegraph2.png|300px|right|thumb|Same graph, but reconstructed using breadth-first search to get all geodesic paths.]]&lt;br /&gt;
[[File:Examplegraph3.png|300px|right|thumb|Same graph, with the relative betweenness for all nodes and edges.]]&lt;br /&gt;
We define the '''relative betweenness''' of a node or edge as the number of shortest paths to target node &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; that pass through the node or edge&amp;lt;ref name=&amp;quot;brandes2001&amp;quot;&amp;gt;http://www.sciencedirect.com/science/article/pii/S0378873307000731#&amp;lt;/ref&amp;gt;. In order to find the relative betweenness of a node or edge, we define the following variables and sets:&lt;br /&gt;
&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{P}(v)&amp;lt;/math&amp;gt; as the set of predecessors of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{S}(w)&amp;lt;/math&amp;gt; as the set of successors of &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The geodesic weight &amp;lt;math&amp;gt;z(w) = \sum_{v \in \mathcal{S}(w)} z(v)&amp;lt;/math&amp;gt; (with &amp;lt;math&amp;gt;z(t) = 1&amp;lt;/math&amp;gt;);&lt;br /&gt;
:The relative betweenness of an edge: &amp;lt;math&amp;gt;C_B(w,v) = \begin{cases}\frac{z(v)}{z(w)} \cdot (1 + C_B(w)) \text{ if } v \in \mathcal{S}(w)\\ 0 \text{ otherwise } \end{cases}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The relative betweenness of a node: &amp;lt;math&amp;gt;C_B(v) = \sum_{w \in \mathcal{P}(v)} C_B(w,v)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Relative betweenness attack strategy ====&lt;br /&gt;
&lt;br /&gt;
# Do a breadth-first search to get geodesic lengths for every node.&lt;br /&gt;
# Calculate the weight &amp;lt;math&amp;gt;z(w)&amp;lt;/math&amp;gt; for every node &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;&lt;br /&gt;
# Calculate the average geodesic length&lt;br /&gt;
# While average geodesic length has not increased with at least 0.5:&lt;br /&gt;
## For all nodes &amp;lt;math&amp;gt;v \in V&amp;lt;/math&amp;gt; in reverse order of geodesic length:&lt;br /&gt;
### Calculate relative edge betweenness of all edges &amp;lt;math&amp;gt;(v,w)&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;w \in \mathcal{S}(v)&amp;lt;/math&amp;gt;&lt;br /&gt;
### Calculate relative node betweenness of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
## Remove node or edge with highest betweenness&lt;br /&gt;
## Update geodesic lengths and node weights for affected nodes&lt;br /&gt;
&lt;br /&gt;
=== Attacking nodes ===&lt;br /&gt;
Node attacks were done using the following strategies:&lt;br /&gt;
; Highest indegree : &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree; executing one attack takes milliseconds, as we only have to loop over the predecessors of &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative betweenness : &amp;lt;math&amp;gt;w \in V&amp;lt;/math&amp;gt; with highest &amp;lt;math&amp;gt;C_B(w)&amp;lt;/math&amp;gt;; takes a few seconds, as we have to traverse all nodes that can reach &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We quickly realized that while of theoretical relevance, attacking nodes would never work in practice as it requires removing entire Wikipedia pages. Therefore we moved on to the more realistic edge attack strategies.&lt;br /&gt;
&lt;br /&gt;
=== Attacking edges ===&lt;br /&gt;
We execute attacks on edges using the following metrics:&lt;br /&gt;
; Highest indegree : Choose the &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree and remove &amp;lt;math&amp;gt;(w,t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative node betweenness :  Edge on shortest path coming from node with highest relative node betweenness; we select the node &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with highest relative betweenness, and pick &amp;lt;math&amp;gt;w \in \mathcal S(v)&amp;lt;/math&amp;gt; with highest node betweenness.&lt;br /&gt;
; Highest relative edge betweenness : This is self-explanatory.&lt;br /&gt;
; Greedy : loops over all nodes &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; and chooses the edge which removal increases the average path length the most.&lt;br /&gt;
&lt;br /&gt;
The definition of relative betweenness implies that for &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; it holds that &amp;lt;math&amp;gt; C_B(w, t) = z(w)(1 + C_B(w)) = 1 + C_B(w)&amp;lt;/math&amp;gt;, so that the second and third algorithm attack the same edge in all cases.&lt;br /&gt;
&lt;br /&gt;
=== Numerical results ===&lt;br /&gt;
The size of the network made it impossible to test our attack strategies on all pages. Moreover, the majority of pages is hardly robust at all. We ultimately chose the 48 [[wikipedia:simple:Time_Person_of_the_Year|Time People of the Year]] as test subjects; this list includes [[wikipedia:simple:Mahatma Gandhi|Mahatma Gandhi]], our beloved [[wikipedia:simple:Adolf Hitler|Adolf]], [[wikipedia:simple:Elizabeth II|Queen Elizabeth II]], and [[wikipedia:simple:Mark Zuckerberg|Mark Zuckerberg]]. These 48 pages are all relatively well-connected with indegrees ranging from 14 to 649, and average geodesic lengths ranging from 2.83 to 3.65.&lt;br /&gt;
&lt;br /&gt;
Looking at the first figure below, we see that (relative) betweenness is the attack strategy producing the lowest average robustness. Moreover, attacks based on indegree perform badly.&lt;br /&gt;
&lt;br /&gt;
Before simulating, we conjectured that the greedy algorithm would find optimal results, seeing it attacks the locally optimal edge. Looking at the middle figure, this conjecture is approximately correct. In the right figure however, we see that the greedy and betweenness strategy (blue resp. green line in the graph) attack the same edge in iterations 1 to 4. We also see that the green line stalls at iteration 4 to surge again from iteration 5 onward. Apparently, choosing the local optimum in iteration 4 does not imply a global optimum.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Avgs.png|thumb|none|350px|Average page robustness with respect to our five attack strategies. The pages considered are the 48 Time People of the Year.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Hitler_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Adolf Hitler.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Charles_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Charles de Gaulle.]]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Wiki Game in practice ==&lt;br /&gt;
[[File:Angela.png|300px|left|thumb|A failed first try in attacking the page of [[wikipedia:Germany|German]] politician [[wikipedia:simple:Angela_Merkel|Angela Merkel]].&amp;lt;ref&amp;gt;https://simple.wikipedia.org/w/index.php?title=Angela_Merkel&amp;amp;type=revision&amp;amp;diff=5163294&amp;amp;oldid=5163092&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
After working with all this data, we decided it would be fun to test out how feasible an actual Wiki attack was. Of course, node attacks imply removing a Wikipedia page which is completely undoable. Removing edges however is easily done.&lt;br /&gt;
&lt;br /&gt;
Removing links from articles was spotted and reverted quickly (see Figure to the left) so we decided to rewrite the sentences containing the links instead. &lt;br /&gt;
&lt;br /&gt;
=== Attacking Justin Bieber ===&lt;br /&gt;
Nobody actually likes Justin Bieber&amp;lt;sup&amp;gt;[[https://en.wikipedia.org/wiki/Citation_needed ''citation needed'']]&amp;lt;/sup&amp;gt; and as such he was an obvious target. Fortunately his page is somewhat poorly connected, with only [https://simple.wikipedia.org/w/index.php?title=Special%3AWhatLinksHere&amp;amp;target=Justin+Bieber&amp;amp;namespace=0| 14 links] pointing to his article. His relative betweenness robustness was found to be just two by removing &lt;br /&gt;
[[File:justin_edit.png|300px|right|thumb|Stealthy removal of Justin Bieber from Wikipedia English.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1994&amp;amp;type=revision&amp;amp;diff=5166171&amp;amp;oldid=5014657| (1994, Justin Bieber)] and &lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=March_1&amp;amp;type=revision&amp;amp;diff=5166189&amp;amp;oldid=5128111| (March 1, Justin Bieber)].&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
! &amp;lt;math&amp;gt;\overline N(\text{Justin Bieber})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0  || 3.8563&lt;br /&gt;
|-&lt;br /&gt;
|1 || 4.0103&lt;br /&gt;
|-&lt;br /&gt;
|2|| 4.5282&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As was to be expected, Justin Bieber is a very easy target; we needed just 2 links to increase his average path length with a half.&lt;br /&gt;
&lt;br /&gt;
=== Eurozone? όχι! ===&lt;br /&gt;
While everybody is voting for or against #GREXIT, we decided to take a stand on this issue by removing not Greece from the Eurozone but the Eurozone from Wikipedia. Our relative betweenness attack strategy yielded a robustness of 7, with&lt;br /&gt;
[[File:Montenegro.png|300px|right|thumb|Successful removal of a link to Eurozone.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=European_Union&amp;amp;type=revision&amp;amp;diff=5166234&amp;amp;oldid=5140218| (European Union, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=ISO_4217&amp;amp;type=revision&amp;amp;diff=5166222&amp;amp;oldid=4407302| (ISO 4217, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Bulgaria&amp;amp;type=revision&amp;amp;diff=5166208&amp;amp;oldid=5166207| (Bulgaria, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Montenegro&amp;amp;type=revision&amp;amp;diff=5166225&amp;amp;oldid=4978173| (Montenegro, Eurozone)]&lt;br /&gt;
* (Euro, Eurozone)&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1999&amp;amp;type=revision&amp;amp;diff=5166232&amp;amp;oldid=5150104| (1999, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=2010&amp;amp;type=revision&amp;amp;diff=5166231&amp;amp;oldid=5166229| (2010, Eurozone)]&lt;br /&gt;
The [[wikipedia:simple:Euro|Euro]] page has 6 explicit mentions of Eurozone, so we opted to remove [https://simple.wikipedia.org/w/index.php?title=2015&amp;amp;type=revision&amp;amp;diff=5166241&amp;amp;oldid=5158867| (2015, Eurozone)] instead.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack Results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Eurozone})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0 || 3.2545&lt;br /&gt;
|-&lt;br /&gt;
|1|| 3.2848&lt;br /&gt;
|-&lt;br /&gt;
|2 || 3.3751&lt;br /&gt;
|-&lt;br /&gt;
|3||3.4691&lt;br /&gt;
|-&lt;br /&gt;
|4||3.5611&lt;br /&gt;
|-&lt;br /&gt;
|5||3.6191&lt;br /&gt;
|-&lt;br /&gt;
|6||3.6670&lt;br /&gt;
|-&lt;br /&gt;
|7||3.7359&lt;br /&gt;
|-&lt;br /&gt;
|8&amp;lt;ref&amp;gt;Not actually performed.&amp;lt;/ref&amp;gt;||3.9015&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We see that as The Eurozone article is reasonably well connected, we have to remove 7 links to increase its average path length by a half.&lt;br /&gt;
&lt;br /&gt;
===Mending the Wiki Game: putting Britney back in the spotlight===&lt;br /&gt;
[[File:Britney.png|300px|right|thumb|Successful addition of a link to Britney Spears from the United States page.]]&lt;br /&gt;
Rather than removing links to make a page less visible, we can also add links to improve the visibility of a page. This is a  very different problem, as edge not yet existing in the network could be added. So the goal was to both find links that would be reasonable to add, and find a fast heuristic to find links the would provide a good improvement on the average geodesic length.&lt;br /&gt;
&lt;br /&gt;
We decided to see if we could improve the average geodesic length of famous singer [[wikipedia:Britney_Spears|Britney Spears]]. To this end we selected various nodes which themselves have a very low average geodesic length, and where a link to Britney could be added. [https://simple.wikipedia.org/w/index.php?title=United_States&amp;amp;type=revision&amp;amp;diff=5165763&amp;amp;oldid=5163040| United States] and [https://simple.wikipedia.org/w/index.php?title=Americans&amp;amp;type=revision&amp;amp;diff=5165767&amp;amp;oldid=5078214| Americans] seemed the best candidates.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Mending Results&lt;br /&gt;
|-&lt;br /&gt;
!Links added from&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Britney Spears})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||| 3.4018&lt;br /&gt;
|-&lt;br /&gt;
| United States|| 2.9342&lt;br /&gt;
|-&lt;br /&gt;
|United States, Americans || 2.8943&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Adding links to Britney Spears to these pages reduced the average geodesic length by more than 0.5. An important advantage of adding links, rather than removing them, is that it is not considered vandalism if the information is correct. This last note makes algorithmic selection of pages more challenging, as most pairs of pages are not directly related, making it hard to add relevant information about that page. For example, it would be harder to add content that would link Britney Spears to Germany.&lt;br /&gt;
&lt;br /&gt;
==Attacking the wiki network with ulterior motives==&lt;br /&gt;
We have seen that editing a Wikipedia page is possible, and will have a real effect on the average geodesic length of the page. While these examples are purely for academic purposes, it is very possible an editor can have an ulterior motive behind making an edit. A good example of such an edit would be for a person to add links in Wikipedia to their own page as a form of [[wikipedia:Public Relations|PR]].&lt;br /&gt;
&lt;br /&gt;
As it turns out, [[wikipedia:Conflict-of-interest_editing_on_Wikipedia|Conflict of interest editing]] happens a lot on Wikipedia. There are many known cases&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Conflict-of-interest_editing_on_Wikipedia#Incidents&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.bbc.com/news/technology-28481876&amp;lt;/ref&amp;gt; where large companies and political parties have made edits to Wikipedia pages to either improve their own brand or to try to deface the pages of their competitors.&lt;br /&gt;
&lt;br /&gt;
A big difference between the edits made by these parties and our strategy is that they are often aimed at modifying the content of a page, while we modifying the link connectivity of a page. Often these edits are very childish and are quickly reverted; see figure. [[File:Rick_Santorum.png|300px|right|thumb|A very professional edit made to the page of US Politician Rick Santorum.]]&lt;br /&gt;
&lt;br /&gt;
== Final thoughts ==&lt;br /&gt;
&lt;br /&gt;
Even though our research mentions Wikipedia, we did most of the analysis on the Simple English Wiki. We did not have the hardware available to import and process recent data of Wikipedia and run our algorithms. With a computationally stronger system and optimized algorithms, this would be more feasible.&lt;br /&gt;
&lt;br /&gt;
The focus of this research was mainly on disrupting the Wiki Game by edge removal. Investigating algorithms for edge addition was not inside the scope of this research, as removing links from Wikipedia pages is easier to achieve than strategically adding links to pages (as this would require that the links are relevant). With more information, however, it would be possible to develop an algorithm that suggests pages of the same category, or that suggests to link to pages that already link to the target page.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Fix&amp;diff=74</id>
		<title>Template:Fix</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Fix&amp;diff=74"/>
		<updated>2019-09-23T12:10:31Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{{subst|¬}}}&lt;br /&gt;
 |¬={{category handler&lt;br /&gt;
  |template=[[Category:Templates needing substitution checking]]&lt;br /&gt;
  |nocat={{{nocat|&amp;lt;noinclude&amp;gt;true&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |SUBST=[[Category:Pages with incorrectly substituted templates]]&lt;br /&gt;
}}{{Category handler&lt;br /&gt;
 |main={{Fix/category&lt;br /&gt;
  |cat-date={{{cat-date|}}} &lt;br /&gt;
  |cat={{{cat|}}} &lt;br /&gt;
  |cat-date2={{{cat-date2|}}} &lt;br /&gt;
  |cat2={{{cat2|}}} &lt;br /&gt;
  |cat-date3={{{cat-date3|}}} &lt;br /&gt;
  |cat3={{{cat3|}}} &lt;br /&gt;
  |date={{{date|}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |template={{#if:{{{name|}}}|{{#ifeq:{{{name}}}|{{ROOTPAGENAME}}||{{#if:{{{date|}}}||[[Category:Templates including undated clean-up tags]]}}}}}} &lt;br /&gt;
 |subpage=no&lt;br /&gt;
}}{{#if:{{{text|}}}&lt;br /&gt;
 |&amp;lt;sup class=&amp;quot;noprint Inline-Template {{{class|}}}&amp;quot; style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;amp;#91;&amp;lt;i&amp;gt;{{#if:{{{pre-text|}}}&lt;br /&gt;
  |{{{pre-text}}}&amp;amp;#32;&lt;br /&gt;
 }}[[{{{link|Wikipedia:Cleanup}}}|&amp;lt;span title=&amp;quot;{{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}|&amp;amp;#32;({{{date}}})}}}}&amp;quot;&amp;gt;{{{text|}}}&amp;lt;/span&amp;gt;]]{{#if:{{{post-text|}}}&lt;br /&gt;
  |&amp;amp;#32;{{{post-text}}}&lt;br /&gt;
 }}&amp;lt;/i&amp;gt;&amp;amp;#93;&amp;lt;/sup&amp;gt;|{{{special|}}}&lt;br /&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>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=MediaWiki:Common.js&amp;diff=72</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=MediaWiki:Common.js&amp;diff=72"/>
		<updated>2019-09-23T12:09:44Z</updated>

		<summary type="html">&lt;p&gt;Rex: Created page with &amp;quot;/**  * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally  * loaded for all users on every wiki page. If possible create a gadget that is  * enabled by def...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally&lt;br /&gt;
 * loaded for all users on every wiki page. If possible create a gadget that is&lt;br /&gt;
 * enabled by default instead of adding it here (since gadgets are fully&lt;br /&gt;
 * optimized ResourceLoader modules with possibility to add dependencies etc.)&lt;br /&gt;
 *&lt;br /&gt;
 * Since Common.js isn't a gadget, there is no place to declare its&lt;br /&gt;
 * dependencies, so we have to lazy load them with mw.loader.using on demand and&lt;br /&gt;
 * then execute the rest in the callback. In most cases these dependencies will&lt;br /&gt;
 * be loaded (or loading) already and the callback will not be delayed. In case a&lt;br /&gt;
 * dependency hasn't arrived yet it'll make sure those are loaded before this.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* global mw, $ */&lt;br /&gt;
/* jshint strict:false, browser:true */&lt;br /&gt;
&lt;br /&gt;
mw.loader.using( ['mediawiki.util', 'mediawiki.notify'] ).done( function () {&lt;br /&gt;
/* Begin of mw.loader.using callback */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Main Page layout fixes&lt;br /&gt;
 *&lt;br /&gt;
 * Description: Adds an additional link to the complete list of languages available.&lt;br /&gt;
 * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( 'wgPageName' ) === 'Main_Page' || mw.config.get( 'wgPageName' ) === 'Talk:Main_Page' ) {&lt;br /&gt;
	$( function () {&lt;br /&gt;
		mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',&lt;br /&gt;
			'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias' );&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Redirect User:Name/skin.js and skin.css to the current skin's pages&lt;br /&gt;
 * (unless the 'skin' page really exists)&lt;br /&gt;
 * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js&lt;br /&gt;
 * @rev: 2&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( 'wgArticleId' ) === 0 &amp;amp;&amp;amp; mw.config.get( 'wgNamespaceNumber' ) === 2 ) {&lt;br /&gt;
	var titleParts = mw.config.get( 'wgPageName' ).split( '/' );&lt;br /&gt;
	/* Make sure there was a part before and after the slash&lt;br /&gt;
	   and that the latter is 'skin.js' or 'skin.css' */&lt;br /&gt;
	if ( titleParts.length == 2 ) {&lt;br /&gt;
		var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );&lt;br /&gt;
		if ( titleParts.slice( -1 ) == 'skin.js' ) {&lt;br /&gt;
			window.location.href = mw.util.getUrl( userSkinPage + '.js' );&lt;br /&gt;
		} else if ( titleParts.slice( -1 ) == 'skin.css' ) {&lt;br /&gt;
			window.location.href = mw.util.getUrl( userSkinPage + '.css' );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Map addPortletLink to mw.util&lt;br /&gt;
 * @deprecated: Use mw.util.addPortletLink instead.&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Use mw.util.addPortletLink instead' );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Extract a URL parameter from the current URL&lt;br /&gt;
 * @deprecated: Use mw.util.getParamValue with proper escaping&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Use mw.util.getParamValue instead' );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test if an element has a certain class&lt;br /&gt;
 * @deprecated:  Use $(element).hasClass() instead.&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'hasClass', function ( element, className ) {&lt;br /&gt;
	return $( element ).hasClass( className );&lt;br /&gt;
}, 'Use jQuery.hasClass() instead' );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL&lt;br /&gt;
 * @rev 6&lt;br /&gt;
 */&lt;br /&gt;
var extraCSS = mw.util.getParamValue( 'withCSS' ),&lt;br /&gt;
	extraJS = mw.util.getParamValue( 'withJS' );&lt;br /&gt;
&lt;br /&gt;
if ( extraCSS ) {&lt;br /&gt;
	if ( extraCSS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.css$/ ) ) {&lt;br /&gt;
		mw.loader.load( '/w/index.php?title=' + extraCSS + '&amp;amp;action=raw&amp;amp;ctype=text/css', 'text/css' );&lt;br /&gt;
	} else {&lt;br /&gt;
		mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( extraJS ) {&lt;br /&gt;
	if ( extraJS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.js$/ ) ) {&lt;br /&gt;
		mw.loader.load( '/w/index.php?title=' + extraJS + '&amp;amp;action=raw&amp;amp;ctype=text/javascript' );&lt;br /&gt;
	} else {&lt;br /&gt;
		mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * WikiMiniAtlas&lt;br /&gt;
 *&lt;br /&gt;
 * Description: WikiMiniAtlas is a popup click and drag world map.&lt;br /&gt;
 *              This script causes all of our coordinate links to display the WikiMiniAtlas popup button.&lt;br /&gt;
 *              The script itself is located on meta because it is used by many projects.&lt;br /&gt;
 *              See [[Meta:WikiMiniAtlas]] for more information.&lt;br /&gt;
 * Note - use of this service is recommended to be replaced with mw:Help:Extension:Kartographer&lt;br /&gt;
 */&lt;br /&gt;
$( function () {&lt;br /&gt;
	var require_wikiminiatlas = $( 'a.external.text[href*=&amp;quot;geohack&amp;quot;]' ).length || $( 'div.kmldata' ).length;&lt;br /&gt;
	if ( require_wikiminiatlas ) {&lt;br /&gt;
		mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&amp;amp;action=raw&amp;amp;ctype=text/javascript' );&lt;br /&gt;
	}&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Collapsible tables; reimplemented with mw-collapsible&lt;br /&gt;
 * Styling is also in place to avoid FOUC&lt;br /&gt;
 * &lt;br /&gt;
 * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].&lt;br /&gt;
 * @version 3.0.0 (2018-05-20)&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js&lt;br /&gt;
 * @author [[User:R. Koot]]&lt;br /&gt;
 * @author [[User:Krinkle]]&lt;br /&gt;
 * @author [[User:TheDJ]]&lt;br /&gt;
 * @deprecated Since MediaWiki 1.20: Use class=&amp;quot;mw-collapsible&amp;quot; instead which&lt;br /&gt;
 * is supported in MediaWiki core. Shimmable since MediaWiki 1.32&lt;br /&gt;
 */&lt;br /&gt;
function makeCollapsibleMwCollapsible( $content ) {&lt;br /&gt;
	var $tables = $content&lt;br /&gt;
		.find( 'table.collapsible:not(.mw-collapsible)' )&lt;br /&gt;
		.addClass( 'mw-collapsible' );&lt;br /&gt;
&lt;br /&gt;
	$.each( $tables, function( index, table ) {&lt;br /&gt;
		// mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.');&lt;br /&gt;
		if( $( table ).hasClass( 'collapsed') ) {&lt;br /&gt;
			$( table ).addClass( 'mw-collapsed' );&lt;br /&gt;
			// mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.');&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
	if( $tables.length &amp;gt; 0 ) {&lt;br /&gt;
		mw.loader.using( 'jquery.makeCollapsible' ).then( function() {&lt;br /&gt;
			$tables.makeCollapsible();&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse&lt;br /&gt;
 *&lt;br /&gt;
 * Maintainers: TheDJ&lt;br /&gt;
 */&lt;br /&gt;
function mwCollapsibleSetup( $collapsibleContent ) {&lt;br /&gt;
	var $element,&lt;br /&gt;
		$toggle,&lt;br /&gt;
		autoCollapseThreshold = 2;&lt;br /&gt;
	$.each( $collapsibleContent, function (index, element) {&lt;br /&gt;
		$element = $( element );&lt;br /&gt;
		if ( $element.hasClass( 'collapsible' ) ) {&lt;br /&gt;
			$element.find('tr:first &amp;gt; th:first').prepend( $element.find('tr:first &amp;gt; * &amp;gt; .mw-collapsible-toggle'));&lt;br /&gt;
		}&lt;br /&gt;
		if ( $collapsibleContent.length &amp;gt;= autoCollapseThreshold &amp;amp;&amp;amp; $element.hasClass( 'autocollapse' ) ) {&lt;br /&gt;
			$element.data( 'mw-collapsible' ).collapse();&lt;br /&gt;
		} else if ( $element.hasClass( 'innercollapse' ) ) {&lt;br /&gt;
			if ( $element.parents( '.outercollapse' ).length &amp;gt; 0 ) {&lt;br /&gt;
				$element.data( 'mw-collapsible' ).collapse();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// because of colored backgrounds, style the link in the text color&lt;br /&gt;
		// to ensure accessible contrast&lt;br /&gt;
		$toggle = $element.find( '.mw-collapsible-toggle' );&lt;br /&gt;
		if ( $toggle.length ) {&lt;br /&gt;
			// Make the toggle inherit text color&lt;br /&gt;
			if( $toggle.parent()[0].style.color ) {&lt;br /&gt;
				$toggle.find( 'a' ).css( 'color', 'inherit' );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Dynamic Navigation Bars (experimental)&lt;br /&gt;
 *&lt;br /&gt;
 * Description: See [[Wikipedia:NavFrame]].&lt;br /&gt;
 * Maintainers: UNMAINTAINED&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
var collapseCaption = 'hide';&lt;br /&gt;
var expandCaption = 'show';&lt;br /&gt;
&lt;br /&gt;
// Set up the words in your language&lt;br /&gt;
var navigationBarHide = '[' + collapseCaption + ']';&lt;br /&gt;
var navigationBarShow = '[' + expandCaption + ']';&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Shows and hides content and picture (if available) of navigation bars.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {number} indexNavigationBar The index of navigation bar to be toggled&lt;br /&gt;
 * @param {jQuery.Event} event Event object&lt;br /&gt;
 */&lt;br /&gt;
function toggleNavigationBar( indexNavigationBar, event ) {&lt;br /&gt;
	var navToggle = document.getElementById( 'NavToggle' + indexNavigationBar );&lt;br /&gt;
	var navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );&lt;br /&gt;
	var navChild;&lt;br /&gt;
&lt;br /&gt;
	if ( !navFrame || !navToggle ) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// If shown now&lt;br /&gt;
	if ( navToggle.firstChild.data === navigationBarHide ) {&lt;br /&gt;
		for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {&lt;br /&gt;
			if ( $( navChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
				navChild.style.display = 'none';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		navToggle.firstChild.data = navigationBarShow;&lt;br /&gt;
	&lt;br /&gt;
	// If hidden now&lt;br /&gt;
	} else if ( navToggle.firstChild.data === navigationBarShow ) {&lt;br /&gt;
		for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {&lt;br /&gt;
			if ( $( navChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
				navChild.style.display = 'block';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		navToggle.firstChild.data = navigationBarHide;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	event.preventDefault();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds show/hide-button to navigation bars.&lt;br /&gt;
 *&lt;br /&gt;
 * @param {jQuery} $content&lt;br /&gt;
 */&lt;br /&gt;
function createNavigationBarToggleButton( $content ) {&lt;br /&gt;
	var i, j, navChild, navToggle, navToggleText, isCollapsed,&lt;br /&gt;
		indexNavigationBar = 0;&lt;br /&gt;
	// Iterate over all &amp;lt; div &amp;gt;-elements&lt;br /&gt;
	var $divs = $content.find( 'div.NavFrame:not(.mw-collapsible)' );&lt;br /&gt;
	$divs.each( function ( i, navFrame ) {&lt;br /&gt;
		indexNavigationBar++;&lt;br /&gt;
		navToggle = document.createElement( 'a' );&lt;br /&gt;
		navToggle.className = 'NavToggle';&lt;br /&gt;
		navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );&lt;br /&gt;
		navToggle.setAttribute( 'href', '#' );&lt;br /&gt;
		$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );&lt;br /&gt;
&lt;br /&gt;
		isCollapsed = $( navFrame ).hasClass( 'collapsed' );&lt;br /&gt;
		/**&lt;br /&gt;
		 * Check if any children are already hidden.  This loop is here for backwards compatibility:&lt;br /&gt;
		 * the old way of making NavFrames start out collapsed was to manually add style=&amp;quot;display:none&amp;quot;&lt;br /&gt;
		 * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make&lt;br /&gt;
		 * the content visible without JavaScript support), the new recommended way is to add the class&lt;br /&gt;
		 * &amp;quot;collapsed&amp;quot; to the NavFrame itself, just like with collapsible tables.&lt;br /&gt;
		 */&lt;br /&gt;
		for ( navChild = navFrame.firstChild; navChild !== null &amp;amp;&amp;amp; !isCollapsed; navChild = navChild.nextSibling ) {&lt;br /&gt;
			if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
				if ( navChild.style.display === 'none' ) {&lt;br /&gt;
					isCollapsed = true;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( isCollapsed ) {&lt;br /&gt;
			for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {&lt;br /&gt;
				if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
					navChild.style.display = 'none';&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		navToggleText = document.createTextNode( isCollapsed ? navigationBarShow : navigationBarHide );&lt;br /&gt;
		navToggle.appendChild( navToggleText );&lt;br /&gt;
&lt;br /&gt;
		// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)&lt;br /&gt;
		for ( j = 0; j &amp;lt; navFrame.childNodes.length; j++ ) {&lt;br /&gt;
			if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {&lt;br /&gt;
				navToggle.style.color = navFrame.childNodes[j].style.color;&lt;br /&gt;
				navFrame.childNodes[j].appendChild( navToggle );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Magic editintros ****************************************************&lt;br /&gt;
 *&lt;br /&gt;
 * Description: Adds editintros on disambiguation pages and BLP pages.&lt;br /&gt;
 * Maintainers: [[User:RockMFR]]&lt;br /&gt;
 */&lt;br /&gt;
function addEditIntro( name ) {&lt;br /&gt;
	$( '.mw-editsection, #ca-edit, #ca-ve-edit' ).find( 'a' ).each( function ( i, el ) {&lt;br /&gt;
		el.href = $( this ).attr( 'href' ) + '&amp;amp;editintro=' + name;&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {&lt;br /&gt;
	$( function () {&lt;br /&gt;
		if ( document.getElementById( 'disambigbox' ) ) {&lt;br /&gt;
			addEditIntro( 'Template:Disambig_editintro' );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	$( function () {&lt;br /&gt;
		var cats = mw.config.get('wgCategories');&lt;br /&gt;
		if ( !cats ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if ( $.inArray( 'Living people', cats ) !== -1 || $.inArray( 'Possibly living people', cats ) !== -1 ) {&lt;br /&gt;
			addEditIntro( 'Template:BLP_editintro' );&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Actions specific to the edit page */&lt;br /&gt;
if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' ) {&lt;br /&gt;
	/**&lt;br /&gt;
	 * Fix edit summary prompt for undo&lt;br /&gt;
	 *&lt;br /&gt;
	 *  Fixes the fact that the undo function combined with the &amp;quot;no edit summary prompter&amp;quot;&lt;br /&gt;
	 *  complains about missing editsummary, if leaving the edit summary unchanged.&lt;br /&gt;
	 *  Added by [[User:Deskana]], code by [[User:Tra]].&lt;br /&gt;
	 *  See also [[phab:T10912]].&lt;br /&gt;
	 */&lt;br /&gt;
	$(function () {&lt;br /&gt;
		if (document.location.search.indexOf('undo=') !== -1 &amp;amp;&amp;amp; document.getElementsByName('wpAutoSummary')[0]) {&lt;br /&gt;
			document.getElementsByName('wpAutoSummary')[0].value = '1';&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* End of mw.loader.using callback */&lt;br /&gt;
} );&lt;br /&gt;
/* DO NOT ADD CODE BELOW THIS LINE */&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=MediaWiki:Common.css&amp;diff=71</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=MediaWiki:Common.css&amp;diff=71"/>
		<updated>2019-09-23T12:09:11Z</updated>

		<summary type="html">&lt;p&gt;Rex: Created page with &amp;quot;/* Reset italic styling set by user agent */ cite, dfn { 	font-style: inherit; }  /* Straight quote marks for &amp;lt;q&amp;gt; */ q { 	quotes: '&amp;quot;' '&amp;quot;' &amp;quot;'&amp;quot; &amp;quot;'&amp;quot;; }  /* Avoid collision of blo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Reset italic styling set by user agent */&lt;br /&gt;
cite, dfn {&lt;br /&gt;
	font-style: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Straight quote marks for &amp;lt;q&amp;gt; */&lt;br /&gt;
q {&lt;br /&gt;
	quotes: '&amp;quot;' '&amp;quot;' &amp;quot;'&amp;quot; &amp;quot;'&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Avoid collision of blockquote with floating elements by swapping margin and padding */&lt;br /&gt;
blockquote {&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	margin: 1em 0;&lt;br /&gt;
	padding: 0 40px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* give pre a float clearing new block formatting context */&lt;br /&gt;
/* Also break any really long words/urls to keep them visible in that case */&lt;br /&gt;
pre, .mw-code {&lt;br /&gt;
	overflow-x: hidden;&lt;br /&gt;
	overflow-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Consistent size for &amp;lt;small&amp;gt;, &amp;lt;sub&amp;gt; and &amp;lt;sup&amp;gt; */&lt;br /&gt;
small {&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content sub,&lt;br /&gt;
.mw-body-content sup,&lt;br /&gt;
span.reference /* for Parsoid */ {&lt;br /&gt;
	font-size: 80%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Same spacing for indented and unindented paragraphs on talk pages */&lt;br /&gt;
.ns-talk .mw-body-content dd {&lt;br /&gt;
	margin-top: 0.4em;&lt;br /&gt;
	margin-bottom: 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Main page fixes */&lt;br /&gt;
#interwiki-completelist {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reduce page jumps by hiding collapsed/dismissed content */&lt;br /&gt;
.client-js .mw-special-Watchlist #watchlist-message,&lt;br /&gt;
.client-js .NavFrame.collapsed .NavContent,&lt;br /&gt;
.client-js .collapsible:not( .mw-made-collapsible).collapsed &amp;gt; tbody &amp;gt; tr:not(:first-child) {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Adds padding above Watchlist announcements where new recentchanges/watchlist filters are enabled */&lt;br /&gt;
.mw-rcfilters-enabled .mw-specialpage-summary {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide charinsert base for those not using the gadget */&lt;br /&gt;
#editpage-specialchars {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Highlight linked elements (such as clicked references) in blue */&lt;br /&gt;
body.action-info .mw-body-content :target,&lt;br /&gt;
.citation:target {&lt;br /&gt;
	background-color: #def;  /* Fallback */&lt;br /&gt;
	background-color: rgba(0, 127, 255, 0.133);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styling for citations. Breaks long urls, etc., rather than overflowing box */&lt;br /&gt;
.citation {&lt;br /&gt;
	word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For linked citation numbers and document IDs, where the number need not be shown&lt;br /&gt;
   on a screen or a handheld, but should be included in the printed version */&lt;br /&gt;
@media screen, handheld {&lt;br /&gt;
	.citation .printonly {&lt;br /&gt;
		display: none;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Make the list of references smaller */&lt;br /&gt;
/* Keep in sync with Template:Refbegin/styles.css */&lt;br /&gt;
ol.references,&lt;br /&gt;
div.reflist {&lt;br /&gt;
	font-size: 90%;            /* Default font-size */&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.reflist ol.references {&lt;br /&gt;
	font-size: 100%;           /* Reset font-size when nested in div.reflist */&lt;br /&gt;
	margin-bottom: 0;          /* Avoid double margin when nested in div.reflist */&lt;br /&gt;
	list-style-type: inherit;  /* Enable custom list style types */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Allow hidden ref errors to be shown by user CSS */&lt;br /&gt;
/* TemplateStyles */&lt;br /&gt;
span.brokenref {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reset top margin for lists embedded in columns */&lt;br /&gt;
div.columns {&lt;br /&gt;
	margin-top: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
div.columns dl,&lt;br /&gt;
div.columns ol,&lt;br /&gt;
div.columns ul {&lt;br /&gt;
	margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Avoid elements breaking between columns */&lt;br /&gt;
.nocolbreak,&lt;br /&gt;
div.columns li,&lt;br /&gt;
div.columns dd dd {&lt;br /&gt;
	-webkit-column-break-inside: avoid;&lt;br /&gt;
	page-break-inside: avoid;&lt;br /&gt;
	break-inside: avoid-column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Style for horizontal lists (separator following item).&lt;br /&gt;
   @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
   @revision 8 (2016-05-21)&lt;br /&gt;
   @author [[User:Edokter]]&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;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Display nested 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;
.hlist dl dl, .hlist dl ol, .hlist dl ul,&lt;br /&gt;
.hlist ol dl, .hlist ol ol, .hlist ol ul,&lt;br /&gt;
.hlist ul dl, .hlist ul ol, .hlist ul ul {&lt;br /&gt;
	display: inline;&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;
/* 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;
 * Note hlist style usage differd in&lt;br /&gt;
 * the Minerva skin. Remember .hlist is a class defined in core as well! Please check Minerva desktop (and Minerva.css) when changing&lt;br /&gt;
 * See https://phabricator.wikimedia.org/T213239&lt;br /&gt;
 */&lt;br /&gt;
.hlist dd:after,&lt;br /&gt;
.hlist li:after {&lt;br /&gt;
	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
	font-weight: bold;&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;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,&lt;br /&gt;
.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,&lt;br /&gt;
.hlist li dd:first-child:before, .hlist li dt:first-child:before, .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;
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,&lt;br /&gt;
.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,&lt;br /&gt;
.hlist li dd:last-child:after, .hlist li dt:last-child:after, .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;
/* 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;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&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;
.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;br /&gt;
&lt;br /&gt;
/* Unbulleted lists */&lt;br /&gt;
.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
	list-style: none none;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
	margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default style for navigation boxes */&lt;br /&gt;
.navbox {                     /* Navbox container style */&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;
.navbox .navbox {&lt;br /&gt;
	margin-top: 0;            /* No top margin for nested navboxes */&lt;br /&gt;
}&lt;br /&gt;
.navbox + .navbox {&lt;br /&gt;
	margin-top: -1px;         /* Single pixel border between adjacent navboxes */&lt;br /&gt;
}&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	width: 100%;&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;      /* Title, group and above/below styles */&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
th.navbox-group {             /* Group style */&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	background-color: #fdfdfd; /* Background color */&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;
/* cell spacing for navbox cells */&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 {    /* Borders above 2nd, 3rd, etc. rows */&lt;br /&gt;
	border-top: 2px solid #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title {&lt;br /&gt;
	background-color: #ccccff;      /* Level 1 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
th.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
	background-color: #ddddff;      /* Level 2 color */&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;
}&lt;br /&gt;
.navbox-even {&lt;br /&gt;
	background-color: #f7f7f7;      /* Even row striping */&lt;br /&gt;
}&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
	background-color: transparent;  /* Odd row striping */&lt;br /&gt;
}&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;       /* Adjust hlist padding in navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default styling for Navbar template */&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;
.navbar ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content .navbar ul {&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
.navbar li {&lt;br /&gt;
	word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
.navbar.mini li abbr[title] {&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;
/* Navbar styling when nested in infobox and navbox */&lt;br /&gt;
.infobox .navbar {&lt;br /&gt;
	font-size: 100%;&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;
.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;
/* Styling for JQuery makeCollapsible, matching that of collapseButton */&lt;br /&gt;
.mw-parser-output .mw-collapsible-toggle {&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	padding-right: 0.2em;&lt;br /&gt;
	padding-left: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-collapsible-leftside-toggle .mw-collapsible-toggle {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Infobox template style */&lt;br /&gt;
.infobox {&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	border-spacing: 3px;&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	color: black;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 0.5em 0 0.5em 1em;&lt;br /&gt;
	padding: 0.2em;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: right;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	clear: right;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.infobox caption {&lt;br /&gt;
	font-size: 125%;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	padding: 0.2em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
	vertical-align: top;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.sisterproject {&lt;br /&gt;
	width: 20em;&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.standard-talk {&lt;br /&gt;
	border: 1px solid #c0c090;&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.infobox.standard-talk.bordered td,&lt;br /&gt;
.infobox.standard-talk.bordered th {&lt;br /&gt;
	border: 1px solid #c0c090;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* styles for bordered infobox with merged rows */&lt;br /&gt;
.infobox.bordered .mergedtoprow td,&lt;br /&gt;
.infobox.bordered .mergedtoprow th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
	border-top: 1px solid #a2a9b1;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-right: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.bordered .mergedrow td,&lt;br /&gt;
.infobox.bordered .mergedrow th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-right: 1px solid #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles for geography infoboxes, eg countries,&lt;br /&gt;
   country subdivisions, cities, etc.            */&lt;br /&gt;
.infobox.geography {&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	line-height: 1.2em;&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography  td,&lt;br /&gt;
.infobox.geography  th {&lt;br /&gt;
	border-top: 1px solid #a2a9b1;&lt;br /&gt;
	padding: 0.4em 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.infobox.geography .mergedtoprow td,&lt;br /&gt;
.infobox.geography .mergedtoprow th {&lt;br /&gt;
	border-top: 1px solid #a2a9b1;&lt;br /&gt;
	padding: 0.4em 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .mergedrow td,&lt;br /&gt;
.infobox.geography .mergedrow th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
	padding: 0 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .mergedbottomrow td,&lt;br /&gt;
.infobox.geography .mergedbottomrow th {&lt;br /&gt;
	border-top: 0;&lt;br /&gt;
	border-bottom: 1px solid #a2a9b1;&lt;br /&gt;
	padding: 0 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.geography .maptable td,&lt;br /&gt;
.infobox.geography .maptable th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Normal font styling for wikitable row headers with scope=&amp;quot;row&amp;quot; tag */&lt;br /&gt;
.wikitable.plainrowheaders th[scope=row] {&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Lists in wikitable data cells are always left-aligned */&lt;br /&gt;
.wikitable td ul,&lt;br /&gt;
.wikitable td ol,&lt;br /&gt;
.wikitable td dl {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
/* ...unless they also use the hlist class */&lt;br /&gt;
.toc.hlist ul,&lt;br /&gt;
#toc.hlist ul,&lt;br /&gt;
.wikitable.hlist td ul,&lt;br /&gt;
.wikitable.hlist td ol,&lt;br /&gt;
.wikitable.hlist td dl {&lt;br /&gt;
	text-align: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Icons for medialist templates [[Template:Listen]],&lt;br /&gt;
   [[Template:Multi-listen_start]], [[Template:Video]],&lt;br /&gt;
   [[Template:Multi-video_start]] */&lt;br /&gt;
/* TemplateStyles */&lt;br /&gt;
div.listenlist {&lt;br /&gt;
	background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg&amp;quot;) no-repeat scroll 0 0 transparent;&lt;br /&gt;
	background-size: 30px;&lt;br /&gt;
	padding-left: 40px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix for hieroglyphs specificity issue in infoboxes ([[phab:T43869]]) */&lt;br /&gt;
table.mw-hiero-table td {&lt;br /&gt;
	vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Change the external link icon to an Adobe icon for all PDF files */&lt;br /&gt;
.mw-parser-output a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
.mw-parser-output a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
.mw-parser-output a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
.mw-parser-output a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
.mw-parser-output a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
.mw-parser-output a[href*=&amp;quot;.PDF#&amp;quot;].external {&lt;br /&gt;
	background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Messagebox templates */&lt;br /&gt;
.messagebox {&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	width: 80%;&lt;br /&gt;
	margin: 0 auto 1em auto;&lt;br /&gt;
	padding: .2em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.merge {&lt;br /&gt;
	border: 1px solid #c0b8cc;&lt;br /&gt;
	background-color: #f0e5ff;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.cleanup {&lt;br /&gt;
	border: 1px solid #9f9fff;&lt;br /&gt;
	background-color: #efefff;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.standard-talk {&lt;br /&gt;
	border: 1px solid #c0c090;&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
	margin: 4px auto;&lt;br /&gt;
}&lt;br /&gt;
/* For old WikiProject banners inside banner shells. */&lt;br /&gt;
.mbox-inside .standard-talk,&lt;br /&gt;
.messagebox.nested-talk {&lt;br /&gt;
	border: 1px solid #c0c090;&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	margin: 2px 0;&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small {&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: right;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 0 0 1em 1em;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small-talk {&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: right;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 0 0 1em 1em;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
	width: 100%;               /* Make all mboxes the same width regardless of text length */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-empty-cell {           /* An empty narrow cell */&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Article message box styles */&lt;br /&gt;
table.ambox {&lt;br /&gt;
	margin: 0 10%;                  /* 10% = Will not overlap with other elements */&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #36c;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	background-color: #fbfbfb;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
table.ambox + table.ambox {      /* Single border between stacked boxes. */&lt;br /&gt;
	margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.ambox th.mbox-text,&lt;br /&gt;
.ambox td.mbox-text {            /* The message body cell(s) */&lt;br /&gt;
	padding: 0.25em 0.5em;       /* 0.5em left/right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-image {           /* The left image cell */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-imageright {      /* The right image cell */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #36c;       /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-delete {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #a2a9b1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Image message box styles */&lt;br /&gt;
table.imbox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 3px solid #36c;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	background-color: #fbfbfb;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */&lt;br /&gt;
	margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
	display: block;         /* Fix for webkit to force 100% width.  */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .imbox {       /* For imboxes inside other templates.  */&lt;br /&gt;
	margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
	border: 3px solid #36c;       /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
	border: 3px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-delete {&lt;br /&gt;
	border: 3px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
	border: 3px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
	border: 3px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
	border: 3px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
	border: 3px solid #a2a9b1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
	border: 3px solid #88a;       /* Dark gray */&lt;br /&gt;
	background-color: #f7f8ff;    /* Light gray */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
	border: 3px solid #cba135;    /* Brown-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Category message box styles */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
	margin: 3px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #dfe8ff;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
	background-color: #d8e8ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
	margin-top: 4px;&lt;br /&gt;
	margin-bottom: 4px;&lt;br /&gt;
	border: 4px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #ffdbdb;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-delete {&lt;br /&gt;
	background-color: #ffdbdb;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
	background-color: #ffe7ce;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
	background-color: #fff9db;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
	background-color: #e4d8ff;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
	background-color: #efefe1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Other pages message box styles */&lt;br /&gt;
table.ombox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 1px solid #a2a9b1;    /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
	border: 1px solid #a2a9b1;    /* Gray */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
	border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
	border: 1px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
	border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
	border: 2px solid #a2a9b1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Talk page message box styles */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 1px solid #c0c090;    /* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
	min-width: 80%;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
.tmbox.mbox-small {&lt;br /&gt;
	min-width: 0;                /* reset the min-width of tmbox above        */&lt;br /&gt;
}&lt;br /&gt;
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The &amp;quot;mediawiki&amp;quot; class ensures that */&lt;br /&gt;
	margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */&lt;br /&gt;
	width: 100%;                 /* For Safari and Opera */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .tmbox.mbox-small { /* &amp;quot;small&amp;quot; tmboxes should not be small when  */&lt;br /&gt;
	line-height: 1.5em;          /* also &amp;quot;nested&amp;quot;, so reset styles that are   */&lt;br /&gt;
	font-size: 100%;             /* set in &amp;quot;mbox-small&amp;quot; above.                */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-delete {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
	border: 2px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
	border: 2px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
	border: 2px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
	border: 1px solid #c0c090;    /* Gray-brown */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	margin: 0.2em 0;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #f8f9fa;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
	border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
	background-color: #ffdbdb;  /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;warning&amp;quot; style fmbox messages. */&lt;br /&gt;
div.mw-warning-with-logexcerpt,&lt;br /&gt;
div.mw-lag-warn-high,&lt;br /&gt;
div.mw-cascadeprotectedwarning,&lt;br /&gt;
div#mw-protect-cascadeon,&lt;br /&gt;
div.titleblacklist-warning,&lt;br /&gt;
div.locked-warning {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	margin: 0.2em 0;&lt;br /&gt;
	border: 1px solid #bb7070;&lt;br /&gt;
	background-color: #ffdbdb;&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* These mbox-small classes must be placed after all other&lt;br /&gt;
   ambox/tmbox/ombox etc classes. &amp;quot;html body.mediawiki&amp;quot; is so&lt;br /&gt;
   they override &amp;quot;table.ambox + table.ambox&amp;quot; above. */&lt;br /&gt;
html body.mediawiki .mbox-small {   /* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	clear: right;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: right;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 4px 0 4px 1em;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
html body.mediawiki .mbox-small-left {   /* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 4px 1em 4px 0;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Style for compact ambox */&lt;br /&gt;
/* Hide the images */&lt;br /&gt;
.compact-ambox table .mbox-image,&lt;br /&gt;
.compact-ambox table .mbox-imageright,&lt;br /&gt;
.compact-ambox table .mbox-empty-cell {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
/* Remove borders, backgrounds, padding, etc. */&lt;br /&gt;
.compact-ambox table.ambox {&lt;br /&gt;
	border: none;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
	margin: 0 0 0 1.6em !important;&lt;br /&gt;
	padding: 0 !important;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki .compact-ambox table.mbox-small-left {&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Style the text cell as a list item and remove its padding */&lt;br /&gt;
.compact-ambox table .mbox-text {&lt;br /&gt;
	padding: 0 !important;&lt;br /&gt;
	margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.compact-ambox table .mbox-text-span {&lt;br /&gt;
	display: list-item;&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	list-style-type: square;&lt;br /&gt;
	list-style-image: url(/w/skins/MonoBook/resources/images/bullet.svg);&lt;br /&gt;
}&lt;br /&gt;
.skin-vector .compact-ambox table .mbox-text-span {&lt;br /&gt;
	list-style-type: disc;&lt;br /&gt;
	list-style-image: url(/w/skins/Vector/images/bullet-icon.svg);&lt;br /&gt;
}&lt;br /&gt;
/* Allow for hiding text in compact form */&lt;br /&gt;
.compact-ambox .hide-when-compact {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide (formatting) elements from screen, but not from screenreaders */&lt;br /&gt;
.visualhide {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	left: -10000px;&lt;br /&gt;
	top: auto;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
	height: 1px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Suppress missing interwiki image links where #ifexist cannot&lt;br /&gt;
   be used due to high number of requests. See .hidden-redlink on&lt;br /&gt;
   [[m:MediaWiki:Common.css]] */&lt;br /&gt;
.check-icon a.new {&lt;br /&gt;
	display: none;&lt;br /&gt;
	speak: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove underlines from certain links */&lt;br /&gt;
.nounderlines a,&lt;br /&gt;
.IPA a:link, .IPA a:visited {&lt;br /&gt;
	text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Standard Navigationsleisten, aka box hiding thingy&lt;br /&gt;
   from .de.  Documentation at [[Wikipedia:NavFrame]]. */&lt;br /&gt;
div.NavFrame {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	font-size: 95%;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame + div.NavFrame {&lt;br /&gt;
	border-top-style: none;&lt;br /&gt;
	border-top-style: hidden;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame div.NavHead {&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	background-color: #ccf;&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame p,&lt;br /&gt;
div.NavFrame div.NavContent,&lt;br /&gt;
div.NavFrame div.NavContent p {&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
a.NavToggle {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	right: 3px;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hatnotes and disambiguation notices */&lt;br /&gt;
.hatnote {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
.hatnote i {&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
}&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;
div.hatnote + div.hatnote {&lt;br /&gt;
	margin-top: -0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Allow transcluded pages to display in lists rather than a table. */&lt;br /&gt;
.listify td {&lt;br /&gt;
	display: list-item;&lt;br /&gt;
}&lt;br /&gt;
.listify tr {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
.listify table {&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Geographical coordinates defaults. See [[Template:Coord/link]]&lt;br /&gt;
   for how these are used. The classes &amp;quot;geo&amp;quot;, &amp;quot;longitude&amp;quot;, and&lt;br /&gt;
   &amp;quot;latitude&amp;quot; are used by the [[Geo microformat]]. */&lt;br /&gt;
/* TemplateStyles */&lt;br /&gt;
.geo-default, .geo-dms, .geo-dec {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
.geo-nondefault, .geo-multi-punct {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
.longitude, .latitude {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* User block messages */&lt;br /&gt;
div.user-block {&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
	border: 1px solid #a9a9a9;&lt;br /&gt;
	background-color: #ffefd5;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Prevent line breaks in silly places:&lt;br /&gt;
   1) Where desired&lt;br /&gt;
   2) Links when we don't want them to&lt;br /&gt;
   3) Bold &amp;quot;links&amp;quot; to the page itself */&lt;br /&gt;
.nowrap,&lt;br /&gt;
.nowraplinks a,&lt;br /&gt;
.nowraplinks .selflink {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.nowrap pre {&lt;br /&gt;
	white-space: pre;&lt;br /&gt;
}&lt;br /&gt;
/* But allow wrapping where desired: */&lt;br /&gt;
.wrap,&lt;br /&gt;
.wraplinks a {&lt;br /&gt;
	white-space: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For template documentation */&lt;br /&gt;
/* TemplateStyles */&lt;br /&gt;
.template-documentation {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	margin: 1em 0 0 0;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #ecfcf4;&lt;br /&gt;
	padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Increase the height of the image upload box */&lt;br /&gt;
#wpUploadDescription {&lt;br /&gt;
	height: 13em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Minimum thumb width */&lt;br /&gt;
.thumbinner {&lt;br /&gt;
	min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Prevent floating boxes from overlapping any category listings,&lt;br /&gt;
   file histories, edit previews, and edit [Show changes] views. */&lt;br /&gt;
#mw-subcategories, #mw-pages, #mw-category-media,&lt;br /&gt;
#filehistory, #wikiPreview, #wikiDiff {&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Selectively hide headers in WikiProject banners */&lt;br /&gt;
/* TemplateStyles */&lt;br /&gt;
.wpb .wpb-header {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
.wpbs-inner .wpb .wpb-header {&lt;br /&gt;
	display: block;            /* for IE */&lt;br /&gt;
}&lt;br /&gt;
.wpbs-inner .wpb .wpb-header {&lt;br /&gt;
	display: table-row;        /* for real browsers */&lt;br /&gt;
}&lt;br /&gt;
.wpbs-inner .wpb-outside {&lt;br /&gt;
	display: none;             /* hide things that should only display outside shells */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styling for Abuse Filter tags */&lt;br /&gt;
.mw-tag-markers {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide stuff meant for accounts with special permissions. Made visible again in&lt;br /&gt;
   [[MediaWiki:Group-checkuser.css]], [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-patroller.css]],&lt;br /&gt;
   [[MediaWiki:Group-templateeditor.css]], [[MediaWiki:Group-extendedmover.css]],&lt;br /&gt;
   [[MediaWiki:Group-extendedconfirmed.css]], and [[Mediawiki:Group-autoconfirmed.css]]. */&lt;br /&gt;
.checkuser-show,&lt;br /&gt;
.sysop-show,&lt;br /&gt;
.patroller-show,&lt;br /&gt;
.templateeditor-show,&lt;br /&gt;
.extendedmover-show,&lt;br /&gt;
.extendedconfirmed-show,&lt;br /&gt;
.autoconfirmed-show,&lt;br /&gt;
.user-show {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide the redlink generated by {{Editnotice}},&lt;br /&gt;
   this overrides the &amp;quot;.sysop-show { display: none; }&amp;quot; above that applies&lt;br /&gt;
   to the same link as well. See [[phab:T45013]]&lt;br /&gt;
&lt;br /&gt;
   Hide the images in editnotices to keep them readable in VE view.&lt;br /&gt;
   Long term, editnotices should become a core feature so that they can be designed responsive. */&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .editnotice-redlink,&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .mbox-image,&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .mbox-imageright {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Remove bullets when there are multiple edit page warnings */&lt;br /&gt;
ul.permissions-errors &amp;gt; li {&lt;br /&gt;
	list-style: none none;&lt;br /&gt;
}&lt;br /&gt;
ul.permissions-errors {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Generic class for Times-based serif, texhtml class for inline math */&lt;br /&gt;
.times-serif,&lt;br /&gt;
span.texhtml {&lt;br /&gt;
	font-family: &amp;quot;Nimbus Roman No9 L&amp;quot;, &amp;quot;Times New Roman&amp;quot;, Times, serif;&lt;br /&gt;
	font-size: 118%;&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml span.texhtml {&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
span.mwe-math-mathml-inline {&lt;br /&gt;
	font-size: 118%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Force tabular and lining display for digits and texhtml */&lt;br /&gt;
.digits,&lt;br /&gt;
.texhtml {&lt;br /&gt;
	-moz-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;, &amp;quot;kern&amp;quot; 0;&lt;br /&gt;
	-webkit-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;, &amp;quot;kern&amp;quot; 0;&lt;br /&gt;
	font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;, &amp;quot;kern&amp;quot; 0;&lt;br /&gt;
	font-variant-numeric: lining-nums tabular-nums;&lt;br /&gt;
	font-kerning: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Make &amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt; be left aligned with one space indent for compatibility with style conventions */&lt;br /&gt;
.mwe-math-fallback-image-display,&lt;br /&gt;
.mwe-math-mathml-display {&lt;br /&gt;
	margin-left: 1.6em !important;&lt;br /&gt;
	margin-top: 0.6em;&lt;br /&gt;
	margin-bottom: 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.mwe-math-mathml-display math {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix styling of transcluded prefindex tables */&lt;br /&gt;
table#mw-prefixindex-list-table,&lt;br /&gt;
table#mw-prefixindex-nav-table {&lt;br /&gt;
	width: 98%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Make it possible to hide checkboxes in &amp;lt;inputbox&amp;gt; */&lt;br /&gt;
.inputbox-hidecheckboxes form .inputbox-element,&lt;br /&gt;
.inputbox-hidecheckboxes .mw-ui-checkbox {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Work-around for [[phab:T25965]] / [[phab:T100106]] (Kaltura advertisement) */&lt;br /&gt;
.k-player .k-attribution {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Move 'play' button of video player to bottom left corner */&lt;br /&gt;
.PopUpMediaTransform a .play-btn-large {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	top: auto;&lt;br /&gt;
	right: auto;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide FlaggedRevs notice UI when there are no pending changes */&lt;br /&gt;
.flaggedrevs_draft_synced,&lt;br /&gt;
.flaggedrevs_stable_synced {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Force imgs in galleries to have borders by wrapping them in class=bordered-images */&lt;br /&gt;
.bordered-images img {&lt;br /&gt;
	border: solid #ddd 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Gallery styles background changes are restricted to screen view. In printing we should avoid applying backgrounds. */&lt;br /&gt;
@media screen {&lt;br /&gt;
	/* The backgrounds for galleries. */&lt;br /&gt;
	#content .gallerybox div.thumb {&lt;br /&gt;
		/* Light gray padding */&lt;br /&gt;
		background-color: #f8f9fa;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* Put a chequered background behind images, only visible if they have transparency.&lt;br /&gt;
	'.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */&lt;br /&gt;
	.gallerybox .thumb img {&lt;br /&gt;
		background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat;&lt;br /&gt;
	}&lt;br /&gt;
	/* But not on articles, user pages, portals or with opt-out. */&lt;br /&gt;
	.ns-0 .gallerybox .thumb img,&lt;br /&gt;
	.ns-2 .gallerybox .thumb img,&lt;br /&gt;
	.ns-100 .gallerybox .thumb img,&lt;br /&gt;
	.nochecker .gallerybox .thumb img {&lt;br /&gt;
		background-image: none;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display &amp;quot;From Wikipedia, the free encyclopedia&amp;quot; in skins that support it, do not apply to print mode */&lt;br /&gt;
@media screen {&lt;br /&gt;
	#siteSub {&lt;br /&gt;
		display: block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Message_box&amp;diff=66</id>
		<title>Module:Message box</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Message_box&amp;diff=66"/>
		<updated>2019-09-23T12:07:14Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a meta-module for producing message box templates, including&lt;br /&gt;
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
require('Module:No globals')&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
&lt;br /&gt;
-- Get a language object for formatDate and ucfirst.&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
-- Define constants&lt;br /&gt;
local CONFIG_MODULE = 'Module:Message box/configuration'&lt;br /&gt;
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if args.demospace and args.demospace ~= '' then&lt;br /&gt;
			-- implement demospace parameter of mbox&lt;br /&gt;
			local demospace = string.lower(args.demospace)&lt;br /&gt;
			if DEMOSPACES[demospace] then&lt;br /&gt;
				-- use template from DEMOSPACES&lt;br /&gt;
				obj.cfg = cfg[DEMOSPACES[demospace]]&lt;br /&gt;
			elseif string.find( demospace, 'talk' ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= '' then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
	-- For lazy loading of [[Module:Category handler]].&lt;br /&gt;
	obj.hasCategories = false&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format('[[Category:%s|%s]]', cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format('[[Category:%s]]', cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.hasCategories = true&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(self.classes, class)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&lt;br /&gt;
	if self.name then&lt;br /&gt;
		self:addClass('box-' .. string.gsub(self.name,' ','_'))&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(args.plainlinks) ~= false then&lt;br /&gt;
		self:addClass('plainlinks')&lt;br /&gt;
	end&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or 'mbox-small')&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = 'Template:' .. templateName&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == '' then&lt;br /&gt;
				sect = 'This ' .. (cfg.sectionDefault or 'page')&lt;br /&gt;
			elseif type(args.sect) == 'string' then&lt;br /&gt;
				sect = 'This ' .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == 'string' and issue ~= '' and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == 'string' and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, ' ')&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == ''&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = '#'&lt;br /&gt;
		elseif talk == '' then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it's a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
				local talkText = 'Relevant discussion may be found on'&lt;br /&gt;
				if talkArgIsTalkPage then&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						'%s [[%s|%s]].',&lt;br /&gt;
						talkText,&lt;br /&gt;
						talk,&lt;br /&gt;
						talkTitle.prefixedText&lt;br /&gt;
					)&lt;br /&gt;
				else&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						'%s the [[%s#%s|talk page]].',&lt;br /&gt;
						talkText,&lt;br /&gt;
						talkTitle.prefixedText,&lt;br /&gt;
						talk&lt;br /&gt;
					)&lt;br /&gt;
				end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= '' and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= '' then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == '' and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate('F Y')&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;small class='date-container'&amp;gt;''(&amp;lt;span class='date'&amp;gt;%s&amp;lt;/span&amp;gt;)''&amp;lt;/small&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
	if cfg.imageEmptyCellStyle then&lt;br /&gt;
		self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= 'none'&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or '30x30px')&lt;br /&gt;
				or '40x40px'&lt;br /&gt;
			self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage&lt;br /&gt;
				or 'Imbox notice.png', imageSize)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == 'none') then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{'cat', 'category', 'all'} do&lt;br /&gt;
		args[prefix .. '1'] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local date = args.date&lt;br /&gt;
	date = type(date) == 'string' and date&lt;br /&gt;
	local preposition = 'from'&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args['cat' .. tostring(num)]&lt;br /&gt;
			or args['category' .. tostring(num)]&lt;br /&gt;
		local allCat = args['all' .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == 'string' and mainCat&lt;br /&gt;
		allCat = type(allCat) == 'string' and allCat&lt;br /&gt;
		if mainCat and date and date ~= '' then&lt;br /&gt;
			local catTitle = string.format('%s %s %s', mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject('Category:' .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, 'Articles with invalid date parameter in template')&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == '') then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = 'C'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText&lt;br /&gt;
		self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat('all', 'Pages with incorrectly substituted templates')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	if not self.hasCategories then&lt;br /&gt;
		-- No categories added, no need to pass them to Category handler so,&lt;br /&gt;
		-- if it was invoked, it would return the empty string.&lt;br /&gt;
		-- So we shortcut and return the empty string.&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return require('Module:Category handler')._main{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag('b')&lt;br /&gt;
			:addClass('error')&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				'Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.',&lt;br /&gt;
				mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable = root:tag('table')&lt;br /&gt;
	boxTable:attr('id', self.id or nil)&lt;br /&gt;
	for i, class in ipairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr('role', 'presentation')&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag('tr')&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag('td'):addClass('mbox-image')&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don't. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag('td')&lt;br /&gt;
			:addClass('mbox-empty-cell')&lt;br /&gt;
			:cssText(self.imageEmptyCellStyle or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag('td'):addClass('mbox-text')&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag('div')&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass('mbox-text-span')&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) and not self.isSmall then&lt;br /&gt;
			textCellDiv:tag('span')&lt;br /&gt;
				:addClass('hide-when-compact')&lt;br /&gt;
				:wikitext(self.talk and (' ' .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (' ' .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag('span')&lt;br /&gt;
				:addClass('hide-when-compact')&lt;br /&gt;
				:wikitext(self.info and (' ' .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag('small')&lt;br /&gt;
				:addClass('hide-when-compact')&lt;br /&gt;
				:tag('i')&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag('td'):addClass('mbox-imageright')&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag('div'):css('width', '52px')&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag('tr')&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:attr('colspan', self.imageRight and '3' or '2')&lt;br /&gt;
				:addClass('mbox-text')&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag('div')&lt;br /&gt;
			:css('text-align', 'center')&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				'This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.',&lt;br /&gt;
				self.type or ''&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&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, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		if not getArgs then&lt;br /&gt;
			getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
		end&lt;br /&gt;
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Navbox&amp;diff=68</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Navbox&amp;diff=68"/>
		<updated>2019-09-23T12:07:14Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Navbox}}&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local navbar = require('Module:Navbar')._navbar&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
&lt;br /&gt;
local args&lt;br /&gt;
local border&lt;br /&gt;
local listnums&lt;br /&gt;
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'&lt;br /&gt;
local RESTART_MARKER = '\127_ODDEVEN0_\127'&lt;br /&gt;
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'&lt;br /&gt;
&lt;br /&gt;
local function striped(wikitext)&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 = '[[Category:Navbox orphans]]'&lt;br /&gt;
	if border == 'subgroup' and args.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 = 'odd', 'even'&lt;br /&gt;
	if args.evenodd then&lt;br /&gt;
		if args.evenodd == 'swap' then&lt;br /&gt;
			first, second = second, first&lt;br /&gt;
		else&lt;br /&gt;
			first = args.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 == '0' 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('([%[%]])', '%%%1')&lt;br /&gt;
	return (wikitext:gsub(regex, ''):gsub(REGEX_MARKER, 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) == '{|' 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 '\n' .. item ..'\n'&lt;br /&gt;
	end&lt;br /&gt;
	if nowrapitems == 'yes' then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for line in (item .. '\n'):gmatch('([^\n]*)\n') do&lt;br /&gt;
			local prefix, content = line:match('^([*:;#]+)%s*(.*)')&lt;br /&gt;
			if prefix and not content:match('^&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;') then&lt;br /&gt;
				line = prefix .. '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;' .. content .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(lines, line)&lt;br /&gt;
		end&lt;br /&gt;
		item = table.concat(lines, '\n')&lt;br /&gt;
	end&lt;br /&gt;
	if item:match('^[*:;#]') then&lt;br /&gt;
		return '\n' .. item ..'\n'&lt;br /&gt;
	end&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	if args.navbar ~= 'off' and args.navbar ~= 'plain' and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then&lt;br /&gt;
		titleCell:wikitext(navbar{&lt;br /&gt;
			args.name,&lt;br /&gt;
			mini = 1,&lt;br /&gt;
			fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;'&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
local function renderTitleRow(tbl)&lt;br /&gt;
	if not args.title then return end&lt;br /&gt;
&lt;br /&gt;
	local titleRow = tbl:tag('tr')&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleRow&lt;br /&gt;
			:tag('th')&lt;br /&gt;
				:attr('scope', 'row')&lt;br /&gt;
				:addClass('navbox-group')&lt;br /&gt;
				:addClass(args.titlegroupclass)&lt;br /&gt;
				:cssText(args.basestyle)&lt;br /&gt;
				:cssText(args.groupstyle)&lt;br /&gt;
				:cssText(args.titlegroupstyle)&lt;br /&gt;
				:wikitext(args.titlegroup)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleCell = titleRow:tag('th'):attr('scope', 'col')&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleCell&lt;br /&gt;
			:css('border-left', '2px solid #fdfdfd')&lt;br /&gt;
			:css('width', '100%')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleColspan = 2&lt;br /&gt;
	if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:cssText(args.basestyle)&lt;br /&gt;
		:cssText(args.titlestyle)&lt;br /&gt;
		:addClass('navbox-title')&lt;br /&gt;
		:attr('colspan', titleColspan)&lt;br /&gt;
&lt;br /&gt;
	renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			-- id for aria-labelledby attribute&lt;br /&gt;
			:attr('id', mw.uri.anchorEncode(args.title))&lt;br /&gt;
			:addClass(args.titleclass)&lt;br /&gt;
			:css('font-size', '114%')&lt;br /&gt;
			:css('margin', '0 4em')&lt;br /&gt;
			:wikitext(processItem(args.title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function getAboveBelowColspan()&lt;br /&gt;
	local ret = 2&lt;br /&gt;
	if args.imageleft then ret = ret + 1 end&lt;br /&gt;
	if args.image then ret = ret + 1 end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow(tbl)&lt;br /&gt;
	if not args.above then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag('tr')&lt;br /&gt;
		:tag('td')&lt;br /&gt;
			:addClass('navbox-abovebelow')&lt;br /&gt;
			:addClass(args.aboveclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.abovestyle)&lt;br /&gt;
			:attr('colspan', getAboveBelowColspan())&lt;br /&gt;
			:tag('div')&lt;br /&gt;
				-- id for aria-labelledby attribute, if no title&lt;br /&gt;
				:attr('id', args.title and nil or mw.uri.anchorEncode(args.above))&lt;br /&gt;
				:wikitext(processItem(args.above, args.nowrapitems))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow(tbl)&lt;br /&gt;
	if not args.below then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag('tr')&lt;br /&gt;
		:tag('td')&lt;br /&gt;
			:addClass('navbox-abovebelow')&lt;br /&gt;
			:addClass(args.belowclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.belowstyle)&lt;br /&gt;
			:attr('colspan', getAboveBelowColspan())&lt;br /&gt;
			:tag('div')&lt;br /&gt;
				:wikitext(processItem(args.below, args.nowrapitems))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
local function renderListRow(tbl, index, listnum)&lt;br /&gt;
	local row = tbl:tag('tr')&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.imageleft then&lt;br /&gt;
		row&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:addClass('navbox-image')&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css('width', '1px')               -- Minimize width&lt;br /&gt;
				:css('padding', '0px 2px 0px 0px')&lt;br /&gt;
				:cssText(args.imageleftstyle)&lt;br /&gt;
				:attr('rowspan', #listnums)&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:wikitext(processItem(args.imageleft))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args['group' .. listnum] then&lt;br /&gt;
		local groupCell = row:tag('th')&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.title or args.above or args.group2) then&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr('id', mw.uri.anchorEncode(args.group1))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:attr('scope', 'row')&lt;br /&gt;
			:addClass('navbox-group')&lt;br /&gt;
			:addClass(args.groupclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:cssText(args.groupstyle)&lt;br /&gt;
			:cssText(args['group' .. listnum .. 'style'])&lt;br /&gt;
			:wikitext(args['group' .. listnum])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listCell = row:tag('td')&lt;br /&gt;
&lt;br /&gt;
	if args['group' .. listnum] then&lt;br /&gt;
		listCell&lt;br /&gt;
			:css('text-align', 'left')&lt;br /&gt;
			:css('border-left-width', '2px')&lt;br /&gt;
			:css('border-left-style', 'solid')&lt;br /&gt;
	else&lt;br /&gt;
		listCell:attr('colspan', 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.groupwidth then&lt;br /&gt;
		listCell:css('width', '100%')&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.oddstyle&lt;br /&gt;
	else&lt;br /&gt;
		rowstyle = args.evenstyle&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listText = args['list' .. listnum]&lt;br /&gt;
	local oddEven = ODD_EVEN_MARKER&lt;br /&gt;
	if listText:sub(1, 12) == '&amp;lt;/div&amp;gt;&amp;lt;table' 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('&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;') and RESTART_MARKER or 'odd'&lt;br /&gt;
	end&lt;br /&gt;
	listCell&lt;br /&gt;
		:css('padding', '0px')&lt;br /&gt;
		:cssText(args.liststyle)&lt;br /&gt;
		:cssText(rowstyle)&lt;br /&gt;
		:cssText(args['list' .. listnum .. 'style'])&lt;br /&gt;
		:addClass('navbox-list')&lt;br /&gt;
		:addClass('navbox-' .. oddEven)&lt;br /&gt;
		:addClass(args.listclass)&lt;br /&gt;
		:addClass(args['list' .. listnum .. 'class'])&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em')&lt;br /&gt;
			:wikitext(processItem(listText, args.nowrapitems))&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.image then&lt;br /&gt;
		row&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:addClass('navbox-image')&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css('width', '1px')               -- Minimize width&lt;br /&gt;
				:css('padding', '0px 0px 0px 2px')&lt;br /&gt;
				:cssText(args.imagestyle)&lt;br /&gt;
				:attr('rowspan', #listnums)&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:wikitext(processItem(args.image))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function needsHorizontalLists()&lt;br /&gt;
	if border == 'subgroup' or args.tracking == 'no' then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local listClasses = {&lt;br /&gt;
		['plainlist'] = true, ['hlist'] = true, ['hlist hnum'] = true,&lt;br /&gt;
		['hlist hwrap'] = true, ['hlist vcard'] = true, ['vcard hlist'] = true,&lt;br /&gt;
		['hlist vevent'] = true,&lt;br /&gt;
	}&lt;br /&gt;
	return not (listClasses[args.listclass] or listClasses[args.bodyclass])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBackgroundColors()&lt;br /&gt;
	for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do&lt;br /&gt;
		if tostring(args[key]):find('background', 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBorders()&lt;br /&gt;
	for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do&lt;br /&gt;
		if tostring(args[key]):find('border', 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isIllegible()&lt;br /&gt;
	local styleratio = require('Module:Color contrast')._styleratio&lt;br /&gt;
&lt;br /&gt;
	for key, style in pairs(args) do&lt;br /&gt;
		if tostring(key):match(&amp;quot;style$&amp;quot;) 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()&lt;br /&gt;
	local cats = {}&lt;br /&gt;
	if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end&lt;br /&gt;
	if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end&lt;br /&gt;
	if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end&lt;br /&gt;
	if hasBorders() then table.insert(cats, 'Navboxes using borders') end&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories(builder)&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 == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(getTrackingCategories()) do&lt;br /&gt;
		builder:wikitext('[[Category:' .. cat .. ']]')&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
local function renderMainTable()&lt;br /&gt;
	local tbl = mw.html.create('table')&lt;br /&gt;
		:addClass('nowraplinks')&lt;br /&gt;
		:addClass(args.bodyclass)&lt;br /&gt;
&lt;br /&gt;
	if args.title and (args.state ~= 'plain' and args.state ~= 'off') then&lt;br /&gt;
		if args.state == 'collapsed' then args.state = 'mw-collapsed' end&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass('mw-collapsible')&lt;br /&gt;
			:addClass(args.state or 'autocollapse')&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl:css('border-spacing', 0)&lt;br /&gt;
	if border == 'subgroup' or border == 'none' then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass('navbox-subgroup')&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
			:cssText(args.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('navbox-inner')&lt;br /&gt;
			:css('background', 'transparent')&lt;br /&gt;
			:css('color', 'inherit')&lt;br /&gt;
	end&lt;br /&gt;
	tbl:cssText(args.innerstyle)&lt;br /&gt;
&lt;br /&gt;
	renderTitleRow(tbl)&lt;br /&gt;
	renderAboveRow(tbl)&lt;br /&gt;
	for i, listnum in ipairs(listnums) do&lt;br /&gt;
		renderListRow(tbl, i, listnum)&lt;br /&gt;
	end&lt;br /&gt;
	renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
	args = navboxArgs&lt;br /&gt;
	listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			local listnum = k:match('^list(%d+)$')&lt;br /&gt;
			if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	border = mw.text.trim(args.border or args[1] or '')&lt;br /&gt;
	if border == 'child' then&lt;br /&gt;
		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()&lt;br /&gt;
&lt;br /&gt;
	-- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	if border == 'none' then&lt;br /&gt;
		local nav = res:tag('div')&lt;br /&gt;
			:attr('role', 'navigation')&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args.title or args.above or (args.group1 and not args.group2) then&lt;br /&gt;
			nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr('aria-label', 'Navbox')&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == 'subgroup' then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
		-- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
		-- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent's &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext('&amp;lt;/div&amp;gt;')&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext('&amp;lt;div&amp;gt;')&lt;br /&gt;
	else&lt;br /&gt;
		local nav = res:tag('div')&lt;br /&gt;
			:attr('role', 'navigation')&lt;br /&gt;
			:addClass('navbox')&lt;br /&gt;
			:addClass(args.navboxclass)&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
			:cssText(args.style)&lt;br /&gt;
			:css('padding', '3px')&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args.title or args.above or (args.group1 and not args.group2) then&lt;br /&gt;
			nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr('aria-label', 'Navbox')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args.nocat or 'false'):lower() == 'false' then&lt;br /&gt;
		renderTrackingCategories(res)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
	end&lt;br /&gt;
	args = getArgs(frame, {wrappers = {'Template:Navbox', 'Template:Navbox subgroup'}})&lt;br /&gt;
	if frame.args.border then&lt;br /&gt;
		-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.&lt;br /&gt;
		args.border = frame.args.border&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Read the arguments in the order they'll be output in, to make references number in the right order.&lt;br /&gt;
	local _&lt;br /&gt;
	_ = args.title&lt;br /&gt;
	_ = args.above&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		_ = args[&amp;quot;group&amp;quot; .. tostring(i)]&lt;br /&gt;
		_ = args[&amp;quot;list&amp;quot; .. tostring(i)]&lt;br /&gt;
	end&lt;br /&gt;
	_ = args.below&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Authority_control&amp;diff=70</id>
		<title>Module:Authority control</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Authority_control&amp;diff=70"/>
		<updated>2019-09-23T12:07:14Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require('Module:No globals')&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
local namespace = title.namespace&lt;br /&gt;
local talkspace = (mw.site.talkNamespaces[namespace] ~= nil)&lt;br /&gt;
local testcases = (string.sub(title.subpageText,1,9) == 'testcases')&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                            Category functions                            ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.getCatForId( id )&lt;br /&gt;
	local catName = ''&lt;br /&gt;
	if namespace == 0 then&lt;br /&gt;
		catName = 'Wikipedia articles with '..id..' identifiers'&lt;br /&gt;
	elseif namespace == 2 and not title.isSubpage then&lt;br /&gt;
		catName = 'User pages with '..id..' identifiers'&lt;br /&gt;
	else&lt;br /&gt;
		catName = 'Miscellaneous pages with '..id..' identifiers'&lt;br /&gt;
	end&lt;br /&gt;
	return '[[Category:'..catName..']]'..p.redCatLink(catName)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.redCatLink( catName ) --catName == 'Blah', not 'Category:Blah', not '[[Category:Blah]]'&lt;br /&gt;
	if catName and catName ~= '' and&lt;br /&gt;
	   testcases == false and&lt;br /&gt;
	   mw.title.new(catName, 14).exists == false&lt;br /&gt;
	then&lt;br /&gt;
		return '[[Category:Pages with red-linked authority control categories]]'&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                      Property formatting functions                       ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.iaafLink( id )&lt;br /&gt;
	--P1146's format regex: [0-9][0-9]* (e.g. 012)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.iaaf.org/athletes/_/'..id..' '..id..']'..p.getCatForId( 'IAAF' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.viafLink( id )&lt;br /&gt;
	--P214's format regex: [1-9]\d(\d{0,7}|\d{17,20}) (e.g. 123456789, 1234567890123456789012)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d%d?%d?%d?%d?%d?%d?%d?$' ) and&lt;br /&gt;
	   not string.match( id, '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://viaf.org/viaf/'..id..' '..id..']'..p.getCatForId( 'VIAF' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.kulturnavLink( id )&lt;br /&gt;
	--P1248's format regex: [0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://kulturnav.org/'..id..' '..id..']'..p.getCatForId( 'KULTURNAV' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sikartLink( id )&lt;br /&gt;
	--P781's format regex: \d{7,9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.sikart.ch/KuenstlerInnen.aspx?id='..id..'&amp;amp;lng=en '..id..']'..p.getCatForId( 'SIKART' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tlsLink( id )&lt;br /&gt;
	local id2 = id:gsub(' +', '_')&lt;br /&gt;
	--P1362's format regex: \p{Lu}[\p{L}\d_',\.\-\(\)\*/–]{3,59} (e.g. Abcd)&lt;br /&gt;
	local class = &amp;quot;[%a%d_',%.%-%(%)%*/–]&amp;quot;&lt;br /&gt;
	local regex = &amp;quot;^%u&amp;quot;..string.rep(class, 3)..string.rep(class..&amp;quot;?&amp;quot;, 56)..&amp;quot;$&amp;quot;&lt;br /&gt;
	if not mw.ustring.match( id2, regex ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://tls.theaterwissenschaft.ch/wiki/'..id2..' '..id..']'..p.getCatForId( 'TLS' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ciniiLink( id )&lt;br /&gt;
	--P271's format regex: DA\d{7}[\dX] (e.g. DA12345678)&lt;br /&gt;
	if not string.match( id, '^DA%d%d%d%d%d%d%d[%dX]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://ci.nii.ac.jp/author/'..id..'?l=en '..id..']'..p.getCatForId( 'CINII' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.daaoLink( id )&lt;br /&gt;
	--P1707's format regex: [a-z\-]+\d* (e.g. rolf-harris)&lt;br /&gt;
	if not string.match( id, '^[a-z%-]+%d*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.daao.org.au/bio/'..id..' '..id..']'..p.getCatForId( 'DAAO' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bneLink( id )&lt;br /&gt;
	--P950's format regex: (XX|FF|a)\d{4,7}|(bima|bimo|bica|bis[eo]|bivi|Mise|Mimo|Mima)\d{10} (e.g. XX1234567)&lt;br /&gt;
	if not string.match( id, '^[XF][XF]%d%d%d%d%d?%d?%d?$' ) and&lt;br /&gt;
	   not string.match( id, '^a%d%d%d%d%d?%d?%d?$' ) and&lt;br /&gt;
	   not string.match( id, '^bi[mcsv][aoei]%d%d%d%d%d%d%d%d%d%d$' ) and&lt;br /&gt;
	   not string.match( id, '^Mi[sm][eoa]%d%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://catalogo.bne.es/uhtbin/authoritybrowse.cgi?action=display&amp;amp;authority_id='..id..' '..id..']'..p.getCatForId( 'BNE' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.uscongressLink( id )&lt;br /&gt;
	--P1157's format regex: [A-Z]00[01]\d{3} (e.g. A000123)&lt;br /&gt;
	if not string.match( id, '^[A-Z]00[01]%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://bioguide.congress.gov/scripts/biodisplay.pl?index='..id..' '..id..']'..p.getCatForId( 'USCongress' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.naraLink( id )&lt;br /&gt;
	--P1225's format regex: ^([1-9]\d{0,8})$ (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://catalog.archives.gov/id/'..id..' '..id..']'..p.getCatForId( 'NARA' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.botanistLink( id )&lt;br /&gt;
	--P428's format regex: ('t )?(d')?(de )?(la )?(van (der )?)?(Ma?c)?(De)?(Di)?\p{Lu}?C?['\p{Ll}]*([-'. ]*(van )?(y )?(d[ae][nr]?[- ])?(Ma?c)?[\p{Lu}bht]?C?['\p{Ll}]*)*\.? ?f?\.? (e.g. L.)&lt;br /&gt;
	--not easily/meaningfully implementable in Lua's regex since &amp;quot;(this)?&amp;quot; is not allowed...&lt;br /&gt;
	if not mw.ustring.match( id, &amp;quot;^[%u%l%d%. '-]+$&amp;quot; ) then --better than nothing&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local id2 = id:gsub(' +', '%%20')&lt;br /&gt;
	return '[https://www.ipni.org/ipni/advAuthorSearch.do?find_abbreviation='..id2..' '..id..']'..p.getCatForId( 'Botanist' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mgpLink( id )&lt;br /&gt;
	--P549's format regex: \d{1,6} (e.g. 123456)&lt;br /&gt;
	if not string.match( id, '^%d%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://genealogy.math.ndsu.nodak.edu/id.php?id='..id..' '..id..']'..p.getCatForId( 'MGP' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rslLink( id )&lt;br /&gt;
	--P947's format regex: \d{1,9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d?%d?%d?%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://aleph.rsl.ru/F?func=find-b&amp;amp;find_code=SYS&amp;amp;adjacent=Y&amp;amp;local_base=RSL11&amp;amp;request='..id..'&amp;amp;CON_LNG=ENG '..id..']'..p.getCatForId( 'RSL' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.leonoreLink( id )&lt;br /&gt;
	--P640's format regex: LH/\d{1,4}/\d{1,3}|19800035/\d{1,4}/\d{1,5}(Bis)?|C/0/\d{1,2} (e.g. LH/2064/18)&lt;br /&gt;
	if not id:match( '^LH/%d%d?%d?%d?/%d%d?%d?$' ) and             --IDs from       LH/1/1 to         LH/2794/54 (legionaries)&lt;br /&gt;
	   not id:match( '^19800035/%d%d?%d?%d?/%d%d?%d?%d?%d?$' ) and --IDs from 19800035/1/1 to 19800035/385/51670 (legionnaires who died 1954-1977 &amp;amp; some who died &amp;lt; 1954)&lt;br /&gt;
	   not id:match( '^C/0/%d%d?$' ) then                          --IDs from        C/0/1 to             C/0/84 (84 famous legionaries)&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.culture.gouv.fr/public/mistral/leonore_fr?ACTION=CHERCHER&amp;amp;FIELD_1=COTE&amp;amp;VALUE_1='..id..' '..id..']'..p.getCatForId( 'Léonore' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sbnLink( id )&lt;br /&gt;
	--P396's format regex: IT\\ICCU\\(\d{10}|\D\D[\D\d]\D\\\d{6}) (e.g. IT\ICCU\CFIV\000163)&lt;br /&gt;
	if not string.match( id, '^IT\\ICCU\\%d%d%d%d%d%d%d%d%d%d$' ) and&lt;br /&gt;
	   not string.match( id, '^IT\\ICCU\\%u%u[%u%d]%u\\%d%d%d%d%d%d$' ) then --legacy: %u used here instead of %D (but the faulty ID cat is empty, out of ~12k uses)&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://opac.sbn.it/opacsbn/opac/iccu/scheda_authority.jsp?bid='..id..' '..id..']'..p.getCatForId( 'SBN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nkcLink( id )&lt;br /&gt;
	--P691's format regex: [a-z]{2,4}[0-9]{2,14} (e.g. abcd12345678901234)&lt;br /&gt;
	if not string.match( id, '^[a-z][a-z][a-z]?[a-z]?%d%d%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://aleph.nkp.cz/F/?func=find-c&amp;amp;local_base=aut&amp;amp;ccl_term=ica='..id..'&amp;amp;CON_LNG=ENG '..id..']'..p.getCatForId( 'NKC' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nclLink( id )&lt;br /&gt;
	--P1048's format regex: \d+ (e.g. 1081436)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://aleweb.ncl.edu.tw/F/?func=accref&amp;amp;acc_sequence='..id..'&amp;amp;CON_LNG=ENG '..id..']'..p.getCatForId( 'NCL' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ndlLink( id )&lt;br /&gt;
	--P349's format regex: 0?\d{8} (e.g. 012345678)&lt;br /&gt;
	if not string.match( id, '^0?%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://id.ndl.go.jp/auth/ndlna/'..id..' '..id..']'..p.getCatForId( 'NDL' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ngvLink( id )&lt;br /&gt;
	--P2041's format regex: \d+ (e.g. 12354)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.ngv.vic.gov.au/explore/collection/artist/'..id..'/ '..id..']'..p.getCatForId( 'NGV' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sudocLink( id )&lt;br /&gt;
	--P269's format regex: (\d{8}[\dX]|) (e.g. 026927608)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d[%dxX]$' ) then --legacy: allow lowercase 'x'&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.idref.fr/'..id..' '..id..']'..p.getCatForId( 'SUDOC' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.hdsLink( id )&lt;br /&gt;
	--P902's format regex: 50\d{3}|[1-4]\d{4}|[1-9]\d{0,3}| (e.g. 50123)&lt;br /&gt;
	if not string.match( id, '^50%d%d%d$' ) and&lt;br /&gt;
	   not string.match( id, '^[1-4]%d%d%d%d$' ) and&lt;br /&gt;
	   not string.match( id, '^[1-9]%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.hls-dhs-dss.ch/textes/f/F'..id..'.php '..id..']'..p.getCatForId( 'HDS' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lirLink( id )&lt;br /&gt;
	--P886's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.e-lir.ch/e-LIR___Lexicon.'..id..'.450.0.html '..id..']'..p.getCatForId( 'LIR' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitLccn( id )&lt;br /&gt;
	--P244's format regex: (n|nb|nr|no|ns|sh)([4-9][0-9]|00|20[0-1][0-9])[0-9]{6} (e.g. n78039510)&lt;br /&gt;
	if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then&lt;br /&gt;
		id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )&lt;br /&gt;
	end&lt;br /&gt;
	if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then&lt;br /&gt;
		return mw.text.split( id, '/' )&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.append(str, c, length)&lt;br /&gt;
	while str:len() &amp;lt; length do&lt;br /&gt;
		str = c .. str&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lccnLink( id )&lt;br /&gt;
	local parts = p.splitLccn( id ) --e.g. n78039510&lt;br /&gt;
	if not parts then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local lccnType = parts[1] ~= 'sh' and 'names' or 'subjects'&lt;br /&gt;
	id = parts[1] .. parts[2] .. p.append( parts[3], '0', 6 )&lt;br /&gt;
	return '[https://id.loc.gov/authorities/'..lccnType..'/'..id..' '..id..']'..p.getCatForId( 'LCCN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbaLink( id )&lt;br /&gt;
	--P434's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/artist/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbareaLink( id )&lt;br /&gt;
	--P982's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/area/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz area' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbiLink( id )&lt;br /&gt;
	--P1330's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/instrument/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz instrument' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mblLink( id )&lt;br /&gt;
	--P966's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/label/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz label' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbpLink( id )&lt;br /&gt;
	--P1004's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/place/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz place' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbrgLink( id )&lt;br /&gt;
	--P436's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/release-group/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz release group' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbsLink( id )&lt;br /&gt;
	--P1407's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/series/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz series' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mbwLink( id )&lt;br /&gt;
	--P435's format regex: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} (e.g. 12345678-1234-1234-1234-1234567890AB)&lt;br /&gt;
	if not string.match( id, '^%x%x%x%x%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%-%x%x%x%x%x%x%x%x%x%x%x%x$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://musicbrainz.org/work/'..id..' '..id..']'..p.getCatForId( 'MusicBrainz work' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Returns the ISNI check digit isni must be a string where the 15 first elements are digits, e.g. 0000000066534145&lt;br /&gt;
function p.getIsniCheckDigit( isni )&lt;br /&gt;
	local total = 0&lt;br /&gt;
	for i = 1, 15 do&lt;br /&gt;
		local digit = isni:byte( i ) - 48 --Get integer value&lt;br /&gt;
		total = (total + digit) * 2&lt;br /&gt;
	end&lt;br /&gt;
	local remainder = total % 11&lt;br /&gt;
	local result = (12 - remainder) % 11&lt;br /&gt;
	if result == 10 then&lt;br /&gt;
		return &amp;quot;X&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return tostring( result )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Validate ISNI (and ORCID) and retuns it as a 16 characters string or returns false if it's invalid&lt;br /&gt;
--See http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier&lt;br /&gt;
function p.validateIsni( id )&lt;br /&gt;
	--P213 (ISNI) format regex: [0-9]{4} [0-9]{4} [0-9]{4} [0-9]{3}[0-9X] (e.g. 0000-0000-6653-4145)&lt;br /&gt;
	--P496 (ORCID) format regex: 0000-000(1-[5-9]|2-[0-9]|3-[0-4])\d{3}-\d{3}[\dX] (e.g. 0000-0002-7398-5483)&lt;br /&gt;
	id = id:gsub( '[ %-]', '' ):upper()&lt;br /&gt;
	if not id:match( '^%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d[%dX]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	if p.getIsniCheckDigit( id ) ~= string.char( id:byte( 16 ) ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.isniLink( id )&lt;br /&gt;
	id = p.validateIsni( id ) --e.g. 0000-0000-6653-4145&lt;br /&gt;
	if not id then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://isni.org/isni/'..id..' '..id:sub( 1, 4 )..' '..id:sub( 5, 8 )..' '..id:sub( 9, 12 )..' '..id:sub( 13, 16 )..']'..p.getCatForId( 'ISNI' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.orcidLink( id )&lt;br /&gt;
	id = p.validateIsni( id ) --e.g. 0000-0002-7398-5483&lt;br /&gt;
	if not id then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	id = id:sub( 1, 4 )..'-'..id:sub( 5, 8 )..'-'..id:sub( 9, 12 )..'-'..id:sub( 13, 16 )&lt;br /&gt;
	return '[https://orcid.org/'..id..' '..id..']'..p.getCatForId( 'ORCID' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.gndLink( id )&lt;br /&gt;
	--P227's format regex: (1|1[01])\d{7}[0-9X]|[47]\d{6}-\d|[1-9]\d{0,7}-[0-9X]|3\d{7}[0-9X] (e.g. 4079154-3)&lt;br /&gt;
	if not string.match( id, '^1[01]?%d%d%d%d%d%d%d[0-9X]$' ) and&lt;br /&gt;
	   not string.match( id, '^[47]%d%d%d%d%d%d%-%d$' ) and&lt;br /&gt;
	   not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%-[0-9X]$' ) and&lt;br /&gt;
	   not string.match( id, '^3%d%d%d%d%d%d%d[0-9X]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://d-nb.info/gnd/'..id..' '..id..']'..p.getCatForId( 'GND' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.selibrLink( id )&lt;br /&gt;
	--P906's format regex: [1-9]\d{4,5} (e.g. 123456)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d%d%d%d%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://libris.kb.se/auth/'..id..' '..id..']'..p.getCatForId( 'SELIBR' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bnfLink( id )&lt;br /&gt;
	--P268's format regex: \d{8}[0-9bcdfghjkmnpqrstvwxz] (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^c?b?%d%d%d%d%d%d%d%d[0-9bcdfghjkmnpqrstvwxz]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--Add cb prefix if it has been removed&lt;br /&gt;
	if not string.match( id, '^cb.+$' ) then&lt;br /&gt;
		id = 'cb'..id&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://catalogue.bnf.fr/ark:/12148/'..id..' '..id..'] [https://data.bnf.fr/ark:/12148/'..id..' (data)]'..p.getCatForId( 'BNF' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bpnLink( id )&lt;br /&gt;
	--P651's format regex: \d{8} (e.g. 12345678)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.biografischportaal.nl/en/persoon/'..id..' '..id..']'..p.getCatForId( 'BPN' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ridLink( id )&lt;br /&gt;
	--P1053's format regex: [A-Z]-\d{4}-(19|20)\d\d (e.g. A-1234-1934)&lt;br /&gt;
	if not string.match( id, '^[A-Z]%-%d%d%d%d%-19%d%d$' ) and&lt;br /&gt;
	   not string.match( id, '^[A-Z]%-%d%d%d%d%-20%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.researcherid.com/rid/'..id..' '..id..']'..p.getCatForId( 'RID' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bibsysLink( id )&lt;br /&gt;
	--P1015's format regex: [1-9]\d* or [1-9](\d{0,8}|\d{12}) (e.g. 1234567890123)&lt;br /&gt;
	--TODO: follow up @ [[d:Property talk:P1015#Discrepancy between the 2 regex constraints]] or escalate/investigate&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?$' ) and&lt;br /&gt;
	   not string.match( id, '^[1-9]%d%d%d%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://authority.bibsys.no/authority/rest/authorities/html/'..id..' '..id..']'..p.getCatForId( 'BIBSYS' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ulanLink( id )&lt;br /&gt;
	--P245's format regex: 500\d{6} (e.g. 500123456)&lt;br /&gt;
	if not string.match( id, '^500%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.getty.edu/vow/ULANFullDisplay?find=&amp;amp;role=&amp;amp;nation=&amp;amp;subjectid='..id..' '..id..']'..p.getCatForId( 'ULAN' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nlaLink( id )&lt;br /&gt;
	--P409's format regex: [1-9][0-9]{0,11} (e.g. 123456789012)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://nla.gov.au/anbd.aut-an'..id..' '..id..']'..p.getCatForId( 'NLA' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nlapersonLink( id )&lt;br /&gt;
	--P1315's format regex: [1-9]\d{5,7} (e.g. 12345678)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d%d%d%d%d%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://trove.nla.gov.au/people/'..id..' '..id..']'..p.getCatForId( 'NLA-person' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rkdartistsLink( id )&lt;br /&gt;
	--P650's format regex: [1-9]\d{0,5} (e.g. 123456)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://rkd.nl/en/explore/artists/'..id..' '..id..']'..p.getCatForId( 'RKDartists' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.snacLink( id )&lt;br /&gt;
	--P3430's format regex: \d*[A-Za-z][0-9A-Za-z]* (e.g. A)&lt;br /&gt;
	if not string.match( id, '^%d*[A-Za-z][0-9A-Za-z]*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://socialarchive.iath.virginia.edu/ark:/99166/'..id..' '..id..']'..p.getCatForId( 'SNAC-ID' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dblpLink( id )&lt;br /&gt;
	--P2456's format regex: \d{2,3} /\d+(-\d+)?|[a-z] /[a-zA-Z][0-9A-Za-z]*(-\d+)? (e.g. 123/123)&lt;br /&gt;
	if not string.match( id, '^%d%d%d?/%d+$' ) and&lt;br /&gt;
	   not string.match( id, '^%d%d%d?/%d+%-%d+$' ) and&lt;br /&gt;
	   not string.match( id, '^[a-z]/[a-zA-Z][0-9A-Za-z]*$' ) and&lt;br /&gt;
	   not string.match( id, '^[a-z]/[a-zA-Z][0-9A-Za-z]*%-%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://dblp.org/pid/'..id..' '..id..']'..p.getCatForId( 'DBLP' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.aagLink( id )&lt;br /&gt;
	--P3372's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.aucklandartgallery.com/explore-art-and-ideas/artist/'..id..'/ '..id..']'..p.getCatForId( 'AAG' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.acmLink( id )&lt;br /&gt;
	--P864's format regex: \d{11} (e.g. 12345678901)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://dl.acm.org/author_page.cfm?id='..id..' '..id..']'..p.getCatForId( 'ACM-DL' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.adbLink( id )&lt;br /&gt;
	--P1907's format regex: [a-z][-a-z]+-([1-2]\d|[1-9])\d{0,3} (e.g. barton-sir-edmund-toby-71)&lt;br /&gt;
	if not string.match( id, '^[a-z][-a-z]+-[1-2]%d%d?%d?%d?$' ) and&lt;br /&gt;
	   not string.match( id, '^[a-z][-a-z]+-[1-9]%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://adb.anu.edu.au/biography/'..id..' '..id..']'..p.getCatForId( 'ADB' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.agsaLink( id )&lt;br /&gt;
	--P6804's format regex: [1-9]\d* (e.g. 3625)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.agsa.sa.gov.au/collection-publications/collection/creators/_/'..id..'/ '..id..']'..p.getCatForId( 'AGSA' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.autoresuyLink( id )&lt;br /&gt;
	--P2558's format regex: [1-9]\d{0,4} (e.g. 12345)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://autores.uy/autor/'..id..' '..id..']'..p.getCatForId( 'autores.uy' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.awrLink( id )&lt;br /&gt;
	--P4186's format regex: (([A-Z]{3}\d{4})|([A-Z]{2}\d{5}))[a-z] (e.g. PR00768b)&lt;br /&gt;
	if not string.match( id, '^[A-Z][A-Z][A-Z]%d%d%d%d[a-z]$' ) and&lt;br /&gt;
	   not string.match( id, '^[A-Z][A-Z]%d%d%d%d%d[a-z]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.womenaustralia.info/biogs/'..id..'.htm '..id..']'..p.getCatForId( 'AWR' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.picLink( id )&lt;br /&gt;
	--P2750's format regex: [1-9]\d* (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://pic.nypl.org/constituents/'..id..' '..id..']'..p.getCatForId( 'PIC' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bildLink( id )&lt;br /&gt;
	--P2092's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.bildindex.de/document/obj'..id..' '..id..']'..p.getCatForId( 'Bildindex' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.jocondeLink( id )&lt;br /&gt;
	--P347's format regex: [\-0-9A-Za-z]{11} (e.g. 12345678901)&lt;br /&gt;
	local regex = '^'..string.rep('[%-0-9A-Za-z]', 11)..'$'&lt;br /&gt;
	if not string.match( id, regex ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www2.culture.gouv.fr/public/mistral/joconde_fr?ACTION=CHERCHER&amp;amp;FIELD_1=REF&amp;amp;VALUE_1='..id..' '..id..']'..p.getCatForId( 'Joconde' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rkdidLink( id )&lt;br /&gt;
	--P350's format regex: [1-9]\d{0,5} (e.g. 123456)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d?%d?%d?%d?%d?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://rkd.nl/nl/explore/images/'..id..' '..id..']'..p.getCatForId( 'RKDID' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.balatLink( id )&lt;br /&gt;
	--P3293's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://balat.kikirpa.be/object/104257'..id..' '..id..']'..p.getCatForId( 'BALaT' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lnbLink( id )&lt;br /&gt;
	--P1368's format regex: \d{9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://kopkatalogs.lv/F?func=direct&amp;amp;local_base=lnc10&amp;amp;doc_number='..id..'&amp;amp;P_CON_LNG=ENG '..id..']'..p.getCatForId( 'LNB' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nskLink( id )&lt;br /&gt;
	--P1375's format regex: \d{9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://katalog.nsk.hr/F/?func=direct&amp;amp;doc_number='..id..'&amp;amp;local_base=nsk10 '..id..']'..p.getCatForId( 'NSK' ) --no https yet (10/2018)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.iciaLink( id )&lt;br /&gt;
	--P1736's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.imj.org.il/artcenter/newsite/en/?artist='..id..' '..id..']'..p.getCatForId( 'ICIA' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ta98Link( id )&lt;br /&gt;
	--P1323's format regex: A\d{2}\.\d\.\d{2}\.\d{3}[FM]? (e.g. A12.3.45.678)&lt;br /&gt;
	if not string.match( id, '^A%d%d%.%d%.%d%d%.%d%d%d[FM]?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://tools.wmflabs.org/wikidata-externalid-url/?p=1323&amp;amp;url_prefix=https:%2F%2Fwww.unifr.ch%2Fifaa%2FPublic%2FEntryPage%2FTA98%20Tree%2FEntity%20TA98%20EN%2F&amp;amp;url_suffix=%20Entity%20TA98%20EN.htm&amp;amp;id='..id..' '..id..']'..p.getCatForId( 'TA98' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.teLink( id )&lt;br /&gt;
	--P1693's format regex: E[1-8]\.\d{1,2}\.\d{1,2}\.\d{1,2}\.\d{1}\.\d{1}\.\d{1,3} (e.g. E1.23.45.67.8.9.0)&lt;br /&gt;
	local e1, e2 = string.match( id, '^E([1-8])%.(%d%d?)%.%d%d?%.%d%d?%.%d%.%d%.%d%d?%d?$' )&lt;br /&gt;
	if not e1 then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local TEnum = 'TEe0'..e1 --no formatter URL in WD, probably due to this complexity&lt;br /&gt;
	if e1 == '5' or e1 == '7' then&lt;br /&gt;
		if #e2 == 1 then e2 = '0'..e2 end&lt;br /&gt;
		TEnum = TEnum..e2&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTE/'..TEnum..'.html '..id..']'..p.getCatForId( 'TE' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tepapaLink( id )&lt;br /&gt;
	--P3544's format regex: \d+ (e.g. 1)&lt;br /&gt;
	if not string.match( id, '^%d+$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://collections.tepapa.govt.nz/agent/'..id..' '..id..']'..p.getCatForId( 'TePapa' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.thLink( id )&lt;br /&gt;
	--P1694's format regex: H\d\.\d{2}\.\d{2}\.\d\.\d{5} (e.g. H1.23.45.6.78901)&lt;br /&gt;
	local h1, h2 = string.match( id, '^H(%d)%.(%d%d)%.%d%d%.%d%.%d%d%d%d%d$' )&lt;br /&gt;
	if not h1 then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local THnum = 'THh'..h1..h2 --no formatter URL in WD, probably due to this complexity&lt;br /&gt;
	return '[http://www.unifr.ch/ifaa/Public/EntryPage/ViewTH/'..THnum..'.html '..id..']'..p.getCatForId( 'TH' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dsiLink( id )&lt;br /&gt;
	--P2349's format regex: [1-9]\d* (e.g. 1538)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.uni-stuttgart.de/hi/gnt/dsi2/index.php?table_name=dsi&amp;amp;function=details&amp;amp;where_field=id&amp;amp;where_value='..id..' '..id..']'..p.getCatForId( 'DSI' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.s2authoridLink( id )&lt;br /&gt;
	--P4012's format regex: [1-9]\d* (e.g. 1796130)&lt;br /&gt;
	if not string.match( id, '^[1-9]%d*$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://www.semanticscholar.org/author/'..id..' '..id..']'..p.getCatForId( 'Semantic Scholar author' ) --special category name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nliLink( id )&lt;br /&gt;
	--P949's format regex: \d{9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://aleph.nli.org.il/F/?func=find-b&amp;amp;local_base=NNL10&amp;amp;find_code=SYS&amp;amp;con_lng=eng&amp;amp;request='..id..' '..id..']'..p.getCatForId( 'NLI' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nlpLink( id )&lt;br /&gt;
	--P1695's format regex: 9810[0-9]\d* or A[0-9]{7}[0-9X] (e.g. 9810123456789012345 or A10414836)&lt;br /&gt;
	if not string.match( id, '^9810%d+$' ) and&lt;br /&gt;
	   not string.match( id, '^A%d%d%d%d%d%d%d[%dX]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[https://tools.wmflabs.org/wikidata-externalid-url?p=1695&amp;amp;id='..id..' '..id..']'..p.getCatForId( 'NLP' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.reroLink( id )&lt;br /&gt;
	--P3065's format regex: 0[1-2]-[A-Z0-9]{1,10} (e.g. 02-A012345678)&lt;br /&gt;
	if not string.match( id, '^0[1-2]%-[A-Z%d][A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?[A-Z%d]?$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://data.rero.ch/'..id..' '..id..']'..p.getCatForId( 'RERO' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nlrLink( id )&lt;br /&gt;
	--P1003's format regex: \d{9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://alephnew.bibnat.ro:8991/F?func=find-b&amp;amp;request='..id..'&amp;amp;find_code=SYS&amp;amp;adjacent=Y&amp;amp;local_base=NLR10 '..id..']'..p.getCatForId( 'NLR' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ntaLink( id )&lt;br /&gt;
	--P1006's format regex: \d{8}[\dX] (e.g. 12345678X)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d[%dX]$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://data.bibliotheken.nl/id/thes/p'..id..' '..id..']'..p.getCatForId( 'NTA' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bncLink( id )&lt;br /&gt;
	--P1890's format regex: \d{9} (e.g. 123456789)&lt;br /&gt;
	if not string.match( id, '^%d%d%d%d%d%d%d%d%d$' ) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return '[http://www.bncatalogo.cl/F?func=direct&amp;amp;local_base=red10&amp;amp;doc_number='..id..' '..id..']'..p.getCatForId( 'BNC' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[          Wikidata, navigation bar, and documentation functions           ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.getIdsFromWikidata( itemId, property )&lt;br /&gt;
	local ids = {}&lt;br /&gt;
	local statements = mw.wikibase.getBestStatements( itemId, property )&lt;br /&gt;
	if statements then&lt;br /&gt;
		for _, statement in ipairs( statements ) do&lt;br /&gt;
			if statement.mainsnak.datavalue then&lt;br /&gt;
				table.insert( ids, statement.mainsnak.datavalue.value )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ids&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.matchesWikidataRequirements( itemId, reqs )&lt;br /&gt;
	for _, group in ipairs( reqs ) do&lt;br /&gt;
		local property = 'P'..group[1]&lt;br /&gt;
		local qid = group[2]&lt;br /&gt;
		local statements = mw.wikibase.getBestStatements( itemId, property )&lt;br /&gt;
		if statements then&lt;br /&gt;
			for _, statement in ipairs( statements ) do&lt;br /&gt;
				if statement.mainsnak.datavalue then&lt;br /&gt;
					if statement.mainsnak.datavalue.value['numeric-id'] == qid then&lt;br /&gt;
						return true&lt;br /&gt;
	end	end	end	end	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.createRow( id, label, rawValue, link, withUid, specialCat )&lt;br /&gt;
	if link then&lt;br /&gt;
		if withUid then&lt;br /&gt;
			return '*&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;'..label..' &amp;lt;span class=&amp;quot;uid&amp;quot;&amp;gt;'..link..'&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;\n'&lt;br /&gt;
		end&lt;br /&gt;
		return '*&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;'..label..' '..link..'&amp;lt;/span&amp;gt;\n'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local catName = 'Wikipedia articles with faulty '..(specialCat or id)..' identifiers'&lt;br /&gt;
	return '* &amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;The '..id..' id '..rawValue..' is not valid.&amp;lt;/span&amp;gt;[[Category:'..catName..']]'..p.redCatLink(catName)..'\n'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates a human-readable standalone wikitable version of p.conf, and tracking categories with page counts, for use in the documentation&lt;br /&gt;
function p.docConfTable( frame )&lt;br /&gt;
	local wikiTable = '{| class=&amp;quot;wikitable sortable&amp;quot;\n'..&lt;br /&gt;
					  '! rowspan=2 | Parameter\n'..&lt;br /&gt;
					  '! rowspan=2 | Label\n'..&lt;br /&gt;
					  '! rowspan=2; data-sort-type=number | Wikidata property\n'..&lt;br /&gt;
					  '! colspan=4 | Tracking categories and page counts\n'..&lt;br /&gt;
					  '|-\n'..&lt;br /&gt;
					  '! Articles\n'..&lt;br /&gt;
					  '! User pages\n'..&lt;br /&gt;
					  '! Misc. pages\n'..&lt;br /&gt;
					  '! Faulty IDs\n'..&lt;br /&gt;
					  '|-\n'&lt;br /&gt;
	&lt;br /&gt;
	local lang = mw.getContentLanguage()&lt;br /&gt;
	for _, conf in pairs( p.conf ) do&lt;br /&gt;
		local param, link, pid = conf[1], conf[2], conf[3]&lt;br /&gt;
		local category = conf.category or param&lt;br /&gt;
		local args = { id = 'f', pid }&lt;br /&gt;
		local wpl = frame:expandTemplate{ title = 'Wikidata property link', args = args }&lt;br /&gt;
		--cats&lt;br /&gt;
		local articleCat = 'Wikipedia articles with '..category..' identifiers'&lt;br /&gt;
		local userCat =    'User pages with '..category..' identifiers'&lt;br /&gt;
		local miscCat =    'Miscellaneous pages with '..category..' identifiers'&lt;br /&gt;
		local faultyCat =  'Wikipedia articles with faulty '..category..' identifiers'&lt;br /&gt;
		--counts&lt;br /&gt;
		local articleCount = lang:formatNum( mw.site.stats.pagesInCategory(articleCat, 'pages') )&lt;br /&gt;
		local userCount =    lang:formatNum( mw.site.stats.pagesInCategory(userCat, 'pages') )&lt;br /&gt;
		local miscCount =    lang:formatNum( mw.site.stats.pagesInCategory(miscCat, 'pages') )&lt;br /&gt;
		local faultyCount =  lang:formatNum( mw.site.stats.pagesInCategory(faultyCat, 'pages') )&lt;br /&gt;
		--concat&lt;br /&gt;
		wikiTable = wikiTable..'\n'..&lt;br /&gt;
					'|-\n'..&lt;br /&gt;
					'||'..param..&lt;br /&gt;
					'||'..link..&lt;br /&gt;
					'||data-sort-value='..pid..'|'..wpl..&lt;br /&gt;
					'||style=&amp;quot;text-align: right;&amp;quot;|[[:Category:'..articleCat..'|'..articleCount..']]'..&lt;br /&gt;
					'||style=&amp;quot;text-align: right;&amp;quot;|[[:Category:'..   userCat..'|'..   userCount..']]'..&lt;br /&gt;
					'||style=&amp;quot;text-align: right;&amp;quot;|[[:Category:'..   miscCat..'|'..   miscCount..']]'..&lt;br /&gt;
					'||style=&amp;quot;text-align: right;&amp;quot;|[[:Category:'.. faultyCat..'|'.. faultyCount..']]'&lt;br /&gt;
	end&lt;br /&gt;
	return wikiTable..'\n|}'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                              Configuration                               ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
-- Check that the Wikidata item has this property--&amp;gt;value before adding it&lt;br /&gt;
local reqs = {}&lt;br /&gt;
&lt;br /&gt;
-- Parameter format: { parameter name, label, propertyId # in Wikidata, formatting/validation function }&lt;br /&gt;
p.conf = {&lt;br /&gt;
	{ 'AAG', '[[Auckland Art Gallery Toi o Tāmaki|AAG]]', 3372, p.aagLink },&lt;br /&gt;
	{ 'ACM-DL', '[[ACM Digital Library|ACM DL]]', 864, p.acmLink },&lt;br /&gt;
	{ 'ADB', '[[Australian Dictionary of Biography|ADB]]', 1907, p.adbLink },&lt;br /&gt;
	{ 'AGSA', '[[Art Gallery of South Australia|AGSA]]', 6804, p.agsaLink },&lt;br /&gt;
	{ 'autores.uy', '[[autores.uy]]', 2558, p.autoresuyLink },&lt;br /&gt;
	{ 'AWR', '[[Australian Women\'s Register|AWR]]', 4186, p.awrLink },&lt;br /&gt;
	{ 'BALaT', '[[Royal Institute for Cultural Heritage#Online artworks pages|BALaT]]', 3293, p.balatLink },&lt;br /&gt;
	{ 'BIBSYS', '[[Bibsys|BIBSYS]]', 1015, p.bibsysLink },&lt;br /&gt;
	{ 'Bildindex', '[[Marburg Picture Index|Bildindex]]', 2092, p.bildLink },&lt;br /&gt;
	{ 'BNC', '[[Biblioteca Nacional de Chile|BNC]]', 1890, p.bncLink }, --initially commented due to excessive WD ID errors (many bad IDs since removed)&lt;br /&gt;
	{ 'BNE', '[[Biblioteca Nacional de España|BNE]]', 950, p.bneLink },&lt;br /&gt;
	{ 'BNF', '[[Bibliothèque nationale de France|BNF]]', 268, p.bnfLink },&lt;br /&gt;
	{ 'Botanist', '[[Author citation (botany)|Botanist]]', 428, p.botanistLink },&lt;br /&gt;
	{ 'BPN', '[[Biografisch Portaal|BPN]]', 651, p.bpnLink },&lt;br /&gt;
	{ 'CINII', '[[CiNii]]', 271, p.ciniiLink },&lt;br /&gt;
	{ 'DAAO', '[[Dictionary of Australian Artists|DAAO]]', 1707, p.daaoLink },&lt;br /&gt;
	{ 'DBLP', '[[DBLP]]', 2456, p.dblpLink },&lt;br /&gt;
	{ 'DSI', '[[Stuttgart Database of Scientific Illustrators 1450–1950|DSI]]', 2349, p.dsiLink },&lt;br /&gt;
	{ 'GND', '[[Integrated Authority File|GND]]', 227, p.gndLink },&lt;br /&gt;
	{ 'HDS', '[[Historical Dictionary of Switzerland|HDS]]', 902, p.hdsLink },&lt;br /&gt;
	{ 'IAAF', '[[International Association of Athletics Federations|IAAF]]', 1146, p.iaafLink },&lt;br /&gt;
	{ 'ICIA', '[[Information Center for Israeli Art|ICIA]]', 1736, p.iciaLink },&lt;br /&gt;
	{ 'ISNI', '[[International Standard Name Identifier|ISNI]]', 213, p.isniLink },&lt;br /&gt;
	{ 'Joconde', '[[Joconde]]' , 347, p.jocondeLink },&lt;br /&gt;
	{ 'KULTURNAV', '[[KulturNav]]', 1248, p.kulturnavLink },&lt;br /&gt;
	{ 'LCCN', '[[Library of Congress Control Number|LCCN]]', 244, p.lccnLink },&lt;br /&gt;
	{ 'LIR', '[[Historical Dictionary of Switzerland#Lexicon_Istoric_Retic|LIR]]', 886, p.lirLink },&lt;br /&gt;
	{ 'LNB', '[[National Library of Latvia|LNB]]', 1368, p.lnbLink },&lt;br /&gt;
	{ 'Léonore', '[[Base Léonore|Léonore]]', 640, p.leonoreLink },&lt;br /&gt;
	{ 'MBA', '[[MusicBrainz]]', 434, p.mbaLink, category = 'MusicBrainz' }, --special category name&lt;br /&gt;
	{ 'MBAREA', '[[MusicBrainz]]', 982, p.mbareaLink, category = 'MusicBrainz area' }, --special category name&lt;br /&gt;
	{ 'MBI', '[[MusicBrainz]]', 1330, p.mbiLink, category = 'MusicBrainz instrument' }, --special category name&lt;br /&gt;
	{ 'MBL', '[[MusicBrainz]]', 966, p.mblLink, category = 'MusicBrainz label' }, --special category name&lt;br /&gt;
	{ 'MBP', '[[MusicBrainz]]', 1004, p.mbpLink, category = 'MusicBrainz place' }, --special category name&lt;br /&gt;
	{ 'MBRG', '[[MusicBrainz]] release group', 436, p.mbrgLink, category = 'MusicBrainz release group' }, --special category name&lt;br /&gt;
	{ 'MBS', '[[MusicBrainz]]', 1407, p.mbsLink, category = 'MusicBrainz series' }, --special category name&lt;br /&gt;
	{ 'MBW', '[[MusicBrainz]] work', 435, p.mbwLink, category = 'MusicBrainz work' }, --special category name&lt;br /&gt;
	{ 'MGP', '[[Mathematics Genealogy Project|MGP]]', 549, p.mgpLink },&lt;br /&gt;
	{ 'NARA', '[[National Archives and Records Administration|NARA]]', 1225, p.naraLink },&lt;br /&gt;
	{ 'NCL', '[[National Central Library|NCL]]', 1048, p.nclLink },&lt;br /&gt;
	{ 'NDL', '[[National Diet Library|NDL]]', 349, p.ndlLink },&lt;br /&gt;
	{ 'NGV', '[[National Gallery of Victoria|NGV]]', 2041, p.ngvLink },&lt;br /&gt;
	{ 'NKC', '[[National Library of the Czech Republic|NKC]]', 691, p.nkcLink },&lt;br /&gt;
	{ 'NLA', '[[National Library of Australia|NLA]]', 409, p.nlaLink },&lt;br /&gt;
	{ 'NLA-person', '[[National Library of Australia|NLA-person]]', 1315, p.nlapersonLink },&lt;br /&gt;
	{ 'NLI', '[[National Library of Israel|NLI]]', 949, p.nliLink },&lt;br /&gt;
	{ 'NLP', '[[National Library of Poland|NLP]]', 1695, p.nlpLink },&lt;br /&gt;
	{ 'NLR', '[[National Library of Romania|NLR]]', 1003, p.nlrLink }, --initially commented due to excessive WD ID errors (conflated with National Library of Russia IDs)&lt;br /&gt;
	{ 'NSK', '[[National and University Library in Zagreb|NSK]]', 1375, p.nskLink },&lt;br /&gt;
	{ 'NTA', '[[Royal Library of the Netherlands|NTA]]', 1006, p.ntaLink },&lt;br /&gt;
	{ 'ORCID', '[[ORCID]]', 496, p.orcidLink },&lt;br /&gt;
	{ 'PIC', '[[:d:Q23892012|PIC]]', 2750, p.picLink },&lt;br /&gt;
	{ 'RID', '[[ResearcherID]]', 1053, p.ridLink },&lt;br /&gt;
	{ 'RERO', '[[RERO (Library Network of Western Switzerland)|RERO]]', 3065, p.reroLink }, --initially commented due to excessive WD ID errors (regex fixed/relaxed)&lt;br /&gt;
	{ 'RKDartists', '[[Netherlands Institute for Art History#Online artist pages|RKD]]', 650, p.rkdartistsLink },&lt;br /&gt;
	{ 'RKDID', '[[:d:Q17299580|RKDimages ID]]', 350, p.rkdidLink },&lt;br /&gt;
	{ 'RSL', '[[Russian State Library|RSL]]', 947, p.rslLink },&lt;br /&gt;
	{ 'SBN', '[[Istituto Centrale per il Catalogo Unico|ICCU]]', 396, p.sbnLink },&lt;br /&gt;
	{ 'SELIBR', '[[LIBRIS|SELIBR]]', 906, p.selibrLink },&lt;br /&gt;
	{ 'SIKART', '[[SIKART]]', 781, p.sikartLink },&lt;br /&gt;
	{ 'SNAC-ID', '[[SNAC]]', 3430, p.snacLink },&lt;br /&gt;
	{ 'SUDOC', '[[Système universitaire de documentation|SUDOC]]', 269, p.sudocLink },&lt;br /&gt;
	{ 'S2AuthorId', '[[Semantic Scholar|S2AuthorId]]', 4012, p.s2authoridLink, category = 'Semantic Scholar author' }, --special category name&lt;br /&gt;
	{ 'TA98', '[[Terminologia Anatomica|TA98]]', 1323, p.ta98Link },&lt;br /&gt;
	{ 'TE', '[[Terminologia Embryologica|TE]]', 1693, p.teLink },&lt;br /&gt;
	{ 'TePapa', '[[Museum of New Zealand Te Papa Tongarewa|TePapa]]', 3544, p.tepapaLink },&lt;br /&gt;
	{ 'TH', '[[Terminologia Histologica|TH]]', 1694, p.thLink },&lt;br /&gt;
	{ 'TLS', '[[Theaterlexikon der Schweiz|TLS]]', 1362, p.tlsLink },&lt;br /&gt;
	{ 'ULAN', '[[Union List of Artist Names|ULAN]]', 245, p.ulanLink },&lt;br /&gt;
	{ 'USCongress', '[[Biographical Directory of the United States Congress|US Congress]]', 1157, p.uscongressLink },&lt;br /&gt;
	{ 'VIAF', '[[Virtual International Authority File|VIAF]]', 214, p.viafLink },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Legitimate aliases to p.conf, for convenience&lt;br /&gt;
-- Format: { alias, parameter name in p.conf }&lt;br /&gt;
p.aliases = {&lt;br /&gt;
	{ 'RLS', 'RSL' },&lt;br /&gt;
	{ 'MusicBrainz', 'MBA' },&lt;br /&gt;
	{ 'MusicBrainz artist', 'MBA' },&lt;br /&gt;
	{ 'MusicBrainz label', 'MBL' },&lt;br /&gt;
	{ 'MusicBrainz release group', 'MBRG' },&lt;br /&gt;
	{ 'MusicBrainz work', 'MBW' },&lt;br /&gt;
	{ 'Leonore', 'Léonore' },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Deprecated aliases to p.conf, which also get assigned to a tracking cat&lt;br /&gt;
-- Format: { deprecated parameter name, replacement parameter name in p.conf }&lt;br /&gt;
p.deprecated = {&lt;br /&gt;
	{ 'GKD', 'GND' },&lt;br /&gt;
	{ 'PND', 'GND' },&lt;br /&gt;
	{ 'SWD', 'GND' },&lt;br /&gt;
	{ 'NARA-organization', 'NARA' },&lt;br /&gt;
	{ 'NARA-person', 'NARA' },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                                   Main                                   ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.authorityControl( frame )&lt;br /&gt;
	local resolveEntity = require( &amp;quot;Module:ResolveEntityId&amp;quot; )&lt;br /&gt;
	local parentArgs = frame:getParent().args&lt;br /&gt;
	local elements = {} --create/insert rows later&lt;br /&gt;
	local worldcatCat = ''&lt;br /&gt;
	local suppressedIdCat = ''&lt;br /&gt;
	local deprecatedIdCat = ''&lt;br /&gt;
	&lt;br /&gt;
	--Redirect aliases to proper parameter names&lt;br /&gt;
	for _, a in pairs( p.aliases ) do&lt;br /&gt;
		local alias, param = a[1], a[2]&lt;br /&gt;
		if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[alias] then&lt;br /&gt;
			parentArgs[param] = parentArgs[alias]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--Redirect deprecated parameters to proper parameter names, and assign tracking cat&lt;br /&gt;
	for _, d in pairs( p.deprecated ) do&lt;br /&gt;
		local dep, param = d[1], d[2]&lt;br /&gt;
		if (parentArgs[param] == nil or parentArgs[param] == '') and parentArgs[dep] then&lt;br /&gt;
			parentArgs[param] = parentArgs[dep]&lt;br /&gt;
			if namespace == 0 then&lt;br /&gt;
				deprecatedIdCat = '[[Category:Wikipedia articles with deprecated authority control identifiers|'..dep..']]'&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--Use QID= parameter for testing/example purposes only&lt;br /&gt;
	local itemId = nil&lt;br /&gt;
	if namespace ~= 0 then&lt;br /&gt;
		local qid = parentArgs['qid'] or parentArgs['QID']&lt;br /&gt;
		if qid then&lt;br /&gt;
			itemId = 'Q'..mw.ustring.gsub(qid, '^[Qq]', '')&lt;br /&gt;
			itemId = resolveEntity._id(itemId) --nil if unresolvable&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		itemId = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--Wikidata fallback if requested&lt;br /&gt;
	if itemId then&lt;br /&gt;
		for _, params in ipairs( p.conf ) do&lt;br /&gt;
			if params[3] &amp;gt; 0 then&lt;br /&gt;
				local val = parentArgs[params[1]]&lt;br /&gt;
				if val == nil or val == '' then&lt;br /&gt;
					local canUseWikidata = nil&lt;br /&gt;
					if reqs[params[1]] then&lt;br /&gt;
						canUseWikidata = p.matchesWikidataRequirements( itemId, reqs[params[1]] )&lt;br /&gt;
					else&lt;br /&gt;
						canUseWikidata = true&lt;br /&gt;
					end&lt;br /&gt;
					if canUseWikidata then&lt;br /&gt;
						local wikidataIds = p.getIdsFromWikidata( itemId, 'P'..params[3] )&lt;br /&gt;
						if wikidataIds[1] then&lt;br /&gt;
							if val == '' and (namespace == 0 or testcases) then&lt;br /&gt;
								suppressedIdCat = '[[Category:Wikipedia articles with suppressed authority control identifiers|'..params[1]..']]'&lt;br /&gt;
							else&lt;br /&gt;
								parentArgs[params[1]] = wikidataIds[1]&lt;br /&gt;
	end	end	end	end	end	end	end&lt;br /&gt;
	&lt;br /&gt;
	--Configured rows&lt;br /&gt;
	local rct = 0&lt;br /&gt;
	for _, params in ipairs( p.conf ) do&lt;br /&gt;
		local val = parentArgs[params[1]]&lt;br /&gt;
		if val and val ~= '' then&lt;br /&gt;
			table.insert( elements, p.createRow( params[1], params[2]..':', val, params[4]( val ), true, params.category ) )&lt;br /&gt;
			rct = rct + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--WorldCat&lt;br /&gt;
	local worldcatId = parentArgs['WORLDCATID']&lt;br /&gt;
	if worldcatId and worldcatId ~= '' then --if present &amp;amp; unsuppressed&lt;br /&gt;
		table.insert( elements, p.createRow( 'WORLDCATID', '', worldcatId, '[[WorldCat Identities]]: [https://www.worldcat.org/identities/'..worldcatId..' '..worldcatId..']', false ) ) --Validation?&lt;br /&gt;
		worldcatCat = '[[Category:Wikipedia articles with WorldCat identifiers]]'&lt;br /&gt;
	elseif worldcatId == nil then --if absent &amp;amp; unsuppressed&lt;br /&gt;
		local viafId = parentArgs['VIAF']&lt;br /&gt;
		local lccnId = parentArgs['LCCN']&lt;br /&gt;
		if viafId and viafId ~= '' and p.viafLink( viafId ) then --VIAF must be present, unsuppressed, &amp;amp; validated&lt;br /&gt;
			table.insert( elements, p.createRow( 'VIAF', '', viafId, '[[WorldCat Identities]] (via VIAF): [https://www.worldcat.org/identities/containsVIAFID/'..viafId..' '..viafId..']', false ) )&lt;br /&gt;
			if namespace == 0 then &lt;br /&gt;
				worldcatCat = '[[Category:Wikipedia articles with WorldCat-VIAF identifiers]]'&lt;br /&gt;
			end&lt;br /&gt;
		elseif lccnId and lccnId ~= '' and p.lccnLink( lccnId ) then --LCCN must be present, unsuppressed, &amp;amp; validated&lt;br /&gt;
			local lccnParts = p.splitLccn( lccnId )&lt;br /&gt;
			if lccnParts and lccnParts[1] ~= 'sh' then&lt;br /&gt;
				local lccnIdFmtd = lccnParts[1]..lccnParts[2]..'-'..lccnParts[3]&lt;br /&gt;
				table.insert( elements, p.createRow( 'LCCN', '', lccnId, '[[WorldCat Identities]] (via LCCN): [https://www.worldcat.org/identities/lccn-'..lccnIdFmtd..' '..lccnIdFmtd..']', false ) )&lt;br /&gt;
				if namespace == 0 then &lt;br /&gt;
					worldcatCat = '[[Category:Wikipedia articles with WorldCat-LCCN identifiers]]'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif worldcatId == '' then --if suppressed&lt;br /&gt;
		suppressedIdCat = '[[Category:Wikipedia articles with suppressed authority control identifiers|WORLDCATID]]'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local Navbox = require('Module:Navbox')&lt;br /&gt;
	local elementsCat = ''&lt;br /&gt;
	if rct &amp;gt;= 20 then&lt;br /&gt;
		local catName = 'AC with '..rct..' elements'&lt;br /&gt;
		elementsCat  = '[[Category:'..catName..']]'..p.redCatLink(catName)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local outString = ''&lt;br /&gt;
	if #elements &amp;gt; 0 then&lt;br /&gt;
		local args = {}&lt;br /&gt;
		if testcases and itemId then args = { qid = itemId } end --expensive&lt;br /&gt;
		local pencil = frame:expandTemplate{ title = 'EditAtWikidata', args = args}&lt;br /&gt;
		outString = Navbox._navbox( {&lt;br /&gt;
			name  = 'Authority control',&lt;br /&gt;
			navboxclass = 'authority-control',&lt;br /&gt;
			bodyclass = 'hlist',&lt;br /&gt;
			group1 = '[[Help:Authority control|Authority control]]'..pencil,&lt;br /&gt;
			list1 = table.concat( elements )&lt;br /&gt;
			} )&lt;br /&gt;
		local auxCats = worldcatCat .. elementsCat .. suppressedIdCat .. deprecatedIdCat&lt;br /&gt;
		if testcases then&lt;br /&gt;
			auxCats = mw.ustring.gsub(auxCats, '(%[%[)(Category)', '%1:%2') --for easier checking&lt;br /&gt;
		end&lt;br /&gt;
		outString = outString .. auxCats&lt;br /&gt;
		if namespace ~= 0 then&lt;br /&gt;
			outString = mw.ustring.gsub(outString, '(%[%[)(Category:Wikipedia articles)', '%1:%2') --by definition&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return outString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Citation&amp;diff=58</id>
		<title>Module:Citation</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Citation&amp;diff=58"/>
		<updated>2019-09-23T12:07:13Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;error('This module is retained for historical and structural reasons; consider using [[Module:Citation/CS1]].')&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Hatnote&amp;diff=60</id>
		<title>Module:Hatnote</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Hatnote&amp;diff=60"/>
		<updated>2019-09-23T12:07:13Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                              Module:Hatnote                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module produces hatnote links and links to related articles. It       --&lt;br /&gt;
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --&lt;br /&gt;
-- helper functions for other Lua hatnote modules.                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require('libraryUtil')&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local mArguments -- lazily initialise [[Module:Arguments]]&lt;br /&gt;
local yesno -- lazily initialise [[Module:Yesno]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
	-- Fetches the arguments from the parent frame. Whitespace is trimmed and&lt;br /&gt;
	-- blanks are removed.&lt;br /&gt;
	mArguments = require('Module:Arguments')&lt;br /&gt;
	return mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeInitialColon(s)&lt;br /&gt;
	-- Removes the initial colon from a string, if present.&lt;br /&gt;
	return s:match('^:?(.*)')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.findNamespaceId(link, removeColon)&lt;br /&gt;
	-- Finds the namespace id (namespace number) of a link or a pagename. This&lt;br /&gt;
	-- function will not work if the link is enclosed in double brackets. Colons&lt;br /&gt;
	-- are trimmed from the start of the link by default. To skip colon&lt;br /&gt;
	-- trimming, set the removeColon parameter to false.&lt;br /&gt;
	checkType('findNamespaceId', 1, link, 'string')&lt;br /&gt;
	checkType('findNamespaceId', 2, removeColon, 'boolean', true)&lt;br /&gt;
	if removeColon ~= false then&lt;br /&gt;
		link = removeInitialColon(link)&lt;br /&gt;
	end&lt;br /&gt;
	local namespace = link:match('^(.-):')&lt;br /&gt;
	if namespace then&lt;br /&gt;
		local nsTable = mw.site.namespaces[namespace]&lt;br /&gt;
		if nsTable then&lt;br /&gt;
			return nsTable.id&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatPages(...)&lt;br /&gt;
	-- Formats a list of pages using formatLink and returns it as an array. Nil&lt;br /&gt;
	-- values are not allowed.&lt;br /&gt;
	local pages = {...}&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, page in ipairs(pages) do&lt;br /&gt;
		ret[i] = p._formatLink(page)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatPageTables(...)&lt;br /&gt;
	-- Takes a list of page/display tables and returns it as a list of&lt;br /&gt;
	-- formatted links. Nil values are not allowed.&lt;br /&gt;
	local pages = {...}&lt;br /&gt;
	local links = {}&lt;br /&gt;
	for i, t in ipairs(pages) do&lt;br /&gt;
		checkType('formatPageTables', i, t, 'table')&lt;br /&gt;
		local link = t[1]&lt;br /&gt;
		local display = t[2]&lt;br /&gt;
		links[i] = p._formatLink(link, display)&lt;br /&gt;
	end&lt;br /&gt;
	return links&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)&lt;br /&gt;
	-- Formats an error message to be returned to wikitext. If&lt;br /&gt;
	-- addTrackingCategory is not false after being returned from&lt;br /&gt;
	-- [[Module:Yesno]], and if we are not on a talk page, a tracking category&lt;br /&gt;
	-- is added.&lt;br /&gt;
	checkType('makeWikitextError', 1, msg, 'string')&lt;br /&gt;
	checkType('makeWikitextError', 2, helpLink, 'string', true)&lt;br /&gt;
	yesno = require('Module:Yesno')&lt;br /&gt;
	title = title or mw.title.getCurrentTitle()&lt;br /&gt;
	-- Make the help link text.&lt;br /&gt;
	local helpText&lt;br /&gt;
	if helpLink then&lt;br /&gt;
		helpText = ' ([[' .. helpLink .. '|help]])'&lt;br /&gt;
	else&lt;br /&gt;
		helpText = ''&lt;br /&gt;
	end&lt;br /&gt;
	-- Make the category text.&lt;br /&gt;
	local category&lt;br /&gt;
	if not title.isTalkPage and yesno(addTrackingCategory) ~= false then&lt;br /&gt;
		category = 'Hatnote templates with errors'&lt;br /&gt;
		category = string.format(&lt;br /&gt;
			'[[%s:%s]]',&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			category&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		category = ''&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		'&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error: %s%s.&amp;lt;/strong&amp;gt;%s',&lt;br /&gt;
		msg,&lt;br /&gt;
		helpText,&lt;br /&gt;
		category&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.disambiguate(page, disambiguator)&lt;br /&gt;
	-- Formats a page title with a disambiguation parenthetical,&lt;br /&gt;
	-- i.e. &amp;quot;Example&amp;quot; → &amp;quot;Example (disambiguation)&amp;quot;.&lt;br /&gt;
	checkType('disambiguate', 1, page, 'string')&lt;br /&gt;
	checkType('disambiguate', 2, disambiguator, 'string', true)&lt;br /&gt;
	disambiguator = disambiguator or 'disambiguation'&lt;br /&gt;
	return string.format('%s (%s)', page, disambiguator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Format link&lt;br /&gt;
--&lt;br /&gt;
-- Makes a wikilink from the given link and display values. Links are escaped&lt;br /&gt;
-- with colons if necessary, and links to sections are detected and displayed&lt;br /&gt;
-- with &amp;quot; § &amp;quot; as a separator rather than the standard MediaWiki &amp;quot;#&amp;quot;. Used in&lt;br /&gt;
-- the {{format hatnote link}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.formatLink(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local link = args[1]&lt;br /&gt;
	local display = args[2]&lt;br /&gt;
	if not link then&lt;br /&gt;
		return p.makeWikitextError(&lt;br /&gt;
			'no link specified',&lt;br /&gt;
			'Template:Format hatnote link#Errors',&lt;br /&gt;
			args.category&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return p._formatLink(link, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._formatLink(link, display)&lt;br /&gt;
	checkType('_formatLink', 1, link, 'string')&lt;br /&gt;
	checkType('_formatLink', 2, display, 'string', true)&lt;br /&gt;
&lt;br /&gt;
	-- Remove the initial colon for links where it was specified manually.&lt;br /&gt;
	link = removeInitialColon(link)&lt;br /&gt;
&lt;br /&gt;
	-- Find whether a faux display value has been added with the {{!}} magic&lt;br /&gt;
	-- word.&lt;br /&gt;
	if not display then&lt;br /&gt;
		local prePipe, postPipe = link:match('^(.-)|(.*)$')&lt;br /&gt;
		link = prePipe or link&lt;br /&gt;
		display = postPipe&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the display value.&lt;br /&gt;
	if not display then&lt;br /&gt;
		local page, section = link:match('^(.-)#(.*)$')&lt;br /&gt;
		if page then&lt;br /&gt;
			display = page .. ' §&amp;amp;nbsp;' .. section&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the link.&lt;br /&gt;
	if display then&lt;br /&gt;
		return string.format(&lt;br /&gt;
			'[[:%s|%s]]',&lt;br /&gt;
			string.gsub(link, '|(.*)$', ''), --display overwrites manual piping&lt;br /&gt;
			display&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format('[[:%s]]', link)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Hatnote&lt;br /&gt;
--&lt;br /&gt;
-- Produces standard hatnote text. Implements the {{hatnote}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.hatnote(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local s = args[1]&lt;br /&gt;
	local options = {}&lt;br /&gt;
	if not s then&lt;br /&gt;
		return p.makeWikitextError(&lt;br /&gt;
			'no text specified',&lt;br /&gt;
			'Template:Hatnote#Errors',&lt;br /&gt;
			args.category&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	options.extraclasses = args.extraclasses&lt;br /&gt;
	options.selfref = args.selfref&lt;br /&gt;
	return p._hatnote(s, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._hatnote(s, options)&lt;br /&gt;
	checkType('_hatnote', 1, s, 'string')&lt;br /&gt;
	checkType('_hatnote', 2, options, 'table', true)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	local classes = {'hatnote', 'navigation-not-searchable'}&lt;br /&gt;
	local extraclasses = options.extraclasses&lt;br /&gt;
	local selfref = options.selfref&lt;br /&gt;
	if type(extraclasses) == 'string' then&lt;br /&gt;
		classes[#classes + 1] = extraclasses&lt;br /&gt;
	end&lt;br /&gt;
	if selfref then&lt;br /&gt;
		classes[#classes + 1] = 'selfref'&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		'&amp;lt;div role=&amp;quot;note&amp;quot; class=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;',&lt;br /&gt;
		table.concat(classes, ' '),&lt;br /&gt;
		s&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Unsubst&amp;diff=62</id>
		<title>Module:Unsubst</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Unsubst&amp;diff=62"/>
		<updated>2019-09-23T12:07:13Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local checkType = require('libraryUtil').checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local BODY_PARAM = '$B'&lt;br /&gt;
&lt;br /&gt;
local specialParams = {&lt;br /&gt;
	['$params'] = 'parameter list',&lt;br /&gt;
	['$aliases'] = 'parameter aliases',&lt;br /&gt;
	['$flags'] = 'flags',&lt;br /&gt;
	['$B'] = 'template content'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, body)&lt;br /&gt;
	-- If we are substing, this function returns a template invocation, and if&lt;br /&gt;
	-- not, it returns the template body. The template body can be specified in&lt;br /&gt;
	-- the body parameter, or in the template parameter defined in the&lt;br /&gt;
	-- BODY_PARAM variable. This function can be called from Lua or from&lt;br /&gt;
	-- #invoke.&lt;br /&gt;
&lt;br /&gt;
	-- Return the template body if we aren't substing.&lt;br /&gt;
	if not mw.isSubsting() then&lt;br /&gt;
		if body ~= nil then&lt;br /&gt;
			return body&lt;br /&gt;
		elseif frame.args[BODY_PARAM] ~= nil then&lt;br /&gt;
			return frame.args[BODY_PARAM]&lt;br /&gt;
		else&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;no template content specified (use parameter '%s' from #invoke)&amp;quot;,&lt;br /&gt;
				BODY_PARAM&lt;br /&gt;
			), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Sanity check for the frame object.&lt;br /&gt;
	if type(frame) ~= 'table'&lt;br /&gt;
		or type(frame.getParent) ~= 'function'&lt;br /&gt;
		or not frame:getParent()&lt;br /&gt;
	then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;quot;argument #1 to 'main' must be a frame object with a parent &amp;quot; ..&lt;br /&gt;
			&amp;quot;frame available&amp;quot;,&lt;br /&gt;
			2&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the invocation name.&lt;br /&gt;
	local mTemplateInvocation = require('Module:Template invocation')&lt;br /&gt;
	local name = mTemplateInvocation.name(frame:getParent():getTitle())&lt;br /&gt;
&lt;br /&gt;
	-- Combine passed args with passed defaults&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*override%s*,' ) then&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == '__DATE__' then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( 'F Y' )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == '__DATE__' then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( 'F Y' )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Trim parameters, if not specified otherwise&lt;br /&gt;
	if not string.find( ','..(frame.args['$flags'] or '')..',', ',%s*keep%-whitespace%s*,' ) then&lt;br /&gt;
		for k, v in pairs( args ) do args[k] = mw.ustring.match(v, '^%s*(.*)%s*$') or '' end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Pull information from parameter aliases&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	if frame.args['$aliases'] then&lt;br /&gt;
		local list = mw.text.split( frame.args['$aliases'], '%s*,%s*' )&lt;br /&gt;
		for k, v in ipairs( list ) do&lt;br /&gt;
			local tmp = mw.text.split( v, '%s*&amp;gt;%s*' )&lt;br /&gt;
			aliases[tonumber(mw.ustring.match(tmp[1], '^[1-9][0-9]*$')) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], '^[1-9][0-9]*$'))) or tmp[2])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( aliases ) do&lt;br /&gt;
		if args[k] and ( not args[v] or args[v] == '' ) then&lt;br /&gt;
			args[v] = args[k]&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove empty parameters, if specified&lt;br /&gt;
	if string.find( ','..(frame.args['$flags'] or '')..',', ',%s*remove%-empty%s*,' ) then&lt;br /&gt;
		local tmp = 0&lt;br /&gt;
		for k, v in ipairs( args ) do&lt;br /&gt;
			if v ~= '' or ( args[k+1] and args[k+1] ~= '' ) or ( args[k+2] and args[k+2] ~= '' ) then&lt;br /&gt;
				tmp = k&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( args ) do&lt;br /&gt;
			if v == '' then&lt;br /&gt;
				if not (type(k) == 'number' and k &amp;lt; tmp) then args[k] = nil end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Order parameters&lt;br /&gt;
	if frame.args['$params'] then&lt;br /&gt;
		local params, tmp = mw.text.split( frame.args['$params'], '%s*,%s*' ), {}&lt;br /&gt;
		for k, v in ipairs(params) do&lt;br /&gt;
			v = tonumber(mw.ustring.match(v, '^[1-9][0-9]*$')) or v&lt;br /&gt;
			if args[v] then tmp[v], args[v] = args[v], nil end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end&lt;br /&gt;
		args = tmp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mTemplateInvocation.invocation(name, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[''] = p.main -- For backwards compatibility&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Sidebar&amp;diff=64</id>
		<title>Module:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Sidebar&amp;diff=64"/>
		<updated>2019-09-23T12:07:13Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Sidebar}}&lt;br /&gt;
--&lt;br /&gt;
require('Module:No globals')&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local navbar = require('Module:Navbar')._navbar&lt;br /&gt;
&lt;br /&gt;
local function trimAndAddAutomaticNewline(s)&lt;br /&gt;
	-- For compatibility with the original {{sidebar with collapsible lists}}&lt;br /&gt;
	-- implementation, which passed some parameters through {{#if}} to trim&lt;br /&gt;
	-- their whitespace. This also triggered the automatic newline behavior.&lt;br /&gt;
	-- ([[meta:Help:Newlines and spaces#Automatic newline]])&lt;br /&gt;
	s = mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then&lt;br /&gt;
		return '\n' .. s&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasSubgroup(s)&lt;br /&gt;
	if mw.ustring.find(s, 'vertical%-navbox%-subgroup') then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sidebar(frame, args)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	end&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	local child = args.child and mw.text.trim(args.child) == 'yes'&lt;br /&gt;
&lt;br /&gt;
	root = root:tag('table')&lt;br /&gt;
	if not child then&lt;br /&gt;
		root &lt;br /&gt;
			:addClass('vertical-navbox')&lt;br /&gt;
			:addClass(args.wraplinks ~= 'true' and 'nowraplinks' or nil)&lt;br /&gt;
			:addClass(args.bodyclass or args.class)&lt;br /&gt;
			:css('float', args.float or 'right')&lt;br /&gt;
			:css('clear', (args.float == 'none' and 'both') or args.float or 'right')&lt;br /&gt;
			:css('width', args.width or '22.0em')&lt;br /&gt;
			:css('margin', args.float == 'left' and '0 1.0em 1.0em 0' or '0 0 1.0em 1.0em')&lt;br /&gt;
			:css('background', '#f9f9f9')&lt;br /&gt;
			:css('border', '1px solid #aaa')&lt;br /&gt;
			:css('padding', '0.2em')&lt;br /&gt;
			:css('border-spacing', '0.4em 0')&lt;br /&gt;
			:css('text-align', 'center')&lt;br /&gt;
			:css('line-height', '1.4em')&lt;br /&gt;
			:css('font-size', '88%')&lt;br /&gt;
			:cssText(args.bodystyle or args.style)&lt;br /&gt;
&lt;br /&gt;
		if args.outertitle then&lt;br /&gt;
			root&lt;br /&gt;
				:tag('caption')&lt;br /&gt;
					:addClass(args.outertitleclass)&lt;br /&gt;
					:css('padding-bottom', '0.2em')&lt;br /&gt;
					:css('font-size', '125%')&lt;br /&gt;
					:css('line-height', '1.2em')&lt;br /&gt;
					:css('font-weight', 'bold')&lt;br /&gt;
					:cssText(args.outertitlestyle)&lt;br /&gt;
					:wikitext(args.outertitle)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.topimage then&lt;br /&gt;
			local imageCell = root:tag('tr'):tag('td')&lt;br /&gt;
&lt;br /&gt;
			imageCell&lt;br /&gt;
				:addClass(args.topimageclass)&lt;br /&gt;
				:css('padding', '0.4em 0')&lt;br /&gt;
				:cssText(args.topimagestyle)&lt;br /&gt;
				:wikitext(args.topimage)&lt;br /&gt;
&lt;br /&gt;
			if args.topcaption then&lt;br /&gt;
				imageCell&lt;br /&gt;
					:tag('div')&lt;br /&gt;
						:css('padding-top', '0.2em')&lt;br /&gt;
						:css('line-height', '1.2em')&lt;br /&gt;
						:cssText(args.topcaptionstyle)&lt;br /&gt;
						:wikitext(args.topcaption)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.pretitle then&lt;br /&gt;
			root&lt;br /&gt;
				:tag('tr')&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:addClass(args.pretitleclass)&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:css('padding-top', args.topimage and '0.2em' or '0.4em')&lt;br /&gt;
						:css('line-height', '1.2em')&lt;br /&gt;
						:cssText(args.pretitlestyle)&lt;br /&gt;
						:wikitext(args.pretitle)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		root&lt;br /&gt;
			:addClass('vertical-navbox-subgroup')&lt;br /&gt;
			:css('width', '100%')&lt;br /&gt;
			:css('margin', '0px')&lt;br /&gt;
			:css('border-spacing', '0px')&lt;br /&gt;
			:addClass(args.bodyclass or args.class)&lt;br /&gt;
			:cssText(args.bodystyle or args.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.title then&lt;br /&gt;
		if child then&lt;br /&gt;
			root&lt;br /&gt;
				:wikitext(args.title)&lt;br /&gt;
		else&lt;br /&gt;
			root&lt;br /&gt;
				:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:addClass(args.titleclass)&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:css('padding', '0.2em 0.4em 0.2em')&lt;br /&gt;
						:css('padding-top', args.pretitle and 0)&lt;br /&gt;
						:css('font-size', '145%')&lt;br /&gt;
						:css('line-height', '1.2em')&lt;br /&gt;
						:cssText(args.titlestyle)&lt;br /&gt;
						:wikitext(args.title)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.image then&lt;br /&gt;
		local imageCell = root:tag('tr'):tag('td')&lt;br /&gt;
&lt;br /&gt;
		imageCell&lt;br /&gt;
			:addClass(args.imageclass)&lt;br /&gt;
			:css('padding', '0.2em 0 0.4em')&lt;br /&gt;
			:cssText(args.imagestyle)&lt;br /&gt;
			:wikitext(args.image)&lt;br /&gt;
&lt;br /&gt;
		if args.caption then&lt;br /&gt;
			imageCell&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:css('padding-top', '0.2em')&lt;br /&gt;
					:css('line-height', '1.2em')&lt;br /&gt;
					:cssText(args.captionstyle)&lt;br /&gt;
					:wikitext(args.caption)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.above then&lt;br /&gt;
		root&lt;br /&gt;
			:tag('tr')&lt;br /&gt;
				:tag('td')&lt;br /&gt;
					:addClass(args.aboveclass)&lt;br /&gt;
					:css('padding', '0.3em 0.4em 0.3em')&lt;br /&gt;
					:css('font-weight', 'bold')&lt;br /&gt;
					:cssText(args.abovestyle)&lt;br /&gt;
					:newline() -- newline required for bullet-points to work&lt;br /&gt;
					:wikitext(args.above)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rowNums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = '' .. k&lt;br /&gt;
		local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')&lt;br /&gt;
		if num then table.insert(rowNums, tonumber(num)) end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(rowNums)&lt;br /&gt;
	-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3 and content3 are specified)&lt;br /&gt;
	for i = #rowNums, 1, -1 do&lt;br /&gt;
		if rowNums[i] == rowNums[i - 1] then&lt;br /&gt;
			table.remove(rowNums, i)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, num in ipairs(rowNums) do&lt;br /&gt;
		local heading = args['heading' .. num]&lt;br /&gt;
		if heading then&lt;br /&gt;
			root&lt;br /&gt;
				:tag('tr')&lt;br /&gt;
					:tag('th')&lt;br /&gt;
						:addClass(args.headingclass)&lt;br /&gt;
						:css('padding', '0.1em')&lt;br /&gt;
						:cssText(args.basestyle)&lt;br /&gt;
						:cssText(args.headingstyle)&lt;br /&gt;
						:cssText(args['heading' .. num .. 'style'])&lt;br /&gt;
						:newline()&lt;br /&gt;
						:wikitext(heading)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local content = args['content' .. num]&lt;br /&gt;
		if content then&lt;br /&gt;
			root&lt;br /&gt;
				:tag('tr')&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:addClass(args.contentclass)&lt;br /&gt;
						:css('padding', hasSubgroup(content) and '0.1em 0 0.2em' or '0 0.1em 0.4em')&lt;br /&gt;
						:cssText(args.contentstyle)&lt;br /&gt;
						:cssText(args['content' .. num .. 'style'])&lt;br /&gt;
						:newline()&lt;br /&gt;
						:wikitext(content)&lt;br /&gt;
						:done()&lt;br /&gt;
					:newline() -- Without a linebreak after the &amp;lt;/td&amp;gt;, a nested list like &amp;quot;* {{hlist| ...}}&amp;quot; doesn't parse correctly.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.below then&lt;br /&gt;
		root&lt;br /&gt;
			:tag('tr')&lt;br /&gt;
				:tag('td')&lt;br /&gt;
					:addClass(args.belowclass)&lt;br /&gt;
					:css('padding', '0.3em 0.4em 0.3em')&lt;br /&gt;
					:css('font-weight', 'bold')&lt;br /&gt;
					:cssText(args.belowstyle)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:wikitext(args.below)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not child then&lt;br /&gt;
		local navbarArg = args.navbar or args.tnavbar&lt;br /&gt;
		if navbarArg ~= 'none' and navbarArg ~= 'off' and (args.name or frame:getParent():getTitle():gsub('/sandbox$', '') ~= 'Template:Sidebar') then&lt;br /&gt;
			root&lt;br /&gt;
				:tag('tr')&lt;br /&gt;
					:tag('td')&lt;br /&gt;
						:css('text-align', 'right')&lt;br /&gt;
						:css('font-size', '115%')&lt;br /&gt;
						:cssText(args.navbarstyle or args.tnavbarstyle)&lt;br /&gt;
						:wikitext(navbar{&lt;br /&gt;
							args.name,&lt;br /&gt;
							mini = 1,&lt;br /&gt;
							fontstyle = args.navbarfontstyle or args.tnavbarfontstyle&lt;br /&gt;
						})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root) .. (child and '[[Category:Pages using sidebar with the child parameter]]' or '')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.collapsible(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	args.abovestyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.abovestyle or '')&lt;br /&gt;
	args.belowstyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.belowstyle or '')&lt;br /&gt;
	args.navbarstyle = 'padding-top: 0.6em;' .. (args.navbarstyle or args.tnavbarstyle or '')&lt;br /&gt;
	if not args.name and frame:getParent():getTitle():gsub('/sandbox$', '') == 'Template:Sidebar with collapsible lists' then&lt;br /&gt;
		args.navbar = 'none'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local contentArgs = {}&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = string.match(k, '^list(%d+)$')&lt;br /&gt;
		if num then&lt;br /&gt;
			local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])&lt;br /&gt;
&lt;br /&gt;
			local row = mw.html.create('div')&lt;br /&gt;
			row&lt;br /&gt;
				:addClass('NavFrame')&lt;br /&gt;
				:addClass((not expand) and 'collapsed' or nil)&lt;br /&gt;
				:css('border', 'none')&lt;br /&gt;
				:css('padding', 0)&lt;br /&gt;
				:cssText(args.listframestyle)&lt;br /&gt;
				:cssText(args['list' .. num .. 'framestyle'])&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:addClass('NavHead')&lt;br /&gt;
					:addClass(args.listtitleclass)&lt;br /&gt;
					:css('font-size', '105%')&lt;br /&gt;
					:css('background', 'transparent')&lt;br /&gt;
					:css('text-align', 'left')&lt;br /&gt;
					:cssText(args.basestyle)&lt;br /&gt;
					:cssText(args.listtitlestyle)&lt;br /&gt;
					:cssText(args['list' .. num .. 'titlestyle'])&lt;br /&gt;
					:wikitext(trimAndAddAutomaticNewline(args['list' .. num .. 'title'] or 'List'))&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag('div')&lt;br /&gt;
					:addClass('NavContent')&lt;br /&gt;
					:addClass(args.listclass)&lt;br /&gt;
					:addClass(args['list' .. num .. 'class'])&lt;br /&gt;
					:css('font-size', '105%')&lt;br /&gt;
					:css('padding', '0.2em 0 0.4em')&lt;br /&gt;
					:css('text-align', 'center')&lt;br /&gt;
					:cssText(args.liststyle)&lt;br /&gt;
					:cssText(args['list' .. num .. 'style'])&lt;br /&gt;
					:wikitext(trimAndAddAutomaticNewline(args['list' .. num]))&lt;br /&gt;
&lt;br /&gt;
			contentArgs['content' .. num] = tostring(row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(contentArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.sidebar(frame, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Infobox&amp;diff=48</id>
		<title>Module:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Infobox&amp;diff=48"/>
		<updated>2019-09-23T12:07:12Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Infobox}}&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local navbar = require('Module:Navbar')._navbar&lt;br /&gt;
&lt;br /&gt;
local args = {}&lt;br /&gt;
local origArgs&lt;br /&gt;
local root&lt;br /&gt;
&lt;br /&gt;
local function notempty( s ) return s and s:match( '%S' ) end&lt;br /&gt;
&lt;br /&gt;
local function fixChildBoxes(sval, tt)&lt;br /&gt;
	if notempty(sval) then&lt;br /&gt;
		local marker = '&amp;lt;span class=special_infobox_marker&amp;gt;'&lt;br /&gt;
		local s = sval&lt;br /&gt;
		s = mw.ustring.gsub(s, '(&amp;lt;%s*[Tt][Rr])', marker .. '%1')&lt;br /&gt;
		s = mw.ustring.gsub(s, '(&amp;lt;/[Tt][Rr]%s*&amp;gt;)', '%1' .. marker)&lt;br /&gt;
		if s:match(marker) then&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')&lt;br /&gt;
			s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s, '(&amp;lt;/[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*&amp;gt;%s*)' .. marker, '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s, '(&amp;lt;%s*[Tt][Aa][Bb][Ll][Ee][^&amp;lt;&amp;gt;]*&amp;gt;%s*)' .. marker, '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s,  marker .. '(%s*&amp;lt;/[Tt][Aa][Bb][Ll][Ee]%s*&amp;gt;)', '%1')&lt;br /&gt;
			s = mw.ustring.gsub(s,  marker .. '(%s*\n|%})', '%1')&lt;br /&gt;
		end&lt;br /&gt;
		if s:match(marker) then&lt;br /&gt;
			local subcells = mw.text.split(s, marker)&lt;br /&gt;
			s = ''&lt;br /&gt;
			for k = 1, #subcells do&lt;br /&gt;
				if k == 1 then&lt;br /&gt;
					s = s .. subcells[k] .. '&amp;lt;/' .. tt .. '&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
				elseif k == #subcells then&lt;br /&gt;
					local rowstyle = ' style=&amp;quot;display:none&amp;quot;'&lt;br /&gt;
					if notempty(subcells[k]) then rowstyle = ''	end&lt;br /&gt;
					s = s .. '&amp;lt;tr' .. rowstyle ..'&amp;gt;&amp;lt;' .. tt .. ' colspan=2&amp;gt;\n' .. subcells[k]&lt;br /&gt;
				elseif notempty(subcells[k]) then&lt;br /&gt;
					if (k % 2) == 0 then&lt;br /&gt;
						s = s .. subcells[k]&lt;br /&gt;
					else&lt;br /&gt;
						s = s .. '&amp;lt;tr&amp;gt;&amp;lt;' .. tt .. ' colspan=2&amp;gt;\n' .. subcells[k] .. '&amp;lt;/' .. tt .. '&amp;gt;&amp;lt;/tr&amp;gt;'&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- the next two lines add a newline at the end of lists for the PHP parser&lt;br /&gt;
		-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&amp;amp;oldid=849054481&lt;br /&gt;
		-- remove when [[:phab:T191516]] is fixed or OBE&lt;br /&gt;
		s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')&lt;br /&gt;
		s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')&lt;br /&gt;
		s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')&lt;br /&gt;
		s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')&lt;br /&gt;
		return s&lt;br /&gt;
	else&lt;br /&gt;
		return sval&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
    -- Returns the union of the values of two tables, as a sequence.&lt;br /&gt;
    local vals = {}&lt;br /&gt;
    for k, v in pairs(t1) do&lt;br /&gt;
        vals[v] = true&lt;br /&gt;
    end&lt;br /&gt;
    for k, v in pairs(t2) do&lt;br /&gt;
        vals[v] = true&lt;br /&gt;
    end&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    for k, v in pairs(vals) do&lt;br /&gt;
        table.insert(ret, k)&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(prefix)&lt;br /&gt;
    -- Returns a table containing the numbers of the arguments that exist&lt;br /&gt;
    -- for the specified prefix. For example, if the prefix was 'data', and&lt;br /&gt;
    -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.&lt;br /&gt;
    local nums = {}&lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')&lt;br /&gt;
        if num then table.insert(nums, tonumber(num)) end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(nums)&lt;br /&gt;
    return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addRow(rowArgs)&lt;br /&gt;
    -- Adds a row to the infobox, with either a header cell&lt;br /&gt;
    -- or a label/data cell combination.&lt;br /&gt;
    if rowArgs.header then&lt;br /&gt;
        root&lt;br /&gt;
            :tag('tr')&lt;br /&gt;
                :addClass(rowArgs.rowclass)&lt;br /&gt;
                :cssText(rowArgs.rowstyle)&lt;br /&gt;
                :attr('id', rowArgs.rowid)&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('colspan', 2)&lt;br /&gt;
                    :attr('id', rowArgs.headerid)&lt;br /&gt;
                    :addClass(rowArgs.class)&lt;br /&gt;
                    :addClass(args.headerclass)&lt;br /&gt;
                    :css('text-align', 'center')&lt;br /&gt;
                    :cssText(args.headerstyle)&lt;br /&gt;
                    :cssText(rowArgs.rowcellstyle)&lt;br /&gt;
                    :wikitext(fixChildBoxes(rowArgs.header, 'th'))&lt;br /&gt;
    elseif rowArgs.data then&lt;br /&gt;
        local row = root:tag('tr')&lt;br /&gt;
        row:addClass(rowArgs.rowclass)&lt;br /&gt;
        row:cssText(rowArgs.rowstyle)&lt;br /&gt;
        row:attr('id', rowArgs.rowid)&lt;br /&gt;
        if rowArgs.label then&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :attr('id', rowArgs.labelid)&lt;br /&gt;
                    :cssText(args.labelstyle)&lt;br /&gt;
                    :cssText(rowArgs.rowcellstyle)&lt;br /&gt;
                    :wikitext(rowArgs.label)&lt;br /&gt;
                    :done()&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        if not rowArgs.label then &lt;br /&gt;
            dataCell&lt;br /&gt;
                :attr('colspan', 2)&lt;br /&gt;
                :css('text-align', 'center') &lt;br /&gt;
        end&lt;br /&gt;
        dataCell&lt;br /&gt;
            :attr('id', rowArgs.dataid)&lt;br /&gt;
            :addClass(rowArgs.class)&lt;br /&gt;
            :cssText(rowArgs.datastyle)&lt;br /&gt;
            :cssText(rowArgs.rowcellstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(rowArgs.data, 'td'))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTitle()&lt;br /&gt;
    if not args.title then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.titleclass)&lt;br /&gt;
            :cssText(args.titlestyle)&lt;br /&gt;
            :wikitext(args.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow()&lt;br /&gt;
    if not args.above then return end&lt;br /&gt;
    &lt;br /&gt;
    root&lt;br /&gt;
        :tag('tr')&lt;br /&gt;
            :tag('th')&lt;br /&gt;
                :attr('colspan', 2)&lt;br /&gt;
                :addClass(args.aboveclass)&lt;br /&gt;
                :css('text-align', 'center')&lt;br /&gt;
                :css('font-size', '125%')&lt;br /&gt;
                :css('font-weight', 'bold')&lt;br /&gt;
                :cssText(args.abovestyle)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.above,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow()&lt;br /&gt;
    if not args.below then return end&lt;br /&gt;
    &lt;br /&gt;
    root&lt;br /&gt;
        :tag('tr')&lt;br /&gt;
            :tag('td')&lt;br /&gt;
                :attr('colspan', '2')&lt;br /&gt;
                :addClass(args.belowclass)&lt;br /&gt;
                :css('text-align', 'center')&lt;br /&gt;
                :cssText(args.belowstyle)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.below,'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSubheaders()&lt;br /&gt;
    if args.subheader then&lt;br /&gt;
        args.subheader1 = args.subheader&lt;br /&gt;
    end&lt;br /&gt;
    if args.subheaderrowclass then&lt;br /&gt;
        args.subheaderrowclass1 = args.subheaderrowclass&lt;br /&gt;
    end&lt;br /&gt;
    local subheadernums = getArgNums('subheader')&lt;br /&gt;
    for k, num in ipairs(subheadernums) do&lt;br /&gt;
        addRow({&lt;br /&gt;
            data = args['subheader' .. tostring(num)],&lt;br /&gt;
            datastyle = args.subheaderstyle,&lt;br /&gt;
            rowcellstyle = args['subheaderstyle' .. tostring(num)],&lt;br /&gt;
            class = args.subheaderclass,&lt;br /&gt;
            rowclass = args['subheaderrowclass' .. tostring(num)]&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImages()&lt;br /&gt;
    if args.image then&lt;br /&gt;
        args.image1 = args.image&lt;br /&gt;
    end&lt;br /&gt;
    if args.caption then&lt;br /&gt;
        args.caption1 = args.caption&lt;br /&gt;
    end&lt;br /&gt;
    local imagenums = getArgNums('image')&lt;br /&gt;
    for k, num in ipairs(imagenums) do&lt;br /&gt;
        local caption = args['caption' .. tostring(num)]&lt;br /&gt;
        local data = mw.html.create():wikitext(args['image' .. tostring(num)])&lt;br /&gt;
        if caption then&lt;br /&gt;
            data&lt;br /&gt;
                :tag('div')&lt;br /&gt;
                    :cssText(args.captionstyle)&lt;br /&gt;
                    :wikitext(caption)&lt;br /&gt;
        end&lt;br /&gt;
        addRow({&lt;br /&gt;
            data = tostring(data),&lt;br /&gt;
            datastyle = args.imagestyle,&lt;br /&gt;
            class = args.imageclass,&lt;br /&gt;
            rowclass = args['imagerowclass' .. tostring(num)]&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRows()&lt;br /&gt;
    -- Gets the union of the header and data argument numbers,&lt;br /&gt;
    -- and renders them all in order using addRow.&lt;br /&gt;
    local rownums = union(getArgNums('header'), getArgNums('data'))&lt;br /&gt;
    table.sort(rownums)&lt;br /&gt;
    for k, num in ipairs(rownums) do&lt;br /&gt;
        addRow({&lt;br /&gt;
            header = args['header' .. tostring(num)],&lt;br /&gt;
            label = args['label' .. tostring(num)],&lt;br /&gt;
            data = args['data' .. tostring(num)],&lt;br /&gt;
            datastyle = args.datastyle,&lt;br /&gt;
            class = args['class' .. tostring(num)],&lt;br /&gt;
            rowclass = args['rowclass' .. tostring(num)],&lt;br /&gt;
            rowstyle = args['rowstyle' .. tostring(num)],&lt;br /&gt;
            rowcellstyle = args['rowcellstyle' .. tostring(num)],&lt;br /&gt;
            dataid = args['dataid' .. tostring(num)],&lt;br /&gt;
            labelid = args['labelid' .. tostring(num)],&lt;br /&gt;
            headerid = args['headerid' .. tostring(num)],&lt;br /&gt;
            rowid = args['rowid' .. tostring(num)]&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar()&lt;br /&gt;
    if not args.name then return end&lt;br /&gt;
    &lt;br /&gt;
    root&lt;br /&gt;
        :tag('tr')&lt;br /&gt;
            :tag('td')&lt;br /&gt;
                :attr('colspan', '2')&lt;br /&gt;
                :css('text-align', 'right')&lt;br /&gt;
                :wikitext(navbar{&lt;br /&gt;
                    args.name,&lt;br /&gt;
                    mini = 1,&lt;br /&gt;
                })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderItalicTitle()&lt;br /&gt;
    local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])&lt;br /&gt;
    if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then&lt;br /&gt;
        root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories()&lt;br /&gt;
    if args.decat ~= 'yes' then&lt;br /&gt;
    	if args.child == 'yes' then&lt;br /&gt;
        	if args.title then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')&lt;br /&gt;
        	end&lt;br /&gt;
        elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
            root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _infobox()&lt;br /&gt;
    -- Specify the overall layout of the infobox, with special settings&lt;br /&gt;
    -- if the infobox is used as a 'child' inside another infobox.&lt;br /&gt;
    if args.child ~= 'yes' then&lt;br /&gt;
        root = mw.html.create('table')&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :addClass((args.subbox ~= 'yes') and 'infobox' or nil)&lt;br /&gt;
            :addClass(args.bodyclass)&lt;br /&gt;
            &lt;br /&gt;
            if args.subbox == 'yes' then&lt;br /&gt;
                root&lt;br /&gt;
                    :css('padding', '0')&lt;br /&gt;
                    :css('border', 'none')&lt;br /&gt;
                    :css('margin', '-3px')&lt;br /&gt;
                    :css('width', 'auto')&lt;br /&gt;
                    :css('min-width', '100%')&lt;br /&gt;
                    :css('font-size', '100%')&lt;br /&gt;
                    :css('clear', 'none')&lt;br /&gt;
                    :css('float', 'none')&lt;br /&gt;
                    :css('background-color', 'transparent')&lt;br /&gt;
            else&lt;br /&gt;
                root&lt;br /&gt;
                    :css('width', '22em')&lt;br /&gt;
            end&lt;br /&gt;
        root&lt;br /&gt;
            :cssText(args.bodystyle)&lt;br /&gt;
    &lt;br /&gt;
        renderTitle()&lt;br /&gt;
        renderAboveRow()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.title)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    renderSubheaders()&lt;br /&gt;
    renderImages() &lt;br /&gt;
    renderRows() &lt;br /&gt;
    renderBelowRow()  &lt;br /&gt;
    renderNavBar()&lt;br /&gt;
    renderItalicTitle()&lt;br /&gt;
    renderTrackingCategories()&lt;br /&gt;
    &lt;br /&gt;
    return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocessSingleArg(argName)&lt;br /&gt;
    -- If the argument exists and isn't blank, add it to the argument table.&lt;br /&gt;
    -- Blank arguments are treated as nil to match the behaviour of ParserFunctions.&lt;br /&gt;
    if origArgs[argName] and origArgs[argName] ~= '' then&lt;br /&gt;
        args[argName] = origArgs[argName]&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocessArgs(prefixTable, step)&lt;br /&gt;
    -- Assign the parameters with the given prefixes to the args table, in order, in batches&lt;br /&gt;
    -- of the step size specified. This is to prevent references etc. from appearing in the&lt;br /&gt;
    -- wrong order. The prefixTable should be an array containing tables, each of which has&lt;br /&gt;
    -- two possible fields, a &amp;quot;prefix&amp;quot; string and a &amp;quot;depend&amp;quot; table. The function always parses&lt;br /&gt;
    -- parameters containing the &amp;quot;prefix&amp;quot; string, but only parses parameters in the &amp;quot;depend&amp;quot;&lt;br /&gt;
    -- table if the prefix parameter is present and non-blank.&lt;br /&gt;
    if type(prefixTable) ~= 'table' then&lt;br /&gt;
        error(&amp;quot;Non-table value detected for the prefix table&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
    if type(step) ~= 'number' then&lt;br /&gt;
        error(&amp;quot;Invalid step value detected&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Get arguments without a number suffix, and check for bad input.&lt;br /&gt;
    for i,v in ipairs(prefixTable) do&lt;br /&gt;
        if type(v) ~= 'table' or type(v.prefix) ~= &amp;quot;string&amp;quot; or (v.depend and type(v.depend) ~= 'table') then&lt;br /&gt;
            error('Invalid input detected to preprocessArgs prefix table', 2)&lt;br /&gt;
        end&lt;br /&gt;
        preprocessSingleArg(v.prefix)&lt;br /&gt;
        -- Only parse the depend parameter if the prefix parameter is present and not blank.&lt;br /&gt;
        if args[v.prefix] and v.depend then&lt;br /&gt;
            for j, dependValue in ipairs(v.depend) do&lt;br /&gt;
                if type(dependValue) ~= 'string' then&lt;br /&gt;
                    error('Invalid &amp;quot;depend&amp;quot; parameter value detected in preprocessArgs')&lt;br /&gt;
                end&lt;br /&gt;
                preprocessSingleArg(dependValue)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Get arguments with number suffixes.&lt;br /&gt;
    local a = 1 -- Counter variable.&lt;br /&gt;
    local moreArgumentsExist = true&lt;br /&gt;
    while moreArgumentsExist == true do&lt;br /&gt;
        moreArgumentsExist = false&lt;br /&gt;
        for i = a, a + step - 1 do&lt;br /&gt;
            for j,v in ipairs(prefixTable) do&lt;br /&gt;
                local prefixArgName = v.prefix .. tostring(i)&lt;br /&gt;
                if origArgs[prefixArgName] then&lt;br /&gt;
                    moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.&lt;br /&gt;
                    preprocessSingleArg(prefixArgName)&lt;br /&gt;
                end&lt;br /&gt;
                -- Process the depend table if the prefix argument is present and not blank, or&lt;br /&gt;
                -- we are processing &amp;quot;prefix1&amp;quot; and &amp;quot;prefix&amp;quot; is present and not blank, and&lt;br /&gt;
                -- if the depend table is present.&lt;br /&gt;
                if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then&lt;br /&gt;
                    for j,dependValue in ipairs(v.depend) do&lt;br /&gt;
                        local dependArgName = dependValue .. tostring(i)&lt;br /&gt;
                        preprocessSingleArg(dependArgName)&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        a = a + step&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.infobox(frame)&lt;br /&gt;
    -- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
    -- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        origArgs = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        origArgs = frame&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Parse the data parameters in the same order that the old {{infobox}} did, so that&lt;br /&gt;
    -- references etc. will display in the expected places. Parameters that depend on&lt;br /&gt;
    -- another parameter are only processed if that parameter is present, to avoid&lt;br /&gt;
    -- phantom references appearing in article reference lists.&lt;br /&gt;
    preprocessSingleArg('child')&lt;br /&gt;
    preprocessSingleArg('bodyclass')&lt;br /&gt;
    preprocessSingleArg('subbox')&lt;br /&gt;
    preprocessSingleArg('bodystyle')&lt;br /&gt;
    preprocessSingleArg('title')&lt;br /&gt;
    preprocessSingleArg('titleclass')&lt;br /&gt;
    preprocessSingleArg('titlestyle')&lt;br /&gt;
    preprocessSingleArg('above')&lt;br /&gt;
    preprocessSingleArg('aboveclass')&lt;br /&gt;
    preprocessSingleArg('abovestyle')&lt;br /&gt;
    preprocessArgs({&lt;br /&gt;
        {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}&lt;br /&gt;
    }, 10)&lt;br /&gt;
    preprocessSingleArg('subheaderstyle')&lt;br /&gt;
    preprocessSingleArg('subheaderclass')&lt;br /&gt;
    preprocessArgs({&lt;br /&gt;
        {prefix = 'image', depend = {'caption', 'imagerowclass'}}&lt;br /&gt;
    }, 10)&lt;br /&gt;
    preprocessSingleArg('captionstyle')&lt;br /&gt;
    preprocessSingleArg('imagestyle')&lt;br /&gt;
    preprocessSingleArg('imageclass')&lt;br /&gt;
    preprocessArgs({&lt;br /&gt;
        {prefix = 'header'},&lt;br /&gt;
        {prefix = 'data', depend = {'label'}},&lt;br /&gt;
        {prefix = 'rowclass'},&lt;br /&gt;
        {prefix = 'rowstyle'},&lt;br /&gt;
        {prefix = 'rowcellstyle'},&lt;br /&gt;
        {prefix = 'class'},&lt;br /&gt;
        {prefix = 'dataid'},&lt;br /&gt;
        {prefix = 'labelid'},&lt;br /&gt;
        {prefix = 'headerid'},&lt;br /&gt;
        {prefix = 'rowid'}&lt;br /&gt;
    }, 50)&lt;br /&gt;
    preprocessSingleArg('headerclass')&lt;br /&gt;
    preprocessSingleArg('headerstyle')&lt;br /&gt;
    preprocessSingleArg('labelstyle')&lt;br /&gt;
    preprocessSingleArg('datastyle')&lt;br /&gt;
    preprocessSingleArg('below')&lt;br /&gt;
    preprocessSingleArg('belowclass')&lt;br /&gt;
    preprocessSingleArg('belowstyle')&lt;br /&gt;
    preprocessSingleArg('name')&lt;br /&gt;
    args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent&lt;br /&gt;
    preprocessSingleArg('decat')&lt;br /&gt;
 &lt;br /&gt;
    return _infobox()&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:InfoboxImage&amp;diff=50</id>
		<title>Module:InfoboxImage</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:InfoboxImage&amp;diff=50"/>
		<updated>2019-09-23T12:07:12Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Inputs:&lt;br /&gt;
--    image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link&lt;br /&gt;
--    page - page to display for multipage images (DjVu)&lt;br /&gt;
--    size - size to display the image&lt;br /&gt;
--    maxsize - maximum size for image&lt;br /&gt;
--    sizedefault - default size to display the image if size param is blank&lt;br /&gt;
--    alt - alt text for image&lt;br /&gt;
--    title - title text for image&lt;br /&gt;
--    border - set to yes if border&lt;br /&gt;
--    center - set to yes, if the image has to be centered&lt;br /&gt;
--    upright - upright image param&lt;br /&gt;
--    suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it&lt;br /&gt;
--    link - page to visit when clicking on image&lt;br /&gt;
-- Outputs:&lt;br /&gt;
--    Formatted image.&lt;br /&gt;
-- More details available at the &amp;quot;Module:InfoboxImage/doc&amp;quot; page&lt;br /&gt;
&lt;br /&gt;
local i = {};&lt;br /&gt;
&lt;br /&gt;
local placeholder_image = {&lt;br /&gt;
    &amp;quot;Blue - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Blue - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Female no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None (square).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Flag of.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Green - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Image is needed male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Location map of None.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Male no free image yet.png&amp;quot;,&lt;br /&gt;
    &amp;quot;Missing flag.png&amp;quot;,&lt;br /&gt;
    &amp;quot;No flag.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No free portrait.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (female).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;No portrait (male).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Red - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male (blue).svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image female.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Silver - Replace this image male.svg&amp;quot;,&lt;br /&gt;
    &amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Cricket no pic.png&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Example.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Image placeholder.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Nocover-upload.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noribbon.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No portrait-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin bandera.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Sin escudo.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image - temple.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image butterfly.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Replace this image1.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Resolution angle.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-No portrait-text-BFD-test.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;Insert image here.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No image available.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET square.png&amp;quot;,&lt;br /&gt;
	&amp;quot;NO IMAGE YET.png&amp;quot;,&lt;br /&gt;
	&amp;quot;No Photo Available.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No Screenshot.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No-image-available.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Null.png&amp;quot;,&lt;br /&gt;
	&amp;quot;PictureNeeded.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Place holder.jpg&amp;quot;,&lt;br /&gt;
	&amp;quot;Unbenannt.JPG&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadACopyrightFreeImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImage.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;UploadAnImageShort.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;CarersLogo.gif&amp;quot;,&lt;br /&gt;
	&amp;quot;Diagram Needed.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;No male portrait.svg&amp;quot;,&lt;br /&gt;
	&amp;quot;NoDVDcover copy.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Placeholder barnstar ribbon.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Project Trains no image.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Image-request.png&amp;quot;,&lt;br /&gt;
	&amp;quot;Noimage.gif&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function i.IsPlaceholder(image)&lt;br /&gt;
    -- change underscores to spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
    assert(image ~= nil, 'mw.ustring.gsub(image, &amp;quot;_&amp;quot;, &amp;quot; &amp;quot;) must not return nil')&lt;br /&gt;
    -- if image starts with [[ then remove that and anything after |&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        image = mw.ustring.sub(image,3);&lt;br /&gt;
        image = mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
        assert(image ~= nil, 'mw.ustring.gsub(image, &amp;quot;([^|]*)|.*&amp;quot;, &amp;quot;%1&amp;quot;) must not return nil')&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');&lt;br /&gt;
    assert(image ~= nil, &amp;quot;mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1') must not return nil&amp;quot;)&lt;br /&gt;
    -- remove prefix if exists&lt;br /&gt;
    local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
    allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
    for i, name in ipairs(allNames) do&lt;br /&gt;
        if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
            image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Trim spaces&lt;br /&gt;
    image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');&lt;br /&gt;
    -- capitalise first letter&lt;br /&gt;
    image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);&lt;br /&gt;
&lt;br /&gt;
    for i,j in pairs(placeholder_image) do&lt;br /&gt;
        if image == j then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function i.InfoboxImage(frame)&lt;br /&gt;
    local image = frame.args[&amp;quot;image&amp;quot;];&lt;br /&gt;
    &lt;br /&gt;
    if image == &amp;quot;&amp;quot; or image == nil then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if image == &amp;quot;&amp;amp;nbsp;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    end&lt;br /&gt;
    if frame.args[&amp;quot;suppressplaceholder&amp;quot;] ~= &amp;quot;no&amp;quot; then&lt;br /&gt;
        if i.IsPlaceholder(image) == true then&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,5)) == &amp;quot;http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[[http:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,6)) == &amp;quot;https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,7)) == &amp;quot;[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.lower(mw.ustring.sub(image,1,8)) == &amp;quot;[[https:&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.sub(image,1,2) == &amp;quot;[[&amp;quot; then&lt;br /&gt;
        -- search for thumbnail images and add to tracking cat if found&lt;br /&gt;
        if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, &amp;quot;|%s*thumb%s*[|%]]&amp;quot;) or mw.ustring.find(image, &amp;quot;|%s*thumbnail%s*[|%]]&amp;quot;)) then&lt;br /&gt;
            return image .. &amp;quot;[[Category:Pages using infoboxes with thumbnail images]]&amp;quot;;&lt;br /&gt;
        elseif mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
            return image .. &amp;quot;[[Category:Pages using deprecated image syntax]]&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            return image;&lt;br /&gt;
        end&lt;br /&gt;
    elseif mw.ustring.sub(image,1,2) == &amp;quot;{{&amp;quot; and mw.ustring.sub(image,1,3) ~= &amp;quot;{{{&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,1) == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,1,5) == mw.ustring.char(127)..&amp;quot;UNIQ&amp;quot; then&lt;br /&gt;
        -- Found strip marker at begining, so pass don't process at all&lt;br /&gt;
        return image;&lt;br /&gt;
    elseif mw.ustring.sub(image,4,9) == &amp;quot;`UNIQ-&amp;quot; then&lt;br /&gt;
        -- Found strip marker at begining, so pass don't process at all&lt;br /&gt;
        return image;&lt;br /&gt;
    else&lt;br /&gt;
        local result = &amp;quot;&amp;quot;;&lt;br /&gt;
        local page = frame.args[&amp;quot;page&amp;quot;];&lt;br /&gt;
        local size = frame.args[&amp;quot;size&amp;quot;];&lt;br /&gt;
        local maxsize = frame.args[&amp;quot;maxsize&amp;quot;];&lt;br /&gt;
        local sizedefault = frame.args[&amp;quot;sizedefault&amp;quot;];&lt;br /&gt;
        local alt = frame.args[&amp;quot;alt&amp;quot;];&lt;br /&gt;
        local link = frame.args[&amp;quot;link&amp;quot;];&lt;br /&gt;
        local title = frame.args[&amp;quot;title&amp;quot;];&lt;br /&gt;
        local border = frame.args[&amp;quot;border&amp;quot;];&lt;br /&gt;
        local upright = frame.args[&amp;quot;upright&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local thumbtime = frame.args[&amp;quot;thumbtime&amp;quot;] or &amp;quot;&amp;quot;;&lt;br /&gt;
        local center= frame.args[&amp;quot;center&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        -- remove prefix if exists&lt;br /&gt;
        local allNames = mw.site.namespaces[6].aliases&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].name&lt;br /&gt;
        allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName&lt;br /&gt;
        for i, name in ipairs(allNames) do&lt;br /&gt;
            if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
                image = mw.ustring.sub(image, mw.ustring.len(name) + 2);&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if maxsize ~= &amp;quot;&amp;quot; and maxsize ~= nil then&lt;br /&gt;
            -- if no sizedefault then set to maxsize&lt;br /&gt;
            if sizedefault == &amp;quot;&amp;quot; or sizedefault == nil then&lt;br /&gt;
                sizedefault = maxsize&lt;br /&gt;
            end&lt;br /&gt;
            -- check to see if size bigger than maxsize&lt;br /&gt;
            if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
                local sizenumber = tonumber(mw.ustring.match(size,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                local maxsizenumber = tonumber(mw.ustring.match(maxsize,&amp;quot;%d*&amp;quot;)) or 0;&lt;br /&gt;
                if sizenumber&amp;gt;maxsizenumber and maxsizenumber&amp;gt;0 then&lt;br /&gt;
                    size = maxsize;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to size if just a number&lt;br /&gt;
        if (tonumber(size) or 0) &amp;gt; 0 then&lt;br /&gt;
            size = size .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        -- add px to sizedefault if just a number&lt;br /&gt;
        if (tonumber(sizedefault) or 0) &amp;gt; 0 then&lt;br /&gt;
            sizedefault = sizedefault .. &amp;quot;px&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        result = &amp;quot;[[File:&amp;quot; .. image;&lt;br /&gt;
        if page ~= &amp;quot;&amp;quot; and page ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|page=&amp;quot; .. page;&lt;br /&gt;
        end&lt;br /&gt;
        if size ~= &amp;quot;&amp;quot; and size ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. size;&lt;br /&gt;
        elseif sizedefault ~= &amp;quot;&amp;quot; and sizedefault ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. sizedefault;&lt;br /&gt;
        else&lt;br /&gt;
            result = result .. &amp;quot;|frameless&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if center == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|center&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|alt=&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        if link ~= &amp;quot;&amp;quot; and link ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|link=&amp;quot; .. link;&lt;br /&gt;
        end&lt;br /&gt;
        if border == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|border&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if upright == &amp;quot;yes&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright&amp;quot;;&lt;br /&gt;
        elseif upright ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|upright=&amp;quot; .. upright;&lt;br /&gt;
        end&lt;br /&gt;
        if thumbtime ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            result = result .. &amp;quot;|thumbtime=&amp;quot; .. thumbtime;&lt;br /&gt;
        end&lt;br /&gt;
        if title ~= &amp;quot;&amp;quot; and title ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. title;&lt;br /&gt;
        elseif alt ~= &amp;quot;&amp;quot; and alt ~= nil then&lt;br /&gt;
            result = result .. &amp;quot;|&amp;quot; .. alt;&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return i;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Navbar&amp;diff=52</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Navbar&amp;diff=52"/>
		<updated>2019-09-23T12:07:12Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs&lt;br /&gt;
local ul&lt;br /&gt;
&lt;br /&gt;
function p.addItem (mini, full, link, descrip, args, url)&lt;br /&gt;
	local l&lt;br /&gt;
	if url then&lt;br /&gt;
		l = {'[', '', ']'}&lt;br /&gt;
	else&lt;br /&gt;
		l = {'[[', '|', ']]'}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag('li')&lt;br /&gt;
		:addClass('nv-'..full)&lt;br /&gt;
		:wikitext(l[1] .. link .. l[2])&lt;br /&gt;
		:tag(args.mini and 'abbr' or 'span')&lt;br /&gt;
			:attr('title', descrip..' this template')&lt;br /&gt;
			:cssText(args.fontstyle)&lt;br /&gt;
			:wikitext(args.mini and mini or full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.brackets (position, c, args, div)&lt;br /&gt;
	if args.brackets then&lt;br /&gt;
		div&lt;br /&gt;
			:tag('span')&lt;br /&gt;
				:css('margin-'..position, '-0.125em')&lt;br /&gt;
				:cssText(args.fontstyle)&lt;br /&gt;
				:wikitext(c)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	local titleArg = 1&lt;br /&gt;
	&lt;br /&gt;
	if args.collapsible then&lt;br /&gt;
		titleArg = 2&lt;br /&gt;
		if not args.plain then args.mini = 1 end&lt;br /&gt;
		if args.fontcolor then&lt;br /&gt;
			args.fontstyle = 'color:' .. args.fontcolor .. ';'&lt;br /&gt;
		end&lt;br /&gt;
		args.style = 'float:left; text-align:left'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.template then&lt;br /&gt;
		titleArg = 'template'&lt;br /&gt;
		show = {true, false, false, false, false, false}&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		for k,v in ipairs(require ('Module:TableTools').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;
	if args.noedit then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(titleText), 'Template')&lt;br /&gt;
	if not title then&lt;br /&gt;
		error('Invalid title ' .. titleText)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''&lt;br /&gt;
	&lt;br /&gt;
	local div = mw.html.create():tag('div')&lt;br /&gt;
	div&lt;br /&gt;
		:addClass('plainlinks')&lt;br /&gt;
		:addClass('hlist')&lt;br /&gt;
		:addClass('navbar')&lt;br /&gt;
		:cssText(args.style)&lt;br /&gt;
&lt;br /&gt;
	if args.mini then div:addClass('mini') end&lt;br /&gt;
&lt;br /&gt;
	if not (args.mini or args.plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag('span')&lt;br /&gt;
				:css('word-spacing', 0)&lt;br /&gt;
				:cssText(args.fontstyle)&lt;br /&gt;
				:wikitext(args.text or 'This box:')&lt;br /&gt;
				:wikitext(' ')&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	p.brackets('right', '&amp;amp;#91; ', args, div)&lt;br /&gt;
	&lt;br /&gt;
	ul = div:tag('ul')&lt;br /&gt;
	if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end&lt;br /&gt;
	if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end&lt;br /&gt;
	if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end&lt;br /&gt;
	if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end&lt;br /&gt;
	if show[5] then&lt;br /&gt;
		local move = mw.title.new ('Special:Movepage')&lt;br /&gt;
		p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end&lt;br /&gt;
	if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end&lt;br /&gt;
	&lt;br /&gt;
	p.brackets('left', ' &amp;amp;#93;', args, div)&lt;br /&gt;
	&lt;br /&gt;
	if args.collapsible then&lt;br /&gt;
		div&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:css('font-size', '114%')&lt;br /&gt;
			:css('margin', args.mini and '0 4em' or '0 7em')&lt;br /&gt;
			:cssText(args.fontstyle)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
	end&lt;br /&gt;
	return p._navbar(getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:String&amp;diff=54</id>
		<title>Module:String</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:String&amp;diff=54"/>
		<updated>2019-09-23T12:07:12Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to 'true' or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to 'true' or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'s'} )&lt;br /&gt;
	local s = new_args['s'] or ''&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The fist index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )&lt;br /&gt;
	local s = new_args['s'] or ''&lt;br /&gt;
	local i = tonumber( new_args['i'] ) or 1&lt;br /&gt;
	local j = tonumber( new_args['j'] ) or -1&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s )&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( 'String subset index out of range' )&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( 'String subset indices out of order' )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
	if s == '' then&lt;br /&gt;
		return str._error( 'Target string is empty' )&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == '' then&lt;br /&gt;
		return str._error( 'Pattern string is empty' )&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( 'Requested start is out of range' )&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( 'Match index is out of range' )&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern)&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {}&lt;br /&gt;
			local count = 1&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w&lt;br /&gt;
				count = count + 1&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( 'Match not found' )&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )&lt;br /&gt;
	local s = new_args['s'] or ''&lt;br /&gt;
	local start = tonumber( new_args['start'] ) or 1&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args['plain'] or false )&lt;br /&gt;
	local pattern = new_args['pattern'] or ''&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args['match']) or 1 )&lt;br /&gt;
	local nomatch = new_args['nomatch']&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'target', 'pos'} )&lt;br /&gt;
	local target_str = new_args['target'] or ''&lt;br /&gt;
	local pos = tonumber( new_args['pos'] ) or 0&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( 'String index out of range' )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'source', 'target'} )&lt;br /&gt;
	local source_str = new_args['source'] or ''&lt;br /&gt;
	local target_str = new_args['target'] or ''&lt;br /&gt;
&lt;br /&gt;
	if target_str == '' then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )&lt;br /&gt;
	local source_str = new_args['source'] or ''&lt;br /&gt;
	local pattern = new_args['target'] or ''&lt;br /&gt;
	local start_pos = tonumber(new_args['start']) or 1&lt;br /&gt;
	local plain = new_args['plain'] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == '' or pattern == '' then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )&lt;br /&gt;
	local source_str = new_args['source'] or ''&lt;br /&gt;
	local pattern = new_args['pattern'] or ''&lt;br /&gt;
	local replace = new_args['replace'] or ''&lt;br /&gt;
	local count = tonumber( new_args['count'] )&lt;br /&gt;
	local plain = new_args['plain'] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == '' or pattern == '' then&lt;br /&gt;
		return source_str&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
		replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ) --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count )&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( 'function rep expects a number as second parameter, received &amp;quot;' .. ( frame.args[2] or '' ) .. '&amp;quot;' )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or '', repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( 'No pattern string specified' )&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
count&lt;br /&gt;
This function counts the number of occurrences of one string in another.&lt;br /&gt;
]]&lt;br /&gt;
function str.count(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})&lt;br /&gt;
	local source = args.source or ''&lt;br /&gt;
	local pattern = args.pattern or ''&lt;br /&gt;
	local plain = str._getBoolean(args.plain or true)&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern(pattern)&lt;br /&gt;
	end&lt;br /&gt;
	local _, count = mw.ustring.gsub(source, pattern, '')&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
endswith&lt;br /&gt;
This function determines whether a string ends with another string.&lt;br /&gt;
]]&lt;br /&gt;
function str.endswith(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {'source', 'pattern'})&lt;br /&gt;
	local source = args.source or ''&lt;br /&gt;
	local pattern = args.pattern or ''&lt;br /&gt;
	if pattern == '' then&lt;br /&gt;
		-- All strings end with the empty string.&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
join&lt;br /&gt;
&lt;br /&gt;
Join all non empty arguments together; the first argument is the separator.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|join|sep|one|two|three}}&lt;br /&gt;
]]&lt;br /&gt;
function str.join(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	local sep&lt;br /&gt;
	for _, v in ipairs( frame.args ) do&lt;br /&gt;
		if sep then&lt;br /&gt;
			if v ~= '' then&lt;br /&gt;
				table.insert(args, v)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			sep = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( args, sep or '' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	local value&lt;br /&gt;
&lt;br /&gt;
	for _, arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index]&lt;br /&gt;
			index = index + 1&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local error_category = frame.args.error_category or 'Errors reported by Module String'&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false&lt;br /&gt;
	local no_category = frame.args.no_category or false&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;String Module Error: ' .. error_str .. '&amp;lt;/strong&amp;gt;'&lt;br /&gt;
	if error_category ~= '' and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = '[[Category:' .. error_category .. ']]' .. error_str&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == 'string' then&lt;br /&gt;
		boolean_str = boolean_str:lower()&lt;br /&gt;
		if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'&lt;br /&gt;
				or boolean_str == '' then&lt;br /&gt;
			boolean_value = false&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == 'boolean' then&lt;br /&gt;
		boolean_value = boolean_str&lt;br /&gt;
	else&lt;br /&gt;
		error( 'No boolean value found' )&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Yesno&amp;diff=56</id>
		<title>Module:Yesno</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Yesno&amp;diff=56"/>
		<updated>2019-09-23T12:07:12Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == 'string' and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == 'yes'&lt;br /&gt;
		or val == 'y'&lt;br /&gt;
		or val == 'true'&lt;br /&gt;
		or val == 't'&lt;br /&gt;
		or val == 'on'&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == 'no'&lt;br /&gt;
		or val == 'n'&lt;br /&gt;
		or val == 'false'&lt;br /&gt;
		or val == 'f'&lt;br /&gt;
		or val == 'off'&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Arguments&amp;diff=42</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Arguments&amp;diff=42"/>
		<updated>2019-09-23T12:07:11Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require('libraryUtil')&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don't have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == 'string' then&lt;br /&gt;
		val = val:match('^%s*(.-)%s*$')&lt;br /&gt;
		if val == '' then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == 'string' then&lt;br /&gt;
		return val:match('^%s*(.-)%s*$')&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == 'string' then&lt;br /&gt;
		if val:find('%S') then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType('getArgs', 1, frame, 'table', true)&lt;br /&gt;
	checkType('getArgs', 2, options, 'table', true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame's availability. If we weren't&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == 'table' and type(frame.getParent) == 'function' then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame's title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub('/sandbox$', '')&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == 'table' then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn't set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don't have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= 'function' then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option 'valueFunc'&amp;quot;&lt;br /&gt;
					.. '(function expected, got '&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. ')',&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are 's' (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= 'h' then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = 's'&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == 'string' then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = 'h'&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == 'string' then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				'could not write to argument table key &amp;quot;'&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. '&amp;quot;; the table is read-only',&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				'could not write to argument table key &amp;quot;'&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. '&amp;quot;; overwriting existing arguments is not permitted',&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn't looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = 'h'&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= 'string' or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won't cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Documentation&amp;diff=44</id>
		<title>Module:Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Documentation&amp;diff=44"/>
		<updated>2019-09-23T12:07:11Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{documentation}}.&lt;br /&gt;
&lt;br /&gt;
-- Get required modules.&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local messageBox = require('Module:Message box')&lt;br /&gt;
&lt;br /&gt;
-- Get the config table.&lt;br /&gt;
local cfg = mw.loadData('Module:Documentation/config')&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Often-used functions.&lt;br /&gt;
local ugsub = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--&lt;br /&gt;
-- These are defined as local functions, but are made available in the p&lt;br /&gt;
-- table for testing purposes.&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function message(cfgKey, valArray, expectType)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Gets a message from the cfg table and formats it if appropriate.&lt;br /&gt;
	-- The function raises an error if the value from the cfg table is not&lt;br /&gt;
	-- of the type expectType. The default type for expectType is 'string'.&lt;br /&gt;
	-- If the table valArray is present, strings such as $1, $2 etc. in the&lt;br /&gt;
	-- message are substituted with values from the table keys [1], [2] etc.&lt;br /&gt;
	-- For example, if the message &amp;quot;foo-message&amp;quot; had the value 'Foo $2 bar $1.',&lt;br /&gt;
	-- message('foo-message', {'baz', 'qux'}) would return &amp;quot;Foo qux bar baz.&amp;quot;&lt;br /&gt;
	--]]&lt;br /&gt;
	local msg = cfg[cfgKey]&lt;br /&gt;
	expectType = expectType or 'string'&lt;br /&gt;
	if type(msg) ~= expectType then&lt;br /&gt;
		error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)&lt;br /&gt;
	end&lt;br /&gt;
	if not valArray then&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getMessageVal(match)&lt;br /&gt;
		match = tonumber(match)&lt;br /&gt;
		return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = ugsub(msg, '$([1-9][0-9]*)', getMessageVal)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.message = message&lt;br /&gt;
&lt;br /&gt;
local function makeWikilink(page, display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return mw.ustring.format('[[%s|%s]]', page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.ustring.format('[[%s]]', page)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeWikilink = makeWikilink&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	local catns = mw.site.namespaces[14].name&lt;br /&gt;
	return makeWikilink(catns .. ':' .. cat, sort)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeCategoryLink = makeCategoryLink&lt;br /&gt;
&lt;br /&gt;
local function makeUrlLink(url, display)&lt;br /&gt;
	return mw.ustring.format('[%s %s]', url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeUrlLink = makeUrlLink&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(...)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local lim = select('#', ...)&lt;br /&gt;
	if lim &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, lim do&lt;br /&gt;
		ret[#ret + 1] = select(i, ...)&lt;br /&gt;
	end&lt;br /&gt;
	return '&amp;lt;small style=&amp;quot;font-style: normal;&amp;quot;&amp;gt;(' .. table.concat(ret, ' &amp;amp;#124; ') .. ')&amp;lt;/small&amp;gt;'&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
p.makeToolbar = makeToolbar&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Argument processing&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame, {&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
				if type(value) == 'string' then&lt;br /&gt;
					value = value:match('^%s*(.-)%s*$') -- Remove whitespace.&lt;br /&gt;
					if key == 'heading' or value ~= '' then&lt;br /&gt;
						return value&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					return value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Main function&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.main = makeInvokeFunc('_main')&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function defines logic flow for the module.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'main-div-id' --&amp;gt; 'template-documentation'&lt;br /&gt;
	-- 'main-div-classes' --&amp;gt; 'template-documentation iezoomfix'&lt;br /&gt;
	--]]&lt;br /&gt;
	local env = p.getEnvironment(args)&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(p.protectionTemplate(env))&lt;br /&gt;
		:wikitext(p.sandboxNotice(args, env))&lt;br /&gt;
		 -- This div tag is from {{documentation/start box}}, but moving it here&lt;br /&gt;
		 -- so that we don't have to worry about unclosed tags.&lt;br /&gt;
		:tag('div')&lt;br /&gt;
			:attr('id', message('main-div-id'))&lt;br /&gt;
			:addClass(message('main-div-classes'))&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(p._startBox(args, env))&lt;br /&gt;
			:wikitext(p._content(args, env))&lt;br /&gt;
			:tag('div')&lt;br /&gt;
				:css('clear', 'both') -- So right or left floating items don't stick out of the doc box.&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(p._endBox(args, env))&lt;br /&gt;
		:wikitext(p.addTrackingCategories(env))&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Environment settings&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.getEnvironment(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table with information about the environment, including title objects and other namespace- or&lt;br /&gt;
	-- path-related data.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--&lt;br /&gt;
	-- Title objects include:&lt;br /&gt;
	-- env.title - the page we are making documentation for (usually the current title)&lt;br /&gt;
	-- env.templateTitle - the template (or module, file, etc.)&lt;br /&gt;
	-- env.docTitle - the /doc subpage.&lt;br /&gt;
	-- env.sandboxTitle - the /sandbox subpage.&lt;br /&gt;
	-- env.testcasesTitle - the /testcases subpage.&lt;br /&gt;
	-- env.printTitle - the print version of the template, located at the /Print subpage.&lt;br /&gt;
	--&lt;br /&gt;
	-- Data includes:&lt;br /&gt;
	-- env.protectionLevels - the protection levels table of the title object.&lt;br /&gt;
	-- env.subjectSpace - the number of the title's subject namespace.&lt;br /&gt;
	-- env.docSpace - the number of the namespace the title puts its documentation in.&lt;br /&gt;
	-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.&lt;br /&gt;
	-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.&lt;br /&gt;
	-- &lt;br /&gt;
	-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value&lt;br /&gt;
	-- returned will be nil.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local env, envFuncs = {}, {}&lt;br /&gt;
&lt;br /&gt;
	-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value&lt;br /&gt;
	-- returned by that function is memoized in the env table so that we don't call any of the functions&lt;br /&gt;
	-- more than once. (Nils won't be memoized.)&lt;br /&gt;
	setmetatable(env, {&lt;br /&gt;
		__index = function (t, key)&lt;br /&gt;
			local envFunc = envFuncs[key]&lt;br /&gt;
			if envFunc then&lt;br /&gt;
				local success, val = pcall(envFunc)&lt;br /&gt;
				if success then&lt;br /&gt;
					env[key] = val -- Memoise the value.&lt;br /&gt;
					return val&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})	&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.title()&lt;br /&gt;
		-- The title object for the current page, or a test page passed with args.page.&lt;br /&gt;
		local title&lt;br /&gt;
		local titleArg = args.page&lt;br /&gt;
		if titleArg then&lt;br /&gt;
			title = mw.title.new(titleArg)&lt;br /&gt;
		else&lt;br /&gt;
			title = mw.title.getCurrentTitle()&lt;br /&gt;
		end&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.templateTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- The template (or module, etc.) title object.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- 'sandbox-subpage' --&amp;gt; 'sandbox'&lt;br /&gt;
		-- 'testcases-subpage' --&amp;gt; 'testcases'&lt;br /&gt;
		--]]&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local subpage = title.subpageText&lt;br /&gt;
		if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.baseText)&lt;br /&gt;
		else&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object of the /doc subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- 'doc-subpage' --&amp;gt; 'doc'&lt;br /&gt;
		--]]&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local docname = args[1] -- User-specified doc page.&lt;br /&gt;
		local docpage&lt;br /&gt;
		if docname then&lt;br /&gt;
			docpage = docname&lt;br /&gt;
		else&lt;br /&gt;
			docpage = env.docpageBase .. '/' .. message('doc-subpage')&lt;br /&gt;
		end&lt;br /&gt;
		return mw.title.new(docpage)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.sandboxTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /sandbox subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- 'sandbox-subpage' --&amp;gt; 'sandbox'&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage'))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.testcasesTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /testcases subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- 'testcases-subpage' --&amp;gt; 'testcases'&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage'))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.printTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /Print subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- 'print-subpage' --&amp;gt; 'Print'&lt;br /&gt;
		--]]&lt;br /&gt;
		return env.templateTitle:subPageTitle(message('print-subpage'))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.protectionLevels()&lt;br /&gt;
		-- The protection levels table of the title object.&lt;br /&gt;
		return env.title.protectionLevels&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.subjectSpace()&lt;br /&gt;
		-- The subject namespace number.&lt;br /&gt;
		return mw.site.namespaces[env.title.namespace].subject.id&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docSpace()&lt;br /&gt;
		-- The documentation namespace number. For most namespaces this is the same as the&lt;br /&gt;
		-- subject namespace. However, pages in the Article, File, MediaWiki or Category&lt;br /&gt;
		-- namespaces must have their /doc, /sandbox and /testcases pages in talk space.&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then&lt;br /&gt;
			return subjectSpace + 1&lt;br /&gt;
		else&lt;br /&gt;
			return subjectSpace&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docpageBase()&lt;br /&gt;
		-- The base page of the /doc, /sandbox, and /testcases subpages.&lt;br /&gt;
		-- For some namespaces this is the talk page, rather than the template page.&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local docSpace = env.docSpace&lt;br /&gt;
		local docSpaceText = mw.site.namespaces[docSpace].name&lt;br /&gt;
		-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.&lt;br /&gt;
		return docSpaceText .. ':' .. templateTitle.text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.compareUrl()&lt;br /&gt;
		-- Diff link between the sandbox and the main template using [[Special:ComparePages]].&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local sandboxTitle = env.sandboxTitle&lt;br /&gt;
		if templateTitle.exists and sandboxTitle.exists then&lt;br /&gt;
			local compareUrl = mw.uri.fullUrl(&lt;br /&gt;
				'Special:ComparePages',&lt;br /&gt;
				{page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}&lt;br /&gt;
			)&lt;br /&gt;
			return tostring(compareUrl)&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	return env&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Auxiliary templates&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.sandboxNotice(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates a sandbox notice for display above sandbox pages.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'sandbox-notice-image' --&amp;gt; '[[Image:Sandbox.svg|50px|alt=|link=]]'&lt;br /&gt;
	-- 'sandbox-notice-blurb' --&amp;gt; 'This is the $1 for $2.'&lt;br /&gt;
	-- 'sandbox-notice-diff-blurb' --&amp;gt; 'This is the $1 for $2 ($3).'&lt;br /&gt;
	-- 'sandbox-notice-pagetype-template' --&amp;gt; '[[Wikipedia:Template test cases|template sandbox]] page'&lt;br /&gt;
	-- 'sandbox-notice-pagetype-module' --&amp;gt; '[[Wikipedia:Template test cases|module sandbox]] page'&lt;br /&gt;
	-- 'sandbox-notice-pagetype-other' --&amp;gt; 'sandbox page'&lt;br /&gt;
	-- 'sandbox-notice-compare-link-display' --&amp;gt; 'diff'&lt;br /&gt;
	-- 'sandbox-notice-testcases-blurb' --&amp;gt; 'See also the companion subpage for $1.'&lt;br /&gt;
	-- 'sandbox-notice-testcases-link-display' --&amp;gt; 'test cases'&lt;br /&gt;
	-- 'sandbox-category' --&amp;gt; 'Template sandboxes'&lt;br /&gt;
	--]=]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not (subjectSpace and title and sandboxTitle and templateTitle and mw.title.equals(title, sandboxTitle)) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Build the table of arguments to pass to {{ombox}}. We need just two fields, &amp;quot;image&amp;quot; and &amp;quot;text&amp;quot;.&lt;br /&gt;
	local omargs = {}&lt;br /&gt;
	omargs.image = message('sandbox-notice-image')&lt;br /&gt;
	-- Get the text. We start with the opening blurb, which is something like&lt;br /&gt;
	-- &amp;quot;This is the template sandbox for [[Template:Foo]] (diff).&amp;quot;&lt;br /&gt;
	local text = ''&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message('sandbox-notice-pagetype-template')&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message('sandbox-notice-pagetype-module')&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message('sandbox-notice-pagetype-other')&lt;br /&gt;
	end&lt;br /&gt;
	local templateLink = makeWikilink(templateTitle.prefixedText)&lt;br /&gt;
	local compareUrl = env.compareUrl&lt;br /&gt;
	if compareUrl then&lt;br /&gt;
		local compareDisplay = message('sandbox-notice-compare-link-display')&lt;br /&gt;
		local compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink})&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. message('sandbox-notice-blurb', {pagetype, templateLink})&lt;br /&gt;
	end&lt;br /&gt;
	-- Get the test cases page blurb if the page exists. This is something like&lt;br /&gt;
	-- &amp;quot;See also the companion subpage for [[Template:Foo/testcases|test cases]].&amp;quot;&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	if testcasesTitle and testcasesTitle.exists then&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')&lt;br /&gt;
			local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display')&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			text = text .. '&amp;lt;br /&amp;gt;' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink})&lt;br /&gt;
		else&lt;br /&gt;
			local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			text = text .. '&amp;lt;br /&amp;gt;' .. message('sandbox-notice-testcases-blurb', {testcasesLink})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Add the sandbox to the sandbox category.&lt;br /&gt;
	text = text .. makeCategoryLink(message('sandbox-category'))&lt;br /&gt;
	omargs.text = text&lt;br /&gt;
	local ret = '&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;'&lt;br /&gt;
	ret = ret .. messageBox.main('ombox', omargs)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.protectionTemplate(env)&lt;br /&gt;
	-- Generates the padlock icon in the top right.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'protection-template' --&amp;gt; 'pp-template'&lt;br /&gt;
	-- 'protection-template-args' --&amp;gt; {docusage = 'yes'}&lt;br /&gt;
	local protectionLevels, mProtectionBanner&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	protectionLevels = env.protectionLevels&lt;br /&gt;
	if not protectionLevels then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local editProt = protectionLevels.edit and protectionLevels.edit[1]&lt;br /&gt;
	local moveProt = protectionLevels.move and protectionLevels.move[1]&lt;br /&gt;
	if editProt then&lt;br /&gt;
		-- The page is edit-protected.&lt;br /&gt;
		mProtectionBanner = require('Module:Protection banner')&lt;br /&gt;
		local reason = message('protection-reason-edit')&lt;br /&gt;
		return mProtectionBanner._main{reason, small = true}&lt;br /&gt;
	elseif moveProt and moveProt ~= 'autoconfirmed' then&lt;br /&gt;
		-- The page is move-protected but not edit-protected. Exclude move&lt;br /&gt;
		-- protection with the level &amp;quot;autoconfirmed&amp;quot;, as this is equivalent to&lt;br /&gt;
		-- no move protection at all.&lt;br /&gt;
		mProtectionBanner = require('Module:Protection banner')&lt;br /&gt;
		return mProtectionBanner._main{action = 'move', small = true}&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Start box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.startBox = makeInvokeFunc('_startBox')&lt;br /&gt;
&lt;br /&gt;
function p._startBox(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function generates the start box.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make&lt;br /&gt;
	-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox&lt;br /&gt;
	-- which generate the box HTML.&lt;br /&gt;
	--]]&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local links&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content then&lt;br /&gt;
		-- No need to include the links if the documentation is on the template page itself.&lt;br /&gt;
		local linksData = p.makeStartBoxLinksData(args, env)&lt;br /&gt;
		if linksData then&lt;br /&gt;
			links = p.renderStartBoxLinks(linksData)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the start box html.&lt;br /&gt;
	local data = p.makeStartBoxData(args, env, links)&lt;br /&gt;
	if data then&lt;br /&gt;
		return p.renderStartBox(data)&lt;br /&gt;
	else&lt;br /&gt;
		-- User specified no heading.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxLinksData(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Does initial processing of data to make the [view] [edit] [history] [purge] links.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'view-link-display' --&amp;gt; 'view'&lt;br /&gt;
	-- 'edit-link-display' --&amp;gt; 'edit'&lt;br /&gt;
	-- 'history-link-display' --&amp;gt; 'history'&lt;br /&gt;
	-- 'purge-link-display' --&amp;gt; 'purge'&lt;br /&gt;
	-- 'file-docpage-preload' --&amp;gt; 'Template:Documentation/preload-filespace'&lt;br /&gt;
	-- 'module-preload' --&amp;gt; 'Template:Documentation/preload-module-doc'&lt;br /&gt;
	-- 'docpage-preload' --&amp;gt; 'Template:Documentation/preload'&lt;br /&gt;
	-- 'create-link-display' --&amp;gt; 'create'&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not title or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if docTitle.isRedirect then &lt;br /&gt;
		docTitle = docTitle.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {}&lt;br /&gt;
	data.title = title&lt;br /&gt;
	data.docTitle = docTitle&lt;br /&gt;
	-- View, display, edit, and purge links if /doc exists.&lt;br /&gt;
	data.viewLinkDisplay = message('view-link-display')&lt;br /&gt;
	data.editLinkDisplay = message('edit-link-display')&lt;br /&gt;
	data.historyLinkDisplay = message('history-link-display')&lt;br /&gt;
	data.purgeLinkDisplay = message('purge-link-display')&lt;br /&gt;
	-- Create link if /doc doesn't exist.&lt;br /&gt;
	local preload = args.preload&lt;br /&gt;
	if not preload then&lt;br /&gt;
		if subjectSpace == 6 then -- File namespace&lt;br /&gt;
			preload = message('file-docpage-preload')&lt;br /&gt;
		elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
			preload = message('module-preload')&lt;br /&gt;
		else&lt;br /&gt;
			preload = message('docpage-preload')&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.preload = preload&lt;br /&gt;
	data.createLinkDisplay = message('create-link-display')&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBoxLinks(data)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the [view][edit][history][purge] or [create] links from the data table.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxLinksData&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local function escapeBrackets(s)&lt;br /&gt;
		-- Escapes square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub('%[', '&amp;amp;#91;') -- Replace square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub('%]', '&amp;amp;#93;')&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret&lt;br /&gt;
	local docTitle = data.docTitle&lt;br /&gt;
	local title = data.title&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)&lt;br /&gt;
		local editLink = makeUrlLink(docTitle:fullUrl{action = 'edit'}, data.editLinkDisplay)&lt;br /&gt;
		local historyLink = makeUrlLink(docTitle:fullUrl{action = 'history'}, data.historyLinkDisplay)&lt;br /&gt;
		local purgeLink = makeUrlLink(title:fullUrl{action = 'purge'}, data.purgeLinkDisplay)&lt;br /&gt;
		ret = '[%s] [%s] [%s] [%s]'&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, viewLink, editLink, historyLink, purgeLink)&lt;br /&gt;
	else&lt;br /&gt;
		local createLink = makeUrlLink(docTitle:fullUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay)&lt;br /&gt;
		ret = '[%s]'&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, createLink)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxData(args, env, links)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'documentation-icon-wikitext' --&amp;gt; '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'&lt;br /&gt;
	-- 'template-namespace-heading' --&amp;gt; 'Template documentation'&lt;br /&gt;
	-- 'module-namespace-heading' --&amp;gt; 'Module documentation'&lt;br /&gt;
	-- 'file-namespace-heading' --&amp;gt; 'Summary'&lt;br /&gt;
	-- 'other-namespaces-heading' --&amp;gt; 'Documentation'&lt;br /&gt;
	-- 'start-box-linkclasses' --&amp;gt; 'mw-editsection-like plainlinks'&lt;br /&gt;
	-- 'start-box-link-id' --&amp;gt; 'doc_editlinks'&lt;br /&gt;
	-- 'testcases-create-link-display' --&amp;gt; 'create'&lt;br /&gt;
	--]=]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not subjectSpace then&lt;br /&gt;
		-- Default to an &amp;quot;other namespaces&amp;quot; namespace, so that we get at least some output&lt;br /&gt;
		-- if an error occurs.&lt;br /&gt;
		subjectSpace = 2&lt;br /&gt;
	end&lt;br /&gt;
	local data = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Heading&lt;br /&gt;
	local heading = args.heading -- Blank values are not removed.&lt;br /&gt;
	if heading == '' then&lt;br /&gt;
		-- Don't display the start box if the heading arg is defined but blank.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if heading then&lt;br /&gt;
		data.heading = heading&lt;br /&gt;
	elseif subjectSpace == 10 then -- Template namespace&lt;br /&gt;
		data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading')&lt;br /&gt;
	elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
		data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading')&lt;br /&gt;
	elseif subjectSpace == 6 then -- File namespace&lt;br /&gt;
		data.heading = message('file-namespace-heading')&lt;br /&gt;
	else&lt;br /&gt;
		data.heading = message('other-namespaces-heading')&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Heading CSS&lt;br /&gt;
	local headingStyle = args['heading-style']&lt;br /&gt;
	if headingStyle then&lt;br /&gt;
		data.headingStyleText = headingStyle&lt;br /&gt;
	elseif subjectSpace == 10 then&lt;br /&gt;
		-- We are in the template or template talk namespaces.&lt;br /&gt;
		data.headingFontWeight = 'bold'&lt;br /&gt;
		data.headingFontSize = '125%'&lt;br /&gt;
	else&lt;br /&gt;
		data.headingFontSize = '150%'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Data for the [view][edit][history][purge] or [create] links.&lt;br /&gt;
	if links then&lt;br /&gt;
		data.linksClass = message('start-box-linkclasses')&lt;br /&gt;
		data.linksId = message('start-box-link-id')&lt;br /&gt;
		data.links = links&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBox(data)&lt;br /&gt;
	-- Renders the start box html.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxData.&lt;br /&gt;
	local sbox = mw.html.create('div')&lt;br /&gt;
	sbox&lt;br /&gt;
		:css('padding-bottom', '3px')&lt;br /&gt;
		:css('border-bottom', '1px solid #aaa')&lt;br /&gt;
		:css('margin-bottom', '1ex')&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag('span')&lt;br /&gt;
			:cssText(data.headingStyleText)&lt;br /&gt;
			:css('font-weight', data.headingFontWeight)&lt;br /&gt;
			:css('font-size', data.headingFontSize)&lt;br /&gt;
			:wikitext(data.heading)&lt;br /&gt;
	local links = data.links&lt;br /&gt;
	if links then&lt;br /&gt;
		sbox:tag('span')&lt;br /&gt;
			:addClass(data.linksClass)&lt;br /&gt;
			:attr('id', data.linksId)&lt;br /&gt;
			:wikitext(links)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(sbox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Documentation content&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.content = makeInvokeFunc('_content')&lt;br /&gt;
&lt;br /&gt;
function p._content(args, env)&lt;br /&gt;
	-- Displays the documentation contents&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content and docTitle and docTitle.exists then&lt;br /&gt;
		content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}&lt;br /&gt;
	end&lt;br /&gt;
	-- The line breaks below are necessary so that &amp;quot;=== Headings ===&amp;quot; at the start and end&lt;br /&gt;
	-- of docs are interpreted correctly.&lt;br /&gt;
	return '\n' .. (content or '') .. '\n' &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.contentTitle = makeInvokeFunc('_contentTitle')&lt;br /&gt;
&lt;br /&gt;
function p._contentTitle(args, env)&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not args.content and docTitle and docTitle.exists then&lt;br /&gt;
		return docTitle.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- End box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.endBox = makeInvokeFunc('_endBox')&lt;br /&gt;
&lt;br /&gt;
function p._endBox(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- This function generates the end box (also known as the link box).&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'fmbox-id' --&amp;gt; 'documentation-meta-data'&lt;br /&gt;
	-- 'fmbox-style' --&amp;gt; 'background-color: #ecfcf4'&lt;br /&gt;
	-- 'fmbox-textstyle' --&amp;gt; 'font-style: italic'&lt;br /&gt;
	-- &lt;br /&gt;
	-- The HTML is generated by the {{fmbox}} template, courtesy of [[Module:Message box]].&lt;br /&gt;
	--]=]&lt;br /&gt;
	&lt;br /&gt;
	-- Get environment data.&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not subjectSpace or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	-- Check whether we should output the end box at all. Add the end&lt;br /&gt;
	-- box by default if the documentation exists or if we are in the&lt;br /&gt;
	-- user, module or template namespaces.&lt;br /&gt;
	local linkBox = args['link box']&lt;br /&gt;
	if linkBox == 'off'&lt;br /&gt;
		or not (&lt;br /&gt;
			docTitle.exists&lt;br /&gt;
			or subjectSpace == 2&lt;br /&gt;
			or subjectSpace == 828&lt;br /&gt;
			or subjectSpace == 10&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the arguments for {{fmbox}}.&lt;br /&gt;
	local fmargs = {}&lt;br /&gt;
	fmargs.id = message('fmbox-id') -- Sets 'documentation-meta-data'&lt;br /&gt;
	fmargs.image = 'none'&lt;br /&gt;
	fmargs.style = message('fmbox-style') -- Sets 'background-color: #ecfcf4'&lt;br /&gt;
	fmargs.textstyle = message('fmbox-textstyle') -- 'font-style: italic;'&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the fmbox text field.&lt;br /&gt;
	local text = ''&lt;br /&gt;
	if linkBox then&lt;br /&gt;
		text = text .. linkBox&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. (p.makeDocPageBlurb(args, env) or '') -- &amp;quot;This documentation is transcluded from [[Foo]].&amp;quot; &lt;br /&gt;
		if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then&lt;br /&gt;
			-- We are in the user, template or module namespaces.&lt;br /&gt;
			-- Add sandbox and testcases links.&lt;br /&gt;
			-- &amp;quot;Editors can experiment in this template's sandbox and testcases pages.&amp;quot;&lt;br /&gt;
			text = text .. (p.makeExperimentBlurb(args, env) or '')&lt;br /&gt;
			text = text .. '&amp;lt;br /&amp;gt;'&lt;br /&gt;
			if not args.content and not args[1] then&lt;br /&gt;
				-- &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
				-- Don't show this message with inline docs or with an explicitly specified doc page,&lt;br /&gt;
				-- as then it is unclear where to add the categories.&lt;br /&gt;
				text = text .. (p.makeCategoriesBlurb(args, env) or '')&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --&amp;quot;Subpages of this template&amp;quot;&lt;br /&gt;
			local printBlurb = p.makePrintBlurb(args, env) -- Two-line blurb about print versions of templates.&lt;br /&gt;
			if printBlurb then&lt;br /&gt;
				text = text .. '&amp;lt;br /&amp;gt;' .. printBlurb&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	fmargs.text = text&lt;br /&gt;
&lt;br /&gt;
	return messageBox.main('fmbox', fmargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeDocPageBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Makes the blurb &amp;quot;This documentation is transcluded from [[Template:Foo]] (edit, history)&amp;quot;.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'edit-link-display' --&amp;gt; 'edit'&lt;br /&gt;
	-- 'history-link-display' --&amp;gt; 'history'&lt;br /&gt;
	-- 'transcluded-from-blurb' --&amp;gt; &lt;br /&gt;
	-- 'The above [[Wikipedia:Template documentation|documentation]] &lt;br /&gt;
	-- is [[Wikipedia:Transclusion|transcluded]] from $1.'&lt;br /&gt;
	-- 'module-preload' --&amp;gt; 'Template:Documentation/preload-module-doc'&lt;br /&gt;
	-- 'create-link-display' --&amp;gt; 'create'&lt;br /&gt;
	-- 'create-module-doc-blurb' --&amp;gt;&lt;br /&gt;
	-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'&lt;br /&gt;
	--]=]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		-- /doc exists; link to it.&lt;br /&gt;
		local docLink = makeWikilink(docTitle.prefixedText)&lt;br /&gt;
		local editUrl = docTitle:fullUrl{action = 'edit'}&lt;br /&gt;
		local editDisplay = message('edit-link-display')&lt;br /&gt;
		local editLink = makeUrlLink(editUrl, editDisplay)&lt;br /&gt;
		local historyUrl = docTitle:fullUrl{action = 'history'}&lt;br /&gt;
		local historyDisplay = message('history-link-display')&lt;br /&gt;
		local historyLink = makeUrlLink(historyUrl, historyDisplay)&lt;br /&gt;
		ret = message('transcluded-from-blurb', {docLink})&lt;br /&gt;
			.. ' '&lt;br /&gt;
			.. makeToolbar(editLink, historyLink)&lt;br /&gt;
			.. '&amp;lt;br /&amp;gt;'&lt;br /&gt;
	elseif env.subjectSpace == 828 then&lt;br /&gt;
		-- /doc does not exist; ask to create it.&lt;br /&gt;
		local createUrl = docTitle:fullUrl{action = 'edit', preload = message('module-preload')}&lt;br /&gt;
		local createDisplay = message('create-link-display')&lt;br /&gt;
		local createLink = makeUrlLink(createUrl, createDisplay)&lt;br /&gt;
		ret = message('create-module-doc-blurb', {createLink})&lt;br /&gt;
			.. '&amp;lt;br /&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeExperimentBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Renders the text &amp;quot;Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'sandbox-link-display' --&amp;gt; 'sandbox'&lt;br /&gt;
	-- 'sandbox-edit-link-display' --&amp;gt; 'edit'&lt;br /&gt;
	-- 'compare-link-display' --&amp;gt; 'diff'&lt;br /&gt;
	-- 'module-sandbox-preload' --&amp;gt; 'Template:Documentation/preload-module-sandbox'&lt;br /&gt;
	-- 'template-sandbox-preload' --&amp;gt; 'Template:Documentation/preload-sandbox'&lt;br /&gt;
	-- 'sandbox-create-link-display' --&amp;gt; 'create'&lt;br /&gt;
	-- 'mirror-edit-summary' --&amp;gt; 'Create sandbox version of $1'&lt;br /&gt;
	-- 'mirror-link-display' --&amp;gt; 'mirror'&lt;br /&gt;
	-- 'mirror-link-preload' --&amp;gt; 'Template:Documentation/mirror'&lt;br /&gt;
	-- 'sandbox-link-display' --&amp;gt; 'sandbox'&lt;br /&gt;
	-- 'testcases-link-display' --&amp;gt; 'testcases'&lt;br /&gt;
	-- 'testcases-edit-link-display'--&amp;gt; 'edit'&lt;br /&gt;
	-- 'template-sandbox-preload' --&amp;gt; 'Template:Documentation/preload-sandbox'&lt;br /&gt;
	-- 'testcases-create-link-display' --&amp;gt; 'create'&lt;br /&gt;
	-- 'testcases-link-display' --&amp;gt; 'testcases'&lt;br /&gt;
	-- 'testcases-edit-link-display' --&amp;gt; 'edit'&lt;br /&gt;
	-- 'module-testcases-preload' --&amp;gt; 'Template:Documentation/preload-module-testcases'&lt;br /&gt;
	-- 'template-testcases-preload' --&amp;gt; 'Template:Documentation/preload-testcases'&lt;br /&gt;
	-- 'experiment-blurb-module' --&amp;gt; 'Editors can experiment in this module's $1 and $2 pages.'&lt;br /&gt;
	-- 'experiment-blurb-template' --&amp;gt; 'Editors can experiment in this template's $1 and $2 pages.'&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	local templatePage = templateTitle.prefixedText&lt;br /&gt;
	if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Make links.&lt;br /&gt;
	local sandboxLinks, testcasesLinks&lt;br /&gt;
	if sandboxTitle.exists then&lt;br /&gt;
		local sandboxPage = sandboxTitle.prefixedText&lt;br /&gt;
		local sandboxDisplay = message('sandbox-link-display')&lt;br /&gt;
		local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)&lt;br /&gt;
		local sandboxEditUrl = sandboxTitle:fullUrl{action = 'edit'}&lt;br /&gt;
		local sandboxEditDisplay = message('sandbox-edit-link-display')&lt;br /&gt;
		local sandboxEditLink = makeUrlLink(sandboxEditUrl, sandboxEditDisplay)&lt;br /&gt;
		local compareUrl = env.compareUrl&lt;br /&gt;
		local compareLink&lt;br /&gt;
		if compareUrl then&lt;br /&gt;
			local compareDisplay = message('compare-link-display')&lt;br /&gt;
			compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		end&lt;br /&gt;
		sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink)&lt;br /&gt;
	else&lt;br /&gt;
		local sandboxPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			sandboxPreload = message('module-sandbox-preload')&lt;br /&gt;
		else&lt;br /&gt;
			sandboxPreload = message('template-sandbox-preload')&lt;br /&gt;
		end&lt;br /&gt;
		local sandboxCreateUrl = sandboxTitle:fullUrl{action = 'edit', preload = sandboxPreload}&lt;br /&gt;
		local sandboxCreateDisplay = message('sandbox-create-link-display')&lt;br /&gt;
		local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)&lt;br /&gt;
		local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)})&lt;br /&gt;
		local mirrorPreload = message('mirror-link-preload')&lt;br /&gt;
		local mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			mirrorUrl = sandboxTitle:fullUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary}&lt;br /&gt;
		end&lt;br /&gt;
		local mirrorDisplay = message('mirror-link-display')&lt;br /&gt;
		local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)&lt;br /&gt;
		sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink)&lt;br /&gt;
	end&lt;br /&gt;
	if testcasesTitle.exists then&lt;br /&gt;
		local testcasesPage = testcasesTitle.prefixedText&lt;br /&gt;
		local testcasesDisplay = message('testcases-link-display')&lt;br /&gt;
		local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)&lt;br /&gt;
		local testcasesEditUrl = testcasesTitle:fullUrl{action = 'edit'}&lt;br /&gt;
		local testcasesEditDisplay = message('testcases-edit-link-display')&lt;br /&gt;
		local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay)&lt;br /&gt;
		-- for Modules, add testcases run link if exists&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot;  and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then&lt;br /&gt;
			local testcasesRunLinkDisplay = message('testcases-run-link-display')&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local testcasesPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			testcasesPreload = message('module-testcases-preload')&lt;br /&gt;
		else&lt;br /&gt;
			testcasesPreload = message('template-testcases-preload')&lt;br /&gt;
		end&lt;br /&gt;
		local testcasesCreateUrl = testcasesTitle:fullUrl{action = 'edit', preload = testcasesPreload}&lt;br /&gt;
		local testcasesCreateDisplay = message('testcases-create-link-display')&lt;br /&gt;
		local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)&lt;br /&gt;
		testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink)&lt;br /&gt;
	end&lt;br /&gt;
	local messageName&lt;br /&gt;
	if subjectSpace == 828 then&lt;br /&gt;
		messageName = 'experiment-blurb-module'&lt;br /&gt;
	else&lt;br /&gt;
		messageName = 'experiment-blurb-template'&lt;br /&gt;
	end&lt;br /&gt;
	return message(messageName, {sandboxLinks, testcasesLinks})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeCategoriesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the text &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'doc-link-display' --&amp;gt; '/doc'&lt;br /&gt;
	-- 'add-categories-blurb' --&amp;gt; 'Please add categories to the $1 subpage.'&lt;br /&gt;
	--]]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display'))&lt;br /&gt;
	return message('add-categories-blurb', {docPathLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeSubpagesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the &amp;quot;Subpages of this template&amp;quot; link.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'template-pagetype' --&amp;gt; 'template'&lt;br /&gt;
	-- 'module-pagetype' --&amp;gt; 'module'&lt;br /&gt;
	-- 'default-pagetype' --&amp;gt; 'page'&lt;br /&gt;
	-- 'subpages-link-display' --&amp;gt; 'Subpages of this $1'&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	if not subjectSpace or not templateTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message('template-pagetype')&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message('module-pagetype')&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message('default-pagetype')&lt;br /&gt;
	end&lt;br /&gt;
	local subpagesLink = makeWikilink(&lt;br /&gt;
		'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/',&lt;br /&gt;
		message('subpages-link-display', {pagetype})&lt;br /&gt;
	)&lt;br /&gt;
	return message('subpages-blurb', {subpagesLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makePrintBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates the blurb displayed when there is a print version of the template available.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'print-link-display' --&amp;gt; '/Print'&lt;br /&gt;
	-- 'print-blurb' --&amp;gt; 'A [[Help:Books/for experts#Improving the book layout|print version]]'&lt;br /&gt;
	--		.. ' of this template exists at $1.'&lt;br /&gt;
	--		.. ' If you make a change to this template, please update the print version as well.'&lt;br /&gt;
	-- 'display-print-category' --&amp;gt; true&lt;br /&gt;
	-- 'print-category' --&amp;gt; 'Templates with print versions'&lt;br /&gt;
	--]=]&lt;br /&gt;
	local printTitle = env.printTitle&lt;br /&gt;
	if not printTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if printTitle.exists then&lt;br /&gt;
		local printLink = makeWikilink(printTitle.prefixedText, message('print-link-display'))&lt;br /&gt;
		ret = message('print-blurb', {printLink})&lt;br /&gt;
		local displayPrintCategory = message('display-print-category', nil, 'boolean')&lt;br /&gt;
		if displayPrintCategory then&lt;br /&gt;
			ret = ret .. makeCategoryLink(message('print-category'))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.addTrackingCategories(env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check if {{documentation}} is transcluded on a /doc or /testcases page.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- 'display-strange-usage-category' --&amp;gt; true&lt;br /&gt;
	-- 'doc-subpage' --&amp;gt; 'doc'&lt;br /&gt;
	-- 'testcases-subpage' --&amp;gt; 'testcases'&lt;br /&gt;
	-- 'strange-usage-category' --&amp;gt; 'Wikipedia pages with strange ((documentation)) usage'&lt;br /&gt;
	-- &lt;br /&gt;
	-- /testcases pages in the module namespace are not categorised, as they may have&lt;br /&gt;
	-- {{documentation}} transcluded automatically.&lt;br /&gt;
	--]]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not title or not subjectSpace then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	if message('display-strange-usage-category', nil, 'boolean')&lt;br /&gt;
		and (&lt;br /&gt;
			subpage == message('doc-subpage')&lt;br /&gt;
			or subjectSpace ~= 828 and subpage == message('testcases-subpage')&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		ret = ret .. makeCategoryLink(message('strange-usage-category'))&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Module:Documentation/config&amp;diff=46</id>
		<title>Module:Documentation/config</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Module:Documentation/config&amp;diff=46"/>
		<updated>2019-09-23T12:07:11Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----------------------------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                               Configuration for Module:Documentation&lt;br /&gt;
--&lt;br /&gt;
-- Here you can set the values of the parameters and messages used in Module:Documentation to&lt;br /&gt;
-- localise it to your wiki and your language. Unless specified otherwise, values given here&lt;br /&gt;
-- should be string values.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Do not edit this line.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Protection template configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['protection-reason-edit']&lt;br /&gt;
-- The protection reason for edit-protected templates to pass to&lt;br /&gt;
-- [[Module:Protection banner]].&lt;br /&gt;
cfg['protection-reason-edit'] = 'template'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox notice configuration&lt;br /&gt;
--&lt;br /&gt;
-- On sandbox pages the module can display a template notifying users that the current page is a&lt;br /&gt;
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a&lt;br /&gt;
-- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the&lt;br /&gt;
-- messages that the notices contains.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-notice-image']&lt;br /&gt;
-- The image displayed in the sandbox notice.&lt;br /&gt;
cfg['sandbox-notice-image'] = '[[Image:Sandbox.svg|50px|alt=|link=]]'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['sandbox-notice-pagetype-template']&lt;br /&gt;
-- cfg['sandbox-notice-pagetype-module']&lt;br /&gt;
-- cfg['sandbox-notice-pagetype-other']&lt;br /&gt;
-- The page type of the sandbox page. The message that is displayed depends on the current subject&lt;br /&gt;
-- namespace. This message is used in either cfg['sandbox-notice-blurb'] or&lt;br /&gt;
-- cfg['sandbox-notice-diff-blurb'].&lt;br /&gt;
--]]&lt;br /&gt;
cfg['sandbox-notice-pagetype-template'] = '[[Wikipedia:Template test cases|template sandbox]] page'&lt;br /&gt;
cfg['sandbox-notice-pagetype-module'] = '[[Wikipedia:Template test cases|module sandbox]] page'&lt;br /&gt;
cfg['sandbox-notice-pagetype-other'] = 'sandbox page'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['sandbox-notice-blurb']&lt;br /&gt;
-- cfg['sandbox-notice-diff-blurb']&lt;br /&gt;
-- cfg['sandbox-notice-diff-display']&lt;br /&gt;
-- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence&lt;br /&gt;
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page&lt;br /&gt;
-- type, which is either cfg['sandbox-notice-pagetype-template'],&lt;br /&gt;
-- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what&lt;br /&gt;
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between&lt;br /&gt;
-- the sandbox and the main template. The display value of the diff link is set by &lt;br /&gt;
-- cfg['sandbox-notice-compare-link-display'].&lt;br /&gt;
--]]&lt;br /&gt;
cfg['sandbox-notice-blurb'] = 'This is the $1 for $2.'&lt;br /&gt;
cfg['sandbox-notice-diff-blurb'] = 'This is the $1 for $2 ($3).'&lt;br /&gt;
cfg['sandbox-notice-compare-link-display'] = 'diff'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['sandbox-notice-testcases-blurb']&lt;br /&gt;
-- cfg['sandbox-notice-testcases-link-display']&lt;br /&gt;
-- cfg['sandbox-notice-testcases-run-blurb']&lt;br /&gt;
-- cfg['sandbox-notice-testcases-run-link-display']&lt;br /&gt;
-- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.&lt;br /&gt;
-- cfg['sandbox-notice-testcases-link-display'] is the display value for that link.&lt;br /&gt;
-- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test&lt;br /&gt;
-- cases page, and $2 is a link to the page to run it.&lt;br /&gt;
-- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test&lt;br /&gt;
-- cases.&lt;br /&gt;
--]]&lt;br /&gt;
cfg['sandbox-notice-testcases-blurb'] = 'See also the companion subpage for $1.'&lt;br /&gt;
cfg['sandbox-notice-testcases-link-display'] = 'test cases'&lt;br /&gt;
cfg['sandbox-notice-testcases-run-blurb'] = 'See also the companion subpage for $1 ($2).'&lt;br /&gt;
cfg['sandbox-notice-testcases-run-link-display'] = 'run'&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-category']&lt;br /&gt;
-- A category to add to all template sandboxes.&lt;br /&gt;
cfg['sandbox-category'] = 'Template sandboxes'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Start box configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['documentation-icon-wikitext']&lt;br /&gt;
-- The wikitext for the icon shown at the top of the template.&lt;br /&gt;
cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'&lt;br /&gt;
&lt;br /&gt;
-- cfg['template-namespace-heading']&lt;br /&gt;
-- The heading shown in the template namespace.&lt;br /&gt;
cfg['template-namespace-heading'] = 'Template documentation'&lt;br /&gt;
&lt;br /&gt;
-- cfg['module-namespace-heading']&lt;br /&gt;
-- The heading shown in the module namespace.&lt;br /&gt;
cfg['module-namespace-heading'] = 'Module documentation'&lt;br /&gt;
&lt;br /&gt;
-- cfg['file-namespace-heading']&lt;br /&gt;
-- The heading shown in the file namespace.&lt;br /&gt;
cfg['file-namespace-heading'] = 'Summary'&lt;br /&gt;
&lt;br /&gt;
-- cfg['other-namespaces-heading']&lt;br /&gt;
-- The heading shown in other namespaces.&lt;br /&gt;
cfg['other-namespaces-heading'] = 'Documentation'&lt;br /&gt;
&lt;br /&gt;
-- cfg['view-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;view&amp;quot; links.&lt;br /&gt;
cfg['view-link-display'] = 'view'&lt;br /&gt;
&lt;br /&gt;
-- cfg['edit-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg['edit-link-display'] = 'edit'&lt;br /&gt;
&lt;br /&gt;
-- cfg['history-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;history&amp;quot; links.&lt;br /&gt;
cfg['history-link-display'] = 'history'&lt;br /&gt;
&lt;br /&gt;
-- cfg['purge-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;purge&amp;quot; links.&lt;br /&gt;
cfg['purge-link-display'] = 'purge'&lt;br /&gt;
&lt;br /&gt;
-- cfg['create-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg['create-link-display'] = 'create'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Link box (end box) configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['transcluded-from-blurb']&lt;br /&gt;
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.&lt;br /&gt;
cfg['transcluded-from-blurb'] = 'The above [[Wikipedia:Template documentation|documentation]] is [[Wikipedia:Transclusion|transcluded]] from $1.'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['create-module-doc-blurb']&lt;br /&gt;
-- Notice displayed in the module namespace when the documentation subpage does not exist.&lt;br /&gt;
-- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the&lt;br /&gt;
-- display cfg['create-link-display'].&lt;br /&gt;
--]]&lt;br /&gt;
cfg['create-module-doc-blurb'] = 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Experiment blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['experiment-blurb-template']&lt;br /&gt;
-- cfg['experiment-blurb-module']&lt;br /&gt;
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.&lt;br /&gt;
-- It is only shown in the template and module namespaces. With the default English settings, it&lt;br /&gt;
-- might look like this:&lt;br /&gt;
--&lt;br /&gt;
-- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages.&lt;br /&gt;
--&lt;br /&gt;
-- In this example, &amp;quot;sandbox&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;diff&amp;quot;, &amp;quot;testcases&amp;quot;, and &amp;quot;edit&amp;quot; would all be links.&lt;br /&gt;
--&lt;br /&gt;
-- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending&lt;br /&gt;
-- on what namespace we are in.&lt;br /&gt;
-- &lt;br /&gt;
-- Parameters:&lt;br /&gt;
--&lt;br /&gt;
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display'])&lt;br /&gt;
-- &lt;br /&gt;
-- If the sandbox doesn't exist, it is in the format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display'])&lt;br /&gt;
-- &lt;br /&gt;
-- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload']&lt;br /&gt;
-- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display']&lt;br /&gt;
-- loads a default edit summary of cfg['mirror-edit-summary'].&lt;br /&gt;
--&lt;br /&gt;
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display'])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn't exist, it is in the format:&lt;br /&gt;
-- &lt;br /&gt;
--     cfg['testcases-link-display'] (cfg['testcases-create-link-display'])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the&lt;br /&gt;
-- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current&lt;br /&gt;
-- namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg['experiment-blurb-template'] = &amp;quot;Editors can experiment in this template's $1 and $2 pages.&amp;quot;&lt;br /&gt;
cfg['experiment-blurb-module'] = &amp;quot;Editors can experiment in this module's $1 and $2 pages.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-subpage']&lt;br /&gt;
-- The name of the template subpage typically used for sandboxes.&lt;br /&gt;
cfg['sandbox-subpage'] = 'sandbox'&lt;br /&gt;
&lt;br /&gt;
-- cfg['template-sandbox-preload']&lt;br /&gt;
-- Preload file for template sandbox pages.&lt;br /&gt;
cfg['template-sandbox-preload'] = 'Template:Documentation/preload-sandbox'&lt;br /&gt;
&lt;br /&gt;
-- cfg['module-sandbox-preload']&lt;br /&gt;
-- Preload file for Lua module sandbox pages.&lt;br /&gt;
cfg['module-sandbox-preload'] = 'Template:Documentation/preload-module-sandbox'&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;sandbox&amp;quot; links.&lt;br /&gt;
cfg['sandbox-link-display'] = 'sandbox'&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-edit-link-display']&lt;br /&gt;
-- The text to display for sandbox &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg['sandbox-edit-link-display'] = 'edit'&lt;br /&gt;
&lt;br /&gt;
-- cfg['sandbox-create-link-display']&lt;br /&gt;
-- The text to display for sandbox &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg['sandbox-create-link-display'] = 'create'&lt;br /&gt;
&lt;br /&gt;
-- cfg['compare-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;compare&amp;quot; links.&lt;br /&gt;
cfg['compare-link-display'] = 'diff'&lt;br /&gt;
&lt;br /&gt;
-- cfg['mirror-edit-summary']&lt;br /&gt;
-- The default edit summary to use when a user clicks the &amp;quot;mirror&amp;quot; link. $1 is a wikilink to the&lt;br /&gt;
-- template page.&lt;br /&gt;
cfg['mirror-edit-summary'] = 'Create sandbox version of $1'&lt;br /&gt;
&lt;br /&gt;
-- cfg['mirror-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;mirror&amp;quot; links.&lt;br /&gt;
cfg['mirror-link-display'] = 'mirror'&lt;br /&gt;
&lt;br /&gt;
-- cfg['mirror-link-preload']&lt;br /&gt;
-- The page to preload when a user clicks the &amp;quot;mirror&amp;quot; link.&lt;br /&gt;
cfg['mirror-link-preload'] = 'Template:Documentation/mirror'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Test cases link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['testcases-subpage']&lt;br /&gt;
-- The name of the template subpage typically used for test cases.&lt;br /&gt;
cfg['testcases-subpage'] = 'testcases'&lt;br /&gt;
&lt;br /&gt;
-- cfg['template-testcases-preload']&lt;br /&gt;
-- Preload file for template test cases pages.&lt;br /&gt;
cfg['template-testcases-preload'] = 'Template:Documentation/preload-testcases'&lt;br /&gt;
&lt;br /&gt;
-- cfg['module-testcases-preload']&lt;br /&gt;
-- Preload file for Lua module test cases pages.&lt;br /&gt;
cfg['module-testcases-preload'] = 'Template:Documentation/preload-module-testcases'&lt;br /&gt;
&lt;br /&gt;
-- cfg['testcases-link-display']&lt;br /&gt;
-- The text to display for &amp;quot;testcases&amp;quot; links.&lt;br /&gt;
cfg['testcases-link-display'] = 'testcases'&lt;br /&gt;
&lt;br /&gt;
-- cfg['testcases-edit-link-display']&lt;br /&gt;
-- The text to display for test cases &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg['testcases-edit-link-display'] = 'edit'&lt;br /&gt;
&lt;br /&gt;
-- cfg['testcases-run-link-display']&lt;br /&gt;
-- The text to display for test cases &amp;quot;run&amp;quot; links.&lt;br /&gt;
cfg['testcases-run-link-display'] = 'run'&lt;br /&gt;
&lt;br /&gt;
-- cfg['testcases-create-link-display']&lt;br /&gt;
-- The text to display for test cases &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg['testcases-create-link-display'] = 'create'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Add categories blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['add-categories-blurb']&lt;br /&gt;
-- Text to direct users to add categories to the /doc subpage. Not used if the &amp;quot;content&amp;quot; or&lt;br /&gt;
-- &amp;quot;docname fed&amp;quot; arguments are set, as then it is not clear where to add the categories. $1 is a&lt;br /&gt;
-- link to the /doc subpage with a display value of cfg['doc-link-display'].&lt;br /&gt;
--]]&lt;br /&gt;
cfg['add-categories-blurb'] = 'Please add categories to the $1 subpage.'&lt;br /&gt;
&lt;br /&gt;
-- cfg['doc-link-display']&lt;br /&gt;
-- The text to display when linking to the /doc subpage.&lt;br /&gt;
cfg['doc-link-display'] = '/doc'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Subpages link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['subpages-blurb']&lt;br /&gt;
-- The &amp;quot;Subpages of this template&amp;quot; blurb. $1 is a link to the main template's subpages with a&lt;br /&gt;
-- display value of cfg['subpages-link-display']. In the English version this blurb is simply&lt;br /&gt;
-- the link followed by a period, and the link display provides the actual text.&lt;br /&gt;
--]]&lt;br /&gt;
cfg['subpages-blurb'] = '$1.'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg['subpages-link-display']&lt;br /&gt;
-- The text to display for the &amp;quot;subpages of this page&amp;quot; link. $1 is cfg['template-pagetype'],&lt;br /&gt;
-- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in&lt;br /&gt;
-- the template namespace, the module namespace, or another namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg['subpages-link-display'] = 'Subpages of this $1'&lt;br /&gt;
&lt;br /&gt;
-- cfg['template-pagetype']&lt;br /&gt;
-- The pagetype to display for template pages.&lt;br /&gt;
cfg['template-pagetype'] = 'template'&lt;br /&gt;
&lt;br /&gt;
-- cfg['module-pagetype']&lt;br /&gt;
-- The pagetype to display for Lua module pages.&lt;br /&gt;
cfg['module-pagetype'] = 'module'&lt;br /&gt;
&lt;br /&gt;
-- cfg['default-pagetype']&lt;br /&gt;
-- The pagetype to display for pages other than templates or Lua modules.&lt;br /&gt;
cfg['default-pagetype'] = 'page'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Doc link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['doc-subpage']&lt;br /&gt;
-- The name of the subpage typically used for documentation pages.&lt;br /&gt;
cfg['doc-subpage'] = 'doc'&lt;br /&gt;
&lt;br /&gt;
-- cfg['file-docpage-preload']&lt;br /&gt;
-- Preload file for documentation page in the file namespace.&lt;br /&gt;
cfg['file-docpage-preload'] = 'Template:Documentation/preload-filespace'&lt;br /&gt;
&lt;br /&gt;
-- cfg['docpage-preload']&lt;br /&gt;
-- Preload file for template documentation pages in all namespaces.&lt;br /&gt;
cfg['docpage-preload'] = 'Template:Documentation/preload'&lt;br /&gt;
&lt;br /&gt;
-- cfg['module-preload']&lt;br /&gt;
-- Preload file for Lua module documentation pages.&lt;br /&gt;
cfg['module-preload'] = 'Template:Documentation/preload-module-doc'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Print version configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['print-subpage']&lt;br /&gt;
-- The name of the template subpage used for print versions.&lt;br /&gt;
cfg['print-subpage'] = 'Print'&lt;br /&gt;
&lt;br /&gt;
-- cfg['print-link-display']&lt;br /&gt;
-- The text to display when linking to the /Print subpage.&lt;br /&gt;
cfg['print-link-display'] = '/Print'&lt;br /&gt;
&lt;br /&gt;
-- cfg['print-blurb']&lt;br /&gt;
-- Text to display if a /Print subpage exists. $1 is a link to the subpage with a display value of cfg['print-link-display'].&lt;br /&gt;
cfg['print-blurb'] = 'A [[Help:Books/for experts#Improving the book layout|print version]] of this template exists at $1.'&lt;br /&gt;
	.. ' If you make a change to this template, please update the print version as well.'&lt;br /&gt;
&lt;br /&gt;
-- cfg['display-print-category']&lt;br /&gt;
-- Set to true to enable output of cfg['print-category'] if a /Print subpage exists.&lt;br /&gt;
-- This should be a boolean value (either true or false).&lt;br /&gt;
cfg['display-print-category'] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg['print-category']&lt;br /&gt;
-- Category to output if cfg['display-print-category'] is set to true, and a /Print subpage exists.&lt;br /&gt;
cfg['print-category'] = 'Templates with print versions'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- HTML and CSS configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['main-div-id']&lt;br /&gt;
-- The &amp;quot;id&amp;quot; attribute of the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg['main-div-id'] = 'template-documentation'&lt;br /&gt;
&lt;br /&gt;
-- cfg['main-div-classes']&lt;br /&gt;
-- The CSS classes added to the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg['main-div-classes'] = 'template-documentation iezoomfix'&lt;br /&gt;
&lt;br /&gt;
-- cfg['start-box-linkclasses']&lt;br /&gt;
-- The CSS classes used for the [view][edit][history] or [create] links in the start box.&lt;br /&gt;
cfg['start-box-linkclasses'] = 'mw-editsection-like plainlinks'&lt;br /&gt;
&lt;br /&gt;
-- cfg['start-box-link-id']&lt;br /&gt;
-- The HTML &amp;quot;id&amp;quot; attribute for the links in the start box.&lt;br /&gt;
cfg['start-box-link-id'] = 'doc_editlinks'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- {{fmbox}} template configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['fmbox-id']&lt;br /&gt;
-- The id sent to the &amp;quot;id&amp;quot; parameter of the {{fmbox}} template.&lt;br /&gt;
cfg['fmbox-id'] = 'documentation-meta-data'&lt;br /&gt;
&lt;br /&gt;
-- cfg['fmbox-style']&lt;br /&gt;
-- The value sent to the style parameter of {{fmbox}}.&lt;br /&gt;
cfg['fmbox-style'] = 'background-color: #ecfcf4'&lt;br /&gt;
&lt;br /&gt;
-- cfg['fmbox-textstyle']&lt;br /&gt;
-- The value sent to the &amp;quot;textstyle parameter of {{fmbox}}.&lt;br /&gt;
cfg['fmbox-textstyle'] = 'font-style: italic'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking category configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg['display-strange-usage-category']&lt;br /&gt;
-- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage&lt;br /&gt;
-- or a /testcases subpage. This should be a boolean value (either true or false).&lt;br /&gt;
cfg['display-strange-usage-category'] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg['strange-usage-category']&lt;br /&gt;
-- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a&lt;br /&gt;
-- /doc subpage or a /testcases subpage.&lt;br /&gt;
cfg['strange-usage-category'] = 'Wikipedia pages with strange ((documentation)) usage'&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--&lt;br /&gt;
-- Don't edit anything below this line.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return cfg&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Documentation&amp;diff=30</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Documentation&amp;diff=30"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}&amp;lt;noinclude&amp;gt;&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>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=32</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=32"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Infobox|infobox}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Parameter&amp;diff=34</id>
		<title>Template:Parameter</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Parameter&amp;diff=34"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{update}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
Template:Parameter&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
p   : parameter&lt;br /&gt;
r   : required&lt;br /&gt;
ut  : use together&lt;br /&gt;
dut : don't use together&lt;br /&gt;
d   : description&lt;br /&gt;
v   : values&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;|-&lt;br /&gt;
|&amp;lt;code&amp;gt;{{{p}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|{{{{{r}}}}}&lt;br /&gt;
|style=&amp;quot;background-color:{{#switch:{{{ut}}}&lt;br /&gt;
|1 = lightgreen&lt;br /&gt;
|2 = lightblue&lt;br /&gt;
|3 = orange&lt;br /&gt;
}}&amp;quot;|&lt;br /&gt;
|style=&amp;quot;background-color:{{#switch:{{{dut}}}&lt;br /&gt;
|1 = lightgreen&lt;br /&gt;
|2 = lightblue&lt;br /&gt;
|3 = orange&lt;br /&gt;
}}&amp;quot;|&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{{dut2}}}|{{non existing|dut2}}| |{{!}}{{!}}style=&amp;quot;background-color:{{#switch:{{{dut2}}}&lt;br /&gt;
|1 = lightgreen&lt;br /&gt;
|2 = lightblue&lt;br /&gt;
|3 = orange&lt;br /&gt;
}}&amp;quot;|&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; |{{{d}}}&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; |{{{v}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|content=&lt;br /&gt;
==See also==&lt;br /&gt;
*{{tl|Para}}&lt;br /&gt;
[[Category:Templates used by fb templates]]&lt;br /&gt;
}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Template&amp;diff=36</id>
		<title>Template:Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Template&amp;diff=36"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Tl]]&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Tl&amp;diff=38</id>
		<title>Template:Tl</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Tl&amp;diff=38"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;#123;&amp;amp;#123;[[Template:{{{1}}}|{{{1}}}]]&amp;amp;#125;&amp;amp;#125;&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>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Tlx&amp;diff=40</id>
		<title>Template:Tlx</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Tlx&amp;diff=40"/>
		<updated>2019-09-23T12:07:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;code&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;{{#if:{{{subst|}}} |[[Help:Substitution|subst]]:}}&amp;lt;!--&lt;br /&gt;
                     --&amp;gt;[[{{{LANG|}}}{{{SISTER|}}}{{ns:Template}}:{{{1|}}}|{{{1|}}}]]&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{2|}}}  |&amp;amp;#124;{{{2}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{3|}}}  |&amp;amp;#124;{{{3}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{4|}}}  |&amp;amp;#124;{{{4}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{5|}}}  |&amp;amp;#124;{{{5}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{6|}}}  |&amp;amp;#124;{{{6}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{7|}}}  |&amp;amp;#124;{{{7}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{8|}}}  |&amp;amp;#124;{{{8}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{9|}}}  |&amp;amp;#124;{{{9}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{10|}}} |&amp;amp;#124;{{{10}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{11|}}} |&amp;amp;#124;{{{11}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{12|}}} |&amp;amp;#124;{{{12}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{13|}}} |&amp;amp;#124;{{{13}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{14|}}} |&amp;amp;#124;{{{14}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{15|}}} |&amp;amp;#124;{{{15}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{16|}}} |&amp;amp;#124;{{{16}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{17|}}} |&amp;amp;#124;{{{17}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{18|}}} |&amp;amp;#124;{{{18}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{19|}}} |&amp;amp;#124;{{{19}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{20|}}} |&amp;amp;#124;{{{20}}}}}&amp;lt;!--&lt;br /&gt;
                          --&amp;gt;{{#if:{{{21|}}} |&amp;amp;#124;''...''}}&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:C&amp;diff=28</id>
		<title>Template:C</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:C&amp;diff=28"/>
		<updated>2019-09-23T12:07:09Z</updated>

		<summary type="html">&lt;p&gt;Rex: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:{{PAGENAME:{{{1}}}}}|{{{2|{{PAGENAME:{{{1}}}}}}}}]]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Citation_needed&amp;diff=26</id>
		<title>Template:Citation needed</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Citation_needed&amp;diff=26"/>
		<updated>2019-09-23T11:38:53Z</updated>

		<summary type="html">&lt;p&gt;Rex: Created page with &amp;quot;{{ {{{|safesubst:}}}#invoke:Unsubst||date=__DATE__ |$B= {{Fix |name={{{name|Citation needed}}} |link=Wikipedia:Citation needed |text=citation needed |class=Template-Fact |titl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{|safesubst:}}}#invoke:Unsubst||date=__DATE__ |$B=&lt;br /&gt;
{{Fix&lt;br /&gt;
|name={{{name|Citation needed}}}&lt;br /&gt;
|link=Wikipedia:Citation needed&lt;br /&gt;
|text=citation needed&lt;br /&gt;
|class=Template-Fact&lt;br /&gt;
|title={{{reason|This claim needs references to reliable sources.}}}&lt;br /&gt;
|date={{{date|}}}&lt;br /&gt;
|cat=[[Category:All articles with unsourced statements]]&lt;br /&gt;
|cat-date=Category:Articles with unsourced statements&lt;br /&gt;
}}{{#if:{{{1|}}}|[[Category:Pages containing citation needed template with deprecated parameters]]}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Citation_needed/doc&amp;diff=25</id>
		<title>Template:Citation needed/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Citation_needed/doc&amp;diff=25"/>
		<updated>2019-09-23T11:38:20Z</updated>

		<summary type="html">&lt;p&gt;Rex: Created page with &amp;quot;{{Documentation subpage}} {{Redirect|Template:Proveit|the template about the referencing gadget|Template:User ProveIt}} {{High-risk| 306,000+ }} {{Notice|An introductory versi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
{{Redirect|Template:Proveit|the template about the referencing gadget|Template:User ProveIt}}&lt;br /&gt;
{{High-risk| 306,000+ }}&lt;br /&gt;
{{Notice|An introductory version of this documentation is provided at [[Wikipedia:Citation needed]].}}&lt;br /&gt;
&lt;br /&gt;
{{Tl|Citation needed}} (also known by the redirects {{Tl|Cn}} and {{Tl|Fact}}) is a [[Wikipedia:Template messages|template]] used to identify claims in articles, particularly if questionable, that need a [[Wikipedia:Citing sources|citation]] to a [[WP:Reliable sources|reliable source]]. The template produces a superscripted&amp;amp;nbsp;{{citation needed|date=May 2013|reason=example}}.&lt;br /&gt;
&lt;br /&gt;
== Use ==&lt;br /&gt;
:{{tnull|Citation needed|reason{{=}}''Your explanation here''|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&lt;br /&gt;
&lt;br /&gt;
'''Notes''':&lt;br /&gt;
* The date-substitution template may be used to automatically generate the date, e.g., &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Citation needed|{{subst:DATE}}}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. See [[Help:Substitution]] for more information.&lt;br /&gt;
* The {{para|date}} parameter need not be added by the editor: if not entered, a [[Wikipedia:Bots|bot]] will soon add it. The date parameter consists of the full English name of the current month with initial capital, a space, and the year, not full dates; e.g., &amp;quot;January 2013&amp;quot;, but not &amp;quot;jan13&amp;quot;. ''Any deviation from these two rules will result in an &amp;quot;invalid date parameter&amp;quot; error.''&lt;br /&gt;
* The {{para|reason}} parameter is optional but often helpful. It is displayed as a [[tooltip]] in some browsers (hover the mouse here {{Citation needed|reason=If and only if this text is displayed, the reason parameter is working in your browser|date={{currentmonthname}} {{currentyear}}}} to check behaviour of your browser). For example, the following usage might be appropriate to the claim that &amp;quot;Humphrey Bogart has won several snooker world championships&amp;quot;:&lt;br /&gt;
*:{{tnull|Citation needed|reason{{=}}This claim needs a reliable source; Bogart was a famous actor, and his major biographies don't mention snooker.|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&lt;br /&gt;
** If double quotation marks are used within the {{para|reason}} parameter, the reason will not be displayed as a tooltip; use single quotes or the HTML code &amp;lt;code&amp;gt;&amp;amp;amp;quot;&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
** Use only [[plain text]] for the {{para|reason}} parameter. It does not support [[Help:Wiki markup|wiki markup]] like wikilinks, which can &amp;quot;mess up&amp;quot; the tooltip.&lt;br /&gt;
* Use of this template places the article into [[:Category:All articles with unsourced statements]] and [[:Category:Articles with unsourced statements from {{CURRENTMONTHNAME}} {{CURRENTYEAR}}]] (example; past months are listed in [[:Category:Articles with unsourced statements]]).&lt;br /&gt;
* Remove the template when you add a citation for a statement.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== Example 1 ===&lt;br /&gt;
:&amp;lt;code&amp;gt;This sentence shows the template used at the end.&amp;lt;nowiki&amp;gt;{{Citation needed|reason=Reliable source needed for the whole sentence|date=&amp;lt;/nowiki&amp;gt;{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This wikitext will be rendered as follows:&lt;br /&gt;
&lt;br /&gt;
:This sentence shows the template used at the end.{{Citation needed|reason=Reliable source needed for the whole sentence|date={{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&lt;br /&gt;
&lt;br /&gt;
=== Example 2 ===&lt;br /&gt;
&lt;br /&gt;
The template indicates that it may be that Humphrey Bogart played snooker at some point and it may be that he won some tournaments at some point but no ''reliable'', ''published'' sources were given to verify it and the information is not considered [[common knowledge]]. &lt;br /&gt;
&lt;br /&gt;
:[[Humphrey Bogart]] has won several [[snooker]] world championships.{{Citation needed|date={{currentmonthname}} {{currentyear}}}}&lt;br /&gt;
&lt;br /&gt;
=== Example 3 ===&lt;br /&gt;
&lt;br /&gt;
If it is considered that he might have won just one tournament, the template may be placed accordingly; and a reason for the need of a citation may be given, displayed when the mouse hovers on &amp;quot;citation needed&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
:[[Humphrey Bogart]] has won several{{Citation needed|date={{currentmonthname}} {{currentyear}}|reason=Only aware he won one tournament. Sources for others please.}} [[snooker]] world championships.&lt;br /&gt;
&lt;br /&gt;
== When not to use this template ==&lt;br /&gt;
&lt;br /&gt;
Contentious material about [[Wikipedia:Biographies of living persons|living persons]] that is unsourced or poorly sourced should be '''removed immediately'''. Do not tag it; immediately remove it. This includes material that is doubtful, harmful, or possibly [[libelous]]. For some policy about this, see the sections [[Wikipedia:Biographies of living persons#Remove contentious material that is unsourced or poorly sourced|&amp;quot;Remove contentious material that is unsourced or poorly sourced&amp;quot;]] at [[Wikipedia:Biographies of living persons]] and [[Wikipedia:Verifiability#Burden of evidence|&amp;quot;Burden of evidence&amp;quot;]] at [[Wikipedia:Verifiability]].&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;nowiki&amp;gt;{{Citation needed}}&amp;lt;/nowiki&amp;gt; template is intended for use when there is a general question of the verifiability of a statement, or when an editor believes that a reference verifying the statement should be provided. Other templates are available for other or more specific issues; see the [[Template:Cn#Inline templates|list of inline templates]]. For example, claims that you think are incorrect should be tagged with {{Tl|Dubious}}, and those which represent a non-neutral view should be tagged with {{Tl|POV-statement}}. Being specific about the nature of the problem will help other editors correct it.&lt;br /&gt;
&lt;br /&gt;
If you have the time and ability to find an authoritative reference, please do so. Then add the citation yourself, or correct the article text. After all, the ultimate goal is not to merely identify problems, but to fix them.&lt;br /&gt;
&lt;br /&gt;
While an editor may add this template to any uncited passage for any reason, many editors object to what they perceive as overuse of this tag, particularly in what is known as &amp;quot;[[drive-by]]&amp;quot; tagging, which is applying the tag without attempting to address the issues at all (hit-and-run). Consider whether adding this tag in an article is the best approach before using it, and use it judiciously. Wikipedia's [[WP:V|verifiability policy]] '''does not require''' reliable sources for [[Common knowledge|common well-known facts]] (e.g., &amp;quot;the Moon orbits the Earth&amp;quot;), neither that citations be repeated through every sentence in a paragraph. All direct quotations and facts whose accuracy might be challenged (e.g., statistics) require citations. See [[WP:MINREF]] for the list of material that is absolutely required to be followed by an [[Wikipedia:Inline citation|inline citation]], rather than a [[Wikipedia:General references|general reference]] or no citation at all. Also note that the [[WP:BURDEN|burden of evidence]] lies with the editor who adds or restores material.&lt;br /&gt;
&lt;br /&gt;
This template is intended for specific passages that need citation. For entire articles or sections that contain significant material lacking sources (rather than just specific short passages), there are other, more appropriate templates, such as {{Tl|Unreferenced}} or {{Tl|Refimprove}}.&lt;br /&gt;
&lt;br /&gt;
Do not use this template to tag policies or guidelines.&lt;br /&gt;
&lt;br /&gt;
== How to respond to this tag ==&lt;br /&gt;
&lt;br /&gt;
The addition of this tag is a request for an inline citation to support the tagged statement. If you are able to provide a citation to support the claim, then please do so.&lt;br /&gt;
&lt;br /&gt;
Except for [[WP:BLP|contentious claims about living people]], which should be immediately removed if not cited, there is no specific deadline for providing citations. Please do not delete information that you believe is correct simply because no one has provided a citation within an arbitrary time limit. Where there is some uncertainty about its accuracy, most editors are willing to wait about a month to see whether a citation can be provided.&lt;br /&gt;
&lt;br /&gt;
== Template data ==&lt;br /&gt;
&lt;br /&gt;
{{TemplateDataHeader}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;The template is used to identify claims in articles, particularly if questionable, that need a citation to a reliable source.&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;date&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Month and year&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Provides the month and year of the citation request; e.g., 'January 2013', but not 'jan13'&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;{{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;reason&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Reason for citation&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;A reason as to why, or for what content, the citation is needed; use single quotes, if any&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirects ==&lt;br /&gt;
{{div col||25em}}&lt;br /&gt;
{{Special:WhatLinksHere/Template:Citation needed|hidetrans=1|hidelinks=1}}&lt;br /&gt;
{{div col end}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Template:Citation needed (lead)]], a similar template specifically for the lead of articles&lt;br /&gt;
* [[Wikipedia:Citing sources]], especially [[Wikipedia:Citing sources#Unsourced material|Unsourced material]]&lt;br /&gt;
* [[Wikipedia:Identifying reliable sources]]&lt;br /&gt;
* [[Template:Medical citation needed]]&lt;br /&gt;
* [[Wikipedia:Template messages/Cleanup#Verifiability and sources]]&lt;br /&gt;
* [[Wikipedia:Template messages/Sources of articles]]&lt;br /&gt;
* [[Wikipedia:Verifiability]]&lt;br /&gt;
* [[Wikipedia:WikiProject Fact and Reference Check]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Inline templates ===&lt;br /&gt;
&lt;br /&gt;
* {{Tl|Cite quote}}{{Cite quote}}: for &amp;quot;actual quotations&amp;quot; which need citations to make them proper.&lt;br /&gt;
* {{Tl|Clarify}}{{Clarify}}: request clarification of wording or interpretation.&lt;br /&gt;
* {{Tl|Examples}}{{Examples}}: request examples for clarification.&lt;br /&gt;
* {{Tl|Nonspecific}}{{Nonspecific}}: flag a general, yet factual statement as needing to be made more specific before it can be verified.&lt;br /&gt;
* {{Tl|Page needed}}{{Page needed}}: request a page number for an existing citation.&lt;br /&gt;
&lt;br /&gt;
==== Highlighting some text that needs a citation ====&lt;br /&gt;
&lt;br /&gt;
* {{Tl|Citation needed span}}: similar, except that the text needing the citation is changed to a dark slate-gray color while being encapsulated in an off-white box with a pale pink outline. For example:&lt;br /&gt;
&lt;br /&gt;
::Beetles constitute {{Citation needed span|text=by far|reason=&amp;quot;By far&amp;quot; seems like it needs a citation|date={{currentmonthname}} {{currentyear}}}} the largest order of insects, with {{Citation needed span|text=350,000–400,000 species in four suborders.|date={{currentmonthname}} {{currentyear}}}}&lt;br /&gt;
&lt;br /&gt;
==== Incomplete citations ====&lt;br /&gt;
&lt;br /&gt;
* {{Tl|Full}}{{Full}}: in-line request for full citation, for example when only author, year are given.&lt;br /&gt;
* {{Tl|Incomplete short citation}}{{Incomplete short citation}}: in-line warning and request for enough information to allow the short citation to uniquely identify a long citation.&lt;br /&gt;
* {{Tl|Page needed}}{{Page needed}}: in-line request for the page number or page numbers in a work such as journal for an existing citation.&lt;br /&gt;
* {{Tl|Season needed}}{{Season needed}}, similar to {{Tl|page needed}}: for missing [[television|TV]] season &amp;amp; episode number.&lt;br /&gt;
* {{Tl|Volume needed}}{{Volume needed}}, similar to {{Tl|page needed}}: for missing journal, newspaper, comic, volume and issue numbers, etc.&lt;br /&gt;
&lt;br /&gt;
==== Verification ====&lt;br /&gt;
* {{Tl|Better source}}{{Better source}}: flags a statement as requiring a better source.&lt;br /&gt;
* {{Tl|Dead link}}{{Dead link}}: request a fix for a [[Wikipedia:Dead external links|dead external link]] within a paragraph or a reference citation.&lt;br /&gt;
* {{Tl|Failed verification}}{{Failed verification}}: source was checked, and did not contain the cited material.&lt;br /&gt;
* {{Tl|Request quotation}}{{Request quotation}}: request a direct quote from an inaccessible source, for verification purposes.&lt;br /&gt;
* {{Tl|Self-published inline}}{{Self-published inline}} or {{tl|Self-published source}} {{Self-published source}}: flag a source that cites the author.&lt;br /&gt;
* {{Tl|Source need translation}}{{Source need translation}}: self-explanatory. See [[WP:NONENG]] for policy requirements.&lt;br /&gt;
* {{Tl|Verify credibility}}{{Verify credibility|name=Citation needed}}: flag a source as possibly being [[WP:RS|unreliable]] or [[WP:V|unverifiable]].&lt;br /&gt;
* {{Tl|Verify source}}{{Verify source}}: request that someone verify the cited source backs up the material in the passage.&lt;br /&gt;
&lt;br /&gt;
==== Content ====&lt;br /&gt;
* {{Tl|According to whom}}{{According to whom}}&lt;br /&gt;
* {{Tl|Definition}}{{Definition}}: flag a definition as being ambiguous&amp;amp;nbsp;/ confusing&lt;br /&gt;
* {{Tl|Dubious}}{{Dubious}}: flag something as suspected of being incorrect&lt;br /&gt;
* {{Tl|Or}}{{or}}: flag something as possibly containing [[Wikipedia:No original research|original research]]&lt;br /&gt;
* {{Tl|Peacock term}}{{Peacock term}}: [[Wikipedia:Avoid peacock terms|Avoid peacock terms]] too&lt;br /&gt;
* {{Tl|POV-statement}}{{POV-statement}}: dispute the [[Wikipedia:Neutral point of view|neutrality]] of a passage&lt;br /&gt;
* {{Tl|Quantify}}{{Quantify}}: flag a statement as being vague regarding the amount of something&lt;br /&gt;
* {{Tl|Technical-statement}}{{Technical-statement}}: ...flag a word or phrase [[Wikipedia:Make technical articles understandable]]&lt;br /&gt;
* {{Tl|Time fact}}/{{Tl|Chronology citation needed}}{{Chronology citation needed}}: request a source confirming or providing the chronology or timeline of a statement&lt;br /&gt;
* {{Tl|Undue-inline}}{{Undue-inline}}: show that a statement does not ascribe appropriate weight to its sources, according to their prominence; use in preference to...&lt;br /&gt;
* {{Tl|Vague}}{{Vague}}: flag a statement that is too vague to be unambiguously verifiable&lt;br /&gt;
* {{Tl|Weasel-inline}}{{Weasel-inline}}: flag for [[Wikipedia:Avoid weasel words|weasel word]] cleanup&lt;br /&gt;
* {{Tl|When}}{{When}}: flags a particular time period as being vague or ambiguous&lt;br /&gt;
* {{Tl|Who}}{{who}}: for placement after descriptions of a group of persons&lt;br /&gt;
* {{Tl|Whom}}/{{Tl|By whom}}{{By whom}}: placement after mention of a vague third party claim that is not sourced&lt;br /&gt;
&lt;br /&gt;
==== Timeliness ====&lt;br /&gt;
* {{Tl|Update after}}{{Update after}}: a template that only shows itself after a specified time, indicating an exceptional statement that will [[Wikipedia:Avoid statements that will date quickly|date quickly]].&lt;br /&gt;
&lt;br /&gt;
=== Article message box templates ===&lt;br /&gt;
* {{Tl|Cite check}}, article&amp;amp;nbsp;/ section may have inappropriate or misinterpreted citations.&lt;br /&gt;
* {{Tl|Refimprove}}, article&amp;amp;nbsp;/ section has weak or incomplete sources&amp;amp;nbsp;/ references&amp;amp;nbsp;/ citations.&lt;br /&gt;
* {{Tl|Unreferenced}}, article&amp;amp;nbsp;/ section has no sources&amp;amp;nbsp;/ references&amp;amp;nbsp;/ citations given at all.&lt;br /&gt;
* Citation method and style&lt;br /&gt;
** {{Tl|Citation style}}&lt;br /&gt;
** {{Tl|No footnotes}}&lt;br /&gt;
&lt;br /&gt;
{{Inline tags}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;!-- Template categories  --&amp;gt;&lt;br /&gt;
[[Category:Inline citation and verifiability dispute templates]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Gephitest.png&amp;diff=24</id>
		<title>File:Gephitest.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Gephitest.png&amp;diff=24"/>
		<updated>2019-09-23T11:32:11Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Simple_distr.png&amp;diff=23</id>
		<title>File:Simple distr.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Simple_distr.png&amp;diff=23"/>
		<updated>2019-09-23T11:32:00Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:English_distr.png&amp;diff=22</id>
		<title>File:English distr.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:English_distr.png&amp;diff=22"/>
		<updated>2019-09-23T11:31:52Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Diameter_wiki.png&amp;diff=21</id>
		<title>File:Diameter wiki.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Diameter_wiki.png&amp;diff=21"/>
		<updated>2019-09-23T11:31:42Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Fit.gif&amp;diff=20</id>
		<title>File:Fit.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Fit.gif&amp;diff=20"/>
		<updated>2019-09-23T11:31:28Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Indegree.gif&amp;diff=19</id>
		<title>File:Indegree.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Indegree.gif&amp;diff=19"/>
		<updated>2019-09-23T11:31:16Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph1.png&amp;diff=18</id>
		<title>File:Examplegraph1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph1.png&amp;diff=18"/>
		<updated>2019-09-23T11:31:09Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph2.png&amp;diff=17</id>
		<title>File:Examplegraph2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph2.png&amp;diff=17"/>
		<updated>2019-09-23T11:31:01Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph3.png&amp;diff=16</id>
		<title>File:Examplegraph3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Examplegraph3.png&amp;diff=16"/>
		<updated>2019-09-23T11:30:51Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Avgs.png&amp;diff=15</id>
		<title>File:Avgs.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Avgs.png&amp;diff=15"/>
		<updated>2019-09-23T11:30:43Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Hitler_attacks.png&amp;diff=14</id>
		<title>File:Hitler attacks.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Hitler_attacks.png&amp;diff=14"/>
		<updated>2019-09-23T11:30:25Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Charles_attacks.png&amp;diff=13</id>
		<title>File:Charles attacks.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Charles_attacks.png&amp;diff=13"/>
		<updated>2019-09-23T11:30:17Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Angela.png&amp;diff=12</id>
		<title>File:Angela.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Angela.png&amp;diff=12"/>
		<updated>2019-09-23T11:30:10Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Justin_edit.png&amp;diff=11</id>
		<title>File:Justin edit.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Justin_edit.png&amp;diff=11"/>
		<updated>2019-09-23T11:30:01Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Montenegro.png&amp;diff=10</id>
		<title>File:Montenegro.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Montenegro.png&amp;diff=10"/>
		<updated>2019-09-23T11:29:52Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Britney.png&amp;diff=9</id>
		<title>File:Britney.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Britney.png&amp;diff=9"/>
		<updated>2019-09-23T11:29:25Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=File:Rick_Santorum.png&amp;diff=8</id>
		<title>File:Rick Santorum.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=File:Rick_Santorum.png&amp;diff=8"/>
		<updated>2019-09-23T11:29:16Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=7</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=7"/>
		<updated>2019-09-23T11:22:27Z</updated>

		<summary type="html">&lt;p&gt;Rex: Replaced content with &amp;quot;{{#invoke:Infobox|infobox}}&amp;lt;noinclude&amp;gt;  {{documentation}} &amp;lt;!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Infobox|infobox}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go in the /doc subpage, and interwikis go in Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=6</id>
		<title>Template:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Template:Infobox&amp;diff=6"/>
		<updated>2019-09-23T11:20:47Z</updated>

		<summary type="html">&lt;p&gt;Rex: Created page with &amp;quot;{{Documentation subpage}} &amp;lt;!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --&amp;gt;  ===Usage=== The '''Infobox WikiProject''' template may be used to summarize...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
&amp;lt;!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
The '''Infobox WikiProject''' template may be used to summarize information about a [[Wikipedia:WikiProject|WikiProject]].&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
This infobox can be added by copying and pasting the template shown below:&lt;br /&gt;
&lt;br /&gt;
''Note: Only the &amp;quot;name&amp;quot; is required, all other attributes are optional.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:250px;background:#dddddd;border: 1px solid black;padding:0.5em  1em 0.5em 1em&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Infobox WikiProject&lt;br /&gt;
 |inactive     = &lt;br /&gt;
 |semi-active  =&lt;br /&gt;
 |name         = &lt;br /&gt;
 |bodystyle    = &lt;br /&gt;
 |image        = &lt;br /&gt;
  |imagesize   = &lt;br /&gt;
  |caption     = &lt;br /&gt;
 |shortcuts    = &lt;br /&gt;
  |shortcuts2  = &lt;br /&gt;
 |category     = &lt;br /&gt;
  |category2   = &lt;br /&gt;
 |portal       = &lt;br /&gt;
  |portal2     = &lt;br /&gt;
 |commons      = &lt;br /&gt;
 |parent       = &lt;br /&gt;
  |parent2     =&lt;br /&gt;
  |parent3     =&lt;br /&gt;
 |notice       = &lt;br /&gt;
  |notice-extended =&lt;br /&gt;
 |userbox      = &lt;br /&gt;
  |userbox2    = &lt;br /&gt;
  |userbox3    = &lt;br /&gt;
  |userboxnote = &lt;br /&gt;
 |helps-organise-children = &lt;br /&gt;
 |has-goals    = &lt;br /&gt;
 |assessment   = &lt;br /&gt;
 |footnotes    = &lt;br /&gt;
 |csb          =&lt;br /&gt;
 |type         =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====General parameters====&lt;br /&gt;
* '''inactive''' – if set to &amp;quot;y&amp;quot;, &amp;quot;yes&amp;quot;, or &amp;quot;1&amp;quot;, the '[[Template:WikiProject status|Inactive WikiProject]]' notice banner is included on the page; otherwise, leave field blank.&lt;br /&gt;
* '''semi-active''' – if set to &amp;quot;y&amp;quot;, &amp;quot;yes&amp;quot;, or &amp;quot;1&amp;quot;, the '[[Template:WikiProject status|Semi-active WikiProject]]' notice banner is included on the page; otherwise, leave field blank.&lt;br /&gt;
* '''name''' – the name of the project, ''without'' the 'Wikipedia:WikiProject' prefix. (e.g., Tulips)&lt;br /&gt;
* '''bodystyle''' – any valid CSS markup that is applied to the infobox table as a whole. (you may need to use &amp;lt;code&amp;gt;!important&amp;lt;/code&amp;gt; to override default values specified elsewhere)&lt;br /&gt;
* '''image''' – an image for the project, given in the form of 'example.jpg'. (i.e., ''do not'' specify the size, caption, position, etc., and ''do not'' prefix it with 'File:' or 'Image:')&lt;br /&gt;
** '''imagesize''' – sets the width of the project image, given in 'px'. When not specified, the default is 180px. (e.g., 150px)&lt;br /&gt;
** '''caption''' – a descriptive sentence that describes the image. (e.g., This WikiProject is about ''project topic''.)&lt;br /&gt;
* '''shortcuts''' – if the project has a primary [[Wikipedia:Shortcut|shortcut]], list it here in the form &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[WP:&amp;lt;/nowiki&amp;gt;''Shortcut''&amp;lt;nowiki&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** '''shortcuts2''' –  Secondary shortcuts may be given here. If there are more than two shortcuts, enter as a comma separated list.&lt;br /&gt;
* '''category''' – the name of the root category of the articles within the scope of the WikiProject, preferably ''without'' the 'Category:' prefix. (e.g., WikiProject Tulips)&lt;br /&gt;
** '''category2''' – the name of a second root category if the project uses more than one, preferably ''without'' the 'Category:' prefix. (e.g., Tulips)&lt;br /&gt;
* '''portal''' – the name of an appropriate [[Wikipedia:Portal|portal]] for the project, ''without'' the 'Portal:' prefix. (e.g., Tulips)&lt;br /&gt;
** '''portal2''' – the name of a second appropriate portal, if the project uses more than one, ''without'' the 'Portal:' prefix. (e.g., Flowers)&lt;br /&gt;
* '''commons''' – the name of a category in [[Wikimedia Commons]], that is appropriate to the project, ''without'' the 'Category:' prefix. (e.g., Tulips)&lt;br /&gt;
* '''parent''' – the name of the parent project for this project, ''without'' the 'Wikipedia:WikiProject' prefix. (e.g., Flowers)&lt;br /&gt;
** '''parent2''' / '''parent3''' – the name of additional parent projects, ''without'' the 'Wikipedia:WikiProject' prefix. (e.g., Flowers)&lt;br /&gt;
* '''notice''' – the name of the project banner template for the project, given ''without'' the 'Template:' prefix or any &amp;lt;nowiki&amp;gt;{{ }}&amp;lt;/nowiki&amp;gt; syntax. (e.g., WikiProject Tulips)&lt;br /&gt;
** '''notice-extended''' – an alternative to 'notice' (overrides the standard 'notice' message) that you can use to provide more details, template parameters, etc. (e.g., {{tlx|WikiProject International relations|un&amp;amp;#61;yes}})&lt;br /&gt;
* '''userbox''' – you may enter up to three project [[Wikipedia:Userboxes|userboxes]], (using '''userbox''', '''userbox2''', and '''userbox3''') and/or an optional '''userboxnote''':&lt;br /&gt;
** If the userbox is located in the [[Wikipedia:Template namespace|template namespace]] (i.e., the userbox page starts with 'Template:' in front of the name), then just enter the name of the template, ''without'' the 'Template:' prefix:&lt;br /&gt;
*** Example #1: [[Template:User WikiProject 24 Member|''Template:''User WikiProject 24 Member]] would be entered as &amp;lt;code&amp;gt;|userbox = User WikiProject 24 Member&amp;lt;/code&amp;gt;&lt;br /&gt;
** If the userbox is located in any other [[Wikipedia:Namespace|namespace]] (i.e., 'User:', '{{ns:Project}}:', etc.), enter the full name of the userbox page, ''including'' the prefix:&lt;br /&gt;
*** Example #2: &amp;lt;code&amp;gt;|userbox = ''User:''Example/Userboxes/WikiProject Tulips member&amp;lt;/code&amp;gt; would be entered as-is&lt;br /&gt;
*** Example #3: &amp;lt;code&amp;gt;|userbox2 = ''Wikipedia:''Example/UBX&amp;lt;/code&amp;gt; would be entered as-is&lt;br /&gt;
** '''userboxnote''' – a free-form comment, such as a link to more userboxes or brief instructions; if there are more than three userboxes to choose from, you could use only this parameter and link to a gallery of userboxes.&lt;br /&gt;
* '''helps-organise-children''' – if set to &amp;quot;y&amp;quot;, &amp;quot;yes&amp;quot;, or &amp;quot;1&amp;quot;, it indicates that the project will be active in helping organise subprojects (including task forces and work groups); &amp;quot;n&amp;quot;, &amp;quot;no&amp;quot;, or &amp;quot;0&amp;quot; indicate the project does not intend to set those up; anything else will be treated as a free-form comment, such as a link to more information.&lt;br /&gt;
* '''has-goals''' – if set to &amp;quot;n&amp;quot;, &amp;quot;no&amp;quot;, or &amp;quot;0&amp;quot;, indicates that the project exists solely to help organise child projects and co-ordinate items of interest common to all sub-projects, and does not engage in any other activity; &amp;quot;y&amp;quot;, &amp;quot;yes&amp;quot;, or &amp;quot;1&amp;quot; indicates the project intends to pursue other goals besides supporting child projects; anything else will be treated as a free-form comment, such as a link to more information.&lt;br /&gt;
* '''assessment''' – the link to the project's assessment page, ''without'' the 'Wikipedia:' prefix. (e.g., WikiProject Tulips/Assessment)&lt;br /&gt;
* '''footnotes''' – any additional free-form notes about the project.&lt;br /&gt;
* '''csb''' – if set to &amp;quot;yes&amp;quot;, tags project as relevant for [[Wikipedia:WikiProject Countering systemic bias]] (CSB)&lt;br /&gt;
* '''type''' – passes on the optional &amp;lt;tt&amp;gt;type&amp;lt;/tt&amp;gt; parameter of {{tl|WikiProject status}}: not displayed in infobox&lt;br /&gt;
&lt;br /&gt;
===See also===&lt;br /&gt;
* [[Template:WikiProject]]&lt;br /&gt;
* [[Template:WikiProject Help]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|sandbox||&lt;br /&gt;
&amp;lt;!-- CATEGORIES AND INTERWIKIS HERE, THANKS --&amp;gt;&lt;br /&gt;
[[Category:Infobox templates|WikiProject]]&lt;br /&gt;
[[Category:WikiProject templates|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Generic WikiProject templates]]&lt;br /&gt;
&lt;br /&gt;
[[pt:Predefinição:Info/WikiProjeto]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=5</id>
		<title>Hacking the Wiki Game</title>
		<link rel="alternate" type="text/html" href="https://wiki.rexvalkering.nl/index.php?title=Hacking_the_Wiki_Game&amp;diff=5"/>
		<updated>2019-09-23T11:06:21Z</updated>

		<summary type="html">&lt;p&gt;Rex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div id=&amp;quot;infobox&amp;quot;&amp;gt;{{Infobox&lt;br /&gt;
 | name = Simple English Wikipedia network&lt;br /&gt;
 | image = [[File:Gephitest.png|200px]]&lt;br /&gt;
 | title      = Simple English Wikipedia network&lt;br /&gt;
 | header1 = Database statistics&lt;br /&gt;
 | label2 = Total pagecount&lt;br /&gt;
 | data2 = 369,481&lt;br /&gt;
 | label3 = # of articles&lt;br /&gt;
 | data3 = 113,202&lt;br /&gt;
 | label4 = # of article redirects&lt;br /&gt;
 | data4 = 46,928&lt;br /&gt;
 | label5 = # number of pagelinks&lt;br /&gt;
 | data5 = 7,959,934&lt;br /&gt;
 | label6 = # of acticle pagelinks&lt;br /&gt;
 | data6 = 4,525,556&lt;br /&gt;
 | header7 = Network statistics&lt;br /&gt;
 | label8 = # of zero indegree articles&lt;br /&gt;
 | data8 = 12,492&lt;br /&gt;
 | label9 = Str. conn. component size&lt;br /&gt;
 | data9 = 86.2%&lt;br /&gt;
 | label10 = Full diameter&lt;br /&gt;
 | data10 = 18&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The [[wikipedia:Wiki_Game|Wiki Game]] is a hypertextual game designed to work specifically with [[wikipedia:Main_Page|Wikipedia]]. The Wiki Game (or Wikirace, Wikispeedia, WikiLadders) requires only a computer, access to Wikipedia and a web browser to play. The objective is to reach a given home article in the smallest number of clicks, starting from the [[Special:Random|Random page]] link of Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Its origin is unclear, but one of the first occurences on the web dates as far back as 2008.&amp;lt;ref name=&amp;quot;hitlergame&amp;quot;&amp;gt;http://www.nintendoworldreport.com/forums/index.php?topic=26255.0&amp;lt;/ref&amp;gt; Many variations exist, but arguably the most famous one is '''Six Degrees to Hitler''', where the objective is to reach the article of [[wikipedia:Adolf Hitler|Adolf Hitler]]. The name is a play on the [[wikipedia:Six Degrees of Separation|Six Degrees of Separation]] theory (stating that everyone on [[wikipedia:Earth|Earth]] is six or fewer steps away, by way of introduction, from any other person in the world).&lt;br /&gt;
&lt;br /&gt;
Our goal was to analyse this game by studying the network of Wikipedia pages and links between them, using tools such as [http://python.org Python], [http://gephi.org Gephi], [http://snap.stanford.edu SNAP]. As the English Wikipedia database contains 36,615,821 pages with 4,905,818 articles,&amp;lt;ref name=&amp;quot;wikistats&amp;quot;&amp;gt;https://en.wikipedia.org/wiki/Wikipedia:Statistics&amp;lt;/ref&amp;gt; analysis is very slow. We chose to study the [[wikipedia:simple:Main_Page|Simple English Wikipedia]] network instead.&amp;lt;ref name=&amp;quot;simplewikidump&amp;quot;&amp;gt;https://dumps.wikimedia.org/simplewiki/latest/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Simple English Wiki network: birds-eye view ==&lt;br /&gt;
=== Wikipedia as a scale-free network ===&lt;br /&gt;
The Wikipedia network contains [[special:random|many]] [[Adolf_Hitler|special]] [[wikipedia:SixDegrees|pages]]. Therefore, pages are given a [[wikipedia:namespace|namespace]]; a namespace equal to 0 signifies an article. Links between pages exist in two forms: [[wikipedia:University_of_Amsterdam|regular links]] appear as blue, while a [[link to a nonexistent page]] appears as red. Often, a link redirects a [[wikipedia:uk|page]] to [[wikipedia:united_Kingdom|another page]]. Removing all redirects, and retaining only the articles and links between them significantly reduces the data size (see the [[#infobox|infobox]]). The resulting network of 113,202 nodes and 4,525,556 links was the starting point of our analyses.&lt;br /&gt;
&lt;br /&gt;
As [[wikipedia:Scale-free_network|scale-free networks]] are known to be prone to attacks,&amp;lt;ref name=&amp;quot;bb&amp;quot;&amp;gt;Barabási, Albert-László, ''Network Science'', 2015.&amp;lt;/ref&amp;gt; and our goal is to attack the network as to disrupt the Wiki Game, our first goal was to study the scale-free property. The indegree distribution of the Simple English wiki and a polynomial fit (found using [https://pypi.python.org/pypi/powerlaw powerlaw]) is shown on the left; the indegree distribution of the English wiki network of 2007 is shown on the right. The apparent outliers in the left graph can be explained by the existence of very poorly connected [[wikipedia:Clique|cliques]] of large degree (e.g. [[wikipedia:simple:Ablon|Ablon]] is part of a degree-704 clique).&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Simple_distr.png|thumb|none|500px|Indegree distribution of the pages in the Simple English wikipedia network, with a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:English_distr.png|thumb|none|500px|Indegree distribution of the pages in the English wikipedia network, with a powerlaw fit. Notice that this graph contains no outliers.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The right fit is very nice: it immediately shows the scale-free property in the Wikipedia network. The left fit is somewhat unsatisfactory; &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; is somewhat high and the fit is not very close. This urged us to look at the inner workings of this fitting procedure.&amp;lt;ref name=&amp;quot;bb&amp;quot; /&amp;gt; It works by considering all possible values for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;, computing the best powerlaw fit &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; for this specific value. It then chooses the value&lt;br /&gt;
:&amp;lt;math&amp;gt;k_{min} := \arg \min D_k, \quad D_k := \max_{k'\geq k} |S(k') - p_{k'}|.&amp;lt;/math&amp;gt;&lt;br /&gt;
This procedure is called the [[wikipedia:%E2%80%93Smirnov_test|Kolmogorov-Smirnov test]]. A visualisation of this procedure is given in the figure below. We see that while this value for &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; yields a slightly unfortunate result, there is no &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt; for which the goodness of fit is close. Of course, this fit can be made much better by excluding the outliers.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Fit.gif|thumb|left|900px|An animation visualizing the Kolmogorov-Smirnov test to determine the optimal &amp;lt;math&amp;gt;k_{min}&amp;lt;/math&amp;gt;-value of a powerlaw fit.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We conclude that both the English and the Simple English Wikipedia network are scale-free. Both exponents are smaller than 2, which is impossible for &amp;lt;math&amp;gt;|V| \to \infty&amp;lt;/math&amp;gt;, because the average degree diverges with system size. Apparently our networks aren't large enough to exhibit this: the largest indegree is [[wikipedia:simple:United_States|17222]] and 101110,&amp;lt;ref&amp;gt;We were unable to determine with 100% accuracy which page this is as the network data was anonymized; we suspect however that it is [[wikipedia:United_States|United States]]&amp;lt;/ref&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
=== Wikipedia diameter ===&lt;br /&gt;
[[File:diameter_wiki.png|300px|right|thumb|Histogram of the geodesic lengths to each node in the simple English wikipeida]]&lt;br /&gt;
As we can fairly quickly determine the path length distribution for any node in the network, we can also look at the distribution of the longest shortest path to any target node. The figure on the right shows the longest shortest path distribution. We can see two clear spikes, one centered around zero, and one centered around 8. Pages belonging to the mass centered around zero are pages that are very poorly connected, so while the longest path to get to such a page is very low, the number of pages that can reach such a page is also very low.&lt;br /&gt;
&lt;br /&gt;
The Simple English Wikipedia shows a diameter of 18; the English Wikipedia has at least 77; this is due to [[wikipedia:List_of_minor_planets/145701–145800|long chains of articles]].&amp;lt;ref name=&amp;quot;test&amp;quot;&amp;gt;http://mu.netsoc.ie/wiki/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disrupting the wiki game ==&lt;br /&gt;
As a mathematical problem, we can restate the Wiki Game as follows. Given a [[wikipedia:Graph_(mathematics)|network]] &amp;lt;math&amp;gt;G = (V,E)&amp;lt;/math&amp;gt;, a target &amp;lt;math&amp;gt; t \in V&amp;lt;/math&amp;gt; and a source &amp;lt;math&amp;gt; s \in V&amp;lt;/math&amp;gt;, we opt to find a shortest path &amp;lt;math&amp;gt;P(s,t) = (s, v_1, \ldots, v_n, t)&amp;lt;/math&amp;gt; of length &amp;lt;math&amp;gt;|P(s,t)| := n+1&amp;lt;/math&amp;gt; from &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. As the source is a random element from &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, one interesting measure is the shortest path length distribution&lt;br /&gt;
[[File:Indegree_resize.gif|400px|right|link=http://rexvalkering.nl/wiki/index.php/File:Indegree.gif|thumb|Path length distribution of the Simple English wikipedia network with Adolf Hitler as target page after sustained removal of nodes based on indegree.]]&lt;br /&gt;
:&amp;lt;math&amp;gt;N(t, p) := \#\{s \in V |~|P(s,t)| = p\}.&amp;lt;/math&amp;gt;&lt;br /&gt;
With this, we can look at average shortest path length&lt;br /&gt;
:&amp;lt;math&amp;gt;\overline N(t) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)&amp;lt;/math&amp;gt;&lt;br /&gt;
and the variance&lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{Var}(N(t)) = \frac{1}{|V|}\sum_{p \in \mathbb{N}} N(t,p)[p - \overline N(t)]^2.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, our goal is to disrupt the Wiki Game as efficiently as possible. The probability of starting the game from a page &amp;lt;math&amp;gt;s \in V&amp;lt;/math&amp;gt; must equal &amp;lt;math&amp;gt;1/|V|&amp;lt;/math&amp;gt;; this means that we want to find pages or pagelinks which, if deleted, increase the average path length the most. The size of our network forces us to find a smart attack strategy rather than simply trying each page or link. Effectivity of an attack algorithm on a page is measured by the number of pages/links that it removes before increasing &amp;lt;math&amp;gt;\overline N(t)&amp;lt;/math&amp;gt; by 0.5. We define this as the '''page robustness''' with respect to this attack.&lt;br /&gt;
&lt;br /&gt;
Taking a highest indegree attack strategy as an example, we can calculate &amp;lt;math&amp;gt;N(t,p), \overline N(t), \operatorname{Var}(N(t))&amp;lt;/math&amp;gt; with target node Hitler as it is being attacked. This yields the figure to the right. We see that this distribution is more or less [[wikipedia:Binomial_distribution|binomial]].&lt;br /&gt;
&lt;br /&gt;
=== Relative betweenness ===&lt;br /&gt;
[[File:Examplegraph1.png|300px|right|thumb|An unweighted, directed graph with a target node.]]&lt;br /&gt;
[[File:Examplegraph2.png|300px|right|thumb|Same graph, but reconstructed using breadth-first search to get all geodesic paths.]]&lt;br /&gt;
[[File:Examplegraph3.png|300px|right|thumb|Same graph, with the relative betweenness for all nodes and edges.]]&lt;br /&gt;
We define the '''relative betweenness''' of a node or edge as the number of shortest paths to target node &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; that pass through the node or edge&amp;lt;ref name=&amp;quot;brandes2001&amp;quot;&amp;gt;http://www.sciencedirect.com/science/article/pii/S0378873307000731#&amp;lt;/ref&amp;gt;. In order to find the relative betweenness of a node or edge, we define the following variables and sets:&lt;br /&gt;
&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{P}(v)&amp;lt;/math&amp;gt; as the set of predecessors of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The set &amp;lt;math&amp;gt;\mathcal{S}(w)&amp;lt;/math&amp;gt; as the set of successors of &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;|P(w,t)| = 1 + |P(v,t)|&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The geodesic weight &amp;lt;math&amp;gt;z(w) = \sum_{v \in \mathcal{S}(w)} z(v)&amp;lt;/math&amp;gt; (with &amp;lt;math&amp;gt;z(t) = 1&amp;lt;/math&amp;gt;);&lt;br /&gt;
:The relative betweenness of an edge: &amp;lt;math&amp;gt;C_B(w,v) = \begin{cases}\frac{z(v)}{z(w)} \cdot (1 + C_B(w)) \text{ if } v \in \mathcal{S}(w)\\ 0 \text{ otherwise } \end{cases}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:The relative betweenness of a node: &amp;lt;math&amp;gt;C_B(v) = \sum_{w \in \mathcal{P}(v)} C_B(w,v)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Relative betweenness attack strategy ====&lt;br /&gt;
&lt;br /&gt;
# Do a breadth-first search to get geodesic lengths for every node.&lt;br /&gt;
# Calculate the weight &amp;lt;math&amp;gt;z(w)&amp;lt;/math&amp;gt; for every node &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;&lt;br /&gt;
# Calculate the average geodesic length&lt;br /&gt;
# While average geodesic length has not increased with at least 0.5:&lt;br /&gt;
## For all nodes &amp;lt;math&amp;gt;v \in V&amp;lt;/math&amp;gt; in reverse order of geodesic length:&lt;br /&gt;
### Calculate relative edge betweenness of all edges &amp;lt;math&amp;gt;(v,w)&amp;lt;/math&amp;gt; with &amp;lt;math&amp;gt;w \in \mathcal{S}(v)&amp;lt;/math&amp;gt;&lt;br /&gt;
### Calculate relative node betweenness of &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;&lt;br /&gt;
## Remove node or edge with highest betweenness&lt;br /&gt;
## Update geodesic lengths and node weights for affected nodes&lt;br /&gt;
&lt;br /&gt;
=== Attacking nodes ===&lt;br /&gt;
Node attacks were done using the following strategies:&lt;br /&gt;
; Highest indegree : &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree; executing one attack takes milliseconds, as we only have to loop over the predecessors of &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative betweenness : &amp;lt;math&amp;gt;w \in V&amp;lt;/math&amp;gt; with highest &amp;lt;math&amp;gt;C_B(w)&amp;lt;/math&amp;gt;; takes a few seconds, as we have to traverse all nodes that can reach &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We quickly realized that while of theoretical relevance, attacking nodes would never work in practice as it requires removing entire Wikipedia pages. Therefore we moved on to the more realistic edge attack strategies.&lt;br /&gt;
&lt;br /&gt;
=== Attacking edges ===&lt;br /&gt;
We execute attacks on edges using the following metrics:&lt;br /&gt;
; Highest indegree : Choose the &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; with highest indegree and remove &amp;lt;math&amp;gt;(w,t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
; Highest relative node betweenness :  Edge on shortest path coming from node with highest relative node betweenness; we select the node &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; with highest relative betweenness, and pick &amp;lt;math&amp;gt;w \in \mathcal S(v)&amp;lt;/math&amp;gt; with highest node betweenness.&lt;br /&gt;
; Highest relative edge betweenness : This is self-explanatory.&lt;br /&gt;
; Greedy : loops over all nodes &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; and chooses the edge which removal increases the average path length the most.&lt;br /&gt;
&lt;br /&gt;
The definition of relative betweenness implies that for &amp;lt;math&amp;gt;w \in \mathcal P(t)&amp;lt;/math&amp;gt; it holds that &amp;lt;math&amp;gt; C_B(w, t) = z(w)(1 + C_B(w)) = 1 + C_B(w)&amp;lt;/math&amp;gt;, so that the second and third algorithm attack the same edge in all cases.&lt;br /&gt;
&lt;br /&gt;
=== Numerical results ===&lt;br /&gt;
The size of the network made it impossible to test our attack strategies on all pages. Moreover, the majority of pages is hardly robust at all. We ultimately chose the 48 [[wikipedia:simple:Time_Person_of_the_Year|Time People of the Year]] as test subjects; this list includes [[wikipedia:simple:Mahatma Gandhi|Mahatma Gandhi]], our beloved [[wikipedia:simple:Adolf Hitler|Adolf]], [[wikipedia:simple:Elizabeth II|Queen Elizabeth II]], and [[wikipedia:simple:Mark Zuckerberg|Mark Zuckerberg]]. These 48 pages are all relatively well-connected with indegrees ranging from 14 to 649, and average geodesic lengths ranging from 2.83 to 3.65.&lt;br /&gt;
&lt;br /&gt;
Looking at the first figure below, we see that (relative) betweenness is the attack strategy producing the lowest average robustness. Moreover, attacks based on indegree perform badly.&lt;br /&gt;
&lt;br /&gt;
Before simulating, we conjectured that the greedy algorithm would find optimal results, seeing it attacks the locally optimal edge. Looking at the middle figure, this conjecture is approximately correct. In the right figure however, we see that the greedy and betweenness strategy (blue resp. green line in the graph) attack the same edge in iterations 1 to 4. We also see that the green line stalls at iteration 4 to surge again from iteration 5 onward. Apparently, choosing the local optimum in iteration 4 does not imply a global optimum.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Avgs.png|thumb|none|350px|Average page robustness with respect to our five attack strategies. The pages considered are the 48 Time People of the Year.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Hitler_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Adolf Hitler.]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Charles_attacks.png|thumb|none|350px|Various attack methods and their effectiveness against Charles de Gaulle.]]&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Wiki Game in practice ==&lt;br /&gt;
[[File:Angela.png|300px|left|thumb|A failed first try in attacking the page of [[wikipedia:Germany|German]] politician [[wikipedia:simple:Angela_Merkel|Angela Merkel]].&amp;lt;ref&amp;gt;https://simple.wikipedia.org/w/index.php?title=Angela_Merkel&amp;amp;type=revision&amp;amp;diff=5163294&amp;amp;oldid=5163092&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
After working with all this data, we decided it would be fun to test out how feasible an actual Wiki attack was. Of course, node attacks imply removing a Wikipedia page which is completely undoable. Removing edges however is easily done.&lt;br /&gt;
&lt;br /&gt;
Removing links from articles was spotted and reverted quickly (see Figure to the left) so we decided to rewrite the sentences containing the links instead. &lt;br /&gt;
&lt;br /&gt;
=== Attacking Justin Bieber ===&lt;br /&gt;
Nobody actually likes Justin Bieber{{Citation needed}} and as such he was an obvious target. Fortunately his page is somewhat poorly connected, with only [https://simple.wikipedia.org/w/index.php?title=Special%3AWhatLinksHere&amp;amp;target=Justin+Bieber&amp;amp;namespace=0| 14 links] pointing to his article. His relative betweenness robustness was found to be just two by removing &lt;br /&gt;
[[File:justin_edit.png|300px|right|thumb|Stealthy removal of Justin Bieber from Wikipedia English.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1994&amp;amp;type=revision&amp;amp;diff=5166171&amp;amp;oldid=5014657| (1994, Justin Bieber)] and &lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=March_1&amp;amp;type=revision&amp;amp;diff=5166189&amp;amp;oldid=5128111| (March 1, Justin Bieber)].&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
! &amp;lt;math&amp;gt;\overline N(\text{Justin Bieber})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0  || 3.8563&lt;br /&gt;
|-&lt;br /&gt;
|1 || 4.0103&lt;br /&gt;
|-&lt;br /&gt;
|2|| 4.5282&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As was to be expected, Justin Bieber is a very easy target; we needed just 2 links to increase his average path length with a half.&lt;br /&gt;
&lt;br /&gt;
=== Eurozone? όχι! ===&lt;br /&gt;
While everybody is voting for or against #GREXIT, we decided to take a stand on this issue by removing not Greece from the Eurozone but the Eurozone from Wikipedia. Our relative betweenness attack strategy yielded a robustness of 7, with&lt;br /&gt;
[[File:Montenegro.png|300px|right|thumb|Successful removal of a link to Eurozone.]]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=European_Union&amp;amp;type=revision&amp;amp;diff=5166234&amp;amp;oldid=5140218| (European Union, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=ISO_4217&amp;amp;type=revision&amp;amp;diff=5166222&amp;amp;oldid=4407302| (ISO 4217, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Bulgaria&amp;amp;type=revision&amp;amp;diff=5166208&amp;amp;oldid=5166207| (Bulgaria, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=Montenegro&amp;amp;type=revision&amp;amp;diff=5166225&amp;amp;oldid=4978173| (Montenegro, Eurozone)]&lt;br /&gt;
* (Euro, Eurozone)&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=1999&amp;amp;type=revision&amp;amp;diff=5166232&amp;amp;oldid=5150104| (1999, Eurozone)]&lt;br /&gt;
* [https://simple.wikipedia.org/w/index.php?title=2010&amp;amp;type=revision&amp;amp;diff=5166231&amp;amp;oldid=5166229| (2010, Eurozone)]&lt;br /&gt;
The [[wikipedia:simple:Euro|Euro]] page has 6 explicit mentions of Eurozone, so we opted to remove [https://simple.wikipedia.org/w/index.php?title=2015&amp;amp;type=revision&amp;amp;diff=5166241&amp;amp;oldid=5158867| (2015, Eurozone)] instead.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Attack Results&lt;br /&gt;
|-&lt;br /&gt;
!# of edges removed&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Eurozone})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0 || 3.2545&lt;br /&gt;
|-&lt;br /&gt;
|1|| 3.2848&lt;br /&gt;
|-&lt;br /&gt;
|2 || 3.3751&lt;br /&gt;
|-&lt;br /&gt;
|3||3.4691&lt;br /&gt;
|-&lt;br /&gt;
|4||3.5611&lt;br /&gt;
|-&lt;br /&gt;
|5||3.6191&lt;br /&gt;
|-&lt;br /&gt;
|6||3.6670&lt;br /&gt;
|-&lt;br /&gt;
|7||3.7359&lt;br /&gt;
|-&lt;br /&gt;
|8&amp;lt;ref&amp;gt;Not actually performed.&amp;lt;/ref&amp;gt;||3.9015&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We see that as The Eurozone article is reasonably well connected, we have to remove 7 links to increase its average path length by a half.&lt;br /&gt;
&lt;br /&gt;
===Mending the Wiki Game: putting Britney back in the spotlight===&lt;br /&gt;
[[File:Britney.png|300px|right|thumb|Successful addition of a link to Britney Spears from the United States page.]]&lt;br /&gt;
Rather than removing links to make a page less visible, we can also add links to improve the visibility of a page. This is a  very different problem, as edge not yet existing in the network could be added. So the goal was to both find links that would be reasonable to add, and find a fast heuristic to find links the would provide a good improvement on the average geodesic length.&lt;br /&gt;
&lt;br /&gt;
We decided to see if we could improve the average geodesic length of famous singer [[wikipedia:Britney_Spears|Britney Spears]]. To this end we selected various nodes which themselves have a very low average geodesic length, and where a link to Britney could be added. [https://simple.wikipedia.org/w/index.php?title=United_States&amp;amp;type=revision&amp;amp;diff=5165763&amp;amp;oldid=5163040| United States] and [https://simple.wikipedia.org/w/index.php?title=Americans&amp;amp;type=revision&amp;amp;diff=5165767&amp;amp;oldid=5078214| Americans] seemed the best candidates.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Mending Results&lt;br /&gt;
|-&lt;br /&gt;
!Links added from&lt;br /&gt;
!  &amp;lt;math&amp;gt;\overline N(\text{Britney Spears})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||| 3.4018&lt;br /&gt;
|-&lt;br /&gt;
| United States|| 2.9342&lt;br /&gt;
|-&lt;br /&gt;
|United States, Americans || 2.8943&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Adding links to Britney Spears to these pages reduced the average geodesic length by more than 0.5. An important advantage of adding links, rather than removing them, is that it is not considered vandalism if the information is correct. This last note makes algorithmic selection of pages more challenging, as most pairs of pages are not directly related, making it hard to add relevant information about that page. For example, it would be harder to add content that would link Britney Spears to Germany.&lt;br /&gt;
&lt;br /&gt;
==Attacking the wiki network with ulterior motives==&lt;br /&gt;
We have seen that editing a Wikipedia page is possible, and will have a real effect on the average geodesic length of the page. While these examples are purely for academic purposes, it is very possible an editor can have an ulterior motive behind making an edit. A good example of such an edit would be for a person to add links in Wikipedia to their own page as a form of [[wikipedia:Public Relations|PR]].&lt;br /&gt;
&lt;br /&gt;
As it turns out, [[wikipedia:Conflict-of-interest_editing_on_Wikipedia|Conflict of interest editing]] happens a lot on Wikipedia. There are many known cases&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Conflict-of-interest_editing_on_Wikipedia#Incidents&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;http://www.bbc.com/news/technology-28481876&amp;lt;/ref&amp;gt; where large companies and political parties have made edits to Wikipedia pages to either improve their own brand or to try to deface the pages of their competitors.&lt;br /&gt;
&lt;br /&gt;
A big difference between the edits made by these parties and our strategy is that they are often aimed at modifying the content of a page, while we modifying the link connectivity of a page. Often these edits are very childish and are quickly reverted; see figure. [[File:Rick_Santorum.png|300px|right|thumb|A very professional edit made to the page of US Politician Rick Santorum.]]&lt;br /&gt;
&lt;br /&gt;
== Final thoughts ==&lt;br /&gt;
&lt;br /&gt;
Even though our research mentions Wikipedia, we did most of the analysis on the Simple English Wiki. We did not have the hardware available to import and process recent data of Wikipedia and run our algorithms. With a computationally stronger system and optimized algorithms, this would be more feasible.&lt;br /&gt;
&lt;br /&gt;
The focus of this research was mainly on disrupting the Wiki Game by edge removal. Investigating algorithms for edge addition was not inside the scope of this research, as removing links from Wikipedia pages is easier to achieve than strategically adding links to pages (as this would require that the links are relevant). With more information, however, it would be possible to develop an algorithm that suggests pages of the same category, or that suggests to link to pages that already link to the target page.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rex</name></author>
		
	</entry>
</feed>