--- @since 25.5.28

local FILES = {
	[".envrc"] = "text/plain",
	[".gitconfig"] = "text/plain",
	[".gitignore"] = "text/plain",
	[".luacheckrc"] = "text/lua",
	[".npmrc"] = "text/plain",
	[".styluaignore"] = "text/plain",
	[".zshenv"] = "text/plain",
	[".zshrc"] = "text/plain",
	["cargo.lock"] = "application/json",
	["flake.lock"] = "application/json",
	license = "text/plain",
}

local EXTS = {
	["123"] = "application/lotus-1-2-3",
	["3dml"] = "text/in3d.3dml",
	["3ds"] = "image/3ds",
	["3g2"] = "video/3gpp2",
	["3gp"] = "video/3gpp",
	["7z"] = "application/7z-compressed",
	["for"] = "text/fortran",
	["in"] = "text/plain",
	["n-gage"] = "application/nokia.n-gage.symbian.install",
	["sfd-hdstx"] = "application/hydrostatix.sof-data",
	aab = "application/authorware-bin",
	aac = "audio/aac",
	aam = "application/authorware-map",
	aas = "application/authorware-seg",
	abw = "application/abiword",
	ac = "application/pkix-attr-cert",
	acc = "application/americandynamics.acc",
	ace = "application/ace-compressed",
	acu = "application/acucobol",
	acutc = "application/acucorp",
	adp = "audio/adpcm",
	aep = "application/audiograph",
	afm = "application/font-type1",
	afp = "application/ibm.modcap",
	ahead = "application/ahead.space",
	ai = "application/postscript",
	aif = "audio/aiff",
	aifc = "audio/aiff",
	aiff = "audio/aiff",
	air = "application/adobe.air-application-installer-package+zip",
	ait = "application/dvb.ait",
	ami = "application/amiga.ami",
	apk = "application/android.package-archive",
	appcache = "text/cache-manifest",
	application = "application/ms-application",
	apr = "application/lotus-approach",
	arc = "application/freearc",
	asc = "application/pgp-signature",
	asf = "video/ms-asf",
	asm = "text/asm",
	aso = "application/accpac.simply.aso",
	ass = "text/ass",
	asx = "video/ms-asf",
	atc = "application/acucorp",
	atom = "application/atom+xml",
	atomcat = "application/atomcat+xml",
	atomsvc = "application/atomsvc+xml",
	atx = "application/antix.game-component",
	au = "audio/basic",
	avi = "video/msvideo",
	avif = "image/avif",
	aw = "application/applixware",
	azf = "application/airzip.filesecure.azf",
	azs = "application/airzip.filesecure.azs",
	azw = "application/amazon.ebook",
	bash = "text/shellscript",
	bat = "application/msdownload",
	bcpio = "application/bcpio",
	bdf = "application/font-bdf",
	bdm = "application/syncml.dm+wbxml",
	bean = "text/plain",
	beancount = "text/plain",
	bed = "application/realvnc.bed",
	bh2 = "application/fujitsu.oasysprs",
	bin = "application/octet-stream",
	blb = "application/blorb",
	blorb = "application/blorb",
	bmi = "application/bmi",
	bmp = "image/bmp",
	book = "application/framemaker",
	box = "application/previewsystems.box",
	boz = "application/bzip2",
	bpk = "application/octet-stream",
	btif = "image/prs.btif",
	bz = "application/bzip",
	bz2 = "application/bzip2",
	c = "text/c",
	c11amc = "application/cluetrust.cartomobile-config",
	c11amz = "application/cluetrust.cartomobile-config-pkg",
	c4d = "application/clonk.c4group",
	c4f = "application/clonk.c4group",
	c4g = "application/clonk.c4group",
	c4p = "application/clonk.c4group",
	c4u = "application/clonk.c4group",
	cab = "application/ms-cab-compressed",
	caf = "audio/caf",
	cap = "application/tcpdump.pcap",
	car = "application/curl.car",
	cat = "application/ms-pki.seccat",
	cb7 = "application/cbr",
	cba = "application/cbr",
	cbr = "application/cbr",
	cbt = "application/cbr",
	cbz = "application/cbr",
	cc = "text/c",
	cct = "application/director",
	ccxml = "application/ccxml+xml",
	cdbcmsg = "application/contact.cmsg",
	cdf = "application/netcdf",
	cdkey = "application/mediastation.cdkey",
	cdmia = "application/cdmi-capability",
	cdmic = "application/cdmi-container",
	cdmid = "application/cdmi-domain",
	cdmio = "application/cdmi-object",
	cdmiq = "application/cdmi-queue",
	cdx = "chemical/cdx",
	cdxml = "application/chemdraw+xml",
	cdy = "application/cinderella",
	cer = "application/pkix-cert",
	cfg = "text/plain",
	cfs = "application/cfs-compressed",
	cgm = "image/cgm",
	chat = "application/chat",
	chm = "application/ms-htmlhelp",
	chrt = "application/kde.kchart",
	cif = "chemical/cif",
	cii = "application/anser-web-certificate-issue-initiation",
	cil = "application/ms-artgalry",
	cla = "application/claymore",
	class = "application/java-vm",
	clkk = "application/crick.clicker.keyboard",
	clkp = "application/crick.clicker.palette",
	clkt = "application/crick.clicker.template",
	clkw = "application/crick.clicker.wordbank",
	clkx = "application/crick.clicker",
	clp = "application/msclip",
	cmc = "application/cosmocaller",
	cmdf = "chemical/cmdf",
	cml = "chemical/cml",
	cmp = "application/yellowriver-custom-menu",
	cmx = "image/cmx",
	cod = "application/rim.cod",
	com = "application/msdownload",
	conf = "text/plain",
	cpio = "application/cpio",
	cpp = "text/c",
	cpt = "application/mac-compactpro",
	crd = "application/mscardfile",
	crl = "application/pkix-crl",
	crt = "application/x509-ca-cert",
	cryptonote = "application/rig.cryptonote",
	csh = "application/csh",
	csml = "chemical/csml",
	csp = "application/commonspace",
	css = "text/css",
	cst = "application/director",
	csv = "text/csv",
	cu = "application/cu-seeme",
	curl = "text/curl",
	cww = "application/prs.cww",
	cxt = "application/director",
	cxx = "text/c",
	dae = "model/collada+xml",
	daf = "application/mobius.daf",
	dart = "application/dart",
	dataless = "application/fdsn.seed",
	davmount = "application/davmount+xml",
	dbk = "application/docbook+xml",
	dcr = "application/director",
	dcurl = "text/curl.dcurl",
	dd2 = "application/oma.dd2+xml",
	ddd = "application/fujixerox.ddd",
	deb = "application/debian-package",
	def = "text/plain",
	deploy = "application/octet-stream",
	der = "application/x509-ca-cert",
	dfac = "application/dreamfactory",
	dgc = "application/dgc-compressed",
	dic = "text/c",
	dir = "application/director",
	dis = "application/mobius.dis",
	dist = "application/octet-stream",
	distz = "application/octet-stream",
	djv = "image/djvu",
	djvu = "image/djvu",
	dll = "application/msdownload",
	dmg = "application/apple-diskimage",
	dmp = "application/tcpdump.pcap",
	dms = "application/octet-stream",
	dna = "application/dna",
	doc = "application/msword",
	docm = "application/ms-word.document.macroenabled.12",
	docx = "application/openxmlformats-officedocument.wordprocessingml.document",
	dot = "application/msword",
	dotm = "application/ms-word.template.macroenabled.12",
	dotx = "application/openxmlformats-officedocument.wordprocessingml.template",
	dp = "application/osgi.dp",
	dpg = "application/dpgraph",
	dra = "audio/dra",
	dsc = "text/prs.lines.tag",
	dssc = "application/dssc+der",
	dtb = "application/dtbook+xml",
	dtd = "application/xml-dtd",
	dts = "audio/dts",
	dtshd = "audio/dts.hd",
	dump = "application/octet-stream",
	dvb = "video/dvb.file",
	dvi = "application/dvi",
	dwf = "model/dwf",
	dwg = "image/dwg",
	dxf = "image/dxf",
	dxp = "application/spotfire.dxp",
	dxr = "application/director",
	ebuild = "application/gentoo.ebuild",
	ecelp4800 = "audio/nuera.ecelp4800",
	ecelp7470 = "audio/nuera.ecelp7470",
	ecelp9600 = "audio/nuera.ecelp9600",
	eclass = "application/gentoo.eclass",
	ecma = "application/ecmascript",
	edm = "application/novadigm.edm",
	edx = "application/novadigm.edx",
	efif = "application/picsel",
	ei6 = "application/pg.osasli",
	elc = "application/octet-stream",
	emf = "application/msmetafile",
	eml = "message/rfc822",
	emma = "application/emma+xml",
	emz = "application/msmetafile",
	env = "text/plain",
	eol = "audio/digital-winds",
	eot = "application/ms-fontobject",
	eps = "application/postscript",
	epub = "application/epub+zip",
	es3 = "application/eszigno3+xml",
	esa = "application/osgi.subsystem",
	esf = "application/epson.esf",
	et3 = "application/eszigno3+xml",
	etx = "text/setext",
	eva = "application/eva",
	evy = "application/envoy",
	exe = "application/msdownload",
	exi = "application/exi",
	ext = "application/novadigm.ext",
	ez = "application/andrew-inset",
	ez2 = "application/ezpix-album",
	ez3 = "application/ezpix-package",
	f = "text/fortran",
	f4v = "video/f4v",
	f77 = "text/fortran",
	f90 = "text/fortran",
	fbs = "image/fastbidsheet",
	fcdt = "application/adobe.formscentral.fcdt",
	fcs = "application/isac.fcs",
	fdf = "application/fdf",
	fe_launch = "application/denovo.fcselayout-link",
	fg5 = "application/fujitsu.oasysgp",
	fgd = "application/director",
	fh = "image/freehand",
	fh4 = "image/freehand",
	fh5 = "image/freehand",
	fh7 = "image/freehand",
	fhc = "image/freehand",
	fig = "application/xfig",
	fish = "text/shellscript",
	flac = "audio/flac",
	fli = "video/fli",
	flo = "application/micrografx.flo",
	flv = "video/flv",
	flw = "application/kde.kivio",
	flx = "text/fmi.flexstor",
	fly = "text/fly",
	fm = "application/framemaker",
	fnc = "application/frogans.fnc",
	fpx = "image/fpx",
	frame = "application/framemaker",
	fsc = "application/fsc.weblaunch",
	fst = "image/fst",
	ftc = "application/fluxtime.clip",
	fti = "application/anser-web-funds-transfer-initiation",
	fvt = "video/fvt",
	fxp = "application/adobe.fxp",
	fxpl = "application/adobe.fxp",
	fzs = "application/fuzzysheet",
	g2w = "application/geoplan",
	g3 = "image/g3fax",
	g3w = "application/geospace",
	gac = "application/groove-account",
	gam = "application/tads",
	gbr = "application/rpki-ghostbusters",
	gca = "application/gca-compressed",
	gdl = "model/gdl",
	geo = "application/dynageo",
	gex = "application/geometry-explorer",
	ggb = "application/geogebra.file",
	ggs = "application/geogebra.slides",
	ggt = "application/geogebra.tool",
	ghf = "application/groove-help",
	gif = "image/gif",
	gim = "application/groove-identity-message",
	gml = "application/gml+xml",
	gmx = "application/gmx",
	gnumeric = "application/gnumeric",
	go = "text/go",
	gph = "application/flographit",
	gpx = "application/gpx+xml",
	gqf = "application/grafeq",
	gqs = "application/grafeq",
	gram = "application/srgs",
	gramps = "application/gramps-xml",
	gre = "application/geometry-explorer",
	grv = "application/groove-injector",
	grxml = "application/srgs+xml",
	gsf = "application/font-ghostscript",
	gtar = "application/gtar",
	gtm = "application/groove-tool-message",
	gtw = "model/gtw",
	gv = "text/graphviz",
	gxf = "application/gxf",
	gxt = "application/geonext",
	h = "text/c",
	h261 = "video/h261",
	h263 = "video/h263",
	h264 = "video/h264",
	hal = "application/hal+xml",
	hbci = "application/hbci",
	hcl = "text/hcl",
	hdf = "application/hdf",
	hh = "text/c",
	hlp = "application/winhlp",
	hpgl = "application/hp-hpgl",
	hpid = "application/hp-hpid",
	hpp = "text/c",
	hps = "application/hp-hps",
	hqx = "application/mac-binhex40",
	htke = "application/kenameaapp",
	htm = "text/html",
	html = "text/html",
	hvd = "application/yamaha.hv-dic",
	hvp = "application/yamaha.hv-voice",
	hvs = "application/yamaha.hv-script",
	i2g = "application/intergeo",
	icc = "application/iccprofile",
	ice = "conference/cooltalk",
	icm = "application/iccprofile",
	ico = "image/icon",
	ics = "text/calendar",
	ief = "image/ief",
	ifb = "text/calendar",
	ifm = "application/shana.informed.formdata",
	iges = "model/iges",
	igl = "application/igloader",
	igm = "application/insors.igm",
	igs = "model/iges",
	igx = "application/micrografx.igx",
	iif = "application/shana.informed.interchange",
	imp = "application/accpac.simply.imp",
	ims = "application/ms-ims",
	ini = "text/plain",
	ink = "application/inkml+xml",
	inkml = "application/inkml+xml",
	install = "application/install-instructions",
	iota = "application/astraea-software.iota",
	ipfix = "application/ipfix",
	ipk = "application/shana.informed.package",
	irm = "application/ibm.rights-management",
	irp = "application/irepository.package+xml",
	iso = "application/iso9660-image",
	itp = "application/shana.informed.formtemplate",
	ivp = "application/immervision-ivp",
	ivu = "application/immervision-ivu",
	jad = "text/sun.j2me.app-descriptor",
	jam = "application/jam",
	jar = "application/java-archive",
	java = "text/java-source",
	jisp = "application/jisp",
	jlt = "application/hp-jlyt",
	jnlp = "application/java-jnlp-file",
	joda = "application/joost.joda-archive",
	jpe = "image/jpeg",
	jpeg = "image/jpeg",
	jpg = "image/jpeg",
	jpgm = "video/jpm",
	jpgv = "video/jpeg",
	jpm = "video/jpm",
	js = "text/javascript",
	json = "application/json",
	jsonc = "application/json",
	jsonml = "application/jsonml+json",
	jsx = "text/jsx",
	jxl = "image/jxl",
	kar = "audio/midi",
	karbon = "application/kde.karbon",
	kfo = "application/kde.kformula",
	kia = "application/kidspiration",
	kml = "application/google-earth.kml+xml",
	kmz = "application/google-earth.kmz",
	kne = "application/kinar",
	knp = "application/kinar",
	kon = "application/kde.kontour",
	kpr = "application/kde.kpresenter",
	kpt = "application/kde.kpresenter",
	kpxx = "application/ds-keypoint",
	ksp = "application/kde.kspread",
	ktr = "application/kahootz",
	ktx = "image/ktx",
	ktz = "application/kahootz",
	kwd = "application/kde.kword",
	kwt = "application/kde.kword",
	lasxml = "application/las.las+xml",
	latex = "application/latex",
	lbd = "application/llamagraphics.life-balance.desktop",
	lbe = "application/llamagraphics.life-balance.exchange+xml",
	les = "application/hhe.lesson-player",
	lha = "application/lzh-compressed",
	link66 = "application/route66.link66+xml",
	list = "text/plain",
	list3820 = "application/ibm.modcap",
	listafp = "application/ibm.modcap",
	lnk = "application/ms-shortcut",
	log = "text/plain",
	lostxml = "application/lost+xml",
	lrf = "application/octet-stream",
	lrm = "application/ms-lrm",
	ltf = "application/frogans.ltf",
	lua = "text/lua",
	lvp = "audio/lucent.voice",
	lwp = "application/lotus-wordpro",
	lzh = "application/lzh-compressed",
	m13 = "application/msmediaview",
	m14 = "application/msmediaview",
	m1v = "video/mpeg",
	m21 = "application/mp21",
	m2a = "audio/mpeg",
	m2t = "video/mp2t",
	m2ts = "video/mp2t",
	m2v = "video/mpeg",
	m3a = "audio/mpeg",
	m3u = "audio/mpegurl",
	m3u8 = "application/apple.mpegurl",
	m4a = "audio/mp4",
	m4u = "video/mpegurl",
	m4v = "video/m4v",
	ma = "application/mathematica",
	mads = "application/mads+xml",
	mag = "application/ecowin.chart",
	maker = "application/framemaker",
	man = "text/troff",
	mar = "application/octet-stream",
	mathml = "application/mathml+xml",
	mb = "application/mathematica",
	mbk = "application/mobius.mbk",
	mbox = "application/mbox",
	mc1 = "application/medcalcdata",
	mcd = "application/mcd",
	mcurl = "text/curl.mcurl",
	md = "text/markdown",
	mdb = "application/msaccess",
	mdi = "image/ms-modi",
	me = "text/troff",
	mesh = "model/mesh",
	meta4 = "application/metalink4+xml",
	metalink = "application/metalink+xml",
	mets = "application/mets+xml",
	mfm = "application/mfmp",
	mft = "application/rpki-manifest",
	mgp = "application/osgeo.mapguide.package",
	mgz = "application/proteus.magazine",
	mid = "audio/midi",
	midi = "audio/midi",
	mie = "application/mie",
	mif = "application/mif",
	mime = "message/rfc822",
	mj2 = "video/mj2",
	mjp2 = "video/mj2",
	mjs = "text/javascript",
	mk3d = "video/matroska",
	mka = "audio/matroska",
	mks = "video/matroska",
	mkv = "video/matroska",
	mlp = "application/dolby.mlp",
	mmd = "application/chipnuts.karaoke-mmd",
	mmf = "application/smaf",
	mmr = "image/fujixerox.edmics-mmr",
	mng = "video/mng",
	mny = "application/msmoney",
	mobi = "application/mobipocket-ebook",
	mods = "application/mods+xml",
	mov = "video/quicktime",
	movie = "video/sgi-movie",
	mp2 = "audio/mpeg",
	mp21 = "application/mp21",
	mp2a = "audio/mpeg",
	mp3 = "audio/mpeg",
	mp4 = "video/mp4",
	mp4a = "audio/mp4",
	mp4s = "application/mp4",
	mp4v = "video/mp4",
	mpc = "application/mophun.certificate",
	mpe = "video/mpeg",
	mpeg = "video/mpeg",
	mpg = "video/mpeg",
	mpg4 = "video/mp4",
	mpga = "audio/mpeg",
	mpkg = "application/apple.installer+xml",
	mpm = "application/blueice.multipass",
	mpn = "application/mophun.application",
	mpp = "application/ms-project",
	mpt = "application/ms-project",
	mpy = "application/ibm.minipay",
	mqy = "application/mobius.mqy",
	mrc = "application/marc",
	mrcx = "application/marcxml+xml",
	ms = "text/troff",
	mscml = "application/mediaservercontrol+xml",
	mseed = "application/fdsn.mseed",
	mseq = "application/mseq",
	msf = "application/epson.msf",
	msh = "model/mesh",
	msi = "application/msdownload",
	msl = "application/mobius.msl",
	msty = "application/muvee.style",
	mts = "video/mp2t",
	mus = "application/musician",
	musicxml = "application/recordare.musicxml+xml",
	mvb = "application/msmediaview",
	mwf = "application/mfer",
	mxf = "application/mxf",
	mxl = "application/recordare.musicxml",
	mxml = "application/xv+xml",
	mxs = "application/triscape.mxs",
	mxu = "video/mpegurl",
	n3 = "text/n3",
	nb = "application/mathematica",
	nbp = "application/wolfram.player",
	nc = "application/netcdf",
	ncx = "application/dtbncx+xml",
	nfo = "text/nfo",
	ngdat = "application/nokia.n-gage.data",
	nitf = "application/nitf",
	nix = "text/nix",
	nlu = "application/neurolanguage.nlu",
	nml = "application/enliven",
	nnd = "application/noblenet-directory",
	nns = "application/noblenet-sealer",
	nnw = "application/noblenet-web",
	npx = "image/net-fpx",
	nsc = "application/conference",
	nsf = "application/lotus-notes",
	ntf = "application/nitf",
	nzb = "application/nzb",
	oa2 = "application/fujitsu.oasys2",
	oa3 = "application/fujitsu.oasys3",
	oas = "application/fujitsu.oasys",
	obd = "application/msbinder",
	obj = "application/tgif",
	oda = "application/oda",
	odb = "application/oasis.opendocument.database",
	odc = "application/oasis.opendocument.chart",
	odf = "application/oasis.opendocument.formula",
	odft = "application/oasis.opendocument.formula-template",
	odg = "application/oasis.opendocument.graphics",
	odi = "application/oasis.opendocument.image",
	odm = "application/oasis.opendocument.text-master",
	odp = "application/oasis.opendocument.presentation",
	ods = "application/oasis.opendocument.spreadsheet",
	odt = "application/oasis.opendocument.text",
	oga = "audio/ogg",
	ogg = "audio/ogg",
	ogv = "video/ogg",
	ogx = "application/ogg",
	omdoc = "application/omdoc+xml",
	onepkg = "application/onenote",
	onetmp = "application/onenote",
	onetoc = "application/onenote",
	onetoc2 = "application/onenote",
	opf = "application/oebps-package+xml",
	opml = "text/opml",
	oprc = "application/palm",
	opus = "audio/ogg",
	org = "application/lotus-organizer",
	osf = "application/yamaha.openscoreformat",
	osfpvg = "application/yamaha.openscoreformat.osfpvg+xml",
	otc = "application/oasis.opendocument.chart-template",
	otf = "font/otf",
	otg = "application/oasis.opendocument.graphics-template",
	oth = "application/oasis.opendocument.text-web",
	oti = "application/oasis.opendocument.image-template",
	otp = "application/oasis.opendocument.presentation-template",
	ots = "application/oasis.opendocument.spreadsheet-template",
	ott = "application/oasis.opendocument.text-template",
	oxps = "application/oxps",
	oxt = "application/openofficeorg.extension",
	p = "text/pascal",
	p10 = "application/pkcs10",
	p12 = "application/pkcs12",
	p7b = "application/pkcs7-certificates",
	p7c = "application/pkcs7-mime",
	p7m = "application/pkcs7-mime",
	p7r = "application/pkcs7-certreqresp",
	p7s = "application/pkcs7-signature",
	p8 = "application/pkcs8",
	pas = "text/pascal",
	patch = "text/diff",
	paw = "application/pawaafile",
	pbd = "application/powerbuilder6",
	pbm = "image/portable-bitmap",
	pcap = "application/tcpdump.pcap",
	pcf = "application/font-pcf",
	pcl = "application/hp-pcl",
	pclxl = "application/hp-pclxl",
	pct = "image/pict",
	pcurl = "application/curl.pcurl",
	pcx = "image/pcx",
	pdb = "application/palm",
	pdf = "application/pdf",
	pfa = "application/font-type1",
	pfb = "application/font-type1",
	pfm = "application/font-type1",
	pfr = "application/font-tdpfr",
	pfx = "application/pkcs12",
	pgm = "image/portable-graymap",
	pgn = "application/chess-pgn",
	pgp = "application/pgp-encrypted",
	php = "text/php",
	pic = "image/pict",
	pkg = "application/octet-stream",
	pki = "application/pkixcmp",
	pkipath = "application/pkix-pkipath",
	plb = "application/3gpp.pic-bw-large",
	plc = "application/mobius.plc",
	plf = "application/pocketlearn",
	pls = "application/pls+xml",
	pml = "application/ctc-posml",
	png = "image/png",
	pnm = "image/portable-anymap",
	portpkg = "application/macports.portpkg",
	pot = "application/ms-powerpoint",
	potm = "application/ms-powerpoint.template.macroenabled.12",
	potx = "application/openxmlformats-officedocument.presentationml.template",
	ppam = "application/ms-powerpoint.addin.macroenabled.12",
	ppd = "application/cups-ppd",
	ppm = "image/portable-pixmap",
	pps = "application/ms-powerpoint",
	ppsm = "application/ms-powerpoint.slideshow.macroenabled.12",
	ppsx = "application/openxmlformats-officedocument.presentationml.slideshow",
	ppt = "application/ms-powerpoint",
	pptm = "application/ms-powerpoint.presentation.macroenabled.12",
	pptx = "application/openxmlformats-officedocument.presentationml.presentation",
	pqa = "application/palm",
	prc = "application/mobipocket-ebook",
	pre = "application/lotus-freelance",
	prf = "application/pics-rules",
	ps = "application/postscript",
	psb = "application/3gpp.pic-bw-small",
	psd = "image/adobe.photoshop",
	psf = "application/font-linux-psf",
	pskcxml = "application/pskc+xml",
	ptid = "application/pvi.ptid1",
	pub = "application/mspublisher",
	pvb = "application/3gpp.pic-bw-var",
	pwn = "application/3m.post-it-notes",
	py = "text/python",
	pya = "audio/ms-playready.media.pya",
	pyv = "video/ms-playready.media.pyv",
	qam = "application/epson.quickanime",
	qbo = "application/intu.qbo",
	qfx = "application/intu.qfx",
	qml = "text/qml",
	qps = "application/publishare-delta-tree",
	qt = "video/quicktime",
	qwd = "application/quark.quarkxpress",
	qwt = "application/quark.quarkxpress",
	qxb = "application/quark.quarkxpress",
	qxd = "application/quark.quarkxpress",
	qxl = "application/quark.quarkxpress",
	qxt = "application/quark.quarkxpress",
	r = "text/r",
	ra = "audio/pn-realaudio",
	ram = "audio/pn-realaudio",
	rar = "application/rar",
	ras = "image/cmu-raster",
	rb = "text/ruby",
	rcprofile = "application/ipunplugged.rcprofile",
	rdf = "application/rdf+xml",
	rdz = "application/data-vision.rdz",
	rep = "application/businessobjects",
	res = "application/dtbresource+xml",
	rgb = "image/rgb",
	rif = "application/reginfo+xml",
	rip = "audio/rip",
	ris = "application/research-info-systems",
	rl = "application/resource-lists+xml",
	rlc = "image/fujixerox.edmics-rlc",
	rld = "application/resource-lists-diff+xml",
	rm = "application/rn-realmedia",
	rmi = "audio/midi",
	rmp = "audio/pn-realaudio-plugin",
	rms = "application/jcp.javame.midlet-rms",
	rmvb = "application/rn-realmedia-vbr",
	rnc = "application/relax-ng-compact-syntax",
	roa = "application/rpki-roa",
	roff = "text/troff",
	rp9 = "application/cloanto.rp9",
	rpm = "application/rpm",
	rpss = "application/nokia.radio-presets",
	rpst = "application/nokia.radio-preset",
	rq = "application/sparql-query",
	rs = "text/rust",
	rsd = "application/rsd+xml",
	rss = "application/rss+xml",
	rtf = "application/rtf",
	rtx = "text/richtext",
	s = "text/asm",
	s3m = "audio/s3m",
	saf = "application/yamaha.smaf-audio",
	sbml = "application/sbml+xml",
	sc = "application/ibm.secure-container",
	scd = "application/msschedule",
	scm = "application/lotus-screencam",
	scq = "application/scvp-cv-request",
	scs = "application/scvp-cv-response",
	scss = "text/scss",
	scurl = "text/curl.scurl",
	sda = "application/stardivision.draw",
	sdc = "application/stardivision.calc",
	sdd = "application/stardivision.impress",
	sdkd = "application/solent.sdkm+xml",
	sdkm = "application/solent.sdkm+xml",
	sdp = "application/sdp",
	sdw = "application/stardivision.writer",
	see = "application/seemail",
	seed = "application/fdsn.seed",
	sema = "application/sema",
	semd = "application/semd",
	semf = "application/semf",
	ser = "application/java-serialized-object",
	setpay = "application/set-payment-initiation",
	setreg = "application/set-registration-initiation",
	sfs = "application/spotfire.sfs",
	sfv = "text/sfv",
	sgi = "image/sgi",
	sgl = "application/stardivision.writer-global",
	sgm = "text/sgml",
	sgml = "text/sgml",
	sh = "text/shellscript",
	shar = "application/shar",
	shf = "application/shf+xml",
	sid = "image/mrsid-image",
	sig = "application/pgp-signature",
	sil = "audio/silk",
	silo = "model/mesh",
	sis = "application/symbian.install",
	sisx = "application/symbian.install",
	sit = "application/stuffit",
	sitx = "application/stuffitx",
	skd = "application/koan",
	skm = "application/koan",
	skp = "application/koan",
	skt = "application/koan",
	sldm = "application/ms-powerpoint.slide.macroenabled.12",
	sldx = "application/openxmlformats-officedocument.presentationml.slide",
	slt = "application/epson.salt",
	sm = "application/stepmania.stepchart",
	smf = "application/stardivision.math",
	smi = "application/smil+xml",
	smil = "application/smil+xml",
	smv = "video/smv",
	smzip = "application/stepmania.package",
	snd = "audio/basic",
	snf = "application/font-snf",
	so = "application/octet-stream",
	spc = "application/pkcs7-certificates",
	spf = "application/yamaha.smaf-phrase",
	spl = "application/futuresplash",
	spot = "text/in3d.spot",
	spp = "application/scvp-vp-response",
	spq = "application/scvp-vp-request",
	spx = "audio/ogg",
	sql = "application/sql",
	src = "application/wais-source",
	srt = "application/subrip",
	sru = "application/sru+xml",
	srx = "application/sparql-results+xml",
	ssdl = "application/ssdl+xml",
	sse = "application/kodak-descriptor",
	ssf = "application/epson.ssf",
	ssml = "application/ssml+xml",
	st = "application/sailingtracker.track",
	stc = "application/sun.xml.calc.template",
	std = "application/sun.xml.draw.template",
	stf = "application/wt.stf",
	sti = "application/sun.xml.impress.template",
	stk = "application/hyperstudio",
	stl = "application/ms-pki.stl",
	str = "application/pg.format",
	stw = "application/sun.xml.writer.template",
	sub = "text/dvb.subtitle",
	sus = "application/sus-calendar",
	susp = "application/sus-calendar",
	sv4cpio = "application/sv4cpio",
	sv4crc = "application/sv4crc",
	svc = "application/dvb.service",
	svd = "application/svd",
	svg = "image/svg+xml",
	svgz = "image/svg+xml",
	swa = "application/director",
	swf = "application/shockwave-flash",
	swi = "application/aristanetworks.swi",
	sxc = "application/sun.xml.calc",
	sxd = "application/sun.xml.draw",
	sxg = "application/sun.xml.writer.global",
	sxi = "application/sun.xml.impress",
	sxm = "application/sun.xml.math",
	sxw = "application/sun.xml.writer",
	t = "text/troff",
	t3 = "application/t3vm-image",
	taglet = "application/mynfc",
	tao = "application/tao.intent-module-archive",
	tar = "application/tar",
	tcap = "application/3gpp2.tcap",
	tcl = "application/tcl",
	teacher = "application/smart.teacher",
	tei = "application/tei+xml",
	teicorpus = "application/tei+xml",
	tex = "application/tex",
	texi = "application/texinfo",
	texinfo = "application/texinfo",
	text = "text/plain",
	tf = "text/hcl",
	tfi = "application/thraud+xml",
	tfm = "application/tex-tfm",
	tfrc = "text/hcl",
	tfstate = "application/json",
	tfvars = "text/hcl",
	tga = "image/tga",
	thmx = "application/ms-officetheme",
	tif = "image/tiff",
	tiff = "image/tiff",
	tmo = "application/tmobile-livetv",
	toml = "text/toml",
	torrent = "application/bittorrent",
	tpl = "application/groove-tool-template",
	tpt = "application/trid.tpt",
	tr = "text/troff",
	tra = "application/trueapp",
	trm = "application/msterminal",
	ts = "text/typescript",
	tsd = "application/timestamped-data",
	tsv = "text/tab-separated-values",
	tsx = "text/tsx",
	ttc = "font/collection",
	ttf = "font/ttf",
	ttl = "text/turtle",
	twd = "application/simtech-mindmapper",
	twds = "application/simtech-mindmapper",
	txd = "application/genomatix.tuxedo",
	txf = "application/mobius.txf",
	txt = "text/plain",
	u32 = "application/authorware-bin",
	udeb = "application/debian-package",
	ufd = "application/ufdl",
	ufdl = "application/ufdl",
	ulx = "application/glulx",
	umj = "application/umajin",
	unityweb = "application/unity",
	uoml = "application/uoml+xml",
	uri = "text/uri-list",
	uris = "text/uri-list",
	urls = "text/uri-list",
	ustar = "application/ustar",
	utz = "application/uiq.theme",
	uu = "text/uuencode",
	uva = "audio/dece.audio",
	uvd = "application/dece.data",
	uvf = "application/dece.data",
	uvg = "image/dece.graphic",
	uvh = "video/dece.hd",
	uvi = "image/dece.graphic",
	uvm = "video/dece.mobile",
	uvp = "video/dece.pd",
	uvs = "video/dece.sd",
	uvt = "application/dece.ttml+xml",
	uvu = "video/uvvu.mp4",
	uvv = "video/dece.video",
	uvva = "audio/dece.audio",
	uvvd = "application/dece.data",
	uvvf = "application/dece.data",
	uvvg = "image/dece.graphic",
	uvvh = "video/dece.hd",
	uvvi = "image/dece.graphic",
	uvvm = "video/dece.mobile",
	uvvp = "video/dece.pd",
	uvvs = "video/dece.sd",
	uvvt = "application/dece.ttml+xml",
	uvvu = "video/uvvu.mp4",
	uvvv = "video/dece.video",
	uvvx = "application/dece.unspecified",
	uvvz = "application/dece.zip",
	uvx = "application/dece.unspecified",
	uvz = "application/dece.zip",
	vcard = "text/vcard",
	vcd = "application/cdlink",
	vcf = "text/vcard",
	vcg = "application/groove-vcard",
	vcs = "text/vcalendar",
	vcx = "application/vcx",
	vis = "application/visionary",
	viv = "video/vivo",
	vob = "video/ms-vob",
	vor = "application/stardivision.writer",
	vox = "application/authorware-bin",
	vrml = "model/vrml",
	vsd = "application/visio",
	vsf = "application/vsf",
	vss = "application/visio",
	vst = "application/visio",
	vsw = "application/visio",
	vtu = "model/vtu",
	vxml = "application/voicexml+xml",
	w3d = "application/director",
	wad = "application/doom",
	wasm = "application/wasm",
	wav = "audio/wav",
	wax = "audio/ms-wax",
	wbmp = "image/wap.wbmp",
	wbs = "application/criticaltools.wbs+xml",
	wbxml = "application/wap.wbxml",
	wcm = "application/ms-works",
	wdb = "application/ms-works",
	wdp = "image/ms-photo",
	weba = "audio/webm",
	webm = "video/webm",
	webp = "image/webp",
	wg = "application/pmi.widget",
	wgt = "application/widget",
	wks = "application/ms-works",
	wm = "video/ms-wm",
	wma = "audio/ms-wma",
	wmd = "application/ms-wmd",
	wmf = "application/msmetafile",
	wml = "text/wap.wml",
	wmlc = "application/wap.wmlc",
	wmls = "text/wap.wmlscript",
	wmlsc = "application/wap.wmlscriptc",
	wmv = "video/ms-wmv",
	wmx = "video/ms-wmx",
	wmz = "application/ms-wmz",
	woff = "font/woff",
	woff2 = "font/woff2",
	wpd = "application/wordperfect",
	wpl = "application/ms-wpl",
	wps = "application/ms-works",
	wqd = "application/wqd",
	wri = "application/mswrite",
	wrl = "model/vrml",
	wsdl = "application/wsdl+xml",
	wspolicy = "application/wspolicy+xml",
	wtb = "application/webturbo",
	wvx = "video/ms-wvx",
	x32 = "application/authorware-bin",
	x3d = "model/x3d+xml",
	x3db = "model/x3d+binary",
	x3dbz = "model/x3d+binary",
	x3dv = "model/x3d+vrml",
	x3dvz = "model/x3d+vrml",
	x3dz = "model/x3d+xml",
	xaml = "application/xaml+xml",
	xap = "application/silverlight-app",
	xar = "application/xara",
	xbap = "application/ms-xbap",
	xbd = "application/fujixerox.docuworks.binder",
	xbm = "image/xbitmap",
	xdf = "application/xcap-diff+xml",
	xdm = "application/syncml.dm+xml",
	xdp = "application/adobe.xdp+xml",
	xdssc = "application/dssc+xml",
	xdw = "application/fujixerox.docuworks",
	xenc = "application/xenc+xml",
	xer = "application/patch-ops-error+xml",
	xfdf = "application/adobe.xfdf",
	xfdl = "application/xfdl",
	xht = "application/xhtml+xml",
	xhtml = "application/xhtml+xml",
	xhvml = "application/xv+xml",
	xif = "image/xiff",
	xla = "application/ms-excel",
	xlam = "application/ms-excel.addin.macroenabled.12",
	xlc = "application/ms-excel",
	xlf = "application/xliff+xml",
	xlm = "application/ms-excel",
	xls = "application/ms-excel",
	xlsb = "application/ms-excel.sheet.binary.macroenabled.12",
	xlsm = "application/ms-excel.sheet.macroenabled.12",
	xlsx = "application/openxmlformats-officedocument.spreadsheetml.sheet",
	xlt = "application/ms-excel",
	xltm = "application/ms-excel.template.macroenabled.12",
	xltx = "application/openxmlformats-officedocument.spreadsheetml.template",
	xlw = "application/ms-excel",
	xm = "audio/xm",
	xml = "application/xml",
	xo = "application/olpc-sugar",
	xop = "application/xop+xml",
	xpak = "application/gentoo.xpak",
	xpi = "application/xpinstall",
	xpl = "application/xproc+xml",
	xpm = "image/xpixmap",
	xpr = "application/is-xpr",
	xps = "application/ms-xpsdocument",
	xpw = "application/intercon.formnet",
	xpx = "application/intercon.formnet",
	xsl = "application/xml",
	xslt = "application/xslt+xml",
	xsm = "application/syncml+xml",
	xspf = "application/xspf+xml",
	xul = "application/mozilla.xul+xml",
	xvm = "application/xv+xml",
	xvml = "application/xv+xml",
	xwd = "image/xwindowdump",
	xyz = "chemical/xyz",
	xz = "application/xz",
	yaml = "text/yaml",
	yang = "application/yang",
	yin = "application/yin+xml",
	yml = "text/yaml",
	z1 = "application/zmachine",
	z2 = "application/zmachine",
	z3 = "application/zmachine",
	z4 = "application/zmachine",
	z5 = "application/zmachine",
	z6 = "application/zmachine",
	z7 = "application/zmachine",
	z8 = "application/zmachine",
	zaz = "application/zzazz.deck+xml",
	zip = "application/zip",
	zir = "application/zul",
	zirz = "application/zul",
	zmm = "application/handheld-entertainment+xml",
	zsh = "text/shellscript",
}

local options = ya.sync(
	function(st)
		return {
			with_files = st.with_files,
			with_exts = st.with_exts,
			fallback_file1 = st.fallback_file1,
		}
	end
)

local M = {}

function M:setup(opts)
	opts = opts or {}

	self.with_files = opts.with_files
	self.with_exts = opts.with_exts
	self.fallback_file1 = opts.fallback_file1
end

function M:fetch(job)
	local opts = options()
	local merged_files = ya.dict_merge(FILES, opts.with_files or {})
	local merged_exts = ya.dict_merge(EXTS, opts.with_exts or {})

	local updates, unknown, state = {}, {}, {}
	for i, file in ipairs(job.files) do
		if file.cha.is_dummy then
			state[i] = false
			goto continue
		end

		local mime
		if file.cha.len == 0 then
			mime = "inode/empty"
		else
			mime = merged_files[(file.url.name or ""):lower()]
			mime = mime or merged_exts[(file.url.ext or ""):lower()]
		end

		if mime then
			updates[tostring(file.url)], state[i] = mime, true
		elseif opts.fallback_file1 then
			unknown[#unknown + 1] = file
		else
			updates[tostring(file.url)], state[i] = "application/octet-stream", true
		end
		::continue::
	end

	if next(updates) then
		ya.emit("update_mimes", { updates = updates })
	end

	if #unknown > 0 then
		return self.fallback_builtin(job, unknown, state)
	end

	return state
end

function M.fallback_builtin(job, unknown, state)
	local indices = {}
	for i, f in ipairs(job.files) do
		indices[f:hash()] = i
	end

	local result = require("mime"):fetch(ya.dict_merge(job, { files = unknown }))
	for i, f in ipairs(unknown) do
		if type(result) == "table" then
			state[indices[f:hash()]] = result[i]
		else
			state[indices[f:hash()]] = result
		end
	end
	return state
end

return M
