Module:la-verb: difference between revisions

From Wiktionary, the free dictionary
Jump to navigation Jump to search
Content deleted Content added
no "Appendix:Latin/" pages anymore
fix impersonal passive of pereo (itum est → peritum est)
Line 75: Line 75:
if data.forms["perf_pasv_ptc"] and data.forms["perf_pasv_ptc"] ~= "—" then
if data.forms["perf_pasv_ptc"] and data.forms["perf_pasv_ptc"] ~= "—" then
if typeinfo.subtype == "pass-impers" then
if typeinfo.subtype == "pass-impers" then
local nns_ppp = "[[" .. typeinfo.supine_stem .. "um]]"
local nns_ppp = "[[" .. (typeinfo.prefix or "") .. typeinfo.supine_stem .. "um]]"
data.forms["3s_perf_pasv_indc"] = nns_ppp .. " [[est]]"
data.forms["3s_perf_pasv_indc"] = nns_ppp .. " [[est]]"
data.forms["3s_futp_pasv_indc"] = nns_ppp .. " [[erit]]"
data.forms["3s_futp_pasv_indc"] = nns_ppp .. " [[erit]]"

Revision as of 20:10, 26 April 2018

This module is used for the various Latin verb inflection tables.


local m_utilities = require("Module:utilities")
local make_link = require("Module:links").full_link

local export = {}

local lang = require("Module:languages").getByCode("la")

local title = mw.title.getCurrentTitle()
local NAMESPACE = title.nsText
local PAGENAME = title.text

-- Conjugations are the functions that do the actual
-- conjugating by creating the forms of a basic verb.
-- They are defined further down.
local conjugations = {}

-- Check if this verb is reconstructed
-- i.e. the pagename is Reconstruction:Latin/...
local reconstructed = NAMESPACE == "Reconstruction" and PAGENAME:find("^Latin/")

local function if_not_empty(val)
	if val == "" then
		return nil
	else
		return val
	end
end

-- The main entry point.
-- This is the only function that can be invoked from a template.

function export.show(frame)
	local data, domain = make_data(frame), frame:getParent().args['search']
	if domain == nil then
		return make_table(data) .. m_utilities.format_categories(data.categories, lang)
	else 
		local verb = data['forms']['1s_pres_actv_indc'] ~= nil and ('[['..mw.ustring.gsub(mw.ustring.toNFD(data['forms']['1s_pres_actv_indc']),'[^%w]+',"")..'|'..data['forms']['1s_pres_actv_indc'].. ']]') or 'verb'
		return link_google_books(verb, flatten_values(data['forms']), domain) end
end


function make_data(frame)
	local conj_type = frame.args[1] or error("Conjugation type has not been specified. Please pass parameter 1 to the module invocation")
	local args = frame:getParent().args
	local subtype = frame.args["type"] or args["type"]; if subtype == nil then subtype = '' end
	local sync_perf = args["sync_perf"]; if sync_perf == nil then sync_perf = '' end
	local p3inf = args["p3inf"]; if p3inf == nil then p3inf = '' end
	
	if not conjugations[conj_type] then
		error("Unknown conjugation type '" .. conj_type .. "'")
	end
	
	local data = {forms = {}, title = {}, categories = {}, form_footnote_indices = {}, footnotes = {}}  --note: the addition of red superscripted footnotes ('<sup style="color: red">' ... </sup>) is only implemented for the three form printing loops in which it is used
	local typeinfo = {conj_type = conj_type, subtype = subtype, sync_perf = sync_perf, p3inf = p3inf}
	
	-- Generate the verb forms
	conjugations[conj_type](args, data, typeinfo)
	
	-- Override with user-set forms
	override(data, args)
	
	-- Post-process the forms
	postprocess(data, typeinfo)
	
	-- Check if the links to the verb forms exist
	checkexist(data)
	
	-- Check if the verb is irregular
	if not conj_type == 'irreg' then checkirregular(args, data) end
	return data
end

function postprocess(data, typeinfo)
	-- Add information for the passive perfective forms
	if data.forms["perf_pasv_ptc"] and data.forms["perf_pasv_ptc"] ~= "&mdash;" then
		if typeinfo.subtype == "pass-impers" then
			local nns_ppp = "[[" .. (typeinfo.prefix or "") .. typeinfo.supine_stem .. "um]]"
			data.forms["3s_perf_pasv_indc"] = nns_ppp .. " [[est]]"
			data.forms["3s_futp_pasv_indc"] = nns_ppp .. " [[erit]]"
			data.forms["3s_plup_pasv_indc"] = nns_ppp .. " [[erat]]"
			data.forms["3s_perf_pasv_subj"] = nns_ppp .. " [[sit]]"
			data.forms["3s_plup_pasv_subj"] = nns_ppp .. " [[esset]], [[foret]]"
			data.forms["perf_pasv_inf"] = nns_ppp .. " [[esse]]"
			data.forms["perf_pasv_ptc"] = nns_ppp
		elseif typeinfo.subtype == "pass-3only" then
			local nns_ppp_s = "[[" .. typeinfo.supine_stem .. "us]]"
			local nns_ppp_p = "[[" .. typeinfo.supine_stem .. "ī]]"
			data.forms["3s_perf_pasv_indc"] = nns_ppp_s .. " [[est]]"
			data.forms["3p_perf_pasv_indc"] = nns_ppp_p .. " [[sunt]]"
			data.forms["3s_futp_pasv_indc"] = nns_ppp_s .. " [[erit]]"
			data.forms["3p_futp_pasv_indc"] = nns_ppp_p .. " [[erunt]]"
			data.forms["3s_plup_pasv_indc"] = nns_ppp_s .. " [[erat]]"
			data.forms["3p_plup_pasv_indc"] = nns_ppp_p .. " [[erant]]"
			data.forms["3s_perf_pasv_subj"] = nns_ppp_s .. " [[sit]]"
			data.forms["3p_perf_pasv_subj"] = nns_ppp_p .. " [[sint]]"
			data.forms["3s_plup_pasv_subj"] = nns_ppp_s .. " [[esset]], [[foret]]"
			data.forms["3p_plup_pasv_subj"] = nns_ppp_p .. " [[essent]], [[forent]]"
		else
			local ppplink = make_link({lang = lang, term = data.forms["perf_pasv_ptc"]}, "term")
			local sumlink = make_link({lang = lang, term = "sum"}, "term")
			
			data.forms["perf_pasv_indc"] = ppplink .. " + present active indicative of " .. sumlink
			data.forms["futp_pasv_indc"] = ppplink .. " + future active indicative of " .. sumlink
			data.forms["plup_pasv_indc"] = ppplink .. " + imperfect active indicative of " .. sumlink
			data.forms["perf_pasv_subj"] = ppplink .. " + present active subjunctive of " .. sumlink
			data.forms["plup_pasv_subj"] = ppplink .. " + imperfect active subjunctive of " .. sumlink
		end
	end
	
	-- Types of irregularity related primarily to the active.
	-- These could in theory be combined with those related to the passive and imperative,
	-- i.e. there's no reason there couldn't be an impersonal deponent verb with no imperatives.
	if typeinfo.subtype == "impers" then
		-- Impersonal verbs have only third-person singular forms.
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.categories, "Latin impersonal verbs")
		
		-- Remove all non-3sg forms
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") or key:find("^3p") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "impers-nopass" then
		-- Impersonal verbs have only third-person singular forms.
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.title, "active only")
		table.insert(data.categories, "Latin impersonal verbs")
		table.insert(data.categories, "Latin active-only verbs")
		
		-- Remove all non-3sg and passive forms
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") or key:find("^3p") or key:find("pasv") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "impers-depon" then
		-- Impersonal verbs have only third-person singular forms.
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.title, "[[deponent]]")
		table.insert(data.categories, "Latin impersonal verbs")
		table.insert(data.categories, "Latin deponent verbs")
		
		-- Remove all non-3sg and active forms and future passive infinitive
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") or key:find("^3p") or key:find("actv") and key ~= "pres_actv_ptc" and key ~= "futr_actv_ptc" or key == "futr_pasv_inf" then
				data.forms[key] = nil
			end
		end
		
		-- Change passive to active
		for key, form in pairs(data.forms) do
			if key:find("pasv") and key ~= "pres_pasv_ptc" and key ~= "futr_pasv_ptc" then
				data.forms[key:gsub("pasv", "actv")] = form
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "3only" then
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.categories, "Latin impersonal verbs")
		
		-- Remove all non-3sg forms
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "3only-nopass" then
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.title, "active only")
		table.insert(data.categories, "Latin impersonal verbs")
		table.insert(data.categories, "Latin active-only verbs")
		
		-- Remove all non-3sg and passive forms
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") or key:find("pasv") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "3only-depon" then
		table.insert(data.title, "[[impersonal]]")
		table.insert(data.title, "[[deponent]]")
		table.insert(data.categories, "Latin impersonal verbs")
		table.insert(data.categories, "Latin deponent verbs")
		
		-- Remove all non-3sg and active forms and future passive infinitive
		for key, _ in pairs(data.forms) do
			if key:find("^[12][sp]") or key:find("actv") and key ~= "pres_actv_ptc" and key ~= "futr_actv_ptc" or key == "futr_pasv_inf" then
				data.forms[key] = nil
			end
		end
		
		-- Change passive to active
		for key, form in pairs(data.forms) do
			if key:find("pasv") and key ~= "pres_pasv_ptc" and key ~= "futr_pasv_ptc" then
				data.forms[key:gsub("pasv", "actv")] = form
				data.forms[key] = nil
			end
		end
	end
	
	-- Handle certain irregularities in the passive
	if typeinfo.subtype == "depon" then
		-- Deponent verbs use passive forms with active meaning
		table.insert(data.title, "[[deponent]]")
		table.insert(data.categories, "Latin deponent verbs")
		
		-- Remove active forms and future passive infinitive
		for key, _ in pairs(data.forms) do
			if key:find("actv") and key ~= "pres_actv_ptc" and key ~= "futr_actv_ptc" and key ~= "futr_actv_inf" or key == "futr_pasv_inf" then
				data.forms[key] = nil
			end
		end
		
		-- Change passive to active
		for key, form in pairs(data.forms) do
			if key:find("pasv") and key ~= "pres_pasv_ptc" and key ~= "futr_pasv_ptc" and key ~= "futr_pasv_inf" then
				data.forms[key:gsub("pasv", "actv")] = form
				data.forms[key] = nil
			end
		end
	
		-- Generate correct form of infinitive for nominative gerund
		data.forms["ger_nom"] = data.forms["pres_actv_inf"]
		
	elseif typeinfo.subtype == "semi-depon" then
		-- Semi-deponent verbs use perfective passive forms with active meaning,
		-- and have no imperfective passive
		table.insert(data.title, "[[semi-deponent]]")
		table.insert(data.categories, "Latin semi-deponent verbs")
		
		-- Remove perfective active and imperfective passive forms
		for key, _ in pairs(data.forms) do
			if key:find("perf_actv") or key:find("plup_actv") or key:find("futp_actv") or key:find("pres_pasv") or key:find("impf_pasv") or key:find("futr_pasv") then
				data.forms[key] = nil
			end
		end
		
		-- Change perfective passive to active
		for key, form in pairs(data.forms) do
			if key:find("perf_pasv") or key:find("plup_pasv") or key:find("futp_pasv") then
				data.forms[key:gsub("pasv", "actv")] = form
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "depon-noperf" then --(e.g. calvor, -ī)
		table.insert(data.title, "[[deponent]]")
		table.insert(data.categories, "Latin deponent verbs")
		table.insert(data.title, "[[defective verb|defective]]")
		table.insert(data.categories, "Latin defective verbs")
		
		-- Remove active forms and future passive infinitive
		for key, _ in pairs(data.forms) do
			if key:find("actv") and key ~= "pres_actv_ptc" and key ~= "futr_actv_ptc" and key ~= "futr_actv_inf" or key == "futr_pasv_inf" then
				data.forms[key] = nil
			end
		end
		
		-- Change passive to active
		for key, form in pairs(data.forms) do
			if key:find("pasv") and key ~= "pres_pasv_ptc" and key ~= "futr_pasv_ptc" and key ~= "futr_pasv_inf" then
				data.forms[key:gsub("pasv", "actv")] = form
				data.forms[key] = nil
			end
		end
		
		-- Remove all perfect forms
		for key, _ in pairs(data.forms) do
			if key:find("perf") or key:find("plup") or key:find("futp") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "noperf" then
		-- Some verbs have no perfect forms (e.g. inalbēscō, -ěre)
		table.insert(data.title, "[[defective verb|defective]]")
		table.insert(data.categories, "Latin defective verbs")

		-- Remove all perfect forms
		for key, _ in pairs(data.forms) do
			if key:find("perf") or key:find("plup") or key:find("futp") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "no-actv-perf" then
		-- Some verbs have no active perfect forms (e.g. interstinguō, -ěre)
		table.insert(data.title, "no active perfect forms")
		table.insert(data.categories, "Latin defective verbs")
		
		-- Remove all active perfect forms
		for key, _ in pairs(data.forms) do
			if key:find("actv") and (key:find("perf") or key:find("plup") or key:find("futp")) then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "no-pasv-perf" then
		-- Some verbs have no passive perfect forms (e.g. ārēscō, -ěre)
		table.insert(data.title, "no passive perfect forms")
		table.insert(data.categories, "Latin defective verbs")
		
		-- Remove all passive perfect forms
		for key, _ in pairs(data.forms) do
			if key:find("pasv") and (key:find("perf") or key:find("plup") or key:find("futp")) then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "nopass-noperf" then
		-- Some verbs have no passive and no perfect forms (e.g. albēscō, -ěre)
		table.insert(data.title, "[[defective verb|defective]]")
		table.insert(data.title, "active only")
		table.insert(data.categories, "Latin defective verbs")
		table.insert(data.categories, "Latin active-only verbs")
		
		-- Remove all passive and all perfect forms
		for key, _ in pairs(data.forms) do
			if key:find("pasv") or key:find("perf") or key:find("plup") or key:find("futp") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "nopass" then
		-- Some verbs have no passive forms (usually intransitive)
		table.insert(data.title, "active only")
		table.insert(data.categories, "Latin active-only verbs")
		
		-- Remove all passive forms
		for key, _ in pairs(data.forms) do
			if key:find("pasv") then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "pass-3only" then
		-- Some verbs have only third-person forms in the passive
		table.insert(data.title, "only third-person forms in passive")
		table.insert(data.categories, "Latin verbs with third-person passive")
		
		-- Remove all non-3rd-person passive forms and all passive imperatives
		for key, _ in pairs(data.forms) do
			if key:find("pasv") and (key:find("^[12][sp]") or key:find("impr")) then
				data.forms[key] = nil
			end
		end
	elseif typeinfo.subtype == "pass-impers" then
		-- Some verbs are impersonal in the passive
		table.insert(data.title, "[[impersonal]] in passive")
		table.insert(data.categories, "Latin verbs with impersonal passive")
		
		-- Remove all non-3sg passive forms
		for key, _ in pairs(data.forms) do
			if key:find("pasv") and (key:find("^[12][sp]") or key:find("^3p") or key:find("impr")) or key:find("futr_pasv_inf") then
				data.forms[key] = nil
			end
		end
		
	elseif typeinfo.subtype == "perf-as-pres" then
		-- Perfect forms as present tense
		table.insert(data.title, "active only")
		table.insert(data.title, "[[perfect]] forms as present")
		table.insert(data.title, "pluperfect as imperfect")
		table.insert(data.title, "future perfect as future")
		table.insert(data.categories, "Latin defective verbs")
		table.insert(data.categories, "Latin active-only verbs")
        table.insert(data.categories, "Latin verbs with perfect forms having imperfective meanings")
		
		-- Change perfect passive participle to perfect active participle
		data.forms["perf_actv_ptc"] = data.forms["perf_pasv_ptc"]
		
		-- Change perfect active infinitive to present active infinitive
		data.forms["pres_actv_inf"] = data.forms["perf_actv_inf"]
		
		-- Remove passive forms
		-- Remove present active, imperfect active and future active forms
		for key, _ in pairs(data.forms) do
			if key ~= "futr_actv_inf" and key ~= "futr_actv_ptc" and (key:find("pasv") or key:find("pres") and key ~= "pres_actv_inf" or key:find("impf") or key:find("futr")) then
				data.forms[key] = nil
			end
		end

		-- Change perfect forms to non-perfect forms
		for key, form in pairs(data.forms) do
			if key:find("perf") and key ~= "perf_actv_ptc" then
				data.forms[key:gsub("perf", "pres")] = form
				data.forms[key] = nil
			elseif key:find("plup") then
				data.forms[key:gsub("plup", "impf")] = form
				data.forms[key] = nil
			elseif key:find("futp") then
				data.forms[key:gsub("futp", "futr")] = form
				data.forms[key] = nil
			elseif key:find("ger") then
				data.forms[key] = nil
			end
		end
		
		data.forms["pres_actv_ptc"] = nil
	elseif typeinfo.subtype == "memini" then
		-- Perfect forms as present tense
		table.insert(data.title, "active only")
		table.insert(data.title, "[[perfect]] forms as present")
		table.insert(data.title, "pluperfect as imperfect")
		table.insert(data.title, "future perfect as future")
		table.insert(data.categories, "Latin defective verbs")
		table.insert(data.categories, "Latin verbs with perfect forms having imperfective meanings")

		-- Remove passive forms
		-- Remove present active, imperfect active and future active forms
		-- Except for future active imperatives
		for key, _ in pairs(data.forms) do
			if key:find("pasv") or key:find("pres") or key:find("impf") or key:find("futr") or key:find("ptc") or key:find("ger") then
				data.forms[key] = nil
			end
		end

		-- Change perfect forms to non-perfect forms
		for key, form in pairs(data.forms) do
			if key:find("perf") and key ~= "perf_actv_ptc" then
				data.forms[key:gsub("perf", "pres")] = form
				data.forms[key] = nil
			elseif key:find("plup") then
				data.forms[key:gsub("plup", "impf")] = form
				data.forms[key] = nil
			elseif key:find("futp") then
				data.forms[key:gsub("futp", "futr")] = form
				data.forms[key] = nil
			end
		end
		
		-- Add imperative forms
		data.forms["2s_futr_actv_impr"] = "mementō"
		data.forms["2p_futr_actv_impr"] = "mementōte"
	end

	-- Handle certain irregularities in the imperative
	if typeinfo.subtype == "noimp" then
		-- Some verbs have no imperatives
		table.insert(data.title, "no [[imperative]]s")
	end
	

	-- Add the ancient future_passive_participle of certain verbs
	if typeinfo.pres_stem == "lāb" then
		data.forms["futr_pasv_ptc"] = "lābundus"
	elseif typeinfo.pres_stem == "collāb" then
		data.forms["futr_pasv_ptc"] = "collābundus"
	elseif typeinfo.pres_stem == "illāb" then
		data.forms["futr_pasv_ptc"] = "illābundus"
	elseif typeinfo.pres_stem == "relāb" then
		data.forms["futr_pasv_ptc"] = "relābundus"
	end

	-- Add the poetic present passives infinitive forms of certain verbs
	if typeinfo.p3inf == '1' then
			local form, noteindex = "pres_"..(typeinfo.subtype=='depon' and "actv" or "pasv").."_inf", #(data.footnotes)+1
			data.forms[form] = {data.forms[form], mw.ustring.sub(data.forms[form], 1,-2).."ier" }
			data.form_footnote_indices[form] = tostring(noteindex)
			if typeinfo.subtype=='depon' then
				data.form_footnote_indices["ger_nom"] = tostring(noteindex)
				data.forms['ger_nom'] = data.forms[form]
			end
			data.footnotes[noteindex] = 'The present passive infinitive in -ier is a rare poetic form which is attested for this verb.'
	end
	
	--Add the syncopated perfect forms, omitting the separately handled fourth conjugation cases
	
	if typeinfo.sync_perf == 'poet' then
		local sss = { {'perf_actv_inf', 'sse'}, --infinitive
			    {'2s_perf_actv_indc','sti'},  {'2p_perf_actv_indc','stis'}, --unambiguous perfect actives
			    {'1s_plup_actv_subj','ssem'}, {'2s_plup_actv_subj','sses'}, {'3s_plup_actv_subj','sset'}, {'1p_plup_actv_subj','ssemus'},  {'2p_plup_actv_subj','ssetis'},  {'3p_plup_actv_subj','ssent'} } --pluperfect subjunctives
		local noteindex = #(data.footnotes)+1
		function add_sync_perf(form, suff_sync) 
			local old = data.forms[form]
			data.forms[form] = type(old) == "table" and old or {old, mw.ustring.sub(old, 1, -mw.ustring.len(suff_sync)-3)..suff_sync }
			data.form_footnote_indices[form] = noteindex end
		for _, v in pairs(sss) do
			add_sync_perf(v[1], v[2]) end
		data.footnotes[noteindex] = "At least one rare poetic syncopated perfect form is attested." end

end

--[=[
	Conjugation functions
]=]--

function get_regular_stems(args, typeinfo)
	-- Get the parameters
	if typeinfo.subtype:find("depon") then
		-- Deponent and semi-deponent verbs don't have the perfective principal part
		typeinfo.pres_stem = if_not_empty(args[1])
		typeinfo.perf_stem = nil
		typeinfo.supine_stem = if_not_empty(args[2])
	else
		typeinfo.pres_stem = if_not_empty(args[1])
		typeinfo.perf_stem = if_not_empty(args[2])
		typeinfo.supine_stem = if_not_empty(args[3])
	end
	
	if (typeinfo.subtype == "perf-as-pres" or typeinfo.subtype == "memini") and not typeinfo.pres_stem then typeinfo.pres_stem = "whatever" end
	
	-- Prepare stems
	if not typeinfo.pres_stem then
		if NAMESPACE == "Template" then
			typeinfo.pres_stem = "-"
		else
			error("Present stem has not been provided")
		end
	end
	
	if not typeinfo.perf_stem and not typeinfo.subtype:find("depon") and not typeinfo.subtype:find("noperf") then
		if typeinfo.conj_type == "1st" then
			typeinfo.perf_stem = typeinfo.pres_stem .. "āv"
		elseif NAMESPACE == "Template" then
			typeinfo.perf_stem = "-"
		else
			error("Perfect stem has not been provided")
		end
	end
	
	if not typeinfo.supine_stem and not typeinfo.subtype:find("nopass") and not typeinfo.subtype:find("noperf") and typeinfo.subtype ~= "no-pasv-perf" and typeinfo.subtype ~= "memini" and typeinfo.subtype ~= "pass-3only" then
		if typeinfo.conj_type == "1st" then
			typeinfo.supine_stem = typeinfo.pres_stem .. "āt"
		elseif NAMESPACE == "Template" then
			typeinfo.supine_stem = "-"
		else
			error("Supine stem has not been provided")
		end
	end
end

conjugations["1st"] = function(args, data, typeinfo)
	get_regular_stems(args, typeinfo)
	
	table.insert(data.title, "[[Appendix:Latin first conjugation|first conjugation]]")
	table.insert(data.categories, "Latin first conjugation verbs")
	
	if typeinfo.perf_stem then
		if typeinfo.perf_stem == typeinfo.pres_stem .. "āv" then
			table.insert(data.categories, "Latin first conjugation verbs with perfect in -av-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "u" then
			table.insert(data.categories, "Latin first conjugation verbs with perfect in -u-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem then
			table.insert(data.categories, "Latin first conjugation verbs with suffixless perfect")
		else
			table.insert(data.categories, "Latin first conjugation verbs with irregular perfect")
		end
	end
	
	make_pres_1st(data, typeinfo.pres_stem)
	make_perf(data, typeinfo.perf_stem)
	make_supine(data, typeinfo.supine_stem)
end

conjugations["2nd"] = function(args, data, typeinfo)
	get_regular_stems(args, typeinfo)
	
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	
	if typeinfo.perf_stem then
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("qu", "1")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("qu", "1")
		local apocope = typeinfo.pres_stem:gsub("[bcdfghjklmnp1rstvwxz]+$", "")
		if typeinfo.perf_stem == typeinfo.pres_stem .. "ēv" then
			table.insert(data.categories, "Latin second conjugation verbs with perfect in -ev-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "u" then
			table.insert(data.categories, "Latin second conjugation verbs with perfect in -u-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem then
			table.insert(data.categories, "Latin second conjugation verbs with suffixless perfect")
		elseif typeinfo.perf_stem == apocope .. "x" or typeinfo.perf_stem == apocope .. "s" then
			table.insert(data.categories, "Latin second conjugation verbs with perfect in -s- or -x-")
		else
			table.insert(data.categories, "Latin second conjugation verbs with irregular perfect")
		end
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("1","qu")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("1","qu")
	end
	
	make_pres_2nd(data, typeinfo.pres_stem)
	make_perf(data, typeinfo.perf_stem)
	make_supine(data, typeinfo.supine_stem)
end

conjugations["3rd"] = function(args, data, typeinfo)
	get_regular_stems(args, typeinfo)
	
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.categories, "Latin third conjugation verbs")
	
	if typeinfo.perf_stem then
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("qu","1")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("qu","1")
		local apocope = typeinfo.pres_stem:gsub("[bcdfghjklmnp1rstvwxz]+$","")
		if typeinfo.perf_stem == typeinfo.pres_stem .. "āv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -av-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "ēv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -ev-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "īv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -iv-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "u" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -u-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem then
			table.insert(data.categories, "Latin third conjugation verbs with suffixless perfect")
		elseif typeinfo.perf_stem == apocope .. "x" or typeinfo.perf_stem == apocope .. "s" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -s- or -x-")
		else
			table.insert(data.categories, "Latin third conjugation verbs with irregular perfect")
		end
	typeinfo.pres_stem = typeinfo.pres_stem:gsub("1","qu")
	typeinfo.perf_stem = typeinfo.perf_stem:gsub("1","qu")
	end
	
	if typeinfo.pres_stem and mw.ustring.match(typeinfo.pres_stem,"[āēīōū]sc$") then
		table.insert(data.categories, "Latin inchoative verbs")
	end
	
	make_pres_3rd(data, typeinfo.pres_stem)
	make_perf(data, typeinfo.perf_stem)
	make_supine(data, typeinfo.supine_stem)
end

conjugations["3rd-io"] = function(args, data, typeinfo)
	get_regular_stems(args, typeinfo)
	
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]] ''iō''-variant")
	table.insert(data.categories, "Latin third conjugation verbs")
	
	if typeinfo.perf_stem then
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("qu","1")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("qu","1")
		local apocope = typeinfo.pres_stem:gsub("[bcdfghjklmnp1rstvwxz]+$","")
		if typeinfo.perf_stem == typeinfo.pres_stem .. "āv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -av-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "ēv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -ev-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "īv" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -iv-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem .. "u" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -u-")
		elseif typeinfo.perf_stem == typeinfo.pres_stem then
			table.insert(data.categories, "Latin third conjugation verbs with suffixless perfect")
		elseif typeinfo.perf_stem == apocope .. "x" or typeinfo.perf_stem == apocope .. "s" then
			table.insert(data.categories, "Latin third conjugation verbs with perfect in -s- or -x-")
		else
			table.insert(data.categories, "Latin third conjugation verbs with irregular perfect")
		end
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("1","qu")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("1","qu")
	end
	
	make_pres_3rd_io(data, typeinfo.pres_stem)
	make_perf(data, typeinfo.perf_stem)
	make_supine(data, typeinfo.supine_stem)
end

local function ivi_ive(form)
	form = form:gsub("%.īvī", "iī")
	form = form:gsub("%.īvi", "ī")
	form = form:gsub("%.īve", "ī")
	form = form:gsub("%.īvē", "ē")
	return form
end

conjugations["4th"] = function(args, data, typeinfo)
	get_regular_stems(args, typeinfo)
	
	table.insert(data.title, "[[Appendix:Latin fourth conjugation|fourth conjugation]]")
	table.insert(data.categories, "Latin fourth conjugation verbs")
	
	
	if typeinfo.perf_stem then
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("qu","1")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("qu","1")
		local apocope = typeinfo.pres_stem:gsub("[bcdfghjklmnp1rstvwxz]+$","")
		local clone = typeinfo.perf_stem:gsub("%.","")
		if clone == typeinfo.pres_stem .. "īv" then
			table.insert(data.categories, "Latin fourth conjugation verbs with perfect in -iv-")
		elseif clone == typeinfo.pres_stem .. "u" then
			table.insert(data.categories, "Latin fourth conjugation verbs with perfect in -u-")
		elseif clone == typeinfo.pres_stem then
			table.insert(data.categories, "Latin fourth conjugation verbs with suffixless perfect")
		elseif clone == apocope .. "x" or clone == apocope .. "s" then
			table.insert(data.categories, "Latin fourth conjugation verbs with perfect in -s- or -x-")
		else
			table.insert(data.categories, "Latin fourth conjugation verbs with irregular perfect")
		end
		typeinfo.pres_stem = typeinfo.pres_stem:gsub("1","qu")
		typeinfo.perf_stem = typeinfo.perf_stem:gsub("1","qu")
	end
	
	make_pres_4th(data, typeinfo.pres_stem)
	make_perf(data, typeinfo.perf_stem)
	make_supine(data, typeinfo.supine_stem)
	
	if data.forms["1s_pres_actv_indc"] == "serviō" or data.forms["1s_pres_actv_indc"] == "saeviō" then
		data.forms["1s_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbam",   typeinfo.pres_stem .. "ībam"}
		data.forms["2s_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbās",   typeinfo.pres_stem .. "ībās"}
		data.forms["3s_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbat",   typeinfo.pres_stem .. "ībat"}
		data.forms["1p_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbāmus", typeinfo.pres_stem .. "ībāmus"}
		data.forms["2p_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbātis", typeinfo.pres_stem .. "ībātis"}
		data.forms["3p_impf_actv_indc"] = {typeinfo.pres_stem .. "iēbant",  typeinfo.pres_stem .. "ībant"}
	
		data.forms["1s_futr_actv_indc"] = {typeinfo.pres_stem .. "iam",   typeinfo.pres_stem .. "ībō"}
		data.forms["2s_futr_actv_indc"] = {typeinfo.pres_stem .. "iēs",   typeinfo.pres_stem .. "ībis"}
		data.forms["3s_futr_actv_indc"] = {typeinfo.pres_stem .. "iet",   typeinfo.pres_stem .. "ībit"}
		data.forms["1p_futr_actv_indc"] = {typeinfo.pres_stem .. "iēmus", typeinfo.pres_stem .. "ībimus"}
		data.forms["2p_futr_actv_indc"] = {typeinfo.pres_stem .. "iētis", typeinfo.pres_stem .. "ībitis"}
		data.forms["3p_futr_actv_indc"] = {typeinfo.pres_stem .. "ient",  typeinfo.pres_stem .. "ībunt"}
	end
	
	if typeinfo.sync_perf == "y" then
		for key,form in pairs(data.forms) do
			if key~="3p_perf_actv_indc" and key:find("perf") or key:find("plup") or key:find("futp") then
				data.forms[key] = ivi_ive(form)
			end
		end
		for index,form in pairs(data.forms["3p_perf_actv_indc"]) do
			data.forms["3p_perf_actv_indc"][index] = ivi_ive(form)
		end
	end
	
	if typeinfo.sync_perf == "yn" then
		for key, form in pairs(data.forms) do
			if key ~= "3p_perf_actv_indc" and key:find("perf") or key:find("plup") or key:find("futp") then
				local sync = ivi_ive(form)
				form = form:gsub("%.","")
				if form ~= sync then data.forms[key] = {form, sync} end
			end
		end
		local temp = {}
		for _,form in ipairs(data.forms["3p_perf_actv_indc"]) do
			local clone = form:gsub("%.","")
			table.insert(temp,clone)
			form = ivi_ive(form)
			table.insert(temp,form)
		end
		data.forms["3p_perf_actv_indc"] = temp
	end
end

-- Irregular conjugations
local irreg_conjugations = {}

conjugations["irreg"] = function(args, data, typeinfo)
	local verb = if_not_empty(args[1])
	local prefix = if_not_empty(args[2])
	
	if not verb then
		if NAMESPACE == "Template" then
			verb = "sum"
		else
			error("The verb to be conjugated has not been specified.")
		end
	end
	
	if not irreg_conjugations[verb] then
		error("The verb '" .. verb .. "' is not recognised as an irregular verb.")
	end
	
	typeinfo.verb = verb
	typeinfo.prefix = prefix
	
	-- Generate the verb forms
	irreg_conjugations[verb](args, data, typeinfo)
end

irreg_conjugations["aio"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]] iō-variant")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.title, "active only")
	table.insert(data.title, "highly [[defective verb|defective]]")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin active-only verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	local prefix = typeinfo.prefix or ""
	
	data.forms["1s_pres_actv_indc"] = {prefix .. "āiō", prefix .. "aiiō"}
	data.forms["2s_pres_actv_indc"] = {prefix .. "āis", prefix .. "ais"}
	data.forms["3s_pres_actv_indc"] = prefix .. "ait"
	data.forms["3p_pres_actv_indc"] = {prefix .. "āiunt", prefix .. "aiiunt"}
	
	data.forms["1s_impf_actv_indc"] = {prefix .. "aiēbam", prefix .. "āībam"}
	data.forms["2s_impf_actv_indc"] = {prefix .. "aiēbās", prefix .. "āībās"}
	data.forms["3s_impf_actv_indc"] = {prefix .. "aiēbat", prefix .. "āībat"}
	data.forms["1p_impf_actv_indc"] = {prefix .. "aiēbāmus", prefix .. "āībāmus"}
	data.forms["2p_impf_actv_indc"] = {prefix .. "aiēbātis", prefix .. "āībātis"}
	data.forms["3p_impf_actv_indc"] = {prefix .. "aiēbant", prefix .. "āībant"}
	
	data.forms["2s_perf_actv_indc"] = prefix .. "aistī"
	data.forms["3s_perf_actv_indc"] = prefix .. "ait"
	
	data.forms["2s_pres_actv_subj"] = prefix .. "āiās"
	data.forms["3s_pres_actv_subj"] = prefix .. "āiat"
	data.forms["3p_pres_actv_subj"] = prefix .. "āiant"
	
	data.forms["2s_pres_actv_impr"] = prefix .. "aï"
	
	data.forms["pres_actv_inf"] = prefix .. "āiere"
	data.forms["pres_actv_ptc"] = prefix .. "aiēns"
end

irreg_conjugations["dico"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]] short imperative")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_pres_3rd(data, prefix .. "dīc")
	make_perf(data, prefix .. "dīx")
	make_supine(data, prefix .. "dict")
	
	data.forms["2s_pres_actv_impr"] = {prefix .. "dīc", data.forms["2s_pres_actv_impr"]}
end

irreg_conjugations["do"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin first conjugation|first conjugation]]")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]] short ''a'' in most forms except " .. make_link({lang = lang, alt = "dās"}, "term") .. " and " .. make_link({lang = lang, alt = "dā"}, "term"))
	table.insert(data.categories, "Latin first conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_perf(data, prefix .. "ded")
	make_supine(data, prefix .. "dat")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = prefix .. "dō"
	data.forms["2s_pres_actv_indc"] = prefix .. "dās"
	data.forms["3s_pres_actv_indc"] = prefix .. "dat"
	data.forms["1p_pres_actv_indc"] = prefix .. "damus"
	data.forms["2p_pres_actv_indc"] = prefix .. "datis"
	data.forms["3p_pres_actv_indc"] = prefix .. "dant"
	
	data.forms["1s_impf_actv_indc"] = prefix .. "dabam"
	data.forms["2s_impf_actv_indc"] = prefix .. "dabās"
	data.forms["3s_impf_actv_indc"] = prefix .. "dabat"
	data.forms["1p_impf_actv_indc"] = prefix .. "dabāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "dabātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "dabant"
	
	data.forms["1s_futr_actv_indc"] = prefix .. "dabō"
	data.forms["2s_futr_actv_indc"] = prefix .. "dabis"
	data.forms["3s_futr_actv_indc"] = prefix .. "dabit"
	data.forms["1p_futr_actv_indc"] = prefix .. "dabimus"
	data.forms["2p_futr_actv_indc"] = prefix .. "dabitis"
	data.forms["3p_futr_actv_indc"] = prefix .. "dabunt"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = prefix .. "dor"
	data.forms["2s_pres_pasv_indc"] = {prefix .. "daris", prefix .. "dare"}
	data.forms["3s_pres_pasv_indc"] = prefix .. "datur"
	data.forms["1p_pres_pasv_indc"] = prefix .. "damur"
	data.forms["2p_pres_pasv_indc"] = prefix .. "daminī"
	data.forms["3p_pres_pasv_indc"] = prefix .. "dantur"
	
	data.forms["1s_impf_pasv_indc"] = prefix .. "dabar"
	data.forms["2s_impf_pasv_indc"] = {prefix .. "dabāris", prefix .. "dabāre"}
	data.forms["3s_impf_pasv_indc"] = prefix .. "dabātur"
	data.forms["1p_impf_pasv_indc"] = prefix .. "dabāmur"
	data.forms["2p_impf_pasv_indc"] = prefix .. "dabāminī"
	data.forms["3p_impf_pasv_indc"] = prefix .. "dabantur"
	
	data.forms["1s_futr_pasv_indc"] = prefix .. "dabor"
	data.forms["2s_futr_pasv_indc"] = {prefix .. "daberis", prefix .. "dabere"}
	data.forms["3s_futr_pasv_indc"] = prefix .. "dabitur"
	data.forms["1p_futr_pasv_indc"] = prefix .. "dabimur"
	data.forms["2p_futr_pasv_indc"] = prefix .. "dabiminī"
	data.forms["3p_futr_pasv_indc"] = prefix .. "dabuntur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = prefix .. "dem"
	data.forms["2s_pres_actv_subj"] = prefix .. "dēs"
	data.forms["3s_pres_actv_subj"] = prefix .. "det"
	data.forms["1p_pres_actv_subj"] = prefix .. "dēmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "dētis"
	data.forms["3p_pres_actv_subj"] = prefix .. "dent"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "darem"
	data.forms["2s_impf_actv_subj"] = prefix .. "darēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "daret"
	data.forms["1p_impf_actv_subj"] = prefix .. "darēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "darētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "darent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = prefix .. "der"
	data.forms["2s_pres_pasv_subj"] = {prefix .. "dēris", prefix .. "dēre"}
	data.forms["3s_pres_pasv_subj"] = prefix .. "dētur"
	data.forms["1p_pres_pasv_subj"] = prefix .. "dēmur"
	data.forms["2p_pres_pasv_subj"] = prefix .. "dēminī"
	data.forms["3p_pres_pasv_subj"] = prefix .. "dentur"
	
	data.forms["1s_impf_pasv_subj"] = prefix .. "darer"
	data.forms["2s_impf_pasv_subj"] = {prefix .. "darēris", prefix .. "darēre"}
	data.forms["3s_impf_pasv_subj"] = prefix .. "darētur"
	data.forms["1p_impf_pasv_subj"] = prefix .. "darēmur"
	data.forms["2p_impf_pasv_subj"] = prefix .. "darēminī"
	data.forms["3p_impf_pasv_subj"] = prefix .. "darentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = prefix .. "dā"
	data.forms["2p_pres_actv_impr"] = prefix .. "date"
	
	data.forms["2s_futr_actv_impr"] = prefix .. "datō"
	data.forms["3s_futr_actv_impr"] = prefix .. "datō"
	data.forms["2p_futr_actv_impr"] = prefix .. "datōte"
	data.forms["3p_futr_actv_impr"] = prefix .. "dantō"
	
	data.forms["2s_pres_pasv_impr"] = prefix .. "dare"
	data.forms["2p_pres_pasv_impr"] = prefix .. "daminī"
	
	data.forms["2s_futr_pasv_impr"] = prefix .. "dator"
	data.forms["3s_futr_pasv_impr"] = prefix .. "dator"
	-- no form
	data.forms["3p_futr_pasv_impr"] = prefix .. "dantor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix .. "dare"
	data.forms["pres_pasv_inf"] = prefix .. "darī"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = prefix .. "dāns"
	data.forms["futr_pasv_ptc"] = prefix .. "dandus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "dandī"
	data.forms["ger_dat"] = prefix .. "dandō"
	data.forms["ger_acc"] = prefix .. "dandum"
end

irreg_conjugations["duco"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]] short imperative")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_pres_3rd(data, prefix .. "dūc")
	make_perf(data, prefix .. "dūx")
	make_supine(data, prefix .. "duct")
	
	data.forms["2s_pres_actv_impr"] = {prefix .. "dūc", data.forms["2s_pres_actv_impr"]}
end

irreg_conjugations["edo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.title, "some [[Appendix:Latin irregular verbs|irregular]] alternative forms")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_pres_3rd(data, prefix .. "ed")
	make_perf(data, prefix .. "ēd")
	make_supine(data, prefix .. "ēs")
	
	-- Active imperfective indicative
	data.forms["2s_pres_actv_indc"] = {data.forms["2s_pres_actv_indc"], prefix .. "ēs"}
	data.forms["3s_pres_actv_indc"] = {data.forms["3s_pres_actv_indc"], prefix .. "ēst"}
	data.forms["2p_pres_actv_indc"] = {data.forms["2p_pres_actv_indc"], prefix .. "ēstis"}
	
	-- Passive imperfective indicative
	data.forms["3s_pres_pasv_indc"] = {data.forms["3s_pres_pasv_indc"], prefix .. "ēstur"}
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = {data.forms["1s_pres_actv_subj"], prefix .. "edim"}
	data.forms["2s_pres_actv_subj"] = {data.forms["2s_pres_actv_subj"], prefix .. "edīs"}
	data.forms["3s_pres_actv_subj"] = {data.forms["3s_pres_actv_subj"], prefix .. "edit"}
	data.forms["1p_pres_actv_subj"] = {data.forms["1p_pres_actv_subj"], prefix .. "edīmus"}
	data.forms["2p_pres_actv_subj"] = {data.forms["2p_pres_actv_subj"], prefix .. "edītis"}
	data.forms["3p_pres_actv_subj"] = {data.forms["3p_pres_actv_subj"], prefix .. "edint"}
	
	data.forms["1s_impf_actv_subj"] = {data.forms["1s_impf_actv_subj"], prefix .. "ēssem"}
	data.forms["2s_impf_actv_subj"] = {data.forms["2s_impf_actv_subj"], prefix .. "ēssēs"}
	data.forms["3s_impf_actv_subj"] = {data.forms["3s_impf_actv_subj"], prefix .. "ēsset"}
	data.forms["1p_impf_actv_subj"] = {data.forms["1p_impf_actv_subj"], prefix .. "ēssēmus"}
	data.forms["2p_impf_actv_subj"] = {data.forms["2p_impf_actv_subj"], prefix .. "ēssētis"}
	data.forms["3p_impf_actv_subj"] = {data.forms["3p_impf_actv_subj"], prefix .. "ēssent"}
	
	-- Active imperative
	data.forms["2s_pres_actv_impr"] = {data.forms["2s_pres_actv_impr"], prefix .. "ēs"}
	data.forms["2p_pres_actv_impr"] = {data.forms["2p_pres_actv_impr"], prefix .. "ēste"}
	
	data.forms["2s_futr_actv_impr"] = {data.forms["2s_futr_actv_impr"], prefix .. "ēstō"}
	data.forms["3s_futr_actv_impr"] = {data.forms["3s_futr_actv_impr"], prefix .. "ēstō"}
	data.forms["2p_futr_actv_impr"] = {data.forms["2p_futr_actv_impr"], prefix .. "ēstōte"}
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = {data.forms["pres_actv_inf"], prefix .. "ēsse"}
end

irreg_conjugations["eo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_perf(data, prefix .. "i")
	make_supine(data, prefix .. "it")
	typeinfo.supine_stem = "it"
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = prefix .. "eō"
	data.forms["2s_pres_actv_indc"] = prefix .. "īs"
	data.forms["3s_pres_actv_indc"] = prefix .. "it"
	data.forms["1p_pres_actv_indc"] = prefix .. "īmus"
	data.forms["2p_pres_actv_indc"] = prefix .. "ītis"
	data.forms["3p_pres_actv_indc"] = prefix .. "eunt"
	
	if prefix == "prōd" then data.forms["3p_pres_actv_indc"] = {"prōdeunt","prōdīnunt"} end
	
	data.forms["1s_impf_actv_indc"] = prefix .. "ībam"
	data.forms["2s_impf_actv_indc"] = prefix .. "ībās"
	data.forms["3s_impf_actv_indc"] = prefix .. "ībat"
	data.forms["1p_impf_actv_indc"] = prefix .. "ībāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "ībātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "ībant"
	
	data.forms["1s_futr_actv_indc"] = prefix .. "ībō"
	data.forms["2s_futr_actv_indc"] = prefix .. "ībis"
	data.forms["3s_futr_actv_indc"] = prefix .. "ībit"
	data.forms["1p_futr_actv_indc"] = prefix .. "ībimus"
	data.forms["2p_futr_actv_indc"] = prefix .. "ībitis"
	data.forms["3p_futr_actv_indc"] = prefix .. "ībunt"
	
	-- Active perfective indicative
	data.forms["1s_perf_actv_indc"] = {data.forms["1s_perf_actv_indc"], prefix .. "īvī"}
	data.forms["2s_perf_actv_indc"] = {prefix .. "īstī", prefix .. "īvistī"}
	data.forms["3s_perf_actv_indc"] = {data.forms["3s_perf_actv_indc"], prefix .. "īvit"}
	data.forms["2p_perf_actv_indc"] = prefix .. "īstis"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = prefix .. "eor"
	data.forms["2s_pres_pasv_indc"] = {prefix .. "īris", prefix .. "īre"}
	data.forms["3s_pres_pasv_indc"] = prefix .. "ītur"
	data.forms["1p_pres_pasv_indc"] = prefix .. "īmur"
	data.forms["2p_pres_pasv_indc"] = prefix .. "īminī"
	data.forms["3p_pres_pasv_indc"] = prefix .. "euntur"
	
	data.forms["1s_impf_pasv_indc"] = prefix .. "ībar"
	data.forms["2s_impf_pasv_indc"] = {prefix .. "ībāris", prefix .. "ībāre"}
	data.forms["3s_impf_pasv_indc"] = prefix .. "ībātur"
	data.forms["1p_impf_pasv_indc"] = prefix .. "ībāmur"
	data.forms["2p_impf_pasv_indc"] = prefix .. "ībāminī"
	data.forms["3p_impf_pasv_indc"] = prefix .. "ībantur"
	
	data.forms["1s_futr_pasv_indc"] = prefix .. "ībor"
	data.forms["2s_futr_pasv_indc"] = {prefix .. "īberis", prefix .. "ībere"}
	data.forms["3s_futr_pasv_indc"] = prefix .. "ībitur"
	data.forms["1p_futr_pasv_indc"] = prefix .. "ībimur"
	data.forms["2p_futr_pasv_indc"] = prefix .. "ībiminī"
	data.forms["3p_futr_pasv_indc"] = prefix .. "ībuntur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = prefix .. "eam"
	data.forms["2s_pres_actv_subj"] = prefix .. "eās"
	data.forms["3s_pres_actv_subj"] = prefix .. "eat"
	data.forms["1p_pres_actv_subj"] = prefix .. "eāmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "eātis"
	data.forms["3p_pres_actv_subj"] = prefix .. "eant"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "īrem"
	data.forms["2s_impf_actv_subj"] = prefix .. "īrēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "īret"
	data.forms["1p_impf_actv_subj"] = prefix .. "īrēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "īrētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "īrent"
	
	-- Active perfective subjunctive
	data.forms["1s_plup_actv_subj"] = prefix .. "īssem"
	data.forms["2s_plup_actv_subj"] = prefix .. "īssēs"
	data.forms["3s_plup_actv_subj"] = prefix .. "īsset"
	data.forms["1p_plup_actv_subj"] = prefix .. "īssēmus"
	data.forms["2p_plup_actv_subj"] = prefix .. "īssētis"
	data.forms["3p_plup_actv_subj"] = prefix .. "īssent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = prefix .. "ear"
	data.forms["2s_pres_pasv_subj"] = {prefix .. "eāris", prefix .. "eāre"}
	data.forms["3s_pres_pasv_subj"] = prefix .. "eātur"
	data.forms["1p_pres_pasv_subj"] = prefix .. "eāmur"
	data.forms["2p_pres_pasv_subj"] = prefix .. "eāminī"
	data.forms["3p_pres_pasv_subj"] = prefix .. "eantur"
	
	data.forms["1s_impf_pasv_subj"] = prefix .. "īrer"
	data.forms["2s_impf_pasv_subj"] = {prefix .. "īrēris", prefix .. "īrēre"}
	data.forms["3s_impf_pasv_subj"] = prefix .. "īrētur"
	data.forms["1p_impf_pasv_subj"] = prefix .. "īrēmur"
	data.forms["2p_impf_pasv_subj"] = prefix .. "īrēminī"
	data.forms["3p_impf_pasv_subj"] = prefix .. "īrentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = prefix .. "ī"
	data.forms["2p_pres_actv_impr"] = prefix .. "īte"
	
	data.forms["2s_futr_actv_impr"] = prefix .. "ītō"
	data.forms["3s_futr_actv_impr"] = prefix .. "ītō"
	data.forms["2p_futr_actv_impr"] = prefix .. "ītōte"
	data.forms["3p_futr_actv_impr"] = prefix .. "euntō"
	
	data.forms["2s_pres_pasv_impr"] = prefix .. "īre"
	data.forms["2p_pres_pasv_impr"] = prefix .. "īminī"
	
	data.forms["2s_futr_pasv_impr"] = prefix .. "ītor"
	data.forms["3s_futr_pasv_impr"] = prefix .. "ītor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = prefix .. "euntor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix .. "īre"
	data.forms["pres_pasv_inf"] = prefix .. "īrī"
	
	-- Perfect/future infinitives
	data.forms["perf_actv_inf"] = prefix .. "īsse"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = prefix .. "iēns"
	data.forms["futr_pasv_ptc"] = prefix .. "eundus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "eundī"
	data.forms["ger_dat"] = prefix .. "eundō"
	data.forms["ger_acc"] = prefix .. "eundum"
end

irreg_conjugations["facio"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]] ''iō''-variant")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]] and [[suppletive]] in the passive")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin suppletive verbs")
	
	local prefix = typeinfo.prefix or ""
	
	make_pres_3rd_io(data, prefix .. "fac")
	make_perf(data, prefix .. "fēc")
	make_supine(data, prefix .. "fact")
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = prefix .. "fīō"
	data.forms["2s_pres_pasv_indc"] = prefix .. "fīs"
	data.forms["3s_pres_pasv_indc"] = prefix .. "fit"
	data.forms["1p_pres_pasv_indc"] = prefix .. "fīmus"
	data.forms["2p_pres_pasv_indc"] = prefix .. "fītis"
	data.forms["3p_pres_pasv_indc"] = prefix .. "fīunt"
	
	data.forms["1s_impf_pasv_indc"] = prefix .. "fīēbam"
	data.forms["2s_impf_pasv_indc"] = prefix .. "fīēbās"
	data.forms["3s_impf_pasv_indc"] = prefix .. "fīēbat"
	data.forms["1p_impf_pasv_indc"] = prefix .. "fīēbāmus"
	data.forms["2p_impf_pasv_indc"] = prefix .. "fīēbātis"
	data.forms["3p_impf_pasv_indc"] = prefix .. "fīēbant"
	
	data.forms["1s_futr_pasv_indc"] = prefix .. "fīam"
	data.forms["2s_futr_pasv_indc"] = prefix .. "fīēs"
	data.forms["3s_futr_pasv_indc"] = prefix .. "fīet"
	data.forms["1p_futr_pasv_indc"] = prefix .. "fīēmus"
	data.forms["2p_futr_pasv_indc"] = prefix .. "fīētis"
	data.forms["3p_futr_pasv_indc"] = prefix .. "fīent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = prefix .. "fīam"
	data.forms["2s_pres_pasv_subj"] = prefix .. "fīās"
	data.forms["3s_pres_pasv_subj"] = prefix .. "fīat"
	data.forms["1p_pres_pasv_subj"] = prefix .. "fīāmus"
	data.forms["2p_pres_pasv_subj"] = prefix .. "fīātis"
	data.forms["3p_pres_pasv_subj"] = prefix .. "fīant"
	
	data.forms["1s_impf_pasv_subj"] = prefix .. "fierem"
	data.forms["2s_impf_pasv_subj"] = prefix .. "fierēs"
	data.forms["3s_impf_pasv_subj"] = prefix .. "fieret"
	data.forms["1p_impf_pasv_subj"] = prefix .. "fierēmus"
	data.forms["2p_impf_pasv_subj"] = prefix .. "fierētis"
	data.forms["3p_impf_pasv_subj"] = prefix .. "fierent"
	
	-- Active imperative
	data.forms["2s_pres_actv_impr"] = (prefix == "" and {prefix .. "fac", data.forms["2s_pres_actv_impr"]} or data.forms["2s_pres_actv_impr"])
	
	-- Passive imperative
	data.forms["2s_pres_pasv_impr"] = prefix .. "fī"
	data.forms["2p_pres_pasv_impr"] = prefix .. "fīte"
	
	data.forms["2s_futr_pasv_impr"] = prefix .. "fītō"
	data.forms["3s_futr_pasv_impr"] = prefix .. "fītō"
	data.forms["2p_futr_pasv_impr"] = prefix .. "fītōte"
	data.forms["3p_futr_pasv_impr"] = prefix .. "fīuntō"
	
	-- Present infinitives
	data.forms["pres_pasv_inf"] = prefix .. "fierī"
end

irreg_conjugations["fero"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.title, "[[suppletive]]")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin suppletive verbs")
	
	local prefix_pres = typeinfo.prefix or ""
	local prefix_perf = if_not_empty(args[3])
	local prefix_supine = if_not_empty(args[4])
	
	prefix_perf = prefix_perf or prefix_pres
	prefix_supine = prefix_supine or prefix_pres
	
	make_pres_3rd(data, prefix_pres .. "fer")
	make_perf(data, prefix_perf .. "tul")
	make_supine(data, prefix_supine .. "lāt")
	
	-- Active imperfective indicative
	data.forms["2s_pres_actv_indc"] = prefix_pres .. "fers"
	data.forms["3s_pres_actv_indc"] = prefix_pres .. "fert"
	data.forms["2p_pres_actv_indc"] = prefix_pres .. "fertis"
	
	-- Passive imperfective indicative
	data.forms["3s_pres_pasv_indc"] = prefix_pres .. "fertur"
	
	-- Active imperfective subjunctive
	data.forms["1s_impf_actv_subj"] = prefix_pres .. "ferrem"
	data.forms["2s_impf_actv_subj"] = prefix_pres .. "ferrēs"
	data.forms["3s_impf_actv_subj"] = prefix_pres .. "ferret"
	data.forms["1p_impf_actv_subj"] = prefix_pres .. "ferrēmus"
	data.forms["2p_impf_actv_subj"] = prefix_pres .. "ferrētis"
	data.forms["3p_impf_actv_subj"] = prefix_pres .. "ferrent"

	-- Passive present indicative
	data.forms["2s_pres_pasv_indc"] = {prefix_pres .. "ferris", prefix_pres .. "ferre"}
	
	-- Passive imperfective subjunctive
	data.forms["1s_impf_pasv_subj"] = prefix_pres .. "ferrer"
	data.forms["2s_impf_pasv_subj"] = {prefix_pres .. "ferrēris", prefix_pres .. "ferrēre"}
	data.forms["3s_impf_pasv_subj"] = prefix_pres .. "ferrētur"
	data.forms["1p_impf_pasv_subj"] = prefix_pres .. "ferrēmur"
	data.forms["2p_impf_pasv_subj"] = prefix_pres .. "ferrēminī"
	data.forms["3p_impf_pasv_subj"] = prefix_pres .. "ferrentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = prefix_pres .. "fer"
	data.forms["2p_pres_actv_impr"] = prefix_pres .. "ferte"
	
	data.forms["2s_futr_actv_impr"] = prefix_pres .. "fertō"
	data.forms["3s_futr_actv_impr"] = prefix_pres .. "fertō"
	data.forms["2p_futr_actv_impr"] = prefix_pres .. "fertōte"
	
	data.forms["2s_pres_pasv_impr"] = prefix_pres .. "ferre"

	data.forms["2s_futr_pasv_impr"] = prefix_pres .. "fertor"
	data.forms["3s_futr_pasv_impr"] = prefix_pres .. "fertor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix_pres .. "ferre"
	data.forms["pres_pasv_inf"] = prefix_pres .. "ferrī"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
end

irreg_conjugations["fio"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]] ''iō''-variant")
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]] long ''ī''")
	table.insert(data.title, "[[suppletive]] in the supine stem")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin suppletive verbs")
	
	local prefix = typeinfo.prefix or ""
	
	typeinfo.subtype = "semi-depon"
	make_pres_3rd(data, prefix .. "fī")
	make_supine(data, prefix .. "fact")
	
	-- Active imperfective indicative
	data.forms["2s_pres_actv_indc"] = prefix .. "fīs"
	data.forms["3s_pres_actv_indc"] = prefix .. "fit"
	data.forms["1p_pres_actv_indc"] = prefix .. "fīmus"
	data.forms["2p_pres_actv_indc"] = prefix .. "fītis"
	
	-- Active imperfective subjunctive
	data.forms["1s_impf_actv_subj"] = prefix .. "fierem"
	data.forms["2s_impf_actv_subj"] = prefix .. "fierēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "fieret"
	data.forms["1p_impf_actv_subj"] = prefix .. "fierēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "fierētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "fierent"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = prefix .. "fī"
	data.forms["2p_pres_actv_impr"] = prefix .. "fīte"
	
	data.forms["2s_futr_actv_impr"] = prefix .. "fītō"
	data.forms["3s_futr_actv_impr"] = prefix .. "fītō"
	data.forms["2p_futr_actv_impr"] = prefix .. "fītōte"
	data.forms["3p_futr_actv_impr"] = prefix .. "fīuntō"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix .. "fierī"
	
	-- Perfect/future infinitives
	data.forms["futr_actv_inf"] = data.forms["futr_pasv_inf"]
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = nil
	data.forms["futr_actv_ptc"] = nil
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "fiendī"
	data.forms["ger_dat"] = prefix .. "fiendō"
	data.forms["ger_acc"] = prefix .. "fiendum"
end

irreg_conjugations["inquam"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.title, "highly [[defective verb|defective]]")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	-- not used
	-- local prefix = typeinfo.prefix or ""
	
	data.forms["1s_pres_actv_indc"] = "inquam"
	data.forms["2s_pres_actv_indc"] = "inquis"
	data.forms["3s_pres_actv_indc"] = "inquit"
	data.forms["1p_pres_actv_indc"] = "inquimus"
	data.forms["2p_pres_actv_indc"] = "inquitis"
	data.forms["3p_pres_actv_indc"] = "inquiunt"
	
	data.forms["2s_futr_actv_indc"] = "inquiēs"
	data.forms["3s_futr_actv_indc"] = "inquiet"
	
	data.forms["3s_impf_actv_indc"] = "inquiēbat"
	
	data.forms["1s_perf_actv_indc"] = "inquiī"
	data.forms["2s_perf_actv_indc"] = "inquistī"
	data.forms["3s_perf_actv_indc"] = "inquit"
	
	data.forms["3s_pres_actv_subj"] = "inquiat"
	
	data.forms["2s_pres_actv_impr"] = "inque"
	data.forms["2s_futr_actv_impr"] = "inquitō"
	data.forms["3s_futr_actv_impr"] = "inquitō"
	
	data.forms["pres_actv_ptc"] = "inquiēns"
end

irreg_conjugations["libet"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "mostly [[impersonal]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin impersonal verbs")
	
	typeinfo.subtype = "nopass"
	local prefix = typeinfo.prefix or ""
	
	-- Active imperfective indicative
	data.forms["3s_pres_actv_indc"] = prefix .. "libet"
	
	data.forms["3s_impf_actv_indc"] = prefix .. "libēbat"
	
	data.forms["3s_futr_actv_indc"] = prefix .. "libēbit"
	
	-- Active perfective indicative
	data.forms["3s_perf_actv_indc"] = {prefix .. "libuit", "[[" .. prefix .. "libitum]] [[est]]"}
	
	data.forms["3s_plup_actv_indc"] = {prefix .. "libuerat", "[[" .. prefix .. "libitum]] [[erat]]"}
	
	data.forms["3s_futp_actv_indc"] = {prefix .. "libuerit", "[[" .. prefix .. "libitum]] [[erit]]"}
	
	-- Active imperfective subjunctive
	data.forms["3s_pres_actv_subj"] = prefix .. "libeat"
	
	data.forms["3s_impf_actv_subj"] = prefix .. "libēret"
	
	-- Active perfective subjunctive
	data.forms["3s_perf_actv_subj"] = {prefix .. "libuerit", "[[" .. prefix .. "libitum]] [[sit]]"}
	
	data.forms["3s_plup_actv_subj"] = {prefix .. "libuisset", "[[" .. prefix .. "libitum]] [[esset]]"}
	data.forms["3p_plup_actv_subj"] = prefix .. "libuissent"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix .. "libēre"
	
	-- Perfect infinitive
	data.forms["perf_actv_inf"] = {prefix .. "libuisse", "[[" .. prefix .. "libitum]] [[esse]]"}
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = prefix .. "libēns"
	data.forms["perf_actv_ptc"] = prefix .. "libitum"
end

irreg_conjugations["licet"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "mostly [[impersonal]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin impersonal verbs")
	
	typeinfo.subtype = "nopass"
	
	-- Active imperfective indicative
	data.forms["3s_pres_actv_indc"] = "licet"
	data.forms["3p_pres_actv_indc"] = "licent"
	
	data.forms["3s_impf_actv_indc"] = "licēbat"
	data.forms["3p_impf_actv_indc"] = "licēbant"
	
	data.forms["3s_futr_actv_indc"] = "licēbit"
	
	-- Active perfective indicative
	data.forms["3s_perf_actv_indc"] = {"licuit", "[[licitum]] [[est]]"}
	
	data.forms["3s_plup_actv_indc"] = {"licuerat", "[[licitum]] [[erat]]"}
	
	data.forms["3s_futp_actv_indc"] = {"licuerit", "[[licitum]] [[erit]]"}
	
	-- Active imperfective subjunctive
	data.forms["3s_pres_actv_subj"] = "liceat"
	data.forms["3p_pres_actv_subj"] = "liceant"
	
	data.forms["3s_impf_actv_subj"] = "licēret"
	
	-- Perfective subjunctive
	data.forms["3s_perf_actv_subj"] = {"licuerit", "[[licitum]] [[sit]]"}
	
	data.forms["3s_plup_actv_subj"] = {"licuisset", "[[licitum]] [[esset]]"}
	
	-- Imperative
	data.forms["2s_futr_actv_impr"] = "licētō"
	data.forms["3s_futr_actv_impr"] = "licētō"
	
	-- Infinitives
	data.forms["pres_actv_inf"] = "licēre"
	data.forms["perf_actv_inf"] = {"licuisse", "[[licitum]] [[esse]]"}
	data.forms["futr_actv_inf"] = "[[licitūrum]] [[esse]]"
	
	-- Participles
	data.forms["pres_actv_ptc"] = "licēns"
	data.forms["perf_actv_ptc"] = "licitus"
	data.forms["futr_actv_ptc"] = "licitūrus"
end

irreg_conjugations["lubet"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "mostly [[impersonal]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin impersonal verbs")
	
	typeinfo.subtype = "nopass"
	
	-- Active imperfective indicative
	data.forms["3s_pres_actv_indc"] = "lubet"
	
	data.forms["3s_impf_actv_indc"] = "lubēbat"
	
	data.forms["3s_futr_actv_indc"] = "lubēbit"
	
	-- Active perfective indicative
	data.forms["3s_perf_actv_indc"] = {"lubuit", "[[lubitum]] [[est]]"}
	
	data.forms["3s_plup_actv_indc"] = {"lubuerat", "[[lubitum]] [[erat]]"}
	
	data.forms["3s_futp_actv_indc"] = {"lubuerit", "[[lubitum]] [[erit]]"}
	
	-- Active imperfective subjunctive
	data.forms["3s_pres_actv_subj"] = "libeat"
	
	data.forms["3s_impf_actv_subj"] = "libēret"
	
	-- Active perfective subjunctive
	data.forms["3s_perf_actv_subj"] = {"lubuerit", "[[lubitum]] [[sit]]"}
	
	data.forms["3s_plup_actv_subj"] = {"lubuisset", "[[lubitum]] [[esset]]"}
	data.forms["3p_plup_actv_subj"] = "lubuissent"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = "lubēre"
	
	-- Perfect infinitive
	data.forms["perf_actv_inf"] = {"lubuisse", "[[lubitum]] [[esse]]"}
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = "lubēns"
	data.forms["perf_actv_ptc"] = "lubitum"
end

irreg_conjugations["malo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.categories, "Latin irregular verbs")
	
	typeinfo.subtype = "nopass"
	typeinfo.subtype = "noimp"
	make_perf(data, "mālu")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = "mālō"
	data.forms["2s_pres_actv_indc"] = "māvīs"
	data.forms["3s_pres_actv_indc"] = "māvult"
	data.forms["1p_pres_actv_indc"] = "mālumus"
	data.forms["2p_pres_actv_indc"] = "māvultis"
	data.forms["3p_pres_actv_indc"] = "mālunt"
	
	data.forms["1s_impf_actv_indc"] = "mālēbam"
	data.forms["2s_impf_actv_indc"] = "mālēbās"
	data.forms["3s_impf_actv_indc"] = "mālēbat"
	data.forms["1p_impf_actv_indc"] = "mālēbāmus"
	data.forms["2p_impf_actv_indc"] = "mālēbātis"
	data.forms["3p_impf_actv_indc"] = "mālēbant"

	data.forms["1s_futr_actv_indc"] = "mālam"
	data.forms["2s_futr_actv_indc"] = "mālēs"
	data.forms["3s_futr_actv_indc"] = "mālet"
	data.forms["1p_futr_actv_indc"] = "mālēmus"
	data.forms["2p_futr_actv_indc"] = "mālētis"
	data.forms["3p_futr_actv_indc"] = "mālent"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = "mālim"
	data.forms["2s_pres_actv_subj"] = "mālīs"
	data.forms["3s_pres_actv_subj"] = "mālit"
	data.forms["1p_pres_actv_subj"] = "mālīmus"
	data.forms["2p_pres_actv_subj"] = "mālītis"
	data.forms["3p_pres_actv_subj"] = "mālint"
	
	data.forms["1s_impf_actv_subj"] = "māllem"
	data.forms["2s_impf_actv_subj"] = "māllēs"
	data.forms["3s_impf_actv_subj"] = "māllet"
	data.forms["1p_impf_actv_subj"] = "māllēmus"
	data.forms["2p_impf_actv_subj"] = "māllētis"
	data.forms["3p_impf_actv_subj"] = "māllent"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = "mālle"
end

irreg_conjugations["nolo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.categories, "Latin irregular verbs")
	
	typeinfo.subtype = "nopass"
	make_perf(data, "nōlu")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = "nōlō"
	data.forms["2s_pres_actv_indc"] = "nōn vīs"
	data.forms["3s_pres_actv_indc"] = "nōn vult"
	data.forms["1p_pres_actv_indc"] = "nōlumus"
	data.forms["2p_pres_actv_indc"] = "nōn vultis"
	data.forms["3p_pres_actv_indc"] = "nōlunt"
	
	data.forms["1s_impf_actv_indc"] = "nōlēbam"
	data.forms["2s_impf_actv_indc"] = "nōlēbās"
	data.forms["3s_impf_actv_indc"] = "nōlēbat"
	data.forms["1p_impf_actv_indc"] = "nōlēbāmus"
	data.forms["2p_impf_actv_indc"] = "nōlēbātis"
	data.forms["3p_impf_actv_indc"] = "nōlēbant"
	
	data.forms["1s_futr_actv_indc"] = "nōlam"
	data.forms["2s_futr_actv_indc"] = "nōlēs"
	data.forms["3s_futr_actv_indc"] = "nōlet"
	data.forms["1p_futr_actv_indc"] = "nōlēmus"
	data.forms["2p_futr_actv_indc"] = "nōlētis"
	data.forms["3p_futr_actv_indc"] = "nōlent"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = "nōlim"
	data.forms["2s_pres_actv_subj"] = "nōlīs"
	data.forms["3s_pres_actv_subj"] = "nōlit"
	data.forms["1p_pres_actv_subj"] = "nōlīmus"
	data.forms["2p_pres_actv_subj"] = "nōlītis"
	data.forms["3p_pres_actv_subj"] = "nōlint"
	
	data.forms["1s_impf_actv_subj"] = "nōllem"
	data.forms["2s_impf_actv_subj"] = "nōllēs"
	data.forms["3s_impf_actv_subj"] = "nōllet"
	data.forms["1p_impf_actv_subj"] = "nōllēmus"
	data.forms["2p_impf_actv_subj"] = "nōllētis"
	data.forms["3p_impf_actv_subj"] = "nōllent"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = "nōlī"
	data.forms["2p_pres_actv_impr"] = "nōlīte"
	
	data.forms["2s_futr_actv_impr"] = "nōlitō"
	data.forms["3s_futr_actv_impr"] = "nōlitō"
	data.forms["2p_futr_actv_impr"] = "nōlitōte"
	data.forms["3p_futr_actv_impr"] = "nōluntō"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = "nōlle"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = "nōlēns"
end

irreg_conjugations["possum"] = function(args, data, typeinfo)
	table.insert(data.title, "highly [[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.title, "[[suppletive]]")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin suppletive verbs")
	
	typeinfo.subtype = "nopass"
	make_perf(data, "potu")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = "possum"
	data.forms["2s_pres_actv_indc"] = "potes"
	data.forms["3s_pres_actv_indc"] = "potest"
	data.forms["1p_pres_actv_indc"] = "possumus"
	data.forms["2p_pres_actv_indc"] = "potestis"
	data.forms["3p_pres_actv_indc"] = "possunt"
	
	data.forms["1s_impf_actv_indc"] = "poteram"
	data.forms["2s_impf_actv_indc"] = "poterās"
	data.forms["3s_impf_actv_indc"] = "poterat"
	data.forms["1p_impf_actv_indc"] = "poterāmus"
	data.forms["2p_impf_actv_indc"] = "poterātis"
	data.forms["3p_impf_actv_indc"] = "poterant"

	data.forms["1s_futr_actv_indc"] = "poterō"
	data.forms["2s_futr_actv_indc"] = {"poteris", "potere"}
	data.forms["3s_futr_actv_indc"] = "poterit"
	data.forms["1p_futr_actv_indc"] = "poterimus"
	data.forms["2p_futr_actv_indc"] = "poteritis"
	data.forms["3p_futr_actv_indc"] = "poterunt"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = "possim"
	data.forms["2s_pres_actv_subj"] = "possīs"
	data.forms["3s_pres_actv_subj"] = "possit"
	data.forms["1p_pres_actv_subj"] = "possīmus"
	data.forms["2p_pres_actv_subj"] = "possītis"
	data.forms["3p_pres_actv_subj"] = "possint"
	
	data.forms["1s_impf_actv_subj"] = "possem"
	data.forms["2s_impf_actv_subj"] = "possēs"
	data.forms["3s_impf_actv_subj"] = "posset"
	data.forms["1p_impf_actv_subj"] = "possēmus"
	data.forms["2p_impf_actv_subj"] = "possētis"
	data.forms["3p_impf_actv_subj"] = "possent"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = "posse"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = "potēns"
end

irreg_conjugations["piget"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "[[impersonal]]")
	table.insert(data.title, "[[semi-deponent]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin impersonal verbs")
	table.insert(data.categories, "Latin semi-deponent verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	local prefix = typeinfo.prefix or ""
	
	--[[
	-- not used
	local ppplink = make_link({lang = lang, term = prefix .. "ausus"}, "term")
	local sumlink = make_link({lang = lang, term = "sum"}, "term")
	--]]

	data.forms["3s_pres_actv_indc"] = prefix .. "piget"
	
	data.forms["3s_impf_actv_indc"] = prefix .. "pigēbat"

	data.forms["3s_futr_actv_indc"] = prefix .. "pigēbit"

	data.forms["3s_perf_actv_indc"] = {prefix .. "piguit", "[[" .. prefix .. "pigitum]] [[est]]"}

	data.forms["3s_plup_actv_indc"] = {prefix .. "piguerat", "[[" .. prefix .. "pigitum]] [[erat]]"}

	data.forms["3s_futp_actv_indc"] = {prefix .. "piguerit", "[[" .. prefix .. "pigitum]] [[erit]]"}

	data.forms["3s_pres_actv_subj"] = prefix .. "pigeat"

	data.forms["3s_impf_actv_subj"] = prefix .. "pigēret"

	data.forms["3s_perf_actv_subj"] = {prefix .. "piguerit", "[[" .. prefix .. "pigitum]] [[sit]]"}

	data.forms["3s_plup_actv_subj"] = {prefix .. "piguisset", "[[" .. prefix .. "pigitum]] [[esset]]"}

	data.forms["pres_actv_inf"] = prefix .. "pigēre"
	data.forms["perf_actv_inf"] = "[[" .. prefix .. "pigitum]] [[esse]]"
	data.forms["pres_actv_ptc"] = prefix .. "pigēns"
	data.forms["perf_actv_ptc"] = prefix .. "pigitum"

	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "pigendī"
	data.forms["ger_dat"] = prefix .. "pigendō"
	data.forms["ger_acc"] = prefix .. "pigendum"

end

irreg_conjugations["soleo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "[[semi-deponent]]")
	table.insert(data.title, "no [[future]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin semi-deponent verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	local prefix = typeinfo.prefix or ""
	
	--[[
	-- not used
	local ppplink = make_link({lang = lang, term = prefix .. "solitus"}, "term")
	local sumlink = make_link({lang = lang, term = "sum"}, "term")
	--]]

	data.forms["1s_pres_actv_indc"] = prefix .. "soleō"
	data.forms["2s_pres_actv_indc"] = prefix .. "solēs"
	data.forms["3s_pres_actv_indc"] = prefix .. "solet"
	data.forms["1p_pres_actv_indc"] = prefix .. "solēmus"
	data.forms["2p_pres_actv_indc"] = prefix .. "solētis"
	data.forms["3p_pres_actv_indc"] = prefix .. "solent"
	
	data.forms["1s_impf_actv_indc"] = prefix .. "solēbam"
	data.forms["2s_impf_actv_indc"] = prefix .. "solēbās"
	data.forms["3s_impf_actv_indc"] = prefix .. "solēbat"
	data.forms["1p_impf_actv_indc"] = prefix .. "solēbāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "solēbātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "solēbant"

	data.forms["1s_perf_actv_indc"] = {prefix .. "soluī", "[[" .. prefix .. "solitus]] [[sum]]"}
	data.forms["2s_perf_actv_indc"] = {prefix .. "soluistī", "[[" .. prefix .. "solitus]] [[es]]"}
	data.forms["3s_perf_actv_indc"] = {prefix .. "soluit", "[[" .. prefix .. "solitus]] [[est]]"}
	data.forms["1p_perf_actv_indc"] = {prefix .. "soluimus", "[[" .. prefix .. "solitī]] [[sumus]]"}
	data.forms["2p_perf_actv_indc"] = {prefix .. "soluistis", "[[" .. prefix .. "solitī]] [[estis]]"}
	data.forms["3p_perf_actv_indc"] = {prefix .. "soluērunt", "soluēre", "[[" .. prefix .. "solitī]] [[sunt]]"}
	
	data.forms["1s_plup_actv_indc"] = {prefix .. "solueram", "[[" .. prefix .. "solitus]] [[eram]]"}
	data.forms["2s_plup_actv_indc"] = {prefix .. "soluerās", "[[" .. prefix .. "solitus]] [[erās]]"}
	data.forms["3s_plup_actv_indc"] = {prefix .. "soluerat", "[[" .. prefix .. "solitus]] [[erat]]"}
	data.forms["1p_plup_actv_indc"] = {prefix .. "soluerāmus", "[[" .. prefix .. "solitī]] [[erāmus]]"}
	data.forms["2p_plup_actv_indc"] = {prefix .. "soluerātis", "[[" .. prefix .. "solitī]] [[erātis]]"}
	data.forms["3p_plup_actv_indc"] = {prefix .. "soluerant", "[[" .. prefix .. "solitī]] [[erant]]"}
	
	data.forms["1s_pres_actv_subj"] = prefix .. "soleam"
	data.forms["2s_pres_actv_subj"] = prefix .. "soleās"
	data.forms["3s_pres_actv_subj"] = prefix .. "soleat"
	data.forms["1p_pres_actv_subj"] = prefix .. "soleāmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "soleātis"
	data.forms["3p_pres_actv_subj"] = prefix .. "soleant"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "solērem"
	data.forms["2s_impf_actv_subj"] = prefix .. "solērēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "solēret"
	data.forms["1p_impf_actv_subj"] = prefix .. "solērēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "solērētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "solērent"

	data.forms["1s_perf_actv_subj"] = {prefix .. "soluerim", "[[" .. prefix .. "solitus]] [[sim]]"}
	data.forms["2s_perf_actv_subj"] = {prefix .. "soluerīs", "[[" .. prefix .. "solitus]] [[sīs]]"}
	data.forms["3s_perf_actv_subj"] = {prefix .. "soluerit", "[[" .. prefix .. "solitus]] [[sit]]"}
	data.forms["1p_perf_actv_subj"] = {prefix .. "soluerīmus", "[[" .. prefix .. "solitī]] [[sīmus]]"}
	data.forms["2p_perf_actv_subj"] = {prefix .. "soluerītis", "[[" .. prefix .. "solitī]] [[sītis]]"}
	data.forms["3p_perf_actv_subj"] = {prefix .. "soluerint", "[[" .. prefix .. "solitī]] [[sint]]"}

	data.forms["1s_plup_actv_subj"] = {prefix .. "soluissem", "[[" .. prefix .. "solitus]] [[essem]]"}
	data.forms["2s_plup_actv_subj"] = {prefix .. "soluissēs", "[[" .. prefix .. "solitus]] [[essēs]]"}
	data.forms["3s_plup_actv_subj"] = {prefix .. "soluisset", "[[" .. prefix .. "solitus]] [[esset]]"}
	data.forms["1p_plup_actv_subj"] = {prefix .. "soluissēmus", "[[" .. prefix .. "solitī]] [[essēmus]]"}
	data.forms["2p_plup_actv_subj"] = {prefix .. "soluissētis", "[[" .. prefix .. "solitī]] [[essētis]]"}
	data.forms["3p_plup_actv_subj"] = {prefix .. "soluissent", "[[" .. prefix .. "solitī]] [[essent]]"}

	data.forms["pres_actv_inf"] = prefix .. "solēre"
	data.forms["perf_actv_inf"] = "[[" .. prefix .. "solitus]] [[esse]]"
	data.forms["pres_actv_ptc"] = prefix .. "solēns"
	data.forms["perf_actv_ptc"] = prefix .. "solitus"

	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "solendī"
	data.forms["ger_dat"] = prefix .. "solendō"
	data.forms["ger_acc"] = prefix .. "solendum"

	-- Supine
	data.forms["sup_acc"] = prefix .. "solitum"
	data.forms["sup_abl"] = prefix .. "solitū"
end

irreg_conjugations["audeo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "[[semi-deponent]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin semi-deponent verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	local prefix = typeinfo.prefix or ""
	
	--[[
	-- not used
	local ppplink = make_link({lang = lang, term = prefix .. "ausus"}, "term")
	local sumlink = make_link({lang = lang, term = "sum"}, "term")
	--]]

	data.forms["1s_pres_actv_indc"] = prefix .. "audeō"
	data.forms["2s_pres_actv_indc"] = prefix .. "audēs"
	data.forms["3s_pres_actv_indc"] = prefix .. "audet"
	data.forms["1p_pres_actv_indc"] = prefix .. "audēmus"
	data.forms["2p_pres_actv_indc"] = prefix .. "audētis"
	data.forms["3p_pres_actv_indc"] = prefix .. "audent"
	
	data.forms["1s_impf_actv_indc"] = prefix .. "audēbam"
	data.forms["2s_impf_actv_indc"] = prefix .. "audēbās"
	data.forms["3s_impf_actv_indc"] = prefix .. "audēbat"
	data.forms["1p_impf_actv_indc"] = prefix .. "audēbāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "audēbātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "audēbant"

	data.forms["1s_futr_actv_indc"] = prefix .. "audēbō"
	data.forms["2s_futr_actv_indc"] = prefix .. "audēbis"
	data.forms["3s_futr_actv_indc"] = prefix .. "audēbit"
	data.forms["1p_futr_actv_indc"] = prefix .. "audēbimus"
	data.forms["2p_futr_actv_indc"] = prefix .. "audēbitis"
	data.forms["3p_futr_actv_indc"] = prefix .. "audēbunt"

	data.forms["1s_perf_actv_indc"] = {prefix .. "ausī", "[[" .. prefix .. "ausus]] [[sum]]"}
	data.forms["2s_perf_actv_indc"] = {prefix .. "ausistī", "[[" .. prefix .. "ausus]] [[es]]"}
	data.forms["3s_perf_actv_indc"] = {prefix .. "ausit", "[[" .. prefix .. "ausus]] [[est]]"}
	data.forms["1p_perf_actv_indc"] = {prefix .. "ausimus", "[[" .. prefix .. "ausī]] [[sumus]]"}
	data.forms["2p_perf_actv_indc"] = {prefix .. "ausistis", "[[" .. prefix .. "ausī]] [[estis]]"}
	data.forms["3p_perf_actv_indc"] = {prefix .. "ausērunt", "ausēre", "[[" .. prefix .. "ausī]] [[sunt]]"}
	
	data.forms["1s_plup_actv_indc"] = {prefix .. "auseram", "[[" .. prefix .. "ausus]] [[eram]]"}
	data.forms["2s_plup_actv_indc"] = {prefix .. "auserās", "[[" .. prefix .. "ausus]] [[erās]]"}
	data.forms["3s_plup_actv_indc"] = {prefix .. "auserat", "[[" .. prefix .. "ausus]] [[erat]]"}
	data.forms["1p_plup_actv_indc"] = {prefix .. "auserāmus", "[[" .. prefix .. "ausī]] [[erāmus]]"}
	data.forms["2p_plup_actv_indc"] = {prefix .. "auserātis", "[[" .. prefix .. "ausī]] [[erātis]]"}
	data.forms["3p_plup_actv_indc"] = {prefix .. "auserant", "[[" .. prefix .. "ausī]] [[erant]]"}

	data.forms["1s_futp_actv_indc"] = {prefix .. "auserō", "[[" .. prefix .. "ausus]] [[erō]]"}
	data.forms["2s_futp_actv_indc"] = {prefix .. "auseris", "[[" .. prefix .. "ausus]] [[eris]]"}
	data.forms["3s_futp_actv_indc"] = {prefix .. "auserit", "[[" .. prefix .. "ausus]] [[erit]]"}
	data.forms["1p_futp_actv_indc"] = {prefix .. "auserimus", "[[" .. prefix .. "ausī]] [[erimus]]"}
	data.forms["2p_futp_actv_indc"] = {prefix .. "auseritis", "[[" .. prefix .. "ausī]] [[eritis]]"}
	data.forms["3p_futp_actv_indc"] = {prefix .. "auserint", "[[" .. prefix .. "ausī]] [[erint]]"}
	
	data.forms["1s_pres_actv_subj"] = prefix .. "audeam"
	data.forms["2s_pres_actv_subj"] = prefix .. "audeās"
	data.forms["3s_pres_actv_subj"] = prefix .. "audeat"
	data.forms["1p_pres_actv_subj"] = prefix .. "audeāmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "audeātis"
	data.forms["3p_pres_actv_subj"] = prefix .. "audeant"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "audērem"
	data.forms["2s_impf_actv_subj"] = prefix .. "audērēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "audēret"
	data.forms["1p_impf_actv_subj"] = prefix .. "audērēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "audērētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "audērent"

	data.forms["1s_perf_actv_subj"] = {prefix .. "auserim", "[[" .. prefix .. "ausus]] [[sim]]"}
	data.forms["2s_perf_actv_subj"] = {prefix .. "auserīs", "[[" .. prefix .. "ausus]] [[sīs]]"}
	data.forms["3s_perf_actv_subj"] = {prefix .. "auserit", "[[" .. prefix .. "ausus]] [[sit]]"}
	data.forms["1p_perf_actv_subj"] = {prefix .. "auserīmus", "[[" .. prefix .. "ausī]] [[sīmus]]"}
	data.forms["2p_perf_actv_subj"] = {prefix .. "auserītis", "[[" .. prefix .. "ausī]] [[sītis]]"}
	data.forms["3p_perf_actv_subj"] = {prefix .. "auserint", "[[" .. prefix .. "ausī]] [[sint]]"}

	data.forms["1s_plup_actv_subj"] = {prefix .. "ausissem", "[[" .. prefix .. "ausus]] [[essem]]"}
	data.forms["2s_plup_actv_subj"] = {prefix .. "ausissēs", "[[" .. prefix .. "ausus]] [[essēs]]"}
	data.forms["3s_plup_actv_subj"] = {prefix .. "ausisset", "[[" .. prefix .. "ausus]] [[esset]]"}
	data.forms["1p_plup_actv_subj"] = {prefix .. "ausissēmus", "[[" .. prefix .. "ausī]] [[essēmus]]"}
	data.forms["2p_plup_actv_subj"] = {prefix .. "ausissētis", "[[" .. prefix .. "ausī]] [[essētis]]"}
	data.forms["3p_plup_actv_subj"] = {prefix .. "ausissent", "[[" .. prefix .. "ausī]] [[essent]]"}

	data.forms["pres_actv_inf"] = prefix .. "audēre"
	data.forms["perf_actv_inf"] = "[[" .. prefix .. "ausus]] [[esse]]"
	data.forms["futr_actv_inf"] = prefix .. "ausūrus esse"
	data.forms["pres_actv_ptc"] = prefix .. "audēns"
	data.forms["perf_actv_ptc"] = prefix .. "ausus"
	data.forms["futr_actv_ptc"] = prefix .. "ausūrus"

	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "audendī"
	data.forms["ger_dat"] = prefix .. "audendō"
	data.forms["ger_acc"] = prefix .. "audendum"

	-- Supine
	data.forms["sup_acc"] = prefix .. "ausum"
	data.forms["sup_abl"] = prefix .. "ausū"
end

irreg_conjugations["placeo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin second conjugation|second conjugation]]")
	table.insert(data.title, "[[semi-deponent]]")
	table.insert(data.categories, "Latin second conjugation verbs")
	table.insert(data.categories, "Latin semi-deponent verbs")
	table.insert(data.categories, "Latin defective verbs")
	
	local prefix = typeinfo.prefix or ""
	
	--[[
	-- not used
	local ppplink = make_link({lang = lang, term = prefix .. "placitus"}, "term")
	local sumlink = make_link({lang = lang, term = "sum"}, "term")
	--]]

	data.forms["1s_pres_actv_indc"] = prefix .. "placeō"
	data.forms["2s_pres_actv_indc"] = prefix .. "placēs"
	data.forms["3s_pres_actv_indc"] = prefix .. "placet"
	data.forms["1p_pres_actv_indc"] = prefix .. "placēmus"
	data.forms["2p_pres_actv_indc"] = prefix .. "placētis"
	data.forms["3p_pres_actv_indc"] = prefix .. "placent"
	
	data.forms["1s_impf_actv_indc"] = prefix .. "placēbam"
	data.forms["2s_impf_actv_indc"] = prefix .. "placēbās"
	data.forms["3s_impf_actv_indc"] = prefix .. "placēbat"
	data.forms["1p_impf_actv_indc"] = prefix .. "placēbāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "placēbātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "placēbant"

	data.forms["1s_futr_actv_indc"] = prefix .. "placēbō"
	data.forms["2s_futr_actv_indc"] = prefix .. "placēbis"
	data.forms["3s_futr_actv_indc"] = prefix .. "placēbit"
	data.forms["1p_futr_actv_indc"] = prefix .. "placēbimus"
	data.forms["2p_futr_actv_indc"] = prefix .. "placēbitis"
	data.forms["3p_futr_actv_indc"] = prefix .. "placēbunt"

	data.forms["1s_perf_actv_indc"] = {prefix .. "placuī", "[[" .. prefix .. "placitus]] [[sum]]"}
	data.forms["2s_perf_actv_indc"] = {prefix .. "placuistī", "[[" .. prefix .. "placitus]] [[es]]"}
	data.forms["3s_perf_actv_indc"] = {prefix .. "placuit", "[[" .. prefix .. "placitus]] [[est]]"}
	data.forms["1p_perf_actv_indc"] = {prefix .. "placuimus", "[[" .. prefix .. "placitī]] [[sumus]]"}
	data.forms["2p_perf_actv_indc"] = {prefix .. "placuistis", "[[" .. prefix .. "placitī]] [[estis]]"}
	data.forms["3p_perf_actv_indc"] = {prefix .. "placuērunt", "placuēre", "[[" .. prefix .. "placitī]] [[sunt]]"}
	
	data.forms["1s_plup_actv_indc"] = {prefix .. "placueram", "[[" .. prefix .. "placitus]] [[eram]]"}
	data.forms["2s_plup_actv_indc"] = {prefix .. "placuerās", "[[" .. prefix .. "placitus]] [[erās]]"}
	data.forms["3s_plup_actv_indc"] = {prefix .. "placuerat", "[[" .. prefix .. "placitus]] [[erat]]"}
	data.forms["1p_plup_actv_indc"] = {prefix .. "placuerāmus", "[[" .. prefix .. "placitī]] [[erāmus]]"}
	data.forms["2p_plup_actv_indc"] = {prefix .. "placuerātis", "[[" .. prefix .. "placitī]] [[erātis]]"}
	data.forms["3p_plup_actv_indc"] = {prefix .. "placuerant", "[[" .. prefix .. "placitī]] [[erant]]"}

	data.forms["1s_futp_actv_indc"] = {prefix .. "placuerō", "[[" .. prefix .. "placitus]] [[erō]]"}
	data.forms["2s_futp_actv_indc"] = {prefix .. "placueris", "[[" .. prefix .. "placitus]] [[eris]]"}
	data.forms["3s_futp_actv_indc"] = {prefix .. "placuerit", "[[" .. prefix .. "placitus]] [[erit]]"}
	data.forms["1p_futp_actv_indc"] = {prefix .. "placuerimus", "[[" .. prefix .. "placitī]] [[erimus]]"}
	data.forms["2p_futp_actv_indc"] = {prefix .. "placueritis", "[[" .. prefix .. "placitī]] [[eritis]]"}
	data.forms["3p_futp_actv_indc"] = {prefix .. "placuerint", "[[" .. prefix .. "placitī]] [[erint]]"}
	
	data.forms["1s_pres_actv_subj"] = prefix .. "placeam"
	data.forms["2s_pres_actv_subj"] = prefix .. "placeās"
	data.forms["3s_pres_actv_subj"] = prefix .. "placeat"
	data.forms["1p_pres_actv_subj"] = prefix .. "placeāmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "placeātis"
	data.forms["3p_pres_actv_subj"] = prefix .. "placeant"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "placērem"
	data.forms["2s_impf_actv_subj"] = prefix .. "placērēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "placēret"
	data.forms["1p_impf_actv_subj"] = prefix .. "placērēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "placērētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "placērent"

	data.forms["1s_perf_actv_subj"] = {prefix .. "placuerim", "[[" .. prefix .. "placitus]] [[sim]]"}
	data.forms["2s_perf_actv_subj"] = {prefix .. "placuerīs", "[[" .. prefix .. "placitus]] [[sīs]]"}
	data.forms["3s_perf_actv_subj"] = {prefix .. "placuerit", "[[" .. prefix .. "placitus]] [[sit]]"}
	data.forms["1p_perf_actv_subj"] = {prefix .. "placuerīmus", "[[" .. prefix .. "placitī]] [[sīmus]]"}
	data.forms["2p_perf_actv_subj"] = {prefix .. "placuerītis", "[[" .. prefix .. "placitī]] [[sītis]]"}
	data.forms["3p_perf_actv_subj"] = {prefix .. "placuerint", "[[" .. prefix .. "placitī]] [[sint]]"}

	data.forms["1s_plup_actv_subj"] = {prefix .. "placuissem", "[[" .. prefix .. "placitus]] [[essem]]"}
	data.forms["2s_plup_actv_subj"] = {prefix .. "placuissēs", "[[" .. prefix .. "placitus]] [[essēs]]"}
	data.forms["3s_plup_actv_subj"] = {prefix .. "placuisset", "[[" .. prefix .. "placitus]] [[esset]]"}
	data.forms["1p_plup_actv_subj"] = {prefix .. "placuissēmus", "[[" .. prefix .. "placitī]] [[essēmus]]"}
	data.forms["2p_plup_actv_subj"] = {prefix .. "placuissētis", "[[" .. prefix .. "placitī]] [[essētis]]"}
	data.forms["3p_plup_actv_subj"] = {prefix .. "placuissent", "[[" .. prefix .. "placitī]] [[essent]]"}

	data.forms["pres_actv_inf"] = prefix .. "placēre"
	data.forms["perf_actv_inf"] = "[[" .. prefix .. "placitus]] [[esse]]"
	data.forms["futr_actv_inf"] = prefix .. "placitūrus esse"
	data.forms["pres_actv_ptc"] = prefix .. "placēns"
	data.forms["perf_actv_ptc"] = prefix .. "placitus"
	data.forms["futr_actv_ptc"] = prefix .. "placitūrus"

	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = prefix .. "placendī"
	data.forms["ger_dat"] = prefix .. "placendō"
	data.forms["ger_acc"] = prefix .. "placendum"

	-- Supine
	data.forms["sup_acc"] = prefix .. "placitum"
	data.forms["sup_abl"] = prefix .. "placitū"
end

irreg_conjugations["coepi"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin third conjugation|third conjugation]]")
	table.insert(data.categories, "Latin third conjugation verbs")
	table.insert(data.categories, "Latin defective verbs")

	local prefix = typeinfo.prefix or ""
	
	local ppplink = make_link({lang = lang, term = prefix .. "coeptus"}, "term")
	local sumlink = make_link({lang = lang, term = "sum"}, "term")

	data.forms["1s_perf_actv_indc"] = prefix .. "coepī"
	data.forms["2s_perf_actv_indc"] = prefix .. "coepistī"
	data.forms["3s_perf_actv_indc"] = prefix .. "coepit"
	data.forms["1p_perf_actv_indc"] = prefix .. "coepimus"
	data.forms["2p_perf_actv_indc"] = prefix .. "coepistis"
	data.forms["3p_perf_actv_indc"] = prefix .. "coepērunt, coepēre"

	data.forms["1s_plup_actv_indc"] = prefix .. "coeperam"
	data.forms["2s_plup_actv_indc"] = prefix .. "coeperās"
	data.forms["3s_plup_actv_indc"] = prefix .. "coeperat"
	data.forms["1p_plup_actv_indc"] = prefix .. "coeperāmus"
	data.forms["2p_plup_actv_indc"] = prefix .. "coeperātis"
	data.forms["3p_plup_actv_indc"] = prefix .. "coeperant"
	
	data.forms["1s_futp_actv_indc"] = prefix .. "coeperō"
	data.forms["2s_futp_actv_indc"] = prefix .. "coeperis"
	data.forms["3s_futp_actv_indc"] = prefix .. "coeperit"
	data.forms["1p_futp_actv_indc"] = prefix .. "coeperimus"
	data.forms["2p_futp_actv_indc"] = prefix .. "coeperitis"
	data.forms["3p_futp_actv_indc"] = prefix .. "coeperint"

	data.forms["perf_pasv_indc"] = ppplink .. " + present active indicative of " .. sumlink
	data.forms["futp_pasv_indc"] = ppplink .. " + future active indicative of " .. sumlink
	data.forms["plup_pasv_indc"] = ppplink .. " + imperfect active indicative of " .. sumlink

	data.forms["1s_perf_actv_subj"] = prefix .. "coeperim"
	data.forms["2s_perf_actv_subj"] = prefix .. "coeperīs"
	data.forms["3s_perf_actv_subj"] = prefix .. "coeperit"
	data.forms["1p_perf_actv_subj"] = prefix .. "coeperīmus"
	data.forms["2p_perf_actv_subj"] = prefix .. "coeperītis"
	data.forms["3p_perf_actv_subj"] = prefix .. "coeperint"

	data.forms["1s_plup_actv_subj"] = prefix .. "coepissem"
	data.forms["2s_plup_actv_subj"] = prefix .. "coepissēs"
	data.forms["3s_plup_actv_subj"] = prefix .. "coepisset"
	data.forms["1p_plup_actv_subj"] = prefix .. "coepissēmus"
	data.forms["2p_plup_actv_subj"] = prefix .. "coepissētis"
	data.forms["3p_plup_actv_subj"] = prefix .. "coepissent"

	data.forms["perf_pasv_subj"] = ppplink .. " + present active subjunctive of " .. sumlink
	data.forms["plup_pasv_subj"] = ppplink .. " + imperfect active subjunctive of " .. sumlink

	data.forms["perf_actv_inf"] = prefix .. "coepisse"
	data.forms["futr_actv_inf"] = prefix .. "coeptūrus esse"
	data.forms["futr_actv_ptc"] = prefix .. "coeptūrus"
	data.forms["perf_pasv_inf"] = prefix .. "coeptus esse"
	data.forms["perf_pasv_ptc"] = prefix .. "coeptus"
	data.forms["futr_pasv_inf"] = prefix .. "coeptum īrī"
	data.forms["futr_pasv_ptc"] = prefix .. "coepiendus"

	-- Supine
	data.forms["sup_acc"] = prefix .. "coeptum"
	data.forms["sup_abl"] = prefix .. "coeptū"
end

irreg_conjugations["sum"] = function(args, data, typeinfo)
	table.insert(data.title, "highly [[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.title, "[[suppletive]]")
	table.insert(data.categories, "Latin irregular verbs")
	table.insert(data.categories, "Latin suppletive verbs")
	
	local prefix = typeinfo.prefix or ""
	local prefix_d = if_not_empty(args[3])
	prefix_d = prefix_d or prefix
	local prefix_f = if_not_empty(args[4]); if prefix == "ab" then prefix_f = "ā" end
	prefix_f = prefix_f or prefix
	-- The vowel of the prefix is lengthened if it ends in -n and the next word begins with f- or s-.
	local prefix_long = prefix:gsub("([aeiou]n)$", {["an"] = "ān", ["en"] = "ēn", ["in"] = "īn", ["on"] = "ōn", ["un"] = "ūn"})
	prefix_f = prefix_f:gsub("([aeiou]n)$", {["an"] = "ān", ["en"] = "ēn", ["in"] = "īn", ["on"] = "ōn", ["un"] = "ūn"})
	
	typeinfo.subtype = "nopass"
	make_perf(data, prefix_f .. "fu")
	make_supine(data, prefix_f .. "fut")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = prefix_long .. "sum"
	data.forms["2s_pres_actv_indc"] = prefix_d .. "es"
	data.forms["3s_pres_actv_indc"] = prefix_d .. "est"
	data.forms["1p_pres_actv_indc"] = prefix_long .. "sumus"
	data.forms["2p_pres_actv_indc"] = prefix_d .. "estis"
	data.forms["3p_pres_actv_indc"] = prefix_long .. "sunt"
	
	data.forms["1s_impf_actv_indc"] = prefix_d .. "eram"
	data.forms["2s_impf_actv_indc"] = prefix_d .. "erās"
	data.forms["3s_impf_actv_indc"] = prefix_d .. "erat"
	data.forms["1p_impf_actv_indc"] = prefix_d .. "erāmus"
	data.forms["2p_impf_actv_indc"] = prefix_d .. "erātis"
	data.forms["3p_impf_actv_indc"] = prefix_d .. "erant"

	data.forms["1s_futr_actv_indc"] = prefix_d .. "erō"
	data.forms["2s_futr_actv_indc"] = {prefix_d .. "eris", prefix_d .. "ere"}
	data.forms["3s_futr_actv_indc"] = prefix_d .. "erit"
	data.forms["1p_futr_actv_indc"] = prefix_d .. "erimus"
	data.forms["2p_futr_actv_indc"] = prefix_d .. "eritis"
	data.forms["3p_futr_actv_indc"] = prefix_d .. "erunt"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = prefix_long .. "sim"
	data.forms["2s_pres_actv_subj"] = prefix_long .. "sīs"
	data.forms["3s_pres_actv_subj"] = prefix_long .. "sit"
	data.forms["1p_pres_actv_subj"] = prefix_long .. "sīmus"
	data.forms["2p_pres_actv_subj"] = prefix_long .. "sītis"
	data.forms["3p_pres_actv_subj"] = prefix_long .. "sint"
	
	data.forms["1s_impf_actv_subj"] = {prefix_d .. "essem", prefix_f .. "forem"}
	data.forms["2s_impf_actv_subj"] = {prefix_d .. "essēs", prefix_f .. "forēs"}
	data.forms["3s_impf_actv_subj"] = {prefix_d .. "esset", prefix_f .. "foret"}
	data.forms["1p_impf_actv_subj"] = {prefix_d .. "essēmus", prefix_f .. "forēmus"}
	data.forms["2p_impf_actv_subj"] = {prefix_d .. "essētis", prefix_f .. "forētis"}
	data.forms["3p_impf_actv_subj"] = {prefix_d .. "essent", prefix_f .. "forent"}
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = prefix_d .. "es"
	data.forms["2p_pres_actv_impr"] = prefix_d .. "este"
	
	data.forms["2s_futr_actv_impr"] = prefix_d .. "estō"
	data.forms["3s_futr_actv_impr"] = prefix_d .. "estō"
	data.forms["2p_futr_actv_impr"] = prefix_d .. "estōte"
	data.forms["3p_futr_actv_impr"] = prefix_long .. "suntō"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix_d .. "esse"
	
	-- Future infinitives
	data.forms["futr_actv_inf"] = {"[[" .. prefix_f .. "futūrus]] [[esse]]", prefix_f .. "fore"}

	-- Imperfective participles
	if prefix == "ab" then
		data.forms["pres_actv_ptc"] = "absēns"
	elseif prefix == "prae" then
		data.forms["pres_actv_ptc"] = "praesēns"
	end
	
	-- Gerund
	data.forms["ger_nom"] = nil
	data.forms["ger_gen"] = nil
	data.forms["ger_dat"] = nil
	data.forms["ger_acc"] = nil
	
	-- Supine
	data.forms["sup_acc"] = nil
	data.forms["sup_abl"] = nil
end

irreg_conjugations["volo"] = function(args, data, typeinfo)
	table.insert(data.title, "[[Appendix:Latin irregular verbs|irregular]]")
	table.insert(data.categories, "Latin irregular verbs")
	
	local prefix = typeinfo.prefix or ""
	
	typeinfo.subtype = "nopass"
	typeinfo.subtype = "noimp"
	make_perf(data, prefix .. "volu")
	
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = prefix .. "volō"
	data.forms["2s_pres_actv_indc"] = prefix .. "vīs"
	data.forms["3s_pres_actv_indc"] = prefix ~= "" and prefix .. "vult" or {"vult", "volt"}
	data.forms["1p_pres_actv_indc"] = prefix .. "volumus"
	data.forms["2p_pres_actv_indc"] = prefix ~= "" and prefix .. "vultis" or {"vultis", "voltis"}
	data.forms["3p_pres_actv_indc"] = prefix .. "volunt"
	
	data.forms["1s_impf_actv_indc"] = prefix .. "volēbam"
	data.forms["2s_impf_actv_indc"] = prefix .. "volēbās"
	data.forms["3s_impf_actv_indc"] = prefix .. "volēbat"
	data.forms["1p_impf_actv_indc"] = prefix .. "volēbāmus"
	data.forms["2p_impf_actv_indc"] = prefix .. "volēbātis"
	data.forms["3p_impf_actv_indc"] = prefix .. "volēbant"

	data.forms["1s_futr_actv_indc"] = prefix .. "volam"
	data.forms["2s_futr_actv_indc"] = prefix .. "volēs"
	data.forms["3s_futr_actv_indc"] = prefix .. "volet"
	data.forms["1p_futr_actv_indc"] = prefix .. "volēmus"
	data.forms["2p_futr_actv_indc"] = prefix .. "volētis"
	data.forms["3p_futr_actv_indc"] = prefix .. "volent"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = prefix .. "velim"
	data.forms["2s_pres_actv_subj"] = prefix .. "velīs"
	data.forms["3s_pres_actv_subj"] = prefix .. "velit"
	data.forms["1p_pres_actv_subj"] = prefix .. "velīmus"
	data.forms["2p_pres_actv_subj"] = prefix .. "velītis"
	data.forms["3p_pres_actv_subj"] = prefix .. "velint"
	
	data.forms["1s_impf_actv_subj"] = prefix .. "vellem"
	data.forms["2s_impf_actv_subj"] = prefix .. "vellēs"
	data.forms["3s_impf_actv_subj"] = prefix .. "vellet"
	data.forms["1p_impf_actv_subj"] = prefix .. "vellēmus"
	data.forms["2p_impf_actv_subj"] = prefix .. "vellētis"
	data.forms["3p_impf_actv_subj"] = prefix .. "vellent"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = prefix .. "velle"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = prefix .. "volēns"
end


-- Form-generating functions

function make_pres_1st(data, pres_stem)
	if not pres_stem then
		return
	end

	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = pres_stem .. "ō"
	data.forms["2s_pres_actv_indc"] = pres_stem .. "ās"
	data.forms["3s_pres_actv_indc"] = pres_stem .. "at"
	data.forms["1p_pres_actv_indc"] = pres_stem .. "āmus"
	data.forms["2p_pres_actv_indc"] = pres_stem .. "ātis"
	data.forms["3p_pres_actv_indc"] = pres_stem .. "ant"
	
	data.forms["1s_impf_actv_indc"] = pres_stem .. "ābam"
	data.forms["2s_impf_actv_indc"] = pres_stem .. "ābās"
	data.forms["3s_impf_actv_indc"] = pres_stem .. "ābat"
	data.forms["1p_impf_actv_indc"] = pres_stem .. "ābāmus"
	data.forms["2p_impf_actv_indc"] = pres_stem .. "ābātis"
	data.forms["3p_impf_actv_indc"] = pres_stem .. "ābant"
	
	data.forms["1s_futr_actv_indc"] = pres_stem .. "ābō"
	data.forms["2s_futr_actv_indc"] = pres_stem .. "ābis"
	data.forms["3s_futr_actv_indc"] = pres_stem .. "ābit"
	data.forms["1p_futr_actv_indc"] = pres_stem .. "ābimus"
	data.forms["2p_futr_actv_indc"] = pres_stem .. "ābitis"
	data.forms["3p_futr_actv_indc"] = pres_stem .. "ābunt"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = pres_stem .. "or"
	data.forms["2s_pres_pasv_indc"] = {pres_stem .. "āris", pres_stem .. "āre"}
	data.forms["3s_pres_pasv_indc"] = pres_stem .. "ātur"
	data.forms["1p_pres_pasv_indc"] = pres_stem .. "āmur"
	data.forms["2p_pres_pasv_indc"] = pres_stem .. "āminī"
	data.forms["3p_pres_pasv_indc"] = pres_stem .. "antur"
	
	data.forms["1s_impf_pasv_indc"] = pres_stem .. "ābar"
	data.forms["2s_impf_pasv_indc"] = {pres_stem .. "ābāris", pres_stem .. "ābāre"}
	data.forms["3s_impf_pasv_indc"] = pres_stem .. "ābātur"
	data.forms["1p_impf_pasv_indc"] = pres_stem .. "ābāmur"
	data.forms["2p_impf_pasv_indc"] = pres_stem .. "ābāminī"
	data.forms["3p_impf_pasv_indc"] = pres_stem .. "ābantur"
	
	data.forms["1s_futr_pasv_indc"] = pres_stem .. "ābor"
	data.forms["2s_futr_pasv_indc"] = {pres_stem .. "āberis", pres_stem .. "ābere"}
	data.forms["3s_futr_pasv_indc"] = pres_stem .. "ābitur"
	data.forms["1p_futr_pasv_indc"] = pres_stem .. "ābimur"
	data.forms["2p_futr_pasv_indc"] = pres_stem .. "ābiminī"
	data.forms["3p_futr_pasv_indc"] = pres_stem .. "ābuntur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = pres_stem .. "em"
	data.forms["2s_pres_actv_subj"] = pres_stem .. "ēs"
	data.forms["3s_pres_actv_subj"] = pres_stem .. "et"
	data.forms["1p_pres_actv_subj"] = pres_stem .. "ēmus"
	data.forms["2p_pres_actv_subj"] = pres_stem .. "ētis"
	data.forms["3p_pres_actv_subj"] = pres_stem .. "ent"
	
	data.forms["1s_impf_actv_subj"] = pres_stem .. "ārem"
	data.forms["2s_impf_actv_subj"] = pres_stem .. "ārēs"
	data.forms["3s_impf_actv_subj"] = pres_stem .. "āret"
	data.forms["1p_impf_actv_subj"] = pres_stem .. "ārēmus"
	data.forms["2p_impf_actv_subj"] = pres_stem .. "ārētis"
	data.forms["3p_impf_actv_subj"] = pres_stem .. "ārent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = pres_stem .. "er"
	data.forms["2s_pres_pasv_subj"] = {pres_stem .. "ēris", pres_stem .. "ēre"}
	data.forms["3s_pres_pasv_subj"] = pres_stem .. "ētur"
	data.forms["1p_pres_pasv_subj"] = pres_stem .. "ēmur"
	data.forms["2p_pres_pasv_subj"] = pres_stem .. "ēminī"
	data.forms["3p_pres_pasv_subj"] = pres_stem .. "entur"
	
	data.forms["1s_impf_pasv_subj"] = pres_stem .. "ārer"
	data.forms["2s_impf_pasv_subj"] = {pres_stem .. "ārēris", pres_stem .. "ārēre"}
	data.forms["3s_impf_pasv_subj"] = pres_stem .. "ārētur"
	data.forms["1p_impf_pasv_subj"] = pres_stem .. "ārēmur"
	data.forms["2p_impf_pasv_subj"] = pres_stem .. "ārēminī"
	data.forms["3p_impf_pasv_subj"] = pres_stem .. "ārentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = pres_stem .. "ā"
	data.forms["2p_pres_actv_impr"] = pres_stem .. "āte"
	
	data.forms["2s_futr_actv_impr"] = pres_stem .. "ātō"
	data.forms["3s_futr_actv_impr"] = pres_stem .. "ātō"
	data.forms["2p_futr_actv_impr"] = pres_stem .. "ātōte"
	data.forms["3p_futr_actv_impr"] = pres_stem .. "antō"
	
	data.forms["2s_pres_pasv_impr"] = pres_stem .. "āre"
	data.forms["2p_pres_pasv_impr"] = pres_stem .. "āminī"
	
	data.forms["2s_futr_pasv_impr"] = pres_stem .. "ātor"
	data.forms["3s_futr_pasv_impr"] = pres_stem .. "ātor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = pres_stem .. "antor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = pres_stem .. "āre"
	data.forms["pres_pasv_inf"] = pres_stem .. "ārī"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = pres_stem .. "āns"
	data.forms["futr_pasv_ptc"] = pres_stem .. "andus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = pres_stem .. "andī"
	data.forms["ger_dat"] = pres_stem .. "andō"
	data.forms["ger_acc"] = pres_stem .. "andum"
end

function make_pres_2nd(data, pres_stem)
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = pres_stem .. "eō"
	data.forms["2s_pres_actv_indc"] = pres_stem .. "ēs"
	data.forms["3s_pres_actv_indc"] = pres_stem .. "et"
	data.forms["1p_pres_actv_indc"] = pres_stem .. "ēmus"
	data.forms["2p_pres_actv_indc"] = pres_stem .. "ētis"
	data.forms["3p_pres_actv_indc"] = pres_stem .. "ent"
	
	data.forms["1s_impf_actv_indc"] = pres_stem .. "ēbam"
	data.forms["2s_impf_actv_indc"] = pres_stem .. "ēbās"
	data.forms["3s_impf_actv_indc"] = pres_stem .. "ēbat"
	data.forms["1p_impf_actv_indc"] = pres_stem .. "ēbāmus"
	data.forms["2p_impf_actv_indc"] = pres_stem .. "ēbātis"
	data.forms["3p_impf_actv_indc"] = pres_stem .. "ēbant"
	
	data.forms["1s_futr_actv_indc"] = pres_stem .. "ēbō"
	data.forms["2s_futr_actv_indc"] = pres_stem .. "ēbis"
	data.forms["3s_futr_actv_indc"] = pres_stem .. "ēbit"
	data.forms["1p_futr_actv_indc"] = pres_stem .. "ēbimus"
	data.forms["2p_futr_actv_indc"] = pres_stem .. "ēbitis"
	data.forms["3p_futr_actv_indc"] = pres_stem .. "ēbunt"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = pres_stem .. "eor"
	data.forms["2s_pres_pasv_indc"] = {pres_stem .. "ēris", pres_stem .. "ēre"}
	data.forms["3s_pres_pasv_indc"] = pres_stem .. "ētur"
	data.forms["1p_pres_pasv_indc"] = pres_stem .. "ēmur"
	data.forms["2p_pres_pasv_indc"] = pres_stem .. "ēminī"
	data.forms["3p_pres_pasv_indc"] = pres_stem .. "entur"
	
	data.forms["1s_impf_pasv_indc"] = pres_stem .. "ēbar"
	data.forms["2s_impf_pasv_indc"] = {pres_stem .. "ēbāris", pres_stem .. "ēbāre"}
	data.forms["3s_impf_pasv_indc"] = pres_stem .. "ēbātur"
	data.forms["1p_impf_pasv_indc"] = pres_stem .. "ēbāmur"
	data.forms["2p_impf_pasv_indc"] = pres_stem .. "ēbāminī"
	data.forms["3p_impf_pasv_indc"] = pres_stem .. "ēbantur"
	
	data.forms["1s_futr_pasv_indc"] = pres_stem .. "ēbor"
	data.forms["2s_futr_pasv_indc"] = {pres_stem .. "ēberis", pres_stem .. "ēbere"}
	data.forms["3s_futr_pasv_indc"] = pres_stem .. "ēbitur"
	data.forms["1p_futr_pasv_indc"] = pres_stem .. "ēbimur"
	data.forms["2p_futr_pasv_indc"] = pres_stem .. "ēbiminī"
	data.forms["3p_futr_pasv_indc"] = pres_stem .. "ēbuntur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = pres_stem .. "eam"
	data.forms["2s_pres_actv_subj"] = pres_stem .. "eās"
	data.forms["3s_pres_actv_subj"] = pres_stem .. "eat"
	data.forms["1p_pres_actv_subj"] = pres_stem .. "eāmus"
	data.forms["2p_pres_actv_subj"] = pres_stem .. "eātis"
	data.forms["3p_pres_actv_subj"] = pres_stem .. "eant"
	
	data.forms["1s_impf_actv_subj"] = pres_stem .. "ērem"
	data.forms["2s_impf_actv_subj"] = pres_stem .. "ērēs"
	data.forms["3s_impf_actv_subj"] = pres_stem .. "ēret"
	data.forms["1p_impf_actv_subj"] = pres_stem .. "ērēmus"
	data.forms["2p_impf_actv_subj"] = pres_stem .. "ērētis"
	data.forms["3p_impf_actv_subj"] = pres_stem .. "ērent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = pres_stem .. "ear"
	data.forms["2s_pres_pasv_subj"] = {pres_stem .. "eāris", pres_stem .. "eāre"}
	data.forms["3s_pres_pasv_subj"] = pres_stem .. "eātur"
	data.forms["1p_pres_pasv_subj"] = pres_stem .. "eāmur"
	data.forms["2p_pres_pasv_subj"] = pres_stem .. "eāminī"
	data.forms["3p_pres_pasv_subj"] = pres_stem .. "eantur"
	
	data.forms["1s_impf_pasv_subj"] = pres_stem .. "ērer"
	data.forms["2s_impf_pasv_subj"] = {pres_stem .. "ērēris", pres_stem .. "ērēre"}
	data.forms["3s_impf_pasv_subj"] = pres_stem .. "ērētur"
	data.forms["1p_impf_pasv_subj"] = pres_stem .. "ērēmur"
	data.forms["2p_impf_pasv_subj"] = pres_stem .. "ērēminī"
	data.forms["3p_impf_pasv_subj"] = pres_stem .. "ērentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = pres_stem .. "ē"
	data.forms["2p_pres_actv_impr"] = pres_stem .. "ēte"
	
	data.forms["2s_futr_actv_impr"] = pres_stem .. "ētō"
	data.forms["3s_futr_actv_impr"] = pres_stem .. "ētō"
	data.forms["2p_futr_actv_impr"] = pres_stem .. "ētōte"
	data.forms["3p_futr_actv_impr"] = pres_stem .. "entō"
	
	data.forms["2s_pres_pasv_impr"] = pres_stem .. "ēre"
	data.forms["2p_pres_pasv_impr"] = pres_stem .. "ēminī"
	
	data.forms["2s_futr_pasv_impr"] = pres_stem .. "ētor"
	data.forms["3s_futr_pasv_impr"] = pres_stem .. "ētor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = pres_stem .. "entor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = pres_stem .. "ēre"
	data.forms["pres_pasv_inf"] = pres_stem .. "ērī"

	-- Imperfective participles
	data.forms["pres_actv_ptc"] = pres_stem .. "ēns"
	data.forms["futr_pasv_ptc"] = pres_stem .. "endus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = pres_stem .. "endī"
	data.forms["ger_dat"] = pres_stem .. "endō"
	data.forms["ger_acc"] = pres_stem .. "endum"
end

function make_pres_3rd(data, pres_stem)
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = pres_stem .. "ō"
	data.forms["2s_pres_actv_indc"] = pres_stem .. "is"
	data.forms["3s_pres_actv_indc"] = pres_stem .. "it"
	data.forms["1p_pres_actv_indc"] = pres_stem .. "imus"
	data.forms["2p_pres_actv_indc"] = pres_stem .. "itis"
	data.forms["3p_pres_actv_indc"] = pres_stem .. "unt"
	
	data.forms["1s_impf_actv_indc"] = pres_stem .. "ēbam"
	data.forms["2s_impf_actv_indc"] = pres_stem .. "ēbās"
	data.forms["3s_impf_actv_indc"] = pres_stem .. "ēbat"
	data.forms["1p_impf_actv_indc"] = pres_stem .. "ēbāmus"
	data.forms["2p_impf_actv_indc"] = pres_stem .. "ēbātis"
	data.forms["3p_impf_actv_indc"] = pres_stem .. "ēbant"
	
	data.forms["1s_futr_actv_indc"] = pres_stem .. "am"
	data.forms["2s_futr_actv_indc"] = pres_stem .. "ēs"
	data.forms["3s_futr_actv_indc"] = pres_stem .. "et"
	data.forms["1p_futr_actv_indc"] = pres_stem .. "ēmus"
	data.forms["2p_futr_actv_indc"] = pres_stem .. "ētis"
	data.forms["3p_futr_actv_indc"] = pres_stem .. "ent"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = pres_stem .. "or"
	data.forms["2s_pres_pasv_indc"] = {pres_stem .. "eris", pres_stem .. "ere"}
	data.forms["3s_pres_pasv_indc"] = pres_stem .. "itur"
	data.forms["1p_pres_pasv_indc"] = pres_stem .. "imur"
	data.forms["2p_pres_pasv_indc"] = pres_stem .. "iminī"
	data.forms["3p_pres_pasv_indc"] = pres_stem .. "untur"
	
	data.forms["1s_impf_pasv_indc"] = pres_stem .. "ēbar"
	data.forms["2s_impf_pasv_indc"] = {pres_stem .. "ēbāris", pres_stem .. "ēbāre"}
	data.forms["3s_impf_pasv_indc"] = pres_stem .. "ēbātur"
	data.forms["1p_impf_pasv_indc"] = pres_stem .. "ēbāmur"
	data.forms["2p_impf_pasv_indc"] = pres_stem .. "ēbāminī"
	data.forms["3p_impf_pasv_indc"] = pres_stem .. "ēbantur"
	
	data.forms["1s_futr_pasv_indc"] = pres_stem .. "ar"
	data.forms["2s_futr_pasv_indc"] = {pres_stem .. "ēris", pres_stem .. "ēre"}
	data.forms["3s_futr_pasv_indc"] = pres_stem .. "ētur"
	data.forms["1p_futr_pasv_indc"] = pres_stem .. "ēmur"
	data.forms["2p_futr_pasv_indc"] = pres_stem .. "ēminī"
	data.forms["3p_futr_pasv_indc"] = pres_stem .. "entur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = pres_stem .. "am"
	data.forms["2s_pres_actv_subj"] = pres_stem .. "ās"
	data.forms["3s_pres_actv_subj"] = pres_stem .. "at"
	data.forms["1p_pres_actv_subj"] = pres_stem .. "āmus"
	data.forms["2p_pres_actv_subj"] = pres_stem .. "ātis"
	data.forms["3p_pres_actv_subj"] = pres_stem .. "ant"
	
	data.forms["1s_impf_actv_subj"] = pres_stem .. "erem"
	data.forms["2s_impf_actv_subj"] = pres_stem .. "erēs"
	data.forms["3s_impf_actv_subj"] = pres_stem .. "eret"
	data.forms["1p_impf_actv_subj"] = pres_stem .. "erēmus"
	data.forms["2p_impf_actv_subj"] = pres_stem .. "erētis"
	data.forms["3p_impf_actv_subj"] = pres_stem .. "erent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = pres_stem .. "ar"
	data.forms["2s_pres_pasv_subj"] = {pres_stem .. "āris", pres_stem .. "āre"}
	data.forms["3s_pres_pasv_subj"] = pres_stem .. "ātur"
	data.forms["1p_pres_pasv_subj"] = pres_stem .. "āmur"
	data.forms["2p_pres_pasv_subj"] = pres_stem .. "āminī"
	data.forms["3p_pres_pasv_subj"] = pres_stem .. "antur"
	
	data.forms["1s_impf_pasv_subj"] = pres_stem .. "erer"
	data.forms["2s_impf_pasv_subj"] = {pres_stem .. "erēris", pres_stem .. "erēre"}
	data.forms["3s_impf_pasv_subj"] = pres_stem .. "erētur"
	data.forms["1p_impf_pasv_subj"] = pres_stem .. "erēmur"
	data.forms["2p_impf_pasv_subj"] = pres_stem .. "erēminī"
	data.forms["3p_impf_pasv_subj"] = pres_stem .. "erentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = pres_stem .. "e"
	data.forms["2p_pres_actv_impr"] = pres_stem .. "ite"
	
	data.forms["2s_futr_actv_impr"] = pres_stem .. "itō"
	data.forms["3s_futr_actv_impr"] = pres_stem .. "itō"
	data.forms["2p_futr_actv_impr"] = pres_stem .. "itōte"
	data.forms["3p_futr_actv_impr"] = pres_stem .. "untō"
	
	data.forms["2s_pres_pasv_impr"] = pres_stem .. "ere"
	data.forms["2p_pres_pasv_impr"] = pres_stem .. "iminī"
	
	data.forms["2s_futr_pasv_impr"] = pres_stem .. "itor"
	data.forms["3s_futr_pasv_impr"] = pres_stem .. "itor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = pres_stem .. "untor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = pres_stem .. "ere"
	data.forms["pres_pasv_inf"] = pres_stem .. "ī"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = pres_stem .. "ēns"
	data.forms["futr_pasv_ptc"] = pres_stem .. "endus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = pres_stem .. "endī"
	data.forms["ger_dat"] = pres_stem .. "endō"
	data.forms["ger_acc"] = pres_stem .. "endum"
end

function make_pres_3rd_io(data, pres_stem)
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = pres_stem .. "iō"
	data.forms["2s_pres_actv_indc"] = pres_stem .. "is"
	data.forms["3s_pres_actv_indc"] = pres_stem .. "it"
	data.forms["1p_pres_actv_indc"] = pres_stem .. "imus"
	data.forms["2p_pres_actv_indc"] = pres_stem .. "itis"
	data.forms["3p_pres_actv_indc"] = pres_stem .. "iunt"
	
	data.forms["1s_impf_actv_indc"] = pres_stem .. "iēbam"
	data.forms["2s_impf_actv_indc"] = pres_stem .. "iēbās"
	data.forms["3s_impf_actv_indc"] = pres_stem .. "iēbat"
	data.forms["1p_impf_actv_indc"] = pres_stem .. "iēbāmus"
	data.forms["2p_impf_actv_indc"] = pres_stem .. "iēbātis"
	data.forms["3p_impf_actv_indc"] = pres_stem .. "iēbant"
	
	data.forms["1s_futr_actv_indc"] = pres_stem .. "iam"
	data.forms["2s_futr_actv_indc"] = pres_stem .. "iēs"
	data.forms["3s_futr_actv_indc"] = pres_stem .. "iet"
	data.forms["1p_futr_actv_indc"] = pres_stem .. "iēmus"
	data.forms["2p_futr_actv_indc"] = pres_stem .. "iētis"
	data.forms["3p_futr_actv_indc"] = pres_stem .. "ient"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = pres_stem .. "ior"
	data.forms["2s_pres_pasv_indc"] = {pres_stem .. "eris", pres_stem .. "ere"}
	data.forms["3s_pres_pasv_indc"] = pres_stem .. "itur"
	data.forms["1p_pres_pasv_indc"] = pres_stem .. "imur"
	data.forms["2p_pres_pasv_indc"] = pres_stem .. "iminī"
	data.forms["3p_pres_pasv_indc"] = pres_stem .. "iuntur"
	
	data.forms["1s_impf_pasv_indc"] = pres_stem .. "iēbar"
	data.forms["2s_impf_pasv_indc"] = {pres_stem .. "iēbāris", pres_stem .. "iēbāre"}
	data.forms["3s_impf_pasv_indc"] = pres_stem .. "iēbātur"
	data.forms["1p_impf_pasv_indc"] = pres_stem .. "iēbāmur"
	data.forms["2p_impf_pasv_indc"] = pres_stem .. "iēbāminī"
	data.forms["3p_impf_pasv_indc"] = pres_stem .. "iēbantur"
	
	data.forms["1s_futr_pasv_indc"] = pres_stem .. "iar"
	data.forms["2s_futr_pasv_indc"] = {pres_stem .. "iēris", pres_stem .. "iēre"}
	data.forms["3s_futr_pasv_indc"] = pres_stem .. "iētur"
	data.forms["1p_futr_pasv_indc"] = pres_stem .. "iēmur"
	data.forms["2p_futr_pasv_indc"] = pres_stem .. "iēminī"
	data.forms["3p_futr_pasv_indc"] = pres_stem .. "ientur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = pres_stem .. "iam"
	data.forms["2s_pres_actv_subj"] = pres_stem .. "iās"
	data.forms["3s_pres_actv_subj"] = pres_stem .. "iat"
	data.forms["1p_pres_actv_subj"] = pres_stem .. "iāmus"
	data.forms["2p_pres_actv_subj"] = pres_stem .. "iātis"
	data.forms["3p_pres_actv_subj"] = pres_stem .. "iant"
	
	data.forms["1s_impf_actv_subj"] = pres_stem .. "erem"
	data.forms["2s_impf_actv_subj"] = pres_stem .. "erēs"
	data.forms["3s_impf_actv_subj"] = pres_stem .. "eret"
	data.forms["1p_impf_actv_subj"] = pres_stem .. "erēmus"
	data.forms["2p_impf_actv_subj"] = pres_stem .. "erētis"
	data.forms["3p_impf_actv_subj"] = pres_stem .. "erent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = pres_stem .. "iar"
	data.forms["2s_pres_pasv_subj"] = {pres_stem .. "iāris", pres_stem .. "iāre"}
	data.forms["3s_pres_pasv_subj"] = pres_stem .. "iātur"
	data.forms["1p_pres_pasv_subj"] = pres_stem .. "iāmur"
	data.forms["2p_pres_pasv_subj"] = pres_stem .. "iāminī"
	data.forms["3p_pres_pasv_subj"] = pres_stem .. "iantur"
	
	data.forms["1s_impf_pasv_subj"] = pres_stem .. "erer"
	data.forms["2s_impf_pasv_subj"] = {pres_stem .. "erēris", pres_stem .. "erēre"}
	data.forms["3s_impf_pasv_subj"] = pres_stem .. "erētur"
	data.forms["1p_impf_pasv_subj"] = pres_stem .. "erēmur"
	data.forms["2p_impf_pasv_subj"] = pres_stem .. "erēminī"
	data.forms["3p_impf_pasv_subj"] = pres_stem .. "erentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = pres_stem .. "e"
	data.forms["2p_pres_actv_impr"] = pres_stem .. "ite"
	
	data.forms["2s_futr_actv_impr"] = pres_stem .. "itō"
	data.forms["3s_futr_actv_impr"] = pres_stem .. "itō"
	data.forms["2p_futr_actv_impr"] = pres_stem .. "itōte"
	data.forms["3p_futr_actv_impr"] = pres_stem .. "iuntō"
	
	data.forms["2s_pres_pasv_impr"] = pres_stem .. "ere"
	data.forms["2p_pres_pasv_impr"] = pres_stem .. "iminī"
	
	data.forms["2s_futr_pasv_impr"] = pres_stem .. "itor"
	data.forms["3s_futr_pasv_impr"] = pres_stem .. "itor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = pres_stem .. "iuntor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = pres_stem .. "ere"
	data.forms["pres_pasv_inf"] = pres_stem .. "ī"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = pres_stem .. "iēns"
	data.forms["futr_pasv_ptc"] = pres_stem .. "iendus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = pres_stem .. "iendī"
	data.forms["ger_dat"] = pres_stem .. "iendō"
	data.forms["ger_acc"] = pres_stem .. "iendum"
end

function make_pres_4th(data, pres_stem)
	-- Active imperfective indicative
	data.forms["1s_pres_actv_indc"] = pres_stem .. "iō"
	data.forms["2s_pres_actv_indc"] = pres_stem .. "īs"
	data.forms["3s_pres_actv_indc"] = pres_stem .. "it"
	data.forms["1p_pres_actv_indc"] = pres_stem .. "īmus"
	data.forms["2p_pres_actv_indc"] = pres_stem .. "ītis"
	data.forms["3p_pres_actv_indc"] = pres_stem .. "iunt"
	
	data.forms["1s_impf_actv_indc"] = pres_stem .. "iēbam"
	data.forms["2s_impf_actv_indc"] = pres_stem .. "iēbās"
	data.forms["3s_impf_actv_indc"] = pres_stem .. "iēbat"
	data.forms["1p_impf_actv_indc"] = pres_stem .. "iēbāmus"
	data.forms["2p_impf_actv_indc"] = pres_stem .. "iēbātis"
	data.forms["3p_impf_actv_indc"] = pres_stem .. "iēbant"
	
	data.forms["1s_futr_actv_indc"] = pres_stem .. "iam"
	data.forms["2s_futr_actv_indc"] = pres_stem .. "iēs"
	data.forms["3s_futr_actv_indc"] = pres_stem .. "iet"
	data.forms["1p_futr_actv_indc"] = pres_stem .. "iēmus"
	data.forms["2p_futr_actv_indc"] = pres_stem .. "iētis"
	data.forms["3p_futr_actv_indc"] = pres_stem .. "ient"
	
	-- Passive imperfective indicative
	data.forms["1s_pres_pasv_indc"] = pres_stem .. "ior"
	data.forms["2s_pres_pasv_indc"] = {pres_stem .. "īris", pres_stem .. "īre"}
	data.forms["3s_pres_pasv_indc"] = pres_stem .. "ītur"
	data.forms["1p_pres_pasv_indc"] = pres_stem .. "īmur"
	data.forms["2p_pres_pasv_indc"] = pres_stem .. "īminī"
	data.forms["3p_pres_pasv_indc"] = pres_stem .. "iuntur"
	
	data.forms["1s_impf_pasv_indc"] = pres_stem .. "iēbar"
	data.forms["2s_impf_pasv_indc"] = {pres_stem .. "iēbāris", pres_stem .. "iēbāre"}
	data.forms["3s_impf_pasv_indc"] = pres_stem .. "iēbātur"
	data.forms["1p_impf_pasv_indc"] = pres_stem .. "iēbāmur"
	data.forms["2p_impf_pasv_indc"] = pres_stem .. "iēbāminī"
	data.forms["3p_impf_pasv_indc"] = pres_stem .. "iēbantur"
	
	data.forms["1s_futr_pasv_indc"] = pres_stem .. "iar"
	data.forms["2s_futr_pasv_indc"] = {pres_stem .. "iēris", pres_stem .. "iēre"}
	data.forms["3s_futr_pasv_indc"] = pres_stem .. "iētur"
	data.forms["1p_futr_pasv_indc"] = pres_stem .. "iēmur"
	data.forms["2p_futr_pasv_indc"] = pres_stem .. "iēminī"
	data.forms["3p_futr_pasv_indc"] = pres_stem .. "ientur"
	
	-- Active imperfective subjunctive
	data.forms["1s_pres_actv_subj"] = pres_stem .. "iam"
	data.forms["2s_pres_actv_subj"] = pres_stem .. "iās"
	data.forms["3s_pres_actv_subj"] = pres_stem .. "iat"
	data.forms["1p_pres_actv_subj"] = pres_stem .. "iāmus"
	data.forms["2p_pres_actv_subj"] = pres_stem .. "iātis"
	data.forms["3p_pres_actv_subj"] = pres_stem .. "iant"
	
	data.forms["1s_impf_actv_subj"] = pres_stem .. "īrem"
	data.forms["2s_impf_actv_subj"] = pres_stem .. "īrēs"
	data.forms["3s_impf_actv_subj"] = pres_stem .. "īret"
	data.forms["1p_impf_actv_subj"] = pres_stem .. "īrēmus"
	data.forms["2p_impf_actv_subj"] = pres_stem .. "īrētis"
	data.forms["3p_impf_actv_subj"] = pres_stem .. "īrent"
	
	-- Passive imperfective subjunctive
	data.forms["1s_pres_pasv_subj"] = pres_stem .. "iar"
	data.forms["2s_pres_pasv_subj"] = {pres_stem .. "iāris", pres_stem .. "iāre"}
	data.forms["3s_pres_pasv_subj"] = pres_stem .. "iātur"
	data.forms["1p_pres_pasv_subj"] = pres_stem .. "iāmur"
	data.forms["2p_pres_pasv_subj"] = pres_stem .. "iāminī"
	data.forms["3p_pres_pasv_subj"] = pres_stem .. "iantur"
	
	data.forms["1s_impf_pasv_subj"] = pres_stem .. "īrer"
	data.forms["2s_impf_pasv_subj"] = {pres_stem .. "īrēris", pres_stem .. "īrēre"}
	data.forms["3s_impf_pasv_subj"] = pres_stem .. "īrētur"
	data.forms["1p_impf_pasv_subj"] = pres_stem .. "īrēmur"
	data.forms["2p_impf_pasv_subj"] = pres_stem .. "īrēminī"
	data.forms["3p_impf_pasv_subj"] = pres_stem .. "īrentur"
	
	-- Imperative
	data.forms["2s_pres_actv_impr"] = pres_stem .. "ī"
	data.forms["2p_pres_actv_impr"] = pres_stem .. "īte"
	
	data.forms["2s_futr_actv_impr"] = pres_stem .. "ītō"
	data.forms["3s_futr_actv_impr"] = pres_stem .. "ītō"
	data.forms["2p_futr_actv_impr"] = pres_stem .. "ītōte"
	data.forms["3p_futr_actv_impr"] = pres_stem .. "iuntō"
	
	data.forms["2s_pres_pasv_impr"] = pres_stem .. "īre"
	data.forms["2p_pres_pasv_impr"] = pres_stem .. "īminī"
	
	data.forms["2s_futr_pasv_impr"] = pres_stem .. "ītor"
	data.forms["3s_futr_pasv_impr"] = pres_stem .. "ītor"
	-- no form
	data.forms["3p_futr_pasv_impr"] = pres_stem .. "iuntor"
	
	-- Present infinitives
	data.forms["pres_actv_inf"] = pres_stem .. "īre"
	data.forms["pres_pasv_inf"] = pres_stem .. "īrī"
	
	-- Imperfective participles
	data.forms["pres_actv_ptc"] = pres_stem .. "iēns"
	data.forms["futr_pasv_ptc"] = pres_stem .. "iendus"
	
	-- Gerund
	data.forms["ger_nom"] = data.forms["pres_actv_inf"]
	data.forms["ger_gen"] = pres_stem .. "iendī"
	data.forms["ger_dat"] = pres_stem .. "iendō"
	data.forms["ger_acc"] = pres_stem .. "iendum"
end

function make_perf(data, perf_stem)
	if not perf_stem then
		return
	end
	
	-- Perfective indicative
	data.forms["1s_perf_actv_indc"] = perf_stem .. "ī"
	data.forms["2s_perf_actv_indc"] = perf_stem .. "istī"
	data.forms["3s_perf_actv_indc"] = perf_stem .. "it"
	data.forms["1p_perf_actv_indc"] = perf_stem .. "imus"
	data.forms["2p_perf_actv_indc"] = perf_stem .. "istis"
	data.forms["3p_perf_actv_indc"] = {perf_stem .. "ērunt", perf_stem .. "ēre"}
	
	data.forms["1s_plup_actv_indc"] = perf_stem .. "eram"
	data.forms["2s_plup_actv_indc"] = perf_stem .. "erās"
	data.forms["3s_plup_actv_indc"] = perf_stem .. "erat"
	data.forms["1p_plup_actv_indc"] = perf_stem .. "erāmus"
	data.forms["2p_plup_actv_indc"] = perf_stem .. "erātis"
	data.forms["3p_plup_actv_indc"] = perf_stem .. "erant"
	
	data.forms["1s_futp_actv_indc"] = perf_stem .. "erō"
	data.forms["2s_futp_actv_indc"] = perf_stem .. "eris"
	data.forms["3s_futp_actv_indc"] = perf_stem .. "erit"
	data.forms["1p_futp_actv_indc"] = perf_stem .. "erimus"
	data.forms["2p_futp_actv_indc"] = perf_stem .. "eritis"
	data.forms["3p_futp_actv_indc"] = perf_stem .. "erint"
	
	-- Perfective subjunctive
	data.forms["1s_perf_actv_subj"] = perf_stem .. "erim"
	data.forms["2s_perf_actv_subj"] = perf_stem .. "erīs"
	data.forms["3s_perf_actv_subj"] = perf_stem .. "erit"
	data.forms["1p_perf_actv_subj"] = perf_stem .. "erīmus"
	data.forms["2p_perf_actv_subj"] = perf_stem .. "erītis"
	data.forms["3p_perf_actv_subj"] = perf_stem .. "erint"
	
	data.forms["1s_plup_actv_subj"] = perf_stem .. "issem"
	data.forms["2s_plup_actv_subj"] = perf_stem .. "issēs"
	data.forms["3s_plup_actv_subj"] = perf_stem .. "isset"
	data.forms["1p_plup_actv_subj"] = perf_stem .. "issēmus"
	data.forms["2p_plup_actv_subj"] = perf_stem .. "issētis"
	data.forms["3p_plup_actv_subj"] = perf_stem .. "issent"
	
	-- Perfect infinitive
	data.forms["perf_actv_inf"] = perf_stem .. "isse"
end

function make_supine(data, supine_stem)
	if not supine_stem then
		return
	end
	
	-- Perfect/future infinitives
	if reconstructed then
		data.forms["futr_actv_inf"] = "[[" .. NAMESPACE .. ":Latin/" .. supine_stem .. "ūrus|" .. supine_stem .. "ūrus]] [[esse]]"
		data.forms["perf_pasv_inf"] = "[[" .. NAMESPACE .. ":Latin/" .. supine_stem .. "us|" .. supine_stem .. "us]] [[esse]]"
		data.forms["futr_pasv_inf"] = "[[" .. NAMESPACE .. ":Latin/" .. supine_stem .. "um|" .. supine_stem .. "um]] [[īrī]]"
	else
		data.forms["futr_actv_inf"] = "[[" .. supine_stem .. "ūrus]] [[esse]]"
		data.forms["perf_pasv_inf"] = "[[" .. supine_stem .. "us]] [[esse]]"
		data.forms["futr_pasv_inf"] = "[[" .. supine_stem .. "um]] [[īrī]]"
	end
	
	-- Perfect/future participles
	data.forms["futr_actv_ptc"] = supine_stem .. "ūrus"
	data.forms["perf_pasv_ptc"] = supine_stem .. "us"
	
	-- Exceptions
	local mortu = {["conmortu"]=true,["commortu"]=true,["dēmortu"]=true,["ēmortu"]=true,["inmortu"]=true,["immortu"]=true,["inēmortu"]=true,["intermortu"]=true,["permortu"]=true,["praemortu"]=true,["superēmortu"]=true}
	local ort = {["ort"]=true,["abort"]=true,["adort"]=true,["coort"]=true,["exort"]=true,["hort"]=true,["obort"]=true}
	if mortu[supine_stem] then
		data.forms["futr_actv_inf"] = "[["..supine_stem:gsub("mortu$","moritūrus").."]] [[esse]]"
		data.forms["futr_actv_ptc"] = supine_stem:gsub("mortu$","moritūrus")
	elseif ort[supine_stem] then
		data.forms["futr_actv_inf"] = "[["..supine_stem:gsub("ort$","oritūrus").."]] [[esse]]"
		data.forms["futr_actv_ptc"] = supine_stem:gsub("ort$","oritūrus")
	elseif supine_stem == "mortu" then
		data.forms["futr_actv_inf"] = nil
		data.forms["futr_actv_ptc"] = "moritūrus"
	end
	
	-- Supine itself
	data.forms["sup_acc"] = supine_stem .. "um"
	data.forms["sup_abl"] = supine_stem .. "ū"
end

-- Functions for generating the inflection table

function show_form(form)
	if not form then
		return "&mdash;"
	end
	
	if type(form) == "table" then
		for key, subform in ipairs(form) do
			if subform == "-" or subform == "—" or subform == "&mdash;" then
				form[key] = "&mdash;"
			elseif reconstructed and not subform:find(NAMESPACE .. ":Latin/")then
				form[key] = make_link({lang = lang, term = NAMESPACE .. ":Latin/" .. subform, alt = subform})
			else
				form[key] = make_link({lang = lang, term = subform})
			end
		end
		
		return table.concat(form, ", ")
	else
		if form == "-" or form == "—" or form == "&mdash;" then
			return "&mdash;"
		elseif reconstructed and not form:find(NAMESPACE .. ":Latin/") then
			return make_link({lang = lang, term = NAMESPACE .. ":Latin/" .. form, alt = form})
		else
			return make_link({lang = lang, term = form})
		end
	end
end

-- Make the table
function make_table(data)
	local pagename = PAGENAME
	if reconstructed then
		pagename = pagename:gsub("Latin/","")
	end
	return [=[
{| style="width: 100%; background: #EEE; border: 1px solid #AAA; font-size: 95%; text-align: center;" class="inflection-table vsSwitcher vsToggleCategory-inflection"
|-
! colspan="8" class="vsToggleElement" style="background: #CCC; text-align: left;" | &nbsp;&nbsp;&nbsp;Conjugation of ]=] .. make_link({lang = lang, alt = pagename}, "term") .. (#data.title > 0 and " (" .. table.concat(data.title, ", ") .. ")" or "") .. [=[

]=] .. make_indc_rows(data) .. make_subj_rows(data) .. make_impr_rows(data) .. make_nonfin_rows(data) .. make_vn_rows(data) .. [=[ 

|}]=].. make_footnotes(data) 

end

local tenses = {
	["pres"] = "present",
	["impf"] = "imperfect",
	["futr"] = "future",
	["perf"] = "perfect",
	["plup"] = "pluperfect",
	["futp"] = "future&nbsp;perfect",
}

local voices = {
	["actv"] = "active",
	["pasv"] = "passive",
}

--[[
local moods = {
	["indc"] = "indicative",
	["subj"] = "subjunctive",
	["impr"] = "imperative",
}
--]]

local nonfins = {
	["inf"] = "infinitives",
	["ptc"] = "participles",
}

--[[
local verbalnouns = {
	["ger"] = "gerund",
	["sup"] = "supine",
}
--]]

--[[
local cases = {
	["nom"] = "nominative",
	["gen"] = "genitive",
	["dat"] = "dative",
	["acc"] = "accusative",
	["abl"] = "ablative",
}
--]]

function make_indc_rows(data)
	local indc = {}
	
	for _, v in ipairs({"actv", "pasv"}) do
		local group = {}
		local nonempty = false
		
		for _, t in ipairs({"pres", "impf", "futr", "perf", "plup", "futp"}) do
			local row = {}
			local notempty = false
			
			if data.forms[t .. "_" .. v .. "_indc"] then
				row = "\n! colspan=\"6\" style=\"background: #CCC\" |" .. data.forms[t .. "_" .. v .. "_indc"]
				nonempty = true
				notempty = true
			else
				for col, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					local form = p .. "_" .. t .. "_" .. v .. "_indc"
					row[col] = "\n| " .. show_form(data.forms[form])..(data.form_footnote_indices[form]==nil and "" or '<sup style="color: red">'..data.form_footnote_indices[form].."</sup>")
					
					if data.forms[p .. "_" .. t .. "_" .. v .. "_indc"] then
						nonempty = true
						notempty = true
					end
				end
				
				row = table.concat(row)
			end
			
			if notempty then
				table.insert(group, "\n! style=\"background:#c0cfe4\" | " .. tenses[t] .. row)
			end
		end
		
		if nonempty and #group > 0 then
			table.insert(indc, "\n|- class=\"vsHide\"\n! rowspan=\"" .. tostring(#group) .. "\" style=\"background:#c0cfe4\" | " .. voices[v] .. "\n" .. table.concat(group, "\n|- class=\"vsHide\""))
		end
	end
	
	return
[=[

|- class="vsHide"
! colspan="2" rowspan="2" style="background:#c0cfe4" | indicative
! colspan="3" style="background:#c0cfe4" | ''singular''
! colspan="3" style="background:#c0cfe4" | ''plural''
|- class="vsHide"
! style="background:#c0cfe4;width:12.5%" | [[first person|first]]
! style="background:#c0cfe4;width:12.5%" | [[second person|second]]
! style="background:#c0cfe4;width:12.5%" | [[third person|third]]
! style="background:#c0cfe4;width:12.5%" | [[first person|first]]
! style="background:#c0cfe4;width:12.5%" | [[second person|second]]
! style="background:#c0cfe4;width:12.5%" | [[third person|third]]
]=] .. table.concat(indc)

end

function make_subj_rows(data)
	local subj = {}
	
	for _, v in ipairs({"actv", "pasv"}) do
		local group = {}
		local nonempty = false
		
		for _, t in ipairs({"pres", "impf", "perf", "plup"}) do
			local row = {}
			local notempty = false
			
			if data.forms[t .. "_" .. v .. "_subj"] then
				row = "\n! colspan=\"6\" style=\"background: #CCC\" |" .. data.forms[t .. "_" .. v .. "_subj"]
				nonempty = true
				notempty = true
			else
				for col, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					local form = p .. "_" .. t .. "_" .. v .. "_subj"
					row[col] = "\n| " .. show_form(data.forms[form])..(data.form_footnote_indices[form]==nil and "" or '<sup style="color: red">'..data.form_footnote_indices[form].."</sup>")
					
					if data.forms[p .. "_" .. t .. "_" .. v .. "_subj"] then
						nonempty = true
						notempty = true
					end
				end
				
				row = table.concat(row)
			end
			
			if notempty then
				table.insert(group, "\n! style=\"background:#c0e4c0\" | " .. tenses[t] .. row)
			end
		end
		
		if nonempty and #group > 0 then
			table.insert(subj, "\n|- class=\"vsHide\"\n! rowspan=\"" .. tostring(#group) .. "\" style=\"background:#c0e4c0\" | " .. voices[v] .. "\n" .. table.concat(group, "\n|- class=\"vsHide\""))
		end
	end
	
	return
[=[

|- class="vsHide"
! colspan="2" rowspan="2" style="background:#c0e4c0" | subjunctive
! colspan="3" style="background:#c0e4c0" | ''singular''
! colspan="3" style="background:#c0e4c0" | ''plural''
|- class="vsHide"
! style="background:#c0e4c0;width:12.5%" | [[first person|first]]
! style="background:#c0e4c0;width:12.5%" | [[second person|second]]
! style="background:#c0e4c0;width:12.5%" | [[third person|third]]
! style="background:#c0e4c0;width:12.5%" | [[first person|first]]
! style="background:#c0e4c0;width:12.5%" | [[second person|second]]
! style="background:#c0e4c0;width:12.5%" | [[third person|third]]
]=] .. table.concat(subj)

end

function make_impr_rows(data)
	local impr = {}
	local has_impr = false

	for _, v in ipairs({"actv", "pasv"}) do
		local group = {}
		local nonempty = false
		
		for _, t in ipairs({"pres", "futr"}) do
			local row = {}
			
			if data.forms[t .. "_" .. v .. "_impr"] then
				row = "\n! colspan=\"6\" style=\"background: #CCC\" |" .. data.forms[t .. "_" .. v .. "_impr"]
				nonempty = true
			else
				for col, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					row[col] = "\n| " .. show_form(data.forms[p .. "_" .. t .. "_" .. v .. "_impr"])
					
					if data.forms[p .. "_" .. t .. "_" .. v .. "_impr"] then
						nonempty = true
					end
				end
				
				row = table.concat(row)
			end
			
			table.insert(group, "\n! style=\"background:#e4d4c0\" | " .. tenses[t] .. row)
		end
		
		if nonempty and #group > 0 then
			has_impr = true
			table.insert(impr, "\n|- class=\"vsHide\"\n! rowspan=\"" .. tostring(#group) .. "\" style=\"background:#e4d4c0\" | " .. voices[v] .. "\n" .. table.concat(group, "\n|- class=\"vsHide\""))
		end
	end

	if not has_impr then
		return ""
	end
	return
[=[

|- class="vsHide"
! colspan="2" rowspan="2" style="background:#e4d4c0" | imperative
! colspan="3" style="background:#e4d4c0" | ''singular''
! colspan="3" style="background:#e4d4c0" | ''plural''
|- class="vsHide"
! style="background:#e4d4c0;width:12.5%" | [[first person|first]]
! style="background:#e4d4c0;width:12.5%" | [[second person|second]]
! style="background:#e4d4c0;width:12.5%" | [[third person|third]]
! style="background:#e4d4c0;width:12.5%" | [[first person|first]]
! style="background:#e4d4c0;width:12.5%" | [[second person|second]]
! style="background:#e4d4c0;width:12.5%" | [[third person|third]]
]=] .. table.concat(impr)
end

function make_nonfin_rows(data)
	local nonfin = {}
	
	for _, f in ipairs({"inf", "ptc"}) do
		local row = {}
		
		for col, t in ipairs({"pres_actv", "perf_actv", "futr_actv", "pres_pasv", "perf_pasv", "futr_pasv"}) do
			--row[col] = "\n| " .. show_form(data.forms[t .. "_" .. f])
			local form = t .. "_" .. f
			row[col] = "\n| " .. show_form(data.forms[form])..(data.form_footnote_indices[form]==nil and "" or '<sup style="color: red">'..data.form_footnote_indices[form].."</sup>")
			
		end
		
		row = table.concat(row)
		table.insert(nonfin, "\n|- class=\"vsHide\"\n! style=\"background:#e2e4c0\" colspan=\"2\" | " .. nonfins[f] .. row)
	end
	
	return
[=[

|- class="vsHide"
! colspan="2" rowspan="2" style="background:#e2e4c0" | non-finite forms
! colspan="3" style="background:#e2e4c0" | active
! colspan="3" style="background:#e2e4c0" | passive
|- class="vsHide"
! style="background:#e2e4c0;width:12.5%" | present
! style="background:#e2e4c0;width:12.5%" | perfect
! style="background:#e2e4c0;width:12.5%" | future
! style="background:#e2e4c0;width:12.5%" | present
! style="background:#e2e4c0;width:12.5%" | perfect
! style="background:#e2e4c0;width:12.5%" | future
]=] .. table.concat(nonfin)

end

function make_vn_rows(data)
	local vn = {}
	local has_vn = false
	
	local row = {}
		
	for col, n in ipairs({"ger_nom", "ger_gen", "ger_dat", "ger_acc", "sup_acc", "sup_abl"}) do
		if data.forms[n] then
			has_vn = true
		end
		row[col] = "\n| " .. show_form(data.forms[n])..(data.form_footnote_indices[n]==nil and "" or '<sup style="color: red">'..data.form_footnote_indices[n].."</sup>")
	end	
		
	row = table.concat(row)
		
	if has_vn then
		table.insert(vn, "\n|- class=\"vsHide\"" .. row)
	end

	if not has_vn then
		return ""
	end
	return
[=[

|- class="vsHide"
! colspan="2" rowspan="3" style="background:#e0e0b0" | verbal nouns
! colspan="4" style="background:#e0e0b0" | gerund
! colspan="2" style="background:#e0e0b0" | supine
|- class="vsHide"
! style="background:#e0e0b0;width:12.5%" | nominative
! style="background:#e0e0b0;width:12.5%" | genitive
! style="background:#e0e0b0;width:12.5%" | dative/ablative
! style="background:#e0e0b0;width:12.5%" | accusative
! style="background:#e0e0b0;width:12.5%" | accusative
! style="background:#e0e0b0;width:12.5%" | ablative]=] .. table.concat(vn)

end

function make_footnotes(data)
	local tbl = {}
	local i = 0
	for k,v in pairs(data.footnotes) do
		i = i + 1
		tbl[i] = '<sup style="color: red">'..tostring(k)..'</sup>'..v..'<br>' end
	return table.concat(tbl)
end

function override(data, args)
	for _, v in ipairs({"actv", "pasv"}) do
		for _, t in ipairs({"pres", "impf", "futr", "perf", "plup", "futp"}) do
			if args[t .. "_" .. v .. "_indc"] then
				data.forms[t .. "_" .. v .. "_indc"] = args[t .. "_" .. v .. "_indc"] and show_form(mw.text.split(args[t .. "_" .. v .. "_indc"],"/")) or data.forms[t .. "_" .. v .. "_indc"]
			else
				for _, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					data.forms[p .. "_" .. t .. "_" .. v .. "_indc"] = args[p .. "_" .. t .. "_" .. v .. "_indc"] and show_form(mw.text.split(args[p .. "_" .. t .. "_" .. v .. "_indc"],"/")) or data.forms[p .. "_" .. t .. "_" .. v .. "_indc"]
				end
			end
		end
		for _, t in ipairs({"pres", "impf", "perf", "plup"}) do
			if data.forms[t .. "_" .. v .. "_subj"] then
				data.forms[t .. "_" .. v .. "_subj"] = args[t .. "_" .. v .. "_subj"] and show_form(mw.text.split(args[t .. "_" .. v .. "_subj"],"/")) or data.forms[t .. "_" .. v .. "_subj"]
			else
				for _, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					data.forms[p .. "_" .. t .. "_" .. v .. "_subj"] = args[p .. "_" .. t .. "_" .. v .. "_subj"] and show_form(mw.text.split(args[p .. "_" .. t .. "_" .. v .. "_subj"],"/")) or data.forms[p .. "_" .. t .. "_" .. v .. "_subj"]
				end
			end
		end
		for _, t in ipairs({"pres", "futr"}) do
			if data.forms[t .. "_" .. v .. "_impr"] then
				data.forms[t .. "_" .. v .. "_impr"] = args[t .. "_" .. v .. "_impr"] and show_form(mw.text.split(args[t .. "_" .. v .. "_impr"],"/")) or data.forms[t .. "_" .. v .. "_impr"]
			else
				for _, p in ipairs({"1s", "2s", "3s", "1p", "2p", "3p"}) do
					data.forms[p .. "_" .. t .. "_" .. v .. "_impr"] = args[p .. "_" .. t .. "_" .. v .. "_impr"] and show_form(mw.text.split(args[p .. "_" .. t .. "_" .. v .. "_impr"],"/")) or data.forms[p .. "_" .. t .. "_" .. v .. "_impr"]
				end
			end
		end
	end
	for _, f in ipairs({"inf", "ptc"}) do
		for _, t in ipairs({"pres_actv", "perf_actv", "futr_actv", "pres_pasv", "perf_pasv", "futr_pasv"}) do
			data.forms[t .. "_" .. f] = args[t .. "_" .. f] and show_form(mw.text.split(args[t .. "_" .. f],"/")) or data.forms[t .. "_" .. f]
		end
	end
	for _, n in ipairs({"ger_nom", "ger_gen", "ger_dat", "ger_acc", "sup_acc", "sup_abl"}) do
		data.forms[n] = args[n] and show_form(mw.text.split(args[n],"/")) or data.forms[n]
	end	
end

function checkexist(data)
	if NAMESPACE ~= '' then return end
	for _, conjugation in pairs(data.forms) do
		if conjugation and type(conjugation) == 'string' and not conjugation:find(" ") then
			local title = lang:makeEntryName(conjugation)
			local t = mw.title.new(title)
			if t and not t.exists then
				table.insert(data.categories,'Latin verbs with red links in their conjugation tables')
			end
		end
	end
end

function checkirregular(args,data)
	local apocopic = mw.ustring.sub(args[1],1,-2)
	apocopic = mw.ustring.gsub(apocopic,'[^aeiouyāēīōūȳ]+$','')
	if args[1] and args[2] and not mw.ustring.find(args[2],'^'..apocopic) then
		table.insert(data.categories,'Latin stem-changing verbs')
	end
end







-- functions for creating external search hyperlinks

function flatten_values(T)
	function noaccents(x)
		return mw.ustring.gsub(mw.ustring.toNFD(x),'[^%w]+',"")	
	end
	function cleanup(x) 
		return noaccents(string.gsub(string.gsub(string.gsub(x, '%[', ''), '%]', ''), ' ', '+'))
	end
		local tbl = {}
	for _, v in pairs(T) do
		if type(v) == "table" then 
			local FT = flatten_values(v)
			for _, V in pairs(FT) do
				tbl[#tbl+1] = cleanup(V)
			end
		else
			if string.find(v, '<') == nil then
				tbl[#tbl+1] = cleanup(v)
			end
		end
	end
	return tbl
end

function link_google_books(verb, forms, domain)
	function partition_XS_into_N(XS, N) 
		local count = 0
		local mensae = {}
		for _, v in pairs(XS) do
			if count % N == 0 then mensae[#mensae+1] = {} end
			count = count + 1
			mensae[#mensae][#(mensae[#mensae])+1] = v end
		return mensae end
	function forms_N_to_link(fs, N, args, site)
		return '[https://www.google.com/search?'..args..'&q='..site..'+%22'.. table.concat(fs, "%22+OR+%22") ..'%22 '..N..']' end
	function make_links_txt(fs, N, site)
		local args = site == "Books" and "tbm=bks&lr=lang_la" or ""
		local links = {}
		for k,v in pairs(partition_XS_into_N(fs, N)) do
			links[#links+1] = forms_N_to_link(v,k,args,site=="Books" and "" or site) end
		return table.concat(links, ' - ') end
	return "Google "..domain.." forms of "..verb.." : "..make_links_txt(forms, 30, domain)
end

return export