@@ -589,7 +595,7 @@
 
 
 
-
+
 
 
 
@@ -597,6 +603,7 @@
 
 
 
+
 
 
 
diff --git a/public/js/commandline.js b/public/js/commandline.js
index b94730b42..db9bfb6f0 100644
--- a/public/js/commandline.js
+++ b/public/js/commandline.js
@@ -114,6 +114,15 @@ let commands = {
                 showCommandLine();
             }
         },
+        {
+            id: "changeLayout",
+            display: "Change layout...",
+            subgroup: true,
+            exec: () => {
+                currentCommands.push(commandsLayouts);
+                showCommandLine();
+            }
+        },
         {
             id: "changeFontSize",
             display: "Change font size...",
@@ -473,6 +482,32 @@ if (Object.keys(words).length > 0) {
     })
 }
 
+let commandsLayouts = {
+    title: "Change layout...",
+    list: [
+        {
+            id: "couldnotload",
+            display: "Could not load the layouts list :("
+        }
+    ]
+};
+
+
+if (Object.keys(layouts).length > 0) {
+    commandsLayouts.list = [];
+    Object.keys(layouts).forEach(layout => {
+        commandsLayouts.list.push({
+            id: "changeLayout" + capitalizeFirstLetter(layout),
+            display: layout.replace('_', ' '),
+            exec: () => {
+                changeLayout(layout);
+                restartTest();
+                saveConfigToCookie();
+            }
+        })
+    })
+}
+
 $("#commandLine input").keyup((e) => {
     if (e.keyCode == 38 || e.keyCode == 40 || e.keyCode == 13) return;
     updateSuggestedCommands();
diff --git a/public/js/jquery-3.5.1.min.js b/public/js/jquery-3.5.1.min.js
new file mode 100644
index 000000000..b0614034a
--- /dev/null
+++ b/public/js/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0
+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0","/?",
+        " "
+    ],
+    dvorak: [
+        "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0(","[{","]}",
+        "'\"",",<",".>","pP","yY","fF","gG","cC","rR","lL","/?","=+","\\|",
+        "aA","oO","eE","uU","iI","dD","hH","tT","nN","sS","-_",
+        ";:","qQ","jJ","kK","xX","bB","mM","wW","vV","zZ",
+        " "
+    ],
+    colemak:[
+        "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
+        "qQ","wW","fF","pP","gG","jJ","lL","uU","yY",";:","[{","]}","\\|",
+        "aA","rR","sS","tT","dD","hH","nN","eE","iI","oO","'\"",
+        "zZ","xX","cC","vV","bB","Kk","mM",",<",".>","/?",
+        " "
+    ]
+}
\ No newline at end of file
diff --git a/public/js/script.js b/public/js/script.js
index 7ed47a03b..cc6bdcc84 100644
--- a/public/js/script.js
+++ b/public/js/script.js
@@ -145,6 +145,33 @@ function initWords() {
   showWords();
 }
 
+function emulateLayout(event){
+  if (config.layout == "qwerty")
+    return event;
+  let layoutMap = layouts[config.layout];
+  let qwertyMap = layouts["qwerty"];
+
+  let mapIndex;
+  let newKey;
+  let shift = false;
+  for (let i = 0; i < qwertyMap.length; i++) {
+    const key = qwertyMap[i];
+    let keyIndex = key.indexOf(event.key);
+    if (keyIndex != -1){
+      mapIndex = i;
+      shift = keyIndex;
+    }
+  }
+
+  newKey = layoutMap[mapIndex][shift];
+  event.keyCode = newKey.charCodeAt(0);
+  event.charCode = newKey.charCodeAt(0);
+  event.which = newKey.charCodeAt(0);
+  event.code = `key${newKey}`;
+  event.key = newKey;
+  return event;
+}
+
 function punctuateWord(previousWord, currentWord, index, maxindex){
 
   let word = currentWord;
@@ -1197,6 +1224,7 @@ $(document).mousemove(function(event) {
 
 //keypresses for the test, using different method to be more responsive
 $(document).keypress(function(event) {
+  event = emulateLayout(event);
   if (!$("#wordsInput").is(":focus")) return;
   if (event["keyCode"] == 13) return;
   if (event["keyCode"] == 32) return;
diff --git a/public/js/settings.js b/public/js/settings.js
index ca12298bb..9aeab1cd3 100644
--- a/public/js/settings.js
+++ b/public/js/settings.js
@@ -7,9 +7,15 @@ function updateSettingsPage(){
 
     let langEl = $(".pageSettings .section.languages .buttons").empty();
     Object.keys(words).forEach(language => {
-        langEl.append(`${language.replace('_', ' ')}
`); 
+        langEl.append(`${language.replace('_', ' ')}
`);
     })
 
+    let layoutEl = $(".pageSettings .section.layouts .buttons").empty();
+    Object.keys(layouts).forEach(layout => {
+        layoutEl.append(`${layout.replace('_', ' ')}
`);
+    });
+    
+
     setSettingsButton('smoothCaret', config.smoothCaret);
     setSettingsButton('quickTab', config.quickTab);
     setSettingsButton('liveWpm', config.showLiveWpm);
@@ -23,6 +29,7 @@ function updateSettingsPage(){
 
     setActiveThemeButton();
     setActiveLanguageButton();
+    setActiveLayoutButton();
     setActiveFontSizeButton();
     setActiveDifficultyButton();
     setActiveCaretStyleButton();
@@ -41,6 +48,11 @@ function setActiveThemeButton() {
     $(`.pageSettings .section.themes .theme[theme=${config.theme}]`).addClass('active');
 }
 
+function setActiveLayoutButton(){
+    $(`.pageSettings .section.layouts .layout`).removeClass('active');
+    $(`.pageSettings .section.layouts .layout[layout=${config.layout}]`).addClass('active');
+}
+
 function setActiveFontSizeButton() {
     $(`.pageSettings .section.fontSize .buttons .button`).removeClass('active');
     $(`.pageSettings .section.fontSize .buttons .button[fontsize=`+config.fontSize+`]`).addClass('active');
@@ -185,6 +197,16 @@ $(document).on("click",".pageSettings .section.languages .language", (e) => {
     setActiveLanguageButton();
 })
 
+//layouts
+$(document).on("click",".pageSettings .section.layouts .layout", (e) => {
+    console.log("clicked")
+    let layout = $(e.currentTarget).attr('layout');
+    changeLayout(layout);
+    showNotification('Layout changed', 1000);
+    restartTest();
+    setActiveLayoutButton();
+})
+
 //fontsize
 $(document).on("click",".pageSettings .section.fontSize .button", (e) => {
     let fontSize = $(e.currentTarget).attr('fontsize');
diff --git a/public/js/userconfig.js b/public/js/userconfig.js
index 17f508f26..4f338d98d 100644
--- a/public/js/userconfig.js
+++ b/public/js/userconfig.js
@@ -17,7 +17,8 @@ let config = {
     blindMode: false,
     quickEnd: false,
     caretStyle: "default",
-    flipTestColors: false
+    flipTestColors: false,
+    layout:"qwerty"
 }
 
 //cookies
@@ -44,6 +45,7 @@ function loadConfigFromCookie() {
         changeWordCount(newConfig.words,true);
         changeMode(newConfig.mode,true);
         changeLanguage(newConfig.language,true);
+        changeLayout(newConfig.layout, true);
         changeFontSize(newConfig.fontSize,true);
         setFreedomMode(newConfig.freedomMode,true);
         setCaretStyle(newConfig.caretStyle,true);
@@ -356,6 +358,22 @@ function changeLanguage(language, nosave) {
     if(!nosave) saveConfigToCookie();
 }
 
+function changeLayout(layout, nosave){
+    if (layout == null || layout == undefined){
+        layout = "qwerty"
+    }
+
+    config.layout = layout;
+    try{
+        firebase.analytics().logEvent('changedLanguage', {
+            language: language
+        });
+    }catch(e){
+        console.log("Analytics unavailable");
+    }
+    if(!nosave) saveConfigToCookie();
+}
+
 function changeFontSize(fontSize, nosave) {
     if (fontSize == null || fontSize == undefined) {
         fontSize = 1;
diff --git a/public/js/words.js b/public/js/words.js
index 352ff1e7f..3c8df3ebe 100644
--- a/public/js/words.js
+++ b/public/js/words.js
@@ -4,11 +4,11 @@ const words = {
   german: ["wie", "ich", "seine", "dass", "er", "war", "für", "auf", "sind", "mit", "sie", "sein", "bei", "ein", "haben", "dies", "aus", "durch", "heiß", "Wort", "aber", "was", "einige", "ist", "es", "Sie", "oder", "hatte", "die", "von", "zu", "und", "ein", "bei", "wir", "können", "aus", "andere", "waren", "die", "tun", "ihre", "Zeit", "wenn", "werden", "wie", "sagte", "ein", "jeder", "sagen", "tut", "Satz", "drei", "wollen", "Luft", "gut", "auch", "spielen", "klein", "Ende", "setzen", "Zuhause", "lesen", "Hand", "Hafen", "groß", "buchstabieren", "hinzufügen", "auch", "Land", "hier", "muss", "groß", "hoch", "so", "folgen", "Akt", "warum", "fragen", "Männer", "Veränderung", "ging", "Licht", "Art", "aus", "müssen", "Haus", "Bild", "versuchen", "uns", "wieder", "Tier", "Punkt", "Mutter", "Welt", "in der Nähe von", "bauen", "selbst", "Erde", "Vater", "jeder", "neu", "Arbeit", "Teil", "nehmen", "erhalten", "Ort", "gemacht", "leben", "wo", "nach", "zurück", "wenig", "nur", "Runde", "Mann", "Jahr", "kam", "zeigen", "jeder", "gut", "mir", "geben", "unsere", "unter", "Name", "sehr", "durch", "nur", "Formular", "Satz", "groß", "denken", "sagen", "Hilfe", "niedrig", "Linie", "abweichen", "wiederum", "Ursache", "viel", "bedeuten", "vor", "Umzug", "Recht", "Junge", "alt", "zu", "gleich", "sie", "alle", "da", "wenn", "nach oben", "Verwendung", "Weg", "über", "viele", "dann", "sie", "schreiben", "würde", "wie", "so", "diese", "sie", "lange", "machen", "Sache", "sehen", "ihm", "zwei", "hat", "suchen", "mehr", "Tag", "könnte", "gehen", "kommen", "tat", "Anzahl", "klingen", "nicht", "am meisten", "Menschen", "meine", "über", "wissen", "Wasser", "als", "Anruf", "erste", "die", "können", "nach unten", "Seite", "gewesen", "jetzt", "finden", "Kopf", "stehen", "besitzen", "der", "das"],
   spanish: ["como", "I", "su", "que", "él", "era", "para", "en", "son", "con", "ellos", "ser", "en", "uno", "tener", "este", "desde", "por", "caliente", "palabra", "pero", "qué", "algunos", "es", "lo", "usted", "o", "tenido", "la", "de", "a", "y", "un", "en", "nos", "lata", "fuera", "otros", "eran", "que", "hacer", "su", "tiempo", "si", "lo hará", "cómo", "dicho", "un", "cada", "decir", "hace", "conjunto", "tres", "querer", "aire", "así", "también", "jugar", "pequeño", "fin", "poner", "casa", "leer", "mano", "puerto", "grande", "deletrear", "añadir", "incluso", "tierra", "aquí", "debe", "grande", "alto", "tal", "siga", "acto", "por qué", "preguntar", "hombres", "cambio", "se fue", "luz", "tipo", "fuera", "necesitará", "casa", "imagen", "tratar", "nosotros", "de nuevo", "animal", "punto", "madre", "mundo", "cerca", "construir", "auto", "tierra", "padre", "cualquier", "nuevo", "trabajo", "parte", "tomar", "conseguir", "lugar", "hecho", "vivir", "donde", "después", "espalda", "poco", "sólo", "ronda", "hombre", "años", "vino", "show", "cada", "buena", "me", "dar", "nuestro", "bajo", "nombre", "muy", "a través de", "sólo", "forma", "frase", "gran", "pensar", "decir", "ayudar", "bajo", "línea", "ser distinto", "a su vez", "causa", "mucho", "significará", "antes", "movimiento", "derecho", "niño", "viejo", "demasiado", "misma", "ella", "todo", "hay", "cuando", "hasta", "uso", "su", "camino", "acerca", "muchos", "entonces", "ellos", "escribir", "haría", "como", "así", "éstos", "su", "largo", "hacer", "cosa", "ver", "él", "dos", "tiene", "buscar", "más", "día", "podía", "ir", "venir", "hizo", "número", "sonar", "no", "más", "personas", "mi", "sobre", "saber", "agua", "que", "llamada", "primero", "que", "puede", "abajo", "lado", "estado", "ahora", "encontrar"],
   dutch: ["als", "zijn", "dat", "hij", "was", "voor", "op", "zijn", "met", "ze", "zijn", "bij", "een", "hebben", "deze", "van", "door", "heet", "woord", "maar", "wat", "sommige", "is", "het", "u", "of", "had", "de", "van", "aan", "en", "een", "in", "we", "kan", "uit", "andere", "waren", "die", "doen", "hun", "tijd", "indien", "zal", "hoe", "zei", "een", "elk", "vertellen", "doet", "drie", "willen", "lucht", "goed", "ook", "spelen", "klein", "zetten", "thuis", "lezen", "de hand", "poort", "grote", "toevoegen", "zelfs", "land", "hier", "moet", "grote", "hoog", "dergelijke", "volgen", "waarom", "vragen", "mannen", "verandering", "ging", "licht", "soort", "uitgeschakeld", "nodig hebben", "huis", "afbeelding", "proberen", "ons", "weer", "dier", "punt", "moeder", "wereld", "dichtbij", "bouwen", "zelf", "aarde", "vader", "een", "nieuwe", "werk", "deel", "nemen", "krijgen", "plaats", "gemaakt", "wonen", "waar", "na", "terug", "weinig", "alleen", "ronde", "man", "jaar", "kwam", "elke", "goed", "mij", "geven", "onze", "onder", "naam", "zeer", "door", "gewoon", "vorm", "zin", "grote", "denken", "zeggen", "helpen", "laag", "lijn", "verschillen", "beurt", "oorzaak", "veel", "betekenen", "voor", "verhuizing", "rechts", "jongen", "oude", "ook", "hetzelfde", "ze", "alle", "er", "wanneer", "omhoog", "gebruiken", "uw", "manier", "over", "veel", "dan", "hen", "schrijven", "zou", "zoals", "dus", "deze", "haar", "lang", "maken", "ding", "zien", "hem", "twee", "heeft", "kijken", "meer", "dag", "kon", "gaan", "komen", "deed", "aantal", "klinken", "geen", "meest", "mensen", "mijn", "meer dan", "weten", "water", "dan", "roep", "eerste", "die", "kan", "naar beneden", "kant", "geweest", "nu", "vinden"],
-  french: ["comme", "je", "son", "que", "il", "était", "pour", "sur", "sont", "avec", "ils", "être", "à", "un", "avoir", "ce", "à partir de", "par", "chaud", "mot", "mais", "que", "certains", "est", "il", "vous", "ou", "eu", "la", "de", "à", "et", "un", "dans", "nous", "boîte", "dehors", "autre", "étaient", "qui", "faire", "leur", "temps", "si", "volonté", "comment", "dit", "un", "chaque", "dire", "ne", "ensemble", "trois", "vouloir", "air", "bien", "aussi", "jouer", "petit", "fin", "mettre", "maison", "lire", "main", "port", "grand", "épeler", "ajouter", "même", "terre", "ici", "il faut", "grand", "haut", "tel", "suivre", "acte", "pourquoi", "interroger", "hommes", "changement", "est allé", "lumière", "genre", "de", "besoin", "maison", "image", "essayer", "nous", "encore", "animal", "point", "mère", "monde", "près de", "construire", "soi", "terre", "père", "tout", "nouveau", "travail", "partie", "prendre", "obtenir", "lieu", "fabriqué", "vivre", "où", "après", "arrière", "peu", "seulement", "tour", "homme", "année", "est venu", "montrer", "tous", "bon", "moi", "donner", "notre", "sous", "nom", "très", "par", "juste", "forme", "phrase", "grand", "penser", "dire", "aider", "faible", "ligne", "différer", "tour", "la cause", "beaucoup", "signifier", "avant", "déménagement", "droit", "garçon", "vieux", "trop", "même", "elle", "tous", "là", "quand", "jusqu’à", "utiliser", "votre", "manière", "sur", "beaucoup", "puis", "les", "écrire", "voudrais", "comme", "si", "ces", "son", "long", "faire", "chose", "voir", "lui", "deux", "a", "regarder", "plus", "jour", "pourrait", "aller", "venir", "fait", "nombre", "son", "aucun", "plus", "personnes", "ma", "sur", "savoir", "eau", "que", "appel", "première", "qui", "peut", "vers le bas", "côté", "été", "maintenant", "trouver"],
+  french: ["comme", "je", "son", "que", "il", "était", "pour", "sur", "sont", "avec", "ils", "être", "à", "un", "avoir", "ce", "à partir de", "par", "chaud", "mot", "mais", "que", "certains", "est", "il", "vous", "ou", "eu", "la", "de", "à", "et", "un", "dans", "nous", "boîte", "dehors", "autre", "étaient", "qui", "faire", "leur", "temps", "si", "volonté", "comment", "dit", "un", "chaque", "dire", "ne", "ensemble", "trois", "vouloir", "air", "bien", "aussi", "jouer", "petit", "fin", "mettre", "maison", "lire", "main", "port", "grand", "épeler", "ajouter", "même", "terre", "ici", "il faut", "grand", "haut", "tel", "suivre", "acte", "pourquoi", "interroger", "hommes", "changement", "est allé", "lumière", "genre", "de", "besoin", "maison", "image", "essayer", "nous", "encore", "animal", "point", "mère", "monde", "près de", "construire", "soi", "terre", "père", "tout", "nouveau", "travail", "partie", "prendre", "obtenir", "lieu", "fabriqué", "vivre", "où", "après", "arrière", "peu", "seulement", "tour", "homme", "année", "est venu", "montrer", "tous", "bon", "moi", "donner", "notre", "sous", "nom", "très", "par", "juste", "forme", "phrase", "grand", "penser", "dire", "aider", "faible", "ligne", "différer", "tour", "la cause", "beaucoup", "signifier", "avant", "déménagement", "droit", "garçon", "vieux", "trop", "même", "elle", "tous", "là", "quand", "jusqu'à", "utiliser", "votre", "manière", "sur", "beaucoup", "puis", "les", "écrire", "voudrais", "comme", "si", "ces", "son", "long", "faire", "chose", "voir", "lui", "deux", "a", "regarder", "plus", "jour", "pourrait", "aller", "venir", "fait", "nombre", "son", "aucun", "plus", "personnes", "ma", "sur", "savoir", "eau", "que", "appel", "première", "qui", "peut", "vers le bas", "côté", "été", "maintenant", "trouver"],
   polish: ["jak","I","jego","że","on","było","dla","na","są","zespół","oni","być","w","jeden","mieć","tego","z","przez","gorący","słowo","ale","co","niektóre","jest","to","ty","lub","miał","kilka","stopa","do","i","ciągnąć","w","my","puszka","na zewnątrz","inne","były","który","zrobić","ich","czas","jeśli","będzie","jak","powiedział","próba","każda","powiedzieć","nie","zestaw","trzy","chcą","powietrze","dobrze","również","grać","mały","koniec","wkładać","Strona główna","czytaj","ręka","port","duży","zaklęcie","dodać","nawet","ziemia","tutaj","musi","duży","wysoki","takie","śledzić","akt","dlaczego","zapytaj","mężczyźni","zmiana","poszedł","światła","rodzaj","z","potrzeba","dom","obraz","spróbuj","nas","ponownie","zwierząt","punkt","matka","świat","blisko","budować","własny","ziemia","ojciec","dowolny","nowy","praca","część","wziąć","dostać","miejsce","wykonane","żyć","gdzie","później","z powrotem","mało","tylko","okrągły","mężczyzna","rok","spokojnie","pokaż","każdy","dobry","mnie","dać","nasze","pod","Nazwa","bardzo","przez","tylko","formularz","zdanie","wielki","myśleć","powiedzieć","pomoc","niski","linia","różnią","kolej","przyczyna","wiele","oznaczać","przed","ruch","prawo","chłopiec","stary","zbyt","sam","ona","wszystko","tam","kiedy","w górę","zastosowanie","Twój","sposób","o","wiele","następnie","im","pisać","byłoby","jak","tak","te","ją","długo","zrobić","rzecz","zobaczyć","mu","dwa","ma","szukać","więcej","dzień","może","iść","przyjść","nie","liczba","brzmieć","nie","najbardziej","ludzie","My","ponad","wiem","woda","niż","wezwanie","pierwszy","kto","może","w dół","bok","było","teraz","odnaleźć"],
   chinese: ["一","人","里","会","没","她","吗","去","也","有","这","那","不","什","个","来","要","就","我","你","的","是","了","他","么","们","在","说","为","好","吧","知道","我的","和","你的","想","只","很","都","对","把","啊","怎","得","还","过","不是","到","样","飞","远","身","任何","生活","够","号","兰","瑞","达","或","愿","蒂","別","军","正","是不是","证","不用","三","乐","吉","男人","告訴","路","搞","可是","与","次","狗","决","金","史","姆","部","正在","活","刚","回家","贝","如何","须","战","不會","夫","喂","父","亚","肯定","女孩","世界","不要","些","不知道","不能","因","觉","发","像","太","但是","多","打","机","來","好了","用","他的","诉","德","叫","什麼","真","干","心","走","比","死","嘿","出","车","一下","中","好吧","需要","经","妈","候","长","而","错","好的","间","又","国","起","动","杀","于","种","去了","担","名","混蛋","礼","幹","不了","有些","過","後","击","漂亮","神","多少","海","每","哥","教","走吧","好像","单","公","林","女","忙","火","钟","家伙","科","回去","最后","水","不管","麦","泻","鬼","還","船","永","安全","那個","爾","這麼","满","风","皮","威","据","鲁","转","相"],
   chinese_simplified: ["我","的","你","是","了","不","们","这","一","他","么","在","有","个","好","来","人","那","要","会","就","什","没","到","说","吗","为","想","能","上","去","道","她","很","看","可","知","得","过","吧","还","对","里","以","都","事","子","生","时","样","也","和","下","真","现","做","大","啊","怎","出","点","起","天","把","开","让","给","但","谢","着","只","些","如","家","后","儿","多","意","别","所","话","小","自","回","然","果","发","见","心","走","定","听","觉","太","该","当","经","妈","用","打","地","再","因","呢","女","告","最","手","前","找","行","快","而","死","先","像","等","被","从","明","中","哦","情","作","跟","面","诉","爱","已","之","问","错","孩","斯","成","它","感","干","法","电","间","哪","西","己","候","次","信","欢","正","实","关","进","车","年","喜","认","克","爸","谁","方","老","应","比","帮","无","晚","动","头","机","分","特","相","全","杀","需","放","常","直","才","美","于","带","今","力","工","许","东","名","同","长","亲","种","者","嘿","白","学","安","尔","叫","理"],
   korean: ["로","나는","그의","그","그","했다","에 대한","에","아르","와","그들","있다","에","일","이","이","부터","에 의해","뜨거운","단어","하지만","무엇","다소","이다","그","당신","또는","했다","에","의","에","과","이","에","우리","수","아웃","다른","했다","하는","할","자신의","시간","면","것","방법","말했다","이","각","이야기","하지","세트","세","필요","공기","잘","또한","재생","작은","끝","넣어","홈","읽기","손","포트","큰","철자","추가","도","땅","여기","해야","큰","높은","이러한","따라","행위","이유","문의","남자","변경","갔다","빛","종류","오프","필요가있다","집","사진","시험","우리","다시","동물","포인트","어머니","세계","가까운","구축","자기","지구","아버지","모든","새로운","일","일부","소요","도착","장소","만든","살고있다","어디에","후","다시","작은","만","둥근","사람","년","온","쇼","모든","좋은","나를","제공","우리의","아래의","이름","대단히","를 통해","단지","양식","문장","큰","생각","말","도움","낮은","온라인","차이","회전","원인","많은","의미","이전","움직임","바로","소년","늙은","너무","동일","그녀","모든","그곳에","때","올라","사용","당신의","방법","에 대한","많은","다음","그","쓰기","것","같은","그래서","이들","그녀의","긴","확인","일","참조","그","두","이","봐","더","일","수","이동","올","한","수","소리","없음","가장","사람들","내","이상","알고","물","보다","통화","첫째","사람","수도","아래로","측면","하고","지금","발견"],
   thai: ["มูสิกะ","ขยุม","ปฏิทิน","ตันติ","พวงจะริตา","กระเบง","กำเสาะ","ทัก","ตระหนก","จำรัส","ขยิก","ทูตานุทูต","แก้มแหม่ม","ตุ๊กแก","เฉาโฉด","วิสรรชนีย์","กระแห","ตะโกดำ","กันทร","คัคนางค์","กำคูน","พุทธังกูร","จำแล่น","ผิว","มหาอุปราช","อัชฌา","ทะนุก","เวณิ","ทุเรียน","รัตตัญญู","ทัพพะ","คานธรรพเวท","ทมะ","ธาตรี","อูรุ","หลิม","บาเรียม","กระจาน","อนุรักษ์","เปอร์เซ็นต์","เขียดแลว","อนุชาต","ยี่สน","โครำ","ลรรลุง","ไกรพ","ขี้กาเหลี่ยม","ดะ","มิถุนายน","ปนัดดา","อักโข","ต้อน","บุ้งร้วม","อนาธิปไตย","ปรียา","ปุเรจาริก","ระหอบ","ปุคละ","สางห่า","ชิงเกิล","กิมิวิทยา","แมว","นมนาน","ทรทึง","เฉาฮื้อ","ประดุง","นาคี","ตละ","พรู","ดอกหิน","หัต","เอเคอร์","วิจิตร","ปฏิกรณ์","มังกุ","ก็","พังผืด","แลบ","โต๊ะ","ว็อมแว็ม","ปลูก","ถบ","รจนา","ฟะฟั่น","เยซู","ถอบแถบ","เปร","เชี่ยม","กรรไตร","ศิษฎิ","กามา","พาเหียร","โป","กระนก","แหยง","ปาหุณ","เพรซีโอดิเมียม","พยัก","เขี้ยว","รึกต์","แคล่วคล่อง","หงุดหงิด","วาร","พูน","เกล็ดข้าวเม่า","เยาะ","จม","กระลา","สำลาน","มิลลิบาร์","เวหน","รุกษะ","กาเยนทรีย์","อธิบาย","ฌาน","แมลงเม่า","บรอนซ์","ตรุย","หงัก","สุวภาพ","ต่ำ","บริโภค","อนุโพธ","ฟัก","เกน","ซุ่ม","อัมพร","วายะ","โพบาย","สุทรรศน์","เทพ","กะลวย","แหน็ว","กมณฑลาภิเษก","ยิปซัม","จรรจา","มัชชาระ","กีรติ","ระวังวัน","ตอน","ไข้","อาฆาต","ครำ","โผะ","ประแอก","เด่น","เปรี้ยว","กระทุน","ลิ้นเสือ","ธาตรี","ฤๅษีผสม","สตูป","บรรษัท","สังดัก","สังกะสี","ดุบ","ปัดไถม","ปราจีน","ผลิต","ปะปน","จื้นเจือก","ปุก","กำผลา","กนก","สุรางค์จำเนียง","ขวัญอ่อน","เพิก","ควักค้อน","นาลิวัน","โคนดินสอ","แอ้ด","ทัฬหี","โลกย์","สาฬุระ","ปราคภาร","สรสรก","ปรตยาค","ดุษิต","นางรำ","ทุทรรศนนิยม","หนี้","สลัด","ยื้อ","ศักติ","กระเทียมหอม","หญ้าปากคอก","อ๋า","สำรอง","อปหาร","ฟ้าฝ่อ","ประเดยก","ง่วน","กะโปโล","ทุกข์","แยงแย่","ลิ่ว","ไพร่","อนุกร","มี","ยั่งยืน","ราษฎร์","ก่ง","สีสุก","สัมบูรณ์","ผ่า","แฉง","ไอออน","กระลับกระลอก","นี่","ขมัง","แพ่น","เอี้ยมจุ๊น","ด้วมเดี้ยม","ไล่","ศัสดร","ขยุ้มตีนหมา","โอฆะ","โทลา","กางของ","นิเสธ","ไภษัชคุรุ","ระราว","พาณินี","เพตร","โรเดียม","กุศราช","เค้ง","อสุเรศ","สัค","บรั่นดี","อีแก่","จิ้งจอก","ล่ก","ซีเรียม","อสุ","ฟาง","ชลาธาร","ตู","สอ","หอยโข่ง","หนามดำ","พุงดอ","ปฏิพัทธ์","ขว้าง","ถีบ","ฟาด","โวหาร","กะตัก","พญาลอ","กลาย","อรหะ","มรณ์","โขนง","หงึก","ค้ำ","เศรษฐี","เลขกะ","นางแอ่น","บึง","หวือ","บุพเพสันนิวาส","โกษีย์","ตำแยตัวผู้","วิหิงสา","ชัวชม","พินิต","ปึมปื้อ","ย้อน","สาโลหิต","กะหร็อมกะแหร็ม","สุปาณี","กรนทา","หมอช้างเหยียบ","ม้าง","หลน","มนุชาธิป","พฤกษา","กระชอม","สูสี","อาญา","ระแด","มหายาน","มหาดเล็ก","ดม","ดุ่ม","ธาดา","ประจบประแจง","ปลาหมึก","สันสกฤต","บัปผาสะ","เลียน","ทัพพี","ริบรี่","เฮ้อ","อื่น","กเฬวราก","เฉนียน","แวว","หลิ่ง","หญ้าขัด","ทักข์","ควย","เฮิรตซ์","ด้ามจิ้ว","ปราศรัย","เตะ","ฟ้ามุ่ย","แป๊ะซะ","หยวบ","ราชายตนะ","เมี้ยน","ภุกตาหาร","ถ่อ","คราส","ขยุบ","กัณณ์","ไพเราะ","คลาย","อังกาบ","ขื่อผี","ประทุษฐ์","มหาบัณฑิต","วิเชียร","ประทุฐ","มรรตยะ","สูสี","กัลยาณี","จำปูน","กุฏฐัง","ก้งโค้ง","แป๊ดแป๋","สุ่ม","โอฬาร","มุนี","แจรก","รำเร","อนาถ","คัง","จรวดไจร","หงุดหงิด","แกร็บ","ราษราตริน","มณี","คร่ำ","ตัก","บ้อหุ้น","มหาพรหม","รันธะ","ว้า","ของ","น้ำใจใคร่","กัลเอา","ธนาคารออมสิน","สร้าง","เปสุไณย","ขนาบ","กินูน","กำปั่น","เซี่ยวกาง","การก","จราจร","สรรเพชญ","ประแพร่งประแพรว","มะยม","สังกะสี","เวทานต์","หยี่","งั่ก","หมอเทศ","กเบนทร์","ควั่งคว้าง","วเนจร","สนเดก","หัสตะ","สาน","อสาธุ","ทรง","พัวะ","จัมปา","เท้า","อ๋อ","นรก","ฮุยเลฮุย","กว่าน","ตังเก","สังกัปปะ","ฉลีก","ชะงอก","นหาดก","โปส","สเปกตรัม","กะแทน","กรุณา","ขันทองพยาบาท","ขล้อเงาะ","สินเทา","สงสาร","อภิรมย์","พนาศรัย","ทอง","แค็ตตาล็อก","ชนิด","ชะลาน","วาณิชกะ","ฉักกะ","เสือตอ","สุษิระ","อัญประกาศ","ออนซ์","กระต่องกระแต่ง","ธรณ","ดำรง","ผรสุ","ประสบ","กษีรามพุ","ถิ่น","แฮฟเนียม","ฝ่าย","เซา","อิ้ว","ตุล","วุด","ปอเต่าไห้","ผีเสื้อหัวกะโหลก","ภควดี","ปลอบ","แมงดา","ยานี","กระลอม","วิธาน","หัวโล้น","ชะวัง","มัชชาระ","มุณฑะ","พะไล","จรด","ล้ำลึก","ปลวก","ไพร่","ผักหนาม","ดอกดิน","กระทู้","เอกังสวาที","ขี้สูด","ปืดปึง","เหนือ","นางดำ","แล้ง","ปโยธรา","เผิ้ง","ทรู่","ตระแบก","ศีขริน","สัปเหร่อ","ก้ง","กุดจี่","จ่าง","ทองพระขุน","กลาก","เป้ง","ทำวน","ฑังสะ","หลาวชะโอน","อปภาคย์","หลีบ","มะลื่น","อังคีรส","หู่","ผล","กระชับ","กระตัก","บริวาส","จับโปง","หางนกกะลิง","มอบ","คออ่อน","ศักดา","ทุบทู","บ๋ำ","ยรรยง","วรรธนะ","ซะซ่อง","แอ๊ด","น้ำตะกู","วัฏฏิ","พยาบาท","กระทุงหมาบ้า","แพร่ง","สาเก","หง่าว","การิตการก","ดะหมัง","ปริสัญญู","ทรอุ้ม","ชนม์","เภท","เยี่ยว","มะพลับ","โศกาดูร","เหม็น","นิรันดร","ท้วย","ยกนะ","อุจฉุ","รองช้ำ","มรณานต์","บานเที่ยง","ละบู","ศาณ","ติมินทะ","อันตราย","แผ่ว","แวง","นีติ","ไส้","เทื่อ","เคลีย","ไซโล","เตี่ยว","กระมิดกระเมี้ยน","อันตลิกขะ","ถละ","ก่าย","พฤติ","ขาเขียด","เสมอ","จับกัง","แหม่ม","หงอย","ระเบ็ง","ฤดี","มวย","จำปาขอม","แสตมป์","บุษบง","ดรธาน","แดด","สทุม","ชะพลู","วิทูร","ฐานานุกรม","ทิชาชาติ","นท","เนียรทุกข์","ทักษิณานุประทาน","สุนทรียะ","ไขว้","เผง","สังฆานุสติ","มะตี","เย็ด","ดักเดี้ย","ตักกะ","ศตะ","ขนมเส้น","หมี","กะส้าหอย","กระทะ","โยง","กะทือ","เรดาร์","กระดุ","อุย","ติมินทะ","สลิด","หมากแข้ง","ไรย์","โยธา","ละเมียบ","จินต์","พะจง","กระย่อน","กระวน","กระนี้","เลิ่กลั่ก","จ๊อก","โฮก","ลังคิ","ข่อยหยอง","เกรง","ธนาคารแห่งประเทศไทย","สิธยะ","ก้านพร้าว","ลำมาด","ประดอย","โจ่งครุ่ม","เย็บ","จะกลาม","ดรุ","นฬป","ปรีด์ ","สวามี","บุรินทร์","ชนหิน","ริ","อัศวินี","สุรัติ","บาจรีย์","ลำโอง","เอ้อเร้อ","ลัมพ์","เร็ว","ตาน","ละหลัด","โรคาพยาธิ","ทน","บังแทรก","จิ้มฟันจระเข้","ผัลคุนี","ไคล้","แปรงหูหนู","บันโดย","ปริโภค","ปทัฏฐาน","โรคันดรกัป","สีเสียดเปลือก","ละล่ำละลัก","ศีรษะ","จุน","เชลแล็ก","สักกะ","เยอะ","ประจัญ","วัตตา","ตุ๊กตุ๋ย","ศาพระ","พิทักษ์สันติ","ครัดเคร่ง","ขีณาสพ","ชทึง","กระฎุมพี","ทรสุม","ปะโลง","ด้วงน้ำมัน","ทุพภิกขภัย","พนม","สูกษมะ","ถลน","ถ่าน","ฉมำ","เข็มหมุด","ลังคี","ตีนเทียน","นมนาง","บรรเจิด","ปะหงับ","ละมา","ความโน้มถ่วง","ตะกุย","วาหินี","พิมุข","สถาบัน","มะป่อง","กังขา","หิว","อนุวงศ์","รีต","วอแว","ระใบ","ประตาป","กระทาชาย","อินทรชิต","เพียงออ","เอะอะ","ชะอม","เดชะ","ก๊อก","ศุลี","มหาชาติ","เนื้อ","สนิกะ","กวางผา","เอี่ยน","ประจุคมน์","แม้","เศวดงค์","อักขรานุกรม","อ้องแอ้ง","ศากยะ","เสนากุฎ","ฉัฐ","รัฐ","วิศาขะ","ละคร","ยาสูบ","ศวา","โหวด","เฆี่ยน","กรกัติ","โตย","วิกขัมภ์","พินิจ","สัญโญชน์","กระจองหง่อง","มุหงิด","เซลลูลอยด์","แบหลา","ทะมัดทะแมง","จั๊กแหล่น","อดิศวร","ดอลลาร์","ตะรังตังช้าง","ไพโดร","แถ","สัมพาธะ","กระหาง","ทำ","สรลอด","ตอดต่อ","กระดาก","ห่วง","วาปี","ผคม","ภาชี","โรเมอร์","กระจ่า","กัญจุการา","ทัพพี","สะระตะ","ถ่าว","เมนเดลีเวียม","แนว","แฟง","เพรียก","กำพด","ตรัยตรึงศ์","อลหม่าน","บุพพาษาฒ","จมูกปลาไหล","แมน","ชำแระ","ปรือ","แพ่น","ชิ่น","เนกขะ","โมเมนต์","นำ","ยาสูบ","ปลด","สละสลวย","กระเซอ","เชลแล็ก","ยุกต์","ยี่ห้อ","ชงโค","จาริก","กะเม็ง","ฝัง","หวายดิน","กังเกียง","ปีฬกะ","ตะโขง","ผาม","มุตะ","นวย","ปกรณ์","อะคร้าว","วาบ","กะพั้น","บุหรี่พระราม","ยักเพรีย","อุปสรรค","ตระแบ่","น้าว","กักการุ","เกี๊ยะ","มะตะบะ","สุหฤท","สมาพันธรัฐ","โวการ","ตะคิว","เก็ง","สงบ","เครื่อง","ขอบ","ผิ","ศากะ","แฟชั่น","อำพล","กระปรี้กระเปร่า","กระจุย","พอน","หง่อย","กำลังช้างเผือก","วัฒกะ","กริว","เด๋อ","คอแดง","นาฏกะ","อติ","เหมียว","กัลหาย","วัลลภ","ทรงกระเทียม","แจ๋","สารัทธ์","เวท","โล่ติ๊น","วิชญะ","มดาย","เรือน","กระดวน","อัน","ขรุขระ","เปสละ","ชาระ","ตระโมจ","ทุนนิมิต","กระซุบกระซิบ","เย้","หลน","สุชาดา","อัฐ","ลักขณา","ประไหมสุหรี","โปร่ง","วาสุกรี","ฆ้องสามย่าน","ตระหนี่","อหึงสา","ถ่อ","ขนง","นมักการ","สัขยะ","ปนัดดา","นีล","ไผ่ผัง","ชั้ว","ทองระอา","กวางผา","ไพเพิด","กร่อย","อนุ","ชุมเพ็ด","ลูกประคำผี","เลาะ","ชฎา","ไรฟัน","ระชวย","ลาญ","เนรกัณฐี","ล้อมปรวด","คัคนานต์","ฝีหมอบ","สรล้าย","อุด","วิมุข","กระดูกกบ","โตรก","ภารดี","จอบ","ไซเกิล","หนู","วธู","ลน","สาหรี","ซบ","ธาดา","เมทานอล","วิกจะ","ชอม","เดือย","อชิน","มรรษ","กำพง","อติเทพ","ฉะฉาด","ครั่นครื้น","เกี่ยว","นเรศูร","ภคันทลา","สณฑ์","อัมพร","คีต","เนียมหูเสือ","ศระวณะ","อารักษ์","มลื่น","โภช","ธานี","สังวาส","ฟาด","กรรเอา","มัลละ","สัญฌา","ก๊วยเตี๋ยว","ทมะ","เทศาจาร","หมากผาง","กร่ำ","กระย่อม","แสะ","ต่องแต่ง","ฮั่น","มัด","กระตุ้งกระติ้ง","จองเปรียง","สงสัย","เอวัง","วยามะ","เสือ","แต้จิ๋ว","วิษักต์","ก๊อก","คล้ำ","เถิง","ลาน","กาซะลอง","ปิงคละ","ทท","ตรุษ","อัฏ","สังเกต","กระลด","ถลึงตา","ข้าศึก","ชรแรง","หะแห้น","พิมุข","ระบือ","วดี","คนโท","ไม่","พิไร","กด","เมฆฉาย","ปริหาน","เลื่่อย","บังอรู","หมุ่ย","วัตถุ","ระเลิง","ระวาย","ภีตะ","อาดุลย์","ชีวัง","มรณะ","ประนอ","เหงื่อ","เยีย","ปราภพ","ชะมดต้น","นาคาวโลก","ชงคา","ภีมะ","มหาวิทยาลัย","กาลัด","ถ่าว","หลุด","ทุเรียนเทศ","ภาระ","มะยง","มัสรู่","กระเกริก","เกาบิน","รำยวน","สะทึ่น","ฉัททันต์","กะ","นาฬิเก","ไรฟัน","วาสุกี","โซเดียม","ตูหนา","พระลบ","วัฏกะ","วิกัติการก","วิบุลย์","กวี","อาเจียน","หัวร้อยรู","เปื้อน","กริว","นกเขา","กะ","กระกวด","ธนัง","มัดหมี่","ลิ้นลา","อัทธาน","ป้วน","พลบ","จำอวด","เอกเขนก","ดีนาคราช","ปะติยาน","เชอ","ผณิน","เอนไซม์","ไรย์","ชไม","ภารต","หาสกะ","ระ","ปทานุกรม","โฉ่งฉ่าง","ศฤคาล","เพ็งแพว","ดำนาณ"],
   russian: ["и","в","не","на","я","быть","он","с","что","а","по","это","она","этот","к","но","они","мы","как","из","у","который","то","за","свой","что","весь","год","от","так","о","для","ты","же","все","тот","мочь","вы","человек","такой","его","сказать","только","или","еще","бы","себя","один","как","уже","до","время","если","сам","когда","другой","вот","говорить","наш","мой","знать","стать","при","чтобы","дело","жизнь","кто","первый","очень","два","день","ее","новый","рука","даже","во","со","раз","где","там","под","можно","ну","какой","после","их","работа","без","самый","потом","надо","хотеть","ли","слово","идти","Россия","большой","должен","место","иметь","ничто","то","сейчас","тут","лицо","каждый","друг","нет","теперь","ни","глаз","тоже","тогда","видеть","вопрос","через","да","здесь","дом","да","потому","сторона","какой-то","думать","сделать","страна","жить","чем","мир","об","последний","случай","голова","более","делать","что-то","смотреть","ребенок","просто","конечно","сила","российский","конец","Москва","перед","несколько","вид","система","всегда","работать","между","три","нет","понять","пойти","часть","спросить","город","дать","также","никто","понимать","получить","отношение","лишь","второй","именно","ваш","хотя","ни","сидеть","над","женщина","оказаться","русский","один","взять","прийти","являться","деньги","почему","вдруг","любить","стоить","почти","земля","общий","ведь","машина","однако","сразу","хорошо","вода","отец","высокий","остаться","выйти","много","проблема","начать"]
-};
\ No newline at end of file
+};
diff --git a/public/themes/gruvbox_dark.css b/public/themes/gruvbox_dark.css
new file mode 100644
index 000000000..c14bb05db
--- /dev/null
+++ b/public/themes/gruvbox_dark.css
@@ -0,0 +1,9 @@
+:root {
+    --bg-color: #282828;
+    --main-color: #d79921;
+    --caret-color: #458588;
+    --sub-color: #b8bb26;
+    --text-color: #ebdbb2;
+    --error-color: #fb4934 ;
+    --extra-error-color: #cc241d;
+}
\ No newline at end of file
diff --git a/public/themes/gruvbox_light.css b/public/themes/gruvbox_light.css
new file mode 100644
index 000000000..964bfbf3b
--- /dev/null
+++ b/public/themes/gruvbox_light.css
@@ -0,0 +1,9 @@
+:root {
+    --bg-color: #fbf1c7;
+    --main-color: #d79921;
+    --caret-color: #458588;
+    --sub-color: #98971a;
+    --text-color: #3c3836;
+    --error-color: #cc241d;
+    --extra-error-color: #9d0006;
+}
\ No newline at end of file
diff --git a/public/themes/list.json b/public/themes/list.json
index bf05ee4fa..72ca9790c 100644
--- a/public/themes/list.json
+++ b/public/themes/list.json
@@ -153,5 +153,20 @@
         "name": "taro",
         "bgColor": "#b3baff",
         "textColor": "#130f1a"
+    },
+    {
+        "name": "striker",
+        "bgColor": "#124883",
+        "textColor": "#d6dbd9"
+    },
+    {
+        "name": "gruvbox_dark",
+        "bgColor": "#282828",
+        "textColor": "#ebdbb2"
+    },
+    {
+        "name": "gruvbox_light",
+        "bgColor": "#fbf1c7",
+        "textColor": "#458588"
     }
 ]
diff --git a/public/themes/striker.css b/public/themes/striker.css
new file mode 100644
index 000000000..beb0b8889
--- /dev/null
+++ b/public/themes/striker.css
@@ -0,0 +1,9 @@
+:root {
+    --bg-color: #124883;
+    --main-color: #d7dcda;
+    --caret-color: #d7dcda;
+    --sub-color: #0f2d4e;
+    --text-color: #d6dbd9;
+    --error-color: #fb4934;
+    --extra-error-color: #cc241d;
+}
\ No newline at end of file