<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATradeTable</id>
	<title>Module:TradeTable - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ATradeTable"/>
	<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:TradeTable&amp;action=history"/>
	<updated>2026-09-27T04:51:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=Module:TradeTable&amp;diff=13238&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:TradeTable&amp;diff=13238&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:55, 25 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key tensura:diff:1.41:old-5421:rev-13238 --&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=Module:TradeTable&amp;diff=5421&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:TradeTable&amp;diff=5421&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local namespace = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local sprite = require(&amp;#039;Module:SpriteFile&amp;#039;)&lt;br /&gt;
local rowspans = {} -- Count of rowspans for each level&lt;br /&gt;
local rowspans_slot = {} -- count of rowspans for each slot&lt;br /&gt;
local outside_html -- html outside of table&lt;br /&gt;
local html -- html table&lt;br /&gt;
local lastLevel = &amp;#039;&amp;#039;&lt;br /&gt;
local lastSlot&lt;br /&gt;
local show_java&lt;br /&gt;
local show_mult_and_xp&lt;br /&gt;
local profession = {&amp;#039;Armorer&amp;#039;, &amp;#039;Butcher&amp;#039;, &amp;#039;Battlewill Trainer&amp;#039;, &amp;#039;Cartographer&amp;#039;, &amp;#039;Cleric&amp;#039;, &amp;#039;Farmer&amp;#039;, &amp;#039;Fisherman&amp;#039;, &amp;#039;Fletcher&amp;#039;, &amp;#039;Leatherworker&amp;#039;, &amp;#039;Librarian&amp;#039;, &amp;#039;Lumberjack&amp;#039;, &amp;#039;Magic Trainer&amp;#039;, &amp;#039;Mason&amp;#039;, &amp;#039;Merchant&amp;#039;, &amp;#039;Miner&amp;#039;, &amp;#039;Shepherd&amp;#039;, &amp;#039;Toolsmith&amp;#039;, &amp;#039;Weaponsmith&amp;#039;}&lt;br /&gt;
local refUsed = false&lt;br /&gt;
local level_trades = {} -- How many different trades are available in the pool per level&lt;br /&gt;
local given_note_list = {} -- A table of note names -&amp;gt; note text&lt;br /&gt;
local wanted_note_list = {} -- A table of note names -&amp;gt; note text&lt;br /&gt;
&lt;br /&gt;
local colors = {&amp;#039;White&amp;#039;, &amp;#039;Light Gray&amp;#039;, &amp;#039;Gray&amp;#039;, &amp;#039;Black&amp;#039;, &amp;#039;Brown&amp;#039;, &amp;#039;Red&amp;#039;, &amp;#039;Orange&amp;#039;, &amp;#039;Yellow&amp;#039;, &amp;#039;Lime&amp;#039;, &amp;#039;Green&amp;#039;, &amp;#039;Cyan&amp;#039;, &amp;#039;Light Blue&amp;#039;, &amp;#039;Blue&amp;#039;, &amp;#039;Purple&amp;#039;, &amp;#039;Magenta&amp;#039;, &amp;#039;Pink&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
-- Maps alternate input param names to a standardized name&lt;br /&gt;
local function normalizeInput(line)&lt;br /&gt;
	return {&lt;br /&gt;
		level = line[&amp;quot;level&amp;quot;] or line[&amp;quot;lvl&amp;quot;],&lt;br /&gt;
		trade_slot = line[&amp;quot;slot&amp;quot;] or &amp;#039;—&amp;#039;,&lt;br /&gt;
		slot_draws = line[&amp;quot;slotDraws&amp;quot;] or &amp;#039;-&amp;#039;,&lt;br /&gt;
		wanted_item = line[&amp;quot;want&amp;quot;] or line[&amp;quot;want1&amp;quot;] or &amp;#039;Emerald&amp;#039;,&lt;br /&gt;
		wanted_quant = line[&amp;quot;wantQuant&amp;quot;] or line[&amp;quot;wantQuant1&amp;quot;] or &amp;#039;1&amp;#039;,&lt;br /&gt;
		wanted_sprite = line[&amp;quot;wantSprite&amp;quot;] or line[&amp;quot;wantSprite1&amp;quot;],&lt;br /&gt;
		wanted_item_2 = line[&amp;quot;want2&amp;quot;],&lt;br /&gt;
		wanted_sprite_2 = line[&amp;quot;wantSprite2&amp;quot;],&lt;br /&gt;
		wanted_quant_2 = line[&amp;quot;wantQuant2&amp;quot;] or &amp;#039;1&amp;#039;,&lt;br /&gt;
		wanted_note = line[&amp;quot;wantNote&amp;quot;],&lt;br /&gt;
		wanted_note_text = line[&amp;quot;wantNoteText&amp;quot;],&lt;br /&gt;
		price_multiplier = line[&amp;quot;multi&amp;quot;],&lt;br /&gt;
		given_item = line[&amp;quot;give&amp;quot;] or &amp;#039;Emerald&amp;#039;,&lt;br /&gt;
		given_sprite = line[&amp;quot;giveSprite&amp;quot;],&lt;br /&gt;
		given_quant = line[&amp;quot;giveQuant&amp;quot;] or &amp;#039;1&amp;#039;,&lt;br /&gt;
		given_note = line[&amp;quot;giveNote&amp;quot;],&lt;br /&gt;
		given_note_text = line[&amp;quot;giveNoteText&amp;quot;],&lt;br /&gt;
		max_trades = line[&amp;quot;maxTrades&amp;quot;],&lt;br /&gt;
		villager_xp_gain = line[&amp;quot;xpGain&amp;quot;],&lt;br /&gt;
		weight = line[&amp;quot;weight&amp;quot;] or 1,&lt;br /&gt;
		override_probability_je = line[&amp;#039;overrideProbability&amp;#039;] or line[&amp;#039;overrideProbabilityJE&amp;#039;] or nil,&lt;br /&gt;
		override_probability_be = line[&amp;#039;overrideProbability&amp;#039;] or line[&amp;#039;overrideProbabilityBE&amp;#039;] or nil&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Takes all args and puts them into a json string&lt;br /&gt;
function p.serialize(frame)&lt;br /&gt;
	return mw.text.jsonEncode(frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Undo the serialization for parsing&lt;br /&gt;
local function deserialize(args)&lt;br /&gt;
	local e&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &amp;quot;number&amp;quot; then -- only deserialize unnamed params&lt;br /&gt;
			e, out[k] = pcall( mw.text.jsonDecode, v )&lt;br /&gt;
			if not e then&lt;br /&gt;
				out[k] = { &amp;#039;&amp;#039;, &amp;#039;unknown&amp;#039;, v..&amp;#039; &amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Lua error: &amp;#039;..out[k].. &amp;#039; Input:&amp;#039;.. v ..&amp;#039;&amp;lt;/strong&amp;gt;&amp;#039; }&lt;br /&gt;
			else&lt;br /&gt;
				out[k] = normalizeInput(out[k])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function printHeader(headerText)&lt;br /&gt;
	outside_html = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	html = outside_html:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
		:cssText(&amp;#039;text-align:center&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local colspan = 6&lt;br /&gt;
	if show_java then&lt;br /&gt;
		colspan = colspan + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if headerText ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		html:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, colspan)&lt;br /&gt;
			:attr(&amp;#039;data-description&amp;#039;, headerText)&lt;br /&gt;
			:wikitext(sprite.link({profession, name=&amp;#039;EntitySprite&amp;#039;, headerText}))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tr = html:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Level&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
	&lt;br /&gt;
	if show_java then&lt;br /&gt;
		tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;quot;&amp;#039;&amp;#039;[[Java Edition]]&amp;#039;&amp;#039;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Villager wants&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Player receives&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Trades in&amp;lt;br&amp;gt;stock&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
	&lt;br /&gt;
	if show_mult_and_xp then&lt;br /&gt;
		tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Villager&amp;lt;br&amp;gt;experience&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Price&amp;lt;br&amp;gt;multiplier&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	tr = tr:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	if show_java then&lt;br /&gt;
		tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Probability&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatItemOutput(item, quant, item2, quant2, _sprite, _sprite2)&lt;br /&gt;
	local text, qtyText = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local item_display_text = item:gsub(&amp;#039; %(item%)&amp;#039;,&amp;#039;&amp;#039;):gsub(&amp;#039;Any color&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	_sprite = _sprite or item&lt;br /&gt;
	if quant ~= &amp;#039;1&amp;#039; then&lt;br /&gt;
		quant = quant:gsub(&amp;#039;-&amp;#039;, &amp;#039;&amp;amp;ndash;&amp;#039;)&lt;br /&gt;
		qtyText = quant..&amp;#039; × &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if item:find(&amp;#039;Enchanted&amp;#039;) then&lt;br /&gt;
		text = text..qtyText..&amp;#039;[[File:&amp;#039;.._sprite..&amp;#039; (item).gif|16x16px|link=&amp;#039;..item..&amp;#039;]] [[&amp;#039;..item..&amp;#039;]]&amp;#039;&lt;br /&gt;
	elseif item:find(&amp;#039;Any color&amp;#039;) then&lt;br /&gt;
		-- Show all color sprites&lt;br /&gt;
		local base_item = _sprite:gsub(&amp;#039;Any color&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		for i, color in pairs(colors) do&lt;br /&gt;
			text = text..sprite.link({text=&amp;#039;&amp;#039;,id=color..&amp;#039; &amp;#039;..base_item,name=&amp;#039;InvSprite&amp;#039;,keepcase=1})&lt;br /&gt;
			if i == 8 then&lt;br /&gt;
				text = text..&amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		text = text..&amp;#039;&amp;lt;br&amp;gt;&amp;#039;..qtyText..&amp;#039;[[&amp;#039;..item_display_text..&amp;#039;|&amp;#039;..item..&amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		text = text..qtyText..sprite.link({text=item_display_text,id=_sprite,link=item,name=&amp;quot;InvSprite&amp;quot;, keepcase=1})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if quant2 and item2 then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;br&amp;gt;+ &amp;#039; .. p.formatItemOutput(item2, quant2, nil, nil, _sprite2)&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- from WP&lt;br /&gt;
local function choose(n, k)&lt;br /&gt;
	if k &amp;lt; 0 or k &amp;gt; n then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	if k == 0 or k == n then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
	k = math.min(k, n-k) -- symmetry&lt;br /&gt;
	local c = 1&lt;br /&gt;
	for i = 0, k-1 do&lt;br /&gt;
		c = c * (n-i) / (k - i)&lt;br /&gt;
	end&lt;br /&gt;
	return c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatProbability(line, use_slot)&lt;br /&gt;
	local weight = line.weight&lt;br /&gt;
	local group_weight = level_trades[line.level]&lt;br /&gt;
	local draws = 2&lt;br /&gt;
	&lt;br /&gt;
	if group_weight - weight == 0 then&lt;br /&gt;
		return 100&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local probability = (1 - choose(group_weight - weight, draws) / choose(group_weight, draws)) * 100&lt;br /&gt;
	return math.floor(probability+0.5)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function printLine(line)&lt;br /&gt;
	local tr = html:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	local cssText = &amp;#039;&amp;#039;&lt;br /&gt;
	if line.level ~= lastLevel then&lt;br /&gt;
		-- Don&amp;#039;t do thick border for first level&lt;br /&gt;
		if lastLevel ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			cssText = &amp;#039;border-top-width:2px&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	lastLevel = line.level&lt;br /&gt;
	&lt;br /&gt;
	if show_java then&lt;br /&gt;
		local java_probability = formatProbability(line, false) .. &amp;#039;%&amp;#039;&lt;br /&gt;
		tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(line.override_probability_je or java_probability) -- Java probability&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	local wanted = tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(p.formatItemOutput(line.wanted_item, line.wanted_quant, line.wanted_item_2, line.wanted_quant_2, line.wanted_sprite, line.wanted_sprite_2))&lt;br /&gt;
	if line.wanted_note_text ~= nil or line.wanted_note ~= nil then&lt;br /&gt;
		wanted:wikitext(mw.getCurrentFrame():extensionTag{ name=&amp;#039;ref&amp;#039;, content=line.wanted_note_text, args = {name=line.wanted_note, group=&amp;#039;t&amp;#039;}})&lt;br /&gt;
		refUsed = true -- Used to set references at footer&lt;br /&gt;
	end&lt;br /&gt;
	local given = tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(p.formatItemOutput(line.given_item, line.given_quant, nil, nil, line.given_sprite)):wikitext()&lt;br /&gt;
	if line.given_note_text ~= nil or line.given_note ~= nil then&lt;br /&gt;
		given:wikitext(mw.getCurrentFrame():extensionTag{ name=&amp;#039;ref&amp;#039;, content=line.given_note_text, args = {name=line.given_note, group=&amp;#039;t&amp;#039;}})&lt;br /&gt;
		refUsed = true -- Used to set references at footer&lt;br /&gt;
	end&lt;br /&gt;
	tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(line.max_trades)&lt;br /&gt;
	&lt;br /&gt;
	if show_mult_and_xp then&lt;br /&gt;
		tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(line.villager_xp_gain or &amp;#039;—&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		local price_multiplier_text = line.price_multiplier&lt;br /&gt;
		&lt;br /&gt;
		tr:tag(&amp;#039;td&amp;#039;):cssText(cssText):wikitext(price_multiplier_text or &amp;#039;—&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function storeLine(line)&lt;br /&gt;
	-- Put data into Bucket&lt;br /&gt;
	-- The only top level params that are needed is stuff that would be used as selectors&lt;br /&gt;
	-- everything else is put into a json blob for flexibility&lt;br /&gt;
	if not (namespace == &amp;#039;&amp;#039; or namespace == &amp;#039;Minecraft_Wiki&amp;#039;) then&lt;br /&gt;
		 return -- only store data if we are in main or Minecraft_Wiki namespaces&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local bucket_json = {&lt;br /&gt;
		[&amp;#039;profession&amp;#039;] = profession,&lt;br /&gt;
		[&amp;#039;level&amp;#039;] = line.level,&lt;br /&gt;
		[&amp;#039;java_probability&amp;#039;] = line.override_probability_je or formatProbability(line, false) .. &amp;#039;%&amp;#039;,&lt;br /&gt;
		[&amp;#039;given_item&amp;#039;] = line.given_item,&lt;br /&gt;
		[&amp;#039;given_quant&amp;#039;] = line.given_quant,&lt;br /&gt;
		[&amp;#039;given_sprite&amp;#039;] = line.given_sprite,&lt;br /&gt;
		[&amp;#039;wanted_item&amp;#039;] = line.wanted_item,&lt;br /&gt;
		[&amp;#039;wanted_quant&amp;#039;] = line.wanted_quant,&lt;br /&gt;
		[&amp;#039;wanted_sprite&amp;#039;] = line.wanted_sprite,&lt;br /&gt;
		[&amp;#039;wanted_item_2&amp;#039;] = line.wanted_item_2,&lt;br /&gt;
		[&amp;#039;wanted_quant_2&amp;#039;] = line.wanted_quant_2,&lt;br /&gt;
		[&amp;#039;wanted_sprite_2&amp;#039;] = line.wanted_sprite_2,&lt;br /&gt;
		[&amp;#039;given_note&amp;#039;] = line.given_note,&lt;br /&gt;
		[&amp;#039;given_note_text&amp;#039;] = given_note_list[line.given_note] or line.given_note_text,&lt;br /&gt;
		[&amp;#039;wanted_note&amp;#039;] = line.wanted_note,&lt;br /&gt;
		[&amp;#039;wanted_note_text&amp;#039;] = wanted_note_list[line.wanted_note] or line.wanted_note_text,&lt;br /&gt;
		[&amp;#039;price_multiplier&amp;#039;] = line.price_multiplier,&lt;br /&gt;
		[&amp;#039;max_trades&amp;#039;] = line.max_trades,&lt;br /&gt;
		[&amp;#039;villager_xp_gain&amp;#039;] = line.villager_xp_gain&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local bucket_data = { -- the actual bucket data&lt;br /&gt;
		[&amp;#039;profession&amp;#039;] = profession,&lt;br /&gt;
		[&amp;#039;given_item&amp;#039;] = line.given_item,&lt;br /&gt;
		[&amp;#039;wanted_item&amp;#039;] = {line.wanted_item, line.wanted_item_2},&lt;br /&gt;
		[&amp;#039;json&amp;#039;] = mw.text.jsonEncode(bucket_json)&lt;br /&gt;
	}&lt;br /&gt;
	bucket(&amp;#039;trade&amp;#039;).sub(line.level).put(bucket_data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p._main(frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local headerText = args.title or &amp;#039;&amp;#039;&lt;br /&gt;
	local ignoreUsage = args.ignoreUsage or nil&lt;br /&gt;
	local lines = deserialize(args)&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	local edition = args.edition &lt;br /&gt;
	show_java = (edition == nil or edition == &amp;#039;&amp;#039; or edition == &amp;#039;both&amp;#039; or edition == &amp;#039;java&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- First loop counts the rowspans for column 1&lt;br /&gt;
	for i,line in ipairs(lines) do&lt;br /&gt;
		level_trades[line.level] = (level_trades[line.level] or 0) + line.weight&lt;br /&gt;
		rowspans[line.level] = (rowspans[line.level] or 0) + 1&lt;br /&gt;
		rowspans_slot[line.trade_slot] = (rowspans_slot[line.trade_slot] or 0) + 1&lt;br /&gt;
		slot_trades[line.trade_slot] = (slot_trades[line.trade_slot] or 0) + line.weight&lt;br /&gt;
		&lt;br /&gt;
		--Save the note text so it can be used by Bucket to display the notes on other pages&lt;br /&gt;
		if line.given_note and line.given_note_text and given_note_list[line.given_note] == nil then&lt;br /&gt;
			given_note_list[line.given_note] = line.given_note_text&lt;br /&gt;
		end&lt;br /&gt;
		if line.wanted_note and line.wanted_note_text and wanted_note_list[line.wanted_note] == nil then&lt;br /&gt;
			wanted_note_list[line.wanted_note] = line.wanted_note_text&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	profession = args.profession or headerText&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	rowspans_slot[&amp;#039;—&amp;#039;] = 1 -- Special case missing slot to not combine&lt;br /&gt;
	&lt;br /&gt;
	for i, line in ipairs(lines) do&lt;br /&gt;
		printLine(line)&lt;br /&gt;
		if not ignoreUsage then&lt;br /&gt;
			storeLine(line)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if refUsed then&lt;br /&gt;
		outside_html:wikitext(mw.getCurrentFrame():extensionTag{ name=&amp;#039;references&amp;#039;, args = {group=&amp;#039;t&amp;#039;}})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return outside_html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
</feed>