Jump to content

Module:Color/sandbox

From Wikipedia, the free encyclopedia
This is the current revision of this page, as edited by WikiMacaroons (talk | contribs) at 13:30, 26 October 2025 (Remove hash try). The present address (URL) is a permanent link to this version.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
-- Introduction: https://colorspace.r-forge.r-project.org/articles/color_spaces.html

local p = {}

local function isEmpty(value)
	return value == nil or value == ''
end

local function isNotEmpty(value)
	return value ~= nil and value ~= ''
end

local function argDefault(value, default)
	if (value == nil or value == '') then
		return default
	else
		return value
	end
end

local function numArgDefault(value, default)
	if (value == nil or value == '') then
		return default
	else
		return tonumber(value)
	end
end

local function isArgTrue(value)
	return (value ~= nil and value ~= '' and value ~= '0')
end

local function isEmpty(value)
	return value == nil or value == ''
end

local function isNotEmpty(value)
	return value ~= nil and value ~= ''
end

local function hexToRgb(hexColor)
	local cleanColor = hexColor:gsub('#', '#'):match('^[%s#]*(.-)[%s;]*$')
	if (#cleanColor == 6) then
		return
			tonumber(string.sub(cleanColor, 1, 2), 16),
			tonumber(string.sub(cleanColor, 3, 4), 16),
			tonumber(string.sub(cleanColor, 5, 6), 16)
	elseif (#cleanColor == 3) then
		return
			17 * tonumber(string.sub(cleanColor, 1, 1), 16),
			17 * tonumber(string.sub(cleanColor, 2, 2), 16),
			17 * tonumber(string.sub(cleanColor, 3, 3), 16)
	end
	error('Invalid hexadecimal color ' .. cleanColor, 1)
end

local function round(value)
	if (value < 0) then
		return math.ceil(value - 0.5)
	else
		return math.floor(value + 0.5)
	end
end

local function rgbToHex(r, g, b)
	return string.format('%02X%02X%02X', round(r), round(g), round(b))
end

local function checkRgb(r, g, b)
	if (r > 255 or g > 255 or b > 255 or r < 0 or g < 0 or b < 0) then
		error('Color level out of bounds')
	end
end

local function rgbToCmyk(r, g, b)
	local c = 1 - r / 255
	local m = 1 - g / 255
	local y = 1 - b / 255
	local k = math.min(c, m, y)
	if (k == 1) then
		c = 0
		m = 0
		y = 0
	else
		local kc = 1 - k
		c = (c - k) / kc
		m = (m - k) / kc
		y = (y - k) / kc
	end
	return c * 100, m * 100, y * 100, k * 100
end

local function rgbToHsl(r, g, b)
	local channelMax = math.max(r, g, b)
	local channelMin = math.min(r, g, b)
	local range = channelMax - channelMin
	local h, s
	if (range == 0) then
		h = 0
	elseif (channelMax == r) then
		h = 60 * ((g - b) / range)
		if (h < 0) then
			h = 360 + h
		end
	elseif (channelMax == g) then
		h = 60 * (2 + (b - r) / range)
	else
		h = 60 * (4 + (r - g) / range)
	end
	local L = channelMax + channelMin
	if (L == 0 or L == 510) then
		s = 0
	else
		s = 100 * range / math.min(L, 510 - L)
	end
	return h, s, L * 50 / 255
end

local function rgbToHsv(r, g, b)
	local channelMax = math.max(r, g, b)
	local channelMin = math.min(r, g, b)
	local range = channelMax - channelMin
	local h, s
	if (range == 0) then
		h = 0
	elseif (channelMax == r) then
		h = 60 * ((g - b) / range)
		if (h < 0) then
			h = 360 + h
		end
	elseif (channelMax == g) then
		h = 60 * (2 + (b - r) / range)
	else
		h = 60 * (4 + (r - g) / range)
	end
	if (channelMax == 0) then
		s = 0
	else
		s = 100 * range / channelMax
	end
	return h, s, channelMax * 100 / 255
end

local function checkHsv(h, s, v)
	if (s > 100 or v > 100 or s < 0 or v < 0) then
		error('Color level out of bounds')
	end	
end

local function hsvToRgb(h, s, v)
	local hn = (h / 60 - 6 * math.floor(h / 360))
	local hi = math.floor(hn)
	local hr = hn - hi
	local sn = s / 100
	local vs = v * 255 / 100
    local p = vs * (1 - sn);
    local q = vs * (1 - sn * hr);
    local t = vs * (1 - sn * (1 - hr));
    if (hi < 3) then
		if (hi == 0) then
			return vs, t, p
		elseif (hi == 1) then
			return q, vs, p
		else
			return p, vs, t
		end
    else
		if (hi == 3) then
			return p, q, vs
		elseif (hi == 4) then
			return t, p, vs
		else
			return vs, p, q
		end
    end
end

-- c in [0, 255], condition tweaked for no discontinuity
-- http://entropymine.com/imageworsener/srgbformula/
local function toLinear(c)
	if (c > 10.314300250662591) then
		return math.pow((c + 14.025) / 269.025, 2.4)
	else
		return c / 3294.6
	end
end

local function toNonLinear(c)
	if (c > 0.00313066844250063) then
		return 269.025 * math.pow(c, 1.0/2.4) - 14.025
	else
		return 3294.6 * c
	end
end

local function srgbToCielchuvD65o2deg(r, g, b)
	local R = toLinear(r)
	local G = toLinear(g)
	local B = toLinear(b)
	-- https://github.com/w3c/csswg-drafts/issues/5922
	local X = 0.1804807884018343 * B + 0.357584339383878 * G + 0.41239079926595934 * R
	local Y = 0.07219231536073371 * B + 0.21263900587151027 * R + 0.715168678767756 * G
	local Z = 0.01933081871559182 * R + 0.11919477979462598 * G + 0.9505321522496607 * B
	local L, C, h
	if (Y > 0.00885645167903563082) then
		L = 116 * math.pow(Y, 1/3) - 16
	else
		L = Y * 903.2962962962962962963
	end
	if ((r == g and g == b) or L == 0) then
		C = 0
		h = 0
	else
		d = X + 3 * Z + 15 * Y
		if (d == 0) then
			C = 0
			h = 0
		else
			-- 0.19783... and 0.4631... computed with extra precision from (X,Y,Z) when (R,G,B) = (1,1,1),
			-- in which case (u,v) ≈ (0,0)
			local us = 4 * X / d - 0.19783000664283678994
			local vs = 9 * Y / d - 0.46831999493879099801
			h = math.atan2(vs, us) * 57.2957795130823208768
			if (h < 0) then
				h = h + 360
			elseif (h == 0) then
				h = 0 -- ensure zero is positive
			end
			C = math.sqrt(us * us + vs * vs) * 13 * L
			if (C == 0) then
				C = 0
				h = 0
			end
		end
	end
	return L, C, h
end

local function checkInterpolationParameter(t)
	if (t > 1 or t < 0) then
		error('Interpolation parameter out of bounds')
	end
end	

local function srgbMix(t, r0, g0, b0, r1, g1, b1)
	local tc = 1 - t
	return
		toNonLinear(tc * toLinear(r0) + t * toLinear(r1)),
		toNonLinear(tc * toLinear(g0) + t * toLinear(g1)),
		toNonLinear(tc * toLinear(b0) + t * toLinear(b1))
end

-- functions for generating gradients, inspired by OKLCH but not needing gamut mapping
local function adjustHueToCielch(h)
	local n = 180 * math.floor(h / 180)
	local d = h - n
	if (d < 60) then
		d = 73.7 * d / 60
	elseif (d < 120) then
		d = 0.6975 * d + 31.85
	else
		d = 1.07416666666666666667 * d - 13.35
	end
	return n + d
end

local function unadjustHueFromCielch(h)
	local n = 180 * math.floor(h / 180)
	local d = h - n
	if (d < 73.7) then
		d = 0.81411126187245590231 * d
	elseif (d < 115.55) then
		d = 1.43369175627240143369 * d - 45.66308243727598566308
	else
		d = 0.93095422808378588053 * d + 12.42823894491854150504
	end
	return n + d
end

local function getLightness(r, g, b)
	local Y = 0.07219231536073371 * toLinear(b) + 0.21263900587151027 * toLinear(r) + 0.715168678767756 * toLinear(g)
	if (Y > 0.00885645167903563082) then
		return 116 * math.pow(Y, 1/3) - 16
	else
		return Y * 903.2962962962962962963
	end
end

local function adjustLightness(L, r, g, b)
	if (L >= 100) then
		return 255, 255, 255
	end
	
	local Yc
	if (L > 8) then
		Yc = (L + 16) / 116
		Yc = Yc * Yc * Yc
	else
		Yc = L * 0.00110705645987945385
	end
	
	local R = toLinear(r)
	local G = toLinear(g)
	local B = toLinear(b)
	local Y = 0.07219231536073371 * B + 0.21263900587151027 * R + 0.715168678767756 * G
	if (Y > 0) then
		local scale = Yc / Y
		R = R * scale
		G = G * scale
		B = B * scale
		local cmax = math.max(R, G, B)
		if (cmax > 1) then
			R = R / cmax
			G = G / cmax
			B = B / cmax
			local d = 0.07219231536073371 * (1 - B) + 0.21263900587151027 * (1 - R) + 0.715168678767756 * (1 - G)
			if (d <= 0) then
				R = 1
				G = 1
				B = 1
			else
				local strength = 0.5 -- 1 yields equal lightness
				local t = (Yc - 0.07219231536073371 * B - 0.21263900587151027 * R - 0.715168678767756 * G) / d
				R = R + strength * (1 - R) * t
				G = G + strength * (1 - G) * t
				B = B + strength * (1 - B) * t
			end
		end
	else
		R = Yc
		G = Yc
		B = Yc
	end
	
	return toNonLinear(R), toNonLinear(G), toNonLinear(B)
end

local function interpolateHue(t, r0, g0, b0, r1, g1, b1, direction)
	local h0, s0, v0 = rgbToHsv(r0, g0, b0)
	local h1, s1, v1 = rgbToHsv(r1, g1, b1)
	
	if (s0 == 0) then
		h0 = h1
		if (v0 == 0) then
			s0 = s1
		end
	end
	if (s1 == 0) then
		h1 = h0
		if (v1 == 0) then
			s1 = s1
		end
	end
	
	local hn0 = h0 / 360
	local hn1 = h1 / 360
	if (direction == 0) then
		local dhn = hn1 - hn0
		if (dhn > 0.5) then
			dhn = dhn - math.ceil(dhn - 0.5)
		elseif (dhn < -0.5) then
			dhn = dhn - math.floor(dhn + 0.5)
		end
		if (dhn >= 0) then
			hn0 = hn0 - math.floor(hn0)
			hn1 = hn0 + dhn
		else
			hn1 = hn1 - math.floor(hn1)
			hn0 = hn1 - dhn
		end
	elseif (direction > 0) then
		hn1 = 1 - math.ceil(hn1 - hn0) - math.floor(hn0) + hn1
		hn0 = hn0 - math.floor(hn0)
	else
		hn0 = 1 - math.ceil(hn0 - hn1) - math.floor(hn1) + hn0
		hn1 = hn1 - math.floor(hn1)
	end
	
	if (t < 0) then
		t = 0
	elseif (t > 1) then
		t = 1
	end
	local tc = 1 - t
	local ha = tc * adjustHueToCielch(360 * hn0) + t * adjustHueToCielch(360 * hn1)
	local r, g, b = hsvToRgb(unadjustHueFromCielch(ha), tc * s0 + t * s1, tc * v0 + t * v1)
	
	local L0 = getLightness(r0, g0, b0)
	local L1 = getLightness(r1, g1, b1)
	return adjustLightness(tc * L0 + t * L1, r, g, b)
end

local function formatToPrecision(value, p)
	return string.format('%.' .. p .. 'f', value)
end

local function getFractionalZeros(p)
	if (p > 0) then
		return '.' .. string.rep('0', p)
	else
		return ''
	end
end

local function polyMix(t, palette)
	if (t <= 0) then
		return palette[1]
	elseif (t >= 1) then
		return palette[#palette]
	end
	local n, f = math.modf(t * (#palette - 1))
	if (f == 0) then
		return palette[n + 1]
	else
		local r0, g0, b0 = hexToRgb(palette[n + 1])
		local r1, g1, b1 = hexToRgb(palette[n + 2])
		return rgbToHex(srgbMix(f, r0, g0, b0, r1, g1, b1))
	end
end

-- same principle: https://colorspace.r-forge.r-project.org/articles/hcl_palettes.html
-- the darkest colors do not yield an WCAG AA contrast with text, maybe this can be solved by using HCL Wizard from R's Colorspace package
-- https://colorspace.r-forge.r-project.org/articles/approximations.html
-- R's Colorspace does gamut mapping through simple clipping (as do most other color libraries, such as chroma.js and colorio), which is fast but not good
local function brewerGradient(t, palette)
	local colors = {
		spectral = { '9E0142', 'D53E4F', 'F46D43', 'FDAE61', 'FEE08B', 'FFFFBF', 'E6F598', 'ABDDA4', '66C2A5', '3288BD', '5E4FA2' },
		rdylgn = { 'A50026', 'D73027', 'F46D43', 'FDAE61', 'FEE08B', 'FFFFBF', 'D9EF8B', 'A6D96A', '66BD63', '1A9850', '006837' },
		rdylbu = { 'A50026', 'D73027', 'F46D43', 'FDAE61', 'FEE090', 'FFFFBF', 'E0F3F8', 'ABD9E9', '74ADD1', '4575B4', '313695' },
		piyg = { '8E0152', 'C51B7D', 'DE77AE', 'F1B6DA', 'FDE0EF', 'F7F7F7', 'E6F5D0', 'B8E186', '7FBC41', '4D9221', '276419' },
		brbg = { '543005', '8C510A', 'BF812D', 'DFC27D', 'F6E8C3', 'F5F5F5', 'C7EAE5', '80CDC1', '35978F', '01665E', '003C30' },
		rdbu = { '67001F', 'B2182B', 'D6604D', 'F4A582', 'FDDBC7', 'F7F7F7', 'D1E5F0', '92C5DE', '4393C3', '2166AC', '053061' },
		prgn = { '40004B', '762A83', '9970AB', 'C2A5CF', 'E7D4E8', 'F7F7F7', 'D9F0D3', 'A6DBA0', '5AAE61', '1B7837', '00441B' },
		puor = { '7F3B08', 'B35806', 'E08214', 'FDB863', 'FEE0B6', 'F7F7F7', 'D8DAEB', 'B2ABD2', '8073AC', '542788', '2D004B' },
		rdgy = { '67001F', 'B2182B', 'D6604D', 'F4A582', 'FDDBC7', 'FFFFFF', 'E0E0E0', 'BABABA', '878787', '4D4D4D', '1A1A1A' },
		pubugn = { 'FFF7FB', 'ECE2F0', 'D0D1E6', 'A6BDDB', '67A9CF', '3690C0', '02818A', '016C59', '014636' },
		ylorrd = { 'FFFFCC', 'FFEDA0', 'FED976', 'FEB24C', 'FD8D3C', 'FC4E2A', 'E31A1C', 'BD0026', '800026' },
		ylorbr = { 'FFFFE5', 'FFF7BC', 'FEE391', 'FEC44F', 'FE9929', 'EC7014', 'CC4C02', '993404', '662506' },
		ylgnbu = { 'FFFFD9', 'EDF8B1', 'C7E9B4', '7FCDBB', '41B6C4', '1D91C0', '225EA8', '253494', '081D58' },
		gnbu = { 'F7FCF0', 'E0F3DB', 'CCEBC5', 'A8DDB5', '7BCCC4', '4EB3D3', '2B8CBE', '0868AC', '084081' },
		orrd = { 'FFF7EC', 'FEE8C8', 'FDD49E', 'FDBB84', 'FC8D59', 'EF6548', 'D7301F', 'B30000', '7F0000' },
		ylgn = { 'FFFFE5', 'F7FCB9', 'D9F0A3', 'ADDD8E', '78C679', '41AB5D', '238443', '006837', '004529' },
		bugn = { 'F7FCFD', 'E5F5F9', 'CCECE6', '99D8C9', '66C2A4', '41AE76', '238B45', '006D2C', '00441B' },
		pubu = { 'FFF7FB', 'ECE7F2', 'D0D1E6', 'A6BDDB', '74A9CF', '3690C0', '0570B0', '045A8D', '023858' },
		purd = { 'F7F4F9', 'E7E1EF', 'D4B9DA', 'C994C7', 'DF65B0', 'E7298A', 'CE1256', '980043', '67001F' },
		rdpu = { 'FFF7F3', 'FDE0DD', 'FCC5C0', 'FA9FB5', 'F768A1', 'DD3497', 'AE017E', '7A0177', '49006A' },
		bupu = { 'F7FCFD', 'E0ECF4', 'BFD3E6', '9EBCDA', '8C96C6', '8C6BB1', '88419D', '810F7C', '4D004B' },
		oranges = { 'FFF5EB', 'FEE6CE', 'FDD0A2', 'FDAE6B', 'FD8D3C', 'F16913', 'D94801', 'A63603', '7F2704' },
		greens = { 'F7FCF5', 'E5F5E0', 'C7E9C0', 'A1D99B', '74C476', '41AB5D', '238B45', '006D2C', '00441B' },
		blues = { 'F7FBFF', 'DEEBF7', 'C6DBEF', '9ECAE1', '6BAED6', '4292C6', '2171B5', '08519C', '08306B' },
		reds = { 'FFF5F0', 'FEE0D2', 'FCBBA1', 'FC9272', 'FB6A4A', 'EF3B2C', 'CB181D', 'A50F15', '67000D' },
		purples = { 'FCFBFD', 'EFEDF5', 'DADAEB', 'BCBDDC', '9E9AC8', '807DBA', '6A51A3', '54278F', '3F007D' },
		greys = { 'FFFFFF', 'F0F0F0', 'D9D9D9', 'BDBDBD', '969696', '737373', '525252', '252525', '000000' }
	}
	return polyMix(t, colors[palette])
end

local function softSigmoid(x)
	local ax = math.abs(x)
	if (ax > 0.000000000000000111) then
		return x / (1 + ax)
	else
		return x
	end
end

function p.hexToRgbTriplet(frame)
	local args = frame.args or frame:getParent().args
	local hex = args[1]
	if (isEmpty(hex)) then
		return ''
	end
	local r, g, b = hexToRgb(hex)
	return r .. ', ' .. g .. ', ' .. b
end

function p.hexToCmyk(frame)
	local args = frame.args or frame:getParent().args
	local hex = args[1]
	if (isEmpty(hex)) then
		return ''
	end
	local p = numArgDefault(args.precision, 0)
	local s = args.pctsign or '1'
	local c, m, y, k = rgbToCmyk(hexToRgb(hex))
	local fk = formatToPrecision(k, p)
	local fc, fm, fy
	local fracZeros = getFractionalZeros(p)
	if (fk == 100  .. fracZeros) then
		local fZero = 0 .. fracZeros
		fc = fZero
		fm = fZero
		fy = fZero
	else
		fc = formatToPrecision(c, p)
		fm = formatToPrecision(m, p)
		fy = formatToPrecision(y, p)
	end
	if (s ~= '0') then
		return fc .. '%, ' .. fm .. '%, ' .. fy .. '%, ' .. fk .. '%'
	else
		return fc .. ', ' .. fm .. ', ' .. fy .. ', ' .. fk
	end
end

function p.hexToHsl(frame)
	local args = frame.args or frame:getParent().args
	local hex = args[1]
	if (isEmpty(hex)) then
		return ''
	end
	local p = numArgDefault(args.precision, 0)
	local h, s, l = rgbToHsl(hexToRgb(hex))
	local fl = formatToPrecision(l, p)
	local fs, fh
	local fracZeros = getFractionalZeros(p)
	local fZero = 0 .. fracZeros
	if (fl == fZero or fl == 100 .. fracZeros) then
		fs = fZero
		fh = fZero
	else
		fs = formatToPrecision(s, p)
		if (fs == fZero) then
			fh = fZero
		else
			fh = formatToPrecision(h, p)
			if (fh == 360 .. fracZeros) then
				fh = fZero -- handle rounding to 360
			end
		end
	end
	return fh .. '°, ' .. fs .. '%, ' .. fl .. '%'
end

function p.hexToHsv(frame)
	local args = frame.args or frame:getParent().args
	local hex = args[1]
	if (isEmpty(hex)) then
		return ''
	end	
	local p = numArgDefault(args.precision, 0)
	local h, s, v = rgbToHsv(hexToRgb(hex))
	local fv = formatToPrecision(v, p)
	local fs, fh
	local fracZeros = getFractionalZeros(p)
	local fZero = 0 .. fracZeros
	if (fv == fZero) then
		fh = fZero
		fs = fZero
	else
		fs = formatToPrecision(s, p)
		if (fs == fZero) then
			fh = fZero
		else
			fh = formatToPrecision(h, p)
			if (fh == 360 .. fracZeros) then
				fh = fZero -- handle rounding to 360
			end
		end
	end
	return fh .. '°, ' .. fs .. '%, ' .. fv .. '%'
end

function p.hexToCielch(frame)
	local args = frame.args or frame:getParent().args
	local hex = args[1]
	if (isEmpty(hex)) then
		return ''
	end	
	local p = numArgDefault(args.precision, 0)
	local L, C, h = srgbToCielchuvD65o2deg(hexToRgb(hex))
	local fL = formatToPrecision(L, p)
	local fC, fh
	local fracZeros = getFractionalZeros(p)
	local fZero = 0 .. fracZeros
	if (fL == fZero or fL == 100 .. fracZeros) then
		fC = fZero
		fh = fZero
	else
		fC = formatToPrecision(C, p)
		if (fC == fZero) then
			fh = fZero
		else
			fh = formatToPrecision(h, p)
			if (fh == 360 .. fracZeros) then
				fh = fZero -- handle rounding to 360
			end
		end
	end
	return fL .. ', ' .. fC .. ', ' .. fh .. '°'
end

function p.hexMix(frame)
	local args = frame.args or frame:getParent().args
	local hex0 = args[1]
	local hex1 = args[2]
	if (isEmpty(hex0) or isEmpty(hex1)) then
		return ''
	end
	local t = args[3]
	if (isEmpty(t)) then
		t = 0.5
	else
		t = tonumber(t)
		local amin = numArgDefault(args.min, 0)
		local amax = numArgDefault(args.max, 100)
		if (amax == amin) then
			t = 0.5
		else
			t = (t - amin) / (amax - amin)
			if (t > 1) then
				t = 1
			elseif (t < 0) then
				t = 0
			end
		end
	end
	local r0, g0, b0 = hexToRgb(hex0)
	local r1, g1, b1 = hexToRgb(hex1)
	return rgbToHex(srgbMix(t, r0, g0, b0, r1, g1, b1))
end

function p.hexInterpolate(frame)
	local args = frame.args or frame:getParent().args
	local hex0 = args[1]
	local hex1 = args[2]
	if (isEmpty(hex0)) then
		return hex1
	elseif (isEmpty(hex1)) then
		return hex0
	end
	local t = args[3]
	if (isEmpty(t)) then
		t = 0.5
	else
		t = tonumber(t)
		local amin = numArgDefault(args.min, 0)
		local amax = numArgDefault(args.max, 100)
		if (amax == amin) then
			t = 0.5
		else
			t = (t - amin) / (amax - amin)
			if (t > 1) then
				t = 1
			elseif (t < 0) then
				t = 0
			end
		end
	end
	local direction = numArgDefault(args.direction, 0)
	local r0, g0, b0 = hexToRgb(hex0)
	local r1, g1, b1 = hexToRgb(hex1)
	return rgbToHex(interpolateHue(t, r0, g0, b0, r1, g1, b1, direction))
end

function p.hexBrewerGradient(frame)
	local args = frame.args or frame:getParent().args
	local pal = argDefault(args.pal, 'spectral'):lower()
	local value = args[1]
	local t
	if (isEmpty(value)) then
		t = 0.5
	else
		value = tonumber(value)
		local high = numArgDefault(args.high, 100)
		local low = numArgDefault(args.low, -100)
		if (isEmpty(args.low)) then
			if (pal ~= 'spectral' and pal ~= 'rdylgn' and pal ~= 'rdylbu' and (pal:len() ~= 4 or
				(pal ~= 'rdgy' and pal ~= 'rdbu' and pal ~= 'puor' and pal ~= 'prgn' and pal ~= 'piyg' and pal ~= 'brbg'))) then
				low = 0
			end
		end
		if (high == low) then
			t = 0.5
		elseif (isArgTrue(args.inv)) then
			t = (high - value) / (high - low)
		else
			t = (value - low) / (high - low)
		end
	end
	if (isArgTrue(args.comp)) then
		t = 0.5 * softSigmoid(2 * t - 1) + 0.5
	end
	return brewerGradient(t, pal)
end

function p.hexToEnglish(frame)
	englishColourNames ={ ["FEDD00"] = "yellow", ["FFD700"] = "gold", ["FE5000"] = "orange", ["F9423A"] = "orange", ["EF3340"] = "red", ["CE0058"] = "red", ["E10098"] = "pink", ["BB29BB"] = "purple", ["440099"] = "blue", ["10069F"] = "blue", ["001489"] = "blue", ["0085CA"] = "blue", ["00AB84"] = "green", ["2D2926"] = "pink", ["F2F0A1"] = "yellow", ["FCAEBB"] = "pink", ["F1B2DC"] = "pink", ["BF9BDE"] = "purple", ["74D1EA"] = "blue", ["9DE7D7"] = "blue", ["9E978E"] = "grey", ["009ACE"] = "blue", ["44D62C"] = "green", ["FFE900"] = "yellow", ["FFAA4D"] = "orange", ["FF7276"] = "pink", ["FF3EB5"] = "magenta", ["EA27C2"] = "purple", ["84754E"] = "brown", ["85714D"] = "brown", ["866D4B"] = "brown", ["8B6F4E"] = "brown", ["87674F"] = "brown", ["8B634B"] = "brown", ["8A8D8F"] = "grey", ["FFD900"] = "gold", ["FF5E00"] = "orange", ["F93822"] = "red", ["CE0056"] = "red", ["D62598"] = "pink", ["4E008E"] = "indigo", ["00239C"] = "blue", ["0084CA"] = "blue", ["00B08B"] = "green", ["222223"] = "black", ["F6EB61"] = "yellow", ["F7EA48"] = "yellow", ["FCE300"] = "yellow", ["C5A900"] = "gold", ["AF9800"] = "gold", ["897A27"] = "green", ["F5E1A4"] = "yellow", ["ECD898"] = "gold", ["EED484"] = "yellow", ["F4DA40"] = "gold", ["F2CD00"] = "yellow", ["F1C400"] = "yellow", ["CBA052"] = "brown", ["F9E547"] = "yellow", ["FBE122"] = "gold", ["FEDB00"] = "gold", ["FFD100"] = "gold", ["DAAA00"] = "gold", ["AA8A00"] = "brown", ["9C8412"] = "brown", ["FAE053"] = "yellow", ["FBDD40"] = "gold", ["FDDA24"] = "gold", ["FFCD00"] = "gold", ["C99700"] = "brown", ["AC8400"] = "gold", ["897322"] = "green", ["F3DD6D"] = "yellow", ["F3D54E"] = "yellow", ["F3D03E"] = "gold", ["F2A900"] = "orange", ["CC8A00"] = "brown", ["A07400"] = "brown", ["6C571B"] = "brown", ["F8E08E"] = "yellow", ["FBD872"] = "yellow", ["FFC845"] = "gold", ["FFB81C"] = "orange", ["C69214"] = "brown", ["AD841F"] = "brown", ["886B25"] = "brown", ["FBDB65"] = "yellow", ["FDD757"] = "yellow", ["FED141"] = "yellow", ["FFC72C"] = "gold", ["EAAA00"] = "brown", ["B58500"] = "brown", ["9A7611"] = "green", ["FFC600"] = "yellow", ["FFB500"] = "orange", ["D19000"] = "orange", ["B47E00"] = "brown", ["73531D"] = "brown", ["5A4522"] = "brown", ["4B3D2A"] = "brown", ["D29F13"] = "yellow", ["B78B20"] = "yellow", ["9F7D23"] = "brown", ["967126"] = "brown", ["8F6A2A"] = "brown", ["7D622E"] = "brown", ["6C5D34"] = "brown", ["FDD26E"] = "yellow", ["FFC658"] = "orange", ["FFBF3F"] = "gold", ["FFA300"] = "orange", ["DE7C00"] = "orange", ["AF6D04"] = "brown", ["74531C"] = "brown", ["FDD086"] = "orange", ["FFC56E"] = "orange", ["FFB549"] = "orange", ["FF9E1B"] = "yellow", ["D57800"] = "orange", ["996017"] = "brown", ["6E4C1E"] = "brown", ["F2C75C"] = "orange", ["F1BE48"] = "gold", ["F1B434"] = "orange", ["ED8B00"] = "orange", ["CF7F00"] = "brown", ["A76D11"] = "brown", ["715C2A"] = "brown", ["F6BE00"] = "gold", ["F0B323"] = "orange", ["FEAD77"] = "orange", ["E6A65D"] = "orange", ["D38235"] = "yellow", ["DC8633"] = "orange", ["C16C18"] = "brown", ["BD9B60"] = "gold", ["D69A2D"] = "yellow", ["DB8A06"] = "orange", ["CD7925"] = "brown", ["AD6433"] = "brown", ["89532F"] = "brown", ["775135"] = "brown", ["D78825"] = "orange", ["D3832B"] = "orange", ["C67D30"] = "brown", ["B67233"] = "brown", ["A7662B"] = "yellow", ["9E6A38"] = "brown", ["835D32"] = "brown", ["FCC89B"] = "yellow", ["FDBE87"] = "orange", ["FDAA63"] = "orange", ["F68D2E"] = "orange", ["EA7600"] = "orange", ["D45D00"] = "orange", ["BE4D00"] = "dark orange", ["FECB8B"] = "yellow", ["FFC27B"] = "orange", ["FFB25B"] = "orange", ["FF8200"] = "orange", ["E57200"] = "orange", ["BE6A14"] = "brown", ["9B5A1A"] = "brown", ["EFD19F"] = "yellow", ["EFBE7D"] = "yellow", ["ECA154"] = "orange", ["E87722"] = "orange", ["CB6015"] = "dark orange", ["A1561C"] = "brown", ["603D20"] = "brown", ["FFAE62"] = "orange", ["FF8F1C"] = "orange", ["FF6900"] = "orange", ["B94700"] = "dark orange", ["94450B"] = "brown", ["653819"] = "brown", ["FFB990"] = "orange", ["FFA06A"] = "orange", ["FF7F32"] = "orange", ["FF6A13"] = "orange", ["D86018"] = "dark orange", ["A65523"] = "brown", ["8B4720"] = "brown", ["FFBE9F"] = "orange", ["FF9D6E"] = "orange", ["FF7F41"] = "orange", ["FF671F"] = "orange", ["E35205"] = "orange", ["BE531C"] = "brown", ["73381D"] = "brown", ["DB864E"] = "brown", ["E07E3C"] = "orange", ["DC6B2F"] = "dark orange", ["DC582A"] = "orange", ["C05131"] = "brown", ["864A33"] = "brown", ["674736"] = "brown", ["FFA38B"] = "orange", ["FF8D6D"] = "orange", ["FF6A39"] = "orange", ["FC4C02"] = "orange", ["DC4405"] = "orange", ["A9431E"] = "dark orange", ["833921"] = "brown", ["FFB3AB"] = "pink", ["FF8674"] = "orange", ["FF5C39"] = "orange", ["FA4616"] = "red", ["CF4520"] = "red", ["963821"] = "red", ["6B3529"] = "brown", ["C4622D"] = "brown", ["BA5826"] = "brown", ["AF5C37"] = "brown", ["9E5330"] = "brown", ["924C2E"] = "brown", ["7B4D35"] = "brown", ["5C4738"] = "brown", ["D4B59E"] = "orange", ["C07D59"] = "brown", ["B15533"] = "red", ["9D432C"] = "brown", ["7C3A2D"] = "red", ["6B3D2E"] = "brown", ["5C3D31"] = "brown", ["D14124"] = "red", ["BD472A"] = "red", ["B33D26"] = "red", ["8D3F2B"] = "brown", ["83412C"] = "brown", ["7B4931"] = "brown", ["674230"] = "brown", ["E4D5D3"] = "grey", ["E1BBB4"] = "pink", ["D6938A"] = "pink", ["C26E60"] = "red", ["A4493D"] = "red", ["823B34"] = "red", ["683431"] = "brown", ["DDBCB0"] = "pink", ["CA9A8E"] = "pink", ["BC8A7E"] = "pink", ["A37F74"] = "brown", ["866761"] = "brown", ["6B4C4C"] = "brown", ["583D3E"] = "brown", ["EABEB0"] = "pink", ["C09C83"] = "beige", ["B46A55"] = "brown", ["AB5C57"] = "red", ["A45248"] = "orange", ["9A6A4F"] = "brown", ["8A391B"] = "red", ["ECC3B2"] = "pink", ["ECBAA8"] = "pink", ["EAA794"] = "pink", ["E8927C"] = "pink", ["DA291C"] = "red", ["9A3324"] = "red", ["653024"] = "brown", ["FFB1BB"] = "pink", ["FF808B"] = "pink", ["FF585D"] = "red", ["E03C31"] = "red", ["BE3A34"] = "red", ["81312F"] = "red", ["FFA3B5"] = "pink", ["FF8DA1"] = "pink", ["F8485E"] = "pink", ["EE2737"] = "red", ["D22630"] = "red", ["AF272F"] = "red", ["7C2529"] = "red", ["FCAFC0"] = "pink", ["FB637E"] = "pink", ["F4364C"] = "red", ["CB333B"] = "red", ["A4343A"] = "red", ["643335"] = "brown", ["C66E4E"] = "red", ["C04C36"] = "red", ["B7312C"] = "red", ["AB2328"] = "red", ["93272C"] = "red", ["8A2A2B"] = "red", ["802F2D"] = "red", ["E1523D"] = "red", ["C63527"] = "red", ["A72B2A"] = "red", ["9E2A2B"] = "red", ["6D3332"] = "red", ["633231"] = "brown", ["572D2D"] = "brown", ["E6BAA8"] = "pink", ["E56A54"] = "red", ["E04E39"] = "red", ["CD545B"] = "red", ["B04A5A"] = "pink", ["9B2242"] = "maroon", ["651D32"] = "maroon", ["FABBCB"] = "pink", ["FC9BB3"] = "red", ["F65275"] = "pink", ["E4002B"] = "red", ["C8102E"] = "red", ["A6192E"] = "red", ["76232F"] = "red", ["ECC7CD"] = "pink", ["E89CAE"] = "pink", ["DF4661"] = "pink", ["D50032"] = "red", ["BA0C2F"] = "red", ["9D2235"] = "red", ["862633"] = "red", ["F8A3BC"] = "pink", ["F67599"] = "pink", ["EF426F"] = "pink", ["E40046"] = "red", ["BF0D3E"] = "red", ["9B2743"] = "maroon", ["782F40"] = "red", ["F5B6CD"] = "pink", ["F59BBB"] = "pink", ["EF4A81"] = "pink", ["E0004D"] = "pink", ["C5003E"] = "red", ["A6093D"] = "pink", ["8A1538"] = "maroon", ["F5DADF"] = "pink", ["F7CED7"] = "pink", ["F9B5C4"] = "pink", ["F890A5"] = "pink", ["EF6079"] = "pink", ["E03E52"] = "red", ["CB2C30"] = "red", ["F2D4D7"] = "pink", ["F4C3CC"] = "red", ["F2ACB9"] = "pink", ["E68699"] = "pink", ["D25B73"] = "pink", ["B83A4B"] = "red", ["9E2A2F"] = "red", ["ECB3CB"] = "pink", ["E782A9"] = "pink", ["E0457B"] = "pink", ["CE0037"] = "red", ["A50034"] = "red", ["861F41"] = "red", ["6F263D"] = "red", ["F99FC9"] = "magenta", ["F57EB6"] = "pink", ["F04E98"] = "pink", ["E31C79"] = "red", ["CE0F69"] = "red", ["AC145A"] = "pink", ["7D2248"] = "red", ["F4CDD4"] = "pink", ["E06287"] = "pink", ["E24585"] = "pink", ["B52555"] = "pink", ["A4123F"] = "red", ["971B2F"] = "red", ["6A2C3E"] = "dark red", ["D6C9CA"] = "grey", ["C4A4A7"] = "grey", ["C16784"] = "pink", ["C63663"] = "pink", ["BC204B"] = "red", ["912F46"] = "red", ["7E2D40"] = "red", ["EABEDB"] = "pink", ["E56DB1"] = "pink", ["DA1884"] = "pink", ["A50050"] = "red", ["910048"] = "red", ["6C1D45"] = "maroon", ["936D73"] = "brown", ["934054"] = "purple", ["8E2C48"] = "purple", ["732E4A"] = "purple", ["672E45"] = "purple", ["582D40"] = "purple", ["502B3A"] = "purple", ["EF95CF"] = "pink", ["EB6FBD"] = "pink", ["DF1995"] = "pink", ["D0006F"] = "pink", ["AA0061"] = "purple", ["890C58"] = "pink", ["672146"] = "purple", ["F4A6D7"] = "violet", ["F277C6"] = "pink", ["E93CAC"] = "pink", ["C6007E"] = "pink", ["A20067"] = "pink", ["840B55"] = "purple", ["EAD3E2"] = "grey", ["E6BCD8"] = "pink", ["DFA0C9"] = "pink", ["D986BA"] = "pink", ["C6579A"] = "red", ["AE2573"] = "pink", ["960051"] = "purple", ["E5CEDB"] = "pink", ["E3C8D8"] = "pink", ["DEBED2"] = "grey", ["C996B6"] = "pink", ["B06C96"] = "violet", ["994878"] = "purple", ["7C2855"] = "purple", ["E4C6D4"] = "grey", ["DCB6C9"] = "pink", ["D0A1BA"] = "pink", ["BE84A3"] = "purple", ["A76389"] = "purple", ["893B67"] = "purple", ["612141"] = "purple", ["EBBECB"] = "pink", ["E8B3C3"] = "pink", ["E4A9BB"] = "pink", ["D592AA"] = "pink", ["84344E"] = "maroon", ["6F2C3F"] = "brown", ["572932"] = "brown", ["E2BCCB"] = "pink", ["DCA9BF"] = "pink", ["C9809E"] = "pink", ["B55C80"] = "pink", ["A73A64"] = "purple", ["9B3259"] = "red", ["872651"] = "purple", ["E9CDD0"] = "pink", ["E4BEC3"] = "pink", ["D7A3AB"] = "pink", ["C48490"] = "pink", ["B46B7A"] = "pink", ["984856"] = "red", ["893C47"] = "red", ["F2C6CF"] = "pink", ["F1BDC8"] = "pink", ["E9A2B2"] = "pink", ["DC8699"] = "pink", ["8F3237"] = "red", ["7F3035"] = "red", ["5D2A2C"] = "brown", ["E9C4C7"] = "pink", ["E5BAC1"] = "pink", ["DAA5AD"] = "pink", ["C6858F"] = "pink", ["7A3E3A"] = "dark red", ["6A3735"] = "brown", ["512F2E"] = "brown", ["DFC2C3"] = "pink", ["DBB7BB"] = "pink", ["CCA1A6"] = "pink", ["B07C83"] = "purple", ["9C6169"] = "purple", ["874B52"] = "brown", ["3F2021"] = "brown", ["F1A7DC"] = "pink", ["EC86D0"] = "pink", ["E45DBF"] = "pink", ["DB3EB1"] = "pink", ["C5299B"] = "pink", ["AF1685"] = "purple", ["80225F"] = "purple", ["EFBAE1"] = "pink", ["E277CD"] = "pink", ["D539B5"] = "pink", ["C800A1"] = "pink", ["B0008E"] = "purple", ["9E007E"] = "purple", ["830065"] = "purple", ["EAB8E4"] = "purple", ["E59BDC"] = "purple", ["DD7FD3"] = "pink", ["C724B1"] = "magenta", ["BB16A3"] = "purple", ["A51890"] = "magenta", ["80276C"] = "purple", ["A56E87"] = "purple", ["A83D72"] = "purple", ["991E66"] = "purple", ["8A1B61"] = "pink", ["722257"] = "red", ["6A2A5B"] = "purple", ["5E2751"] = "purple", ["E7BAE4"] = "purple", ["DD9CDF"] = "purple", ["C964CF"] = "purple", ["AD1AAC"] = "violet", ["981D97"] = "purple", ["72246C"] = "violet", ["EBC6DF"] = "purple", ["E6BEDD"] = "purple", ["E2ACD7"] = "purple", ["D48BC8"] = "pink", ["93328E"] = "purple", ["833177"] = "purple", ["612C51"] = "purple", ["EEDAEA"] = "grey", ["CCAED0"] = "purple", ["D59ED7"] = "purple", ["B288B9"] = "violet", ["A277A6"] = "purple", ["9F5CC0"] = "purple", ["963CBD"] = "purple", ["D7A9E3"] = "violet", ["C98BDB"] = "purple", ["AC4FC6"] = "purple", ["9B26B6"] = "pink", ["87189D"] = "purple", ["772583"] = "purple", ["653165"] = "purple", ["948794"] = "grey", ["A2789C"] = "purple", ["A15A95"] = "purple", ["8E3A80"] = "purple", ["6E2B62"] = "purple", ["6A3460"] = "purple", ["5D3754"] = "purple", ["D5C2D8"] = "violet", ["C9B1D0"] = "purple", ["BA9CC5"] = "purple", ["A57FB2"] = "purple", ["642F6C"] = "purple", ["59315F"] = "purple", ["4B3048"] = "purple", ["DBCDD3"] = "grey", ["D0BEC7"] = "grey", ["C6B0BC"] = "grey", ["AF95A6"] = "grey", ["86647A"] = "purple", ["66435A"] = "purple", ["4A3041"] = "purple", ["D8C8D1"] = "grey", ["D3C0CD"] = "purple", ["BFA5B8"] = "pink", ["9B7793"] = "purple", ["7E5475"] = "purple", ["693C5E"] = "purple", ["512A44"] = "purple", ["DFC8E7"] = "violet", ["D7B9E4"] = "purple", ["CAA2DD"] = "purple", ["B580D1"] = "purple", ["8031A7"] = "purple", ["702F8A"] = "purple", ["572C5F"] = "purple", ["D6BFDD"] = "violet", ["C6A1CF"] = "purple", ["8C4799"] = "purple", ["6D2077"] = "purple", ["642667"] = "purple", ["5D285F"] = "purple", ["51284F"] = "purple", ["CBA3D8"] = "purple", ["B884CB"] = "purple", ["A05EB5"] = "purple", ["84329B"] = "purple", ["702082"] = "purple", ["671E75"] = "purple", ["5F2167"] = "purple", ["9991A4"] = "pink", ["8D6E97"] = "purple", ["7A4183"] = "violet", ["6B3077"] = "purple", ["653279"] = "purple", ["5E366E"] = "violet", ["5C4E63"] = "grey", ["C1A0DA"] = "purple", ["A77BCA"] = "purple", ["8246AF"] = "purple", ["5C068C"] = "purple", ["500778"] = "purple", ["470A68"] = "blue", ["3C1053"] = "blue", ["D7C6E6"] = "purple", ["C1A7E2"] = "purple", ["9063CD"] = "purple", ["753BBD"] = "purple", ["5F259F"] = "violet", ["582C83"] = "purple", ["512D6D"] = "violet", ["C5B4E3"] = "purple", ["AD96DC"] = "purple", ["9678D3"] = "purple", ["7D55C7"] = "blue", ["330072"] = "blue", ["2E1A47"] = "violet", ["B4B5DF"] = "blue", ["9595D2"] = "blue", ["7474C1"] = "purple", ["24135F"] = "blue", ["211551"] = "blue", ["201747"] = "blue", ["221C35"] = "navy", ["A7A4E0"] = "violet", ["8B84D7"] = "purple", ["685BC7"] = "purple", ["2E008B"] = "blue", ["280071"] = "blue", ["250E62"] = "blue", ["201547"] = "blue", ["6E7CA0"] = "blue", ["686E9F"] = "blue", ["615E9B"] = "blue", ["565294"] = "blue", ["514689"] = "blue", ["4C4184"] = "blue", ["535486"] = "purple", ["DDDAE8"] = "violet", ["B6B8DC"] = "blue", ["A7A2C3"] = "grey", ["8986CA"] = "blue", ["5D4777"] = "blue", ["4B384C"] = "purple", ["41273B"] = "purple", ["878CB4"] = "blue", ["7C7FAB"] = "blue", ["7566A0"] = "blue", ["6F5091"] = "purple", ["68478D"] = "purple", ["563D82"] = "violet", ["523178"] = "violet", ["E5E1E6"] = "violet", ["E0DBE3"] = "grey", ["C6BCD0"] = "purple", ["A192B2"] = "purple", ["7C6992"] = "purple", ["614B79"] = "purple", ["3F2A56"] = "purple", ["D8D7DF"] = "grey", ["C6C4D2"] = "grey", ["B3B0C4"] = "grey", ["8D89A5"] = "blue", ["595478"] = "blue", ["403A60"] = "blue", ["1E1A34"] = "navy", ["C5CFDA"] = "blue", ["BBC7D6"] = "blue", ["A2B2C8"] = "blue", ["8E9FBC"] = "blue", ["1B365D"] = "blue", ["1F2A44"] = "blue", ["1C1F2A"] = "navy", ["D9E1E2"] = "blue", ["A4BCC2"] = "blue", ["98A4AE"] = "grey", ["768692"] = "blue", ["425563"] = "blue", ["253746"] = "blue", ["131E29"] = "blue", ["B9D3DC"] = "blue", ["A3C7D2"] = "blue", ["8DB9CA"] = "blue", ["6BA4B8"] = "blue", ["003D4C"] = "blue", ["00313C"] = "blue", ["072B31"] = "navy", ["BFCED6"] = "blue", ["B7C9D3"] = "blue", ["A6BBC8"] = "blue", ["7A99AC"] = "blue", ["5B7F95"] = "blue", ["4F758B"] = "blue", ["081F2C"] = "navy", ["D1DDE6"] = "blue", ["C6D6E3"] = "blue", ["9BB8D3"] = "blue", ["7DA1C4"] = "blue", ["5E8AB4"] = "blue", ["236192"] = "blue", ["002E5D"] = "blue", ["DBE2E9"] = "grey", ["CED9E5"] = "blue", ["A7BCD6"] = "blue", ["7D9BC1"] = "blue", ["326295"] = "blue", ["003A70"] = "blue", ["002554"] = "blue", ["DDE5ED"] = "blue", ["C8D8EB"] = "blue", ["B1C9E8"] = "blue", ["7BA4DB"] = "blue", ["407EC9"] = "blue", ["003594"] = "blue", ["001A70"] = "blue", ["BDC5DB"] = "blue", ["89ABE3"] = "blue", ["8094DD"] = "blue", ["7BA6DE"] = "blue", ["5F8FB4"] = "blue", ["3A5DAE"] = "blue", ["606EB2"] = "blue", ["CBD3EB"] = "blue", ["9FAEE5"] = "blue", ["485CC7"] = "blue", ["1E22AA"] = "blue", ["171C8F"] = "indigo", ["151F6D"] = "blue", ["141B4D"] = "blue", ["B8CCEA"] = "blue", ["5C88DA"] = "blue", ["0047BB"] = "blue", ["06038D"] = "blue", ["001871"] = "blue", ["001E62"] = "blue", ["071D49"] = "navy", ["C3D7EE"] = "blue", ["A7C6ED"] = "blue", ["307FE2"] = "blue", ["001A72"] = "blue", ["001E60"] = "blue", ["13294B"] = "blue", ["ABCAE9"] = "blue", ["8BB8E8"] = "blue", ["418FDE"] = "blue", ["012169"] = "blue", ["00205B"] = "blue", ["041E42"] = "blue", ["92C1E9"] = "blue", ["6CACE4"] = "blue", ["0072CE"] = "blue", ["0033A0"] = "blue", ["003087"] = "blue", ["002D72"] = "blue", ["0C2340"] = "navy", ["94A9CB"] = "blue", ["6787B7"] = "blue", ["426DA9"] = "blue", ["385E9D"] = "blue", ["2C5697"] = "blue", ["1D4F91"] = "blue", ["1D428A"] = "blue", ["C6DAE7"] = "blue", ["BDD6E6"] = "blue", ["A4C8E1"] = "blue", ["7BAFD4"] = "blue", ["003C71"] = "blue", ["003057"] = "blue", ["00263A"] = "navy", ["B9D9EB"] = "blue", ["9BCBEB"] = "blue", ["69B3E7"] = "blue", ["003DA5"] = "blue", ["002F6C"] = "blue", ["002855"] = "blue", ["041C2C"] = "navy", ["8DC8E8"] = "blue", ["62B5E5"] = "blue", ["009CDE"] = "blue", ["0057B8"] = "blue", ["004C97"] = "blue", ["003865"] = "blue", ["00263E"] = "blue", ["71C5E8"] = "blue", ["41B6E6"] = "blue", ["00A3E0"] = "blue", ["005EB8"] = "blue", ["004B87"] = "blue", ["003B5C"] = "blue", ["002A3A"] = "navy", ["4698CB"] = "blue", ["298FC2"] = "blue", ["0076A8"] = "blue", ["006298"] = "blue", ["005587"] = "blue", ["004976"] = "blue", ["01426A"] = "blue", ["99D6EA"] = "blue", ["5BC2E7"] = "blue", ["00A9E0"] = "blue", ["0077C8"] = "blue", ["00629B"] = "blue", ["004F71"] = "blue", ["003E51"] = "blue", ["7BA7BC"] = "blue", ["6399AE"] = "blue", ["4E87A0"] = "blue", ["41748D"] = "blue", ["34657F"] = "blue", ["165C7D"] = "blue", ["005776"] = "blue", ["BBDDE6"] = "blue", ["71B2C9"] = "blue", ["4298B5"] = "blue", ["0086BF"] = "blue", ["007DBA"] = "blue", ["00558C"] = "blue", ["002B49"] = "indigo", ["9ADBE8"] = "blue", ["59CBE8"] = "blue", ["00B5E2"] = "blue", ["006BA6"] = "indigo", ["00587C"] = "blue", ["003B49"] = "navy", ["A4DBE8"] = "blue", ["8BD3E6"] = "blue", ["4EC3E0"] = "blue", ["00AFD7"] = "blue", ["0095C8"] = "blue", ["0082BA"] = "blue", ["0067A0"] = "blue", ["48A9C5"] = "blue", ["009CBD"] = "blue", ["0085AD"] = "blue", ["007096"] = "blue", ["006A8E"] = "blue", ["00617F"] = "blue", ["005670"] = "blue", ["B8DDE1"] = "blue", ["9BD3DD"] = "blue", ["77C5D5"] = "red", ["3EB1C8"] = "blue", ["0093B2"] = "blue", ["007396"] = "blue", ["005F83"] = "blue", ["6AD1E3"] = "blue", ["05C3DE"] = "blue", ["00A9CE"] = "blue", ["0092BC"] = "blue", ["007FA3"] = "blue", ["00677F"] = "blue", ["004851"] = "green", ["68D2DF"] = "blue", ["00C1D5"] = "blue", ["00AEC7"] = "blue", ["008EAA"] = "blue", ["00778B"] = "green", ["006272"] = "green", ["004F59"] = "blue", ["63B1BC"] = "blue", ["00A7B5"] = "blue", ["0097A9"] = "blue", ["00859B"] = "blue", ["007D8A"] = "blue", ["007680"] = "blue", ["006269"] = "blue", ["B1E4E3"] = "blue", ["88DBDF"] = "blue", ["2DCCD3"] = "blue", ["009CA6"] = "blue", ["008C95"] = "blue", ["007377"] = "blue", ["005F61"] = "blue", ["A0D1CA"] = "blue", ["40C1AC"] = "green", ["00B0B9"] = "blue", ["00A3AD"] = "blue", ["007398"] = "blue", ["005F86"] = "blue", ["005A70"] = "blue", ["7EDDD3"] = "green", ["5CB8B2"] = "green", ["279989"] = "green", ["007681"] = "blue", ["487A7B"] = "green", ["0D5257"] = "green", ["244C5A"] = "green", ["B6CFD0"] = "pink", ["ABC7CA"] = "green", ["94B7BB"] = "green", ["7FA9AE"] = "green", ["4F868E"] = "blue", ["115E67"] = "blue", ["07272D"] = "navy", ["00968F"] = "green", ["00857D"] = "green", ["007672"] = "green", ["006D68"] = "green", ["00635B"] = "green", ["005E5D"] = "green", ["005151"] = "green", ["9CDBD9"] = "blue", ["64CCC9"] = "blue", ["00B2A9"] = "blue", ["008675"] = "green", ["007367"] = "green", ["00685E"] = "green", ["00534C"] = "green", ["71DBD4"] = "blue", ["2AD2C9"] = "blue", ["00BFB3"] = "blue", ["00A499"] = "green", ["008578"] = "green", ["00594F"] = "green", ["004C45"] = "green", ["7CE0D3"] = "blue", ["2CD5C4"] = "green", ["00C7B1"] = "green", ["00B398"] = "green", ["009681"] = "green", ["007864"] = "green", ["004E42"] = "green", ["6DCDB8"] = "green", ["49C5B1"] = "green", ["00AB8E"] = "green", ["009B77"] = "green", ["008264"] = "green", ["006A52"] = "green", ["034638"] = "green", ["B9DCD2"] = "green", ["A1D6CA"] = "green", ["86C8BC"] = "green", ["6BBBAE"] = "blue", ["006F62"] = "green", ["00594C"] = "green", ["1D3C34"] = "green", ["B5E3D8"] = "green", ["A5DFD3"] = "green", ["98DBCE"] = "blue", ["6BCABA"] = "green", ["00816D"] = "green", ["006C5B"] = "green", ["173F35"] = "green", ["ADCAB8"] = "green", ["9ABEAA"] = "green", ["85B09A"] = "green", ["6FA287"] = "green", ["28724F"] = "green", ["205C40"] = "green", ["284734"] = "green", ["BFCEC2"] = "green", ["A7BDB1"] = "green", ["92ACA0"] = "green", ["7F9C90"] = "green", ["5C7F71"] = "green", ["43695B"] = "green", ["183028"] = "dark green", ["BAC5B9"] = "grey", ["B0BDB0"] = "green", ["A3B2A4"] = "green", ["94A596"] = "green", ["708573"] = "green", ["5E7461"] = "green", ["22372B"] = "green", ["BCC9C5"] = "green", ["B1C0BC"] = "green", ["9DB0AC"] = "blue", ["829995"] = "grey", ["5D7975"] = "green", ["3E5D58"] = "green", ["18332F"] = "green", ["D1E0D7"] = "green", ["B7CDC2"] = "blue", ["9AB9AD"] = "green", ["789F90"] = "green", ["507F70"] = "green", ["285C4D"] = "green", ["13322B"] = "green", ["A7E6D7"] = "green", ["8CE2D0"] = "green", ["3CDBC0"] = "green", ["009775"] = "green", ["007B5F"] = "green", ["00664F"] = "green", ["8FD6BD"] = "blue", ["6ECEB2"] = "blue", ["00B388"] = "green", ["00965E"] = "green", ["007A53"] = "green", ["006747"] = "green", ["115740"] = "green", ["50A684"] = "green", ["00966C"] = "green", ["008755"] = "green", ["007B4B"] = "green", ["006F44"] = "green", ["006845"] = "green", ["005844"] = "green", ["7AE1BF"] = "green", ["47D7AC"] = "green", ["00C389"] = "green", ["00AF66"] = "green", ["007749"] = "green", ["006341"] = "green", ["154734"] = "green", ["A0DAB3"] = "green", ["91D6AC"] = "green", ["71CC98"] = "green", ["009A44"] = "green", ["00843D"] = "green", ["046A38"] = "green", ["2C5234"] = "green", ["A2E4B8"] = "green", ["8FE2B0"] = "green", ["80E0A7"] = "green", ["00B140"] = "green", ["009639"] = "green", ["007A33"] = "green", ["215732"] = "green", ["9BE3BF"] = "green", ["26D07C"] = "green", ["00BF6F"] = "green", ["00B74F"] = "green", ["009F4D"] = "green", ["275D38"] = "green", ["00573F"] = "green", ["4B9560"] = "green", ["228848"] = "green", ["007A3E"] = "green", ["007041"] = "green", ["286140"] = "green", ["36573B"] = "green", ["395542"] = "green", ["6BA539"] = "green", ["48A23F"] = "green", ["319B42"] = "green", ["3A913F"] = "green", ["44883E"] = "green", ["4A773C"] = "green", ["44693D"] = "green", ["ADDC91"] = "green", ["A1D884"] = "green", ["6CC24A"] = "green", ["43B02A"] = "green", ["509E2F"] = "green", ["4C8C2B"] = "green", ["4A7729"] = "green", ["D0DEBB"] = "green", ["BCE194"] = "green", ["8EDD65"] = "green", ["78D64B"] = "green", ["74AA50"] = "green", ["719949"] = "green", ["79863C"] = "olive", ["C2E189"] = "green", ["B7DD79"] = "green", ["A4D65E"] = "green", ["78BE20"] = "green", ["64A70B"] = "green", ["658D1B"] = "green", ["546223"] = "green", ["D4EB8E"] = "green", ["CDEA80"] = "green", ["C5E86C"] = "green", ["97D700"] = "green", ["84BD00"] = "green", ["7A9A01"] = "green", ["59621D"] = "green", ["C4D6A4"] = "green", ["BCD19B"] = "green", ["B7CE95"] = "green", ["A9C47F"] = "green", ["789D4A"] = "green", ["67823A"] = "green", ["4E5B31"] = "green", ["D0D1AB"] = "beige", ["C6C89B"] = "green", ["BABD8B"] = "green", ["A2A569"] = "green", ["8A8D4A"] = "olive", ["6D712E"] = "green", ["3D441E"] = "green", ["D2CE9E"] = "green", ["CBC793"] = "olive", ["C0BB87"] = "olive", ["AFA96E"] = "olive", ["A09958"] = "olive", ["89813D"] = "olive", ["555025"] = "brown", ["C3C6A8"] = "green", ["B3B995"] = "green", ["A3AA83"] = "green", ["899064"] = "green", ["737B4C"] = "green", ["5E6738"] = "green", ["3E4827"] = "green", ["BFCC80"] = "green", ["BBC592"] = "green", ["9CAF88"] = "green", ["8F993E"] = "green", ["76881D"] = "green", ["7A7256"] = "brown", ["5B6236"] = "green", ["BABC16"] = "green", ["ABAD23"] = "green", ["999B30"] = "green", ["888D30"] = "green", ["7C8034"] = "green", ["727337"] = "green", ["656635"] = "green", ["E2E868"] = "yellow", ["DBE442"] = "yellow", ["CEDC00"] = "yellow", ["C4D600"] = "green", ["A8AD00"] = "green", ["949300"] = "green", ["787121"] = "green", ["E9EC6B"] = "yellow", ["E3E935"] = "yellow", ["E0E721"] = "yellow", ["D0DF00"] = "green", ["B5BD00"] = "green", ["9A9500"] = "green", ["827A04"] = "green", ["E3E48D"] = "yellow", ["E0E27C"] = "yellow", ["DBDE70"] = "gold", ["D2D755"] = "yellow", ["B7BF10"] = "gold", ["8E8C13"] = "olive", ["625D20"] = "green", ["F0EC74"] = "yellow", ["EDE939"] = "yellow", ["ECE81A"] = "yellow", ["E1E000"] = "gold", ["BFB800"] = "yellow", ["ADA400"] = "gold", ["A09200"] = "green", ["F3EA5D"] = "yellow", ["F3E500"] = "yellow", ["EFDF00"] = "yellow", ["EEDC00"] = "yellow", ["BBA600"] = "yellow", ["9A8700"] = "brown", ["685C20"] = "green", ["F1EB9C"] = "yellow", ["F0E991"] = "yellow", ["F0E87B"] = "yellow", ["EDE04B"] = "gold", ["EADA24"] = "gold", ["E1CD00"] = "gold", ["CFB500"] = "gold", ["EBE49A"] = "green", ["E9E186"] = "yellow", ["E6DE77"] = "yellow", ["E1D555"] = "yellow", ["D7C826"] = "gold", ["C4B000"] = "yellow", ["B39B00"] = "gold", ["E9DF97"] = "green", ["E4D77E"] = "gold", ["DECD63"] = "gold", ["D9C756"] = "gold", ["B89D18"] = "brown", ["A28E2A"] = "green", ["695B24"] = "green", ["DCD59A"] = "green", ["D6CF8D"] = "yellow", ["D0C883"] = "yellow", ["C0B561"] = "green", ["AC9F3C"] = "gold", ["9F912A"] = "gold", ["8A7B19"] = "gold", ["CAB64B"] = "green", ["CFB023"] = "orange", ["C1A01E"] = "gold", ["A08629"] = "green", ["897630"] = "green", ["736635"] = "brown", ["675E33"] = "brown", ["D4C304"] = "yellow", ["C4B200"] = "yellow", ["91852C"] = "brown", ["747136"] = "green", ["5D6439"] = "green", ["585C3B"] = "green", ["535435"] = "green", ["BBB323"] = "olive", ["B4A91F"] = "green", ["AA9D2E"] = "gold", ["8F7E35"] = "brown", ["716135"] = "brown", ["635939"] = "brown", ["4E4934"] = "brown", ["D5CB9F"] = "beige", ["CFC493"] = "beige", ["C5B783"] = "beige", ["B3A369"] = "gold", ["998542"] = "gold", ["8C7732"] = "green", ["614F25"] = "brown", ["CAC7A7"] = "green", ["BFBB98"] = "grey", ["B0AA7E"] = "grey", ["9B945F"] = "green", ["594A25"] = "brown", ["524727"] = "brown", ["4A412A"] = "brown", ["F1E6B2"] = "yellow", ["DFD1A7"] = "beige", ["D9C89E"] = "beige", ["CEB888"] = "beige", ["A89968"] = "brown", ["94795D"] = "brown", ["816040"] = "brown", ["DDCBA4"] = "beige", ["D3BC8D"] = "beige", ["C6AA76"] = "gold", ["B9975B"] = "gold", ["8B5B29"] = "brown", ["744F28"] = "brown", ["5C462B"] = "brown", ["EFDBB2"] = "orange", ["FCD299"] = "orange", ["E1B87F"] = "gold", ["D6A461"] = "orange", ["C6893F"] = "gold", ["B77729"] = "gold", ["A6631B"] = "brown", ["EDC8A3"] = "orange", ["E7B78A"] = "gold", ["DDA46F"] = "orange", ["C88242"] = "orange", ["B36924"] = "brown", ["934D11"] = "brown", ["7D3F16"] = "brown", ["F3CFB3"] = "orange", ["F1C6A7"] = "orange", ["F0BF9B"] = "orange", ["E59E6D"] = "yellow", ["B86125"] = "brown", ["A45A2A"] = "brown", ["693F23"] = "brown", ["E0C09F"] = "yellow", ["D9B48F"] = "beige", ["CDA077"] = "brown", ["B58150"] = "brown", ["9E652E"] = "brown", ["774212"] = "brown", ["623412"] = "brown", ["E0C6AD"] = "beige", ["DCBFA6"] = "beige", ["CDA788"] = "beige", ["BF9474"] = "brown", ["AD7C59"] = "brown", ["946037"] = "brown", ["4F2C1D"] = "brown", ["E1B7A7"] = "orange", ["D5A286"] = "orange", ["C58B68"] = "brown", ["99552B"] = "brown", ["85431E"] = "brown", ["6D4F47"] = "brown", ["5E4B3C"] = "brown", ["D7C4B7"] = "grey", ["CDB5A7"] = "grey", ["C0A392"] = "beige", ["AE8A79"] = "brown", ["956C58"] = "brown", ["7C4D3A"] = "brown", ["5B3427"] = "brown", ["DBC8B6"] = "beige", ["D3BBA8"] = "beige", ["C6A992"] = "beige", ["AA8066"] = "brown", ["703F2A"] = "red", ["623B2A"] = "brown", ["4E3629"] = "brown", ["D6D2C4"] = "grey", ["C5B9AC"] = "grey", ["B7A99A"] = "pink", ["A39382"] = "grey", ["7A6855"] = "brown", ["63513D"] = "brown", ["473729"] = "brown", ["D1CCBD"] = "pink", ["B7B09C"] = "pink", ["A69F88"] = "green", ["A7ACA2"] = "grey", ["949A90"] = "grey", ["8E9089"] = "green", ["4B4F54"] = "dark blue", ["D0D3D4"] = "grey", ["C1C6C8"] = "blue", ["A2AAAD"] = "pink", ["7C878E"] = "grey", ["5B6770"] = "pink", ["333F48"] = "navy", ["1D252D"] = "navy", ["C7C9C7"] = "grey", ["B2B4B2"] = "grey", ["9EA2A2"] = "grey", ["898D8D"] = "grey", ["707372"] = "grey", ["54585A"] = "grey", ["25282A"] = "navy", ["BEC6C4"] = "grey", ["A2ACAB"] = "grey", ["919D9D"] = "pink", ["717C7D"] = "grey", ["505759"] = "grey", ["3F4444"] = "grey", ["373A36"] = "navy", ["BABBB1"] = "red", ["A8A99E"] = "grey", ["919388"] = "grey", ["7E7F74"] = "pink", ["65665C"] = "grey", ["51534A"] = "grey", ["212322"] = "green", ["C4BFB6"] = "grey", ["AFA9A0"] = "grey", ["9D968D"] = "grey", ["8C857B"] = "grey", ["776E64"] = "grey", ["696158"] = "grey", ["C4BCB7"] = "grey", ["B2A8A2"] = "grey", ["978C87"] = "pink", ["857874"] = "pink", ["746661"] = "brown", ["5E514D"] = "red", ["382F2D"] = "pink", ["D0C4C5"] = "pink", ["C1B2B6"] = "pink", ["AB989D"] = "pink", ["7B6469"] = "pink", ["584446"] = "brown", ["453536"] = "brown", ["382E2C"] = "grey", ["D7D2CB"] = "grey", ["CBC4BC"] = "grey", ["BFB8AF"] = "grey", ["B6ADA5"] = "grey", ["ACA39A"] = "pink", ["A59C94"] = "grey", ["968C83"] = "grey", ["8C8279"] = "brown", ["83786F"] = "brown", ["796E65"] = "brown", ["6E6259"] = "brown", ["D9D9D6"] = "grey", ["D0D0CE"] = "grey", ["C8C9C7"] = "grey", ["BBBCBC"] = "grey", ["B1B3B3"] = "grey", ["A7A8AA"] = "grey", ["97999B"] = "pink", ["888B8D"] = "grey", ["75787B"] = "grey", ["63666A"] = "pink", ["53565A"] = "pink", ["332F21"] = "grey", ["212721"] = "grey", ["31261D"] = "brown", ["3E2B2E"] = "brown", ["101820"] = "navy", ["3D3935"] = "navy"}
	local args = frame.args or frame:getParent().args
	local hex = string.upper(args[1]):gsub("#", "")
	if (isEmpty(hex)) then
		return ''
	end
	return(englishColourNames[hex])
end

return p