diff --git a/components.js b/components.js
index d221041e58..b9e4eb1873 100644
--- a/components.js
+++ b/components.js
@@ -1,2 +1,2 @@
-var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":"hbs","owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["css","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"matlab":{"title":"MATLAB","owner":"Golmote"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to <a href=\"https://webplatform.github.io/docs/\">WebPlatform.org documentation</a>. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}};
+var components = {"core":{"meta":{"path":"components/prism-core.js","option":"mandatory"},"core":"Core"},"themes":{"meta":{"path":"themes/{id}.css","link":"index.html?theme={id}","exclusive":true},"prism":{"title":"Default","option":"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{"title":"Okaidia","owner":"ocodia"},"prism-twilight":{"title":"Twilight","owner":"remybach"},"prism-coy":{"title":"Coy","owner":"tshedor"},"prism-solarizedlight":{"title":"Solarized Light","owner":"hectormatos2011 "},"prism-tomorrow":{"title":"Tomorrow Night","owner":"Rosey"}},"languages":{"meta":{"path":"components/prism-{id}","noCSS":true,"examplesPath":"examples/prism-{id}","addCheckAll":true},"markup":{"title":"Markup","alias":["html","xml","svg","mathml","ssml","atom","rss"],"aliasTitles":{"html":"HTML","xml":"XML","svg":"SVG","mathml":"MathML","ssml":"SSML","atom":"Atom","rss":"RSS"},"option":"default"},"css":{"title":"CSS","option":"default","modify":"markup"},"clike":{"title":"C-like","option":"default"},"javascript":{"title":"JavaScript","require":"clike","modify":"markup","optional":"regex","alias":"js","option":"default"},"abap":{"title":"ABAP","owner":"dellagustin"},"abnf":{"title":"ABNF","owner":"RunDevelopment"},"actionscript":{"title":"ActionScript","require":"javascript","modify":"markup","owner":"Golmote"},"ada":{"title":"Ada","owner":"Lucretia"},"agda":{"title":"Agda","owner":"xy-ren"},"al":{"title":"AL","owner":"RunDevelopment"},"antlr4":{"title":"ANTLR4","alias":"g4","owner":"RunDevelopment"},"apacheconf":{"title":"Apache Configuration","owner":"GuiTeK"},"apex":{"title":"Apex","require":["clike","sql"],"owner":"RunDevelopment"},"apl":{"title":"APL","owner":"ngn"},"applescript":{"title":"AppleScript","owner":"Golmote"},"aql":{"title":"AQL","owner":"RunDevelopment"},"arduino":{"title":"Arduino","require":"cpp","owner":"dkern"},"arff":{"title":"ARFF","owner":"Golmote"},"asciidoc":{"alias":"adoc","title":"AsciiDoc","owner":"Golmote"},"aspnet":{"title":"ASP.NET (C#)","require":["markup","csharp"],"owner":"nauzilus"},"asm6502":{"title":"6502 Assembly","owner":"kzurawel"},"autohotkey":{"title":"AutoHotkey","owner":"aviaryan"},"autoit":{"title":"AutoIt","owner":"Golmote"},"avisynth":{"title":"AviSynth","alias":"avs","owner":"Zinfidel"},"avro-idl":{"title":"Avro IDL","alias":"avdl","owner":"RunDevelopment"},"bash":{"title":"Bash","alias":"shell","aliasTitles":{"shell":"Shell"},"owner":"zeitgeist87"},"basic":{"title":"BASIC","owner":"Golmote"},"batch":{"title":"Batch","owner":"Golmote"},"bbcode":{"title":"BBcode","alias":"shortcode","aliasTitles":{"shortcode":"Shortcode"},"owner":"RunDevelopment"},"bicep":{"title":"Bicep","owner":"johnnyreilly"},"birb":{"title":"Birb","require":"clike","owner":"Calamity210"},"bison":{"title":"Bison","require":"c","owner":"Golmote"},"bnf":{"title":"BNF","alias":"rbnf","aliasTitles":{"rbnf":"RBNF"},"owner":"RunDevelopment"},"brainfuck":{"title":"Brainfuck","owner":"Golmote"},"brightscript":{"title":"BrightScript","owner":"RunDevelopment"},"bro":{"title":"Bro","owner":"wayward710"},"bsl":{"title":"BSL (1C:Enterprise)","alias":"oscript","aliasTitles":{"oscript":"OneScript"},"owner":"Diversus23"},"c":{"title":"C","require":"clike","owner":"zeitgeist87"},"csharp":{"title":"C#","require":"clike","alias":["cs","dotnet"],"owner":"mvalipour"},"cpp":{"title":"C++","require":"c","owner":"zeitgeist87"},"cfscript":{"title":"CFScript","require":"clike","alias":"cfc","owner":"mjclemente"},"chaiscript":{"title":"ChaiScript","require":["clike","cpp"],"owner":"RunDevelopment"},"cil":{"title":"CIL","owner":"sbrl"},"clojure":{"title":"Clojure","owner":"troglotit"},"cmake":{"title":"CMake","owner":"mjrogozinski"},"cobol":{"title":"COBOL","owner":"RunDevelopment"},"coffeescript":{"title":"CoffeeScript","require":"javascript","alias":"coffee","owner":"R-osey"},"concurnas":{"title":"Concurnas","alias":"conc","owner":"jasontatton"},"csp":{"title":"Content-Security-Policy","owner":"ScottHelme"},"coq":{"title":"Coq","owner":"RunDevelopment"},"crystal":{"title":"Crystal","require":"ruby","owner":"MakeNowJust"},"css-extras":{"title":"CSS Extras","require":"css","modify":"css","owner":"milesj"},"csv":{"title":"CSV","owner":"RunDevelopment"},"cypher":{"title":"Cypher","owner":"RunDevelopment"},"d":{"title":"D","require":"clike","owner":"Golmote"},"dart":{"title":"Dart","require":"clike","owner":"Golmote"},"dataweave":{"title":"DataWeave","owner":"machaval"},"dax":{"title":"DAX","owner":"peterbud"},"dhall":{"title":"Dhall","owner":"RunDevelopment"},"diff":{"title":"Diff","owner":"uranusjr"},"django":{"title":"Django/Jinja2","require":"markup-templating","alias":"jinja2","owner":"romanvm"},"dns-zone-file":{"title":"DNS zone file","owner":"RunDevelopment","alias":"dns-zone"},"docker":{"title":"Docker","alias":"dockerfile","owner":"JustinBeckwith"},"dot":{"title":"DOT (Graphviz)","alias":"gv","optional":"markup","owner":"RunDevelopment"},"ebnf":{"title":"EBNF","owner":"RunDevelopment"},"editorconfig":{"title":"EditorConfig","owner":"osipxd"},"eiffel":{"title":"Eiffel","owner":"Conaclos"},"ejs":{"title":"EJS","require":["javascript","markup-templating"],"owner":"RunDevelopment","alias":"eta","aliasTitles":{"eta":"Eta"}},"elixir":{"title":"Elixir","owner":"Golmote"},"elm":{"title":"Elm","owner":"zwilias"},"etlua":{"title":"Embedded Lua templating","require":["lua","markup-templating"],"owner":"RunDevelopment"},"erb":{"title":"ERB","require":["ruby","markup-templating"],"owner":"Golmote"},"erlang":{"title":"Erlang","owner":"Golmote"},"excel-formula":{"title":"Excel Formula","alias":["xlsx","xls"],"owner":"RunDevelopment"},"fsharp":{"title":"F#","require":"clike","owner":"simonreynolds7"},"factor":{"title":"Factor","owner":"catb0t"},"false":{"title":"False","owner":"edukisto"},"firestore-security-rules":{"title":"Firestore security rules","require":"clike","owner":"RunDevelopment"},"flow":{"title":"Flow","require":"javascript","owner":"Golmote"},"fortran":{"title":"Fortran","owner":"Golmote"},"ftl":{"title":"FreeMarker Template Language","require":"markup-templating","owner":"RunDevelopment"},"gml":{"title":"GameMaker Language","alias":"gamemakerlanguage","require":"clike","owner":"LiarOnce"},"gap":{"title":"GAP (CAS)","owner":"RunDevelopment"},"gcode":{"title":"G-code","owner":"RunDevelopment"},"gdscript":{"title":"GDScript","owner":"RunDevelopment"},"gedcom":{"title":"GEDCOM","owner":"Golmote"},"gherkin":{"title":"Gherkin","owner":"hason"},"git":{"title":"Git","owner":"lgiraudel"},"glsl":{"title":"GLSL","require":"c","owner":"Golmote"},"gn":{"title":"GN","alias":"gni","owner":"RunDevelopment"},"go":{"title":"Go","require":"clike","owner":"arnehormann"},"graphql":{"title":"GraphQL","optional":"markdown","owner":"Golmote"},"groovy":{"title":"Groovy","require":"clike","owner":"robfletcher"},"haml":{"title":"Haml","require":"ruby","optional":["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],"owner":"Golmote"},"handlebars":{"title":"Handlebars","require":"markup-templating","alias":"hbs","owner":"Golmote"},"haskell":{"title":"Haskell","alias":"hs","owner":"bholst"},"haxe":{"title":"Haxe","require":"clike","owner":"Golmote"},"hcl":{"title":"HCL","owner":"outsideris"},"hlsl":{"title":"HLSL","require":"c","owner":"RunDevelopment"},"hoon":{"title":"Hoon","owner":"matildepark"},"http":{"title":"HTTP","optional":["css","javascript","json","markup","uri"],"owner":"danielgtaylor"},"hpkp":{"title":"HTTP Public-Key-Pins","owner":"ScottHelme"},"hsts":{"title":"HTTP Strict-Transport-Security","owner":"ScottHelme"},"ichigojam":{"title":"IchigoJam","owner":"BlueCocoa"},"icon":{"title":"Icon","owner":"Golmote"},"icu-message-format":{"title":"ICU Message Format","owner":"RunDevelopment"},"idris":{"title":"Idris","alias":"idr","owner":"KeenS","require":"haskell"},"ignore":{"title":".ignore","owner":"osipxd","alias":["gitignore","hgignore","npmignore"],"aliasTitles":{"gitignore":".gitignore","hgignore":".hgignore","npmignore":".npmignore"}},"inform7":{"title":"Inform 7","owner":"Golmote"},"ini":{"title":"Ini","owner":"aviaryan"},"io":{"title":"Io","owner":"AlesTsurko"},"j":{"title":"J","owner":"Golmote"},"java":{"title":"Java","require":"clike","owner":"sherblot"},"javadoc":{"title":"JavaDoc","require":["markup","java","javadoclike"],"modify":"java","optional":"scala","owner":"RunDevelopment"},"javadoclike":{"title":"JavaDoc-like","modify":["java","javascript","php"],"owner":"RunDevelopment"},"javastacktrace":{"title":"Java stack trace","owner":"RunDevelopment"},"jexl":{"title":"Jexl","owner":"czosel"},"jolie":{"title":"Jolie","require":"clike","owner":"thesave"},"jq":{"title":"JQ","owner":"RunDevelopment"},"jsdoc":{"title":"JSDoc","require":["javascript","javadoclike","typescript"],"modify":"javascript","optional":["actionscript","coffeescript"],"owner":"RunDevelopment"},"js-extras":{"title":"JS Extras","require":"javascript","modify":"javascript","optional":["actionscript","coffeescript","flow","n4js","typescript"],"owner":"RunDevelopment"},"json":{"title":"JSON","alias":"webmanifest","aliasTitles":{"webmanifest":"Web App Manifest"},"owner":"CupOfTea696"},"json5":{"title":"JSON5","require":"json","owner":"RunDevelopment"},"jsonp":{"title":"JSONP","require":"json","owner":"RunDevelopment"},"jsstacktrace":{"title":"JS stack trace","owner":"sbrl"},"js-templates":{"title":"JS Templates","require":"javascript","modify":"javascript","optional":["css","css-extras","graphql","markdown","markup","sql"],"owner":"RunDevelopment"},"julia":{"title":"Julia","owner":"cdagnino"},"keyman":{"title":"Keyman","owner":"mcdurdin"},"kotlin":{"title":"Kotlin","alias":["kt","kts"],"aliasTitles":{"kts":"Kotlin Script"},"require":"clike","owner":"Golmote"},"kumir":{"title":"KuMir (КуМир)","alias":"kum","owner":"edukisto"},"latex":{"title":"LaTeX","alias":["tex","context"],"aliasTitles":{"tex":"TeX","context":"ConTeXt"},"owner":"japborst"},"latte":{"title":"Latte","require":["clike","markup-templating","php"],"owner":"nette"},"less":{"title":"Less","require":"css","optional":"css-extras","owner":"Golmote"},"lilypond":{"title":"LilyPond","require":"scheme","alias":"ly","owner":"RunDevelopment"},"liquid":{"title":"Liquid","require":"markup-templating","owner":"cinhtau"},"lisp":{"title":"Lisp","alias":["emacs","elisp","emacs-lisp"],"owner":"JuanCaicedo"},"livescript":{"title":"LiveScript","owner":"Golmote"},"llvm":{"title":"LLVM IR","owner":"porglezomp"},"log":{"title":"Log file","optional":"javastacktrace","owner":"RunDevelopment"},"lolcode":{"title":"LOLCODE","owner":"Golmote"},"lua":{"title":"Lua","owner":"Golmote"},"magma":{"title":"Magma (CAS)","owner":"RunDevelopment"},"makefile":{"title":"Makefile","owner":"Golmote"},"markdown":{"title":"Markdown","require":"markup","optional":"yaml","alias":"md","owner":"Golmote"},"markup-templating":{"title":"Markup templating","require":"markup","owner":"Golmote"},"matlab":{"title":"MATLAB","owner":"Golmote"},"mel":{"title":"MEL","owner":"Golmote"},"mermaid":{"title":"Mermaid","owner":"RunDevelopment"},"mizar":{"title":"Mizar","owner":"Golmote"},"mongodb":{"title":"MongoDB","owner":"airs0urce","require":"javascript"},"monkey":{"title":"Monkey","owner":"Golmote"},"moonscript":{"title":"MoonScript","alias":"moon","owner":"RunDevelopment"},"n1ql":{"title":"N1QL","owner":"TMWilds"},"n4js":{"title":"N4JS","require":"javascript","optional":"jsdoc","alias":"n4jsd","owner":"bsmith-n4"},"nand2tetris-hdl":{"title":"Nand To Tetris HDL","owner":"stephanmax"},"naniscript":{"title":"Naninovel Script","owner":"Elringus","alias":"nani"},"nasm":{"title":"NASM","owner":"rbmj"},"neon":{"title":"NEON","owner":"nette"},"nevod":{"title":"Nevod","owner":"nezaboodka"},"nginx":{"title":"nginx","owner":"volado"},"nim":{"title":"Nim","owner":"Golmote"},"nix":{"title":"Nix","owner":"Golmote"},"nsis":{"title":"NSIS","owner":"idleberg"},"objectivec":{"title":"Objective-C","require":"c","alias":"objc","owner":"uranusjr"},"ocaml":{"title":"OCaml","owner":"Golmote"},"opencl":{"title":"OpenCL","require":"c","modify":["c","cpp"],"owner":"Milania1"},"openqasm":{"title":"OpenQasm","alias":"qasm","owner":"RunDevelopment"},"oz":{"title":"Oz","owner":"Golmote"},"parigp":{"title":"PARI/GP","owner":"Golmote"},"parser":{"title":"Parser","require":"markup","owner":"Golmote"},"pascal":{"title":"Pascal","alias":"objectpascal","aliasTitles":{"objectpascal":"Object Pascal"},"owner":"Golmote"},"pascaligo":{"title":"Pascaligo","owner":"DefinitelyNotAGoat"},"psl":{"title":"PATROL Scripting Language","owner":"bertysentry"},"pcaxis":{"title":"PC-Axis","alias":"px","owner":"RunDevelopment"},"peoplecode":{"title":"PeopleCode","alias":"pcode","owner":"RunDevelopment"},"perl":{"title":"Perl","owner":"Golmote"},"php":{"title":"PHP","require":"markup-templating","owner":"milesj"},"phpdoc":{"title":"PHPDoc","require":["php","javadoclike"],"modify":"php","owner":"RunDevelopment"},"php-extras":{"title":"PHP Extras","require":"php","modify":"php","owner":"milesj"},"plsql":{"title":"PL/SQL","require":"sql","owner":"Golmote"},"powerquery":{"title":"PowerQuery","alias":["pq","mscript"],"owner":"peterbud"},"powershell":{"title":"PowerShell","owner":"nauzilus"},"processing":{"title":"Processing","require":"clike","owner":"Golmote"},"prolog":{"title":"Prolog","owner":"Golmote"},"promql":{"title":"PromQL","owner":"arendjr"},"properties":{"title":".properties","owner":"Golmote"},"protobuf":{"title":"Protocol Buffers","require":"clike","owner":"just-boris"},"pug":{"title":"Pug","require":["markup","javascript"],"optional":["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],"owner":"Golmote"},"puppet":{"title":"Puppet","owner":"Golmote"},"pure":{"title":"Pure","optional":["c","cpp","fortran"],"owner":"Golmote"},"purebasic":{"title":"PureBasic","require":"clike","alias":"pbfasm","owner":"HeX0R101"},"purescript":{"title":"PureScript","require":"haskell","alias":"purs","owner":"sriharshachilakapati"},"python":{"title":"Python","alias":"py","owner":"multipetros"},"qsharp":{"title":"Q#","require":"clike","alias":"qs","owner":"fedonman"},"q":{"title":"Q (kdb+ database)","owner":"Golmote"},"qml":{"title":"QML","require":"javascript","owner":"RunDevelopment"},"qore":{"title":"Qore","require":"clike","owner":"temnroegg"},"r":{"title":"R","owner":"Golmote"},"racket":{"title":"Racket","require":"scheme","alias":"rkt","owner":"RunDevelopment"},"jsx":{"title":"React JSX","require":["markup","javascript"],"optional":["jsdoc","js-extras","js-templates"],"owner":"vkbansal"},"tsx":{"title":"React TSX","require":["jsx","typescript"]},"reason":{"title":"Reason","require":"clike","owner":"Golmote"},"regex":{"title":"Regex","owner":"RunDevelopment"},"rego":{"title":"Rego","owner":"JordanSh"},"renpy":{"title":"Ren'py","alias":"rpy","owner":"HyuchiaDiego"},"rest":{"title":"reST (reStructuredText)","owner":"Golmote"},"rip":{"title":"Rip","owner":"ravinggenius"},"roboconf":{"title":"Roboconf","owner":"Golmote"},"robotframework":{"title":"Robot Framework","alias":"robot","owner":"RunDevelopment"},"ruby":{"title":"Ruby","require":"clike","alias":"rb","owner":"samflores"},"rust":{"title":"Rust","owner":"Golmote"},"sas":{"title":"SAS","optional":["groovy","lua","sql"],"owner":"Golmote"},"sass":{"title":"Sass (Sass)","require":"css","optional":"css-extras","owner":"Golmote"},"scss":{"title":"Sass (Scss)","require":"css","optional":"css-extras","owner":"MoOx"},"scala":{"title":"Scala","require":"java","owner":"jozic"},"scheme":{"title":"Scheme","owner":"bacchus123"},"shell-session":{"title":"Shell session","require":"bash","alias":["sh-session","shellsession"],"owner":"RunDevelopment"},"smali":{"title":"Smali","owner":"RunDevelopment"},"smalltalk":{"title":"Smalltalk","owner":"Golmote"},"smarty":{"title":"Smarty","require":"markup-templating","owner":"Golmote"},"sml":{"title":"SML","alias":"smlnj","aliasTitles":{"smlnj":"SML/NJ"},"owner":"RunDevelopment"},"solidity":{"title":"Solidity (Ethereum)","alias":"sol","require":"clike","owner":"glachaud"},"solution-file":{"title":"Solution file","alias":"sln","owner":"RunDevelopment"},"soy":{"title":"Soy (Closure Template)","require":"markup-templating","owner":"Golmote"},"sparql":{"title":"SPARQL","require":"turtle","owner":"Triply-Dev","alias":"rq"},"splunk-spl":{"title":"Splunk SPL","owner":"RunDevelopment"},"sqf":{"title":"SQF: Status Quo Function (Arma 3)","require":"clike","owner":"RunDevelopment"},"sql":{"title":"SQL","owner":"multipetros"},"squirrel":{"title":"Squirrel","require":"clike","owner":"RunDevelopment"},"stan":{"title":"Stan","owner":"RunDevelopment"},"iecst":{"title":"Structured Text (IEC 61131-3)","owner":"serhioromano"},"stylus":{"title":"Stylus","owner":"vkbansal"},"swift":{"title":"Swift","owner":"chrischares"},"systemd":{"title":"Systemd configuration file","owner":"RunDevelopment"},"t4-templating":{"title":"T4 templating","owner":"RunDevelopment"},"t4-cs":{"title":"T4 Text Templates (C#)","require":["t4-templating","csharp"],"alias":"t4","owner":"RunDevelopment"},"t4-vb":{"title":"T4 Text Templates (VB)","require":["t4-templating","vbnet"],"owner":"RunDevelopment"},"tap":{"title":"TAP","owner":"isaacs","require":"yaml"},"tcl":{"title":"Tcl","owner":"PeterChaplin"},"tt2":{"title":"Template Toolkit 2","require":["clike","markup-templating"],"owner":"gflohr"},"textile":{"title":"Textile","require":"markup","optional":"css","owner":"Golmote"},"toml":{"title":"TOML","owner":"RunDevelopment"},"turtle":{"title":"Turtle","alias":"trig","aliasTitles":{"trig":"TriG"},"owner":"jakubklimek"},"twig":{"title":"Twig","require":"markup","owner":"brandonkelly"},"typescript":{"title":"TypeScript","require":"javascript","optional":"js-templates","alias":"ts","owner":"vkbansal"},"typoscript":{"title":"TypoScript","alias":"tsconfig","aliasTitles":{"tsconfig":"TSConfig"},"owner":"dkern"},"unrealscript":{"title":"UnrealScript","alias":["uscript","uc"],"owner":"RunDevelopment"},"uri":{"title":"URI","alias":"url","aliasTitles":{"url":"URL"},"owner":"RunDevelopment"},"v":{"title":"V","require":"clike","owner":"taggon"},"vala":{"title":"Vala","require":"clike","optional":"regex","owner":"TemplarVolk"},"vbnet":{"title":"VB.Net","require":"basic","owner":"Bigsby"},"velocity":{"title":"Velocity","require":"markup","owner":"Golmote"},"verilog":{"title":"Verilog","owner":"a-rey"},"vhdl":{"title":"VHDL","owner":"a-rey"},"vim":{"title":"vim","owner":"westonganger"},"visual-basic":{"title":"Visual Basic","alias":["vb","vba"],"aliasTitles":{"vba":"VBA"},"owner":"Golmote"},"warpscript":{"title":"WarpScript","owner":"RunDevelopment"},"wasm":{"title":"WebAssembly","owner":"Golmote"},"wiki":{"title":"Wiki markup","require":"markup","owner":"Golmote"},"wolfram":{"title":"Wolfram language","alias":["mathematica","nb","wl"],"aliasTitles":{"mathematica":"Mathematica","nb":"Mathematica Notebook"},"owner":"msollami"},"xeora":{"title":"Xeora","require":"markup","alias":"xeoracube","aliasTitles":{"xeoracube":"XeoraCube"},"owner":"freakmaxi"},"xml-doc":{"title":"XML doc (.net)","require":"markup","modify":["csharp","fsharp","vbnet"],"owner":"RunDevelopment"},"xojo":{"title":"Xojo (REALbasic)","owner":"Golmote"},"xquery":{"title":"XQuery","require":"markup","owner":"Golmote"},"yaml":{"title":"YAML","alias":"yml","owner":"hason"},"yang":{"title":"YANG","owner":"RunDevelopment"},"zig":{"title":"Zig","owner":"RunDevelopment"}},"plugins":{"meta":{"path":"plugins/{id}/prism-{id}","link":"plugins/{id}/"},"line-highlight":{"title":"Line Highlight","description":"Highlights specific lines and/or line ranges."},"line-numbers":{"title":"Line Numbers","description":"Line number at the beginning of code lines.","owner":"kuba-kubula"},"show-invisibles":{"title":"Show Invisibles","description":"Show hidden characters such as tabs and line breaks.","optional":["autolinker","data-uri-highlight"]},"autolinker":{"title":"Autolinker","description":"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},"wpd":{"title":"WebPlatform Docs","description":"Makes tokens link to <a href=\"https://webplatform.github.io/docs/\">WebPlatform.org documentation</a>. The links open in a new tab."},"custom-class":{"title":"Custom Class","description":"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.","owner":"dvkndn","noCSS":true},"file-highlight":{"title":"File Highlight","description":"Fetch external files and highlight them with Prism. Used on the Prism website itself.","noCSS":true},"show-language":{"title":"Show Language","description":"Display the highlighted language in code blocks (inline code does not show the label).","owner":"nauzilus","noCSS":true,"require":"toolbar"},"jsonp-highlight":{"title":"JSONP Highlight","description":"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).","noCSS":true,"owner":"nauzilus"},"highlight-keywords":{"title":"Highlight Keywords","description":"Adds special CSS classes for each keyword for fine-grained highlighting.","owner":"vkbansal","noCSS":true},"remove-initial-line-feed":{"title":"Remove initial line feed","description":"Removes the initial line feed in code blocks.","owner":"Golmote","noCSS":true},"inline-color":{"title":"Inline color","description":"Adds a small inline preview for colors in style sheets.","require":"css-extras","owner":"RunDevelopment"},"previewers":{"title":"Previewers","description":"Previewers for angles, colors, gradients, easing and time.","require":"css-extras","owner":"Golmote"},"autoloader":{"title":"Autoloader","description":"Automatically loads the needed languages to highlight the code blocks.","owner":"Golmote","noCSS":true},"keep-markup":{"title":"Keep Markup","description":"Prevents custom markup from being dropped out during highlighting.","owner":"Golmote","optional":"normalize-whitespace","noCSS":true},"command-line":{"title":"Command Line","description":"Display a command line with a prompt and, optionally, the output/response from the commands.","owner":"chriswells0"},"unescaped-markup":{"title":"Unescaped Markup","description":"Write markup without having to escape anything."},"normalize-whitespace":{"title":"Normalize Whitespace","description":"Supports multiple operations to normalize whitespace in code blocks.","owner":"zeitgeist87","optional":"unescaped-markup","noCSS":true},"data-uri-highlight":{"title":"Data-URI Highlight","description":"Highlights data-URI contents.","owner":"Golmote","noCSS":true},"toolbar":{"title":"Toolbar","description":"Attach a toolbar for plugins to easily register buttons on the top of a code block.","owner":"mAAdhaTTah"},"copy-to-clipboard":{"title":"Copy to Clipboard Button","description":"Add a button that copies the code block to the clipboard when clicked.","owner":"mAAdhaTTah","require":"toolbar","noCSS":true},"download-button":{"title":"Download Button","description":"A button in the toolbar of a code block adding a convenient way to download a code file.","owner":"Golmote","require":"toolbar","noCSS":true},"match-braces":{"title":"Match braces","description":"Highlights matching braces.","owner":"RunDevelopment"},"diff-highlight":{"title":"Diff Highlight","description":"Highlights the code inside diff blocks.","owner":"RunDevelopment","require":"diff"},"filter-highlight-all":{"title":"Filter highlightAll","description":"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.","owner":"RunDevelopment","noCSS":true},"treeview":{"title":"Treeview","description":"A language with special styles to highlight file system tree structures.","owner":"Golmote"}}};
 if (typeof module !== 'undefined' && module.exports) { module.exports = components; }
\ No newline at end of file
diff --git a/components.json b/components.json
index b1fcc12f7d..b602f58a4f 100644
--- a/components.json
+++ b/components.json
@@ -160,6 +160,11 @@
 			"title": "AutoIt",
 			"owner": "Golmote"
 		},
+		"avisynth": {
+			"title": "AviSynth",
+			"alias": "avs",
+			"owner": "Zinfidel"
+		},
 		"avro-idl": {
 			"title":"Avro IDL",
 			"alias": "avdl",
diff --git a/components/prism-avisynth.js b/components/prism-avisynth.js
new file mode 100644
index 0000000000..09332f1c6b
--- /dev/null
+++ b/components/prism-avisynth.js
@@ -0,0 +1,188 @@
+// http://avisynth.nl/index.php/The_full_AviSynth_grammar
+(function (Prism) {
+
+	function replace(pattern, replacements) {
+		return pattern.replace(/<<(\d+)>>/g, function (m, index) {
+			return replacements[+index];
+		});
+	}
+
+	function re(pattern, replacements, flags) {
+		return RegExp(replace(pattern, replacements), flags || '');
+	}
+
+	var types = /clip|int|float|string|bool|val/.source;
+	var internals = [
+		// bools
+		/is(?:bool|clip|float|int|string)|defined|(?:var|(?:internal)?function)?exists?/.source,
+		// control
+		/apply|assert|default|eval|import|select|nop|undefined/.source,
+		// global
+		/set(?:memorymax|cachemode|maxcpu|workingdir|planarlegacyalignment)|opt_(?:allowfloataudio|usewaveextensible|dwchannelmask|avipadscanlines|vdubplanarhack|enable_(?:v210|y3_10_10|y3_10_16|b64a|planartopackedrgb))/.source,
+		// conv
+		/hex(?:value)?|value/.source,
+		// numeric
+		/max|min|muldiv|floor|ceil|round|fmod|pi|exp|log(?:10)?|pow|sqrt|abs|sign|frac|rand|spline|continued(?:numerator|denominator)?/.source,
+		// trig
+		/a?sinh?|a?cosh?|a?tan[2h]?/.source,
+		// bit
+		/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,
+		// runtime
+		/average(?:luma|chroma[uv]|[bgr])|(?:luma|chroma[uv]|rgb|[rgb]|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,
+		// script
+		/script(?:name(?:utf8)?|file(?:utf8)?|dir(?:utf8)?)|setlogparams|logmsg|getprocessinfo/.source,
+		// string
+		/[lu]case|str(?:toutf8|fromutf8|len|cmpi?)|(?:rev|left|right|mid|find|replace|fill)str|format|trim(?:left|right|all)|chr|ord|time/.source,
+		// version
+		/version(?:number|string)|isversionorgreater/.source,
+		// helper
+		/buildpixeltype|colorspacenametopixeltype/.source,
+		// avsplus
+		/setfiltermtmode|prefetch|addautoloaddir|on(?:cpu|cuda)/.source
+	].join('|');
+	var properties = [
+		// content
+		/has(?:audio|video)/.source,
+		// resolution
+		/width|height/.source,
+		// framerate
+		/frame(?:count|rate)|framerate(?:numerator|denominator)/.source,
+		// interlacing
+		/is(?:field|frame)based|getparity/.source,
+		// color format
+		/pixeltype|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:y2|va?))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|hasalpha|componentsize|numcomponents|bitspercomponent/.source,
+		// audio
+		/audio(?:rate|duration|length(?:[fs]|lo|hi)?|channels|bits)|isaudio(?:float|int)/.source
+	].join('|');
+	var filters = [
+		// source
+		/avi(?:file)?source|opendmlsource|directshowsource|image(?:reader|source|sourceanim)|segmented(?:avisource|directshowsource)|wavsource/.source,
+		// color
+		/coloryuv|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:444|422|420|411)|YUY2)|convertbacktoyuy2|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:luma|chroma)|rgbadjust|show(?:red|green|blue|alpha)|swapuv|tweak|[uv]toy8?|ytouv/.source,
+		// overlay
+		/(?:colorkey|reset)mask|mask(?:hs)?|layer|merge|overlay|subtract/.source,
+		// geometry
+		/addborders|crop(?:bottom)?|flip(?:horizontal|vertical)|letterbox|(?:horizontal|vertical)?reduceby2|(?:bicubic|bilinear|blackman|gauss|lanczos|lanczos4|point|sinc|spline(?:16|36|64))resize|skewrows|turn(?:left|right|180)/.source,
+		// pixel
+		/blur|sharpen|generalconvolution|(?:spatial|temporal)soften|fixbrokenchromaupsampling/.source,
+		// timeline
+		/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|out|io)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,
+		// interlace
+		/assume(?:frame|field)based|assume[bt]ff|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|rows|fields)|swapfields|weave(?:columns|rows)?/.source,
+		// audio
+		/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|supereq|ssrc|timestretch/.source,
+		// conditional
+		/conditional(?:filter|select|reader)|frameevaluate|scriptclip|writefile(?:if|start|end)?|animate|applyrange|tcp(?:server|source)/.source,
+		// export
+		/imagewriter/.source,
+		// debug
+		/subtitle|blankclip|blackness|colorbars(?:hd)?|compare|dumpfiltergraph|setgraphanalysis|echo|histogram|info|messageclip|preroll|showfiveversions|show(?:framenumber|smpte|time)|stack(?:horizontal|vertical)|tone|version/.source
+	].join('|');
+	var allinternals = [internals, properties, filters].join('|');
+
+	Prism.languages.avisynth = {
+		'comment': [
+			{
+				// Matches [* *] nestable block comments, but only supports 1 level of nested comments
+				// /\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|<self>)*\*\]/
+				pattern: /(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,
+				lookbehind: true,
+				greedy: true
+			},
+			{
+				// Matches /* */ block comments
+				pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
+				lookbehind: true,
+				greedy: true
+			},
+			{
+				// Matches # comments
+				pattern: /(^|[^\\$])#.*/,
+				lookbehind: true,
+				greedy: true
+			}
+		],
+
+		// Handle before strings because optional arguments are surrounded by double quotes
+		'argument': {
+			pattern: re(/\b(?:<<0>>)\s+("?)\w+\1/.source, [types], 'i'),
+			inside: {
+				'keyword': /^\w+/
+			}
+		},
+
+		// Optional argument assignment
+		'argument-label': {
+			pattern: /([,(][\s\\]*)\w+\s*=(?!=)/,
+			lookbehind: true,
+			inside: {
+				'argument-name': {
+					pattern: /^\w+/,
+					alias: 'punctuation'
+				},
+				'punctuation': /=$/
+			}
+		},
+
+		'string': [
+			{
+				// triple double-quoted
+				pattern: /"""[\s\S]*?"""/,
+				greedy: true,
+			},
+			{
+				// single double-quoted
+				pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
+				greedy: true,
+				inside: {
+					'constant': {
+						// These *are* case-sensitive!
+						pattern: /\b(?:DEFAULT_MT_MODE|(?:SCRIPT|MAINSCRIPT|PROGRAM)DIR|(?:USER|MACHINE)_(?:PLUS|CLASSIC)_PLUGINS)\b/
+					}
+				}
+			}
+		],
+
+		// The special "last" variable that takes the value of the last implicitly returned clip
+		'variable': /\b(?:last)\b/i,
+
+		'boolean': /\b(?:true|false|yes|no)\b/i,
+
+		'keyword': /\b(?:function|global|return|try|catch|if|else|while|for|__END__)\b/i,
+
+		'constant': /\bMT_(?:NICE_FILTER|MULTI_INSTANCE|SERIALIZED|SPECIAL_MT)\b/,
+
+		// AviSynth's internal functions, filters, and properties
+		'builtin-function': {
+			pattern: re(/\b(?:<<0>>)\b/.source, [allinternals], 'i'),
+			alias: 'function'
+		},
+
+		'type-cast': {
+			pattern: re(/\b(?:<<0>>)(?=\s*\()/.source, [types], 'i'),
+			alias: 'keyword'
+		},
+
+		// External/user-defined filters
+		'function': {
+			pattern: /\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,
+			lookbehind: true
+		},
+
+		// Matches a \ as the first or last character on a line
+		'line-continuation': {
+			pattern: /(^[ \t]*)\\|\\(?=[ \t]*$)/m,
+			lookbehind: true,
+			alias: 'punctuation'
+		},
+
+		'number': /\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,
+
+		'operator': /\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,
+
+		'punctuation': /[{}\[\]();,.]/
+	};
+
+	Prism.languages.avs = Prism.languages.avisynth;
+
+}(Prism));
diff --git a/components/prism-avisynth.min.js b/components/prism-avisynth.min.js
new file mode 100644
index 0000000000..4fa150c833
--- /dev/null
+++ b/components/prism-avisynth.min.js
@@ -0,0 +1 @@
+!function(e){function a(e,a,r){return RegExp(function(e,r){return e.replace(/<<(\d+)>>/g,function(e,a){return r[+a]})}(e,a),r||"")}var r="clip|int|float|string|bool|val",t=[["is(?:bool|clip|float|int|string)|defined|(?:var|(?:internal)?function)?exists?","apply|assert|default|eval|import|select|nop|undefined","set(?:memorymax|cachemode|maxcpu|workingdir|planarlegacyalignment)|opt_(?:allowfloataudio|usewaveextensible|dwchannelmask|avipadscanlines|vdubplanarhack|enable_(?:v210|y3_10_10|y3_10_16|b64a|planartopackedrgb))","hex(?:value)?|value","max|min|muldiv|floor|ceil|round|fmod|pi|exp|log(?:10)?|pow|sqrt|abs|sign|frac|rand|spline|continued(?:numerator|denominator)?","a?sinh?|a?cosh?|a?tan[2h]?","(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))","average(?:luma|chroma[uv]|[bgr])|(?:luma|chroma[uv]|rgb|[rgb]|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)","script(?:name(?:utf8)?|file(?:utf8)?|dir(?:utf8)?)|setlogparams|logmsg|getprocessinfo","[lu]case|str(?:toutf8|fromutf8|len|cmpi?)|(?:rev|left|right|mid|find|replace|fill)str|format|trim(?:left|right|all)|chr|ord|time","version(?:number|string)|isversionorgreater","buildpixeltype|colorspacenametopixeltype","setfiltermtmode|prefetch|addautoloaddir|on(?:cpu|cuda)"].join("|"),["has(?:audio|video)","width|height","frame(?:count|rate)|framerate(?:numerator|denominator)","is(?:field|frame)based|getparity","pixeltype|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:y2|va?))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|hasalpha|componentsize|numcomponents|bitspercomponent","audio(?:rate|duration|length(?:[fs]|lo|hi)?|channels|bits)|isaudio(?:float|int)"].join("|"),["avi(?:file)?source|opendmlsource|directshowsource|image(?:reader|source|sourceanim)|segmented(?:avisource|directshowsource)|wavsource","coloryuv|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:444|422|420|411)|YUY2)|convertbacktoyuy2|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:luma|chroma)|rgbadjust|show(?:red|green|blue|alpha)|swapuv|tweak|[uv]toy8?|ytouv","(?:colorkey|reset)mask|mask(?:hs)?|layer|merge|overlay|subtract","addborders|crop(?:bottom)?|flip(?:horizontal|vertical)|letterbox|(?:horizontal|vertical)?reduceby2|(?:bicubic|bilinear|blackman|gauss|lanczos|lanczos4|point|sinc|spline(?:16|36|64))resize|skewrows|turn(?:left|right|180)","blur|sharpen|generalconvolution|(?:spatial|temporal)soften|fixbrokenchromaupsampling","trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|out|io)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)","assume(?:frame|field)based|assume[bt]ff|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|rows|fields)|swapfields|weave(?:columns|rows)?","amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|supereq|ssrc|timestretch","conditional(?:filter|select|reader)|frameevaluate|scriptclip|writefile(?:if|start|end)?|animate|applyrange|tcp(?:server|source)","imagewriter","subtitle|blankclip|blackness|colorbars(?:hd)?|compare|dumpfiltergraph|setgraphanalysis|echo|histogram|info|messageclip|preroll|showfiveversions|show(?:framenumber|smpte|time)|stack(?:horizontal|vertical)|tone|version"].join("|")].join("|");e.languages.avisynth={comment:[{pattern:/(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],argument:{pattern:a('\\b(?:<<0>>)\\s+("?)\\w+\\1',[r],"i"),inside:{keyword:/^\w+/}},"argument-label":{pattern:/([,(][\s\\]*)\w+\s*=(?!=)/,lookbehind:!0,inside:{"argument-name":{pattern:/^\w+/,alias:"punctuation"},punctuation:/=$/}},string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0,inside:{constant:{pattern:/\b(?:DEFAULT_MT_MODE|(?:SCRIPT|MAINSCRIPT|PROGRAM)DIR|(?:USER|MACHINE)_(?:PLUS|CLASSIC)_PLUGINS)\b/}}}],variable:/\b(?:last)\b/i,boolean:/\b(?:true|false|yes|no)\b/i,keyword:/\b(?:function|global|return|try|catch|if|else|while|for|__END__)\b/i,constant:/\bMT_(?:NICE_FILTER|MULTI_INSTANCE|SERIALIZED|SPECIAL_MT)\b/,"builtin-function":{pattern:a("\\b(?:<<0>>)\\b",[t],"i"),alias:"function"},"type-cast":{pattern:a("\\b(?:<<0>>)(?=\\s*\\()",[r],"i"),alias:"keyword"},function:{pattern:/\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,lookbehind:!0},"line-continuation":{pattern:/(^[ \t]*)\\|\\(?=[ \t]*$)/m,lookbehind:!0,alias:"punctuation"},number:/\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,operator:/\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,punctuation:/[{}\[\]();,.]/},e.languages.avs=e.languages.avisynth}(Prism);
\ No newline at end of file
diff --git a/examples/prism-avisynth.html b/examples/prism-avisynth.html
new file mode 100644
index 0000000000..e78fecd9e9
--- /dev/null
+++ b/examples/prism-avisynth.html
@@ -0,0 +1,24 @@
+<h2>Full Example</h2>
+<pre><code>/*
+ * Example AviSynth script for PrismJS demonstration.
+ * By Zinfidel
+ */
+
+SetFilterMTMode("DEFAULT_MT_MODE", MT_MULTI_INSTANCE)
+AddAutoloadDir("MAINSCRIPTDIR/programs/plugins")
+
+# Multiplies clip size and changes aspect ratio to 4:3
+function CorrectAspectRatio(clip c, int scaleFactor, bool "useNearestNeighbor") {
+    useNearestNeighbor = default(useNearestNeighbor, false)
+    stretchFactor = (c.Height * (4 / 3)) / c.Width
+
+    return useNearestNeighbor \
+        ? c.PointResize(c.Width * scaleFactor * stretchFactor, c.Height * scaleFactor) \
+        : c.Lanczos4Resize(c.Width * scaleFactor * stretchFactor, c.Height * scaleFactor)
+}
+
+AviSource("myclip.avi")
+last.CorrectAspectRatio(3, yes)
+
+
+Prefetch(4)</code></pre>
\ No newline at end of file
diff --git a/plugins/autoloader/prism-autoloader.js b/plugins/autoloader/prism-autoloader.js
index ddefe74218..fe1b3b0b04 100644
--- a/plugins/autoloader/prism-autoloader.js
+++ b/plugins/autoloader/prism-autoloader.js
@@ -172,6 +172,7 @@
 		"js": "javascript",
 		"g4": "antlr4",
 		"adoc": "asciidoc",
+		"avs": "avisynth",
 		"avdl": "avro-idl",
 		"shell": "bash",
 		"shortcode": "bbcode",
diff --git a/plugins/autoloader/prism-autoloader.min.js b/plugins/autoloader/prism-autoloader.min.js
index d5ca7c04dd..29790e15d7 100644
--- a/plugins/autoloader/prism-autoloader.min.js
+++ b/plugins/autoloader/prism-autoloader.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var l={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike","t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",adoc:"asciidoc",avdl:"avro-idl",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",gni:"gn",hbs:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",rpy:"renpy",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",t4:"t4-cs",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},p={},e="components/",a=Prism.util.currentScript();if(a){var r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,s=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,i=a.getAttribute("data-autoloader-path");if(null!=i)e=i.trim().replace(/\/?$/,"/");else{var t=a.src;r.test(t)?e=t.replace(r,"components/"):s.test(t)&&(e=t.replace(s,"$1components/"))}}var o=Prism.plugins.autoloader={languages_path:e,use_minified:!0,loadLanguages:m};Prism.hooks.add("complete",function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(u)||m(s,function(){Prism.highlightElement(a)})}})}function u(e){if(0<=e.indexOf("!"))return!1;if((e=n[e]||e)in Prism.languages)return!0;var a=p[e];return a&&!a.error&&!1===a.loading}function m(e,a,r){"string"==typeof e&&(e=[e]);var s=e.length,i=0,t=!1;function c(){t||++i===s&&a&&a(e)}0!==s?e.forEach(function(e){!function(a,r,s){var i=0<=a.indexOf("!");function e(){var e=p[a];e||(e=p[a]={callbacks:[]}),e.callbacks.push({success:r,error:s}),!i&&u(a)?k(a,"success"):!i&&e.error?k(a,"error"):!i&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return o.languages_path+"prism-"+e+(o.use_minified?".min":"")+".js"}(a),function(){e.loading=!1,k(a,"success")},function(){e.loading=!1,e.error=!0,k(a,"error")}))}a=a.replace("!",""),a=n[a]||a;var t=l[a];t&&t.length?m(t,e,s):e()}(e,c,function(){t||(t=!0,r&&r(e))})}):a&&setTimeout(a,0)}function k(e,a){if(p[e]){for(var r=p[e].callbacks,s=0,i=r.length;s<i;s++){var t=r[s][a];t&&setTimeout(t,0)}r.length=0}}}();
\ No newline at end of file
+!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var l={javascript:"clike",actionscript:"javascript",apex:["clike","sql"],arduino:"cpp",aspnet:["markup","csharp"],birb:"clike",bison:"c",c:"clike",csharp:"clike",cpp:"c",cfscript:"clike",chaiscript:["clike","cpp"],coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",django:"markup-templating",ejs:["javascript","markup-templating"],etlua:["lua","markup-templating"],erb:["ruby","markup-templating"],fsharp:"clike","firestore-security-rules":"clike",flow:"javascript",ftl:"markup-templating",gml:"clike",glsl:"c",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup-templating",haxe:"clike",hlsl:"c",idris:"haskell",java:"clike",javadoc:["markup","java","javadoclike"],jolie:"clike",jsdoc:["javascript","javadoclike","typescript"],"js-extras":"javascript",json5:"json",jsonp:"json","js-templates":"javascript",kotlin:"clike",latte:["clike","markup-templating","php"],less:"css",lilypond:"scheme",liquid:"markup-templating",markdown:"markup","markup-templating":"markup",mongodb:"javascript",n4js:"javascript",objectivec:"c",opencl:"c",parser:"markup",php:"markup-templating",phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","javascript"],purebasic:"clike",purescript:"haskell",qsharp:"clike",qml:"javascript",qore:"clike",racket:"scheme",jsx:["markup","javascript"],tsx:["jsx","typescript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java","shell-session":"bash",smarty:"markup-templating",solidity:"clike",soy:"markup-templating",sparql:"turtle",sqf:"clike",squirrel:"clike","t4-cs":["t4-templating","csharp"],"t4-vb":["t4-templating","vbnet"],tap:"yaml",tt2:["clike","markup-templating"],textile:"markup",twig:"markup",typescript:"javascript",v:"clike",vala:"clike",vbnet:"basic",velocity:"markup",wiki:"markup",xeora:"markup","xml-doc":"markup",xquery:"markup"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",ssml:"markup",atom:"markup",rss:"markup",js:"javascript",g4:"antlr4",adoc:"asciidoc",avs:"avisynth",avdl:"avro-idl",shell:"bash",shortcode:"bbcode",rbnf:"bnf",oscript:"bsl",cs:"csharp",dotnet:"csharp",cfc:"cfscript",coffee:"coffeescript",conc:"concurnas",jinja2:"django","dns-zone":"dns-zone-file",dockerfile:"docker",gv:"dot",eta:"ejs",xlsx:"excel-formula",xls:"excel-formula",gamemakerlanguage:"gml",gni:"gn",hbs:"handlebars",hs:"haskell",idr:"idris",gitignore:"ignore",hgignore:"ignore",npmignore:"ignore",webmanifest:"json",kt:"kotlin",kts:"kotlin",kum:"kumir",tex:"latex",context:"latex",ly:"lilypond",emacs:"lisp",elisp:"lisp","emacs-lisp":"lisp",md:"markdown",moon:"moonscript",n4jsd:"n4js",nani:"naniscript",objc:"objectivec",qasm:"openqasm",objectpascal:"pascal",px:"pcaxis",pcode:"peoplecode",pq:"powerquery",mscript:"powerquery",pbfasm:"purebasic",purs:"purescript",py:"python",qs:"qsharp",rkt:"racket",rpy:"renpy",robot:"robotframework",rb:"ruby","sh-session":"shell-session",shellsession:"shell-session",smlnj:"sml",sol:"solidity",sln:"solution-file",rq:"sparql",t4:"t4-cs",trig:"turtle",ts:"typescript",tsconfig:"typoscript",uscript:"unrealscript",uc:"unrealscript",url:"uri",vb:"visual-basic",vba:"visual-basic",mathematica:"wolfram",nb:"wolfram",wl:"wolfram",xeoracube:"xeora",yml:"yaml"},p={},e="components/",a=Prism.util.currentScript();if(a){var r=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,s=/(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i,i=a.getAttribute("data-autoloader-path");if(null!=i)e=i.trim().replace(/\/?$/,"/");else{var t=a.src;r.test(t)?e=t.replace(r,"components/"):s.test(t)&&(e=t.replace(s,"$1components/"))}}var o=Prism.plugins.autoloader={languages_path:e,use_minified:!0,loadLanguages:m};Prism.hooks.add("complete",function(e){var a=e.element,r=e.language;if(a&&r&&"none"!==r){var s=function(e){var a=(e.getAttribute("data-dependencies")||"").trim();if(!a){var r=e.parentElement;r&&"pre"===r.tagName.toLowerCase()&&(a=(r.getAttribute("data-dependencies")||"").trim())}return a?a.split(/\s*,\s*/g):[]}(a);/^diff-./i.test(r)?(s.push("diff"),s.push(r.substr("diff-".length))):s.push(r),s.every(u)||m(s,function(){Prism.highlightElement(a)})}})}function u(e){if(0<=e.indexOf("!"))return!1;if((e=n[e]||e)in Prism.languages)return!0;var a=p[e];return a&&!a.error&&!1===a.loading}function m(e,a,r){"string"==typeof e&&(e=[e]);var s=e.length,i=0,t=!1;function c(){t||++i===s&&a&&a(e)}0!==s?e.forEach(function(e){!function(a,r,s){var i=0<=a.indexOf("!");function e(){var e=p[a];e||(e=p[a]={callbacks:[]}),e.callbacks.push({success:r,error:s}),!i&&u(a)?k(a,"success"):!i&&e.error?k(a,"error"):!i&&e.loading||(e.loading=!0,e.error=!1,function(e,a,r){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),a&&a()},s.onerror=function(){document.body.removeChild(s),r&&r()},document.body.appendChild(s)}(function(e){return o.languages_path+"prism-"+e+(o.use_minified?".min":"")+".js"}(a),function(){e.loading=!1,k(a,"success")},function(){e.loading=!1,e.error=!0,k(a,"error")}))}a=a.replace("!",""),a=n[a]||a;var t=l[a];t&&t.length?m(t,e,s):e()}(e,c,function(){t||(t=!0,r&&r(e))})}):a&&setTimeout(a,0)}function k(e,a){if(p[e]){for(var r=p[e].callbacks,s=0,i=r.length;s<i;s++){var t=r[s][a];t&&setTimeout(t,0)}r.length=0}}}();
\ No newline at end of file
diff --git a/plugins/show-language/prism-show-language.js b/plugins/show-language/prism-show-language.js
index d1c2ecca6e..707bdac66c 100644
--- a/plugins/show-language/prism-show-language.js
+++ b/plugins/show-language/prism-show-language.js
@@ -43,6 +43,8 @@
 		"asm6502": "6502 Assembly",
 		"autohotkey": "AutoHotkey",
 		"autoit": "AutoIt",
+		"avisynth": "AviSynth",
+		"avs": "AviSynth",
 		"avro-idl": "Avro IDL",
 		"avdl": "Avro IDL",
 		"basic": "BASIC",
diff --git a/plugins/show-language/prism-show-language.min.js b/plugins/show-language/prism-show-language.min.js
index 2fa9eabade..4e14770733 100644
--- a/plugins/show-language/prism-show-language.min.js
+++ b/plugins/show-language/prism-show-language.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document)if(Prism.plugins.toolbar){var i={none:"Plain text",plain:"Plain text",plaintext:"Plain text",text:"Plain text",txt:"Plain text",html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",arff:"ARFF",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt","avro-idl":"Avro IDL",avdl:"Avro IDL",basic:"BASIC",bbcode:"BBcode",bnf:"BNF",rbnf:"RBNF",bsl:"BSL (1C:Enterprise)",oscript:"OneScript",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cfscript:"CFScript",cfc:"CFScript",cil:"CIL",cmake:"CMake",cobol:"COBOL",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",csv:"CSV",dataweave:"DataWeave",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",dot:"DOT (Graphviz)",gv:"DOT (Graphviz)",ebnf:"EBNF",editorconfig:"EditorConfig",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gap:"GAP (CAS)",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",glsl:"GLSL",gn:"GN",gni:"GN",graphql:"GraphQL",hbs:"Handlebars",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam","icu-message-format":"ICU Message Format",idr:"Idris",ignore:".ignore",gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",kts:"Kotlin Script",kt:"Kotlin",kumir:"KuMir (КуМир)",kum:"KuMir (КуМир)",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",log:"Log file",lolcode:"LOLCODE",magma:"Magma (CAS)",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",mongodb:"MongoDB",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",naniscript:"Naninovel Script",nani:"Naninovel Script",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",openqasm:"OpenQasm",qasm:"OpenQasm",parigp:"PARI/GP",objectpascal:"Object Pascal",psl:"PATROL Scripting Language",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",promql:"PromQL",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",purs:"PureScript",py:"Python",qsharp:"Q#",qs:"Q#",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)","shell-session":"Shell session","sh-session":"Shell session",shellsession:"Shell session",sml:"SML",smlnj:"SML/NJ",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",iecst:"Structured Text (IEC 61131-3)",systemd:"Systemd configuration file","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trig:"TriG",ts:"TypeScript",tsconfig:"TSConfig",uscript:"UnrealScript",uc:"UnrealScript",uri:"URI",url:"URL",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vba:"VBA",vb:"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",wolfram:"Wolfram language",nb:"Mathematica Notebook",wl:"Wolfram language",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML",yang:"YANG"};Prism.plugins.toolbar.registerButton("show-language",function(e){var a=e.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,s=a.getAttribute("data-language")||i[e.language]||((t=e.language)?(t.substring(0,1).toUpperCase()+t.substring(1)).replace(/s(?=cript)/,"S"):t);if(s){var o=document.createElement("span");return o.textContent=s,o}}})}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}();
\ No newline at end of file
+!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document)if(Prism.plugins.toolbar){var i={none:"Plain text",plain:"Plain text",plaintext:"Plain text",text:"Plain text",txt:"Plain text",html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",arff:"ARFF",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt",avisynth:"AviSynth",avs:"AviSynth","avro-idl":"Avro IDL",avdl:"Avro IDL",basic:"BASIC",bbcode:"BBcode",bnf:"BNF",rbnf:"RBNF",bsl:"BSL (1C:Enterprise)",oscript:"OneScript",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cfscript:"CFScript",cfc:"CFScript",cil:"CIL",cmake:"CMake",cobol:"COBOL",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",csv:"CSV",dataweave:"DataWeave",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",dot:"DOT (Graphviz)",gv:"DOT (Graphviz)",ebnf:"EBNF",editorconfig:"EditorConfig",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gap:"GAP (CAS)",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",glsl:"GLSL",gn:"GN",gni:"GN",graphql:"GraphQL",hbs:"Handlebars",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam","icu-message-format":"ICU Message Format",idr:"Idris",ignore:".ignore",gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",kts:"Kotlin Script",kt:"Kotlin",kumir:"KuMir (КуМир)",kum:"KuMir (КуМир)",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",log:"Log file",lolcode:"LOLCODE",magma:"Magma (CAS)",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",mel:"MEL",mongodb:"MongoDB",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",naniscript:"Naninovel Script",nani:"Naninovel Script",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",openqasm:"OpenQasm",qasm:"OpenQasm",parigp:"PARI/GP",objectpascal:"Object Pascal",psl:"PATROL Scripting Language",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",promql:"PromQL",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",purs:"PureScript",py:"Python",qsharp:"Q#",qs:"Q#",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)","shell-session":"Shell session","sh-session":"Shell session",shellsession:"Shell session",sml:"SML",smlnj:"SML/NJ",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",iecst:"Structured Text (IEC 61131-3)",systemd:"Systemd configuration file","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trig:"TriG",ts:"TypeScript",tsconfig:"TSConfig",uscript:"UnrealScript",uc:"UnrealScript",uri:"URI",url:"URL",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vba:"VBA",vb:"Visual Basic",wasm:"WebAssembly",wiki:"Wiki markup",wolfram:"Wolfram language",nb:"Mathematica Notebook",wl:"Wolfram language",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML",yang:"YANG"};Prism.plugins.toolbar.registerButton("show-language",function(e){var a=e.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var t,s=a.getAttribute("data-language")||i[e.language]||((t=e.language)?(t.substring(0,1).toUpperCase()+t.substring(1)).replace(/s(?=cript)/,"S"):t);if(s){var o=document.createElement("span");return o.textContent=s,o}}})}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}();
\ No newline at end of file
diff --git a/tests/languages/avisynth/clipproperties_feature.test b/tests/languages/avisynth/clipproperties_feature.test
new file mode 100644
index 0000000000..d4335a2e5b
--- /dev/null
+++ b/tests/languages/avisynth/clipproperties_feature.test
@@ -0,0 +1,117 @@
+hasaudio
+hasvideo
+width
+height
+framecount
+framerate
+frameratenumerator
+frameratedenominator
+isfieldbased
+isframebased
+getparity
+
+pixeltype
+isplanar
+isinterleaved
+isrgb
+isrgb24
+isrgb32
+isyuv
+isyuy2
+isy8
+isyv12
+isyv16
+isyv24
+isyv411
+is420
+is422
+is444
+isy
+isyuva
+isrgb48
+isrgb64
+ispackedrgb
+isplanarrgb
+isplanarrgba
+hasalpha
+componentsize
+numcomponents
+bitspercomponent
+
+audiorate
+audioduration
+audiolength
+audiolengthf
+audiolengths
+audiolengthlo
+audiolengthhi
+audiochannels
+audiobits
+isaudiofloat
+isaudioint
+
+xyzisaudiointxyz
+
+----------------------------------------------------
+
+[
+	["builtin-function", "hasaudio"],
+	["builtin-function", "hasvideo"],
+	["builtin-function", "width"],
+	["builtin-function", "height"],
+	["builtin-function", "framecount"],
+	["builtin-function", "framerate"],
+	["builtin-function", "frameratenumerator"],
+	["builtin-function", "frameratedenominator"],
+	["builtin-function", "isfieldbased"],
+	["builtin-function", "isframebased"],
+	["builtin-function", "getparity"],
+
+	["builtin-function", "pixeltype"],
+	["builtin-function", "isplanar"],
+	["builtin-function", "isinterleaved"],
+	["builtin-function", "isrgb"],
+	["builtin-function", "isrgb24"],
+	["builtin-function", "isrgb32"],
+	["builtin-function", "isyuv"],
+	["builtin-function", "isyuy2"],
+	["builtin-function", "isy8"],
+	["builtin-function", "isyv12"],
+	["builtin-function", "isyv16"],
+	["builtin-function", "isyv24"],
+	["builtin-function", "isyv411"],
+	["builtin-function", "is420"],
+	["builtin-function", "is422"],
+	["builtin-function", "is444"],
+	["builtin-function", "isy"],
+	["builtin-function", "isyuva"],
+	["builtin-function", "isrgb48"],
+	["builtin-function", "isrgb64"],
+	["builtin-function", "ispackedrgb"],
+	["builtin-function", "isplanarrgb"],
+	["builtin-function", "isplanarrgba"],
+	["builtin-function", "hasalpha"],
+	["builtin-function", "componentsize"],
+	["builtin-function", "numcomponents"],
+	["builtin-function", "bitspercomponent"],
+
+	["builtin-function", "audiorate"],
+	["builtin-function", "audioduration"],
+	["builtin-function", "audiolength"],
+	["builtin-function", "audiolengthf"],
+	["builtin-function", "audiolengths"],
+	["builtin-function", "audiolengthlo"],
+	["builtin-function", "audiolengthhi"],
+	["builtin-function", "audiochannels"],
+	["builtin-function", "audiobits"],
+	["builtin-function", "isaudiofloat"],
+	["builtin-function", "isaudioint"],
+
+	"\r\n\r\nxyzisaudiointxyz"
+]
+
+----------------------------------------------------
+
+All internal functions, filters, and properties can be used in the following formats:
+intFunc == intFunc() == last.intFunc == last.intFunc()
+They must not appear within other words.
diff --git a/tests/languages/avisynth/comments_strings_predefines_feature.test b/tests/languages/avisynth/comments_strings_predefines_feature.test
new file mode 100644
index 0000000000..b6575acf5d
--- /dev/null
+++ b/tests/languages/avisynth/comments_strings_predefines_feature.test
@@ -0,0 +1,131 @@
+[* comment [* global *] DEFAULT_MT_MODE *]
+
+notacomment
+
+/* comment
+global "a string"
+DEFAULT_MT_MODE */
+
+notacomment
+
+# comment global DEFAULT_MT_MODE
+
+notacomment
+
+"a simple string"
+
+"""a
+complex
+string"""
+
+"DEFAULT_MT_MODE"
+"SCRIPTDIR"
+"MAINSCRIPTDIR"
+"PROGRAMDIR"
+"USER_PLUS_PLUGINS"
+"MACHINE_PLUS_PLUGINS"
+"USER_CLASSIC_PLUGINS"
+"MACHINE_CLASSIC_PLUGINS"
+
+"default_mt_mode"
+"scriptdir"
+"mainscriptdir"
+"programdir"
+"user_plus_plugins"
+"machine_plus_plugins"
+"user_classic_plugins"
+"machine_classic_plugins"
+
+DEFAULT_MT_MODE
+# SCRIPTDIR is also an internal function
+MAINSCRIPTDIR
+PROGRAMDIR
+USER_PLUS_PLUGINS
+MACHINE_PLUS_PLUGINS
+USER_CLASSIC_PLUGINS
+MACHINE_CLASSIC_PLUGINS
+
+----------------------------------------------------
+
+[
+	["comment", "[* comment [* global *] DEFAULT_MT_MODE *]"],
+
+	"\r\n\r\nnotacomment\r\n\r\n",
+
+	["comment", "/* comment\r\nglobal \"a string\"\r\nDEFAULT_MT_MODE */"],
+
+	"\r\n\r\nnotacomment\r\n\r\n",
+
+	["comment", "# comment global DEFAULT_MT_MODE"],
+
+	"\r\n\r\nnotacomment\r\n\r\n",
+
+	["string", ["\"a simple string\""]],
+
+	["string", "\"\"\"a\r\ncomplex\r\nstring\"\"\""],
+
+	["string", [
+		"\"",
+		["constant", "DEFAULT_MT_MODE"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "SCRIPTDIR"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "MAINSCRIPTDIR"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "PROGRAMDIR"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "USER_PLUS_PLUGINS"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "MACHINE_PLUS_PLUGINS"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "USER_CLASSIC_PLUGINS"],
+		"\""
+	]],
+	["string", [
+		"\"",
+		["constant", "MACHINE_CLASSIC_PLUGINS"],
+		"\""
+	]],
+
+	["string", ["\"default_mt_mode\""]],
+	["string", ["\"scriptdir\""]],
+	["string", ["\"mainscriptdir\""]],
+	["string", ["\"programdir\""]],
+	["string", ["\"user_plus_plugins\""]],
+	["string", ["\"machine_plus_plugins\""]],
+	["string", ["\"user_classic_plugins\""]],
+	["string", ["\"machine_classic_plugins\""]],
+
+	"\r\n\r\nDEFAULT_MT_MODE\r\n",
+	["comment", "# SCRIPTDIR is also an internal function"],
+	"\r\nMAINSCRIPTDIR\r\nPROGRAMDIR\r\nUSER_PLUS_PLUGINS\r\nMACHINE_PLUS_PLUGINS\r\nUSER_CLASSIC_PLUGINS\r\nMACHINE_CLASSIC_PLUGINS"
+]
+
+----------------------------------------------------
+
+Block comments should not allow any other tokens within them, and should work over multiple lines.
+Single line comments are the same, but just one line.
+Known issue: square bracket block comments can be nested, but regular languages can't do that.
+
+Single line strings should be surrounded by double quotes, and allow no tokens within them except for predefined symbols.
+Triple quote strings can span multiple lines and allow no tokens within them.
+
+Predefined symbols must appear within single line strings. They are case sensitive.
diff --git a/tests/languages/avisynth/intenalfuncs_feature.test b/tests/languages/avisynth/intenalfuncs_feature.test
new file mode 100644
index 0000000000..730e9f557f
--- /dev/null
+++ b/tests/languages/avisynth/intenalfuncs_feature.test
@@ -0,0 +1,391 @@
+isbool
+isclip
+isfloat
+isint
+isstring
+exist
+defined
+functionexists
+internalfunctionexists
+varexist
+
+apply
+eval
+import
+select
+default
+assert
+nop
+undefined
+
+setmemorymax
+setcachemode
+setmaxcpu
+setworkingdir
+setplanarlegacyalignment
+opt_allowfloataudio
+opt_usewaveextensible
+opt_dwchannelmask
+opt_avipadscanlines
+opt_vdubplanarhack
+opt_enable_v210
+opt_enable_y3_10_10
+opt_enable_y3_10_16
+opt_enable_b64a
+opt_enable_planartopackedrgb
+
+value
+hexvalue
+hex
+
+max
+min
+muldiv
+floor
+ceil
+round
+fmod
+pi
+exp
+log
+log10
+pow
+sqrt
+abs
+sign
+frac
+rand
+spline
+continuednumerator
+continueddenominator
+
+sin
+cos
+tan
+asin
+acos
+atan
+atan2
+sinh
+cosh
+tanh
+
+bitand
+bitnot
+bitor
+bitxor
+bitlshift
+bitshl
+bitsal
+bitrshifta
+bitrshifts
+bitsar
+bitrshiftl
+bitrshiftu
+bitshr
+bitlrotate
+bitrol
+bitrrotatel
+bitror
+bittest
+bittst
+bitset
+bitsetcount
+bitclear
+bitclr
+bitchange
+bitchg
+
+averageluma
+averagechromau
+averagechromav
+averageb
+averageg
+averager
+lumadifference
+chromaudifference
+chromavdifference
+rgbdifference
+bdifference
+gdifference
+rdifference
+ydifferencefromprevious
+udifferencefromprevious
+vdifferencefromprevious
+rgbdifferencefromprevious
+bdifferencefromprevious
+gdifferencefromprevious
+rdifferencefromprevious
+ydifferencetonext
+udifferencetonext
+vdifferencetonext
+rgbdifferencetonext
+rdifferencetonext
+gdifferencetonext
+bdifferencetonext
+yplanemedian
+uplanemedian
+vplanemedian
+bplanemedian
+gplanemedian
+rplanemedian
+yplanemin
+uplanemin
+vplanemin
+bplanemin
+gplanemin
+rplanemin
+yplanemax
+uplanemax
+vplanemax
+bplanemax
+gplanemax
+rplanemax
+yplaneminmaxdifference
+uplaneminmaxdifference
+vplaneminmaxdifference
+bplaneminmaxdifference
+gplaneminmaxdifference
+rplaneminmaxdifference
+
+scriptname
+scriptnameutf8
+scriptfile
+scriptfileutf8
+scriptdir
+scriptdirutf8
+setlogparams
+logmsg
+getprocessinfo
+
+lcase
+ucase
+strtoutf8
+strfromutf8
+strlen
+revstr
+leftstr
+rightstr
+midstr
+findstr
+replacestr
+format
+fillstr
+strcmp
+strcmpi
+trimleft
+trimright
+trimall
+chr
+ord
+time
+
+versionnumber
+versionstring
+isversionorgreater
+
+buildpixeltype
+colorspacenametopixeltype
+
+kevincosner
+
+----------------------------------------------------
+
+[
+	["builtin-function", "isbool"],
+	["builtin-function", "isclip"],
+	["builtin-function", "isfloat"],
+	["builtin-function", "isint"],
+	["builtin-function", "isstring"],
+	["builtin-function", "exist"],
+	["builtin-function", "defined"],
+	["builtin-function", "functionexists"],
+	["builtin-function", "internalfunctionexists"],
+	["builtin-function", "varexist"],
+
+	["builtin-function", "apply"],
+	["builtin-function", "eval"],
+	["builtin-function", "import"],
+	["builtin-function", "select"],
+	["builtin-function", "default"],
+	["builtin-function", "assert"],
+	["builtin-function", "nop"],
+	["builtin-function", "undefined"],
+
+	["builtin-function", "setmemorymax"],
+	["builtin-function", "setcachemode"],
+	["builtin-function", "setmaxcpu"],
+	["builtin-function", "setworkingdir"],
+	["builtin-function", "setplanarlegacyalignment"],
+	["builtin-function", "opt_allowfloataudio"],
+	["builtin-function", "opt_usewaveextensible"],
+	["builtin-function", "opt_dwchannelmask"],
+	["builtin-function", "opt_avipadscanlines"],
+	["builtin-function", "opt_vdubplanarhack"],
+	["builtin-function", "opt_enable_v210"],
+	["builtin-function", "opt_enable_y3_10_10"],
+	["builtin-function", "opt_enable_y3_10_16"],
+	["builtin-function", "opt_enable_b64a"],
+	["builtin-function", "opt_enable_planartopackedrgb"],
+
+	["builtin-function", "value"],
+	["builtin-function", "hexvalue"],
+	["builtin-function", "hex"],
+
+	["builtin-function", "max"],
+	["builtin-function", "min"],
+	["builtin-function", "muldiv"],
+	["builtin-function", "floor"],
+	["builtin-function", "ceil"],
+	["builtin-function", "round"],
+	["builtin-function", "fmod"],
+	["builtin-function", "pi"],
+	["builtin-function", "exp"],
+	["builtin-function", "log"],
+	["builtin-function", "log10"],
+	["builtin-function", "pow"],
+	["builtin-function", "sqrt"],
+	["builtin-function", "abs"],
+	["builtin-function", "sign"],
+	["builtin-function", "frac"],
+	["builtin-function", "rand"],
+	["builtin-function", "spline"],
+	["builtin-function", "continuednumerator"],
+	["builtin-function", "continueddenominator"],
+
+	["builtin-function", "sin"],
+	["builtin-function", "cos"],
+	["builtin-function", "tan"],
+	["builtin-function", "asin"],
+	["builtin-function", "acos"],
+	["builtin-function", "atan"],
+	["builtin-function", "atan2"],
+	["builtin-function", "sinh"],
+	["builtin-function", "cosh"],
+	["builtin-function", "tanh"],
+
+	["builtin-function", "bitand"],
+	["builtin-function", "bitnot"],
+	["builtin-function", "bitor"],
+	["builtin-function", "bitxor"],
+	["builtin-function", "bitlshift"],
+	["builtin-function", "bitshl"],
+	["builtin-function", "bitsal"],
+	["builtin-function", "bitrshifta"],
+	["builtin-function", "bitrshifts"],
+	["builtin-function", "bitsar"],
+	["builtin-function", "bitrshiftl"],
+	["builtin-function", "bitrshiftu"],
+	["builtin-function", "bitshr"],
+	["builtin-function", "bitlrotate"],
+	["builtin-function", "bitrol"],
+	["builtin-function", "bitrrotatel"],
+	["builtin-function", "bitror"],
+	["builtin-function", "bittest"],
+	["builtin-function", "bittst"],
+	["builtin-function", "bitset"],
+	["builtin-function", "bitsetcount"],
+	["builtin-function", "bitclear"],
+	["builtin-function", "bitclr"],
+	["builtin-function", "bitchange"],
+	["builtin-function", "bitchg"],
+
+	["builtin-function", "averageluma"],
+	["builtin-function", "averagechromau"],
+	["builtin-function", "averagechromav"],
+	["builtin-function", "averageb"],
+	["builtin-function", "averageg"],
+	["builtin-function", "averager"],
+	["builtin-function", "lumadifference"],
+	["builtin-function", "chromaudifference"],
+	["builtin-function", "chromavdifference"],
+	["builtin-function", "rgbdifference"],
+	["builtin-function", "bdifference"],
+	["builtin-function", "gdifference"],
+	["builtin-function", "rdifference"],
+	["builtin-function", "ydifferencefromprevious"],
+	["builtin-function", "udifferencefromprevious"],
+	["builtin-function", "vdifferencefromprevious"],
+	["builtin-function", "rgbdifferencefromprevious"],
+	["builtin-function", "bdifferencefromprevious"],
+	["builtin-function", "gdifferencefromprevious"],
+	["builtin-function", "rdifferencefromprevious"],
+	["builtin-function", "ydifferencetonext"],
+	["builtin-function", "udifferencetonext"],
+	["builtin-function", "vdifferencetonext"],
+	["builtin-function", "rgbdifferencetonext"],
+	["builtin-function", "rdifferencetonext"],
+	["builtin-function", "gdifferencetonext"],
+	["builtin-function", "bdifferencetonext"],
+	["builtin-function", "yplanemedian"],
+	["builtin-function", "uplanemedian"],
+	["builtin-function", "vplanemedian"],
+	["builtin-function", "bplanemedian"],
+	["builtin-function", "gplanemedian"],
+	["builtin-function", "rplanemedian"],
+	["builtin-function", "yplanemin"],
+	["builtin-function", "uplanemin"],
+	["builtin-function", "vplanemin"],
+	["builtin-function", "bplanemin"],
+	["builtin-function", "gplanemin"],
+	["builtin-function", "rplanemin"],
+	["builtin-function", "yplanemax"],
+	["builtin-function", "uplanemax"],
+	["builtin-function", "vplanemax"],
+	["builtin-function", "bplanemax"],
+	["builtin-function", "gplanemax"],
+	["builtin-function", "rplanemax"],
+	["builtin-function", "yplaneminmaxdifference"],
+	["builtin-function", "uplaneminmaxdifference"],
+	["builtin-function", "vplaneminmaxdifference"],
+	["builtin-function", "bplaneminmaxdifference"],
+	["builtin-function", "gplaneminmaxdifference"],
+	["builtin-function", "rplaneminmaxdifference"],
+
+	["builtin-function", "scriptname"],
+	["builtin-function", "scriptnameutf8"],
+	["builtin-function", "scriptfile"],
+	["builtin-function", "scriptfileutf8"],
+	["builtin-function", "scriptdir"],
+	["builtin-function", "scriptdirutf8"],
+	["builtin-function", "setlogparams"],
+	["builtin-function", "logmsg"],
+	["builtin-function", "getprocessinfo"],
+
+	["builtin-function", "lcase"],
+	["builtin-function", "ucase"],
+	["builtin-function", "strtoutf8"],
+	["builtin-function", "strfromutf8"],
+	["builtin-function", "strlen"],
+	["builtin-function", "revstr"],
+	["builtin-function", "leftstr"],
+	["builtin-function", "rightstr"],
+	["builtin-function", "midstr"],
+	["builtin-function", "findstr"],
+	["builtin-function", "replacestr"],
+	["builtin-function", "format"],
+	["builtin-function", "fillstr"],
+	["builtin-function", "strcmp"],
+	["builtin-function", "strcmpi"],
+	["builtin-function", "trimleft"],
+	["builtin-function", "trimright"],
+	["builtin-function", "trimall"],
+	["builtin-function", "chr"],
+	["builtin-function", "ord"],
+	["builtin-function", "time"],
+
+	["builtin-function", "versionnumber"],
+	["builtin-function", "versionstring"],
+	["builtin-function", "isversionorgreater"],
+
+	["builtin-function", "buildpixeltype"],
+	["builtin-function", "colorspacenametopixeltype"],
+
+	"\r\n\r\nkevincosner"
+]
+
+----------------------------------------------------
+
+All internal functions, filters, and properties can be used in the following formats:
+intFunc == intFunc() == last.intFunc == last.intFunc()
+They must not appear within other words.
diff --git a/tests/languages/avisynth/internalfilters_feature.test b/tests/languages/avisynth/internalfilters_feature.test
new file mode 100644
index 0000000000..375da954a8
--- /dev/null
+++ b/tests/languages/avisynth/internalfilters_feature.test
@@ -0,0 +1,429 @@
+avisource
+avifilesource
+opendmlsource
+directshowsource
+imagereader
+imagesource
+imagesourceanim
+segmentedavisource
+segmenteddirectshowsource
+wavsource
+
+coloryuv
+convertbacktoyuy2
+converttorgb
+converttorgb24
+converttorgb32
+converttorgb48
+converttorgb64
+converttoplanarrgb
+converttoplanarrgba
+converttoyuy2
+converttoyv24
+converttoyv16
+converttoyv12
+converttoy8
+converttoyuv444
+converttoyuv422
+converttoyuv420
+converttoyuva444
+converttoyuva422
+converttoyuva420
+converttoyuv411
+fixluminance
+greyscale
+grayscale
+invert
+levels
+limiter
+mergergb
+mergeargb
+mergeluma
+mergechroma
+rgbadjust
+showred
+showgreen
+showblue
+showalpha
+swapuv
+tweak
+utoy
+utoy8
+vtoy
+vtoy8
+ytouv
+
+colorkeymask
+layer
+mask
+maskhs
+merge
+overlay
+resetmask
+subtract
+
+addborders
+crop
+cropbottom
+fliphorizontal
+flipvertical
+letterbox
+horizontalreduceby2
+verticalreduceby2
+reduceby2
+bicubicresize
+bilinearresize
+blackmanresize
+gaussresize
+lanczosresize
+lanczos4resize
+pointresize
+sincresize
+spline16resize
+spline36resize
+spline64resize
+
+skewrows
+turnleft
+turnright
+turn180
+
+blur
+sharpen
+generalconvolution
+spatialsoften
+temporalsoften
+fixbrokenchromaupsampling
+
+alignedsplice
+unalignedsplice
+assumefps
+assumescaledfps
+changefps
+convertfps
+deleteframe
+dissolve
+duplicateframe
+fadein0
+fadein
+fadein2
+fadeout0
+fadeout
+fadeout2
+fadeio0
+fadeio
+fadeio2
+freezeframe
+interleave
+loop
+reverse
+selecteven
+selectodd
+selectevery
+selectrangeevery
+trim
+
+assumeframebased
+assumefieldbased
+assumebff
+assumetff
+bob
+complementparity
+doubleweave
+peculiarblend
+pulldown
+separatecolumns
+separaterows
+separatefields
+swapfields
+weave
+weavecolumns
+weaverows
+
+amplify
+amplifydb
+assumesamplerate
+audiodub
+audiodubex
+audiotrim
+convertaudioto8bit
+convertaudioto16bit
+convertaudioto24bit
+convertaudioto32bit
+convertaudiotofloat
+converttomono
+delayaudio
+ensurevbrmp3sync
+getchannel
+getleftchannel
+getrightchannel
+killaudio
+killvideo
+mergechannels
+mixaudio
+monotostereo
+normalize
+resampleaudio
+supereq
+ssrc
+timestretch
+
+conditionalfilter
+frameevaluate
+scriptclip
+conditionalselect
+conditionalreader
+writefile
+writefileif
+writefilestart
+writefileend
+animate
+applyrange
+tcpserver
+tcpsource
+
+imagewriter
+
+blankclip
+blackness
+colorbars
+colorbarshd
+compare
+dumpfiltergraph
+setgraphanalysis
+echo
+histogram
+info
+messageclip
+preroll
+showfiveversions
+showframenumber
+showsmpte
+showtime
+stackhorizontal
+stackvertical
+subtitle
+tone
+version
+
+pantone
+
+----------------------------------------------------
+
+[
+	["builtin-function", "avisource"],
+	["builtin-function", "avifilesource"],
+	["builtin-function", "opendmlsource"],
+	["builtin-function", "directshowsource"],
+	["builtin-function", "imagereader"],
+	["builtin-function", "imagesource"],
+	["builtin-function", "imagesourceanim"],
+	["builtin-function", "segmentedavisource"],
+	["builtin-function", "segmenteddirectshowsource"],
+	["builtin-function", "wavsource"],
+
+	["builtin-function", "coloryuv"],
+	["builtin-function", "convertbacktoyuy2"],
+	["builtin-function", "converttorgb"],
+	["builtin-function", "converttorgb24"],
+	["builtin-function", "converttorgb32"],
+	["builtin-function", "converttorgb48"],
+	["builtin-function", "converttorgb64"],
+	["builtin-function", "converttoplanarrgb"],
+	["builtin-function", "converttoplanarrgba"],
+	["builtin-function", "converttoyuy2"],
+	["builtin-function", "converttoyv24"],
+	["builtin-function", "converttoyv16"],
+	["builtin-function", "converttoyv12"],
+	["builtin-function", "converttoy8"],
+	["builtin-function", "converttoyuv444"],
+	["builtin-function", "converttoyuv422"],
+	["builtin-function", "converttoyuv420"],
+	["builtin-function", "converttoyuva444"],
+	["builtin-function", "converttoyuva422"],
+	["builtin-function", "converttoyuva420"],
+	["builtin-function", "converttoyuv411"],
+	["builtin-function", "fixluminance"],
+	["builtin-function", "greyscale"],
+	["builtin-function", "grayscale"],
+	["builtin-function", "invert"],
+	["builtin-function", "levels"],
+	["builtin-function", "limiter"],
+	["builtin-function", "mergergb"],
+	["builtin-function", "mergeargb"],
+	["builtin-function", "mergeluma"],
+	["builtin-function", "mergechroma"],
+	["builtin-function", "rgbadjust"],
+	["builtin-function", "showred"],
+	["builtin-function", "showgreen"],
+	["builtin-function", "showblue"],
+	["builtin-function", "showalpha"],
+	["builtin-function", "swapuv"],
+	["builtin-function", "tweak"],
+	["builtin-function", "utoy"],
+	["builtin-function", "utoy8"],
+	["builtin-function", "vtoy"],
+	["builtin-function", "vtoy8"],
+	["builtin-function", "ytouv"],
+
+	["builtin-function", "colorkeymask"],
+	["builtin-function", "layer"],
+	["builtin-function", "mask"],
+	["builtin-function", "maskhs"],
+	["builtin-function", "merge"],
+	["builtin-function", "overlay"],
+	["builtin-function", "resetmask"],
+	["builtin-function", "subtract"],
+
+	["builtin-function", "addborders"],
+	["builtin-function", "crop"],
+	["builtin-function", "cropbottom"],
+	["builtin-function", "fliphorizontal"],
+	["builtin-function", "flipvertical"],
+	["builtin-function", "letterbox"],
+	["builtin-function", "horizontalreduceby2"],
+	["builtin-function", "verticalreduceby2"],
+	["builtin-function", "reduceby2"],
+	["builtin-function", "bicubicresize"],
+	["builtin-function", "bilinearresize"],
+	["builtin-function", "blackmanresize"],
+	["builtin-function", "gaussresize"],
+	["builtin-function", "lanczosresize"],
+	["builtin-function", "lanczos4resize"],
+	["builtin-function", "pointresize"],
+	["builtin-function", "sincresize"],
+	["builtin-function", "spline16resize"],
+	["builtin-function", "spline36resize"],
+	["builtin-function", "spline64resize"],
+
+	["builtin-function", "skewrows"],
+	["builtin-function", "turnleft"],
+	["builtin-function", "turnright"],
+	["builtin-function", "turn180"],
+
+	["builtin-function", "blur"],
+	["builtin-function", "sharpen"],
+	["builtin-function", "generalconvolution"],
+	["builtin-function", "spatialsoften"],
+	["builtin-function", "temporalsoften"],
+	["builtin-function", "fixbrokenchromaupsampling"],
+
+	["builtin-function", "alignedsplice"],
+	["builtin-function", "unalignedsplice"],
+	["builtin-function", "assumefps"],
+	["builtin-function", "assumescaledfps"],
+	["builtin-function", "changefps"],
+	["builtin-function", "convertfps"],
+	["builtin-function", "deleteframe"],
+	["builtin-function", "dissolve"],
+	["builtin-function", "duplicateframe"],
+	["builtin-function", "fadein0"],
+	["builtin-function", "fadein"],
+	["builtin-function", "fadein2"],
+	["builtin-function", "fadeout0"],
+	["builtin-function", "fadeout"],
+	["builtin-function", "fadeout2"],
+	["builtin-function", "fadeio0"],
+	["builtin-function", "fadeio"],
+	["builtin-function", "fadeio2"],
+	["builtin-function", "freezeframe"],
+	["builtin-function", "interleave"],
+	["builtin-function", "loop"],
+	["builtin-function", "reverse"],
+	["builtin-function", "selecteven"],
+	["builtin-function", "selectodd"],
+	["builtin-function", "selectevery"],
+	["builtin-function", "selectrangeevery"],
+	["builtin-function", "trim"],
+
+	["builtin-function", "assumeframebased"],
+	["builtin-function", "assumefieldbased"],
+	["builtin-function", "assumebff"],
+	["builtin-function", "assumetff"],
+	["builtin-function", "bob"],
+	["builtin-function", "complementparity"],
+	["builtin-function", "doubleweave"],
+	["builtin-function", "peculiarblend"],
+	["builtin-function", "pulldown"],
+	["builtin-function", "separatecolumns"],
+	["builtin-function", "separaterows"],
+	["builtin-function", "separatefields"],
+	["builtin-function", "swapfields"],
+	["builtin-function", "weave"],
+	["builtin-function", "weavecolumns"],
+	["builtin-function", "weaverows"],
+
+	["builtin-function", "amplify"],
+	["builtin-function", "amplifydb"],
+	["builtin-function", "assumesamplerate"],
+	["builtin-function", "audiodub"],
+	["builtin-function", "audiodubex"],
+	["builtin-function", "audiotrim"],
+	["builtin-function", "convertaudioto8bit"],
+	["builtin-function", "convertaudioto16bit"],
+	["builtin-function", "convertaudioto24bit"],
+	["builtin-function", "convertaudioto32bit"],
+	["builtin-function", "convertaudiotofloat"],
+	["builtin-function", "converttomono"],
+	["builtin-function", "delayaudio"],
+	["builtin-function", "ensurevbrmp3sync"],
+	["builtin-function", "getchannel"],
+	["builtin-function", "getleftchannel"],
+	["builtin-function", "getrightchannel"],
+	["builtin-function", "killaudio"],
+	["builtin-function", "killvideo"],
+	["builtin-function", "mergechannels"],
+	["builtin-function", "mixaudio"],
+	["builtin-function", "monotostereo"],
+	["builtin-function", "normalize"],
+	["builtin-function", "resampleaudio"],
+	["builtin-function", "supereq"],
+	["builtin-function", "ssrc"],
+	["builtin-function", "timestretch"],
+
+	["builtin-function", "conditionalfilter"],
+	["builtin-function", "frameevaluate"],
+	["builtin-function", "scriptclip"],
+	["builtin-function", "conditionalselect"],
+	["builtin-function", "conditionalreader"],
+	["builtin-function", "writefile"],
+	["builtin-function", "writefileif"],
+	["builtin-function", "writefilestart"],
+	["builtin-function", "writefileend"],
+	["builtin-function", "animate"],
+	["builtin-function", "applyrange"],
+	["builtin-function", "tcpserver"],
+	["builtin-function", "tcpsource"],
+
+	["builtin-function", "imagewriter"],
+
+	["builtin-function", "blankclip"],
+	["builtin-function", "blackness"],
+	["builtin-function", "colorbars"],
+	["builtin-function", "colorbarshd"],
+	["builtin-function", "compare"],
+	["builtin-function", "dumpfiltergraph"],
+	["builtin-function", "setgraphanalysis"],
+	["builtin-function", "echo"],
+	["builtin-function", "histogram"],
+	["builtin-function", "info"],
+	["builtin-function", "messageclip"],
+	["builtin-function", "preroll"],
+	["builtin-function", "showfiveversions"],
+	["builtin-function", "showframenumber"],
+	["builtin-function", "showsmpte"],
+	["builtin-function", "showtime"],
+	["builtin-function", "stackhorizontal"],
+	["builtin-function", "stackvertical"],
+	["builtin-function", "subtitle"],
+	["builtin-function", "tone"],
+	["builtin-function", "version"],
+
+	"\r\n\r\npantone"
+]
+
+----------------------------------------------------
+
+All internal functions, filters, and properties can be used in the following formats:
+intFunc == intFunc() == last.intFunc == last.intFunc()
+They must not appear within other words.
diff --git a/tests/languages/avisynth/keywords_constants_bools_last_feature.test b/tests/languages/avisynth/keywords_constants_bools_last_feature.test
new file mode 100644
index 0000000000..3b28abc86f
--- /dev/null
+++ b/tests/languages/avisynth/keywords_constants_bools_last_feature.test
@@ -0,0 +1,78 @@
+function
+global
+return
+try
+catch
+if
+else
+while
+for
+__END__
+
+
+MT_NICE_FILTER
+MT_MULTI_INSTANCE
+MT_SERIALIZED
+MT_SPECIAL_MT
+
+mt_nice_filter
+mt_multi_instance
+mt_serialized
+mt_special_mt
+
+TEXTMT_NICE_FILTERTEXT
+
+true
+FALSE
+yEs
+no
+
+knot
+
+laST
+
+blasted
+
+----------------------------------------------------
+
+[
+	["keyword", "function"],
+	["keyword", "global"],
+	["keyword", "return"],
+	["keyword", "try"],
+	["keyword", "catch"],
+	["keyword", "if"],
+	["keyword", "else"],
+	["keyword", "while"],
+	["keyword", "for"],
+	["keyword", "__END__"],
+
+	["constant", "MT_NICE_FILTER"],
+	["constant", "MT_MULTI_INSTANCE"],
+	["constant", "MT_SERIALIZED"],
+	["constant", "MT_SPECIAL_MT"],
+
+	"\r\n\r\nmt_nice_filter\r\nmt_multi_instance\r\nmt_serialized\r\nmt_special_mt\r\n\r\nTEXTMT_NICE_FILTERTEXT\r\n\r\n",
+
+	["boolean", "true"],
+	["boolean", "FALSE"],
+	["boolean", "yEs"],
+	["boolean", "no"],
+
+	"\r\n\r\nknot\r\n\r\n",
+
+	["variable", "laST"],
+
+	"\r\n\r\nblasted"
+]
+
+----------------------------------------------------
+
+Keywords just have word boundaries. Keywords can actually be used as parameter names in functions, but this
+scenario is an extreme edge and we do not bother handling it.
+
+Constants are case sensitive, and must not appear within other words.
+
+Bools are case insensitive, come in 4 flavors, and must not appear within other words.
+
+The Last special variable is case insensitive, and must not appear within other words.
diff --git a/tests/languages/avisynth/operators_numbers_punctuation.test b/tests/languages/avisynth/operators_numbers_punctuation.test
new file mode 100644
index 0000000000..1cc4c2b50c
--- /dev/null
+++ b/tests/languages/avisynth/operators_numbers_punctuation.test
@@ -0,0 +1,88 @@
++
+++
+-
+!
+!=
+<
+<=
+>
+>=
+=
+==
+&&
+||
+?
+:
+%
+/
+*
+
+$abcdef
+$89abcdef
+123.89032
+.902834
+
+$9abcdef
+a$123456a
+
+()
+{}
+[]
+;
+,
+.
+\
+
+\ 1.0 \
+
+1.0 \ 1.0
+
+----------------------------------------------------
+
+[
+	["operator", "+"],
+	["operator", "++"],
+	["operator", "-"],
+	["operator", "!"],
+	["operator", "!="],
+	["operator", "<"],
+	["operator", "<="],
+	["operator", ">"],
+	["operator", ">="],
+	["operator", "="],
+	["operator", "=="],
+	["operator", "&&"],
+	["operator", "||"],
+	["operator", "?"],
+	["operator", ":"],
+	["operator", "%"],
+	["operator", "/"],
+	["operator", "*"],
+
+	["number", "$abcdef"],
+	["number", "$89abcdef"],
+	["number", "123.89032"],
+	["number", ".902834"],
+
+	"\r\n\r\n$9abcdef\r\na$123456a\r\n\r\n",
+
+	["punctuation", "("], ["punctuation", ")"],
+	["punctuation", "{"], ["punctuation", "}"],
+	["punctuation", "["], ["punctuation", "]"],
+	["punctuation", ";"],
+	["punctuation", ","],
+	["punctuation", "."],
+	["line-continuation", "\\"],
+
+	["line-continuation", "\\"], ["number", "1.0"], ["line-continuation", "\\"],
+
+	["number", "1.0"], " \\ ", ["number", "1.0"]
+]
+
+----------------------------------------------------
+
+Numbers can be specified in decimal form, with or without a leading value. So 0.0 and .0 both work.
+Numbers can also be specified as 6- or 8- digit hexadecimal strings for colors. They begin with a $.
+Numbers can not be bounded by words.
+
+Line continuations must be either the first or last character in a line, less some whitespace.
diff --git a/tests/languages/avisynth/types_arguments_feature.test b/tests/languages/avisynth/types_arguments_feature.test
new file mode 100644
index 0000000000..aa1660b227
--- /dev/null
+++ b/tests/languages/avisynth/types_arguments_feature.test
@@ -0,0 +1,119 @@
+function test(clip input, int interleavedFields, float precision, string "floatingDesync", bool "useQTGMC", val "chromaNoise")
+{
+	castTest = clip(chromaNoise)
+	castTest = int(chromaNoise)
+	castTest = float(chromaNoise)
+	castTest = string(chromaNoise)
+	castTest = bool(chromaNoise)
+	castTest = val(chromaNoise)
+
+	return interleavedClip
+}
+
+test(5, 0.5, floatingDesync="progressive")
+
+----------------------------------------------------
+
+[
+	["keyword", "function"],
+	["function", "test"],
+	["punctuation", "("],
+	["argument", [
+		["keyword", "clip"],
+		" input"
+	]],
+	["punctuation", ","],
+	["argument", [
+		["keyword", "int"],
+		" interleavedFields"
+	]],
+	["punctuation", ","],
+	["argument", [
+		["keyword", "float"],
+		" precision"
+	]],
+	["punctuation", ","],
+	["argument", [
+		["keyword", "string"],
+		" \"floatingDesync\""
+	]],
+	["punctuation", ","],
+	["argument", [
+		["keyword", "bool"],
+		" \"useQTGMC\""
+	]],
+	["punctuation", ","],
+	["argument", [
+		["keyword", "val"],
+		" \"chromaNoise\""
+	]],
+	["punctuation", ")"],
+
+	["punctuation", "{"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "clip"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "int"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "float"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "string"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "bool"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	"\r\n\tcastTest ",
+	["operator", "="],
+	["type-cast", "val"],
+	["punctuation", "("],
+	"chromaNoise",
+	["punctuation", ")"],
+
+	["keyword", "return"], " interleavedClip\r\n",
+	["punctuation", "}"],
+
+	["function", "test"],
+	["punctuation", "("],
+	["number", "5"],
+	["punctuation", ","],
+	["number", "0.5"],
+	["punctuation", ","],
+	["argument-label", [
+		["argument-name", "floatingDesync"],
+		["punctuation", "="]
+	]],
+	["string", ["\"progressive\""]],
+	["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Optional arguments check for preceeding types to match before getting matched as a string, and should not be matched as strings.
+Incidental names of types in an arguments list (such as "interleavedFields" containing "int") should not get highlighted.
+Types can be used as casts, and should not be highlighted as user-functions.
+Incidental names of types elsewhere (such as "interleavedClip" in a function body) should not get highlighted.
+Explicitly-named optional arguments in function calls get lowlighted (including the '=').
diff --git a/tests/languages/avisynth/userfunctions_feature.test b/tests/languages/avisynth/userfunctions_feature.test
new file mode 100644
index 0000000000..d6226cd996
--- /dev/null
+++ b/tests/languages/avisynth/userfunctions_feature.test
@@ -0,0 +1,53 @@
+function CustomUserFunction() {
+
+QTGMC()
+last.QTGMC
+last.QTGMC()
+
+QTGMC
+1func()
+last.1func
+last.1func()
+
+----------------------------------------------------
+
+[
+	["keyword", "function"],
+	["function", "CustomUserFunction"],
+	["punctuation", "("],
+	["punctuation", ")"],
+	["punctuation", "{"],
+
+	["function", "QTGMC"],
+	["punctuation", "("],
+	["punctuation", ")"],
+
+	["variable", "last"],
+	["punctuation", "."],
+	["function", "QTGMC"],
+
+	["variable", "last"],
+	["punctuation", "."],
+	["function", "QTGMC"],
+	["punctuation", "("],
+	["punctuation", ")"],
+
+	"\r\n\r\nQTGMC\r\n1func",
+	["punctuation", "("],
+	["punctuation", ")"],
+
+	["variable", "last"],
+	["punctuation", "."],
+	"1func\r\n",
+
+	["variable", "last"],
+	["punctuation", "."],
+	"1func",
+	["punctuation", "("],
+	["punctuation", ")"]
+]
+
+----------------------------------------------------
+
+Valid identifiers (starts with [a-zA-Z_]) proceeding a '.', preceeding a '(', or both are user/external functions.
+User/external functions that don't match the above are technically valid but indistinguisable from variables.