<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sunrust.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Engie</id>
	<title>Sunrust Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sunrust.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Engie"/>
	<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Special:Contributions/Engie"/>
	<updated>2026-05-30T08:24:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2015</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2015"/>
		<updated>2020-11-29T07:23:04Z</updated>

		<summary type="html">&lt;p&gt;Engie: Revert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#F90;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHealing()          ---------------- HEALING --------------------&lt;br /&gt;
	if not args.healing then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Healing :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.healing, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&lt;br /&gt;
	renderHealing()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&lt;br /&gt;
	--HEALING&lt;br /&gt;
	preprocessSingleArg('healing')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2014</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2014"/>
		<updated>2020-11-29T07:19:07Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 labelstyle= &amp;quot;background:#999;color:#FFF;&amp;quot;&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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#F90;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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(&amp;quot;color:#FFF;&amp;quot;)&lt;br /&gt;
                :cssText(args.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.labelclass)&lt;br /&gt;
                    :cssText(args.labelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.labelclass)&lt;br /&gt;
	    :cssText(args.labelstyle)&lt;br /&gt;
            :cssText(labelstyl)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHealing()          ---------------- HEALING --------------------&lt;br /&gt;
	if not args.healing then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Healing :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.healing, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&lt;br /&gt;
	renderHealing()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&lt;br /&gt;
	--HEALING&lt;br /&gt;
	preprocessSingleArg('healing')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2013</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2013"/>
		<updated>2020-11-29T06:55:46Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#F90;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHealing()          ---------------- HEALING --------------------&lt;br /&gt;
	if not args.healing then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Healing :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.healing, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&lt;br /&gt;
	renderHealing()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&lt;br /&gt;
	--HEALING&lt;br /&gt;
	preprocessSingleArg('healing')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2012</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=2012"/>
		<updated>2020-11-29T06:53:53Z</updated>

		<summary type="html">&lt;p&gt;Engie: Color change and typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Weapon 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHealing()          ---------------- HEALING --------------------&lt;br /&gt;
	if not args.healing then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Healing :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.healing, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&lt;br /&gt;
	renderHealing()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&lt;br /&gt;
	--HEALING&lt;br /&gt;
	preprocessSingleArg('healing')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1273</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1273"/>
		<updated>2020-05-06T17:29:30Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this template are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;br /&gt;
*debufftime --Time of debuff in seconds&lt;br /&gt;
*bufftime --Time of buff in seconds&lt;br /&gt;
*healing&lt;br /&gt;
&lt;br /&gt;
Melee exclusive stats :&lt;br /&gt;
*range&lt;br /&gt;
*knockback&lt;br /&gt;
*stability&lt;br /&gt;
*staminause  --stamina use in %&lt;br /&gt;
*block  --block value in %&lt;br /&gt;
*impactdelay&lt;br /&gt;
*size&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1272</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1272"/>
		<updated>2020-05-06T17:28:36Z</updated>

		<summary type="html">&lt;p&gt;Engie: added healing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHealing()          ---------------- HEALING --------------------&lt;br /&gt;
	if not args.healing then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Healing :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.healing, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&lt;br /&gt;
	renderHealing()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&lt;br /&gt;
	--HEALING&lt;br /&gt;
	preprocessSingleArg('healing')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Sunrust_Wiki:About&amp;diff=1271</id>
		<title>Sunrust Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Sunrust_Wiki:About&amp;diff=1271"/>
		<updated>2020-05-06T17:10:28Z</updated>

		<summary type="html">&lt;p&gt;Engie: removed shitpost by monkeyandrew&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;zs&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Sunrust_Wiki:About&amp;diff=1270</id>
		<title>Sunrust Wiki:About</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Sunrust_Wiki:About&amp;diff=1270"/>
		<updated>2020-05-06T17:09:59Z</updated>

		<summary type="html">&lt;p&gt;Engie: Undo revision 744 by M0nkeyandrew (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sunrust is a fucking shit show, it is filled with furries, degenerates, trolls, etc. There are also mentally ill admins which is COOOOOOOOOOOL. Plus, zs (zombie survival) is fucking stupid.&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1258</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1258"/>
		<updated>2020-05-06T16:47:21Z</updated>

		<summary type="html">&lt;p&gt;Engie: updated doc with bufftime&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this template are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;br /&gt;
*debufftime --Time of debuff in seconds&lt;br /&gt;
*bufftime --Time of buff in seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Melee exclusive stats :&lt;br /&gt;
*range&lt;br /&gt;
*knockback&lt;br /&gt;
*stability&lt;br /&gt;
*staminause  --stamina use in %&lt;br /&gt;
*block  --block value in %&lt;br /&gt;
*impactdelay&lt;br /&gt;
*size&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1256</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1256"/>
		<updated>2020-05-06T16:46:08Z</updated>

		<summary type="html">&lt;p&gt;Engie: added buff time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebufftime()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBufftime()          ---------------- BUFF TIME --------------------&lt;br /&gt;
	if not args.bufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Buff duration :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.bufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebufftime()&lt;br /&gt;
	renderBufftime()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--BUFF TIME&lt;br /&gt;
	preprocessSingleArg('bufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1250</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1250"/>
		<updated>2020-05-06T14:19:31Z</updated>

		<summary type="html">&lt;p&gt;Engie: added melee stat documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this template are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;br /&gt;
*debufftime --Time of debuff in seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Melee exclusive stats :&lt;br /&gt;
*range&lt;br /&gt;
*knockback&lt;br /&gt;
*stability&lt;br /&gt;
*staminause  --stamina use in %&lt;br /&gt;
*block  --block value in %&lt;br /&gt;
*impactdelay&lt;br /&gt;
*size&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1249</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1249"/>
		<updated>2020-05-06T14:14:46Z</updated>

		<summary type="html">&lt;p&gt;Engie: added melee stats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebuff()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRange()          ---------------- RANGE --------------------&lt;br /&gt;
	if not args.range then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Range :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.range, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderKb()          ---------------- KB --------------------&lt;br /&gt;
	if not args.knockback then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Knockback :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.knockback, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStability()          ---------------- STABILITY --------------------&lt;br /&gt;
	if not args.stability then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stability :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.stability, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderStamina()          ---------------- STAMINA USE --------------------&lt;br /&gt;
	if not args.staminause then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Stamina use :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.staminause, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBlock()          ---------------- BLOCK VALUE --------------------&lt;br /&gt;
	if not args.block then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Block value :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.block, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImpactdly()          ---------------- IMPACT DELAY --------------------&lt;br /&gt;
	if not args.impactdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Impact delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.impactdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSize()          ---------------- SIZE --------------------&lt;br /&gt;
	if not args.size then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.size, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebuff()&lt;br /&gt;
	renderRange()&lt;br /&gt;
	renderKb()&lt;br /&gt;
	renderStability()&lt;br /&gt;
	renderStamina()&lt;br /&gt;
	renderBlock()&lt;br /&gt;
	renderImpactdly()&lt;br /&gt;
	renderSize()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&lt;br /&gt;
	--RANGE&lt;br /&gt;
	preprocessSingleArg('range')&lt;br /&gt;
	&lt;br /&gt;
	--KB&lt;br /&gt;
	preprocessSingleArg('knockback')&lt;br /&gt;
	&lt;br /&gt;
	--STABILITY&lt;br /&gt;
	preprocessSingleArg('stability')&lt;br /&gt;
	&lt;br /&gt;
	--STAMINA&lt;br /&gt;
	preprocessSingleArg('staminause')&lt;br /&gt;
	&lt;br /&gt;
	--BLOCK VALUE&lt;br /&gt;
	preprocessSingleArg('block')&lt;br /&gt;
	&lt;br /&gt;
	--IMPACT DELAY&lt;br /&gt;
	preprocessSingleArg('impactdelay')&lt;br /&gt;
	&lt;br /&gt;
	--SIZE&lt;br /&gt;
	preprocessSingleArg('size')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1248</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=1248"/>
		<updated>2020-05-06T13:40:03Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this template are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;br /&gt;
*debufftime --Time of debuff in seconds&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1247</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=1247"/>
		<updated>2020-05-06T13:37:58Z</updated>

		<summary type="html">&lt;p&gt;Engie: added debuff time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDebuff()          ---------------- DEBUFF TIME --------------------&lt;br /&gt;
	if not args.debufftime then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Debuff time :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.debufftime, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&lt;br /&gt;
	renderDebuff()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&lt;br /&gt;
	--DEBUFF TIME&lt;br /&gt;
	preprocessSingleArg('debufftime')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=998</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=998"/>
		<updated>2020-04-26T13:51:53Z</updated>

		<summary type="html">&lt;p&gt;Engie: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this template are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=975</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=975"/>
		<updated>2020-04-17T15:33:25Z</updated>

		<summary type="html">&lt;p&gt;Engie: optimisation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=%27Stubber%27_Rifle&amp;diff=974</id>
		<title>'Stubber' Rifle</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=%27Stubber%27_Rifle&amp;diff=974"/>
		<updated>2020-04-17T14:52:48Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Your basic bolt action sniper rifle, capable of providing good damage on headshots.&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=973</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=973"/>
		<updated>2020-04-17T14:47:48Z</updated>

		<summary type="html">&lt;p&gt;Engie: Add headshot multiplier doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;br /&gt;
*headshotmulti --Headshot multiplier&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=972</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=972"/>
		<updated>2020-04-17T14:44:43Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.nbpierceslabelclass)&lt;br /&gt;
                    :cssText(args.nbpierceslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.nbpiercesclass)&lt;br /&gt;
            :cssText(args.nbpiercesstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.piercetaperlabelclass)&lt;br /&gt;
                    :cssText(args.piercetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.piercetaperclass)&lt;br /&gt;
            :cssText(args.piercetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoeradiuslabelclass)&lt;br /&gt;
                    :cssText(args.aoeradiuslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoeradiusclass)&lt;br /&gt;
            :cssText(args.aoeradiusstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoetaperlabelclass)&lt;br /&gt;
                    :cssText(args.aoetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoetaperclass)&lt;br /&gt;
            :cssText(args.aoetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;x&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	preprocessSingleArg('nbpiercesstyle')&lt;br /&gt;
	preprocessSingleArg('nbpiercesclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	preprocessSingleArg('piercetaperstyle')&lt;br /&gt;
	preprocessSingleArg('piercetaperclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	preprocessSingleArg('aoeradiusstyle')&lt;br /&gt;
	preprocessSingleArg('aoeradiusclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	preprocessSingleArg('aoetaperstyle')&lt;br /&gt;
	preprocessSingleArg('aoetaperclass')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=971</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=971"/>
		<updated>2020-04-17T14:43:42Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Stubber' Rifle&lt;br /&gt;
|tier = 1&lt;br /&gt;
|cost = 15&lt;br /&gt;
|damage = 55&lt;br /&gt;
|reload = 2.93&lt;br /&gt;
|attackdelay = 1.15&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0&lt;br /&gt;
|maxspread = 3.75&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 50&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 2.2&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=970</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=970"/>
		<updated>2020-04-17T14:40:18Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
|headshotmulti = 110&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=969</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=969"/>
		<updated>2020-04-17T14:39:52Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.nbpierceslabelclass)&lt;br /&gt;
                    :cssText(args.nbpierceslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.nbpiercesclass)&lt;br /&gt;
            :cssText(args.nbpiercesstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.piercetaperlabelclass)&lt;br /&gt;
                    :cssText(args.piercetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.piercetaperclass)&lt;br /&gt;
            :cssText(args.piercetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoeradiuslabelclass)&lt;br /&gt;
                    :cssText(args.aoeradiuslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoeradiusclass)&lt;br /&gt;
            :cssText(args.aoeradiusstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoetaperlabelclass)&lt;br /&gt;
                    :cssText(args.aoetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoetaperclass)&lt;br /&gt;
            :cssText(args.aoetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHsm()          ---------------- HS MULTI --------------------&lt;br /&gt;
	if not args.headshotmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :wikitext(&amp;quot;Headshot multiplier :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :wikitext(fixChildBoxes(args.headshotmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&lt;br /&gt;
	renderHsm()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	preprocessSingleArg('nbpiercesstyle')&lt;br /&gt;
	preprocessSingleArg('nbpiercesclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	preprocessSingleArg('piercetaperstyle')&lt;br /&gt;
	preprocessSingleArg('piercetaperclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	preprocessSingleArg('aoeradiusstyle')&lt;br /&gt;
	preprocessSingleArg('aoeradiusclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	preprocessSingleArg('aoetaperstyle')&lt;br /&gt;
	preprocessSingleArg('aoetaperclass')&lt;br /&gt;
	&lt;br /&gt;
	--HS MULTI&lt;br /&gt;
	preprocessSingleArg('headshotmulti')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=921</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=921"/>
		<updated>2020-04-08T21:29:06Z</updated>

		<summary type="html">&lt;p&gt;Engie: added pierce and aoe stats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;br /&gt;
*nbpierces  --Pierces&lt;br /&gt;
*piercetaper&lt;br /&gt;
*aoeradius  --Area radius&lt;br /&gt;
*aoetaper   --Area taper&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=920</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=920"/>
		<updated>2020-04-08T21:20:49Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Akbar' Assault Rifle&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 21.75&lt;br /&gt;
|reload = 2.46&lt;br /&gt;
|attackdelay = 0.12&lt;br /&gt;
|clipsize = 30&lt;br /&gt;
|minspread = 1.27&lt;br /&gt;
|maxspread = 2.65&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 30&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = &lt;br /&gt;
|pulseslow =&lt;br /&gt;
|nbpierces = 1&lt;br /&gt;
|piercetaper = 20&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=919</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=919"/>
		<updated>2020-04-08T21:10:49Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.nbpierceslabelclass)&lt;br /&gt;
                    :cssText(args.nbpierceslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.nbpiercesclass)&lt;br /&gt;
            :cssText(args.nbpiercesstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.piercetaperlabelclass)&lt;br /&gt;
                    :cssText(args.piercetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.piercetaperclass)&lt;br /&gt;
            :cssText(args.piercetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRadius()          ---------------- AOE RADIUS --------------------&lt;br /&gt;
	if not args.aoeradius then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoeradiuslabelclass)&lt;br /&gt;
                    :cssText(args.aoeradiuslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Radius :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoeradiusclass)&lt;br /&gt;
            :cssText(args.aoeradiusstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoeradius, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTaper()          ---------------- AOE TAPER --------------------&lt;br /&gt;
	if not args.aoetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.aoetaperlabelclass)&lt;br /&gt;
                    :cssText(args.aoetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Area Taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.aoetaperclass)&lt;br /&gt;
            :cssText(args.aoetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.aoetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&lt;br /&gt;
	renderRadius()&lt;br /&gt;
	renderTaper()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	preprocessSingleArg('nbpiercesstyle')&lt;br /&gt;
	preprocessSingleArg('nbpiercesclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	preprocessSingleArg('piercetaperstyle')&lt;br /&gt;
	preprocessSingleArg('piercetaperclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE RADIUS&lt;br /&gt;
	preprocessSingleArg('aoeradius')&lt;br /&gt;
	preprocessSingleArg('aoeradiusstyle')&lt;br /&gt;
	preprocessSingleArg('aoeradiusclass')&lt;br /&gt;
	&lt;br /&gt;
	--AOE TAPER&lt;br /&gt;
	preprocessSingleArg('aoetaper')&lt;br /&gt;
	preprocessSingleArg('aoetaperstyle')&lt;br /&gt;
	preprocessSingleArg('aoetaperclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=918</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=918"/>
		<updated>2020-04-08T20:28:40Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPierces()          ---------------- PIERCES --------------------&lt;br /&gt;
	if not args.nbpierces then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.nbpierceslabelclass)&lt;br /&gt;
                    :cssText(args.nbpierceslabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierces :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.nbpiercesclass)&lt;br /&gt;
            :cssText(args.nbpiercesstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.nbpierces, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPiercetaper()          ---------------- PIERCE TAPER --------------------&lt;br /&gt;
	if not args.piercetaper then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.piercetaperlabelclass)&lt;br /&gt;
                    :cssText(args.piercetaperlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Pierce taper :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.piercetaperclass)&lt;br /&gt;
            :cssText(args.piercetaperstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.piercetaper, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&lt;br /&gt;
	renderPierces()&lt;br /&gt;
	renderPiercetaper()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCES&lt;br /&gt;
	preprocessSingleArg('nbpierces')&lt;br /&gt;
	preprocessSingleArg('nbpiercesstyle')&lt;br /&gt;
	preprocessSingleArg('nbpiercesclass')&lt;br /&gt;
	&lt;br /&gt;
	--PIERCE TAPER&lt;br /&gt;
	preprocessSingleArg('piercetaper')&lt;br /&gt;
	preprocessSingleArg('piercetaperstyle')&lt;br /&gt;
	preprocessSingleArg('piercetaperclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=910</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=910"/>
		<updated>2020-04-07T15:15:02Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
Notice how some stats dont have a value assigned to them. All stats are optional, however, i recommend still putting the name of stats that are unused, in case a future update adds them to the weapon.&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=909</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=909"/>
		<updated>2020-04-07T15:03:53Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for weapons. Its development has reached a point where this should be used for guns only, melee will be implemented.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
|pointmulti =&lt;br /&gt;
|pulseslow =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre style=&amp;quot;overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|respierce =&lt;br /&gt;
|overkill =&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;{{clear}}&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=908</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=908"/>
		<updated>2020-04-07T14:56:26Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Existing parameters for this templates are :&lt;br /&gt;
*weapon      --This designates then NAME of the weapon&lt;br /&gt;
*tier&lt;br /&gt;
*cost&lt;br /&gt;
*damage&lt;br /&gt;
*reload      --This designates reload time in seconds&lt;br /&gt;
*attackdelay&lt;br /&gt;
*clipsize&lt;br /&gt;
*minspread   --Minimum spread&lt;br /&gt;
*maxspread   --Maximum spread&lt;br /&gt;
*movespeed&lt;br /&gt;
*respierce   --Resistance pierce in %&lt;br /&gt;
*overkill&lt;br /&gt;
*pointmulti --Point multiplier in %&lt;br /&gt;
*pulseslow  --Written as &amp;quot;Slow%&amp;quot; in weapon database&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=907</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=907"/>
		<updated>2020-04-07T14:44:29Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|pulseslow = 38&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=906</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=906"/>
		<updated>2020-04-07T14:31:41Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|weapon = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|slow = 38&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=905</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=905"/>
		<updated>2020-04-07T14:31:10Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|gun = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Weapon Infobox&lt;br /&gt;
|gun = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|slow = 38&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox&amp;diff=904</id>
		<title>Template:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox&amp;diff=904"/>
		<updated>2020-04-07T14:30:26Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Weapon Infobox|infobox}}&amp;lt;includeonly&amp;gt;{{template other|{{#ifeq:{{PAGENAME}}|Weapon Infobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Weapon Infobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Gun_infobox/doc&amp;diff=903</id>
		<title>Template:Gun infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Gun_infobox/doc&amp;diff=903"/>
		<updated>2020-04-07T14:29:28Z</updated>

		<summary type="html">&lt;p&gt;Engie: Engie moved page Template:Gun infobox/doc to Template:Weapon Infobox/doc: Infobox will be made to apply to all weapons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Weapon Infobox/doc]]&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=902</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=902"/>
		<updated>2020-04-07T14:29:27Z</updated>

		<summary type="html">&lt;p&gt;Engie: Engie moved page Template:Gun infobox/doc to Template:Weapon Infobox/doc: Infobox will be made to apply to all weapons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Gun infobox&lt;br /&gt;
|gun = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Gun infobox&lt;br /&gt;
|gun = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|slow = 38&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Gun_infobox&amp;diff=901</id>
		<title>Template:Gun infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Gun_infobox&amp;diff=901"/>
		<updated>2020-04-07T14:29:27Z</updated>

		<summary type="html">&lt;p&gt;Engie: Engie moved page Template:Gun infobox to Template:Weapon Infobox: Infobox will be made to apply to all weapons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Weapon Infobox]]&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox&amp;diff=900</id>
		<title>Template:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox&amp;diff=900"/>
		<updated>2020-04-07T14:29:27Z</updated>

		<summary type="html">&lt;p&gt;Engie: Engie moved page Template:Gun infobox to Template:Weapon Infobox: Infobox will be made to apply to all weapons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Guninfobox|infobox}}&amp;lt;includeonly&amp;gt;{{template other|{{#ifeq:{{PAGENAME}}|Guninfobox||{{#ifeq:{{str left|{{SUBPAGENAME}}|7}}|Guninfobox|[[Category:Infobox templates|{{remove first word|{{SUBPAGENAME}}}}]]}}}}|}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=899</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=899"/>
		<updated>2020-04-07T14:28:21Z</updated>

		<summary type="html">&lt;p&gt;Engie: Engie moved page Module:Guninfobox to Module:Weapon Infobox without leaving a redirect: Infobox will be made to apply to all weapons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=897</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=897"/>
		<updated>2020-04-07T14:22:37Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderWeapon()              --------------- WEAPON NAME -------------------&lt;br /&gt;
    if not args.weapon then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.weaponclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.weapon)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderWeapon()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--WEAPON&lt;br /&gt;
    preprocessSingleArg('weapon')&lt;br /&gt;
    preprocessSingleArg('weaponclass')&lt;br /&gt;
    preprocessSingleArg('weaponstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=896</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=896"/>
		<updated>2020-04-07T14:18:36Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderSlow()          ---------------- SLOW --------------------&lt;br /&gt;
	if not args.pulseslow then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pulseslowlabelclass)&lt;br /&gt;
                    :cssText(args.pulseslowlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Slow :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pulseslowclass)&lt;br /&gt;
            :cssText(args.pulseslowstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pulseslow, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&lt;br /&gt;
	renderSlow()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&lt;br /&gt;
	--SLOW&lt;br /&gt;
	preprocessSingleArg('pulseslow')&lt;br /&gt;
	preprocessSingleArg('pulseslowstyle')&lt;br /&gt;
	preprocessSingleArg('pulseslowclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=895</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=895"/>
		<updated>2020-04-07T14:04:35Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Point Multi :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=894</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=894"/>
		<updated>2020-04-07T14:03:08Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderPointmulti()          ---------------- POINT MULTIPLIER --------------------&lt;br /&gt;
	if not args.pointmulti then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.pointmultilabelclass)&lt;br /&gt;
                    :cssText(args.pointmultilabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.pointmulticlass)&lt;br /&gt;
            :cssText(args.pointmultistyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.pointmulti, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&lt;br /&gt;
	renderPointmulti()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&lt;br /&gt;
	--POINT MULTI&lt;br /&gt;
	preprocessSingleArg('pointmulti')&lt;br /&gt;
	preprocessSingleArg('pointmultistyle')&lt;br /&gt;
	preprocessSingleArg('pointmulticlass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=893</id>
		<title>Template:Weapon Infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Template:Weapon_Infobox/doc&amp;diff=893"/>
		<updated>2020-04-07T13:49:27Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This template is used to create infoboxes for guns. It is currently in development and should not be used.&lt;br /&gt;
This page will feature the arguments for this infobox as it is developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples :&lt;br /&gt;
{{Gun infobox&lt;br /&gt;
|gun = 'Annabelle' Rifle&lt;br /&gt;
|tier = 2&lt;br /&gt;
|cost = 30&lt;br /&gt;
|damage = 70&lt;br /&gt;
|reload = 0.43&lt;br /&gt;
|attackdelay = 0.73&lt;br /&gt;
|clipsize = 5&lt;br /&gt;
|minspread = 0.25&lt;br /&gt;
|maxspread = 4&lt;br /&gt;
|movespeed = 218&lt;br /&gt;
|respierce = 70&lt;br /&gt;
|overkill = 25&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Gun infobox&lt;br /&gt;
|gun = 'Oberon' Pulse Shotgun&lt;br /&gt;
|tier = 3&lt;br /&gt;
|cost = 65&lt;br /&gt;
|damage = 13x5&lt;br /&gt;
|reload = 0.4&lt;br /&gt;
|attackdelay = 0.82&lt;br /&gt;
|clipsize = 7&lt;br /&gt;
|minspread = 4.75&lt;br /&gt;
|maxspread = 5.5&lt;br /&gt;
|movespeed = 211&lt;br /&gt;
|pointmulti = 125&lt;br /&gt;
|slow = 38&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=892</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=892"/>
		<updated>2020-04-07T13:49:05Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.attackdelay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.attackdelaylabelclass)&lt;br /&gt;
                    :cssText(args.attackdelaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.attackdelayclass)&lt;br /&gt;
            :cssText(args.attackdelaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.attackdelay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('attackdelay')&lt;br /&gt;
	preprocessSingleArg('attackdelaystyle')&lt;br /&gt;
	preprocessSingleArg('attackdelayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=891</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=891"/>
		<updated>2020-04-07T13:42:23Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderOverkill()          ----------------OVERKILL--------------------&lt;br /&gt;
	if not args.overkill then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.overkillclass)&lt;br /&gt;
                    :cssText(args.overkillstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Overkill :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.overkillclass)&lt;br /&gt;
            :cssText(args.overkillstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.overkill, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&lt;br /&gt;
	renderOverkill()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&lt;br /&gt;
	--OVERKILL&lt;br /&gt;
	preprocessSingleArg('overkill')&lt;br /&gt;
	preprocessSingleArg('overkillstyle')&lt;br /&gt;
	preprocessSingleArg('overkillclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=890</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=890"/>
		<updated>2020-04-07T13:37:31Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRespierce()          ----------------RESISTANCE PIERCE--------------------&lt;br /&gt;
	if not args.respierce then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.respiercelabelclass)&lt;br /&gt;
                    :cssText(args.respiercelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Res Pierce :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.respierceclass)&lt;br /&gt;
            :cssText(args.respiercestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.respierce, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot;%&amp;quot;)&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&lt;br /&gt;
	renderRespierce()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&lt;br /&gt;
	--RESISTANCE PIERCE&lt;br /&gt;
	preprocessSingleArg('respierce')&lt;br /&gt;
	preprocessSingleArg('respiercestyle')&lt;br /&gt;
	preprocessSingleArg('respierceclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=889</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=889"/>
		<updated>2020-04-07T13:32:48Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMovespeed()          ----------------MOVEMENT SPEED--------------------&lt;br /&gt;
	if not args.movespeed then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.movespeedlabelclass)&lt;br /&gt;
                    :cssText(args.movespeedlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Move Speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.movespeedclass)&lt;br /&gt;
            :cssText(args.movespeedstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.movespeed, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&lt;br /&gt;
	renderMovespeed()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MOVESPEED&lt;br /&gt;
	preprocessSingleArg('movespeed')&lt;br /&gt;
	preprocessSingleArg('movespeedstyle')&lt;br /&gt;
	preprocessSingleArg('movespeedclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=888</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=888"/>
		<updated>2020-04-07T13:25:43Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMaxspread()          ----------------MAXSPREAD--------------------&lt;br /&gt;
	if not args.maxspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.maxspreadlabelclass)&lt;br /&gt;
                    :cssText(args.maxspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Max Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.maxspreadclass)&lt;br /&gt;
            :cssText(args.maxspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.maxspread, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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() --INFOBOX RENDERING--&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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&lt;br /&gt;
	renderMaxspread()&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) --PREPROCESSING LIST--&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&lt;br /&gt;
	--MAXSPREAD&lt;br /&gt;
	preprocessSingleArg('maxspread')&lt;br /&gt;
	preprocessSingleArg('maxspreadstyle')&lt;br /&gt;
	preprocessSingleArg('maxspreadclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=887</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=887"/>
		<updated>2020-04-07T13:18:06Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMinspread()          ----------------MINSPREAD--------------------&lt;br /&gt;
	if not args.minspread then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.minspreadlabelclass)&lt;br /&gt;
                    :cssText(args.minspreadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Min Spread :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.minspreadclass)&lt;br /&gt;
            :cssText(args.minspreadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.minspread, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&lt;br /&gt;
	renderMinspread()&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&lt;br /&gt;
	--MINSPREAD&lt;br /&gt;
	preprocessSingleArg('minspread')&lt;br /&gt;
	preprocessSingleArg('minspreadstyle')&lt;br /&gt;
	preprocessSingleArg('minspreadclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
	<entry>
		<id>https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=886</id>
		<title>Module:Weapon Infobox</title>
		<link rel="alternate" type="text/html" href="https://sunrust.org/wiki/index.php?title=Module:Weapon_Infobox&amp;diff=886"/>
		<updated>2020-04-07T13:07:59Z</updated>

		<summary type="html">&lt;p&gt;Engie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Gun 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 renderGun()              --------------- GUN NAME -------------------&lt;br /&gt;
    if not args.gun then return end&lt;br /&gt;
&lt;br /&gt;
    root&lt;br /&gt;
        :tag('caption')&lt;br /&gt;
            :addClass(args.gunclass)&lt;br /&gt;
            :cssText(&amp;quot;background:#cfc;&amp;quot;)&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTier()			------------------ TIER -----------------------&lt;br /&gt;
    if not args.tier 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.tierclass)&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.tierstyle)&lt;br /&gt;
				:wikitext(&amp;quot;Tier &amp;quot;)&lt;br /&gt;
                :wikitext(fixChildBoxes(args.tier,'th'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderCost()          ---------------- COST --------------------&lt;br /&gt;
	if not args.cost then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.costlabelclass)&lt;br /&gt;
                    :cssText(args.costlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Cost :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local costCell = row:tag('td')&lt;br /&gt;
        costCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.costclass)&lt;br /&gt;
            :cssText(args.coststyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.cost, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; points&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDamage()          ---------------- DAMAGE --------------------&lt;br /&gt;
	if not args.damage then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.damagelabelclass)&lt;br /&gt;
                    :cssText(args.damagelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Damage :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.damageclass)&lt;br /&gt;
            :cssText(args.damagestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.damage, 'td'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderReload()          ---------------- RELOAD --------------------&lt;br /&gt;
	if not args.reload then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.reloadlabelclass)&lt;br /&gt;
                    :cssText(args.reloadlabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Reload speed :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.reloadclass)&lt;br /&gt;
            :cssText(args.reloadstyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.reload, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderDelay()          ----------------ATTACK DELAY --------------------&lt;br /&gt;
	if not args.delay then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.delaylabelclass)&lt;br /&gt;
                    :cssText(args.delaylabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Attack delay :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.delayclass)&lt;br /&gt;
            :cssText(args.delaystyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.delay, 'td'))&lt;br /&gt;
			:wikitext(&amp;quot; s&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderClipsize()          ----------------CLIP SIZE--------------------&lt;br /&gt;
	if not args.clipsize then return end&lt;br /&gt;
	&lt;br /&gt;
   local row = root:tag('tr')&lt;br /&gt;
            row&lt;br /&gt;
                :tag('th')&lt;br /&gt;
                    :attr('scope', 'row')&lt;br /&gt;
                    :cssText(args.clipsizelabelclass)&lt;br /&gt;
                    :cssText(args.clipsizelabelstyle)&lt;br /&gt;
                    :wikitext(&amp;quot;Clip size :&amp;quot;)&lt;br /&gt;
                    :done()&lt;br /&gt;
        &lt;br /&gt;
        local dataCell = row:tag('td')&lt;br /&gt;
        dataCell&lt;br /&gt;
			:attr('colspan', 2)&lt;br /&gt;
            :css('text-align', 'center')&lt;br /&gt;
            :addClass(args.clipsizeclass)&lt;br /&gt;
            :cssText(args.clipsizestyle)&lt;br /&gt;
            :wikitext(fixChildBoxes(args.clipsize, 'td'))&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.gun then&lt;br /&gt;
            	root:wikitext('[[Category:Pages which use embedded gunInfobox 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 gunInfobox 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;
        renderGun()&lt;br /&gt;
        renderTier()&lt;br /&gt;
    else&lt;br /&gt;
        root = mw.html.create()&lt;br /&gt;
        &lt;br /&gt;
        root&lt;br /&gt;
            :wikitext(args.gun)&lt;br /&gt;
    end&lt;br /&gt;
	renderCost()&lt;br /&gt;
	renderDamage()&lt;br /&gt;
	renderReload()&lt;br /&gt;
	renderDelay()&lt;br /&gt;
	renderClipsize()&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;
	&lt;br /&gt;
	--GUN&lt;br /&gt;
    preprocessSingleArg('gun')&lt;br /&gt;
    preprocessSingleArg('gunclass')&lt;br /&gt;
    preprocessSingleArg('gunstyle')&lt;br /&gt;
	&lt;br /&gt;
	--TIER&lt;br /&gt;
    preprocessSingleArg('tier')&lt;br /&gt;
    preprocessSingleArg('tierclass')&lt;br /&gt;
    preprocessSingleArg('tierstyle')&lt;br /&gt;
	&lt;br /&gt;
	--COST&lt;br /&gt;
	preprocessSingleArg('cost')&lt;br /&gt;
	preprocessSingleArg('costclass')&lt;br /&gt;
	preprocessSingleArg('coststyle')&lt;br /&gt;
	&lt;br /&gt;
	--DAMAGE&lt;br /&gt;
	preprocessSingleArg('damage')&lt;br /&gt;
	preprocessSingleArg('damagestyle')&lt;br /&gt;
	preprocessSingleArg('damageclass')&lt;br /&gt;
	&lt;br /&gt;
	--RELOAD&lt;br /&gt;
	preprocessSingleArg('reload')&lt;br /&gt;
	preprocessSingleArg('reloadstyle')&lt;br /&gt;
	preprocessSingleArg('reloadclass')&lt;br /&gt;
	&lt;br /&gt;
	--ATTACK DELAY&lt;br /&gt;
	preprocessSingleArg('delay')&lt;br /&gt;
	preprocessSingleArg('delaystyle')&lt;br /&gt;
	preprocessSingleArg('delayclass')&lt;br /&gt;
	&lt;br /&gt;
	--CLIP SIZE&lt;br /&gt;
	preprocessSingleArg('clipsize')&lt;br /&gt;
	preprocessSingleArg('clipsizestyle')&lt;br /&gt;
	preprocessSingleArg('clipsizeclass')&lt;br /&gt;
	&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>Engie</name></author>
	</entry>
</feed>