txt.lurk.org

misc texts and essays from active lurkers
git clone https://git.lurk.org/repos/txt.lurk.org.git
Log | Files | Refs

commit bc5f118f39111344cfba7bb25b6f182b97e25384
parent 5087e6e4874683cbf45fa137a8aee10b6a0fde7b
Author: rra <rscmbbng@riseup.net>
Date:   Tue Mar 26 12:18:07 +0100

Merge branch 'master' of agnes:/var/www/git.lurk.org/repos/txt.lurk.org
Diffstat:
ATNOFS/ATNOFS-screen.pdf | 0
ATNOFS/ATNOFS.pdf | 0
ATNOFS/Sligoil-Micro.woff | 0
ATNOFS/Sporting_Grotesque-Regular_web.woff | 0
ATNOFS/inconsolata.woff | 0
ATNOFS/index.html | 170+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/README.md | 5+++++
transmediale-2020-7-theses/artemisbolidia_fediposter.jpg | 0
transmediale-2020-7-theses/assets/centralised.svg | 402+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/centralised.svg.png | 0
transmediale-2020-7-theses/assets/decentralized.svg | 342+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/decentralized_no_legend.svg | 300+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/decentralized_no_legend.svg.png | 0
transmediale-2020-7-theses/assets/fediverse-floss.dia | 0
transmediale-2020-7-theses/assets/fediverse-floss.svg | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/g922.png | 0
transmediale-2020-7-theses/assets/monolith.svg | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/monolith_no_label.svg | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/monolith_no_label.svg.png | 0
transmediale-2020-7-theses/assets/the_mess.svg | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/the_mess_no_label.svg | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/the_mess_no_label.svg.png | 0
transmediale-2020-7-theses/assets/themess.svg | 201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/themess_no_label.svg | 185+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/assets/themess_no_label.svg.png | 0
transmediale-2020-7-theses/centralized_network.jpg | 0
transmediale-2020-7-theses/federated_network.jpg | 0
transmediale-2020-7-theses/fonts/Route159-SemiBold.woff | 0
transmediale-2020-7-theses/fonts/subset-Aegyptus.woff | 0
transmediale-2020-7-theses/fonts/subset-Aegyptus.woff2 | 0
transmediale-2020-7-theses/index.html | 1201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/inthe90s.jpg | 0
transmediale-2020-7-theses/invite.png | 0
transmediale-2020-7-theses/lurk.org.css | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/remark-0.15.0.min.js | 28219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
transmediale-2020-7-theses/stacks.jpg | 0
transmediale-2020-7-theses/the_eternal_network.jpg | 0
transmediale-2020-7-theses/thefediverse.jpg | 0
38 files changed, 31789 insertions(+), 0 deletions(-)
diff --git a/ATNOFS/ATNOFS-screen.pdf b/ATNOFS/ATNOFS-screen.pdf
Binary files differ.
diff --git a/ATNOFS/ATNOFS.pdf b/ATNOFS/ATNOFS.pdf
Binary files differ.
diff --git a/ATNOFS/Sligoil-Micro.woff b/ATNOFS/Sligoil-Micro.woff
Binary files differ.
diff --git a/ATNOFS/Sporting_Grotesque-Regular_web.woff b/ATNOFS/Sporting_Grotesque-Regular_web.woff
Binary files differ.
diff --git a/ATNOFS/inconsolata.woff b/ATNOFS/inconsolata.woff
Binary files differ.
diff --git a/ATNOFS/index.html b/ATNOFS/index.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+  <meta charset="utf-8" />
+  <meta name="generator" content="pandoc" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+  <title>A Traversal Network of Feminist Servers</title>
+  <style type="text/css">
+      code{white-space: pre-wrap;}
+      span.smallcaps{font-variant: small-caps;}
+      span.underline{text-decoration: underline;}
+      div.column{display: inline-block; vertical-align: top; width: 50%;}
+  </style>
+</head>
+<body>
+<header>
+<h1 class="title">A Traversal Network of Feminist Servers</h1>
+</header>
+
+<div>
+A Traversal Network of Feminist Servers (ATNOFS) is a collaborative project formed around intersectional, feminist, ecological servers whose communities travelled between each other in 2022 to share and extend their knowledges through live gatherings. ATNOFS argues that such platforms and tools are necessary to navigate our communications and cultural growth beyond the current media oligopolies, and democratise cultural and political expression outside obscure, bureaucratic algorithms and advertising monetisation.
+</div>
+
+<div>
+The project responded to the need for continuity, interrelation and support for self-hosted and self-organised computational infrastructures in The Netherlands (Varia, LURK), Romania (hypha), Austria (esc mkl), Greece (Feminist Hack Meetings) and Belgium (Constant).
+</div>
+
+<div>
+  This publication was collectively made with Wendy Van Wynsberghe, Vlad Dobrițoiu, Teo Săvoiu, Spideralex, Sergiu Nisioi, Roel Roscam Abbing, Reni Hofmüller, ooooo, Nina Botthof, Martino Morandi, Marloes de Valk, Mara Karagianni, Manetta Berends, Lídia Pereira, Julia Bande, Femke Snelting, elodie Mugrefya, Donatella Portoghese, Danae Tapia, Cristina Cochior, Azahara Cerezo, Aymeric Mansoux, Artemis Gryllaki, Aggeliki Diakrousi, Anca Bucur, amy pickles, Alice Strete, Alex Ștefănescu.
+</div>
+
+<div>
+<h3>Digital publication</h3>
+Download the pdf <a href="ATNOFS-screen.pdf">✧˖°.here.°˖✧</a>.
+</div>
+
+<div>
+<h3>Print at home</h3>
+A limited number of printed copies were made of this publication, which were then distributed to the contributing partners and spread further within their networks. However, the publication was made in such a way that it could be easily printed at home or in a local copy shop. You can download the full size pdf <a href="ATNOFS.pdf">✧˖°.here.°˖✧</a> and then follow these steps:<br><br>
+
+– Print all pages double sided.<br>
+– Take the pink and the red sheets and cut them in half vertically. The end format for these pages is 105mm × 297mm.<br>
+– Punch 4 holes in all pages.<br>
+– Assemble the publication with metal file fasteners, or any office supplies you have at home (for example elastic rubber bands and paperclips).<br>
+
+</div>
+
+<h3>About this page</h3>
+<div>
+This multi-headed webpage is hosted and asynchronously maintained by a network of networks that includes: Systerserver, Constant, hypha, Varia, ooooo, Marloes de Valk, LURK, Anarchaserver, Psaroskalazines, esc mkl and rosa (travelling).<br><br>
+
+– <a href="https://hub.vvvvvvaria.org/rosa/ATNOFS/">https://hub.vvvvvvaria.org/rosa/ATNOFS/</a><br>
+– <a href="https://www.ooooo.be/atraversalnetworkoffeministservers/">https://www.ooooo.be/atraversalnetworkoffeministservers/</a><br>
+– <a href="https://systerserver.net/ATNOFS/">https://systerserver.net/ATNOFS/</a><br>
+– <a href="https://txt.lurk.org/ATNOFS/">https://txt.lurk.org/ATNOFS/</a><br>
+– <a href="https://zoiahorn.anarchaserver.org/ATNOFS/">https://zoiahorn.anarchaserver.org/ATNOFS/</a><br>
+– <a href="https://hypha.ro/ATNOFS">https://hypha.ro/ATNOFS</a><br>
+– <a href="https://varia.zone/ATNOFS">https://varia.zone/ATNOFS</a><br>
+– <a href="https://bleu255.com/~marloes/txts/ATNOFS/">https://bleu255.com/~marloes/txts/ATNOFS/</a><br>
+– <a href="https://atnofs.constantvzw.org/">https://atnofs.constantvzw.org/</a><br>
+– <a href="https://psaroskalazines.gr/zines/ATNOFS/">https://psaroskalazines.gr/zines/ATNOFS/</a><br>
+– <a href="https://esc.mur.at/en/werk/atnofspublication">https://esc.mur.at/en/werk/atnofspublication</a>
+</div>
+
+<div>
+If you have any questions, you can reach out to the ATNOFS mailing list: <a href="https://we.lurk.org/mailman3/lists/atnofs.we.lurk.org/">https://we.lurk.org/mailman3/lists/atnofs.we.lurk.org/</a>.
+</div>
+
+<div>
+This project was supported by the Culture of Solidarity fund and the Stimuleringsfonds Creatieve Industrie.<br>
+<img src="https://hub.vvvvvvaria.org/rosa/chapters/varia/varia-chapter-in-progress/ECF_LOGO_SCREEN_RED.png" id="cosf"><img src="https://hub.vvvvvvaria.org/rosa/Documentation_Assets/stimu.gif" id="sti">
+</div>
+
+</body>
+
+
+<style>
+
+@font-face {
+    font-family: 'Inconsolata';
+    src: url('inconsolata.woff');
+}
+
+@font-face {
+    font-family: 'Sporting';
+    src: url('Sporting_Grotesque-Regular_web.woff');
+}
+body {
+    color: black;
+    background-color: #F1EB9C;
+    padding-left: 2.5rem;
+    padding-bottom: 3.5rem;
+}
+div {
+  width: 45%;
+  padding-bottom: 1em;
+  line-height: 1.45em;
+  font-family: 'Inconsolata';
+}
+
+.title {
+  color: hotpink;
+  font-family: 'Sporting';
+    font-size: 2rem;
+  padding-top: 1em;
+  padding-bottom: 0.5em;
+}
+
+h2, h3, h4, h5, h6 {
+    font-family: 'Sporting';
+    }
+
+a {
+  color: #026440;
+}
+a:hover {
+  color: #39FF14;
+
+}
+
+img {
+  width: 10%;
+}
+
+@media only screen and (max-width: 875px) {
+    body {
+        padding-left: 0;
+    }
+
+    div {
+        width: 80%;
+    }
+
+    li {
+        padding-left: 0;
+    }
+}
+</style>
+
+<script type="text/javascript">
+    var next = ['https://hub.vvvvvvaria.org/rosa/atnofs/', 'https://www.ooooo.be/atraversalnetworkoffeministservers/', 'https://txt.lurk.org/ATNOFS/', 'https://hypha.ro/ATNOFS', 'https://varia.zone/ATNOFS', 'https://bleu255.com/~marloes/txts/ATNOFS/', 'https://atnofs.constantvzw.org/', 'https://psaroskalazines.gr/zines/ATNOFS/', 'https://esc.mur.at/en/werk/atnofspublication', 'https://zoiahorn.anarchaserver.org/ATNOFS/', 'https://systerserver.net/ATNOFS/'];
+    var colors = ["darkolivegreen", "gainsboro", "lavender", "slategrey", "thistle"];
+    window.onload = function(){
+        setTimeout(function(){
+            top.location = next[Math.floor(Math.random()*next.length)];
+            }, 30000);
+
+    var colorToSet = colors[Math.floor(Math.random() * colors.length)];
+
+    document.querySelector("body").style.backgroundColor = colorToSet;
+
+    var bcolors = ["violet", "red", "dodgerblue", "darkseagreen"];
+    var bcolorToSet = bcolors[Math.floor(Math.random() * bcolors.length)];
+
+
+    var bcolorloop = document.querySelectorAll("h3, h1");
+
+    var acolorloop = document.querySelectorAll("a");
+
+    for (var x = 0; x < bcolorloop.length; x++)
+
+        bcolorloop[x].style.color = bcolorToSet;
+
+    for (var x = 0; x < acolorloop.length; x++)
+
+        acolorloop[x].style.color = bcolorToSet;
+
+
+    }
+</script>
diff --git a/transmediale-2020-7-theses/README.md b/transmediale-2020-7-theses/README.md
@@ -0,0 +1,5 @@
+# 7 Theses On the Fediverse and the Becoming of FLOSS
+
+Talk for 2020 Transmediale Panel called [Deplatformization and the ethics of exclusion](https://2020.transmediale.de/content/exchange-4-deplatformization-and-the-ethics-of-exclusion)
+
+Make sure all media/sources are present locally in this folder in the repository
diff --git a/transmediale-2020-7-theses/artemisbolidia_fediposter.jpg b/transmediale-2020-7-theses/artemisbolidia_fediposter.jpg
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/centralised.svg b/transmediale-2020-7-theses/assets/centralised.svg
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="242.84462mm"
+   height="201.77739mm"
+   viewBox="0 0 242.84462 201.77739"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="centralised.svg">
+  <defs
+     id="defs2">
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2445"
+       is_visible="true"
+       offset_points="0,1"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2441"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2437"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2346"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2342"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect2338"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <linearGradient
+       id="linearGradient2332"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#7800ff;stop-opacity:1;"
+         offset="0"
+         id="stop2330" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect823"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+    <inkscape:path-effect
+       effect="powerstroke"
+       id="path-effect819"
+       is_visible="true"
+       offset_points="0,0.13229166"
+       sort_points="true"
+       interpolator_type="CubicBezierJohan"
+       interpolator_beta="0.2"
+       start_linecap_type="zerowidth"
+       linejoin_type="extrp_arc"
+       miter_limit="4"
+       end_linecap_type="zerowidth" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.7875162"
+     inkscape:cx="387.73754"
+     inkscape:cy="395.20414"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(17.347015,-33.247516)">
+    <g
+       id="g922"
+       inkscape:export-xdpi="125.93073"
+       inkscape:export-ydpi="125.93073">
+      <circle
+         transform="rotate(90)"
+         r="12.939092"
+         cy="-109.41972"
+         cx="139.19933"
+         id="path815"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         transform="rotate(90,106.53654,135.7536)"
+         inkscape:original-d="m 109.79183,116.79818 1.59119,-60.862864"
+         inkscape:path-effect="#path-effect823"
+         inkscape:connector-curvature="0"
+         id="path821"
+         d="m 109.79183,116.79818 c 0,0 0.13225,0.003 0.13225,0.003 0.31823,-12.17258 1.1407,-48.693751 1.45894,-60.866324 -0.31824,12.172573 -1.4052,48.686834 -1.72344,60.859404 0,0 0.13225,0.003 0.13225,0.003 z"
+         style="fill:none;fill-rule:nonzero;stroke:#7800ff;stroke-width:2.06500006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-190.71095"
+         cx="140.60576"
+         id="path825"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         transform="rotate(90,104.0753,134.13621)"
+         inkscape:original-d="M 120.38981,117.54042 199.1495,21.341085"
+         inkscape:path-effect="#path-effect2338"
+         inkscape:connector-curvature="0"
+         id="path2336"
+         d="m 120.38981,117.54042 c 0,0 0.10236,0.0838 0.10236,0.0838 15.75194,-19.239862 62.90539,-77.043268 78.65733,-96.283135 -15.75194,19.239867 -63.11011,76.875663 -78.86205,96.115535 0,0 0.10236,0.0838 0.10236,0.0838 z"
+         style="fill:#000000;fill-rule:nonzero;stroke:#7800ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         transform="rotate(90,104.0753,134.13621)"
+         inkscape:original-d="m 115.32669,141.16833 34.31672,78.19712"
+         inkscape:path-effect="#path-effect2342"
+         inkscape:connector-curvature="0"
+         id="path2340"
+         d="m 115.32669,141.16833 c 0,0 -0.12114,0.0532 -0.12114,0.0532 6.86334,15.63943 27.57452,62.50454 34.43786,78.14396 -6.86334,-15.63942 -27.33224,-62.61086 -34.19558,-78.25028 0,0 -0.12114,0.0532 -0.12114,0.0532 z"
+         style="fill:#000000;fill-rule:nonzero;stroke:#7800ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         transform="matrix(0,1.339548,-1.2134609,0,363.67506,-109.94122)"
+         inkscape:original-d="m 178.89701,201.9258 -51.1938,-62.44518"
+         inkscape:path-effect="#path-effect2346"
+         inkscape:connector-curvature="0"
+         id="path2344"
+         d="m 178.89701,201.9258 c 0,0 0.10231,-0.0839 0.10231,-0.0839 -10.23876,-12.48904 -41.05735,-49.87227 -51.29611,-62.36131 10.23876,12.48904 40.85273,50.04002 51.09149,62.52905 0,0 0.10231,-0.0839 0.10231,-0.0839 z"
+         style="fill:#000000;fill-rule:nonzero;stroke:#7800ff;stroke-width:1.56869304;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-196.61794"
+         cx="59.31451"
+         id="path825-3"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-167.36433"
+         cx="115.57143"
+         id="path825-6"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-217.1517"
+         cx="229.2104"
+         id="path825-7"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-219.68327"
+         cx="187.58029"
+         id="path825-5"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-150.48726"
+         cx="214.58362"
+         id="path825-35"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-111.95128"
+         cx="199.39424"
+         id="path825-62"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-83.541527"
+         cx="227.52272"
+         id="path825-9"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-16.033195"
+         cx="180.82945"
+         id="path825-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-37.973412"
+         cx="133.57364"
+         id="path825-2"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="11.532677"
+         cx="102.63235"
+         id="path825-70"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-28.972313"
+         cx="85.192696"
+         id="path825-93"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-58.788475"
+         cx="39.062016"
+         id="path825-60"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-106.04427"
+         cx="55.466187"
+         id="path825-626"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         transform="rotate(90,104.0753,134.13621)"
+         inkscape:original-d="M 9.0011074,178.86046 99.012181,135.54263"
+         inkscape:path-effect="#path-effect2437"
+         inkscape:connector-curvature="0"
+         id="path2435"
+         d="m 9.0011074,178.86046 c 0,0 0.057368,0.11921 0.057368,0.11921 C 27.06069,170.3161 81.009966,144.2062 99.012181,135.54263 81.009966,144.2062 26.945954,170.07769 8.9437396,178.74125 c 0,0 0.057368,0.11921 0.057368,0.11921 z"
+         style="fill:#000000;fill-rule:nonzero;stroke:#7800ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2447"
+         d="M 167.36434,115.43079 119.96788,134.4175"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2451"
+         d="m 150.6279,214.58361 -35.72314,-65.8206"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2453"
+         d="m 83.96345,227.10078 19.40864,-76.65006"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2455"
+         d="m 38.11406,133.71429 58.78848,4.50055"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2457"
+         d="M 29.95681,85.333333 99.01218,132.16722"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2459"
+         d="M -11.25139,102.77298 97.32447,134.55814"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-143.17386"
+         cx="72.534889"
+         id="path825-62-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-63.851601"
+         cx="193.20599"
+         id="path825-62-8"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2482"
+         d="M 143.09324,72.724586 114.25299,126.52656"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2486"
+         d="m 63.99224,193.76855 36.70764,-45.56811"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2488"
+         d="m 219.82391,187.72093 -98.30897,-43.8804"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2490"
+         d="m 106.04429,55.376524 2.53156,72.149496"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2492"
+         d="m 109.41971,151.43522 2.10963,43.73975"
+         style="fill:#290057;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/centralised.svg.png b/transmediale-2020-7-theses/assets/centralised.svg.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/decentralized.svg b/transmediale-2020-7-theses/assets/decentralized.svg
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="290.62485mm"
+   height="202.31985mm"
+   viewBox="0 0 290.62485 202.31985"
+   version="1.1"
+   id="svg2554"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="decentralized.svg">
+  <defs
+     id="defs2548" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.63772027"
+     inkscape:cx="1002.3451"
+     inkscape:cy="170.28767"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2551">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(40.578966,-44.313906)">
+    <g
+       id="g3370"
+       transform="rotate(-90,104.73346,145.47384)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3290"
+         d="M 9.9746159,106.01544 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3292"
+         d="M 28.456993,69.637433 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3294"
+         d="M 52.513417,32.085938 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3296"
+         d="m 166.04802,16.537271 4.47149,36.507805"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3298"
+         d="M 188.93096,5.9759135 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3300"
+         d="M 200.07906,37.073244 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3302"
+         d="M 198.90557,71.397658 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3304"
+         d="m 127.90978,228.0578 29.63047,-6.16079"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3306"
+         d="m 139.05788,257.98165 18.48237,-36.08464"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3308"
+         d="m 113.5346,261.5021 44.00565,-39.60509"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3310"
+         d="m 190.10444,231.57825 -32.56419,-9.68124"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3312"
+         d="M 178.95634,266.78278 157.54025,221.89701"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3314"
+         d="m 191.27793,186.10574 -33.73768,35.79127"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3331"
+         d="m 154.0198,284.97178 3.52045,-63.07477"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3176"
+         d="M 157.54025,221.89701 120.5755,138.873"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3180"
+         d="M 170.51951,53.045076 157.54025,221.89701"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000009, 6.00000009;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3182"
+         d="M 48.542051,86.236222 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:5.70000029;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3184"
+         d="M 48.542051,86.236222 120.5755,138.873"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000009, 6.00000009;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3186"
+         d="M 121.10467,137.81466 171.04868,51.986742"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-48.699593"
+         cx="85.772842"
+         id="path815"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-170.15521"
+         cx="52.915287"
+         id="path815-7"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-120.28212"
+         cx="139.16637"
+         id="path815-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-157.54025"
+         cx="221.897"
+         id="path815-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-28.750364"
+         cx="69.930801"
+         id="path825-1-0"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-9.3878736"
+         cx="106.30882"
+         id="path825-1-2"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-52.220047"
+         cx="32.379314"
+         id="path825-1-3"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-166.04802"
+         cx="15.950528"
+         id="path825-1-7"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-188.93097"
+         cx="5.975914"
+         id="path825-1-5"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-200.07906"
+         cx="37.130821"
+         id="path825-1-9"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-198.31883"
+         cx="71.104286"
+         id="path825-1-22"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-128.49652"
+         cx="227.76443"
+         id="path825-1-8"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-139.05788"
+         cx="257.68826"
+         id="path825-1-97"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-178.3696"
+         cx="267.6629"
+         id="path825-1-36"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-188.93095"
+         cx="230.69814"
+         id="path825-1-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-191.27792"
+         cx="186.69249"
+         id="path825-1-29"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-113.82797"
+         cx="261.20874"
+         id="path825-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-154.01981"
+         cx="284.97177"
+         id="path825-1-97-3"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <ellipse
+       style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="path825-1-19"
+       cx="204.41275"
+       cy="-138.60612"
+       rx="4.7820001"
+       ry="4.7818384"
+       transform="rotate(90)" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="154.61136"
+       y="207.43237"
+       id="text3389"><tspan
+         sodipodi:role="line"
+         x="154.61136"
+         y="207.43237"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+         id="tspan3393">User</tspan><tspan
+         sodipodi:role="line"
+         x="154.61136"
+         y="223.30737"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+         id="tspan3399">Server</tspan><tspan
+         sodipodi:role="line"
+         x="154.61136"
+         y="239.18237"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+         id="tspan3401">Server connection</tspan></text>
+    <ellipse
+       style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="path825-1-19-4"
+       cx="219.53902"
+       cy="-138.81355"
+       rx="4.7820001"
+       ry="4.7818384"
+       transform="rotate(90)" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4.00000011, 4.00000011;stroke-dashoffset:18;stroke-opacity:1;paint-order:normal"
+       d="m 132.77427,237.66933 14.08181,-4.84063"
+       id="path3418"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/decentralized_no_legend.svg b/transmediale-2020-7-theses/assets/decentralized_no_legend.svg
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="290.62485mm"
+   height="202.31985mm"
+   viewBox="0 0 290.62485 202.31985"
+   version="1.1"
+   id="svg2554"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="decentralized_no_legend.svg">
+  <defs
+     id="defs2548" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.22546817"
+     inkscape:cx="925.46449"
+     inkscape:cy="784.3237"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata2551">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(40.578966,-44.313906)">
+    <g
+       id="g3370"
+       transform="rotate(-90,104.73346,145.47384)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3290"
+         d="M 9.9746159,106.01544 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3292"
+         d="M 28.456993,69.637433 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3294"
+         d="M 52.513417,32.085938 48.542051,86.236222"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3296"
+         d="m 166.04802,16.537271 4.47149,36.507805"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3298"
+         d="M 188.93096,5.9759135 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3300"
+         d="M 200.07906,37.073244 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3302"
+         d="M 198.90557,71.397658 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3304"
+         d="m 127.90978,228.0578 29.63047,-6.16079"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3306"
+         d="m 139.05788,257.98165 18.48237,-36.08464"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3308"
+         d="m 113.5346,261.5021 44.00565,-39.60509"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3310"
+         d="m 190.10444,231.57825 -32.56419,-9.68124"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3312"
+         d="M 178.95634,266.78278 157.54025,221.89701"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3314"
+         d="m 191.27793,186.10574 -33.73768,35.79127"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3331"
+         d="m 154.0198,284.97178 3.52045,-63.07477"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:21.54330826;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3176"
+         d="M 157.54025,221.89701 120.5755,138.873"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3180"
+         d="M 170.51951,53.045076 157.54025,221.89701"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000009, 6.00000009;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3182"
+         d="M 48.542051,86.236222 170.51951,53.045076"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:5.70000029;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3184"
+         d="M 48.542051,86.236222 120.5755,138.873"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000009, 6.00000009;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3186"
+         d="M 121.10467,137.81466 171.04868,51.986742"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:6.00000017, 6.00000017;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-48.699593"
+         cx="85.772842"
+         id="path815"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-170.15521"
+         cx="52.915287"
+         id="path815-7"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-120.28212"
+         cx="139.16637"
+         id="path815-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <circle
+         transform="rotate(90)"
+         r="12.939093"
+         cy="-157.54025"
+         cx="221.897"
+         id="path815-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#7800ff;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.39999998;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-28.750364"
+         cx="69.930801"
+         id="path825-1-0"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-9.3878736"
+         cx="106.30882"
+         id="path825-1-2"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-52.220047"
+         cx="32.379314"
+         id="path825-1-3"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-166.04802"
+         cx="15.950528"
+         id="path825-1-7"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-188.93097"
+         cx="5.975914"
+         id="path825-1-5"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-200.07906"
+         cx="37.130821"
+         id="path825-1-9"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-198.31883"
+         cx="71.104286"
+         id="path825-1-22"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-128.49652"
+         cx="227.76443"
+         id="path825-1-8"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-139.05788"
+         cx="257.68826"
+         id="path825-1-97"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-178.3696"
+         cx="267.6629"
+         id="path825-1-36"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-188.93095"
+         cx="230.69814"
+         id="path825-1-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-191.27792"
+         cx="186.69249"
+         id="path825-1-29"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-113.82797"
+         cx="261.20874"
+         id="path825-1"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+      <ellipse
+         transform="rotate(90)"
+         ry="4.7818384"
+         rx="4.7820001"
+         cy="-154.01981"
+         cx="284.97177"
+         id="path825-1-97-3"
+         style="fill:#7800ff;fill-opacity:1;stroke:#7800ff;stroke-width:2.06499982;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/decentralized_no_legend.svg.png b/transmediale-2020-7-theses/assets/decentralized_no_legend.svg.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/fediverse-floss.dia b/transmediale-2020-7-theses/assets/fediverse-floss.dia
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/fediverse-floss.svg b/transmediale-2020-7-theses/assets/fediverse-floss.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="264pt" height="243pt" viewBox="0 0 264 243" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d="M 13.875 -26.078125 L 3.15625 -26.078125 L 3.15625 7.78125 L 13.875 7.78125 Z M 11.28125 -23.796875 L 11.28125 -22.6875 L 9.046875 -22.6875 L 9.046875 -21.4375 L 11.28125 -21.4375 L 11.28125 -20.3125 L 5.65625 -20.3125 L 5.65625 -21.4375 L 7.890625 -21.4375 L 7.890625 -22.6875 L 5.6875 -22.6875 L 5.6875 -23.796875 Z M 9.046875 -19.4375 L 9.046875 -17.0625 L 11.28125 -17.0625 L 11.28125 -15.90625 L 5.65625 -15.90625 L 5.65625 -19.4375 Z M 7.890625 -18.28125 L 6.765625 -18.28125 L 6.765625 -17.0625 L 7.890625 -17.0625 Z M 11.28125 -15 L 11.28125 -13.875 L 9.046875 -13.875 L 9.046875 -11.515625 L 5.65625 -11.515625 L 5.65625 -12.625 L 7.890625 -12.625 L 7.890625 -13.875 L 5.65625 -13.875 L 5.65625 -15 Z M 11.28125 -12.96875 L 11.28125 -9.578125 L 5.65625 -9.578125 L 5.65625 -10.734375 L 10.15625 -10.734375 L 10.15625 -12.96875 Z M 11.28125 -8.84375 L 11.28125 -5.015625 L 5.65625 -5.015625 L 5.65625 -8.84375 L 6.765625 -8.84375 L 6.765625 -6.125 L 10.15625 -6.125 L 10.15625 -7.71875 L 9.046875 -7.71875 L 9.046875 -6.9375 L 7.890625 -6.9375 L 7.890625 -8.84375 Z M 11.28125 -2.984375 L 11.28125 0.84375 L 5.65625 0.84375 L 5.65625 -2.984375 Z M 10.15625 -1.859375 L 6.765625 -1.859375 L 6.765625 -0.265625 L 10.15625 -0.265625 Z M 11.28125 1.625 L 11.28125 2.75 L 10.1875 2.75 L 7.828125 4.328125 L 11.28125 4.328125 L 11.28125 5.453125 L 5.65625 5.453125 L 5.65625 4.328125 L 8.03125 2.75 L 5.65625 2.75 L 5.65625 1.625 Z M 11.28125 1.625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.78125 0 L 6.609375 0 L 6.609375 -11.078125 L 16.484375 -11.078125 L 16.9375 -14.125 L 6.609375 -14.125 L 6.609375 -22.046875 L 17.46875 -22.046875 L 17.90625 -25.0625 L 2.78125 -25.0625 Z M 2.78125 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 10.125 -2.5 C 6.90625 -2.5 5.421875 -3.890625 5.1875 -7.890625 L 16.15625 -7.890625 C 16.15625 -8.9375 16.15625 -9.75 16.078125 -10.875 C 15.8125 -15.375 13.921875 -18.109375 9.40625 -18.109375 C 4.4375 -18.109375 1.453125 -15.140625 1.453125 -8.5625 C 1.453125 -2.265625 4.03125 0.46875 9.65625 0.46875 C 11.75 0.46875 13.671875 0.140625 15.640625 -0.8125 L 14.9375 -3.359375 C 13.40625 -2.78125 12.046875 -2.5 10.125 -2.5 Z M 9.25 -15.203125 C 11.640625 -15.203125 12.359375 -13.84375 12.53125 -10.390625 L 5.28125 -10.390625 C 5.484375 -13.921875 6.734375 -15.203125 9.25 -15.203125 Z M 9.25 -15.203125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 13.109375 -25.359375 L 13.109375 -17.953125 C 12.25 -18.046875 11.375 -18.109375 10.390625 -18.109375 C 4.328125 -18.109375 1.453125 -14.59375 1.453125 -8.296875 C 1.453125 -1.796875 4.78125 0.46875 9.78125 0.46875 C 12.5 0.46875 14.453125 0.171875 16.859375 -0.46875 L 16.859375 -25.703125 Z M 5.3125 -8.765625 C 5.3125 -13.265625 7.015625 -15.203125 10.328125 -15.203125 C 11.171875 -15.203125 11.890625 -15.140625 13.109375 -14.9375 L 13.109375 -2.609375 C 12.328125 -2.46875 11.640625 -2.46875 10.765625 -2.46875 C 7.046875 -2.46875 5.3125 -4.171875 5.3125 -8.765625 Z M 5.3125 -8.765625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 2.75 -21.265625 C 3.65625 -21.03125 5.59375 -21.03125 6.5 -21.265625 L 6.5 -24.609375 C 5.59375 -24.8125 3.65625 -24.8125 2.75 -24.609375 Z M 2.75 0 L 6.5 0 L 6.5 -17.953125 L 2.75 -17.609375 Z M 2.75 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 13.953125 -17.640625 L 9.140625 -3.765625 L 4.671875 -17.640625 L 0.40625 -17.640625 L 7.375 0 L 10.5625 0 L 17.875 -17.640625 Z M 13.953125 -17.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 2.75 0 L 6.5 0 L 6.5 -12.65625 C 7.3125 -14.078125 8.4375 -14.6875 10.125 -14.6875 C 10.90625 -14.6875 11.4375 -14.625 12.09375 -14.453125 L 12.390625 -17.546875 C 11.921875 -17.875 11.3125 -18.109375 10.328125 -18.109375 C 8.796875 -18.109375 7.28125 -17.375 6.5 -15.296875 L 6.5 -17.8125 L 2.75 -17.46875 Z M 2.75 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d="M 7.21875 0.46875 C 10.9375 0.46875 13.921875 -1.25 13.921875 -4.8125 C 13.921875 -7.75 12.15625 -9.109375 9.140625 -10.390625 C 7.078125 -11.3125 5.890625 -12.015625 5.890625 -13.34375 C 5.890625 -14.59375 6.765625 -15.265625 8.4375 -15.265625 C 10.15625 -15.265625 11.484375 -14.890625 12.65625 -14.1875 L 13.546875 -16.6875 C 12.1875 -17.640625 10.59375 -18.109375 8.390625 -18.109375 C 4.703125 -18.109375 2.203125 -16.25 2.203125 -13.140625 C 2.203125 -10.296875 4.09375 -9 6.703125 -7.890625 C 9.40625 -6.734375 10.15625 -6.0625 10.15625 -4.609375 C 10.15625 -3.25 9.203125 -2.375 7.3125 -2.375 C 5.390625 -2.375 3.828125 -2.90625 2.375 -3.859375 L 1.21875 -1.390625 C 2.703125 -0.140625 4.734375 0.46875 7.21875 0.46875 Z M 7.21875 0.46875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 0.8125 1.015625 L 3.625 1.015625 L 11.171875 -25.390625 L 8.359375 -25.390625 Z M 0.8125 1.015625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 2.78125 0 L 18.25 0 L 18.6875 -3.046875 L 6.609375 -3.046875 L 6.609375 -25.0625 L 2.78125 -25.0625 Z M 2.78125 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-10">
+<path style="stroke:none;" d="M 13.140625 -25.53125 C 6.734375 -25.53125 1.359375 -21.0625 1.359375 -12.53125 C 1.359375 -4.03125 6.734375 0.46875 13.140625 0.46875 C 19.5 0.46875 24.921875 -4.03125 24.921875 -12.53125 C 24.921875 -21.0625 19.5 -25.53125 13.140625 -25.53125 Z M 13.140625 -2.640625 C 8.4375 -2.640625 5.421875 -6.53125 5.421875 -12.53125 C 5.421875 -18.515625 8.4375 -22.421875 13.140625 -22.421875 C 17.84375 -22.421875 20.828125 -18.515625 20.828125 -12.53125 C 20.828125 -6.53125 17.84375 -2.640625 13.140625 -2.640625 Z M 13.140625 -2.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-11">
+<path style="stroke:none;" d="M 8.328125 0.46875 C 13.375 0.46875 17.375 -2.03125 17.375 -6.734375 C 17.375 -10.359375 14.96875 -12.15625 10.5625 -14.53125 C 7.984375 -15.875 6.671875 -17.34375 6.671875 -19.234375 C 6.671875 -21.203125 8.328125 -22.3125 10.96875 -22.3125 C 12.53125 -22.3125 14.28125 -22.078125 15.609375 -21.46875 L 16.59375 -24.203125 C 15 -25.125 13.0625 -25.53125 11 -25.53125 C 6.125 -25.53125 2.703125 -22.890625 2.703125 -18.796875 C 2.703125 -15.09375 5.046875 -13.375 8.125 -11.71875 C 11.84375 -9.6875 13.3125 -8.4375 13.3125 -6.328125 C 13.3125 -4 11.34375 -2.75 8.5 -2.75 C 6.609375 -2.75 4.609375 -3.25 2.84375 -4.265625 L 1.5625 -1.5625 C 3.1875 -0.171875 5.890625 0.46875 8.328125 0.46875 Z M 8.328125 0.46875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-12">
+<path style="stroke:none;" d="M 12.859375 0.46875 C 16.015625 0.46875 18.421875 -0.265625 20.796875 -1.734375 L 19.8125 -4.46875 C 17.953125 -3.3125 16.15625 -2.75 13.609375 -2.75 C 9 -2.75 5.421875 -5.71875 5.421875 -12.421875 C 5.421875 -18.890625 8.90625 -22.3125 13.984375 -22.3125 C 16.5625 -22.3125 18.515625 -21.875 20.21875 -21.09375 L 21.0625 -23.90625 C 19.203125 -24.953125 16.859375 -25.53125 13.984375 -25.53125 C 7.078125 -25.53125 1.359375 -20.890625 1.359375 -12.21875 C 1.359375 -3.453125 6.234375 0.46875 12.859375 0.46875 Z M 12.859375 0.46875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-13">
+<path style="stroke:none;" d="M 13.34375 -17.46875 L 13.34375 -4.375 C 12.21875 -3.1875 10.90625 -2.578125 9.40625 -2.578125 C 6.96875 -2.578125 5.859375 -3.796875 5.859375 -7.140625 L 5.859375 -17.8125 L 2.09375 -17.46875 L 2.09375 -7.71875 C 2.09375 -6.5625 2.09375 -5.6875 2.171875 -4.90625 C 2.46875 -1.28125 4.578125 0.375 8.03125 0.375 C 9.921875 0.375 11.8125 -0.265625 13.34375 -1.453125 L 13.34375 0 L 17.09375 0 L 17.09375 -17.8125 Z M 13.34375 -17.46875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-14">
+<path style="stroke:none;" d="M 2.75 0 L 6.5 0 L 6.5 -25.703125 L 2.75 -25.359375 Z M 2.75 0 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-15">
+<path style="stroke:none;" d="M 12.21875 -2.875 C 11.40625 -2.609375 10.828125 -2.5 10.21875 -2.5 C 8.15625 -2.5 7.578125 -3.359375 7.578125 -6.203125 L 7.578125 -14.859375 L 12.296875 -14.859375 L 12.65625 -17.640625 L 7.578125 -17.640625 L 7.578125 -22.28125 L 3.828125 -21.46875 L 3.828125 -17.640625 L 1.28125 -17.640625 L 1.28125 -14.859375 L 3.828125 -14.859375 L 3.828125 -6.40625 C 3.828125 -5.109375 3.859375 -4.203125 3.921875 -3.1875 C 4.125 -1.078125 5.453125 0.46875 8.390625 0.46875 C 10.15625 0.46875 11.578125 0.109375 12.765625 -0.515625 Z M 12.21875 -2.875 "/>
+</symbol>
+</g>
+</defs>
+<g id="surface3792">
+<rect x="0" y="0" width="264" height="243" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
+<g style="fill:rgb(47.058824%,0%,100%);fill-opacity:1;">
+  <use xlink:href="#glyph0-1" x="58.09375" y="32.869737"/>
+  <use xlink:href="#glyph0-2" x="76.982639" y="32.869737"/>
+  <use xlink:href="#glyph0-3" x="94.760417" y="32.869737"/>
+  <use xlink:href="#glyph0-4" x="114.482639" y="32.869737"/>
+  <use xlink:href="#glyph0-5" x="123.649306" y="32.869737"/>
+  <use xlink:href="#glyph0-2" x="141.982639" y="32.869737"/>
+  <use xlink:href="#glyph0-6" x="159.760417" y="32.869737"/>
+  <use xlink:href="#glyph0-7" x="172.815972" y="32.869737"/>
+  <use xlink:href="#glyph0-2" x="188.371528" y="32.869737"/>
+</g>
+<g style="fill:rgb(47.058824%,0%,100%);fill-opacity:1;">
+  <use xlink:href="#glyph0-1" x="71.378906" y="193.397081"/>
+  <use xlink:href="#glyph0-8" x="90.267795" y="193.397081"/>
+  <use xlink:href="#glyph0-9" x="102.21224" y="193.397081"/>
+  <use xlink:href="#glyph0-10" x="121.934462" y="193.397081"/>
+  <use xlink:href="#glyph0-11" x="148.045573" y="193.397081"/>
+  <use xlink:href="#glyph0-11" x="166.934462" y="193.397081"/>
+</g>
+<g style="fill:rgb(47.058824%,0%,100%);fill-opacity:1;">
+  <use xlink:href="#glyph0-12" x="71.378906" y="235.733019"/>
+  <use xlink:href="#glyph0-13" x="93.601128" y="235.733019"/>
+  <use xlink:href="#glyph0-14" x="113.323351" y="235.733019"/>
+  <use xlink:href="#glyph0-15" x="122.490017" y="235.733019"/>
+  <use xlink:href="#glyph0-13" x="136.101128" y="235.733019"/>
+  <use xlink:href="#glyph0-6" x="155.823351" y="235.733019"/>
+  <use xlink:href="#glyph0-2" x="168.878906" y="235.733019"/>
+</g>
+<path style="fill:none;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(47.058824%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 3.52419 2.117514 C 1.428097 4.734897 1.807198 8.547592 4.377901 10.700717 " transform="matrix(20,0,0,20,-40.913495,-5.619814)"/>
+<path style="fill-rule:evenodd;fill:rgb(47.058824%,0%,100%);fill-opacity:1;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(47.058824%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 3.723214 2.336264 L 3.987472 1.599741 L 3.23962 1.830014 Z M 3.723214 2.336264 " transform="matrix(20,0,0,20,-40.913495,-5.619814)"/>
+<path style="fill:none;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(47.058824%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 13.509933 10.29935 C 15.796065 7.722788 15.692159 3.81478 13.272237 1.363608 " transform="matrix(20,0,0,20,-40.913495,-5.619814)"/>
+<path style="fill-rule:evenodd;fill:rgb(47.058824%,0%,100%);fill-opacity:1;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(47.058824%,0%,100%);stroke-opacity:1;stroke-miterlimit:10;" d="M 13.318136 10.070444 L 13.022237 10.795053 L 13.779464 10.597006 Z M 13.318136 10.070444 " transform="matrix(20,0,0,20,-40.913495,-5.619814)"/>
+</g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/g922.png b/transmediale-2020-7-theses/assets/g922.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/monolith.svg b/transmediale-2020-7-theses/assets/monolith.svg
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="161.05666mm"
+   height="234.27512mm"
+   viewBox="0 0 161.05666 234.27512"
+   version="1.1"
+   id="svg4357"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="monolith.svg">
+  <defs
+     id="defs4351" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.4703125"
+     inkscape:cx="442.02288"
+     inkscape:cy="565.82004"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata4354">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(140.44195,-43.158128)">
+    <g
+       id="g4281"
+       transform="translate(67.148678,1.8110555)">
+      <g
+         id="g4271">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+           x="-132.73068"
+           y="72.988464"
+           id="text4036"><tspan
+             sodipodi:role="line"
+             id="tspan4034"
+             x="-132.73068"
+             y="72.988464"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             dx="0">USERS</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="109.67735"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4042">ADMIN</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="146.36624"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4040">SOFTWARE</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="183.05513"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4046">HOSTING</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="219.74402"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4048">DOMAIN</tspan></text>
+      </g>
+      <rect
+         ry="23.173599"
+         y="43.347073"
+         x="-194.93063"
+         height="196.28445"
+         width="127.58755"
+         id="rect4091"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="-140.67902"
+       y="274.84033"
+       id="text4285"><tspan
+         sodipodi:role="line"
+         x="-140.67902"
+         y="274.84033"
+         style="font-size:14.8166666px;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+         id="tspan4289">Twitter, Facebook, et al.</tspan></text>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/monolith_no_label.svg b/transmediale-2020-7-theses/assets/monolith_no_label.svg
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.58755mm"
+   height="200.28445mm"
+   viewBox="0 0 131.58756 200.28446"
+   version="1.1"
+   id="svg4357"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="monolith_no_label.svg">
+  <defs
+     id="defs4351" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.4703125"
+     inkscape:cx="413.42749"
+     inkscape:cy="437.3514"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata4354">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(129.78196,-43.158128)">
+    <g
+       id="g4281"
+       transform="translate(67.148678,1.8110555)">
+      <g
+         id="g4271">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+           x="-132.73068"
+           y="72.988464"
+           id="text4036"><tspan
+             sodipodi:role="line"
+             id="tspan4034"
+             x="-132.73068"
+             y="72.988464"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             dx="0">USERS</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="109.67735"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4042">ADMIN</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="146.36624"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4040">SOFTWARE</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="183.05513"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4046">HOSTING</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="219.74402"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4048">DOMAIN</tspan></text>
+      </g>
+      <rect
+         ry="23.173599"
+         y="43.347073"
+         x="-194.93063"
+         height="196.28445"
+         width="127.58755"
+         id="rect4091"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/monolith_no_label.svg.png b/transmediale-2020-7-theses/assets/monolith_no_label.svg.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/the_mess.svg b/transmediale-2020-7-theses/assets/the_mess.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="124.50696mm"
+   height="218.00439mm"
+   viewBox="0 0 124.50696 218.0044"
+   version="1.1"
+   id="svg3489"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="the_mess.svg">
+  <defs
+     id="defs3483" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.45254834"
+     inkscape:cx="262.00414"
+     inkscape:cy="525.89513"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3486">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(18.159776,-53.712258)">
+    <g
+       id="g4263"
+       transform="translate(31.571213,3.2165693)">
+      <text
+         id="text4036-1"
+         y="73.012505"
+         x="11.314508"
+         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+         xml:space="preserve"><tspan
+           dx="0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="73.012505"
+           x="11.314509"
+           id="tspan4034-0"
+           sodipodi:role="line">USERS</tspan><tspan
+           id="tspan4042-6"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="109.70139"
+           x="11.314507"
+           sodipodi:role="line">ADMIN</tspan><tspan
+           id="tspan4040-3"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="146.39029"
+           x="11.314508"
+           sodipodi:role="line">SOFTWARE</tspan><tspan
+           id="tspan4046-2"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="183.07916"
+           x="11.314507"
+           sodipodi:role="line">HOSTING</tspan><tspan
+           id="tspan4048-0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="219.76807"
+           x="11.314508"
+           sodipodi:role="line">DOMAIN</tspan></text>
+      <rect
+         ry="3.291327"
+         y="52.386627"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="88.944786"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-4"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78200006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="125.50299"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-5"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="162.06114"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-2"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="198.61932"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-54"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="11.415623"
+       y="271.50922"
+       id="text4285-7"><tspan
+         sodipodi:role="line"
+         x="11.415623"
+         y="271.50922"
+         style="font-size:14.8166666px;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+         id="tspan4289-4">Fediverse</tspan></text>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/the_mess_no_label.svg b/transmediale-2020-7-theses/assets/the_mess_no_label.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="124.50696mm"
+   height="177.89268mm"
+   viewBox="0 0 124.50696 177.89269"
+   version="1.1"
+   id="svg3489"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="the_mess_no_label.svg">
+  <defs
+     id="defs3483" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.45254834"
+     inkscape:cx="262.00414"
+     inkscape:cy="374.29185"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3486">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(18.159776,-53.712258)">
+    <g
+       id="g4263"
+       transform="translate(31.571213,3.2165693)">
+      <text
+         id="text4036-1"
+         y="73.012505"
+         x="11.314508"
+         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+         xml:space="preserve"><tspan
+           dx="0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="73.012505"
+           x="11.314509"
+           id="tspan4034-0"
+           sodipodi:role="line">USERS</tspan><tspan
+           id="tspan4042-6"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="109.70139"
+           x="11.314507"
+           sodipodi:role="line">ADMIN</tspan><tspan
+           id="tspan4040-3"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="146.39029"
+           x="11.314508"
+           sodipodi:role="line">SOFTWARE</tspan><tspan
+           id="tspan4046-2"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="183.07916"
+           x="11.314507"
+           sodipodi:role="line">HOSTING</tspan><tspan
+           id="tspan4048-0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="219.76807"
+           x="11.314508"
+           sodipodi:role="line">DOMAIN</tspan></text>
+      <rect
+         ry="3.291327"
+         y="52.386627"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="88.944786"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-4"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78200006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="125.50299"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-5"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="162.06114"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-2"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="198.61932"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-54"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/the_mess_no_label.svg.png b/transmediale-2020-7-theses/assets/the_mess_no_label.svg.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/assets/themess.svg b/transmediale-2020-7-theses/assets/themess.svg
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   viewBox="0 0 210 297"
+   version="1.1"
+   id="svg3489"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="themess.svg">
+  <defs
+     id="defs3483" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.45254834"
+     inkscape:cx="9.6691181"
+     inkscape:cy="333.29058"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata3486">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g4281">
+      <g
+         id="g4271">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332;"
+           x="-132.73068"
+           y="72.988464"
+           id="text4036"><tspan
+             sodipodi:role="line"
+             id="tspan4034"
+             x="-132.73068"
+             y="72.988464"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;stroke-width:0.26458332;fill:#7800ff;fill-opacity:1;"
+             dx="0">USERS</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="109.67735"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;stroke-width:0.26458332;fill:#7800ff;fill-opacity:1;"
+             id="tspan4042">ADMIN</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="146.36624"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;stroke-width:0.26458332;fill:#7800ff;fill-opacity:1;"
+             id="tspan4040">SOFTWARE</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="183.05513"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;stroke-width:0.26458332;fill:#7800ff;fill-opacity:1;"
+             id="tspan4046">HOSTING</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="219.74402"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;stroke-width:0.26458332;fill:#7800ff;fill-opacity:1;"
+             id="tspan4048">DOMAIN</tspan></text>
+      </g>
+      <rect
+         ry="23.173599"
+         y="43.347073"
+         x="-194.93063"
+         height="196.28445"
+         width="127.58755"
+         id="rect4091"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <g
+       id="g4263"
+       transform="translate(31.571213,3.2165693)">
+      <text
+         id="text4036-1"
+         y="73.012505"
+         x="11.314508"
+         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+         xml:space="preserve"><tspan
+           dx="0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="73.012505"
+           x="11.314509"
+           id="tspan4034-0"
+           sodipodi:role="line">USERS</tspan><tspan
+           id="tspan4042-6"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="109.70139"
+           x="11.314507"
+           sodipodi:role="line">ADMIN</tspan><tspan
+           id="tspan4040-3"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="146.39029"
+           x="11.314508"
+           sodipodi:role="line">SOFTWARE</tspan><tspan
+           id="tspan4046-2"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="183.07916"
+           x="11.314507"
+           sodipodi:role="line">HOSTING</tspan><tspan
+           id="tspan4048-0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="219.76807"
+           x="11.314508"
+           sodipodi:role="line">DOMAIN</tspan></text>
+      <rect
+         ry="3.291327"
+         y="52.386627"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="88.944786"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-4"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78200006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="125.50299"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-5"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="162.06114"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-2"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="198.61932"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-54"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="-223.3371"
+       y="273.02927"
+       id="text4285"><tspan
+         sodipodi:role="line"
+         x="-223.3371"
+         y="273.02927"
+         style="font-size:14.8166666px;stroke-width:0.26458332"
+         id="tspan4289">Twitter, Facebook, etc.</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="20.946062"
+       y="271.50922"
+       id="text4285-7"><tspan
+         sodipodi:role="line"
+         x="20.946062"
+         y="271.50922"
+         style="font-size:14.8166666px;stroke-width:0.26458332"
+         id="tspan4289-4">Fediverse</tspan></text>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/themess_no_label.svg b/transmediale-2020-7-theses/assets/themess_no_label.svg
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="310.01746mm"
+   height="200.28445mm"
+   viewBox="0 0 310.01746 200.28446"
+   version="1.1"
+   id="svg3489"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="themess_no_label.svg">
+  <defs
+     id="defs3483" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.32"
+     inkscape:cx="606.40285"
+     inkscape:cy="475.30169"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="837"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3486">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(203.67026,-41.347073)">
+    <g
+       id="g4281"
+       transform="translate(-6.7396262)">
+      <g
+         id="g4271">
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+           x="-132.73068"
+           y="72.988464"
+           id="text4036"><tspan
+             sodipodi:role="line"
+             id="tspan4034"
+             x="-132.73068"
+             y="72.988464"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             dx="0">USERS</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="109.67735"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4042">ADMIN</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="146.36624"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4040">SOFTWARE</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="183.05513"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4046">HOSTING</tspan><tspan
+             sodipodi:role="line"
+             x="-132.73068"
+             y="219.74402"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+             id="tspan4048">DOMAIN</tspan></text>
+      </g>
+      <rect
+         ry="23.173599"
+         y="43.347073"
+         x="-194.93063"
+         height="196.28445"
+         width="127.58755"
+         id="rect4091"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+    <g
+       id="g4263"
+       transform="translate(31.571213,3.2165693)">
+      <text
+         id="text4036-1"
+         y="73.012505"
+         x="11.314508"
+         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:10.58333302px;line-height:1.5;font-family:'Route 159';-inkscape-font-specification:'Route 159 Semi-Bold';letter-spacing:0px;word-spacing:0px;fill:#7800ff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+         xml:space="preserve"><tspan
+           dx="0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="73.012505"
+           x="11.314509"
+           id="tspan4034-0"
+           sodipodi:role="line">USERS</tspan><tspan
+           id="tspan4042-6"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="109.70139"
+           x="11.314507"
+           sodipodi:role="line">ADMIN</tspan><tspan
+           id="tspan4040-3"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="146.39029"
+           x="11.314508"
+           sodipodi:role="line">SOFTWARE</tspan><tspan
+           id="tspan4046-2"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="183.07916"
+           x="11.314507"
+           sodipodi:role="line">HOSTING</tspan><tspan
+           id="tspan4048-0"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18.34444427px;line-height:2;font-family:'Route 159';-inkscape-font-specification:'Route 159 Bold';text-align:center;text-anchor:middle;fill:#7800ff;fill-opacity:1;stroke-width:0.26458332"
+           y="219.76807"
+           x="11.314508"
+           sodipodi:role="line">DOMAIN</tspan></text>
+      <rect
+         ry="3.291327"
+         y="52.386627"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="88.944786"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-4"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78200006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="125.50299"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-5"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="162.06114"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-2"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+      <rect
+         ry="3.291327"
+         y="198.61932"
+         x="-47.839989"
+         height="27.878119"
+         width="120.72496"
+         id="rect4091-6-7-54"
+         style="fill:none;fill-opacity:1;stroke:#7800ff;stroke-width:3.78187704;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:151.18110657;stroke-opacity:1;paint-order:normal" />
+    </g>
+  </g>
+</svg>
diff --git a/transmediale-2020-7-theses/assets/themess_no_label.svg.png b/transmediale-2020-7-theses/assets/themess_no_label.svg.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/centralized_network.jpg b/transmediale-2020-7-theses/centralized_network.jpg
Binary files differ.
diff --git a/transmediale-2020-7-theses/federated_network.jpg b/transmediale-2020-7-theses/federated_network.jpg
Binary files differ.
diff --git a/transmediale-2020-7-theses/fonts/Route159-SemiBold.woff b/transmediale-2020-7-theses/fonts/Route159-SemiBold.woff
Binary files differ.
diff --git a/transmediale-2020-7-theses/fonts/subset-Aegyptus.woff b/transmediale-2020-7-theses/fonts/subset-Aegyptus.woff
Binary files differ.
diff --git a/transmediale-2020-7-theses/fonts/subset-Aegyptus.woff2 b/transmediale-2020-7-theses/fonts/subset-Aegyptus.woff2
Binary files differ.
diff --git a/transmediale-2020-7-theses/index.html b/transmediale-2020-7-theses/index.html
@@ -0,0 +1,1201 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Seven Theses On The Fediverse</title>
+    <meta charset="utf-8">
+<!--     <link rel="stylesheet" href="lurk.org.css" type="text/css"> -->
+    <style>
+      @font-face {
+        font-family: 'Route159-SemiBold';
+        src: url('fonts/Route159-SemiBold.woff') format('woff');
+      }
+      @font-face {
+          font-family: 'Aegyptus';
+          src: local('Aegyptus'),
+              url('fonts/subset-Aegyptus.woff2') format('woff2'),
+              url('fonts/subset-Aegyptus.woff') format('woff');
+          font-weight: normal;
+          font-style: normal;
+      }
+
+      body {
+        font-family: "Route159-SemiBold", Fallback, sans-serif;
+        font-size: 1.35em;
+        list-style-type: hiragana;
+        line-height: 1.3em;
+        color:#7800FF;
+      }
+
+      .inverted {
+        background-color:#7800FF;
+        color:#FFF;
+        border:1px solid #7800FF;
+      }
+
+      .words {
+        background-color: #FFCD3F;
+        color: #000;
+        //font-size: 8vH;
+      }
+
+      .faded {
+        opacity: 0.2;
+      }
+
+      .contain{
+        background-size:contain;
+      }
+
+      .caption {
+        background-color:#FFF;
+        font-family:monospace;
+
+      }
+
+      .quote {
+        line-height: 2em;
+      }
+
+      .remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
+    </style>
+  </head>
+  <body>
+    <textarea id="source">
+
+class: bottom, middle
+
+# Seven Theses on the *Fediverse* 
+# and the becoming of FLOSS
+
+.left[Transmediale 2k20<br /><br />Aymeric Mansoux (@320x200@post.lurk.org)<br />Roel Roscam Abbing (@rra@post.lurk.org)]
+
+---
+class: inverted, middle, center
+# Introduction
+
+???
+WE JUST SAY OUR NAMES?
+
+---
+class: center,middle
+
+.center.middle.quote[
+## “ What if we were to accept that the goal of theory is not to extend knowledge by confirming what we already know, that the world is a place of domination and oppression? What if we asked theory instead to help us see openings, to provide a space of freedom and possibility? ”]
+
+.left.bottom[2008, J.K Gibson-Graham after Eve Sedgewick in *Diverse Economies: performative practices for 'other worlds'*]
+
+???
+WE READ THE QUOTE OUT LOUD
+
+--
+???
+OK so this talk is not yet another talk about the crisis of social media.
+
+We believe that in the past years there has been a lot of social media critique, perhaps even a surplus. On the other hand, very little attention has been given to what people are doing concretely, when they take such critiques to heart.
+
+---
+class: inverted, middle, center
+# The Fediverse
+
+???
+This is why this talk will focus on such a concrete effort, namely the Fediverse, a grassroots network of interoperating websites that try to establish an alternative to corporate social media. We're talking about platforms for microblogging, video and music sharing, photo publishing, etc, self-hosted by many different communities. 
+
+---
+class: inverted, middle, center
+# It's complicated
+
+???
+Even if this talk does not want to be a critique of social media, that does not mean that our presentation of the Fediverse is uncritical. On the contrary what makes the Fediverse so interesting lies in all its flaws, the issues it tries to address, and also the surprises, complexities and lessons that such an undertaking requires.
+
+---
+class: inverted, middle, center
+# It's complicated
+
+???
+As a result this presentation is not about presenting the latest technosolutionist services. It's more of an introduction to these networks and to present the current state of our research. We also hope this will encourage you to look more closely at what's happening one click away from Facebook, Twitter, YouTube and whatnot.
+
+---
+class: inverted, middle, center
+# 7 theses
+
+???
+This is the reason why we very conveniently chose to present 7 theses as an attempt to start mapping potential point of interests and direction for further exploration.
+
+---
+class: inverted, middle, center
+# Fediverse and F/LOSS culture
+
+???
+But these theses are not just about alternative social media. They are also linked to the becoming of Free/Libre and Open Source practices.
+
+---
+class: inverted, middle, center
+# Fediverse and F/LOSS culture
+
+???
+With the fediverse being part of a larger free and open source culture, this talk will also focus on exploring the mutually generative relationship between this alternative social media ecosystem and FLOSS. 
+
+---
+class: contain, bottom, left
+background-image: url(thefediverse.jpg)
+.caption[how_the_fediverse_self_describes.png.jpg]
+
+???
+And now for the question that surely many of you have been asking yourself in the past few minutes. What the hell is the Fediverse?
+
+--
+???
+So let's start with a quick overview.
+
+--
+???
+It's a network of interoperable social media platforms
+
+--
+???
+What does that mean?
+
+---
+class: contain, bottom, left
+background-image: url(thefediverse.jpg)
+.caption[how_the_fediverse_self_describes.png.jpg]
+
+???
+It means that instead of having a single organisation having control over every things of what consitutes social media, all these things become visible and can be appropriated or shaped in all sorts of different ways.
+
+---
+class: contain, bottom, left
+background-image: url(assets/themess_no_label.svg.png)
+
+
+???
+Very concretely on corporate social media, everything is conflated into the name of the product. There is no distinction between the app, the URL, community. For instance Facebook is just any and all of these different parts. On the Fediverse, all these elements are up for grabs, and can be combined and activated in different ways.
+
+
+---
+
+class: contain, bottom, left
+background-image: url(assets/themess_no_label.svg.png)
+
+???
+If you're on Twitter, you can't comment on a YouTube video. This is not a technical restriction, it's a business decision. But on the Fediverse, you can comment on the video of a federated video sharing platform, from your account on a microblogging platform.
+
+---
+class: inverted, middle, center
+# Federation
+
+???
+
+All of this is implementing what is referred to as federated networking. Which is pretty much how email works (until everyone switches to gmail that is.)
+
+---
+
+class: contain, bottom, left
+background-image: url(assets/centralised.svg.png)
+
+Centralised network
+
+???
+
+On a centralised network, every account relies on a central hub to carry communication across the network. This central hub consequently concentrates all the technical, economic power and political power.
+
+---
+class: contain, bottom, left
+background-image: url(assets/decentralized_no_legend.svg.png)
+
+Federated network
+
+
+???
+But on a federated network like the Fediverse, users can register one or several accounts on different servers (called instances) of the network, and the instances take care of sending and receiving messages between accounts across the network. Likewise power is distributed across the network.
+
+---
+class: contain, bottom, left
+background-image: url(assets/decentralized_no_legend.svg.png)
+
+Federated network
+
+???
+Each instance can be run by anyone or any group of people for any purpose. This means that in practice the Fediverse is a giant mess. Instances can for general purpose and have several thousands users, or they can be focussed on a specific topic, practice, subject with a handful of users. Some instances are even single user. Finally it's up to each instance to decide if they want to be open to registrations, be invite-only, if they want to publish a code of conduct, or not, etc.
+
+---
+class: bottom,left,contain
+background-image: url(inthe90s.jpg)
+ 
+.caption[
+#### nettime_be_like.jpg]
+
+???
+To be sure, Federation is not new.
+
+This is just the latest wave of enthousiasm. But then again, different people, different ideas, different software, different times.
+
+---
+class: bottom,left,contain
+background-image: url(artemisbolidia_fediposter.jpg)
+
+.caption[**Lídia Pereira, Artemis Gryllaki, Bohye Woo**]
+
+
+???
+If you went to the Transmediale exhibition you may have seen this poster designed and research by Lídia Pereira from the Pervasive Labour Union with Artemis Gryllaki and Bohye Woo from the Experimental Publishing master at Piet Zwart Institute.
+
+---
+class: bottom,left,contain
+background-image: url(artemisbolidia_fediposter.jpg)
+
+.caption[**Lídia Pereira, Artemis Gryllaki, Bohye Woo**]
+
+???
+As seen on the poster, interest on federated social media has grown a lot recently and we think now more than ever it's time to look into it further.
+
+---
+
+class:inverted
+# 7 Theses
+
+???
+Here we go
+
+---
+
+<!--aymeric-->
+# THESIS 1
+## Fediverse as transition from meme wars to network wars?
+
+???
+
+What would be a conference on art and digital culture without a good old discussion about internet memes?
+
+---
+class: words, center, middle
+# Memes!
+
+???
+Social media platforms have allowed the democratisation of meme production and have greatly facilitated their circulation.
+
+--
+???
+
+They achieved this by creating software that favours the circulation of viral content to keep their users hooked. 
+
+---
+class: words, center, middle
+# Everything is a meme
+
+???
+Now the problem is if you do that for more than a decade, you end up with everything looking like a meme to have any chance at being noticeable in social media.
+
+But there's something else that was completely unforseen...
+
+---
+class: words, center, middle
+# Language
+
+???
+and that was how memes became a language.
+
+A language through which new collective identities could emerge. And would also permit existing subcultures to be stronger.
+
+And this to the point of turning commercial social media into hostile and toxic environments for some communities. But it also made painfully visible how content moderation on coporate social media platforms was always biased.
+
+---
+class: words, center, middle
+# Moving out of the global village
+
+???
+As a result all those that ended up excluded or harmed in these environments became interested in migrating to platforms that they can control themselves, reversing the narrative of the universal global village, and the tech industry claim of connecting the world without friction.
+
+---
+class: words, center, middle
+# Moving out of the global village
+
+???
+In a situation where silencing or voluntary exile are the only options, federation opens a third way. It allows a community to engage with conflicts and exchanges with other communities while remaining undiluted in its scope, ideology or interests.
+
+---
+class: words, center, middle
+# Network wars?
+
+???
+But in this situation, we can wonder if this is not going to accentuate thinking along axes of friends or enemies, to the extent that simplistic meme warfare will be replaced with network wars.
+
+---
+class: words, center, middle
+# Network wars?
+
+???
+This is why, if we're going to talk about memes today, we must move the discussion to the level of social media infrastructures. We must talk about these environments that allow, for better or worse, the sedimentation of knowledge. What happens when some specific discourse can accumulate and concentrate online and what kind of dynamics it creates.
+
+Ultimately, how to deal with a concept such as openness in this context?
+
+
+---
+
+<!--roel-->
+# THESIS 2
+## Fediverse as an ongoing critique of openness?
+
+---
+
+class: words, center, middle
+
+# Openness & universality
+
+???
+
+openness, universality, and the unrestricted circulation of information have been central narratives for promoting 
+
+technological progress, the internet and the web
+
+---
+
+class: words, center, middle
+
+# Openness & universality
+
+???
+
+At the same time these are also the core liberal values that underpinned the F/LOSS movement
+
+and by extension also how social media has been said to be democratizing
+
+---
+
+class: words, center, middle
+
+# More interconnection & growth
+
+???
+
+more inclusion
+
+more free speech
+
+---
+
+class: words, center, middle
+
+# More interconnection & growth
+
+???
+
+more information
+
+more knowledge
+
+---
+
+class: words, center, middle
+
+# More democracy / profit
+
+???
+
+This in turn is supposed to lead to more robust online democracy but it also lead to massive value extraction.
+
+In response to the practices of commercial social media the response from floss communities was to create alternatives
+
+---
+
+class: words, center, middle
+
+# Yes to liberal assumptions,
+
+# no to commercial exploitation
+
+???
+
+As a consequence early fediverse software tried to to recover the liberal values 
+
+but get rid of the commercial exploitation
+
+---
+
+class: words, center, middle
+
+# Yes to liberal assumptions, 
+
+# no to commercial exploitation
+
+???
+
+in effect assuming that maximum interconnection, universality and growth would be beneficial.
+
+this worked for floss adjacent crowds but maybe only for those
+
+---
+
+class: words, center, middle
+
+# Mastodon 
+
+???
+
+in 2017 through the new fediverse software mastodon, more diverse communities joined the network
+
+including queer and gaming communities and people traditionally underrepresented in floss  
+
+---
+
+class: words, center, middle
+
+# Gamergate
+
+???
+
+these communities, with on-line harassment and things like Gamergate in mind challenged the liberal assumptions underlying federation
+
+---
+
+class: words, center, middle
+
+# Gamergate
+
+???
+
+they did so by introducing critiques and practices of queer and feminst thinking
+
+---
+
+class: words, center, middle
+
+# If *anyone* can join, 
+
+# not *everyone* is welcome
+
+???
+
+This included concepts of safe spaces, consent and nuanced understandings of speech and of course prior experiences of on-line harassment
+
+---
+
+class: words, center, middle
+
+# *Defederating* 
+
+???
+
+as these communities helped build mastodon and other fediverse software they advocated options to selectively shut out parts of the network that where harmful for them through server blocks or defederation
+
+---
+
+class: words, center, middle
+
+# 'Breaking the federation'
+
+???
+
+the Mastodon project as a consequence got heavily criticized for breaking the federation
+
+since limiting connections would also limit the supposedly productive exchange of opinions they would risk the success of the entire network
+
+---
+
+class: words, center, middle
+
+# Or 'growing the federation?'
+
+???
+
+HOWEVER instead the has fediverse grown significantly since then
+
+challenging the assumptions of universality and maximum interconnections allowed more communities to join that space on their own terms by setting their own boundaries
+
+---
+
+class: words, center, middle
+
+# Or 'growing the federation?'
+
+???
+
+now fediverse is home to a wide range of different communities some with completely incompatible ideologies
+
+---
+
+class: words, center, middle
+
+# The limits of openness
+
+???
+
+What is unique about the Fediverse is this both technical and cultural acknowledgement that openness has its limits, and is itself open to wide-ranging interpretations dependent
+on context, which are not fixed in time.
+
+---
+<!--aymeric-->
+# THESIS 3
+## Fediverse as a site for online agonistic pluralism?
+
+
+---
+class: words, center, middle
+# 4.3 million accounts
+# 5000 servers
+
+???
+Once again, the Fediverse exists as a collection of communities that not only can talk to each other, but use social media communication to define themselves in relation to the others.
+
+---
+class: words, center, middle
+# 4.3 million accounts<br />
+# 5000 servers
+
+???
+Sounds great on paper, now try to make sense of how the dynamics of collective identity, ideology, and conflicts can be understood when you have 4.3 millions accounts spread over more than 5000 servers.
+
+We need some help.
+
+---
+class: words, center, middle
+# Agonism
+
+???
+And some help can potentially be found in the political theory of agonism, and more particularly how agonism can be a useful tool to navigate through this giant mess.
+
+---
+class: words, center, middle
+# Agonism
+
+???
+And the type of agonism that we're particularly interested in here, is the one articulated by Chantal Mouffe.
+
+--
+???
+In Mouffe's view, political consensus is impossible and radical negativity cannot be avoided in a system where diversity is limited only to similar competing groups within the same hegemonic order.
+
+---
+class: words, center, middle
+# Sounds familiar?
+
+???
+And, yes indeed this is precisely what is going on right now on commercial social media.
+
+---
+class: words, center, middle
+# Pluralism of hegemonies
+
+???
+Now, the bet made by agonism is that by creating a system in which a pluralism of hegemonies is permitted, it is possible to move from an understanding of the other as an enemy, to the other as a political adversary. But for this to happen, different ideologies must be able to materialise via different channels and platforms.
+
+---
+class: words, center, middle
+# Conflictual consensus
+
+???
+In such a situation we move from political consensus to conflictual consensus.
+
+Easier said than done.
+
+Specially in a system that allows fine grained moderation of content and allow the blocking of individual accounts, groups, servers. Basically allowing to completely taylor and lock down your social media experience to only engage with like-minded peers.
+
+---
+class: words, center, middle
+# Acid test
+
+???
+Very concretely, last year when Gab, the neo-Nazis, white supremacists, and the alt-right social network moved from its own isolated alt-tech platform to the Fediverse, it was able to forge new alliances with like-minded communities and in some way with the Fediverse being to some extent a safe space for many minorities it was also giving the trolls the biggest playground they may have ever dreamed of.
+
+This situation is a direct test case to discuss the neutrality of Fediverse code, the network itself, and the protocols it used.
+
+---
+class: words, center, middle
+# Neutrality?
+
+???
+And how to respond to this arrival, not only at the technological level, but
+also the social and cultural level. For instance, since then, holding a position of neutrality, whether driven by ambivalence, by unspoken support, by hypocrisy, by the desire to troll, by lack of interest, but also by honest faith into
+apolitical technology, or by an agonistic desire to confront and engage with all parts of the Fediverse, has been very difficult to maintain and justify.
+
+---
+class: words, center, middle
+# Federated politics
+
+???
+
+Instead of reaching a state of agonistic pluralism, it could be that the
+Fediverse would at best create a form of bastard agonism where instances would form large agonistic-without-agonism aggregations only amongst both ideologically and technically compatible communities and software, with only a minority of them being able and willing to bridge between with radically opposed systems.
+
+Regardless of how this will be evolving, if the Fediverse is telling us anything, it is that the net and its infrastructure have never been more politicised than today.
+
+---
+<!--roel-->
+# THESIS 4
+## Fediverse as a shift from a technical
+## to a social understanding of privacy?
+
+
+???
+
+One of the effects of the agonism or antagonism described is that we see a shift from a very technical to a more social understanding of privacy in the field of foss
+
+---
+
+class: words, center, middle
+
+# THREAT
+# <br> 
+# Government & 
+# corporate surveillance
+
+???
+
+Historically debates around the risks of social media have been focused on privacy and surveillance. 
+
+---
+
+class: words, center, middle
+
+# THREAT
+# <br> 
+# Government & 
+# corporate surveillance
+
+???
+
+Especially after snowden revelations in 2013. Many F/LOSS projects tried address issues of surveillance by governments or large corporations at the network level
+
+---
+
+class: words, center, middle
+
+# SOLUTION
+# <BR>
+# Strong encryption & P2P
+
+???
+
+That gave rise to many predominantly technical solutions for privacy.
+
+An example the proliferation of specialised apps for encrypted chat and mail.
+
+---
+
+class: words, center, middle
+
+# SOLUTION
+# <BR>
+# Strong encryption & P2P
+
+???
+
+So these tools have over anything else favoured the peer-to-peer model and strong encryption. Trust is always in the code and never in people. 
+
+---
+class: words, center, middle
+
+# APPROACH
+# <BR> 
+# Individualistic 
+
+???
+
+These approaches consequently require considerable technical knowledge from users. Essentially these approaches picture individuals in full command of their communications. 
+
+---
+
+class: words, center, middle
+
+# THREAT 
+# <br>
+# Online conversations & 
+# others on the network 
+
+???
+
+On the fediverse one the other hand a different threat model is prioritized. It is no longer the NSA but rather on-line social interaction itself that threatens safety.
+
+---
+class: words, center, middle
+
+# SOLUTION
+# <br> 
+# community moderation
+
+???
+
+Consequently there has been a great emphasis on forming of communities rallying around servers. 
+
+---
+class: words, center, middle
+
+# SOLUTION
+# <br> 
+# community moderation
+
+???
+
+Moderating speech, limiting exposure to unwanted content, blocking out other communities became prioritized features
+
+---
+
+class: words, center, middle
+
+# APPROACH
+# <br> 
+# Collective 
+
+???
+
+Federation does allow collective approaches to privacy.
+
+Issues brought up particularly by  members of marginalised communities that joined the fediverse as they sought safer spaces than CSM
+
+---
+
+class: words, center, middle
+
+
+# Social understandings of privacy
+
+???
+
+So we witness the large scale trying out of a model which is not about trusting the technology as much as trusting the community.
+
+---
+
+class: words, center, middle
+
+# Different understandings of privacy
+
+???
+
+This obviously has its limitations and potential pitfalls. 
+
+While for some federation brings the woes of decentralization with none of the benefits of centralization.
+
+---
+
+class: words, center, middle
+
+
+# Different understandings of privacy
+
+???
+
+At the same time it allowed a large group to try first hand what an alternative could be like. 
+
+And consequently negotiate how it should work, both socially and increasingly also technically. 
+
+---
+class: words, center, middle
+
+#  Different understandings of privacy
+
+???
+
+To be sure the fediverse has not solved this, these are hard questions, but at least there is both a context and awareness for this to be researched and implemented further.
+
+---
+
+<!--aymeric-->
+# THESIS 5
+## Fediverse as a way out of data sharecropping and free labour?
+
+???
+As everyone here is well aware of, corporate social media platforms with their focus on self-gratifying metrics and gamification, are infamous for taking free and and pervasive labour to the next level.
+
+---
+class: words, center, middle
+# Surveillance capitalism
+
+???
+Whatever information is fed into the system, will be used to directly or indirectly create models, reports, and essentially new datasets that have core economic value for the platform owners.
+
+---
+class: words, center, middle
+# Click OK to consent
+
+???
+It's a complete deadlock that will never change because after all users have agreed to that, and even with chronic coverage of social media disasters, no regulatory bodies have seemed to care enough to start acting in any significant way in the past 15 years.
+
+---
+class: words, center, middle
+# Non-democratic social media
+
+???
+This situation is like this because corporate social media are simply non democratic systems. And to be fair, they never claimed they were. They are businesses that in current time are allowed to exist outside of public reach and examination. End of story.
+
+---
+class: words, center, middle
+# Democratic social media?
+
+???
+On the other hand, on the Fediverse, discussion about who has acces to what you post, how it is stored, how it circulates, are very transparent. To be sure, problems of scraping, doxxing, exploitation and privacy in general are not solved, but at least everyone is able to voice their perspective.
+
+---
+class: words, center, middle
+# Pedagogic social media?
+
+???
+The best way to witness this are on issue trackers that have transformed from a place where bugs are reported, to become public assemblies for programmers *and* non-programmers to deliberate, and most importantly, learn from each other.
+
+To Borrow from Robert Gehl talking about alternative social media, the Fediverse is a pedagogical environment.
+
+---
+class: words, center, middle
+# Free as in precarity
+
+???
+But what is gained in pedagogy, empowerement, autonomy, is obviously lost in sustainability in a system that exists outside of the moneytisation of its users. We're not talking about the difficulty of making billions for running a Fediverse instance, we're talking about much more basic issues such as preventing burnout for developers, maintainers, admins, moderators, etc. We're talking about the damage that we created when we've grown to expect that everything online should be automagically free.
+
+---
+class: words, center, middle
+# Full stack sustainability
+
+???
+So yeah, it's complicated, but at least notbody is pretending otherwise, and these challenges have allowed to re-open discussions about platform coop, public funding of free software, and basically if economic models outside of surveillance capitalism can exist to support non-exploitative solidarity and care across the whole stack.
+
+---
+
+<!--roel-->
+# THESIS 6
+## Fediverse as the rise of a new kind of usership?
+
+
+---
+class: words, center, middle
+# 'The Fediverse'
+
+???
+
+One particular way to understand the Fediverse is as a collective name for a set of practices, expectations and demands of social media software.
+
+---
+class: words, center, middle
+# 'The Fediverse'
+
+???
+
+One where different efforts to produce alternatives converge into a shared network with roughly aligned goals.
+
+This is particularly tangible when one considers how usership gets negotiated and renegotiated in the fediverse.
+
+---
+class: words, center, middle
+# User as programmer
+
+???
+
+Historically, the first software users, or let's say users of computational devices, were also their programmers.
+
+---
+class: words, center, middle
+# User as customer
+
+???
+
+Later through the decades this model changed to the situation where the user became a customer and usership became limited to questions of customisation and feedback on product development.
+
+---
+class: words, center, middle
+# User as data source
+
+???
+
+This model eroded even further with the model of usership as a source of revenue for a third party.
+
+---
+class: words, center, middle
+# User as contributor
+
+???
+
+Users on commercial social media have some ways to participate in the shaping of the platforms they use, 
+
+---
+class: words, center, middle
+# User as contributor
+
+???
+
+Fedi users howevers do not only engage in bug reporting, or help with the creation of the products’ culture, but also become actively engaged in scrutinizing the code, debating its effects and sometimes contributing code back.
+
+---
+class: words, center, middle
+# User as host
+
+???
+
+Extending this they use these tools to set up instances with their communities, write their own Codes of Conduct and come up with fitting Terms of Services. While not all suggestions get taken into the mainline code
+
+---
+class: words, center, middle
+# Non-ideal user
+
+???
+
+At the same time, there is a different approach in some Fediverse software projects where a move has been made from a situation where software is written for an ideal user is able to change the program to suit their needs.
+
+---
+class: words, center, middle
+# Non-ideal user
+
+???
+
+To a situation where there is a discussion between programmers and non-programmers to understand what usership means and what should be good defaults for everyone.
+
+---
+class: words, center, middle
+# User as learner
+
+???
+
+To be sure, many of the practices of usership seen on the fediverse are neither new or unique to the Fediverse. 
+
+For instance, the way service facilitators are supported on the Fediverse is very analogous to the way content creators on streaming platforms in gaming communities are supported by their audience.
+
+---
+class: words, center, middle
+# User as learner
+
+???
+
+Calls for and the development of better governance of software projects have also been happening more generally in FLOSS communities.
+
+Likewise, many of the moderation and community management practices seen in the Fediverse have been informed by experiences on other platforms. 
+
+---
+class: words, center, middle
+# User as learner
+
+???
+
+Users have drawn inspiration from the successes and failures of others tools and systems and brought them over to the Fediverse. What is noteworthy is how increasingly the synthesis and coordination of all these practices become visible in the Fediverse.  
+
+In turn, issues and approaches articulated in the Fediverse set a precedent for other FLOSS projects, encouraging transformations and discussions that were until now limited and difficult to initiate.
+
+---
+class: words, center, middle
+# User as ?
+
+???
+
+It is obviously not the case that the entirety of the Fediverse operates along these lines, as the space is shared between servers with widely distinct models of usership. 
+
+---
+class: words, center, middle
+# User as ?
+
+???
+
+These range from venture capital backed alt-right platforms, to
+Japanese image-board like systems, anarcho-communist collectives, safe spaces for sex workers, live coding algoravers, gardening forums, personal blogs and data self-hosting cooperatives. 
+
+---
+class: words, center, middle
+# User as ?
+
+???
+
+The developments described above do, however, hint at the fact that there are many different models of usership yet to be discovered and tried and that the Fediverse is a productive environment for this to happen. 
+
+---
+
+<!--aymeric-->
+# THESIS 7
+## Fediverse as the end of Free/Libre and Open Source Software as we know it?
+
+---
+class: words, center, middle
+# Free/Libre vs Open Source
+
+???
+Until now, pretty much all the internal debates around FLOSS licensing have
+remained stuck at the level of comparing over and over again the difference between the free software's emphasis on user ethics versus the open source approach based on economics.
+
+---
+class: words, center, middle
+# Free/Libre vs Open Source
+
+???
+But one thing that everyone seems to agree is that whether motivated by ethics or economics, both free software and open source software share the belief that their position is superior to closed source and proprietary modes of production.
+
+---
+class: words, center, middle
+# Liberal foundation
+
+???
+They also both agree that the foundational liberal drive at the base of these ethical and economic perspectives should not be challenged or questioned.
+
+---
+class: words, center, middle
+# Liberal foundation
+
+???
+That does not mean that there are no disagreement on the scope of such liberal foundation, as seen in discussion opposing copyleft licenses with permissive licenses.
+
+---
+class: words, center, middle
+# Non-discriminatory software
+
+???
+But further discussion have been inconceivable because one of the most important aspects of FLOSS is its non-discriminatory nature.
+
+--
+???
+Anyone can use FLOSS for any purpose.
+
+---
+class: words, center, middle
+# Non-discriminatory software
+
+???
+So far this has worked pretty well, and has benefited all sorts of groups, from for-profit tech companies to activists collectives.
+
+---
+class: words, center, middle
+# Considered harmful
+
+???
+And yet here we are, in a context where many communities are increasingly wondering why the software they develop and publish under FLOSS licensing should end up used by groups that want to harm them or others.
+
+--
+???
+This questionning did not happen over night.
+
+---
+class: words, center, middle
+# Patches and bandages
+
+???
+In the recent years FLOSS has also been incresingly indirectly scrutinized with the ermergence of new forms of governance, creation of codes of conduct, and open discussion about the political colouring of source code.
+
+---
+class: words, center, middle
+# Patches and bandages
+
+???
+This time however what is happening is going beyond isolated efforts, virtue signaling and theoretical examinations.
+
+---
+class: words, center, middle
+# Renewal of FLOSS critique
+
+???
+Because of its diversity of users, developers, agendas, software, ideologies, the Fediverse is becoming the most important system where this new form of FLOSS critique gets articulated and tested.
+
+---
+class: words, center, middle
+# Renewal of FLOSS critique
+
+???
+Because of all the reasons discussed in this presentation, this is where the traditional notions of FLOSS get confronted and modified by those who understand its use as part of a very concrete larger set of practices that challenge the status quo.
+
+---
+class: words, center, middle
+# Renewal of FLOSS critique
+
+???
+It is a place where a constructive critique of FLOSS and a longing
+for its re-imagination are the most vivid.
+
+---
+class: words, center, middle
+# Renewal of FLOSS critique
+
+???
+With FLOSS culture increasingly feeling like an overly patched collection of irreconcilables from another era, it is urgent to revaluate many of its characteristics that have been taken for granted.
+
+---
+class: words, center, middle
+# Post-FLOSS?
+
+???
+But of course, if we can accept the much needed sacrilege of thinking of free
+software without free software, it still remains to be seen what could fill in
+the void left by its absence.
+
+
+---
+
+<!-- PROBABLY NO TIME FOR THIS
+# BONUS THESIS 8
+# TRANSMEDIAL EXCLUSIVE BONUS
+## Fediverse as a means to provide escape plan for centralised commercial social media?
+
+threat or opportunity to the classic model of social graph
+Twitter being maybe one step ahead for future regulations
+-->
+
+---
+class: inverted, middle, center
+# Uffff...
+
+???
+How are we going to conclude this?
+
+---
+class: inverted, middle, center
+# Uffff...
+
+???
+Like we said in the introduction we are not lacking of any social media critique and discourse, but there is definitively a lack of research, support and investment in alternatives such as the Fediverse.
+
+---
+class: inverted, middle, center
+# Uffff...
+
+???
+To be blunt this is just where the energy is at the moment, and as we tried to articulate with these theses, this phenomenom should be particularly interesting for resarchers and practitioners interested in net culture, software studies, political theory, privacy debates, free labour and platform coops, but also graphic and web application design, and of course free/ libre and open source software.
+
+---
+class: contain, bottom, left
+background-image: url(the_eternal_network.jpg)
+.caption[click_here_to_download.jpg]
+
+???
+This is why don't have a conclusion, there is nothing to conclude, this is just an introduction. And if you're interested to know more, please get a copy of the INC Transmediale publication published for this edition of the festival. In fact this presentation is a drastically reduced version of an article we wrote for the book.
+
+---
+class: contain
+background-image: url(invite.png)
+
+???
+For us this presentation, the paper and the workshops we led this week, are also a means to share the current state of our research. There's more to come, we're planning to work on a publication with Lídia Pereira and Liaizon Wakest and hopefully we will be able to involve more members of the Fediverse in this project.
+
+---
+class: contain
+background-image: url(invite.png)
+
+???
+
+For now, if you're interested in knowing more, we invite you to see for yourself what the Fediverse looks like from the inside.
+
+The image you see on screen is an invitation to post.lurk.org, our artist run fediverse instance 
+
+
+
+---
+class: bottom, middle
+![:scale 25%](invite.png)
+.left[Transmediale 2k20<br /><br />Aymeric Mansoux (@320x200@post.lurk.org)<br />Roel Roscam Abbing (@rra@post.lurk.org)]
+
+???
+Thank you.
+
+*people screaming/booing/silent*
+
+
+
+    </textarea>
+    <script src="remark-0.15.0.min.js"></script>
+    <script>
+      remark.macros.scale = function (percentage) {
+        var url = this;
+        return '<img src="' + url + '" style="width: ' + percentage + '" />';
+        // Usage:
+        //   ![:scale 50%](image.jpg)
+ // Outputs:
+ //   <img src="image.jpg" style="width: 50%" />
+      };
+    </script>
+    <script>
+      var slideshow = remark.create({
+        ratio: "16:9",
+        slideNumberFormat: '', 
+      });
+    </script>
+  </body>
+</html>
diff --git a/transmediale-2020-7-theses/inthe90s.jpg b/transmediale-2020-7-theses/inthe90s.jpg
Binary files differ.
diff --git a/transmediale-2020-7-theses/invite.png b/transmediale-2020-7-theses/invite.png
Binary files differ.
diff --git a/transmediale-2020-7-theses/lurk.org.css b/transmediale-2020-7-theses/lurk.org.css
@@ -0,0 +1,160 @@
+@font-face {
+  font-family: 'Route159-SemiBold';
+  src: url('fonts/Route159-SemiBold.woff') format('woff');
+}
+@font-face {
+    font-family: 'Aegyptus';
+    src: local('Aegyptus'),
+        url('subset-Aegyptus.woff2') format('woff2'),
+        url('subset-Aegyptus.woff') format('woff');
+    font-weight: normal;
+    font-style: normal;
+}
+
+html, body {
+  background-color: #FFFFFF;
+  margin: 0;
+}
+
+header, footer {
+  background-color: #7800FF;
+  color: #FFFFFF;
+}
+
+a, a:hover, a:visited {
+  color: #FFFFFF;
+}
+
+.break {
+  text-align: center;
+  font-size: 500%;
+  font-family: 'Aegyptus';
+}
+
+header img {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  width: 85%;
+  padding-top: 1em;
+  padding-bottom: 2em;
+}
+
+#halp {
+  background-color: #FFCD3F;
+  color: #000000;
+}
+
+#halp h2 {
+  color: #000000;
+}
+
+#halp a, #halp a:hover, #halp a:visited {
+  color: #000000;
+}
+
+code {
+
+    background-color: lavender;
+    padding-left: 0.1em;
+    padding-right: 0.1em;
+    font-family: mono;
+}
+
+main, main h1, main h2 {
+  color: #7800FF;
+}
+
+main a, main a:hover, main a:visited {
+  color: #7800FF;
+  word-wrap:anywhere;
+}
+
+* {
+  font-family: "Route159-SemiBold", Fallback, sans-serif;
+  font-size: 1.05em;
+  /*! text-align: justify; */
+  /*! text-justify: inter-word; */
+  list-style-type: hiragana;
+  line-height: 1.3em;
+}
+
+.centreplz {
+  padding: 2em;
+  width: 80%;
+  max-width: 800px;
+  margin: auto;
+}
+
+h1, h2 {
+  /*! font-family: "F5.6-Regular", Fallback, sans-serif; */
+  font-weight: normal;
+  font-style: normal;
+  color: #FFFFFF;
+  text-transform: uppercase;
+  text-align: left;
+  /*! padding: 0; */
+}
+
+h1 {
+  font-size: 2.5em;
+  border: 2px solid;
+  letter-spacing: 0.5em;
+  padding: 0.5em;
+}
+
+#halp h1 {
+  color: #000000;
+}
+
+h2 {
+  font-size: 1.5em;
+  letter-spacing: 0.1em;
+  margin-top:1em;
+  margin-bottom:0;
+}
+
+h2:before {
+  content: "➢";
+}
+
+blockquote {
+    font-size: 0.8em;
+    background-color: mistyrose;
+    padding: 1em;
+    margin-left: 0;
+  }
+
+em {
+  font-weight: bold;
+  font-style: normal;
+}
+
+footer p {
+  text-align: center;
+}
+
+p, li {
+  /*! font-kerning: auto; */
+  /*! letter-spacing: 0.02em; */
+  margin-bottom: 1em;
+}
+
+
+@media screen and (orientation:portrait) {
+
+.centreplz {
+  padding:1em;
+  max-width: 100%;
+  width:auto;
+
+}
+h1{
+  font-size: 1.8em;
+  letter-spacing: 0.2em;
+}
+h2{
+  font-size: 1.2em;
+}
+}
+ 
diff --git a/transmediale-2020-7-theses/remark-0.15.0.min.js b/transmediale-2020-7-theses/remark-0.15.0.min.js
@@ -0,0 +1,28219 @@
+require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+  this._events = this._events || {};
+  this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+  if (!isNumber(n) || n < 0 || isNaN(n))
+    throw TypeError('n must be a positive number');
+  this._maxListeners = n;
+  return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+  var er, handler, len, args, i, listeners;
+
+  if (!this._events)
+    this._events = {};
+
+  // If there is no 'error' event listener then throw.
+  if (type === 'error') {
+    if (!this._events.error ||
+        (isObject(this._events.error) && !this._events.error.length)) {
+      er = arguments[1];
+      if (er instanceof Error) {
+        throw er; // Unhandled 'error' event
+      } else {
+        // At least give some kind of context to the user
+        var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+        err.context = er;
+        throw err;
+      }
+    }
+  }
+
+  handler = this._events[type];
+
+  if (isUndefined(handler))
+    return false;
+
+  if (isFunction(handler)) {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
+      // slower
+      default:
+        args = Array.prototype.slice.call(arguments, 1);
+        handler.apply(this, args);
+    }
+  } else if (isObject(handler)) {
+    args = Array.prototype.slice.call(arguments, 1);
+    listeners = handler.slice();
+    len = listeners.length;
+    for (i = 0; i < len; i++)
+      listeners[i].apply(this, args);
+  }
+
+  return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+  var m;
+
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  if (!this._events)
+    this._events = {};
+
+  // To avoid recursion in the case that type === "newListener"! Before
+  // adding it to the listeners, first emit "newListener".
+  if (this._events.newListener)
+    this.emit('newListener', type,
+              isFunction(listener.listener) ?
+              listener.listener : listener);
+
+  if (!this._events[type])
+    // Optimize the case of one listener. Don't need the extra array object.
+    this._events[type] = listener;
+  else if (isObject(this._events[type]))
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+  else
+    // Adding the second element, need to change to array.
+    this._events[type] = [this._events[type], listener];
+
+  // Check for listener leak
+  if (isObject(this._events[type]) && !this._events[type].warned) {
+    if (!isUndefined(this._maxListeners)) {
+      m = this._maxListeners;
+    } else {
+      m = EventEmitter.defaultMaxListeners;
+    }
+
+    if (m && m > 0 && this._events[type].length > m) {
+      this._events[type].warned = true;
+      console.error('(node) warning: possible EventEmitter memory ' +
+                    'leak detected. %d listeners added. ' +
+                    'Use emitter.setMaxListeners() to increase limit.',
+                    this._events[type].length);
+      if (typeof console.trace === 'function') {
+        // not supported in IE 10
+        console.trace();
+      }
+    }
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  var fired = false;
+
+  function g() {
+    this.removeListener(type, g);
+
+    if (!fired) {
+      fired = true;
+      listener.apply(this, arguments);
+    }
+  }
+
+  g.listener = listener;
+  this.on(type, g);
+
+  return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+  var list, position, length, i;
+
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  if (!this._events || !this._events[type])
+    return this;
+
+  list = this._events[type];
+  length = list.length;
+  position = -1;
+
+  if (list === listener ||
+      (isFunction(list.listener) && list.listener === listener)) {
+    delete this._events[type];
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+
+  } else if (isObject(list)) {
+    for (i = length; i-- > 0;) {
+      if (list[i] === listener ||
+          (list[i].listener && list[i].listener === listener)) {
+        position = i;
+        break;
+      }
+    }
+
+    if (position < 0)
+      return this;
+
+    if (list.length === 1) {
+      list.length = 0;
+      delete this._events[type];
+    } else {
+      list.splice(position, 1);
+    }
+
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+  var key, listeners;
+
+  if (!this._events)
+    return this;
+
+  // not listening for removeListener, no need to emit
+  if (!this._events.removeListener) {
+    if (arguments.length === 0)
+      this._events = {};
+    else if (this._events[type])
+      delete this._events[type];
+    return this;
+  }
+
+  // emit removeListener for all listeners on all events
+  if (arguments.length === 0) {
+    for (key in this._events) {
+      if (key === 'removeListener') continue;
+      this.removeAllListeners(key);
+    }
+    this.removeAllListeners('removeListener');
+    this._events = {};
+    return this;
+  }
+
+  listeners = this._events[type];
+
+  if (isFunction(listeners)) {
+    this.removeListener(type, listeners);
+  } else if (listeners) {
+    // LIFO order
+    while (listeners.length)
+      this.removeListener(type, listeners[listeners.length - 1]);
+  }
+  delete this._events[type];
+
+  return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+  var ret;
+  if (!this._events || !this._events[type])
+    ret = [];
+  else if (isFunction(this._events[type]))
+    ret = [this._events[type]];
+  else
+    ret = this._events[type].slice();
+  return ret;
+};
+
+EventEmitter.prototype.listenerCount = function(type) {
+  if (this._events) {
+    var evlistener = this._events[type];
+
+    if (isFunction(evlistener))
+      return 1;
+    else if (evlistener)
+      return evlistener.length;
+  }
+  return 0;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+  return emitter.listenerCount(type);
+};
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+
+},{}],2:[function(require,module,exports){
+'use strict';
+
+var hasOwn = Object.prototype.hasOwnProperty;
+var toStr = Object.prototype.toString;
+var defineProperty = Object.defineProperty;
+var gOPD = Object.getOwnPropertyDescriptor;
+
+var isArray = function isArray(arr) {
+	if (typeof Array.isArray === 'function') {
+		return Array.isArray(arr);
+	}
+
+	return toStr.call(arr) === '[object Array]';
+};
+
+var isPlainObject = function isPlainObject(obj) {
+	if (!obj || toStr.call(obj) !== '[object Object]') {
+		return false;
+	}
+
+	var hasOwnConstructor = hasOwn.call(obj, 'constructor');
+	var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
+	// Not own constructor property must be Object
+	if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
+		return false;
+	}
+
+	// Own properties are enumerated firstly, so to speed up,
+	// if last one is own, then all properties are own.
+	var key;
+	for (key in obj) { /**/ }
+
+	return typeof key === 'undefined' || hasOwn.call(obj, key);
+};
+
+// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
+var setProperty = function setProperty(target, options) {
+	if (defineProperty && options.name === '__proto__') {
+		defineProperty(target, options.name, {
+			enumerable: true,
+			configurable: true,
+			value: options.newValue,
+			writable: true
+		});
+	} else {
+		target[options.name] = options.newValue;
+	}
+};
+
+// Return undefined instead of __proto__ if '__proto__' is not an own property
+var getProperty = function getProperty(obj, name) {
+	if (name === '__proto__') {
+		if (!hasOwn.call(obj, name)) {
+			return void 0;
+		} else if (gOPD) {
+			// In early versions of node, obj['__proto__'] is buggy when obj has
+			// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
+			return gOPD(obj, name).value;
+		}
+	}
+
+	return obj[name];
+};
+
+module.exports = function extend() {
+	var options, name, src, copy, copyIsArray, clone;
+	var target = arguments[0];
+	var i = 1;
+	var length = arguments.length;
+	var deep = false;
+
+	// Handle a deep copy situation
+	if (typeof target === 'boolean') {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+	if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {
+		target = {};
+	}
+
+	for (; i < length; ++i) {
+		options = arguments[i];
+		// Only deal with non-null/undefined values
+		if (options != null) {
+			// Extend the base object
+			for (name in options) {
+				src = getProperty(target, name);
+				copy = getProperty(options, name);
+
+				// Prevent never-ending loop
+				if (target !== copy) {
+					// Recurse if we're merging plain objects or arrays
+					if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
+						if (copyIsArray) {
+							copyIsArray = false;
+							clone = src && isArray(src) ? src : [];
+						} else {
+							clone = src && isPlainObject(src) ? src : {};
+						}
+
+						// Never move original objects, clone them
+						setProperty(target, { name: name, newValue: extend(deep, clone, copy) });
+
+					// Don't bring in undefined values
+					} else if (typeof copy !== 'undefined') {
+						setProperty(target, { name: name, newValue: copy });
+					}
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+},{}],3:[function(require,module,exports){
+(function (global){
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+
+;(function() {
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+  newline: /^\n+/,
+  code: /^( {4}[^\n]+\n*)+/,
+  fences: noop,
+  hr: /^( *[-*_]){3,} *(?:\n+|$)/,
+  heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
+  nptable: noop,
+  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+  blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
+  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+  html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
+  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
+  table: noop,
+  paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
+  text: /^[^\n]+/
+};
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = replace(block.item, 'gm')
+  (/bull/g, block.bullet)
+  ();
+
+block.list = replace(block.list)
+  (/bull/g, block.bullet)
+  ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
+  ('def', '\\n+(?=' + block.def.source + ')')
+  ();
+
+block._tag = '(?!(?:'
+  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
+  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
+  + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
+
+block.html = replace(block.html)
+  ('comment', /<!--[\s\S]*?-->/)
+  ('closed', /<(tag)[\s\S]+?<\/\1>/)
+  ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
+  (/tag/g, block._tag)
+  ();
+
+block.paragraph = replace(block.paragraph)
+  ('hr', block.hr)
+  ('heading', block.heading)
+  ('lheading', block.lheading)
+  ('blockquote', block.blockquote)
+  ('tag', '<' + block._tag)
+  ('def', block.def)
+  ();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+  fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
+  paragraph: /^/,
+  heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = replace(block.paragraph)
+  ('(?!', '(?!'
+    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+    + block.list.source.replace('\\1', '\\3') + '|')
+  ();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+  nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
+  table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+  this.tokens = [];
+  this.tokens.links = {};
+  this.options = options || marked.defaults;
+  this.rules = block.normal;
+
+  if (this.options.gfm) {
+    if (this.options.tables) {
+      this.rules = block.tables;
+    } else {
+      this.rules = block.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+  var lexer = new Lexer(options);
+  return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+  src = src
+    .replace(/\r\n|\r/g, '\n')
+    .replace(/\t/g, '    ')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\u2424/g, '\n');
+
+  return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top, bq) {
+  var src = src.replace(/^ +$/gm, '')
+    , next
+    , loose
+    , cap
+    , bull
+    , b
+    , item
+    , space
+    , i
+    , l;
+
+  while (src) {
+    // newline
+    if (cap = this.rules.newline.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[0].length > 1) {
+        this.tokens.push({
+          type: 'space'
+        });
+      }
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      cap = cap[0].replace(/^ {4}/gm, '');
+      this.tokens.push({
+        type: 'code',
+        text: !this.options.pedantic
+          ? cap.replace(/\n+$/, '')
+          : cap
+      });
+      continue;
+    }
+
+    // fences (gfm)
+    if (cap = this.rules.fences.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'code',
+        lang: cap[2],
+        text: cap[3] || ''
+      });
+      continue;
+    }
+
+    // heading
+    if (cap = this.rules.heading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[1].length,
+        text: cap[2]
+      });
+      continue;
+    }
+
+    // table no leading pipe (gfm)
+    if (top && (cap = this.rules.nptable.exec(src))) {
+      src = src.substring(cap[0].length);
+
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/\n$/, '').split('\n')
+      };
+
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
+
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i].split(/ *\| */);
+      }
+
+      this.tokens.push(item);
+
+      continue;
+    }
+
+    // lheading
+    if (cap = this.rules.lheading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[2] === '=' ? 1 : 2,
+        text: cap[1]
+      });
+      continue;
+    }
+
+    // hr
+    if (cap = this.rules.hr.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'hr'
+      });
+      continue;
+    }
+
+    // blockquote
+    if (cap = this.rules.blockquote.exec(src)) {
+      src = src.substring(cap[0].length);
+
+      this.tokens.push({
+        type: 'blockquote_start'
+      });
+
+      cap = cap[0].replace(/^ *> ?/gm, '');
+
+      // Pass `top` to keep the current
+      // "toplevel" state. This is exactly
+      // how markdown.pl works.
+      this.token(cap, top, true);
+
+      this.tokens.push({
+        type: 'blockquote_end'
+      });
+
+      continue;
+    }
+
+    // list
+    if (cap = this.rules.list.exec(src)) {
+      src = src.substring(cap[0].length);
+      bull = cap[2];
+
+      this.tokens.push({
+        type: 'list_start',
+        ordered: bull.length > 1
+      });
+
+      // Get each top-level item.
+      cap = cap[0].match(this.rules.item);
+
+      next = false;
+      l = cap.length;
+      i = 0;
+
+      for (; i < l; i++) {
+        item = cap[i];
+
+        // Remove the list item's bullet
+        // so it is seen as the next token.
+        space = item.length;
+        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+        // Outdent whatever the
+        // list item contains. Hacky.
+        if (~item.indexOf('\n ')) {
+          space -= item.length;
+          item = !this.options.pedantic
+            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+            : item.replace(/^ {1,4}/gm, '');
+        }
+
+        // Determine whether the next list item belongs here.
+        // Backpedal if it does not belong in this list.
+        if (this.options.smartLists && i !== l - 1) {
+          b = block.bullet.exec(cap[i + 1])[0];
+          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+            src = cap.slice(i + 1).join('\n') + src;
+            i = l - 1;
+          }
+        }
+
+        // Determine whether item is loose or not.
+        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+        // for discount behavior.
+        loose = next || /\n\n(?!\s*$)/.test(item);
+        if (i !== l - 1) {
+          next = item.charAt(item.length - 1) === '\n';
+          if (!loose) loose = next;
+        }
+
+        this.tokens.push({
+          type: loose
+            ? 'loose_item_start'
+            : 'list_item_start'
+        });
+
+        // Recurse.
+        this.token(item, false, bq);
+
+        this.tokens.push({
+          type: 'list_item_end'
+        });
+      }
+
+      this.tokens.push({
+        type: 'list_end'
+      });
+
+      continue;
+    }
+
+    // html
+    if (cap = this.rules.html.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: this.options.sanitize
+          ? 'paragraph'
+          : 'html',
+        pre: !this.options.sanitizer
+          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+        text: cap[0]
+      });
+      continue;
+    }
+
+    // def
+    if ((!bq && top) && (cap = this.rules.def.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.links[cap[1].toLowerCase()] = {
+        href: cap[2],
+        title: cap[3]
+      };
+      continue;
+    }
+
+    // table (gfm)
+    if (top && (cap = this.rules.table.exec(src))) {
+      src = src.substring(cap[0].length);
+
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
+      };
+
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
+
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i]
+          .replace(/^ *\| *| *\| *$/g, '')
+          .split(/ *\| */);
+      }
+
+      this.tokens.push(item);
+
+      continue;
+    }
+
+    // top-level paragraph
+    if (top && (cap = this.rules.paragraph.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'paragraph',
+        text: cap[1].charAt(cap[1].length - 1) === '\n'
+          ? cap[1].slice(0, -1)
+          : cap[1]
+      });
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      // Top-level should never reach here.
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'text',
+        text: cap[0]
+      });
+      continue;
+    }
+
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+  escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
+  autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
+  url: noop,
+  tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
+  link: /^!?\[(inside)\]\(href\)/,
+  reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
+  nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
+  strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
+  em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
+  code: /^(`+)([\s\S]*?[^`])\1(?!`)/,
+  br: /^ {2,}\n(?!\s*$)/,
+  del: noop,
+  text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
+};
+
+inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
+inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
+
+inline.link = replace(inline.link)
+  ('inside', inline._inside)
+  ('href', inline._href)
+  ();
+
+inline.reflink = replace(inline.reflink)
+  ('inside', inline._inside)
+  ();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+  escape: replace(inline.escape)('])', '~|])')(),
+  url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
+  del: /^~~(?=\S)([\s\S]*?\S)~~/,
+  text: replace(inline.text)
+    (']|', '~]|')
+    ('|', '|https?://|')
+    ()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+  br: replace(inline.br)('{2,}', '*')(),
+  text: replace(inline.gfm.text)('{2,}', '*')()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+  this.options = options || marked.defaults;
+  this.links = links;
+  this.rules = inline.normal;
+  this.renderer = this.options.renderer || new Renderer;
+  this.renderer.options = this.options;
+
+  if (!this.links) {
+    throw new
+      Error('Tokens array requires a `links` property.');
+  }
+
+  if (this.options.gfm) {
+    if (this.options.breaks) {
+      this.rules = inline.breaks;
+    } else {
+      this.rules = inline.gfm;
+    }
+  } else if (this.options.pedantic) {
+    this.rules = inline.pedantic;
+  }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+  var inline = new InlineLexer(links, options);
+  return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+  var out = ''
+    , link
+    , text
+    , href
+    , cap;
+
+  while (src) {
+    // escape
+    if (cap = this.rules.escape.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += cap[1];
+      continue;
+    }
+
+    // autolink
+    if (cap = this.rules.autolink.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(
+          cap[1].charAt(6) === ':'
+          ? this.mangle(cap[1].substring(7))
+          : this.mangle(cap[1])
+        );
+        href = this.mangle('mailto:') + text;
+      } else {
+        text = escape(cap[1]);
+        href = text;
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // url (gfm)
+    if (!this.inLink && (cap = this.rules.url.exec(src))) {
+      src = src.substring(cap[0].length);
+      text = escape(cap[1]);
+      href = text;
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // tag
+    if (cap = this.rules.tag.exec(src)) {
+      if (!this.inLink && /^<a /i.test(cap[0])) {
+        this.inLink = true;
+      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+        this.inLink = false;
+      }
+      src = src.substring(cap[0].length);
+      out += this.options.sanitize
+        ? this.options.sanitizer
+          ? this.options.sanitizer(cap[0])
+          : escape(cap[0])
+        : cap[0]
+      continue;
+    }
+
+    // link
+    if (cap = this.rules.link.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.inLink = true;
+      out += this.outputLink(cap, {
+        href: cap[2],
+        title: cap[3]
+      });
+      this.inLink = false;
+      continue;
+    }
+
+    // reflink, nolink
+    if ((cap = this.rules.reflink.exec(src))
+        || (cap = this.rules.nolink.exec(src))) {
+      src = src.substring(cap[0].length);
+      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+      link = this.links[link.toLowerCase()];
+      if (!link || !link.href) {
+        out += cap[0].charAt(0);
+        src = cap[0].substring(1) + src;
+        continue;
+      }
+      this.inLink = true;
+      out += this.outputLink(cap, link);
+      this.inLink = false;
+      continue;
+    }
+
+    // strong
+    if (cap = this.rules.strong.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.strong(this.output(cap[2] || cap[1]));
+      continue;
+    }
+
+    // em
+    if (cap = this.rules.em.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.em(this.output(cap[2] || cap[1]));
+      continue;
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.codespan(escape(cap[2].trim(), true));
+      continue;
+    }
+
+    // br
+    if (cap = this.rules.br.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.br();
+      continue;
+    }
+
+    // del (gfm)
+    if (cap = this.rules.del.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.del(this.output(cap[1]));
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.text(escape(this.smartypants(cap[0])));
+      continue;
+    }
+
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return out;
+};
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+  var href = escape(link.href)
+    , title = link.title ? escape(link.title) : null;
+
+  return cap[0].charAt(0) !== '!'
+    ? this.renderer.link(href, title, this.output(cap[1]))
+    : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+  if (!this.options.smartypants) return text;
+  return text
+    // em-dashes
+    .replace(/---/g, '\u2014')
+    // en-dashes
+    .replace(/--/g, '\u2013')
+    // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+    // closing singles & apostrophes
+    .replace(/'/g, '\u2019')
+    // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+    // closing doubles
+    .replace(/"/g, '\u201d')
+    // ellipses
+    .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+  if (!this.options.mangle) return text;
+  var out = ''
+    , l = text.length
+    , i = 0
+    , ch;
+
+  for (; i < l; i++) {
+    ch = text.charCodeAt(i);
+    if (Math.random() > 0.5) {
+      ch = 'x' + ch.toString(16);
+    }
+    out += '&#' + ch + ';';
+  }
+
+  return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+  this.options = options || {};
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+  if (this.options.highlight) {
+    var out = this.options.highlight(code, lang);
+    if (out != null && out !== code) {
+      escaped = true;
+      code = out;
+    }
+  }
+
+  if (!lang) {
+    return '<pre><code>'
+      + (escaped ? code : escape(code, true))
+      + '\n</code></pre>';
+  }
+
+  return '<pre><code class="'
+    + this.options.langPrefix
+    + escape(lang, true)
+    + '">'
+    + (escaped ? code : escape(code, true))
+    + '\n</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+  return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+  return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+  return '<h'
+    + level
+    + ' id="'
+    + this.options.headerPrefix
+    + raw.toLowerCase().replace(/[^\w]+/g, '-')
+    + '">'
+    + text
+    + '</h'
+    + level
+    + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered) {
+  var type = ordered ? 'ol' : 'ul';
+  return '<' + type + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+  return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.paragraph = function(text) {
+  return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+  return '<table>\n'
+    + '<thead>\n'
+    + header
+    + '</thead>\n'
+    + '<tbody>\n'
+    + body
+    + '</tbody>\n'
+    + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+  return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+  var type = flags.header ? 'th' : 'td';
+  var tag = flags.align
+    ? '<' + type + ' style="text-align:' + flags.align + '">'
+    : '<' + type + '>';
+  return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+  return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+  return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+  return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+  return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+  return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+  if (this.options.sanitize) {
+    try {
+      var prot = decodeURIComponent(unescape(href))
+        .replace(/[^\w:]/g, '')
+        .toLowerCase();
+    } catch (e) {
+      return '';
+    }
+    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+      return '';
+    }
+  }
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<a href="' + href + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += '>' + text + '</a>';
+  return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<img src="' + href + '" alt="' + text + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += this.options.xhtml ? '/>' : '>';
+  return out;
+};
+
+Renderer.prototype.text = function(text) {
+  return text;
+};
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+  this.tokens = [];
+  this.token = null;
+  this.options = options || marked.defaults;
+  this.options.renderer = this.options.renderer || new Renderer;
+  this.renderer = this.options.renderer;
+  this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options, renderer) {
+  var parser = new Parser(options, renderer);
+  return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+  this.inline = new InlineLexer(src.links, this.options, this.renderer);
+  this.tokens = src.reverse();
+
+  var out = '';
+  while (this.next()) {
+    out += this.tok();
+  }
+
+  return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+  return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+  return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+  var body = this.token.text;
+
+  while (this.peek().type === 'text') {
+    body += '\n' + this.next().text;
+  }
+
+  return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+  switch (this.token.type) {
+    case 'space': {
+      return '';
+    }
+    case 'hr': {
+      return this.renderer.hr();
+    }
+    case 'heading': {
+      return this.renderer.heading(
+        this.inline.output(this.token.text),
+        this.token.depth,
+        this.token.text);
+    }
+    case 'code': {
+      return this.renderer.code(this.token.text,
+        this.token.lang,
+        this.token.escaped);
+    }
+    case 'table': {
+      var header = ''
+        , body = ''
+        , i
+        , row
+        , cell
+        , flags
+        , j;
+
+      // header
+      cell = '';
+      for (i = 0; i < this.token.header.length; i++) {
+        flags = { header: true, align: this.token.align[i] };
+        cell += this.renderer.tablecell(
+          this.inline.output(this.token.header[i]),
+          { header: true, align: this.token.align[i] }
+        );
+      }
+      header += this.renderer.tablerow(cell);
+
+      for (i = 0; i < this.token.cells.length; i++) {
+        row = this.token.cells[i];
+
+        cell = '';
+        for (j = 0; j < row.length; j++) {
+          cell += this.renderer.tablecell(
+            this.inline.output(row[j]),
+            { header: false, align: this.token.align[j] }
+          );
+        }
+
+        body += this.renderer.tablerow(cell);
+      }
+      return this.renderer.table(header, body);
+    }
+    case 'blockquote_start': {
+      var body = '';
+
+      while (this.next().type !== 'blockquote_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.blockquote(body);
+    }
+    case 'list_start': {
+      var body = ''
+        , ordered = this.token.ordered;
+
+      while (this.next().type !== 'list_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.list(body, ordered);
+    }
+    case 'list_item_start': {
+      var body = '';
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.token.type === 'text'
+          ? this.parseText()
+          : this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'loose_item_start': {
+      var body = '';
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'html': {
+      var html = !this.token.pre && !this.options.pedantic
+        ? this.inline.output(this.token.text)
+        : this.token.text;
+      return this.renderer.html(html);
+    }
+    case 'paragraph': {
+      return this.renderer.paragraph(this.inline.output(this.token.text));
+    }
+    case 'text': {
+      return this.renderer.paragraph(this.parseText());
+    }
+  }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+  return html
+    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/"/g, '&quot;')
+    .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+	// explicitly match decimal, hex, and named HTML entities
+  return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+    n = n.toLowerCase();
+    if (n === 'colon') return ':';
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1));
+    }
+    return '';
+  });
+}
+
+function replace(regex, opt) {
+  regex = regex.source;
+  opt = opt || '';
+  return function self(name, val) {
+    if (!name) return new RegExp(regex, opt);
+    val = val.source || val;
+    val = val.replace(/(^|[^\[])\^/g, '$1');
+    regex = regex.replace(name, val);
+    return self;
+  };
+}
+
+function resolveUrl(base, href) {
+  if (!baseUrls[' ' + base]) {
+    // we can ignore everything in base after the last slash of its path component,
+    // but we might need to add _that_
+    // https://tools.ietf.org/html/rfc3986#section-3
+    if (/^[^:]+:\/*[^/]*$/.test(base)) {
+      baseUrls[' ' + base] = base + '/';
+    } else {
+      baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
+    }
+  }
+  base = baseUrls[' ' + base];
+
+  if (href.slice(0, 2) === '//') {
+    return base.replace(/:[^]*/, ':') + href;
+  } else if (href.charAt(0) === '/') {
+    return base.replace(/(:\/*[^/]*)[^]*/, '$1') + href;
+  } else {
+    return base + href;
+  }
+}
+baseUrls = {};
+originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+  var i = 1
+    , target
+    , key;
+
+  for (; i < arguments.length; i++) {
+    target = arguments[i];
+    for (key in target) {
+      if (Object.prototype.hasOwnProperty.call(target, key)) {
+        obj[key] = target[key];
+      }
+    }
+  }
+
+  return obj;
+}
+
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+  if (callback || typeof opt === 'function') {
+    if (!callback) {
+      callback = opt;
+      opt = null;
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+
+    var highlight = opt.highlight
+      , tokens
+      , pending
+      , i = 0;
+
+    try {
+      tokens = Lexer.lex(src, opt)
+    } catch (e) {
+      return callback(e);
+    }
+
+    pending = tokens.length;
+
+    var done = function(err) {
+      if (err) {
+        opt.highlight = highlight;
+        return callback(err);
+      }
+
+      var out;
+
+      try {
+        out = Parser.parse(tokens, opt);
+      } catch (e) {
+        err = e;
+      }
+
+      opt.highlight = highlight;
+
+      return err
+        ? callback(err)
+        : callback(null, out);
+    };
+
+    if (!highlight || highlight.length < 3) {
+      return done();
+    }
+
+    delete opt.highlight;
+
+    if (!pending) return done();
+
+    for (; i < tokens.length; i++) {
+      (function(token) {
+        if (token.type !== 'code') {
+          return --pending || done();
+        }
+        return highlight(token.text, token.lang, function(err, code) {
+          if (err) return done(err);
+          if (code == null || code === token.text) {
+            return --pending || done();
+          }
+          token.text = code;
+          token.escaped = true;
+          --pending || done();
+        });
+      })(tokens[i]);
+    }
+
+    return;
+  }
+  try {
+    if (opt) opt = merge({}, marked.defaults, opt);
+    return Parser.parse(Lexer.lex(src, opt), opt);
+  } catch (e) {
+    e.message += '\nPlease report this to https://github.com/chjj/marked.';
+    if ((opt || marked.defaults).silent) {
+      return '<p>An error occured:</p><pre>'
+        + escape(e.message + '', true)
+        + '</pre>';
+    }
+    throw e;
+  }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+  merge(marked.defaults, opt);
+  return marked;
+};
+
+marked.defaults = {
+  gfm: true,
+  tables: true,
+  breaks: false,
+  pedantic: false,
+  sanitize: false,
+  sanitizer: null,
+  mangle: true,
+  smartLists: false,
+  silent: false,
+  highlight: null,
+  langPrefix: 'lang-',
+  smartypants: false,
+  headerPrefix: '',
+  renderer: new Renderer,
+  xhtml: false,
+  baseUrl: null
+};
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+  module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+  define(function() { return marked; });
+} else {
+  this.marked = marked;
+}
+
+}).call(function() {
+  return this || (typeof window !== 'undefined' ? window : global);
+}());
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],4:[function(require,module,exports){
+exports.apply = function () {
+  forEach([Array, window.NodeList, window.HTMLCollection], extend);
+};
+
+function forEach (list, f) {
+  var i;
+
+  for (i = 0; i < list.length; ++i) {
+    f(list[i], i);
+  }
+}
+
+function extend (object) {
+  var prototype = object && object.prototype;
+
+  if (!prototype) {
+    return;
+  }
+
+  prototype.forEach = prototype.forEach || function (f) {
+    forEach(this, f);
+  };
+
+  prototype.filter = prototype.filter || function (f) {
+    var result = [];
+
+    this.forEach(function (element) {
+      if (f(element, result.length)) {
+        result.push(element);
+      }
+    });
+
+    return result;
+  };
+
+  prototype.map = prototype.map || function (f) {
+    var result = [];
+
+    this.forEach(function (element) {
+      result.push(f(element, result.length));
+    });
+
+    return result;
+  };
+}
+},{}],5:[function(require,module,exports){
+var Api = require('./remark/api')
+  , polyfills = require('./polyfills')
+  , styler = require('./remark/components/styler/styler')
+  ;
+
+// Expose API as `remark`
+window.remark = new Api();
+
+// Apply polyfills as needed
+polyfills.apply();
+
+// Apply embedded styles to document
+styler.styleDocument();
+
+},{"./polyfills":4,"./remark/api":6,"./remark/components/styler/styler":"components/styler"}],6:[function(require,module,exports){
+var EventEmitter = require('events').EventEmitter
+  , highlighter = require('./highlighter')
+  , converter = require('./converter')
+  , resources = require('./resources')
+  , Parser = require('./parser')
+  , Slideshow = require('./models/slideshow')
+  , SlideshowView = require('./views/slideshowView')
+  , DefaultController = require('./controllers/defaultController')
+  , Dom = require('./dom')
+  , macros = require('./macros')
+  ;
+
+module.exports = Api;
+
+function Api (dom) {
+  this.dom = dom || new Dom();
+  this.macros = macros;
+  this.version = resources.version;
+}
+
+// Expose highlighter to allow enumerating available styles and
+// including external language grammars
+Api.prototype.highlighter = highlighter;
+
+Api.prototype.convert = function (markdown) {
+  var parser = new Parser()
+    , content = parser.parse(markdown || '', macros)[0].content
+    ;
+
+  return converter.convertMarkdown(content, {}, true);
+};
+
+// Creates slideshow initialized from options
+Api.prototype.create = function (options, callback) {
+  var self = this
+    , events
+    , slideshow
+    , slideshowView
+    , controller
+    ;
+
+  options = applyDefaults(this.dom, options);
+
+  events = new EventEmitter();
+  events.setMaxListeners(0);
+
+  slideshow = new Slideshow(events, this.dom, options, function (slideshow) {
+    slideshowView = new SlideshowView(events, self.dom, options, slideshow);
+    controller = options.controller || new DefaultController(events, self.dom, slideshowView, options.navigation);
+    if (typeof callback === 'function') {
+      callback(slideshow);
+    }
+  });
+
+  return slideshow;
+};
+
+function applyDefaults (dom, options) {
+  var sourceElement;
+
+  options = options || {};
+
+  if (!options.hasOwnProperty('source')) {
+    sourceElement = dom.getElementById('source');
+    if (sourceElement) {
+      options.source = unescape(sourceElement.innerHTML);
+      sourceElement.style.display = 'none';
+    }
+  }
+
+  if (!(options.container instanceof window.HTMLElement)) {
+    options.container = dom.getBodyElement();
+  }
+
+  return options;
+}
+
+function unescape (source) {
+  source = source.replace(/&[l|g]t;/g,
+    function (match) {
+      return match === '&lt;' ? '<' : '>';
+    });
+
+  source = source.replace(/&amp;/g, '&');
+  source = source.replace(/&quot;/g, '"');
+
+  return source;
+}
+},{"./controllers/defaultController":7,"./converter":13,"./dom":14,"./highlighter":15,"./macros":17,"./models/slideshow":19,"./parser":22,"./resources":23,"./views/slideshowView":28,"events":1}],7:[function(require,module,exports){
+// Allow override of global `location`
+/* global location:true */
+
+module.exports = Controller;
+
+var Keyboard = require('./inputs/keyboard')
+  , mouse = require('./inputs/mouse')
+  , touch = require('./inputs/touch')
+  , message = require('./inputs/message')
+  , location = require('./inputs/location')
+  ;
+
+function Controller (events, dom, slideshowView, options) {
+  options = options || {};
+
+  var keyboard = new Keyboard(events);
+
+  message.register(events);
+  location.register(events, dom, slideshowView);
+  mouse.register(events, options);
+  touch.register(events, options);
+
+  addApiEventListeners(events, keyboard, slideshowView, options);
+}
+
+function addApiEventListeners (events, keyboard, slideshowView, options) {
+  events.on('pause', function(event) {
+    keyboard.deactivate();
+    mouse.unregister(events);
+    touch.unregister(events);
+  });
+
+  events.on('resume',  function(event) {
+    keyboard.activate();
+    mouse.register(events, options);
+    touch.register(events, options);
+  });
+}
+},{"./inputs/keyboard":8,"./inputs/location":9,"./inputs/message":10,"./inputs/mouse":11,"./inputs/touch":12}],8:[function(require,module,exports){
+module.exports = Keyboard;
+
+function Keyboard(events) {
+  this._events = events;
+
+  this.activate();
+}
+
+Keyboard.prototype.activate = function () {
+  this._gotoSlideNumber = '';
+
+  this.addKeyboardEventListeners();
+};
+
+Keyboard.prototype.deactivate = function () {
+  this.removeKeyboardEventListeners();
+};
+
+Keyboard.prototype.addKeyboardEventListeners = function () {
+  var self = this;
+  var events = this._events;
+
+  events.on('keydown', function (event) {
+    if (event.metaKey || event.ctrlKey || event.altKey) {
+      // Bail out if alt, meta or ctrl key was pressed
+      return;
+    }
+
+    switch (event.keyCode) {
+      case 33: // Page up
+      case 37: // Left
+      case 38: // Up
+        events.emit('gotoPreviousSlide');
+        break;
+      case 32: // Space
+        if(event.shiftKey){ // Shift+Space
+          events.emit('gotoPreviousSlide');
+        }else{
+          events.emit('gotoNextSlide');
+        }
+        break;
+      case 34: // Page down
+      case 39: // Right
+      case 40: // Down
+        events.emit('gotoNextSlide');
+        break;
+      case 36: // Home
+        events.emit('gotoFirstSlide');
+        break;
+      case 35: // End
+        events.emit('gotoLastSlide');
+        break;
+      case 27: // Escape
+        events.emit('hideOverlay');
+        break;
+      case 13: // Return
+        if (self._gotoSlideNumber) {
+          events.emit('gotoSlideNumber', self._gotoSlideNumber);
+          self._gotoSlideNumber = '';
+        }
+        break;
+    }
+  });
+
+  events.on('keypress', function (event) {
+    if (event.metaKey || event.ctrlKey) {
+      // Bail out if meta or ctrl key was pressed
+      return;
+    }
+
+    var key = String.fromCharCode(event.which).toLowerCase();
+    var tryToPreventDefault = true;
+
+    switch (key) {
+      case 'j':
+        events.emit('gotoNextSlide');
+        break;
+      case 'k':
+        events.emit('gotoPreviousSlide');
+        break;
+      case 'b':
+        events.emit('toggleBlackout');
+        break;
+      case 'm':
+        events.emit('toggleMirrored');
+        break;
+      case 'c':
+        events.emit('createClone');
+        break;
+      case 'p':
+        events.emit('togglePresenterMode');
+        break;
+      case 'f':
+        events.emit('toggleFullscreen');
+        break;
+      case 's':
+        events.emit('toggleTimer');
+        break;
+      case 't':
+        events.emit('resetTimer');
+        break;
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+      case '8':
+      case '9':
+      case '0':
+        self._gotoSlideNumber += key;
+        break;
+      case 'h':
+      case '?':
+        events.emit('toggleHelp');
+        break;
+      default:
+        tryToPreventDefault = false;
+    }
+
+    if (tryToPreventDefault && event && event.preventDefault)
+      event.preventDefault();
+
+  });
+};
+
+Keyboard.prototype.removeKeyboardEventListeners = function () {
+  var events = this._events;
+
+  events.removeAllListeners("keydown");
+  events.removeAllListeners("keypress");
+};
+
+},{}],9:[function(require,module,exports){
+var utils = require('../../utils.js');
+
+exports.register = function (events, dom, slideshowView) {
+  addLocationEventListeners(events, dom, slideshowView);
+};
+
+function addLocationEventListeners (events, dom, slideshowView) {
+  // If slideshow is embedded into custom DOM element, we don't
+  // hook up to location hash changes, so just go to first slide.
+  if (slideshowView.isEmbedded()) {
+    events.emit('gotoSlide', 1);
+  }
+  // When slideshow is not embedded into custom DOM element, but
+  // rather hosted directly inside document.body, we hook up to
+  // location hash changes, and trigger initial navigation.
+  else {
+    events.on('hashchange', navigateByHash);
+    events.on('slideChanged', updateHash);
+    events.on('toggledPresenter', updateHash);
+
+    navigateByHash();
+  }
+
+  function navigateByHash () {
+    var slideNoOrName = (dom.getLocationHash() || '').substr(1);
+    events.emit('gotoSlide', slideNoOrName);
+  }
+
+  function updateHash (slideNoOrName) {
+    if(utils.hasClass(slideshowView.containerElement, 'remark-presenter-mode')){
+      dom.setLocationHash('#p' + slideNoOrName);
+    }
+    else{
+      dom.setLocationHash('#' + slideNoOrName);
+    }
+  }
+}
+
+},{"../../utils.js":25}],10:[function(require,module,exports){
+exports.register = function (events) {
+  addMessageEventListeners(events);
+};
+
+function addMessageEventListeners (events) {
+  events.on('message', navigateByMessage);
+
+  function navigateByMessage(message) {
+    var cap;
+
+    if ((cap = /^gotoSlide:(\d+)$/.exec(message.data)) !== null) {
+      events.emit('gotoSlide', parseInt(cap[1], 10), true);
+    }
+    else if (message.data === 'toggleBlackout') {
+      events.emit('toggleBlackout', {propagate: false});
+    }
+  }
+}
+
+},{}],11:[function(require,module,exports){
+exports.register = function (events, options) {
+  addMouseEventListeners(events, options);
+};
+
+exports.unregister = function (events) {
+  removeMouseEventListeners(events);
+};
+
+function addMouseEventListeners (events, options) {
+  if (options.click) {
+    events.on('click', function (event) {
+      if (event.target.nodeName === 'A') {
+        // Don't interfere when clicking link
+        return;
+      }
+      else if (event.button === 0) {
+        events.emit('gotoNextSlide');
+      }
+    });
+    events.on('contextmenu', function (event) {
+      if (event.target.nodeName === 'A') {
+        // Don't interfere when right-clicking link
+        return;
+      }
+      event.preventDefault();
+      events.emit('gotoPreviousSlide');
+    });
+  }
+
+  if (options.scroll !== false) {
+    var scrollHandler = function (event) {
+      if (event.wheelDeltaY > 0 || event.detail < 0) {
+        events.emit('gotoPreviousSlide');
+      }
+      else if (event.wheelDeltaY < 0 || event.detail > 0) {
+        events.emit('gotoNextSlide');
+      }
+    };
+
+    // IE9, Chrome, Safari, Opera
+    events.on('mousewheel', scrollHandler);
+    // Firefox
+    events.on('DOMMouseScroll', scrollHandler);
+  }
+}
+
+function removeMouseEventListeners(events) {
+  events.removeAllListeners('click');
+  events.removeAllListeners('contextmenu');
+  events.removeAllListeners('mousewheel');
+}
+
+},{}],12:[function(require,module,exports){
+exports.register = function (events, options) {
+  addTouchEventListeners(events, options);
+};
+
+exports.unregister = function (events) {
+  removeTouchEventListeners(events);
+};
+
+function addTouchEventListeners (events, options) {
+  var touch
+    , startX
+    , endX
+    ;
+
+  if (options.touch === false) {
+    return;
+  }
+
+  var isTap = function () {
+    return Math.abs(startX - endX) < 10;
+  };
+
+  var handleTap = function () {
+    events.emit('tap', endX);
+  };
+
+  var handleSwipe = function () {
+    if (startX > endX) {
+      events.emit('gotoNextSlide');
+    }
+    else {
+      events.emit('gotoPreviousSlide');
+    }
+  };
+
+  events.on('touchstart', function (event) {
+    touch = event.touches[0];
+    startX = touch.clientX;
+  });
+
+  events.on('touchend', function (event) {
+    if (event.target.nodeName.toUpperCase() === 'A') {
+      return;
+    }
+
+    touch = event.changedTouches[0];
+    endX = touch.clientX;
+
+    if (isTap()) {
+      handleTap();
+    }
+    else {
+      handleSwipe();
+    }
+  });
+
+  events.on('touchmove', function (event) {
+    event.preventDefault();
+  });
+}
+
+function removeTouchEventListeners(events) {
+  events.removeAllListeners("touchstart");
+  events.removeAllListeners("touchend");
+  events.removeAllListeners("touchmove");
+}
+
+},{}],13:[function(require,module,exports){
+var marked = require('marked')
+  , converter = module.exports = {}
+  , element = document.createElement('div')
+  ;
+
+marked.setOptions({
+  gfm: true,
+  tables: true,
+  breaks: false,
+
+  // Without this set to true, converting something like
+  // <p>*</p><p>*</p> will become <p><em></p><p></em></p>
+  pedantic: true,
+
+  sanitize: false,
+  smartLists: true,
+  langPrefix: ''
+});
+
+converter.convertMarkdown = function (content, links, inline) {
+  element.innerHTML = convertMarkdown(content, links || {}, inline);
+  element.innerHTML = element.innerHTML.replace(/<p>\s*<\/p>/g, '');
+  return element.innerHTML.replace(/\n\r?$/, '');
+};
+
+function convertMarkdown (content, links, insideContentClass) {
+  var i, tag, markdown = '', html;
+
+  for (i = 0; i < content.length; ++i) {
+    if (typeof content[i] === 'string') {
+      markdown += content[i];
+    }
+    else {
+      tag = content[i].block ? 'div' : 'span';
+      markdown += '<' + tag + ' class="' + content[i].class + '">';
+      markdown += convertMarkdown(content[i].content, links, !content[i].block);
+      markdown += '</' + tag + '>';
+    }
+  }
+
+  var tokens = marked.Lexer.lex(markdown.replace(/^\s+/, ''));
+  tokens.links = links;
+  html = marked.Parser.parse(tokens);
+
+  if (insideContentClass) {
+    element.innerHTML = html;
+    if (element.children.length === 1 && element.children[0].tagName === 'P') {
+      html = element.children[0].innerHTML;
+    }
+  }
+
+  return html;
+}
+
+},{"marked":3}],14:[function(require,module,exports){
+module.exports = Dom;
+
+function Dom () { }
+
+Dom.prototype.XMLHttpRequest = XMLHttpRequest;
+
+Dom.prototype.getHTMLElement = function () {
+  return document.getElementsByTagName('html')[0];
+};
+
+Dom.prototype.getBodyElement = function () {
+  return document.body;
+};
+
+Dom.prototype.getElementById = function (id) {
+  return document.getElementById(id);
+};
+
+Dom.prototype.getLocationHash = function () {
+  return window.location.hash;
+};
+
+Dom.prototype.setLocationHash = function (hash) {
+  if (typeof window.history.replaceState === 'function' && window.origin !== 'null') {
+    window.history.replaceState(undefined, undefined, hash);
+  }
+  else {
+    window.location.hash = hash;
+  }
+};
+
+},{}],15:[function(require,module,exports){
+/* Automatically generated */
+
+var hljs = (function() {
+      var exports = {};
+      /*
+Syntax highlighting with language autodetection.
+https://highlightjs.org/
+*/
+
+(function(factory) {
+
+  // Find the global object for export to both the browser and web workers.
+  var globalObject = typeof window === 'object' && window ||
+                     typeof self === 'object' && self;
+
+  // Setup highlight.js for different environments. First is Node.js or
+  // CommonJS.
+  // `nodeType` is checked to ensure that `exports` is not a HTML element.
+  if(typeof exports !== 'undefined' && !exports.nodeType) {
+    factory(exports);
+  } else if(globalObject) {
+    // Export hljs globally even when using AMD for cases when this script
+    // is loaded with others that may still expect a global hljs.
+    globalObject.hljs = factory({});
+
+    // Finally register the global hljs with AMD.
+    if(typeof define === 'function' && define.amd) {
+      define([], function() {
+        return globalObject.hljs;
+      });
+    }
+  }
+
+}(function(hljs) {
+  // Convenience variables for build-in objects
+  var ArrayProto = [],
+      objectKeys = Object.keys;
+
+  // Global internal variables used within the highlight.js library.
+  var languages = {},
+      aliases   = {};
+
+  // Regular expressions used throughout the highlight.js library.
+  var noHighlightRe    = /^(no-?highlight|plain|text)$/i,
+      languagePrefixRe = /\blang(?:uage)?-([\w-]+)\b/i,
+      fixMarkupRe      = /((^(<[^>]+>|\t|)+|(?:\n)))/gm;
+
+  // The object will be assigned by the build tool. It used to synchronize API 
+  // of external language files with minified version of the highlight.js library.
+  var API_REPLACES;
+
+  var spanEndTag = '</span>';
+
+  // Global options used when within external APIs. This is modified when
+  // calling the `hljs.configure` function.
+  var options = {
+    classPrefix: 'hljs-',
+    tabReplace: null,
+    useBR: false,
+    languages: undefined
+  };
+
+
+  /* Utility functions */
+
+  function escape(value) {
+    return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+  }
+
+  function tag(node) {
+    return node.nodeName.toLowerCase();
+  }
+
+  function testRe(re, lexeme) {
+    var match = re && re.exec(lexeme);
+    return match && match.index === 0;
+  }
+
+  function isNotHighlighted(language) {
+    return noHighlightRe.test(language);
+  }
+
+  function blockLanguage(block) {
+    var i, match, length, _class;
+    var classes = block.className + ' ';
+
+    classes += block.parentNode ? block.parentNode.className : '';
+
+    // language-* takes precedence over non-prefixed class names.
+    match = languagePrefixRe.exec(classes);
+    if (match) {
+      return getLanguage(match[1]) ? match[1] : 'no-highlight';
+    }
+
+    classes = classes.split(/\s+/);
+
+    for (i = 0, length = classes.length; i < length; i++) {
+      _class = classes[i];
+
+      if (isNotHighlighted(_class) || getLanguage(_class)) {
+        return _class;
+      }
+    }
+  }
+
+  function inherit(parent) {  // inherit(parent, override_obj, override_obj, ...)
+    var key;
+    var result = {};
+    var objects = Array.prototype.slice.call(arguments, 1);
+
+    for (key in parent)
+      result[key] = parent[key];
+    objects.forEach(function(obj) {
+      for (key in obj)
+        result[key] = obj[key];
+    });
+    return result;
+  }
+
+  /* Stream merging */
+
+  function nodeStream(node) {
+    var result = [];
+    (function _nodeStream(node, offset) {
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        if (child.nodeType === 3)
+          offset += child.nodeValue.length;
+        else if (child.nodeType === 1) {
+          result.push({
+            event: 'start',
+            offset: offset,
+            node: child
+          });
+          offset = _nodeStream(child, offset);
+          // Prevent void elements from having an end tag that would actually
+          // double them in the output. There are more void elements in HTML
+          // but we list only those realistically expected in code display.
+          if (!tag(child).match(/br|hr|img|input/)) {
+            result.push({
+              event: 'stop',
+              offset: offset,
+              node: child
+            });
+          }
+        }
+      }
+      return offset;
+    })(node, 0);
+    return result;
+  }
+
+  function mergeStreams(original, highlighted, value) {
+    var processed = 0;
+    var result = '';
+    var nodeStack = [];
+
+    function selectStream() {
+      if (!original.length || !highlighted.length) {
+        return original.length ? original : highlighted;
+      }
+      if (original[0].offset !== highlighted[0].offset) {
+        return (original[0].offset < highlighted[0].offset) ? original : highlighted;
+      }
+
+      /*
+      To avoid starting the stream just before it should stop the order is
+      ensured that original always starts first and closes last:
+
+      if (event1 == 'start' && event2 == 'start')
+        return original;
+      if (event1 == 'start' && event2 == 'stop')
+        return highlighted;
+      if (event1 == 'stop' && event2 == 'start')
+        return original;
+      if (event1 == 'stop' && event2 == 'stop')
+        return highlighted;
+
+      ... which is collapsed to:
+      */
+      return highlighted[0].event === 'start' ? original : highlighted;
+    }
+
+    function open(node) {
+      function attr_str(a) {return ' ' + a.nodeName + '="' + escape(a.value).replace('"', '&quot;') + '"';}
+      result += '<' + tag(node) + ArrayProto.map.call(node.attributes, attr_str).join('') + '>';
+    }
+
+    function close(node) {
+      result += '</' + tag(node) + '>';
+    }
+
+    function render(event) {
+      (event.event === 'start' ? open : close)(event.node);
+    }
+
+    while (original.length || highlighted.length) {
+      var stream = selectStream();
+      result += escape(value.substring(processed, stream[0].offset));
+      processed = stream[0].offset;
+      if (stream === original) {
+        /*
+        On any opening or closing tag of the original markup we first close
+        the entire highlighted node stack, then render the original tag along
+        with all the following original tags at the same offset and then
+        reopen all the tags on the highlighted stack.
+        */
+        nodeStack.reverse().forEach(close);
+        do {
+          render(stream.splice(0, 1)[0]);
+          stream = selectStream();
+        } while (stream === original && stream.length && stream[0].offset === processed);
+        nodeStack.reverse().forEach(open);
+      } else {
+        if (stream[0].event === 'start') {
+          nodeStack.push(stream[0].node);
+        } else {
+          nodeStack.pop();
+        }
+        render(stream.splice(0, 1)[0]);
+      }
+    }
+    return result + escape(value.substr(processed));
+  }
+
+  /* Initialization */
+
+  function expand_mode(mode) {
+    if (mode.variants && !mode.cached_variants) {
+      mode.cached_variants = mode.variants.map(function(variant) {
+        return inherit(mode, {variants: null}, variant);
+      });
+    }
+    return mode.cached_variants || (mode.endsWithParent && [inherit(mode)]) || [mode];
+  }
+
+  function restoreLanguageApi(obj) {
+    if(API_REPLACES && !obj.langApiRestored) {
+      obj.langApiRestored = true;
+      for(var key in API_REPLACES)
+        obj[key] && (obj[API_REPLACES[key]] = obj[key]);
+      (obj.contains || []).concat(obj.variants || []).forEach(restoreLanguageApi);
+    }
+  }
+
+  function compileLanguage(language) {
+
+    function reStr(re) {
+        return (re && re.source) || re;
+    }
+
+    function langRe(value, global) {
+      return new RegExp(
+        reStr(value),
+        'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')
+      );
+    }
+
+    // joinRe logically computes regexps.join(separator), but fixes the
+    // backreferences so they continue to match.
+    function joinRe(regexps, separator) {
+      // backreferenceRe matches an open parenthesis or backreference. To avoid
+      // an incorrect parse, it additionally matches the following:
+      // - [...] elements, where the meaning of parentheses and escapes change
+      // - other escape sequences, so we do not misparse escape sequences as
+      //   interesting elements
+      // - non-matching or lookahead parentheses, which do not capture. These
+      //   follow the '(' with a '?'.
+      var backreferenceRe = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
+      var numCaptures = 0;
+      var ret = '';
+      for (var i = 0; i < regexps.length; i++) {
+        var offset = numCaptures;
+        var re = reStr(regexps[i]);
+        if (i > 0) {
+          ret += separator;
+        }
+        while (re.length > 0) {
+          var match = backreferenceRe.exec(re);
+          if (match == null) {
+            ret += re;
+            break;
+          }
+          ret += re.substring(0, match.index);
+          re = re.substring(match.index + match[0].length);
+          if (match[0][0] == '\\' && match[1]) {
+            // Adjust the backreference.
+            ret += '\\' + String(Number(match[1]) + offset);
+          } else {
+            ret += match[0];
+            if (match[0] == '(') {
+              numCaptures++;
+            }
+          }
+        }
+      }
+      return ret;
+    }
+
+    function compileMode(mode, parent) {
+      if (mode.compiled)
+        return;
+      mode.compiled = true;
+
+      mode.keywords = mode.keywords || mode.beginKeywords;
+      if (mode.keywords) {
+        var compiled_keywords = {};
+
+        var flatten = function(className, str) {
+          if (language.case_insensitive) {
+            str = str.toLowerCase();
+          }
+          str.split(' ').forEach(function(kw) {
+            var pair = kw.split('|');
+            compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1];
+          });
+        };
+
+        if (typeof mode.keywords === 'string') { // string
+          flatten('keyword', mode.keywords);
+        } else {
+          objectKeys(mode.keywords).forEach(function (className) {
+            flatten(className, mode.keywords[className]);
+          });
+        }
+        mode.keywords = compiled_keywords;
+      }
+      mode.lexemesRe = langRe(mode.lexemes || /\w+/, true);
+
+      if (parent) {
+        if (mode.beginKeywords) {
+          mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\b';
+        }
+        if (!mode.begin)
+          mode.begin = /\B|\b/;
+        mode.beginRe = langRe(mode.begin);
+        if (mode.endSameAsBegin)
+          mode.end = mode.begin;
+        if (!mode.end && !mode.endsWithParent)
+          mode.end = /\B|\b/;
+        if (mode.end)
+          mode.endRe = langRe(mode.end);
+        mode.terminator_end = reStr(mode.end) || '';
+        if (mode.endsWithParent && parent.terminator_end)
+          mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end;
+      }
+      if (mode.illegal)
+        mode.illegalRe = langRe(mode.illegal);
+      if (mode.relevance == null)
+        mode.relevance = 1;
+      if (!mode.contains) {
+        mode.contains = [];
+      }
+      mode.contains = Array.prototype.concat.apply([], mode.contains.map(function(c) {
+        return expand_mode(c === 'self' ? mode : c);
+      }));
+      mode.contains.forEach(function(c) {compileMode(c, mode);});
+
+      if (mode.starts) {
+        compileMode(mode.starts, parent);
+      }
+
+      var terminators =
+        mode.contains.map(function(c) {
+          return c.beginKeywords ? '\\.?(?:' + c.begin + ')\\.?' : c.begin;
+        })
+        .concat([mode.terminator_end, mode.illegal])
+        .map(reStr)
+        .filter(Boolean);
+      mode.terminators = terminators.length ? langRe(joinRe(terminators, '|'), true) : {exec: function(/*s*/) {return null;}};
+    }
+    
+    compileMode(language);
+  }
+
+  /*
+  Core highlighting function. Accepts a language name, or an alias, and a
+  string with the code to highlight. Returns an object with the following
+  properties:
+
+  - relevance (int)
+  - value (an HTML string with highlighting markup)
+
+  */
+  function highlight(name, value, ignore_illegals, continuation) {
+
+    function escapeRe(value) {
+      return new RegExp(value.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'm');
+    }
+
+    function subMode(lexeme, mode) {
+      var i, length;
+
+      for (i = 0, length = mode.contains.length; i < length; i++) {
+        if (testRe(mode.contains[i].beginRe, lexeme)) {
+          if (mode.contains[i].endSameAsBegin) {
+            mode.contains[i].endRe = escapeRe( mode.contains[i].beginRe.exec(lexeme)[0] );
+          }
+          return mode.contains[i];
+        }
+      }
+    }
+
+    function endOfMode(mode, lexeme) {
+      if (testRe(mode.endRe, lexeme)) {
+        while (mode.endsParent && mode.parent) {
+          mode = mode.parent;
+        }
+        return mode;
+      }
+      if (mode.endsWithParent) {
+        return endOfMode(mode.parent, lexeme);
+      }
+    }
+
+    function isIllegal(lexeme, mode) {
+      return !ignore_illegals && testRe(mode.illegalRe, lexeme);
+    }
+
+    function keywordMatch(mode, match) {
+      var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0];
+      return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str];
+    }
+
+    function buildSpan(classname, insideSpan, leaveOpen, noPrefix) {
+      var classPrefix = noPrefix ? '' : options.classPrefix,
+          openSpan    = '<span class="' + classPrefix,
+          closeSpan   = leaveOpen ? '' : spanEndTag;
+
+      openSpan += classname + '">';
+
+      if (!classname) return insideSpan;
+      return openSpan + insideSpan + closeSpan;
+    }
+
+    function processKeywords() {
+      var keyword_match, last_index, match, result;
+
+      if (!top.keywords)
+        return escape(mode_buffer);
+
+      result = '';
+      last_index = 0;
+      top.lexemesRe.lastIndex = 0;
+      match = top.lexemesRe.exec(mode_buffer);
+
+      while (match) {
+        result += escape(mode_buffer.substring(last_index, match.index));
+        keyword_match = keywordMatch(top, match);
+        if (keyword_match) {
+          relevance += keyword_match[1];
+          result += buildSpan(keyword_match[0], escape(match[0]));
+        } else {
+          result += escape(match[0]);
+        }
+        last_index = top.lexemesRe.lastIndex;
+        match = top.lexemesRe.exec(mode_buffer);
+      }
+      return result + escape(mode_buffer.substr(last_index));
+    }
+
+    function processSubLanguage() {
+      var explicit = typeof top.subLanguage === 'string';
+      if (explicit && !languages[top.subLanguage]) {
+        return escape(mode_buffer);
+      }
+
+      var result = explicit ?
+                   highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) :
+                   highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined);
+
+      // Counting embedded language score towards the host language may be disabled
+      // with zeroing the containing mode relevance. Usecase in point is Markdown that
+      // allows XML everywhere and makes every XML snippet to have a much larger Markdown
+      // score.
+      if (top.relevance > 0) {
+        relevance += result.relevance;
+      }
+      if (explicit) {
+        continuations[top.subLanguage] = result.top;
+      }
+      return buildSpan(result.language, result.value, false, true);
+    }
+
+    function processBuffer() {
+      result += (top.subLanguage != null ? processSubLanguage() : processKeywords());
+      mode_buffer = '';
+    }
+
+    function startNewMode(mode) {
+      result += mode.className? buildSpan(mode.className, '', true): '';
+      top = Object.create(mode, {parent: {value: top}});
+    }
+
+    function processLexeme(buffer, lexeme) {
+
+      mode_buffer += buffer;
+
+      if (lexeme == null) {
+        processBuffer();
+        return 0;
+      }
+
+      var new_mode = subMode(lexeme, top);
+      if (new_mode) {
+        if (new_mode.skip) {
+          mode_buffer += lexeme;
+        } else {
+          if (new_mode.excludeBegin) {
+            mode_buffer += lexeme;
+          }
+          processBuffer();
+          if (!new_mode.returnBegin && !new_mode.excludeBegin) {
+            mode_buffer = lexeme;
+          }
+        }
+        startNewMode(new_mode, lexeme);
+        return new_mode.returnBegin ? 0 : lexeme.length;
+      }
+
+      var end_mode = endOfMode(top, lexeme);
+      if (end_mode) {
+        var origin = top;
+        if (origin.skip) {
+          mode_buffer += lexeme;
+        } else {
+          if (!(origin.returnEnd || origin.excludeEnd)) {
+            mode_buffer += lexeme;
+          }
+          processBuffer();
+          if (origin.excludeEnd) {
+            mode_buffer = lexeme;
+          }
+        }
+        do {
+          if (top.className) {
+            result += spanEndTag;
+          }
+          if (!top.skip && !top.subLanguage) {
+            relevance += top.relevance;
+          }
+          top = top.parent;
+        } while (top !== end_mode.parent);
+        if (end_mode.starts) {
+          if (end_mode.endSameAsBegin) {
+            end_mode.starts.endRe = end_mode.endRe;
+          }
+          startNewMode(end_mode.starts, '');
+        }
+        return origin.returnEnd ? 0 : lexeme.length;
+      }
+
+      if (isIllegal(lexeme, top))
+        throw new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '<unnamed>') + '"');
+
+      /*
+      Parser should not reach this point as all types of lexemes should be caught
+      earlier, but if it does due to some bug make sure it advances at least one
+      character forward to prevent infinite looping.
+      */
+      mode_buffer += lexeme;
+      return lexeme.length || 1;
+    }
+
+    var language = getLanguage(name);
+    if (!language) {
+      throw new Error('Unknown language: "' + name + '"');
+    }
+
+    compileLanguage(language);
+    var top = continuation || language;
+    var continuations = {}; // keep continuations for sub-languages
+    var result = '', current;
+    for(current = top; current !== language; current = current.parent) {
+      if (current.className) {
+        result = buildSpan(current.className, '', true) + result;
+      }
+    }
+    var mode_buffer = '';
+    var relevance = 0;
+    try {
+      var match, count, index = 0;
+      while (true) {
+        top.terminators.lastIndex = index;
+        match = top.terminators.exec(value);
+        if (!match)
+          break;
+        count = processLexeme(value.substring(index, match.index), match[0]);
+        index = match.index + count;
+      }
+      processLexeme(value.substr(index));
+      for(current = top; current.parent; current = current.parent) { // close dangling modes
+        if (current.className) {
+          result += spanEndTag;
+        }
+      }
+      return {
+        relevance: relevance,
+        value: result,
+        language: name,
+        top: top
+      };
+    } catch (e) {
+      if (e.message && e.message.indexOf('Illegal') !== -1) {
+        return {
+          relevance: 0,
+          value: escape(value)
+        };
+      } else {
+        throw e;
+      }
+    }
+  }
+
+  /*
+  Highlighting with language detection. Accepts a string with the code to
+  highlight. Returns an object with the following properties:
+
+  - language (detected language)
+  - relevance (int)
+  - value (an HTML string with highlighting markup)
+  - second_best (object with the same structure for second-best heuristically
+    detected language, may be absent)
+
+  */
+  function highlightAuto(text, languageSubset) {
+    languageSubset = languageSubset || options.languages || objectKeys(languages);
+    var result = {
+      relevance: 0,
+      value: escape(text)
+    };
+    var second_best = result;
+    languageSubset.filter(getLanguage).filter(autoDetection).forEach(function(name) {
+      var current = highlight(name, text, false);
+      current.language = name;
+      if (current.relevance > second_best.relevance) {
+        second_best = current;
+      }
+      if (current.relevance > result.relevance) {
+        second_best = result;
+        result = current;
+      }
+    });
+    if (second_best.language) {
+      result.second_best = second_best;
+    }
+    return result;
+  }
+
+  /*
+  Post-processing of the highlighted markup:
+
+  - replace TABs with something more useful
+  - replace real line-breaks with '<br>' for non-pre containers
+
+  */
+  function fixMarkup(value) {
+    return !(options.tabReplace || options.useBR)
+      ? value
+      : value.replace(fixMarkupRe, function(match, p1) {
+          if (options.useBR && match === '\n') {
+            return '<br>';
+          } else if (options.tabReplace) {
+            return p1.replace(/\t/g, options.tabReplace);
+          }
+          return '';
+      });
+  }
+
+  function buildClassName(prevClassName, currentLang, resultLang) {
+    var language = currentLang ? aliases[currentLang] : resultLang,
+        result   = [prevClassName.trim()];
+
+    if (!prevClassName.match(/\bhljs\b/)) {
+      result.push('hljs');
+    }
+
+    if (prevClassName.indexOf(language) === -1) {
+      result.push(language);
+    }
+
+    return result.join(' ').trim();
+  }
+
+  /*
+  Applies highlighting to a DOM node containing code. Accepts a DOM node and
+  two optional parameters for fixMarkup.
+  */
+  function highlightBlock(block) {
+    var node, originalStream, result, resultNode, text;
+    var language = blockLanguage(block);
+
+    if (isNotHighlighted(language))
+        return;
+
+    if (options.useBR) {
+      node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+      node.innerHTML = block.innerHTML.replace(/\n/g, '').replace(/<br[ \/]*>/g, '\n');
+    } else {
+      node = block;
+    }
+    text = node.textContent;
+    result = language ? highlight(language, text, true) : highlightAuto(text);
+
+    originalStream = nodeStream(node);
+    if (originalStream.length) {
+      resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+      resultNode.innerHTML = result.value;
+      result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
+    }
+    result.value = fixMarkup(result.value);
+
+    block.innerHTML = result.value;
+    block.className = buildClassName(block.className, language, result.language);
+    block.result = {
+      language: result.language,
+      re: result.relevance
+    };
+    if (result.second_best) {
+      block.second_best = {
+        language: result.second_best.language,
+        re: result.second_best.relevance
+      };
+    }
+  }
+
+  /*
+  Updates highlight.js global options with values passed in the form of an object.
+  */
+  function configure(user_options) {
+    options = inherit(options, user_options);
+  }
+
+  /*
+  Applies highlighting to all <pre><code>..</code></pre> blocks on a page.
+  */
+  function initHighlighting() {
+    if (initHighlighting.called)
+      return;
+    initHighlighting.called = true;
+
+    var blocks = document.querySelectorAll('pre code');
+    ArrayProto.forEach.call(blocks, highlightBlock);
+  }
+
+  /*
+  Attaches highlighting to the page load event.
+  */
+  function initHighlightingOnLoad() {
+    addEventListener('DOMContentLoaded', initHighlighting, false);
+    addEventListener('load', initHighlighting, false);
+  }
+
+  function registerLanguage(name, language) {
+    var lang = languages[name] = language(hljs);
+    restoreLanguageApi(lang);
+    if (lang.aliases) {
+      lang.aliases.forEach(function(alias) {aliases[alias] = name;});
+    }
+  }
+
+  function listLanguages() {
+    return objectKeys(languages);
+  }
+
+  function getLanguage(name) {
+    name = (name || '').toLowerCase();
+    return languages[name] || languages[aliases[name]];
+  }
+
+  function autoDetection(name) {
+    var lang = getLanguage(name);
+    return lang && !lang.disableAutodetect;
+  }
+
+  /* Interface definition */
+
+  hljs.highlight = highlight;
+  hljs.highlightAuto = highlightAuto;
+  hljs.fixMarkup = fixMarkup;
+  hljs.highlightBlock = highlightBlock;
+  hljs.configure = configure;
+  hljs.initHighlighting = initHighlighting;
+  hljs.initHighlightingOnLoad = initHighlightingOnLoad;
+  hljs.registerLanguage = registerLanguage;
+  hljs.listLanguages = listLanguages;
+  hljs.getLanguage = getLanguage;
+  hljs.autoDetection = autoDetection;
+  hljs.inherit = inherit;
+
+  // Common regexps
+  hljs.IDENT_RE = '[a-zA-Z]\\w*';
+  hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
+  hljs.NUMBER_RE = '\\b\\d+(\\.\\d+)?';
+  hljs.C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
+  hljs.BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
+  hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
+
+  // Common modes
+  hljs.BACKSLASH_ESCAPE = {
+    begin: '\\\\[\\s\\S]', relevance: 0
+  };
+  hljs.APOS_STRING_MODE = {
+    className: 'string',
+    begin: '\'', end: '\'',
+    illegal: '\\n',
+    contains: [hljs.BACKSLASH_ESCAPE]
+  };
+  hljs.QUOTE_STRING_MODE = {
+    className: 'string',
+    begin: '"', end: '"',
+    illegal: '\\n',
+    contains: [hljs.BACKSLASH_ESCAPE]
+  };
+  hljs.PHRASAL_WORDS_MODE = {
+    begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
+  };
+  hljs.COMMENT = function (begin, end, inherits) {
+    var mode = hljs.inherit(
+      {
+        className: 'comment',
+        begin: begin, end: end,
+        contains: []
+      },
+      inherits || {}
+    );
+    mode.contains.push(hljs.PHRASAL_WORDS_MODE);
+    mode.contains.push({
+      className: 'doctag',
+      begin: '(?:TODO|FIXME|NOTE|BUG|XXX):',
+      relevance: 0
+    });
+    return mode;
+  };
+  hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');
+  hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\*', '\\*/');
+  hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');
+  hljs.NUMBER_MODE = {
+    className: 'number',
+    begin: hljs.NUMBER_RE,
+    relevance: 0
+  };
+  hljs.C_NUMBER_MODE = {
+    className: 'number',
+    begin: hljs.C_NUMBER_RE,
+    relevance: 0
+  };
+  hljs.BINARY_NUMBER_MODE = {
+    className: 'number',
+    begin: hljs.BINARY_NUMBER_RE,
+    relevance: 0
+  };
+  hljs.CSS_NUMBER_MODE = {
+    className: 'number',
+    begin: hljs.NUMBER_RE + '(' +
+      '%|em|ex|ch|rem'  +
+      '|vw|vh|vmin|vmax' +
+      '|cm|mm|in|pt|pc|px' +
+      '|deg|grad|rad|turn' +
+      '|s|ms' +
+      '|Hz|kHz' +
+      '|dpi|dpcm|dppx' +
+      ')?',
+    relevance: 0
+  };
+  hljs.REGEXP_MODE = {
+    className: 'regexp',
+    begin: /\//, end: /\/[gimuy]*/,
+    illegal: /\n/,
+    contains: [
+      hljs.BACKSLASH_ESCAPE,
+      {
+        begin: /\[/, end: /\]/,
+        relevance: 0,
+        contains: [hljs.BACKSLASH_ESCAPE]
+      }
+    ]
+  };
+  hljs.TITLE_MODE = {
+    className: 'title',
+    begin: hljs.IDENT_RE,
+    relevance: 0
+  };
+  hljs.UNDERSCORE_TITLE_MODE = {
+    className: 'title',
+    begin: hljs.UNDERSCORE_IDENT_RE,
+    relevance: 0
+  };
+  hljs.METHOD_GUARD = {
+    // excludes method names from keyword processing
+    begin: '\\.\\s*' + hljs.UNDERSCORE_IDENT_RE,
+    relevance: 0
+  };
+
+  return hljs;
+}));
+;
+      return exports;
+    }())
+  , languages = [{name:"cpp",create:/*
+Language: C++
+Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
+Contributors: Evgeny Stepanischev <imbolk@gmail.com>, Zaven Muradyan <megalivoithos@gmail.com>, Roel Deckers <admin@codingcat.nl>, Sam Wu <samsam2310@gmail.com>, Jordi Petit <jordi.petit@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, Google Inc. (David Benjamin) <davidben@google.com>
+Category: common, system
+*/
+
+function(hljs) {
+  var CPP_PRIMITIVE_TYPES = {
+    className: 'keyword',
+    begin: '\\b[a-z\\d_]*_t\\b'
+  };
+
+  var STRINGS = {
+    className: 'string',
+    variants: [
+      {
+        begin: '(u8?|U|L)?"', end: '"',
+        illegal: '\\n',
+        contains: [hljs.BACKSLASH_ESCAPE]
+      },
+      { begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/ },
+      {
+        begin: '\'\\\\?.', end: '\'',
+        illegal: '.'
+      }
+    ]
+  };
+
+  var NUMBERS = {
+    className: 'number',
+    variants: [
+      { begin: '\\b(0b[01\']+)' },
+      { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
+      { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
+    ],
+    relevance: 0
+  };
+
+  var PREPROCESSOR =       {
+    className: 'meta',
+    begin: /#\s*[a-z]+\b/, end: /$/,
+    keywords: {
+      'meta-keyword':
+        'if else elif endif define undef warning error line ' +
+        'pragma ifdef ifndef include'
+    },
+    contains: [
+      {
+        begin: /\\\n/, relevance: 0
+      },
+      hljs.inherit(STRINGS, {className: 'meta-string'}),
+      {
+        className: 'meta-string',
+        begin: /<[^\n>]*>/, end: /$/,
+        illegal: '\\n',
+      },
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE
+    ]
+  };
+
+  var FUNCTION_TITLE = hljs.IDENT_RE + '\\s*\\(';
+
+  var CPP_KEYWORDS = {
+    keyword: 'int float while private char catch import module export virtual operator sizeof ' +
+      'dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace ' +
+      'unsigned long volatile static protected bool template mutable if public friend ' +
+      'do goto auto void enum else break extern using asm case typeid ' +
+      'short reinterpret_cast|10 default double register explicit signed typename try this ' +
+      'switch continue inline delete alignof constexpr decltype ' +
+      'noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary ' +
+      'atomic_bool atomic_char atomic_schar ' +
+      'atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong ' +
+      'atomic_ullong new throw return ' +
+      'and or not',
+    built_in: 'std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream ' +
+      'auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set ' +
+      'unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos ' +
+      'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' +
+      'fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' +
+      'isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow ' +
+      'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' +
+      'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' +
+      'vfprintf vprintf vsprintf endl initializer_list unique_ptr',
+    literal: 'true false nullptr NULL'
+  };
+
+  var EXPRESSION_CONTAINS = [
+    CPP_PRIMITIVE_TYPES,
+    hljs.C_LINE_COMMENT_MODE,
+    hljs.C_BLOCK_COMMENT_MODE,
+    NUMBERS,
+    STRINGS
+  ];
+
+  return {
+    aliases: ['c', 'cc', 'h', 'c++', 'h++', 'hpp', 'hh', 'hxx', 'cxx'],
+    keywords: CPP_KEYWORDS,
+    illegal: '</',
+    contains: EXPRESSION_CONTAINS.concat([
+      PREPROCESSOR,
+      {
+        begin: '\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<', end: '>',
+        keywords: CPP_KEYWORDS,
+        contains: ['self', CPP_PRIMITIVE_TYPES]
+      },
+      {
+        begin: hljs.IDENT_RE + '::',
+        keywords: CPP_KEYWORDS
+      },
+      {
+        // This mode covers expression context where we can't expect a function
+        // definition and shouldn't highlight anything that looks like one:
+        // `return some()`, `else if()`, `(x*sum(1, 2))`
+        variants: [
+          {begin: /=/, end: /;/},
+          {begin: /\(/, end: /\)/},
+          {beginKeywords: 'new throw return else', end: /;/}
+        ],
+        keywords: CPP_KEYWORDS,
+        contains: EXPRESSION_CONTAINS.concat([
+          {
+            begin: /\(/, end: /\)/,
+            keywords: CPP_KEYWORDS,
+            contains: EXPRESSION_CONTAINS.concat(['self']),
+            relevance: 0
+          }
+        ]),
+        relevance: 0
+      },
+      {
+        className: 'function',
+        begin: '(' + hljs.IDENT_RE + '[\\*&\\s]+)+' + FUNCTION_TITLE,
+        returnBegin: true, end: /[{;=]/,
+        excludeEnd: true,
+        keywords: CPP_KEYWORDS,
+        illegal: /[^\w\s\*&]/,
+        contains: [
+          {
+            begin: FUNCTION_TITLE, returnBegin: true,
+            contains: [hljs.TITLE_MODE],
+            relevance: 0
+          },
+          {
+            className: 'params',
+            begin: /\(/, end: /\)/,
+            keywords: CPP_KEYWORDS,
+            relevance: 0,
+            contains: [
+              hljs.C_LINE_COMMENT_MODE,
+              hljs.C_BLOCK_COMMENT_MODE,
+              STRINGS,
+              NUMBERS,
+              CPP_PRIMITIVE_TYPES,
+              // Count matching parentheses.
+              {
+                begin: /\(/, end: /\)/,
+                keywords: CPP_KEYWORDS,
+                relevance: 0,
+                contains: [
+                  'self',
+                  hljs.C_LINE_COMMENT_MODE,
+                  hljs.C_BLOCK_COMMENT_MODE,
+                  STRINGS,
+                  NUMBERS,
+                  CPP_PRIMITIVE_TYPES
+                ]
+              }
+            ]
+          },
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE,
+          PREPROCESSOR
+        ]
+      },
+      {
+        className: 'class',
+        beginKeywords: 'class struct', end: /[{;:]/,
+        contains: [
+          {begin: /</, end: />/, contains: ['self']}, // skip generic stuff
+          hljs.TITLE_MODE
+        ]
+      }
+    ]),
+    exports: {
+      preprocessor: PREPROCESSOR,
+      strings: STRINGS,
+      keywords: CPP_KEYWORDS
+    }
+  };
+}
+},{name:"1c",create:/*
+Language: 1C:Enterprise (v7, v8)
+Author: Stanislav Belov <stbelov@gmail.com>
+Description: built-in language 1C:Enterprise (v7, v8)
+Category: enterprise
+*/
+
+function(hljs){
+
+  // общий паттерн для определения идентификаторов
+  var UNDERSCORE_IDENT_RE = '[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+';
+  
+  // v7 уникальные ключевые слова, отсутствующие в v8 ==> keyword
+  var v7_keywords =
+  'далее ';
+
+  // v8 ключевые слова ==> keyword
+  var v8_keywords =
+  'возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли ' +
+  'конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт ';
+
+  // keyword : ключевые слова
+  var KEYWORD = v7_keywords + v8_keywords;
+  
+  // v7 уникальные директивы, отсутствующие в v8 ==> meta-keyword
+  var v7_meta_keywords =
+  'загрузитьизфайла ';
+
+  // v8 ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях ==> meta-keyword
+  var v8_meta_keywords =
+  'вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер ' +
+  'наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед ' +
+  'после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент ';
+
+  // meta-keyword : ключевые слова в инструкциях препроцессора, директивах компиляции, аннотациях
+  var METAKEYWORD = v7_meta_keywords + v8_meta_keywords;
+
+  // v7 системные константы ==> built_in
+  var v7_system_constants =
+  'разделительстраниц разделительстрок символтабуляции ';
+  
+  // v7 уникальные методы глобального контекста, отсутствующие в v8 ==> built_in
+  var v7_global_context_methods =
+  'ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов ' +
+  'датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя ' +
+  'кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца ' +
+  'коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид ' +
+  'назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца ' +
+  'начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов ' +
+  'основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута ' +
+  'получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта ' +
+  'префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына ' +
+  'рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента ' +
+  'счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон ';
+  
+  // v8 методы глобального контекста ==> built_in
+  var v8_global_context_methods =
+  'acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока ' +
+  'xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ' +
+  'ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации ' +
+  'выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода ' +
+  'деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы ' +
+  'загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации ' +
+  'заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию ' +
+  'значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла ' +
+  'изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке ' +
+  'каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку ' +
+  'кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты ' +
+  'конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы ' +
+  'копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти ' +
+  'найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы ' +
+  'началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя ' +
+  'начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты ' +
+  'начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов ' +
+  'начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя ' +
+  'начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога ' +
+  'начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией ' +
+  'начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы ' +
+  'номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения ' +
+  'обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении ' +
+  'отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения ' +
+  'открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально ' +
+  'отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа ' +
+  'перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту ' +
+  'подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения ' +
+  'подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки ' +
+  'показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение ' +
+  'показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя ' +
+  'получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса ' +
+  'получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора ' +
+  'получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса ' +
+  'получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации ' +
+  'получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла ' +
+  'получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации ' +
+  'получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления ' +
+  'получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу ' +
+  'получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы ' +
+  'получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет ' +
+  'получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима ' +
+  'получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения ' +
+  'получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути ' +
+  'получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы ' +
+  'получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю ' +
+  'получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных ' +
+  'получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию ' +
+  'получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище ' +
+  'поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода ' +
+  'представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение ' +
+  'прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока ' +
+  'рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных ' +
+  'раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени ' +
+  'смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить ' +
+  'состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс ' +
+  'строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений '+
+  'стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах ' +
+  'текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации ' +
+  'текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы ' +
+  'удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим ' +
+  'установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту ' +
+  'установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных ' +
+  'установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации ' +
+  'установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения ' +
+  'установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования ' +
+  'установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима ' +
+  'установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим ' +
+  'установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией ' +
+  'установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы ' +
+  'установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса ' +
+  'формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища ';
+
+  // v8 свойства глобального контекста ==> built_in
+  var v8_global_context_property =
+  'wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы ' +
+  'внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль ' +
+  'документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты ' +
+  'историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений ' +
+  'отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик ' +
+  'планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок ' +
+  'рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений ' +
+  'регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа ' +
+  'средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек ' +
+  'хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков ' +
+  'хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек ';
+
+  // built_in : встроенные или библиотечные объекты (константы, классы, функции)
+  var BUILTIN =
+  v7_system_constants +
+  v7_global_context_methods + v8_global_context_methods +
+  v8_global_context_property;
+  
+  // v8 системные наборы значений ==> class
+  var v8_system_sets_of_values =
+  'webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля ';
+
+  // v8 системные перечисления - интерфейсные ==> class
+  var v8_system_enums_interface =
+  'автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий ' +
+  'анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы ' +
+  'вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы ' +
+  'виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя ' +
+  'видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение ' +
+  'горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы ' +
+  'группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания ' +
+  'интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки ' +
+  'используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы ' +
+  'источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева ' +
+  'начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ' +
+  'ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме ' +
+  'отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы ' +
+  'отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы ' +
+  'отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы ' +
+  'отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска ' +
+  'отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования ' +
+  'отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта ' +
+  'отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы ' +
+  'поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы ' +
+  'поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы ' +
+  'положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы ' +
+  'положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы ' +
+  'положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском ' +
+  'положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы ' +
+  'размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта ' +
+  'режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты ' +
+  'режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения ' +
+  'режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра ' +
+  'режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения ' +
+  'режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы ' +
+  'режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки ' +
+  'режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание ' +
+  'сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы ' +
+  'способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление ' +
+  'статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы ' +
+  'типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы ' +
+  'типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления ' +
+  'типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы ' +
+  'типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы ' +
+  'типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений ' +
+  'типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы ' +
+  'типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы ' +
+  'типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы ' +
+  'факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени ' +
+  'форматкартинки ширинаподчиненныхэлементовформы ';
+
+  // v8 системные перечисления - свойства прикладных объектов ==> class
+  var v8_system_enums_objects_properties =
+  'виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса ' +
+  'использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения ' +
+  'использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента ';
+
+  // v8 системные перечисления - планы обмена ==> class
+  var v8_system_enums_exchange_plans =
+  'авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных ';
+
+  // v8 системные перечисления - табличный документ ==> class
+  var v8_system_enums_tabular_document =
+  'использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы ' +
+  'положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента ' +
+  'способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента ' +
+  'типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента ' +
+  'типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы ' +
+  'типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента ' +
+  'типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц ';
+
+  // v8 системные перечисления - планировщик ==> class
+  var v8_system_enums_sheduler =
+  'отображениевремениэлементовпланировщика ';
+
+  // v8 системные перечисления - форматированный документ ==> class
+  var v8_system_enums_formatted_document =
+  'типфайлаформатированногодокумента ';
+
+  // v8 системные перечисления - запрос ==> class
+  var v8_system_enums_query =
+  'обходрезультатазапроса типзаписизапроса ';
+
+  // v8 системные перечисления - построитель отчета ==> class
+  var v8_system_enums_report_builder =
+  'видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов ';
+
+  // v8 системные перечисления - работа с файлами ==> class
+  var v8_system_enums_files =
+  'доступкфайлу режимдиалогавыборафайла режимоткрытияфайла ';
+
+  // v8 системные перечисления - построитель запроса ==> class
+  var v8_system_enums_query_builder =
+  'типизмеренияпостроителязапроса ';
+
+  // v8 системные перечисления - анализ данных ==> class
+  var v8_system_enums_data_analysis =
+  'видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных ' +
+  'типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений ' +
+  'типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций ' +
+  'типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных ' +
+  'типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных ' +
+  'типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений ';
+
+  // v8 системные перечисления - xml, json, xs, dom, xdto, web-сервисы ==> class
+  var v8_system_enums_xml_json_xs_dom_xdto_ws =
+  'wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto ' +
+  'действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs ' +
+  'исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs ' +
+  'методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ' +
+  'ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson ' +
+  'типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs ' +
+  'форматдатыjson экранированиесимволовjson ';
+
+  // v8 системные перечисления - система компоновки данных ==> class
+  var v8_system_enums_data_composition_system =
+  'видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных ' +
+  'расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных ' +
+  'расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных ' +
+  'расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных ' +
+  'типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных ' +
+  'типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных ' +
+  'типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных ' +
+  'расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных ' +
+  'режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных ' +
+  'режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных '+
+  'вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных ' +
+  'использованиеусловногооформлениякомпоновкиданных ';
+
+  // v8 системные перечисления - почта ==> class
+  var v8_system_enums_email =
+  'важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения ' +
+  'способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты ' +
+  'статусразборапочтовогосообщения ';
+
+  // v8 системные перечисления - журнал регистрации ==> class
+  var v8_system_enums_logbook =
+  'режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации ';
+
+  // v8 системные перечисления - криптография ==> class
+  var v8_system_enums_cryptography =
+  'расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии ' +
+  'типхранилищасертификатовкриптографии ';
+
+  // v8 системные перечисления - ZIP ==> class
+  var v8_system_enums_zip =
+  'кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip ' +
+  'режимсохраненияпутейzip уровеньсжатияzip ';
+
+  // v8 системные перечисления - 
+  // Блокировка данных, Фоновые задания, Автоматизированное тестирование,
+  // Доставляемые уведомления, Встроенные покупки, Интернет, Работа с двоичными данными ==> class
+  var v8_system_enums_other =
+  'звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных ' +
+  'сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp ';
+
+  // v8 системные перечисления - схема запроса ==> class
+  var v8_system_enums_request_schema =
+  'направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса ' +
+  'типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса ';
+
+  // v8 системные перечисления - свойства объектов метаданных ==> class
+  var v8_system_enums_properties_of_metadata_objects =
+  'httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления ' +
+  'видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование ' +
+  'использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения ' +
+  'использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита ' +
+  'назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных ' +
+  'оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи ' +
+  'основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении ' +
+  'периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений ' +
+  'повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение ' +
+  'разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита '+
+  'режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности ' +
+  'режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов ' +
+  'режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса ' +
+  'режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов ' +
+  'сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования ' +
+  'типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса ' +
+  'типномерадокумента типномеразадачи типформы удалениедвижений ';
+
+  // v8 системные перечисления - разные ==> class
+  var v8_system_enums_differents =
+  'важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения ' +
+  'вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки ' +
+  'видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак ' +
+  'использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога ' +
+  'кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных ' +
+  'отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения ' +
+  'режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных ' +
+  'способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter ' +
+  'типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты';
+
+  // class: встроенные наборы значений, системные перечисления (содержат дочерние значения, обращения к которым через разыменование)
+  var CLASS =
+  v8_system_sets_of_values +
+  v8_system_enums_interface +
+  v8_system_enums_objects_properties +
+  v8_system_enums_exchange_plans +
+  v8_system_enums_tabular_document +
+  v8_system_enums_sheduler +
+  v8_system_enums_formatted_document +
+  v8_system_enums_query +
+  v8_system_enums_report_builder +
+  v8_system_enums_files +
+  v8_system_enums_query_builder +
+  v8_system_enums_data_analysis +
+  v8_system_enums_xml_json_xs_dom_xdto_ws +
+  v8_system_enums_data_composition_system +
+  v8_system_enums_email +
+  v8_system_enums_logbook +
+  v8_system_enums_cryptography +
+  v8_system_enums_zip +
+  v8_system_enums_other +
+  v8_system_enums_request_schema +
+  v8_system_enums_properties_of_metadata_objects +
+  v8_system_enums_differents;
+
+  // v8 общие объекты (у объектов есть конструктор, экземпляры создаются методом НОВЫЙ) ==> type
+  var v8_shared_object =
+  'comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs ' +
+  'блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема ' +
+  'географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма ' +
+  'диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания ' +
+  'диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление ' +
+  'записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom ' +
+  'запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта ' +
+  'интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs ' +
+  'использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных ' +
+  'итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла ' +
+  'компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных ' +
+  'конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных ' +
+  'макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson ' +
+  'обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs ' +
+  'объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации ' +
+  'описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных ' +
+  'описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs ' +
+  'определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom ' +
+  'определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных ' +
+  'параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных ' +
+  'полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных ' +
+  'построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml ' +
+  'процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент ' +
+  'процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml ' +
+  'результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto ' +
+  'сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows ' +
+  'сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш ' +
+  'сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент ' +
+  'текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток ' +
+  'фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs ' +
+  'фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs ' +
+  'фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs ' +
+  'фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент ' +
+  'фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла ' +
+  'чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных ';
+
+  // v8 универсальные коллекции значений ==> type
+  var v8_universal_collection =
+  'comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура ' +
+  'фиксированноесоответствие фиксированныймассив ';
+
+  // type : встроенные типы
+  var TYPE =
+  v8_shared_object +
+  v8_universal_collection;
+
+  // literal : примитивные типы
+  var LITERAL = 'null истина ложь неопределено';
+  
+  // number : числа
+  var NUMBERS = hljs.inherit(hljs.NUMBER_MODE);
+
+  // string : строки
+  var STRINGS = {
+    className: 'string',
+    begin: '"|\\|', end: '"|$',
+    contains: [{begin: '""'}]
+  };
+
+  // number : даты
+  var DATE = {
+    begin: "'", end: "'", excludeBegin: true, excludeEnd: true,
+    contains: [
+      {
+        className: 'number',
+        begin: '\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}'
+      }
+    ]
+  };
+  
+  // comment : комментарии
+  var COMMENTS = hljs.inherit(hljs.C_LINE_COMMENT_MODE);
+  
+  // meta : инструкции препроцессора, директивы компиляции
+  var META = {
+    className: 'meta',
+    lexemes: UNDERSCORE_IDENT_RE,
+    begin: '#|&', end: '$',
+    keywords: {'meta-keyword': KEYWORD + METAKEYWORD},
+    contains: [
+      COMMENTS
+    ]
+  };
+  
+  // symbol : метка goto
+  var SYMBOL = {
+    className: 'symbol',
+    begin: '~', end: ';|:', excludeEnd: true
+  };  
+  
+  // function : объявление процедур и функций
+  var FUNCTION = {
+    className: 'function',
+    lexemes: UNDERSCORE_IDENT_RE,
+    variants: [
+      {begin: 'процедура|функция', end: '\\)', keywords: 'процедура функция'},
+      {begin: 'конецпроцедуры|конецфункции', keywords: 'конецпроцедуры конецфункции'}
+    ],
+    contains: [
+      {
+        begin: '\\(', end: '\\)', endsParent : true,
+        contains: [
+          {
+            className: 'params',
+            lexemes: UNDERSCORE_IDENT_RE,
+            begin: UNDERSCORE_IDENT_RE, end: ',', excludeEnd: true, endsWithParent: true,
+            keywords: {
+              keyword: 'знач',
+              literal: LITERAL
+            },
+            contains: [
+              NUMBERS,
+              STRINGS,
+              DATE
+            ]
+          },
+          COMMENTS
+        ]
+      },
+      hljs.inherit(hljs.TITLE_MODE, {begin: UNDERSCORE_IDENT_RE})
+    ]
+  };
+
+  return {
+    case_insensitive: true,
+    lexemes: UNDERSCORE_IDENT_RE,
+    keywords: {
+      keyword: KEYWORD,
+      built_in: BUILTIN,
+      class: CLASS,
+      type: TYPE,
+      literal: LITERAL
+    },
+    contains: [
+      META,
+      FUNCTION,
+      COMMENTS,
+      SYMBOL,
+      NUMBERS,
+      STRINGS,
+      DATE
+    ]  
+  }
+}},{name:"abnf",create:/*
+Language: Augmented Backus-Naur Form
+Author: Alex McKibben <alex@nullscope.net>
+*/
+
+function(hljs) {
+    var regexes = {
+        ruleDeclaration: "^[a-zA-Z][a-zA-Z0-9-]*",
+        unexpectedChars: "[!@#$^&',?+~`|:]"
+    };
+
+    var keywords = [
+        "ALPHA",
+        "BIT",
+        "CHAR",
+        "CR",
+        "CRLF",
+        "CTL",
+        "DIGIT",
+        "DQUOTE",
+        "HEXDIG",
+        "HTAB",
+        "LF",
+        "LWSP",
+        "OCTET",
+        "SP",
+        "VCHAR",
+        "WSP"
+    ];
+
+    var commentMode = hljs.COMMENT(";", "$");
+
+    var terminalBinaryMode = {
+        className: "symbol",
+        begin: /%b[0-1]+(-[0-1]+|(\.[0-1]+)+){0,1}/
+    };
+
+    var terminalDecimalMode = {
+        className: "symbol",
+        begin: /%d[0-9]+(-[0-9]+|(\.[0-9]+)+){0,1}/
+    };
+
+    var terminalHexadecimalMode = {
+        className: "symbol",
+        begin: /%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+){0,1}/,
+    };
+
+    var caseSensitivityIndicatorMode = {
+        className: "symbol",
+        begin: /%[si]/
+    };
+
+    var ruleDeclarationMode = {
+        begin: regexes.ruleDeclaration + '\\s*=',
+        returnBegin: true,
+        end: /=/,
+        relevance: 0,
+        contains: [{className: "attribute", begin: regexes.ruleDeclaration}]
+    };
+
+    return {
+      illegal: regexes.unexpectedChars,
+      keywords: keywords.join(" "),
+      contains: [
+          ruleDeclarationMode,
+          commentMode,
+          terminalBinaryMode,
+          terminalDecimalMode,
+          terminalHexadecimalMode,
+          caseSensitivityIndicatorMode,
+          hljs.QUOTE_STRING_MODE,
+          hljs.NUMBER_MODE
+      ]
+    };
+}
+},{name:"accesslog",create:/*
+ Language: Access log
+ Author: Oleg Efimov <efimovov@gmail.com>
+ Description: Apache/Nginx Access Logs
+ */
+
+function(hljs) {
+  return {
+    contains: [
+      // IP
+      {
+        className: 'number',
+        begin: '\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b'
+      },
+      // Other numbers
+      {
+        className: 'number',
+        begin: '\\b\\d+\\b',
+        relevance: 0
+      },
+      // Requests
+      {
+        className: 'string',
+        begin: '"(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|PATCH|TRACE)', end: '"',
+        keywords: 'GET POST HEAD PUT DELETE CONNECT OPTIONS PATCH TRACE',
+        illegal: '\\n',
+        relevance: 10
+      },
+      // Dates
+      {
+        className: 'string',
+        begin: /\[/, end: /\]/,
+        illegal: '\\n'
+      },
+      // Strings
+      {
+        className: 'string',
+        begin: '"', end: '"',
+        illegal: '\\n'
+      }
+    ]
+  };
+}
+},{name:"actionscript",create:/*
+Language: ActionScript
+Author: Alexander Myadzel <myadzel@gmail.com>
+Category: scripting
+*/
+
+function(hljs) {
+  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';
+  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';
+
+  var AS3_REST_ARG_MODE = {
+    className: 'rest_arg',
+    begin: '[.]{3}', end: IDENT_RE,
+    relevance: 10
+  };
+
+  return {
+    aliases: ['as'],
+    keywords: {
+      keyword: 'as break case catch class const continue default delete do dynamic each ' +
+        'else extends final finally for function get if implements import in include ' +
+        'instanceof interface internal is namespace native new override package private ' +
+        'protected public return set static super switch this throw try typeof use var void ' +
+        'while with',
+      literal: 'true false null undefined'
+    },
+    contains: [
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.C_NUMBER_MODE,
+      {
+        className: 'class',
+        beginKeywords: 'package', end: '{',
+        contains: [hljs.TITLE_MODE]
+      },
+      {
+        className: 'class',
+        beginKeywords: 'class interface', end: '{', excludeEnd: true,
+        contains: [
+          {
+            beginKeywords: 'extends implements'
+          },
+          hljs.TITLE_MODE
+        ]
+      },
+      {
+        className: 'meta',
+        beginKeywords: 'import include', end: ';',
+        keywords: {'meta-keyword': 'import include'}
+      },
+      {
+        className: 'function',
+        beginKeywords: 'function', end: '[{;]', excludeEnd: true,
+        illegal: '\\S',
+        contains: [
+          hljs.TITLE_MODE,
+          {
+            className: 'params',
+            begin: '\\(', end: '\\)',
+            contains: [
+              hljs.APOS_STRING_MODE,
+              hljs.QUOTE_STRING_MODE,
+              hljs.C_LINE_COMMENT_MODE,
+              hljs.C_BLOCK_COMMENT_MODE,
+              AS3_REST_ARG_MODE
+            ]
+          },
+          {
+            begin: ':\\s*' + IDENT_FUNC_RETURN_TYPE_RE
+          }
+        ]
+      },
+      hljs.METHOD_GUARD
+    ],
+    illegal: /#/
+  };
+}
+},{name:"ada",create:/*
+Language: Ada
+Author: Lars Schulna <kartoffelbrei.mit.muskatnuss@gmail.org>
+Description: Ada is a general-purpose programming language that has great support for saftey critical and real-time applications.
+             It has been developed by the DoD and thus has been used in military and safety-critical applications (like civil aviation).
+             The first version appeared in the 80s, but it's still actively developed today with
+             the newest standard being Ada2012.
+*/
+
+// We try to support full Ada2012
+//
+// We highlight all appearances of types, keywords, literals (string, char, number, bool)
+// and titles (user defined function/procedure/package)
+// CSS classes are set accordingly
+//
+// Languages causing problems for language detection:
+// xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword)
+// sql (ada default.txt has a lot of sql keywords)
+
+function(hljs) {
+    // Regular expression for Ada numeric literals.
+    // stolen form the VHDL highlighter
+
+    // Decimal literal:
+    var INTEGER_RE = '\\d(_|\\d)*';
+    var EXPONENT_RE = '[eE][-+]?' + INTEGER_RE;
+    var DECIMAL_LITERAL_RE = INTEGER_RE + '(\\.' + INTEGER_RE + ')?' + '(' + EXPONENT_RE + ')?';
+
+    // Based literal:
+    var BASED_INTEGER_RE = '\\w+';
+    var BASED_LITERAL_RE = INTEGER_RE + '#' + BASED_INTEGER_RE + '(\\.' + BASED_INTEGER_RE + ')?' + '#' + '(' + EXPONENT_RE + ')?';
+
+    var NUMBER_RE = '\\b(' + BASED_LITERAL_RE + '|' + DECIMAL_LITERAL_RE + ')';
+
+    // Identifier regex
+    var ID_REGEX = '[A-Za-z](_?[A-Za-z0-9.])*';
+
+    // bad chars, only allowed in literals
+    var BAD_CHARS = '[]{}%#\'\"'
+
+    // Ada doesn't have block comments, only line comments
+    var COMMENTS = hljs.COMMENT('--', '$');
+
+    // variable declarations of the form
+    // Foo : Bar := Baz;
+    // where only Bar will be highlighted
+    var VAR_DECLS = {
+        // TODO: These spaces are not required by the Ada syntax
+        // however, I have yet to see handwritten Ada code where
+        // someone does not put spaces around :
+        begin: '\\s+:\\s+', end: '\\s*(:=|;|\\)|=>|$)',
+        // endsWithParent: true,
+        // returnBegin: true,
+        illegal: BAD_CHARS,
+        contains: [
+            {
+                // workaround to avoid highlighting
+                // named loops and declare blocks
+                beginKeywords: 'loop for declare others',
+                endsParent: true,
+            },
+            {
+                // properly highlight all modifiers
+                className: 'keyword',
+                beginKeywords: 'not null constant access function procedure in out aliased exception'
+            },
+            {
+                className: 'type',
+                begin: ID_REGEX,
+                endsParent: true,
+                relevance: 0,
+            }
+        ]
+    };
+
+    return {
+        case_insensitive: true,
+        keywords: {
+            keyword:
+                'abort else new return abs elsif not reverse abstract end ' +
+                'accept entry select access exception of separate aliased exit or some ' +
+                'all others subtype and for out synchronized array function overriding ' +
+                'at tagged generic package task begin goto pragma terminate ' +
+                'body private then if procedure type case in protected constant interface ' +
+                'is raise use declare range delay limited record when delta loop rem while ' +
+                'digits renames with do mod requeue xor',
+            literal:
+                'True False',
+        },
+        contains: [
+            COMMENTS,
+            // strings "foobar"
+            {
+                className: 'string',
+                begin: /"/, end: /"/,
+                contains: [{begin: /""/, relevance: 0}]
+            },
+            // characters ''
+            {
+                // character literals always contain one char
+                className: 'string',
+                begin: /'.'/
+            },
+            {
+                // number literals
+                className: 'number',
+                begin: NUMBER_RE,
+                relevance: 0
+            },
+            {
+                // Attributes
+                className: 'symbol',
+                begin: "'" + ID_REGEX,
+            },
+            {
+                // package definition, maybe inside generic
+                className: 'title',
+                begin: '(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?', end: '(is|$)',
+                keywords: 'package body',
+                excludeBegin: true,
+                excludeEnd: true,
+                illegal: BAD_CHARS
+            },
+            {
+                // function/procedure declaration/definition
+                // maybe inside generic
+                begin: '(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+', end: '(\\bis|\\bwith|\\brenames|\\)\\s*;)',
+                keywords: 'overriding function procedure with is renames return',
+                // we need to re-match the 'function' keyword, so that
+                // the title mode below matches only exactly once
+                returnBegin: true,
+                contains:
+                [
+                    COMMENTS,
+                    {
+                        // name of the function/procedure
+                        className: 'title',
+                        begin: '(\\bwith\\s+)?\\b(function|procedure)\\s+',
+                        end: '(\\(|\\s+|$)',
+                        excludeBegin: true,
+                        excludeEnd: true,
+                        illegal: BAD_CHARS
+                    },
+                    // 'self'
+                    // // parameter types
+                    VAR_DECLS,
+                    {
+                        // return type
+                        className: 'type',
+                        begin: '\\breturn\\s+', end: '(\\s+|;|$)',
+                        keywords: 'return',
+                        excludeBegin: true,
+                        excludeEnd: true,
+                        // we are done with functions
+                        endsParent: true,
+                        illegal: BAD_CHARS
+
+                    },
+                ]
+            },
+            {
+                // new type declarations
+                // maybe inside generic
+                className: 'type',
+                begin: '\\b(sub)?type\\s+', end: '\\s+',
+                keywords: 'type',
+                excludeBegin: true,
+                illegal: BAD_CHARS
+            },
+
+            // see comment above the definition
+            VAR_DECLS,
+
+            // no markup
+            // relevance boosters for small snippets
+            // {begin: '\\s*=>\\s*'},
+            // {begin: '\\s*:=\\s*'},
+            // {begin: '\\s+:=\\s+'},
+        ]
+    };
+}
+},{name:"angelscript",create:/*
+Language: AngelScript
+Author: Melissa Geels <melissa@nimble.tools>
+Category: scripting
+*/
+
+function(hljs) {
+  var builtInTypeMode = {
+    className: 'built_in',
+    begin: '\\b(void|bool|int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|string|ref|array|double|float|auto|dictionary)'
+  };
+
+  var objectHandleMode = {
+    className: 'symbol',
+    begin: '[a-zA-Z0-9_]+@'
+  };
+
+  var genericMode = {
+    className: 'keyword',
+    begin: '<', end: '>',
+    contains: [ builtInTypeMode, objectHandleMode ]
+  };
+
+  builtInTypeMode.contains = [ genericMode ];
+  objectHandleMode.contains = [ genericMode ];
+
+  return {
+    aliases: [ 'asc' ],
+
+    keywords:
+      'for in|0 break continue while do|0 return if else case switch namespace is cast ' +
+      'or and xor not get|0 in inout|10 out override set|0 private public const default|0 ' +
+      'final shared external mixin|10 enum typedef funcdef this super import from interface ' +
+      'abstract|0 try catch protected explicit',
+
+    // avoid close detection with C# and JS
+    illegal: '(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunction\s*[^\\(])',
+
+    contains: [
+      { // 'strings'
+        className: 'string',
+        begin: '\'', end: '\'',
+        illegal: '\\n',
+        contains: [ hljs.BACKSLASH_ESCAPE ],
+        relevance: 0
+      },
+
+      { // "strings"
+        className: 'string',
+        begin: '"', end: '"',
+        illegal: '\\n',
+        contains: [ hljs.BACKSLASH_ESCAPE ],
+        relevance: 0
+      },
+
+      // """heredoc strings"""
+      {
+        className: 'string',
+        begin: '"""', end: '"""'
+      },
+
+      hljs.C_LINE_COMMENT_MODE, // single-line comments
+      hljs.C_BLOCK_COMMENT_MODE, // comment blocks
+
+      { // interface or namespace declaration
+        beginKeywords: 'interface namespace', end: '{',
+        illegal: '[;.\\-]',
+        contains: [
+          { // interface or namespace name
+            className: 'symbol',
+            begin: '[a-zA-Z0-9_]+'
+          }
+        ]
+      },
+
+      { // class declaration
+        beginKeywords: 'class', end: '{',
+        illegal: '[;.\\-]',
+        contains: [
+          { // class name
+            className: 'symbol',
+            begin: '[a-zA-Z0-9_]+',
+            contains: [
+              {
+                begin: '[:,]\\s*',
+                contains: [
+                  {
+                    className: 'symbol',
+                    begin: '[a-zA-Z0-9_]+'
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      },
+
+      builtInTypeMode, // built-in types
+      objectHandleMode, // object handles
+
+      { // literals
+        className: 'literal',
+        begin: '\\b(null|true|false)'
+      },
+
+      { // numbers
+        className: 'number',
+        begin: '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)'
+      }
+    ]
+  };
+}
+},{name:"apache",create:/*
+Language: Apache
+Author: Ruslan Keba <rukeba@gmail.com>
+Contributors: Ivan Sagalaev <maniac@softwaremaniacs.org>
+Website: http://rukeba.com/
+Description: language definition for Apache configuration files (httpd.conf & .htaccess)
+Category: common, config
+*/
+
+function(hljs) {
+  var NUMBER = {className: 'number', begin: '[\\$%]\\d+'};
+  return {
+    aliases: ['apacheconf'],
+    case_insensitive: true,
+    contains: [
+      hljs.HASH_COMMENT_MODE,
+      {className: 'section', begin: '</?', end: '>'},
+      {
+        className: 'attribute',
+        begin: /\w+/,
+        relevance: 0,
+        // keywords aren’t needed for highlighting per se, they only boost relevance
+        // for a very generally defined mode (starts with a word, ends with line-end
+        keywords: {
+          nomarkup:
+            'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +
+            'sethandler errordocument loadmodule options header listen serverroot ' +
+            'servername'
+        },
+        starts: {
+          end: /$/,
+          relevance: 0,
+          keywords: {
+            literal: 'on off all'
+          },
+          contains: [
+            {
+              className: 'meta',
+              begin: '\\s\\[', end: '\\]$'
+            },
+            {
+              className: 'variable',
+              begin: '[\\$%]\\{', end: '\\}',
+              contains: ['self', NUMBER]
+            },
+            NUMBER,
+            hljs.QUOTE_STRING_MODE
+          ]
+        }
+      }
+    ],
+    illegal: /\S/
+  };
+}
+},{name:"applescript",create:/*
+Language: AppleScript
+Authors: Nathan Grigg <nathan@nathanamy.org>, Dr. Drang <drdrang@gmail.com>
+Category: scripting
+*/
+
+function(hljs) {
+  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});
+  var PARAMS = {
+    className: 'params',
+    begin: '\\(', end: '\\)',
+    contains: ['self', hljs.C_NUMBER_MODE, STRING]
+  };
+  var COMMENT_MODE_1 = hljs.COMMENT('--', '$');
+  var COMMENT_MODE_2 = hljs.COMMENT(
+    '\\(\\*',
+    '\\*\\)',
+    {
+      contains: ['self', COMMENT_MODE_1] //allow nesting
+    }
+  );
+  var COMMENTS = [
+    COMMENT_MODE_1,
+    COMMENT_MODE_2,
+    hljs.HASH_COMMENT_MODE
+  ];
+
+  return {
+    aliases: ['osascript'],
+    keywords: {
+      keyword:
+        'about above after against and around as at back before beginning ' +
+        'behind below beneath beside between but by considering ' +
+        'contain contains continue copy div does eighth else end equal ' +
+        'equals error every exit fifth first for fourth from front ' +
+        'get given global if ignoring in into is it its last local me ' +
+        'middle mod my ninth not of on onto or over prop property put ref ' +
+        'reference repeat returning script second set seventh since ' +
+        'sixth some tell tenth that the|0 then third through thru ' +
+        'timeout times to transaction try until where while whose with ' +
+        'without',
+      literal:
+        'AppleScript false linefeed return pi quote result space tab true',
+      built_in:
+        'alias application boolean class constant date file integer list ' +
+        'number real record string text ' +
+        'activate beep count delay launch log offset read round ' +
+        'run say summarize write ' +
+        'character characters contents day frontmost id item length ' +
+        'month name paragraph paragraphs rest reverse running time version ' +
+        'weekday word words year'
+    },
+    contains: [
+      STRING,
+      hljs.C_NUMBER_MODE,
+      {
+        className: 'built_in',
+        begin:
+          '\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +
+          'mount volume|path to|(close|open for) access|(get|set) eof|' +
+          'current date|do shell script|get volume settings|random number|' +
+          'set volume|system attribute|system info|time to GMT|' +
+          '(load|run|store) script|scripting components|' +
+          'ASCII (character|number)|localized string|' +
+          'choose (application|color|file|file name|' +
+          'folder|from list|remote application|URL)|' +
+          'display (alert|dialog))\\b|^\\s*return\\b'
+      },
+      {
+        className: 'literal',
+        begin:
+          '\\b(text item delimiters|current application|missing value)\\b'
+      },
+      {
+        className: 'keyword',
+        begin:
+          '\\b(apart from|aside from|instead of|out of|greater than|' +
+          "isn't|(doesn't|does not) (equal|come before|come after|contain)|" +
+          '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +
+          'contained by|comes (before|after)|a (ref|reference)|POSIX file|' +
+          'POSIX path|(date|time) string|quoted form)\\b'
+      },
+      {
+        beginKeywords: 'on',
+        illegal: '[${=;\\n]',
+        contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]
+      }
+    ].concat(COMMENTS),
+    illegal: '//|->|=>|\\[\\['
+  };
+}
+},{name:"arcade",create:/*
+ Language: ArcGIS Arcade
+ Category: scripting
+ Author: John Foster <jfoster@esri.com>
+ Description: ArcGIS Arcade is an expression language used in many Esri ArcGIS products such as Pro, Online, Server, Runtime, JavaScript, and Python
+*/
+function(hljs) {
+  var IDENT_RE = '[A-Za-z_][0-9A-Za-z_]*';
+  var KEYWORDS = {
+    keyword:
+      'if for while var new function do return void else break',
+    literal:
+      'true false null undefined NaN Infinity PI BackSlash DoubleQuote ForwardSlash NewLine SingleQuote Tab',
+    built_in:
+      'Abs Acos Area AreaGeodetic Asin Atan Atan2 Average Boolean Buffer BufferGeodetic ' +
+      'Ceil Centroid Clip Console Constrain Contains Cos Count Crosses Cut Date DateAdd ' +
+      'DateDiff Day Decode DefaultValue Dictionary Difference Disjoint Distance Distinct ' +
+      'DomainCode DomainName Equals Exp Extent Feature FeatureSet FeatureSetById FeatureSetByTitle ' +
+      'FeatureSetByUrl Filter First Floor Geometry Guid HasKey Hour IIf IndexOf Intersection ' +
+      'Intersects IsEmpty Length LengthGeodetic Log Max Mean Millisecond Min Minute Month ' +
+      'MultiPartToSinglePart Multipoint NextSequenceValue Now Number OrderBy Overlaps Point Polygon ' +
+      'Polyline Pow Random Relate Reverse Round Second SetGeometry Sin Sort Sqrt Stdev Sum ' +
+      'SymmetricDifference Tan Text Timestamp Today ToLocal Top Touches ToUTC TypeOf Union Variance ' +
+      'Weekday When Within Year '
+  };
+  var EXPRESSIONS;
+  var SYMBOL = {
+    className: 'symbol',
+    begin: '\\$[feature|layer|map|value|view]+'
+  };
+  var NUMBER = {
+    className: 'number',
+    variants: [
+      { begin: '\\b(0[bB][01]+)' },
+      { begin: '\\b(0[oO][0-7]+)' },
+      { begin: hljs.C_NUMBER_RE }
+    ],
+    relevance: 0
+  };
+  var SUBST = {
+    className: 'subst',
+    begin: '\\$\\{', end: '\\}',
+    keywords: KEYWORDS,
+    contains: []  // defined later
+  };
+  var TEMPLATE_STRING = {
+    className: 'string',
+    begin: '`', end: '`',
+    contains: [
+      hljs.BACKSLASH_ESCAPE,
+      SUBST
+    ]
+  };
+  SUBST.contains = [
+    hljs.APOS_STRING_MODE,
+    hljs.QUOTE_STRING_MODE,
+    TEMPLATE_STRING,
+    NUMBER,
+    hljs.REGEXP_MODE
+  ];
+  var PARAMS_CONTAINS = SUBST.contains.concat([
+    hljs.C_BLOCK_COMMENT_MODE,
+    hljs.C_LINE_COMMENT_MODE
+  ]);
+
+  return {
+    aliases: ['arcade'],
+    keywords: KEYWORDS,
+    contains: [
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      TEMPLATE_STRING,
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      SYMBOL,
+      NUMBER,
+      { // object attr container
+        begin: /[{,]\s*/, relevance: 0,
+        contains: [
+          {
+            begin: IDENT_RE + '\\s*:', returnBegin: true,
+            relevance: 0,
+            contains: [{className: 'attr', begin: IDENT_RE, relevance: 0}]
+          }
+        ]
+      },
+      { // "value" container
+        begin: '(' + hljs.RE_STARTERS_RE + '|\\b(return)\\b)\\s*',
+        keywords: 'return',
+        contains: [
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE,
+          hljs.REGEXP_MODE,
+          {
+            className: 'function',
+            begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>', returnBegin: true,
+            end: '\\s*=>',
+            contains: [
+              {
+                className: 'params',
+                variants: [
+                  {
+                    begin: IDENT_RE
+                  },
+                  {
+                    begin: /\(\s*\)/,
+                  },
+                  {
+                    begin: /\(/, end: /\)/,
+                    excludeBegin: true, excludeEnd: true,
+                    keywords: KEYWORDS,
+                    contains: PARAMS_CONTAINS
+                  }
+                ]
+              }
+            ]
+          }
+        ],
+        relevance: 0
+      },
+      {
+        className: 'function',
+        beginKeywords: 'function', end: /\{/, excludeEnd: true,
+        contains: [
+          hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
+          {
+            className: 'params',
+            begin: /\(/, end: /\)/,
+            excludeBegin: true,
+            excludeEnd: true,
+            contains: PARAMS_CONTAINS
+          }
+        ],
+        illegal: /\[|%/
+      },
+      {
+        begin: /\$[(.]/
+      }
+    ],
+    illegal: /#(?!!)/
+  };
+}
+},{name:"arduino",create:/*
+Language: Arduino
+Author: Stefania Mellai <s.mellai@arduino.cc>
+Description: The Arduino® Language is a superset of C++. This rules are designed to highlight the Arduino® source code. For info about language see http://www.arduino.cc.
+Requires: cpp.js
+*/
+
+function(hljs) {
+  var CPP = hljs.getLanguage('cpp').exports;
+	return {
+    keywords: {
+      keyword:
+        'boolean byte word string String array ' + CPP.keywords.keyword,
+      built_in:
+        'setup loop while catch for if do goto try switch case else ' +
+        'default break continue return ' +
+        'KeyboardController MouseController SoftwareSerial ' +
+        'EthernetServer EthernetClient LiquidCrystal ' +
+        'RobotControl GSMVoiceCall EthernetUDP EsploraTFT ' +
+        'HttpClient RobotMotor WiFiClient GSMScanner ' +
+        'FileSystem Scheduler GSMServer YunClient YunServer ' +
+        'IPAddress GSMClient GSMModem Keyboard Ethernet ' +
+        'Console GSMBand Esplora Stepper Process ' +
+        'WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage ' +
+        'Client Server GSMPIN FileIO Bridge Serial ' +
+        'EEPROM Stream Mouse Audio Servo File Task ' +
+        'GPRS WiFi Wire TFT GSM SPI SD ' +
+        'runShellCommandAsynchronously analogWriteResolution ' +
+        'retrieveCallingNumber printFirmwareVersion ' +
+        'analogReadResolution sendDigitalPortPair ' +
+        'noListenOnLocalhost readJoystickButton setFirmwareVersion ' +
+        'readJoystickSwitch scrollDisplayRight getVoiceCallStatus ' +
+        'scrollDisplayLeft writeMicroseconds delayMicroseconds ' +
+        'beginTransmission getSignalStrength runAsynchronously ' +
+        'getAsynchronously listenOnLocalhost getCurrentCarrier ' +
+        'readAccelerometer messageAvailable sendDigitalPorts ' +
+        'lineFollowConfig countryNameWrite runShellCommand ' +
+        'readStringUntil rewindDirectory readTemperature ' +
+        'setClockDivider readLightSensor endTransmission ' +
+        'analogReference detachInterrupt countryNameRead ' +
+        'attachInterrupt encryptionType readBytesUntil ' +
+        'robotNameWrite readMicrophone robotNameRead cityNameWrite ' +
+        'userNameWrite readJoystickY readJoystickX mouseReleased ' +
+        'openNextFile scanNetworks noInterrupts digitalWrite ' +
+        'beginSpeaker mousePressed isActionDone mouseDragged ' +
+        'displayLogos noAutoscroll addParameter remoteNumber ' +
+        'getModifiers keyboardRead userNameRead waitContinue ' +
+        'processInput parseCommand printVersion readNetworks ' +
+        'writeMessage blinkVersion cityNameRead readMessage ' +
+        'setDataMode parsePacket isListening setBitOrder ' +
+        'beginPacket isDirectory motorsWrite drawCompass ' +
+        'digitalRead clearScreen serialEvent rightToLeft ' +
+        'setTextSize leftToRight requestFrom keyReleased ' +
+        'compassRead analogWrite interrupts WiFiServer ' +
+        'disconnect playMelody parseFloat autoscroll ' +
+        'getPINUsed setPINUsed setTimeout sendAnalog ' +
+        'readSlider analogRead beginWrite createChar ' +
+        'motorsStop keyPressed tempoWrite readButton ' +
+        'subnetMask debugPrint macAddress writeGreen ' +
+        'randomSeed attachGPRS readString sendString ' +
+        'remotePort releaseAll mouseMoved background ' +
+        'getXChange getYChange answerCall getResult ' +
+        'voiceCall endPacket constrain getSocket writeJSON ' +
+        'getButton available connected findUntil readBytes ' +
+        'exitValue readGreen writeBlue startLoop IPAddress ' +
+        'isPressed sendSysex pauseMode gatewayIP setCursor ' +
+        'getOemKey tuneWrite noDisplay loadImage switchPIN ' +
+        'onRequest onReceive changePIN playFile noBuffer ' +
+        'parseInt overflow checkPIN knobRead beginTFT ' +
+        'bitClear updateIR bitWrite position writeRGB ' +
+        'highByte writeRed setSpeed readBlue noStroke ' +
+        'remoteIP transfer shutdown hangCall beginSMS ' +
+        'endWrite attached maintain noCursor checkReg ' +
+        'checkPUK shiftOut isValid shiftIn pulseIn ' +
+        'connect println localIP pinMode getIMEI ' +
+        'display noBlink process getBand running beginSD ' +
+        'drawBMP lowByte setBand release bitRead prepare ' +
+        'pointTo readRed setMode noFill remove listen ' +
+        'stroke detach attach noTone exists buffer ' +
+        'height bitSet circle config cursor random ' +
+        'IRread setDNS endSMS getKey micros ' +
+        'millis begin print write ready flush width ' +
+        'isPIN blink clear press mkdir rmdir close ' +
+        'point yield image BSSID click delay ' +
+        'read text move peek beep rect line open ' +
+        'seek fill size turn stop home find ' +
+        'step tone sqrt RSSI SSID ' +
+        'end bit tan cos sin pow map abs max ' +
+        'min get run put',
+      literal:
+        'DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE ' +
+        'REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP ' +
+        'SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN ' +
+        'INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL ' +
+        'DEFAULT OUTPUT INPUT HIGH LOW'
+    },
+    contains: [
+      CPP.preprocessor,
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      hljs.C_NUMBER_MODE
+    ]
+  };
+}
+},{name:"armasm",create:/*
+Language: ARM Assembly
+Author: Dan Panzarella <alsoelp@gmail.com>
+Description: ARM Assembly including Thumb and Thumb2 instructions
+Category: assembler
+*/
+
+function(hljs) {
+    //local labels: %?[FB]?[AT]?\d{1,2}\w+
+  return {
+    case_insensitive: true,
+    aliases: ['arm'],
+    lexemes: '\\.?' + hljs.IDENT_RE,
+    keywords: {
+      meta:
+        //GNU preprocs
+        '.2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg '+
+        //ARM directives
+        'ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ',
+      built_in:
+        'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 '+ //standard registers
+        'pc lr sp ip sl sb fp '+ //typical regs plus backward compatibility
+        'a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 '+ //more regs and fp
+        'p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 '+ //coprocessor regs
+        'c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 '+ //more coproc
+        'q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 '+ //advanced SIMD NEON regs
+
+        //program status registers
+        'cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf '+
+        'spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf '+
+
+        //NEON and VFP registers
+        's0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 '+
+        's16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 '+
+        'd0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 '+
+        'd16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 ' +
+
+        '{PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @'
+    },
+    contains: [
+      {
+        className: 'keyword',
+        begin: '\\b('+     //mnemonics
+            'adc|'+
+            '(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|'+
+            'and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|'+
+            'bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|'+
+            'setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|'+
+            'ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|'+
+            'mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|'+
+            'mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|'+
+            'mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|'+
+            'rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|'+
+            'stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|'+
+            '[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|'+
+            'wfe|wfi|yield'+
+        ')'+
+        '(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?'+ //condition codes
+        '[sptrx]?' ,                                             //legal postfixes
+        end: '\\s'
+      },
+      hljs.COMMENT('[;@]', '$', {relevance: 0}),
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.QUOTE_STRING_MODE,
+      {
+        className: 'string',
+        begin: '\'',
+        end: '[^\\\\]\'',
+        relevance: 0
+      },
+      {
+        className: 'title',
+        begin: '\\|', end: '\\|',
+        illegal: '\\n',
+        relevance: 0
+      },
+      {
+        className: 'number',
+        variants: [
+            {begin: '[#$=]?0x[0-9a-f]+'}, //hex
+            {begin: '[#$=]?0b[01]+'},     //bin
+            {begin: '[#$=]\\d+'},        //literal
+            {begin: '\\b\\d+'}           //bare number
+        ],
+        relevance: 0
+      },
+      {
+        className: 'symbol',
+        variants: [
+            {begin: '^[a-z_\\.\\$][a-z0-9_\\.\\$]+'}, //ARM syntax
+            {begin: '^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:'}, //GNU ARM syntax
+            {begin: '[=#]\\w+' }  //label reference
+        ],
+        relevance: 0
+      }
+    ]
+  };
+}
+},{name:"asciidoc",create:/*
+Language: AsciiDoc
+Requires: xml.js
+Author: Dan Allen <dan.j.allen@gmail.com>
+Website: http://google.com/profiles/dan.j.allen
+Description: A semantic, text-based document format that can be exported to HTML, DocBook and other backends.
+Category: markup
+*/
+
+function(hljs) {
+  return {
+    aliases: ['adoc'],
+    contains: [
+      // block comment
+      hljs.COMMENT(
+        '^/{4,}\\n',
+        '\\n/{4,}$',
+        // can also be done as...
+        //'^/{4,}$',
+        //'^/{4,}$',
+        {
+          relevance: 10
+        }
+      ),
+      // line comment
+      hljs.COMMENT(
+        '^//',
+        '$',
+        {
+          relevance: 0
+        }
+      ),
+      // title
+      {
+        className: 'title',
+        begin: '^\\.\\w.*$'
+      },
+      // example, admonition & sidebar blocks
+      {
+        begin: '^[=\\*]{4,}\\n',
+        end: '\\n^[=\\*]{4,}$',
+        relevance: 10
+      },
+      // headings
+      {
+        className: 'section',
+        relevance: 10,
+        variants: [
+          {begin: '^(={1,5}) .+?( \\1)?$'},
+          {begin: '^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$'},
+        ]
+      },
+      // document attributes
+      {
+        className: 'meta',
+        begin: '^:.+?:',
+        end: '\\s',
+        excludeEnd: true,
+        relevance: 10
+      },
+      // block attributes
+      {
+        className: 'meta',
+        begin: '^\\[.+?\\]$',
+        relevance: 0
+      },
+      // quoteblocks
+      {
+        className: 'quote',
+        begin: '^_{4,}\\n',
+        end: '\\n_{4,}$',
+        relevance: 10
+      },
+      // listing and literal blocks
+      {
+        className: 'code',
+        begin: '^[\\-\\.]{4,}\\n',
+        end: '\\n[\\-\\.]{4,}$',
+        relevance: 10
+      },
+      // passthrough blocks
+      {
+        begin: '^\\+{4,}\\n',
+        end: '\\n\\+{4,}$',
+        contains: [
+          {
+            begin: '<', end: '>',
+            subLanguage: 'xml',
+            relevance: 0
+          }
+        ],
+        relevance: 10
+      },
+      // lists (can only capture indicators)
+      {
+        className: 'bullet',
+        begin: '^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+'
+      },
+      // admonition
+      {
+        className: 'symbol',
+        begin: '^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+',
+        relevance: 10
+      },
+      // inline strong
+      {
+        className: 'strong',
+        // must not follow a word character or be followed by an asterisk or space
+        begin: '\\B\\*(?![\\*\\s])',
+        end: '(\\n{2}|\\*)',
+        // allow escaped asterisk followed by word char
+        contains: [
+          {
+            begin: '\\\\*\\w',
+            relevance: 0
+          }
+        ]
+      },
+      // inline emphasis
+      {
+        className: 'emphasis',
+        // must not follow a word character or be followed by a single quote or space
+        begin: '\\B\'(?![\'\\s])',
+        end: '(\\n{2}|\')',
+        // allow escaped single quote followed by word char
+        contains: [
+          {
+            begin: '\\\\\'\\w',
+            relevance: 0
+          }
+        ],
+        relevance: 0
+      },
+      // inline emphasis (alt)
+      {
+        className: 'emphasis',
+        // must not follow a word character or be followed by an underline or space
+        begin: '_(?![_\\s])',
+        end: '(\\n{2}|_)',
+        relevance: 0
+      },
+      // inline smart quotes
+      {
+        className: 'string',
+        variants: [
+          {begin: "``.+?''"},
+          {begin: "`.+?'"}
+        ]
+      },
+      // inline code snippets (TODO should get same treatment as strong and emphasis)
+      {
+        className: 'code',
+        begin: '(`.+?`|\\+.+?\\+)',
+        relevance: 0
+      },
+      // indented literal block
+      {
+        className: 'code',
+        begin: '^[ \\t]',
+        end: '$',
+        relevance: 0
+      },
+      // horizontal rules
+      {
+        begin: '^\'{3,}[ \\t]*$',
+        relevance: 10
+      },
+      // images and links
+      {
+        begin: '(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]',
+        returnBegin: true,
+        contains: [
+          {
+            begin: '(link|image:?):',
+            relevance: 0
+          },
+          {
+            className: 'link',
+            begin: '\\w',
+            end: '[^\\[]+',
+            relevance: 0
+          },
+          {
+            className: 'string',
+            begin: '\\[',
+            end: '\\]',
+            excludeBegin: true,
+            excludeEnd: true,
+            relevance: 0
+          }
+        ],
+        relevance: 10
+      }
+    ]
+  };
+}
+},{name:"aspectj",create:/*
+Language: AspectJ
+Author: Hakan Ozler <ozler.hakan@gmail.com>
+Description: Syntax Highlighting for the AspectJ Language which is a general-purpose aspect-oriented extension to the Java programming language.
+ */
+function (hljs) {
+  var KEYWORDS =
+    'false synchronized int abstract float private char boolean static null if const ' +
+    'for true while long throw strictfp finally protected import native final return void ' +
+    'enum else extends implements break transient new catch instanceof byte super volatile case ' +
+    'assert short package default double public try this switch continue throws privileged ' +
+    'aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization ' +
+    'staticinitialization withincode target within execution getWithinTypeName handler ' +
+    'thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents '+
+    'warning error soft precedence thisAspectInstance';
+  var SHORTKEYS = 'get set args call';
+  return {
+    keywords : KEYWORDS,
+    illegal : /<\/|#/,
+    contains : [
+      hljs.COMMENT(
+        '/\\*\\*',
+        '\\*/',
+        {
+          relevance : 0,
+          contains : [
+            {
+              // eat up @'s in emails to prevent them to be recognized as doctags
+              begin: /\w+@/, relevance: 0
+            },
+            {
+              className : 'doctag',
+              begin : '@[A-Za-z]+'
+            }
+          ]
+        }
+      ),
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      {
+        className : 'class',
+        beginKeywords : 'aspect',
+        end : /[{;=]/,
+        excludeEnd : true,
+        illegal : /[:;"\[\]]/,
+        contains : [
+          {
+            beginKeywords : 'extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton'
+          },
+          hljs.UNDERSCORE_TITLE_MODE,
+          {
+            begin : /\([^\)]*/,
+            end : /[)]+/,
+            keywords : KEYWORDS + ' ' + SHORTKEYS,
+            excludeEnd : false
+          }
+        ]
+      },
+      {
+        className : 'class',
+        beginKeywords : 'class interface',
+        end : /[{;=]/,
+        excludeEnd : true,
+        relevance: 0,
+        keywords : 'class interface',
+        illegal : /[:"\[\]]/,
+        contains : [
+          {beginKeywords : 'extends implements'},
+          hljs.UNDERSCORE_TITLE_MODE
+        ]
+      },
+      {
+        // AspectJ Constructs
+        beginKeywords : 'pointcut after before around throwing returning',
+        end : /[)]/,
+        excludeEnd : false,
+        illegal : /["\[\]]/,
+        contains : [
+          {
+            begin : hljs.UNDERSCORE_IDENT_RE + '\\s*\\(',
+            returnBegin : true,
+            contains : [hljs.UNDERSCORE_TITLE_MODE]
+          }
+        ]
+      },
+      {
+        begin : /[:]/,
+        returnBegin : true,
+        end : /[{;]/,
+        relevance: 0,
+        excludeEnd : false,
+        keywords : KEYWORDS,
+        illegal : /["\[\]]/,
+        contains : [
+          {
+            begin : hljs.UNDERSCORE_IDENT_RE + '\\s*\\(',
+            keywords : KEYWORDS + ' ' + SHORTKEYS,
+            relevance: 0
+          },
+          hljs.QUOTE_STRING_MODE
+        ]
+      },
+      {
+        // this prevents 'new Name(...), or throw ...' from being recognized as a function definition
+        beginKeywords : 'new throw',
+        relevance : 0
+      },
+      {
+        // the function class is a bit different for AspectJ compared to the Java language
+        className : 'function',
+        begin : /\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,
+        returnBegin : true,
+        end : /[{;=]/,
+        keywords : KEYWORDS,
+        excludeEnd : true,
+        contains : [
+          {
+            begin : hljs.UNDERSCORE_IDENT_RE + '\\s*\\(',
+            returnBegin : true,
+            relevance: 0,
+            contains : [hljs.UNDERSCORE_TITLE_MODE]
+          },
+          {
+            className : 'params',
+            begin : /\(/, end : /\)/,
+            relevance: 0,
+            keywords : KEYWORDS,
+            contains : [
+              hljs.APOS_STRING_MODE,
+              hljs.QUOTE_STRING_MODE,
+              hljs.C_NUMBER_MODE,
+              hljs.C_BLOCK_COMMENT_MODE
+            ]
+          },
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
+        ]
+      },
+      hljs.C_NUMBER_MODE,
+      {
+        // annotation is also used in this language
+        className : 'meta',
+        begin : '@[A-Za-z]+'
+      }
+    ]
+  };
+}
+},{name:"autohotkey",create:/*
+Language: AutoHotkey
+Author: Seongwon Lee <dlimpid@gmail.com>
+Description: AutoHotkey language definition
+Category: scripting
+*/
+
+function(hljs) {
+  var BACKTICK_ESCAPE = {
+    begin: '`[\\s\\S]'
+  };
+
+  return {
+    case_insensitive: true,
+    aliases: [ 'ahk' ],
+    keywords: {
+      keyword: 'Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group',
+      literal: 'true false NOT AND OR',
+      built_in: 'ComSpec Clipboard ClipboardAll ErrorLevel',
+    },
+    contains: [
+      BACKTICK_ESCAPE,
+      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [BACKTICK_ESCAPE]}),
+      hljs.COMMENT(';', '$', {relevance: 0}),
+      hljs.C_BLOCK_COMMENT_MODE,
+      {
+        className: 'number',
+        begin: hljs.NUMBER_RE,
+        relevance: 0
+      },
+      {
+        className: 'variable', //subst would be the most accurate however fails the point of highlighting. variable is comparably the most accurate that actually has some effect
+        begin: '%[a-zA-Z0-9#_$@]+%'
+      },
+      {
+        className: 'built_in',
+        begin: '^\\s*\\w+\\s*(,|%)'
+        //I don't really know if this is totally relevant
+      },
+      {
+        className: 'title', //symbol would be most accurate however is higlighted just like built_in and that makes up a lot of AutoHotkey code
+		                        //meaning that it would fail to highlight anything
+        variants: [
+          {begin: '^[^\\n";]+::(?!=)'},
+          {begin: '^[^\\n";]+:(?!=)', relevance: 0} // zero relevance as it catches a lot of things
+                                                    // followed by a single ':' in many languages
+        ]
+      },
+      {
+        className: 'meta', 
+        begin: '^\\s*#\\w+', end:'$',
+        relevance: 0
+      },
+	    {
+        className: 'built_in',
+        begin: 'A_[a-zA-Z0-9]+'
+      },
+      {
+        // consecutive commas, not for highlighting but just for relevance
+        begin: ',\\s*,'
+      }
+    ]
+  }
+}
+},{name:"autoit",create:/*
+Language: AutoIt
+Author: Manh Tuan <junookyo@gmail.com>
+Description: AutoIt language definition
+Category: scripting
+*/
+
+function(hljs) {
+    var KEYWORDS = 'ByRef Case Const ContinueCase ContinueLoop ' +
+        'Default Dim Do Else ElseIf EndFunc EndIf EndSelect ' +
+        'EndSwitch EndWith Enum Exit ExitLoop For Func ' +
+        'Global If In Local Next ReDim Return Select Static ' +
+        'Step Switch Then To Until Volatile WEnd While With',
+
+        LITERAL = 'True False And Null Not Or',
+
+        BUILT_IN =
+          'Abs ACos AdlibRegister AdlibUnRegister Asc AscW ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle Beep Binary BinaryLen BinaryMid BinaryToString BitAND BitNOT BitOR BitRotate BitShift BitXOR BlockInput Break Call CDTray Ceiling Chr ChrW ClipGet ClipPut ConsoleRead ConsoleWrite ConsoleWriteError ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow ControlTreeView Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllCallAddress DllCallbackFree DllCallbackGetPtr DllCallbackRegister DllClose DllOpen DllStructCreate DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Execute Exp FileChangeDir FileClose FileCopy FileCreateNTFSLink FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileFlush FileGetAttrib FileGetEncoding FileGetLongName FileGetPos FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileReadToArray FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetEnd FileSetPos FileSetTime FileWrite FileWriteLine Floor FtpSetProxy FuncName GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetHandle GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlRegisterListViewSort GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetDefBkColor GUICtrlSetDefColor GUICtrlSetFont GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUIGetStyle GUIRegisterMsg GUISetAccelerators GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUISetStyle GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy HttpSetUserAgent HWnd InetClose InetGet InetGetInfo InetGetSize InetRead IniDelete IniRead IniReadSection IniReadSectionNames IniRenameSection IniWrite IniWriteSection InputBox Int IsAdmin IsArray IsBinary IsBool IsDeclared IsDllStruct IsFloat IsFunc IsHWnd IsInt IsKeyword IsNumber IsObj IsPtr IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number ObjCreate ObjCreateInterface ObjEvent ObjGet ObjName OnAutoItExitRegister OnAutoItExitUnRegister Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessGetStats ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Ptr Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAs RunAsWait RunWait Send SendKeepActive SetError SetExtended ShellExecute ShellExecuteWait Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt SRandom StatusbarGetText StderrRead StdinWrite StdioClose StdoutRead String StringAddCR StringCompare StringFormat StringFromASCIIArray StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringRegExp StringRegExpReplace StringReplace StringReverse StringRight StringSplit StringStripCR StringStripWS StringToASCIIArray StringToBinary StringTrimLeft StringTrimRight StringUpper Tan TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIP TCPRecv TCPSend TCPShutdown, UDPShutdown TCPStartup, UDPStartup TimerDiff TimerInit ToolTip TrayCreateItem TrayCreateMenu TrayGetMsg TrayItemDelete TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent TrayItemSetState TrayItemSetText TraySetClick TraySetIcon TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip UBound UDPBind UDPCloseSocket UDPOpen UDPRecv UDPSend VarGetType WinActivate WinActive WinClose WinExists WinFlash WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait',
+
+        COMMENT = {
+            variants: [
+              hljs.COMMENT(';', '$', {relevance: 0}),
+              hljs.COMMENT('#cs', '#ce'),
+              hljs.COMMENT('#comments-start', '#comments-end')
+            ]
+        },
+
+        VARIABLE = {
+            begin: '\\$[A-z0-9_]+'
+        },
+
+        STRING = {
+            className: 'string',
+            variants: [{
+                begin: /"/,
+                end: /"/,
+                contains: [{
+                    begin: /""/,
+                    relevance: 0
+                }]
+            }, {
+                begin: /'/,
+                end: /'/,
+                contains: [{
+                    begin: /''/,
+                    relevance: 0
+                }]
+            }]
+        },
+
+        NUMBER = {
+            variants: [hljs.BINARY_NUMBER_MODE, hljs.C_NUMBER_MODE]
+        },
+
+        PREPROCESSOR = {
+            className: 'meta',
+            begin: '#',
+            end: '$',
+            keywords: {'meta-keyword': 'comments include include-once NoTrayIcon OnAutoItStartRegister pragma compile RequireAdmin'},
+            contains: [{
+                    begin: /\\\n/,
+                    relevance: 0
+                }, {
+                    beginKeywords: 'include',
+                    keywords: {'meta-keyword': 'include'},
+                    end: '$',
+                    contains: [
+                        STRING, {
+                            className: 'meta-string',
+                            variants: [{
+                                begin: '<',
+                                end: '>'
+                            }, {
+                                begin: /"/,
+                                end: /"/,
+                                contains: [{
+                                    begin: /""/,
+                                    relevance: 0
+                                }]
+                            }, {
+                                begin: /'/,
+                                end: /'/,
+                                contains: [{
+                                    begin: /''/,
+                                    relevance: 0
+                                }]
+                            }]
+                        }
+                    ]
+                },
+                STRING,
+                COMMENT
+            ]
+        },
+
+        CONSTANT = {
+            className: 'symbol',
+            // begin: '@',
+            // end: '$',
+            // keywords: 'AppDataCommonDir AppDataDir AutoItExe AutoItPID AutoItVersion AutoItX64 COM_EventObj CommonFilesDir Compiled ComputerName ComSpec CPUArch CR CRLF DesktopCommonDir DesktopDepth DesktopDir DesktopHeight DesktopRefresh DesktopWidth DocumentsCommonDir error exitCode exitMethod extended FavoritesCommonDir FavoritesDir GUI_CtrlHandle GUI_CtrlId GUI_DragFile GUI_DragId GUI_DropId GUI_WinHandle HomeDrive HomePath HomeShare HotKeyPressed HOUR IPAddress1 IPAddress2 IPAddress3 IPAddress4 KBLayout LF LocalAppDataDir LogonDNSDomain LogonDomain LogonServer MDAY MIN MON MSEC MUILang MyDocumentsDir NumParams OSArch OSBuild OSLang OSServicePack OSType OSVersion ProgramFilesDir ProgramsCommonDir ProgramsDir ScriptDir ScriptFullPath ScriptLineNumber ScriptName SEC StartMenuCommonDir StartMenuDir StartupCommonDir StartupDir SW_DISABLE SW_ENABLE SW_HIDE SW_LOCK SW_MAXIMIZE SW_MINIMIZE SW_RESTORE SW_SHOW SW_SHOWDEFAULT SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWMINNOACTIVE SW_SHOWNA SW_SHOWNOACTIVATE SW_SHOWNORMAL SW_UNLOCK SystemDir TAB TempDir TRAY_ID TrayIconFlashing TrayIconVisible UserName UserProfileDir WDAY WindowsDir WorkingDir YDAY YEAR',
+            // relevance: 5
+            begin: '@[A-z0-9_]+'
+        },
+
+        FUNCTION = {
+            className: 'function',
+            beginKeywords: 'Func',
+            end: '$',
+            illegal: '\\$|\\[|%',
+            contains: [
+                hljs.UNDERSCORE_TITLE_MODE, {
+                    className: 'params',
+                    begin: '\\(',
+                    end: '\\)',
+                    contains: [
+                        VARIABLE,
+                        STRING,
+                        NUMBER
+                    ]
+                }
+            ]
+        };
+
+    return {
+        case_insensitive: true,
+        illegal: /\/\*/,
+        keywords: {
+            keyword: KEYWORDS,
+            built_in: BUILT_IN,
+            literal: LITERAL
+        },
+        contains: [
+            COMMENT,
+            VARIABLE,
+            STRING,
+            NUMBER,
+            PREPROCESSOR,
+            CONSTANT,
+            FUNCTION
+        ]
+    }
+}
+},{name:"avrasm",create:/*
+Language: AVR Assembler
+Author: Vladimir Ermakov <vooon341@gmail.com>
+Category: assembler
+*/
+
+function(hljs) {
+  return {
+    case_insensitive: true,
+    lexemes: '\\.?' + hljs.IDENT_RE,
+    keywords: {
+      keyword:
+        /* mnemonic */
+        'adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs ' +
+        'brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr ' +
+        'clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor ' +
+        'fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul ' +
+        'muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs ' +
+        'sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub ' +
+        'subi swap tst wdr',
+      built_in:
+        /* general purpose registers */
+        'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 ' +
+        'r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ' +
+        /* IO Registers (ATMega128) */
+        'ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h ' +
+        'tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ' +
+        'ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ' +
+        'ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk ' +
+        'tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ' +
+        'ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr ' +
+        'porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ' +
+        'ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf',
+      meta:
+        '.byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list ' +
+        '.listmac .macro .nolist .org .set'
+    },
+    contains: [
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.COMMENT(
+        ';',
+        '$',
+        {
+          relevance: 0
+        }
+      ),
+      hljs.C_NUMBER_MODE, // 0x..., decimal, float
+      hljs.BINARY_NUMBER_MODE, // 0b...
+      {
+        className: 'number',
+        begin: '\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)' // $..., 0o...
+      },
+      hljs.QUOTE_STRING_MODE,
+      {
+        className: 'string',
+        begin: '\'', end: '[^\\\\]\'',
+        illegal: '[^\\\\][^\']'
+      },
+      {className: 'symbol',  begin: '^[A-Za-z0-9_.$]+:'},
+      {className: 'meta', begin: '#', end: '$'},
+      {  // подстановка в «.macro»
+        className: 'subst',
+        begin: '@[0-9]+'
+      }
+    ]
+  };
+}
+},{name:"awk",create:/*
+Language: Awk
+Author: Matthew Daly <matthewbdaly@gmail.com>
+Website: http://matthewdaly.co.uk/
+Description: language definition for Awk scripts
+*/
+
+function(hljs) {
+  var VARIABLE = {
+    className: 'variable',
+    variants: [
+      {begin: /\$[\w\d#@][\w\d_]*/},
+      {begin: /\$\{(.*?)}/}
+    ]
+  };
+  var KEYWORDS = 'BEGIN END if else while do for in break continue delete next nextfile function func exit|10';
+  var STRING = {
+    className: 'string',
+    contains: [hljs.BACKSLASH_ESCAPE],
+    variants: [
+      {
+        begin: /(u|b)?r?'''/, end: /'''/,
+        relevance: 10
+      },
+      {
+        begin: /(u|b)?r?"""/, end: /"""/,
+        relevance: 10
+      },
+      {
+        begin: /(u|r|ur)'/, end: /'/,
+        relevance: 10
+      },
+      {
+        begin: /(u|r|ur)"/, end: /"/,
+        relevance: 10
+      },
+      {
+        begin: /(b|br)'/, end: /'/
+      },
+      {
+        begin: /(b|br)"/, end: /"/
+      },
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE
+    ]
+  };
+  return {
+	 keywords: {
+	   keyword: KEYWORDS
+    },
+    contains: [
+      VARIABLE,
+      STRING,
+      hljs.REGEXP_MODE,
+      hljs.HASH_COMMENT_MODE,
+      hljs.NUMBER_MODE
+    ]
+  }
+}
+},{name:"axapta",create:/*
+Language: Axapta
+Author: Dmitri Roudakov <dmitri@roudakov.ru>
+Category: enterprise
+*/
+
+function(hljs) {
+  return {
+    keywords: 'false int abstract private char boolean static null if for true ' +
+      'while long throw finally protected final return void enum else ' +
+      'break new catch byte super case short default double public try this switch ' +
+      'continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count ' +
+      'order group by asc desc index hint like dispaly edit client server ttsbegin ' +
+      'ttscommit str real date container anytype common div mod',
+    contains: [
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      hljs.C_NUMBER_MODE,
+      {
+        className: 'meta',
+        begin: '#', end: '$'
+      },
+      {
+        className: 'class',
+        beginKeywords: 'class interface', end: '{', excludeEnd: true,
+        illegal: ':',
+        contains: [
+          {beginKeywords: 'extends implements'},
+          hljs.UNDERSCORE_TITLE_MODE
+        ]
+      }
+    ]
+  };
+}
+},{name:"bash",create:/*
+Language: Bash
+Author: vah <vahtenberg@gmail.com>
+Contributrors: Benjamin Pannell <contact@sierrasoftworks.com>
+Category: common
+*/
+
+function(hljs) {
+  var VAR = {
+    className: 'variable',
+    variants: [
+      {begin: /\$[\w\d#@][\w\d_]*/},
+      {begin: /\$\{(.*?)}/}
+    ]
+  };
+  var QUOTE_STRING = {
+    className: 'string',
+    begin: /"/, end: /"/,
+    contains: [
+      hljs.BACKSLASH_ESCAPE,
+      VAR,
+      {
+        className: 'variable',
+        begin: /\$\(/, end: /\)/,
+        contains: [hljs.BACKSLASH_ESCAPE]
+      }
+    ]
+  };
+  var ESCAPED_QUOTE = {
+    className: '',
+    begin: /\\"/
+
+  };
+  var APOS_STRING = {
+    className: 'string',
+    begin: /'/, end: /'/
+  };
+
+  return {
+    aliases: ['sh', 'zsh'],
+    lexemes: /\b-?[a-z\._]+\b/,
+    keywords: {
+      keyword:
+        'if then else elif fi for while in do done case esac function',
+      literal:
+        'true false',
+      built_in:
+        // Shell built-ins
+        // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
+        'break cd continue eval exec exit export getopts hash pwd readonly return shift test times ' +
+        'trap umask unset ' +
+        // Bash built-ins
+        'alias bind builtin caller command declare echo enable help let local logout mapfile printf ' +
+        'read readarray source type typeset ulimit unalias ' +
+        // Shell modifiers
+        'set shopt ' +
+        // Zsh built-ins
+        'autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles ' +
+        'compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate ' +
+        'fc fg float functions getcap getln history integer jobs kill limit log noglob popd print ' +
+        'pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit ' +
+        'unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof ' +
+        'zpty zregexparse zsocket zstyle ztcp',
+      _:
+        '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster
+    },
+    contains: [
+      {
+        className: 'meta',
+        begin: /^#![^\n]+sh\s*$/,
+        relevance: 10
+      },
+      {
+        className: 'function',
+        begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
+        returnBegin: true,
+        contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\w[\w\d_]*/})],
+        relevance: 0
+      },
+      hljs.HASH_COMMENT_MODE,
+      QUOTE_STRING,
+      ESCAPED_QUOTE,
+      APOS_STRING,
+      VAR
+    ]
+  };
+}
+},{name:"basic",create:/*
+Language: Basic
+Author: Raphaël Assénat <raph@raphnet.net>
+Description: Based on the BASIC reference from the Tandy 1000 guide
+*/
+function(hljs) {
+  return {
+    case_insensitive: true,
+    illegal: '^\.',
+    // Support explicitely typed variables that end with $%! or #.
+    lexemes: '[a-zA-Z][a-zA-Z0-9_\$\%\!\#]*',
+    keywords: {
+        keyword:
+          'ABS ASC AND ATN AUTO|0 BEEP BLOAD|10 BSAVE|10 CALL CALLS CDBL CHAIN CHDIR CHR$|10 CINT CIRCLE ' +
+          'CLEAR CLOSE CLS COLOR COM COMMON CONT COS CSNG CSRLIN CVD CVI CVS DATA DATE$ ' +
+          'DEFDBL DEFINT DEFSNG DEFSTR DEF|0 SEG USR DELETE DIM DRAW EDIT END ENVIRON ENVIRON$ ' +
+          'EOF EQV ERASE ERDEV ERDEV$ ERL ERR ERROR EXP FIELD FILES FIX FOR|0 FRE GET GOSUB|10 GOTO ' +
+          'HEX$ IF|0 THEN ELSE|0 INKEY$ INP INPUT INPUT# INPUT$ INSTR IMP INT IOCTL IOCTL$ KEY ON ' +
+          'OFF LIST KILL LEFT$ LEN LET LINE LLIST LOAD LOC LOCATE LOF LOG LPRINT USING LSET ' +
+          'MERGE MID$ MKDIR MKD$ MKI$ MKS$ MOD NAME NEW NEXT NOISE NOT OCT$ ON OR PEN PLAY STRIG OPEN OPTION ' +
+          'BASE OUT PAINT PALETTE PCOPY PEEK PMAP POINT POKE POS PRINT PRINT] PSET PRESET ' +
+          'PUT RANDOMIZE READ REM RENUM RESET|0 RESTORE RESUME RETURN|0 RIGHT$ RMDIR RND RSET ' +
+          'RUN SAVE SCREEN SGN SHELL SIN SOUND SPACE$ SPC SQR STEP STICK STOP STR$ STRING$ SWAP ' +
+          'SYSTEM TAB TAN TIME$ TIMER TROFF TRON TO USR VAL VARPTR VARPTR$ VIEW WAIT WHILE ' +
+          'WEND WIDTH WINDOW WRITE XOR'
+    },
+    contains: [
+      hljs.QUOTE_STRING_MODE,
+      hljs.COMMENT('REM', '$', {relevance: 10}),
+      hljs.COMMENT('\'', '$', {relevance: 0}),
+      {
+        // Match line numbers
+        className: 'symbol',
+        begin: '^[0-9]+\ ',
+        relevance: 10
+      },
+      {
+        // Match typed numeric constants (1000, 12.34!, 1.2e5, 1.5#, 1.2D2)
+        className: 'number',
+        begin: '\\b([0-9]+[0-9edED\.]*[#\!]?)',
+        relevance: 0
+      },
+      {
+        // Match hexadecimal numbers (&Hxxxx)
+        className: 'number',
+        begin: '(\&[hH][0-9a-fA-F]{1,4})'
+      },
+      {
+        // Match octal numbers (&Oxxxxxx)
+        className: 'number',
+        begin: '(\&[oO][0-7]{1,6})'
+      }
+    ]
+  };
+}
+},{name:"bnf",create:/*
+Language: Backus–Naur Form
+Author: Oleg Efimov <efimovov@gmail.com>
+*/
+
+function(hljs){
+  return {
+    contains: [
+      // Attribute
+      {
+        className: 'attribute',
+        begin: /</, end: />/
+      },
+      // Specific
+      {
+        begin: /::=/,
+        starts: {
+          end: /$/,
+          contains: [
+            {
+              begin: /</, end: />/
+            },
+            // Common
+            hljs.C_LINE_COMMENT_MODE,
+            hljs.C_BLOCK_COMMENT_MODE,
+            hljs.APOS_STRING_MODE,
+            hljs.QUOTE_STRING_MODE
+          ]
+        }
+      }
+    ]
+  };
+}
+},{name:"brainfuck",create:/*
+Language: Brainfuck
+Author: Evgeny Stepanischev <imbolk@gmail.com>
+*/
+
+function(hljs){
+  var LITERAL = {
+    className: 'literal',
+    begin: '[\\+\\-]',
+    relevance: 0
+  };
+  return {
+    aliases: ['bf'],
+    contains: [
+      hljs.COMMENT(
+        '[^\\[\\]\\.,\\+\\-<> \r\n]',
+        '[\\[\\]\\.,\\+\\-<> \r\n]',
+        {
+          returnEnd: true,
+          relevance: 0
+        }
+      ),
+      {
+        className: 'title',
+        begin: '[\\[\\]]',
+        relevance: 0
+      },
+      {
+        className: 'string',
+        begin: '[\\.,]',
+        relevance: 0
+      },
+      {
+        // this mode works as the only relevance counter
+        begin: /\+\+|\-\-/, returnBegin: true,
+        contains: [LITERAL]
+      },
+      LITERAL
+    ]
+  };
+}
+},{name:"cal",create:/*
+Language: C/AL
+Author: Kenneth Fuglsang Christensen <kfuglsang@gmail.com>
+Description: Provides highlighting of Microsoft Dynamics NAV C/AL code files
+*/
+
+function(hljs) {
+  var KEYWORDS =
+    'div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to ' +
+    'until while with var';
+  var LITERALS = 'false true';
+  var COMMENT_MODES = [
+    hljs.C_LINE_COMMENT_MODE,
+    hljs.COMMENT(
+      /\{/,
+      /\}/,
+      {
+        relevance: 0
+      }
+    ),
+    hljs.COMMENT(
+      /\(\*/,
+      /\*\)/,
+      {
+        relevance: 10
+      }
+    )
+  ];
+  var STRING = {
+    className: 'string',
+    begin: /'/, end: /'/,
+    contains: [{begin: /''/}]
+  };
+  var CHAR_STRING = {
+    className: 'string', begin: /(#\d+)+/
+  };
+  var DATE = {
+      className: 'number',
+      begin: '\\b\\d+(\\.\\d+)?(DT|D|T)',
+      relevance: 0
+  };
+  var DBL_QUOTED_VARIABLE = {
+      className: 'string', // not a string technically but makes sense to be highlighted in the same style
+      begin: '"',
+      end: '"'
+  };
+
+  var PROCEDURE = {
+    className: 'function',
+    beginKeywords: 'procedure', end: /[:;]/,
+    keywords: 'procedure|10',
+    contains: [
+      hljs.TITLE_MODE,
+      {
+        className: 'params',
+        begin: /\(/, end: /\)/,
+        keywords: KEYWORDS,
+        contains: [STRING, CHAR_STRING]
+      }
+    ].concat(COMMENT_MODES)
+  };
+
+  var OBJECT = {
+    className: 'class',
+    begin: 'OBJECT (Table|Form|Report|Dataport|Codeunit|XMLport|MenuSuite|Page|Query) (\\d+) ([^\\r\\n]+)',
+    returnBegin: true,
+    contains: [
+      hljs.TITLE_MODE,
+        PROCEDURE
+    ]
+  };
+
+  return {
+    case_insensitive: true,
+    keywords: { keyword: KEYWORDS, literal: LITERALS },
+    illegal: /\/\*/,
+    contains: [
+      STRING, CHAR_STRING,
+      DATE, DBL_QUOTED_VARIABLE,
+      hljs.NUMBER_MODE,
+      OBJECT,
+      PROCEDURE
+    ]
+  };
+}
+},{name:"capnproto",create:/*
+Language: Cap’n Proto
+Author: Oleg Efimov <efimovov@gmail.com>
+Description: Cap’n Proto message definition format
+Category: protocols
+*/
+
+function(hljs) {
+  return {
+    aliases: ['capnp'],
+    keywords: {
+      keyword:
+        'struct enum interface union group import using const annotation extends in of on as with from fixed',
+      built_in:
+        'Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 ' +
+        'Text Data AnyPointer AnyStruct Capability List',
+      literal:
+        'true false'
+    },
+    contains: [
+      hljs.QUOTE_STRING_MODE,
+      hljs.NUMBER_MODE,
+      hljs.HASH_COMMENT_MODE,
+      {
+        className: 'meta',
+        begin: /@0x[\w\d]{16};/,
+        illegal: /\n/
+      },
+      {
+        className: 'symbol',
+        begin: /@\d+\b/
+      },
+      {
+        className: 'class',
+        beginKeywords: 'struct enum', end: /\{/,
+        illegal: /\n/,
+        contains: [
+          hljs.inherit(hljs.TITLE_MODE, {
+            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title
+          })
+        ]
+      },
+      {
+        className: 'class',
+        beginKeywords: 'interface', end: /\{/,
+        illegal: /\n/,
+        contains: [
+          hljs.inherit(hljs.TITLE_MODE, {
+            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title
+          })
+        ]
+      }
+    ]
+  };
+}
+},{name:"ceylon",create:/*
+Language: Ceylon
+Author: Lucas Werkmeister <mail@lucaswerkmeister.de>
+*/
+function(hljs) {
+  // 2.3. Identifiers and keywords
+  var KEYWORDS =
+    'assembly module package import alias class interface object given value ' +
+    'assign void function new of extends satisfies abstracts in out return ' +
+    'break continue throw assert dynamic if else switch case for while try ' +
+    'catch finally then let this outer super is exists nonempty';
+  // 7.4.1 Declaration Modifiers
+  var DECLARATION_MODIFIERS =
+    'shared abstract formal default actual variable late native deprecated' +
+    'final sealed annotation suppressWarnings small';
+  // 7.4.2 Documentation
+  var DOCUMENTATION =
+    'doc by license see throws tagged';
+  var SUBST = {
+    className: 'subst', excludeBegin: true, excludeEnd: true,
+    begin: /``/, end: /``/,
+    keywords: KEYWORDS,
+    relevance: 10
+  };
+  var EXPRESSIONS = [
+    {
+      // verbatim string
+      className: 'string',
+      begin: '"""',
+      end: '"""',
+      relevance: 10
+    },
+    {
+      // string literal or template
+      className: 'string',
+      begin: '"', end: '"',
+      contains: [SUBST]
+    },
+    {
+      // character literal
+      className: 'string',
+      begin: "'",
+      end: "'"
+    },
+    {
+      // numeric literal
+      className: 'number',
+      begin: '#[0-9a-fA-F_]+|\\$[01_]+|[0-9_]+(?:\\.[0-9_](?:[eE][+-]?\\d+)?)?[kMGTPmunpf]?',
+      relevance: 0
+    }
+  ];
+  SUBST.contains = EXPRESSIONS;
+
+  return {
+    keywords: {
+      keyword: KEYWORDS + ' ' + DECLARATION_MODIFIERS,
+      meta: DOCUMENTATION
+    },
+    illegal: '\\$[^01]|#[^0-9a-fA-F]',
+    contains: [
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.COMMENT('/\\*', '\\*/', {contains: ['self']}),
+      {
+        // compiler annotation
+        className: 'meta',
+        begin: '@[a-z]\\w*(?:\\:\"[^\"]*\")?'
+      }
+    ].concat(EXPRESSIONS)
+  };
+}
+},{name:"clean",create:/*
+Language: Clean
+Author: Camil Staps <info@camilstaps.nl>
+Category: functional
+Website: http://clean.cs.ru.nl
+*/
+
+function(hljs) {
+  return {
+    aliases: ['clean','icl','dcl'],
+    keywords: {
+      keyword:
+        'if let in with where case of class instance otherwise ' +
+        'implementation definition system module from import qualified as ' +
+        'special code inline foreign export ccall stdcall generic derive ' +
+        'infix infixl infixr',
+      built_in:
+        'Int Real Char Bool',
+      literal:
+        'True False'
+    },
+    contains: [
+
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE,
+      hljs.C_NUMBER_MODE,
+
+      {begin: '->|<-[|:]?|#!?|>>=|\\{\\||\\|\\}|:==|=:|<>'} // relevance booster
+    ]
+  };
+}
+},{name:"clojure-repl",create:/*
+Language: Clojure REPL
+Description: Clojure REPL sessions
+Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
+Requires: clojure.js
+Category: lisp
+*/
+
+function(hljs) {
+  return {
+    contains: [
+      {
+        className: 'meta',
+        begin: /^([\w.-]+|\s*#_)?=>/,
+        starts: {
+          end: /$/,
+          subLanguage: 'clojure'
+        }
+      }
+    ]
+  }
+}
+},{name:"clojure",create:/*
+Language: Clojure
+Description: Clojure syntax (based on lisp.js)
+Author: mfornos
+Contributors: Martin Clausen <martin.clausene@gmail.com>
+Category: lisp
+*/
+
+function(hljs) {
+  var keywords = {
+    'builtin-name':
+      // Clojure keywords
+      'def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem '+
+      'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '+
+      'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '+
+      'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '+
+      'string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . '+
+      'inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last '+
+      'drop-while while intern condp case reduced cycle split-at split-with repeat replicate '+
+      'iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext '+
+      'nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends '+
+      'add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler '+
+      'set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter '+
+      'monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or '+
+      'when when-not when-let comp juxt partial sequence memoize constantly complement identity assert '+
+      'peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast '+
+      'sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import '+
+      'refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! '+
+      'assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger '+
+      'bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline '+
+      'flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking '+
+      'assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! '+
+      'reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! '+
+      'new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty '+
+      'hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list '+
+      'disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer '+
+      'chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate '+
+      'unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta '+
+      'lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize'
+   };
+
+  var SYMBOLSTART = 'a-zA-Z_\\-!.?+*=<>&#\'';
+  var SYMBOL_RE = '[' + SYMBOLSTART + '][' + SYMBOLSTART + '0-9/;:]*';
+  var SIMPLE_NUMBER_RE = '[-+]?\\d+(\\.\\d+)?';
+
+  var SYMBOL = {
+    begin: SYMBOL_RE,
+    relevance: 0
+  };
+  var NUMBER = {
+    className: 'number', begin: SIMPLE_NUMBER_RE,
+    relevance: 0
+  };
+  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});
+  var COMMENT = hljs.COMMENT(
+    ';',
+    '$',
+    {
+      relevance: 0
+    }
+  );
+  var LITERAL = {
+    className: 'literal',
+    begin: /\b(true|false|nil)\b/
+  };
+  var COLLECTION = {
+    begin: '[\\[\\{]', end: '[\\]\\}]'
+  };
+  var HINT = {
+    className: 'comment',
+    begin: '\\^' + SYMBOL_RE
+  };
+  var HINT_COL = hljs.COMMENT('\\^\\{', '\\}');
+  var KEY = {
+    className: 'symbol',
+    begin: '[:]{1,2}' + SYMBOL_RE
+  };
+  var LIST = {
+    begin: '\\(', end: '\\)'
+  };
+  var BODY = {
+    endsWithParent: true,
+    relevance: 0
+  };
+  var NAME = {
+    keywords: keywords,
+    lexemes: SYMBOL_RE,
+    className: 'name', begin: SYMBOL_RE,
+    starts: BODY
+  };
+  var DEFAULT_CONTAINS = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL, SYMBOL];
+
+  LIST.contains = [hljs.COMMENT('comment', ''), NAME, BODY];
+  BODY.contains = DEFAULT_CONTAINS;
+  COLLECTION.contains = DEFAULT_CONTAINS;
+  HINT_COL.contains = [COLLECTION];
+
+  return {
+    aliases: ['clj'],
+    illegal: /\S/,
+    contains: [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER, LITERAL]
+  }
+}
+},{name:"cmake",create:/*
+Language: CMake
+Description: CMake is an open-source cross-platform system for build automation.
+Author: Igor Kalnitsky <igor@kalnitsky.org>
+Website: http://kalnitsky.org/
+*/
+
+function(hljs) {
+  return {
+    aliases: ['cmake.in'],
+    case_insensitive: true,
+    keywords: {
+      keyword:
+        // scripting commands
+        'break cmake_host_system_information cmake_minimum_required cmake_parse_arguments ' +
+        'cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro ' +
+        'endwhile execute_process file find_file find_library find_package find_path ' +
+        'find_program foreach function get_cmake_property get_directory_property ' +
+        'get_filename_component get_property if include include_guard list macro ' +
+        'mark_as_advanced math message option return separate_arguments ' +
+        'set_directory_properties set_property set site_name string unset variable_watch while ' +
+        // project commands
+        'add_compile_definitions add_compile_options add_custom_command add_custom_target ' +
+        'add_definitions add_dependencies add_executable add_library add_link_options ' +
+        'add_subdirectory add_test aux_source_directory build_command create_test_sourcelist ' +
+        'define_property enable_language enable_testing export fltk_wrap_ui ' +
+        'get_source_file_property get_target_property get_test_property include_directories ' +
+        'include_external_msproject include_regular_expression install link_directories ' +
+        'link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions ' +
+        'set_source_files_properties set_target_properties set_tests_properties source_group ' +
+        'target_compile_definitions target_compile_features target_compile_options ' +
+        'target_include_directories target_link_directories target_link_libraries ' +
+        'target_link_options target_sources try_compile try_run ' +
+        // CTest commands
+        'ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ' +
+        'ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ' +
+        'ctest_test ctest_update ctest_upload ' +
+        // deprecated commands
+        'build_name exec_program export_library_dependencies install_files install_programs ' +
+        'install_targets load_command make_directory output_required_files remove ' +
+        'subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file ' +
+        'qt5_use_modules qt5_use_package qt5_wrap_cpp ' +
+        // core keywords
+        'on off true false and or not command policy target test exists is_newer_than ' +
+        'is_directory is_symlink is_absolute matches less greater equal less_equal ' +
+        'greater_equal strless strgreater strequal strless_equal strgreater_equal version_less ' +
+        'version_greater version_equal version_less_equal version_greater_equal in_list defined'
+    },
+    contains: [
+      {
+        className: 'variable',
+        begin: '\\${', end: '}'
+      },
+      hljs.HASH_COMMENT_MODE,
+      hljs.QUOTE_STRING_MODE,
+      hljs.NUMBER_MODE
+    ]
+  };
+}
+},{name:"coffeescript",create:/*
+Language: CoffeeScript
+Author: Dmytrii Nagirniak <dnagir@gmail.com>
+Contributors: Oleg Efimov <efimovov@gmail.com>, Cédric Néhémie <cedric.nehemie@gmail.com>
+Description: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/
+Category: common, scripting
+*/
+
+function(hljs) {
+  var KEYWORDS = {
+    keyword:
+      // JS keywords
+      'in if for while finally new do return else break catch instanceof throw try this ' +
+      'switch continue typeof delete debugger super yield import export from as default await ' +
+      // Coffee keywords
+      'then unless until loop of by when and or is isnt not',
+    literal:
+      // JS literals
+      'true false null undefined ' +
+      // Coffee literals
+      'yes no on off',
+    built_in:
+      'npm require console print module global window document'
+  };
+  var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
+  var SUBST = {
+    className: 'subst',
+    begin: /#\{/, end: /}/,
+    keywords: KEYWORDS
+  };
+  var EXPRESSIONS = [
+    hljs.BINARY_NUMBER_MODE,
+    hljs.inherit(hljs.C_NUMBER_MODE, {starts: {end: '(\\s*/)?', relevance: 0}}), // a number tries to eat the following slash to prevent treating it as a regexp
+    {
+      className: 'string',
+      variants: [
+        {
+          begin: /'''/, end: /'''/,
+          contains: [hljs.BACKSLASH_ESCAPE]
+        },
+        {
+          begin: /'/, end: /'/,
+          contains: [hljs.BACKSLASH_ESCAPE]
+        },
+        {
+          begin: /"""/, end: /"""/,
+          contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+        },
+        {
+          begin: /"/, end: /"/,
+          contains: [hljs.BACKSLASH_ESCAPE, SUBST]
+        }
+      ]
+    },
+    {
+      className: 'regexp',
+      variants: [
+        {
+          begin: '///', end: '///',
+          contains: [SUBST, hljs.HASH_COMMENT_MODE]
+        },
+        {
+          begin: '//[gim]*',
+          relevance: 0
+        },
+        {
+          // regex can't start with space to parse x / 2 / 3 as two divisions
+          // regex can't start with *, and it supports an "illegal" in the main mode
+          begin: /\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/
+        }
+      ]
+    },
+    {
+      begin: '@' + JS_IDENT_RE // relevance booster
+    },
+    {
+      subLanguage: 'javascript',
+      excludeBegin: true, excludeEnd: true,
+      variants: [
+        {
+          begin: '```', end: '```',
+        },
+        {
+          begin: '`', end: '`',
+        }
+      ]
+    }
+  ];
+  SUBST.contains = EXPRESSIONS;
+
+  var TITLE = hljs.inherit(hljs.TITLE_MODE, {begin: JS_IDENT_RE});
+  var PARAMS_RE = '(\\(.*\\))?\\s*\\B[-=]>';
+  var PARAMS = {
+    className: 'params',
+    begin: '\\([^\\(]', returnBegin: true,
+    /* We need another contained nameless mode to not have every nested
+    pair of parens to be called "params" */
+    contains: [{
+      begin: /\(/, end: /\)/,
+      keywords: KEYWORDS,
+      contains: ['self'].concat(EXPRESSIONS)
+    }]
+  };
+
+  return {
+    aliases: ['coffee', 'cson', 'iced'],
+    keywords: KEYWORDS,
+    illegal: /\/\*/,
+    contains: EXPRESSIONS.concat([
+      hljs.COMMENT('###', '###'),
+      hljs.HASH_COMMENT_MODE,
+      {
+        className: 'function',
+        begin: '^\\s*' + JS_IDENT_RE + '\\s*=\\s*' + PARAMS_RE, end: '[-=]>',
+        returnBegin: true,
+        contains: [TITLE, PARAMS]
+      },
+      {
+        // anonymous function start
+        begin: /[:\(,=]\s*/,
+        relevance: 0,
+        contains: [
+          {
+            className: 'function',
+            begin: PARAMS_RE, end: '[-=]>',
+            returnBegin: true,
+            contains: [PARAMS]
+          }
+        ]
+      },
+      {
+        className: 'class',
+        beginKeywords: 'class',
+        end: '$',
+        illegal: /[:="\[\]]/,
+        contains: [
+          {
+            beginKeywords: 'extends',
+            endsWithParent: true,
+            illegal: /[:="\[\]]/,
+            contains: [TITLE]
+          },
+          TITLE
+        ]
+      },
+      {
+        begin: JS_IDENT_RE + ':', end: ':',
+        returnBegin: true, returnEnd: true,
+        relevance: 0
+      }
+    ])
+  };
+}
+},{name:"coq",create:/*
+Language: Coq
+Author: Stephan Boyer <stephan@stephanboyer.com>
+Category: functional
+*/
+
+function(hljs) {
+  return {
+    keywords: {
+      keyword:
+        '_ as at cofix else end exists exists2 fix for forall fun if IF in let ' +
+        'match mod Prop return Set then Type using where with ' +
+        'Abort About Add Admit Admitted All Arguments Assumptions Axiom Back BackTo ' +
+        'Backtrack Bind Blacklist Canonical Cd Check Class Classes Close Coercion ' +
+        'Coercions CoFixpoint CoInductive Collection Combined Compute Conjecture ' +
+        'Conjectures Constant constr Constraint Constructors Context Corollary ' +
+        'CreateHintDb Cut Declare Defined Definition Delimit Dependencies Dependent' +
+        'Derive Drop eauto End Equality Eval Example Existential Existentials ' +
+        'Existing Export exporting Extern Extract Extraction Fact Field Fields File ' +
+        'Fixpoint Focus for From Function Functional Generalizable Global Goal Grab ' +
+        'Grammar Graph Guarded Heap Hint HintDb Hints Hypotheses Hypothesis ident ' +
+        'Identity If Immediate Implicit Import Include Inductive Infix Info Initial ' +
+        'Inline Inspect Instance Instances Intro Intros Inversion Inversion_clear ' +
+        'Language Left Lemma Let Libraries Library Load LoadPath Local Locate Ltac ML ' +
+        'Mode Module Modules Monomorphic Morphism Next NoInline Notation Obligation ' +
+        'Obligations Opaque Open Optimize Options Parameter Parameters Parametric ' +
+        'Path Paths pattern Polymorphic Preterm Print Printing Program Projections ' +
+        'Proof Proposition Pwd Qed Quit Rec Record Recursive Redirect Relation Remark ' +
+        'Remove Require Reserved Reset Resolve Restart Rewrite Right Ring Rings Save ' +
+        'Scheme Scope Scopes Script Search SearchAbout SearchHead SearchPattern ' +
+        'SearchRewrite Section Separate Set Setoid Show Solve Sorted Step Strategies ' +
+        'Strategy Structure SubClass Table Tables Tactic Term Test Theorem Time ' +
+        'Timeout Transparent Type Typeclasses Types Undelimit Undo Unfocus Unfocused ' +
+        'Unfold Universe Universes Unset Unshelve using Variable Variables Variant ' +
+        'Verbose Visibility where with',
+      built_in:
+        'abstract absurd admit after apply as assert assumption at auto autorewrite ' +
+        'autounfold before bottom btauto by case case_eq cbn cbv change ' +
+        'classical_left classical_right clear clearbody cofix compare compute ' +
+        'congruence constr_eq constructor contradict contradiction cut cutrewrite ' +
+        'cycle decide decompose dependent destruct destruction dintuition ' +
+        'discriminate discrR do double dtauto eapply eassumption eauto ecase ' +
+        'econstructor edestruct ediscriminate eelim eexact eexists einduction ' +
+        'einjection eleft elim elimtype enough equality erewrite eright ' +
+        'esimplify_eq esplit evar exact exactly_once exfalso exists f_equal fail ' +
+        'field field_simplify field_simplify_eq first firstorder fix fold fourier ' +
+        'functional generalize generalizing gfail give_up has_evar hnf idtac in ' +
+        'induction injection instantiate intro intro_pattern intros intuition ' +
+        'inversion inversion_clear is_evar is_var lapply lazy left lia lra move ' +
+        'native_compute nia nsatz omega once pattern pose progress proof psatz quote ' +
+        'record red refine reflexivity remember rename repeat replace revert ' +
+        'revgoals rewrite rewrite_strat right ring ring_simplify rtauto set ' +
+        'setoid_reflexivity setoid_replace setoid_rewrite setoid_symmetry ' +
+        'setoid_transitivity shelve shelve_unifiable simpl simple simplify_eq solve ' +
+        'specialize split split_Rabs split_Rmult stepl stepr subst sum swap ' +
+        'symmetry tactic tauto time timeout top transitivity trivial try tryif ' +
+        'unfold unify until using vm_compute with'
+    },
+    contains: [
+      hljs.QUOTE_STRING_MODE,
+      hljs.COMMENT('\\(\\*', '\\*\\)'),
+      hljs.C_NUMBER_MODE,
+      {
+        className: 'type',
+        excludeBegin: true,
+        begin: '\\|\\s*',
+        end: '\\w+'
+      },
+      {begin: /[-=]>/} // relevance booster
+    ]
+  };
+}
+},{name:"cos",create:/*
+Language: Caché Object Script
+Author: Nikita Savchenko <zitros.lab@gmail.com>
+Category: enterprise, scripting
+*/
+function cos (hljs) {
+
+  var STRINGS = {
+    className: 'string',
+    variants: [
+      {
+        begin: '"',
+        end: '"',
+        contains: [{ // escaped
+          begin: "\"\"",
+          relevance: 0
+        }]
+      }
+    ]
+  };
+
+  var NUMBERS = {
+    className: "number",
+    begin: "\\b(\\d+(\\.\\d*)?|\\.\\d+)",
+    relevance: 0
+  };
+
+  var COS_KEYWORDS =
+    'property parameter class classmethod clientmethod extends as break ' +
+    'catch close continue do d|0 else elseif for goto halt hang h|0 if job ' +
+    'j|0 kill k|0 lock l|0 merge new open quit q|0 read r|0 return set s|0 ' +
+    'tcommit throw trollback try tstart use view while write w|0 xecute x|0 ' +
+    'zkill znspace zn ztrap zwrite zw zzdump zzwrite print zbreak zinsert ' +
+    'zload zprint zremove zsave zzprint mv mvcall mvcrt mvdim mvprint zquit ' +
+    'zsync ascii';
+
+    // registered function - no need in them due to all functions are highlighted,
+    // but I'll just leave this here.
+
+    //"$bit", "$bitcount",
+    //"$bitfind", "$bitlogic", "$case", "$char", "$classmethod", "$classname",
+    //"$compile", "$data", "$decimal", "$double", "$extract", "$factor",
+    //"$find", "$fnumber", "$get", "$increment", "$inumber", "$isobject",
+    //"$isvaliddouble", "$isvalidnum", "$justify", "$length", "$list",
+    //"$listbuild", "$listdata", "$listfind", "$listfromstring", "$listget",
+    //"$listlength", "$listnext", "$listsame", "$listtostring", "$listvalid",
+    //"$locate", "$match", "$method", "$name", "$nconvert", "$next",
+    //"$normalize", "$now", "$number", "$order", "$parameter", "$piece",
+    //"$prefetchoff", "$prefetchon", "$property", "$qlength", "$qsubscript",
+    //"$query", "$random", "$replace", "$reverse", "$sconvert", "$select",
+    //"$sortbegin", "$sortend", "$stack", "$text", "$translate", "$view",
+    //"$wascii", "$wchar", "$wextract", "$wfind", "$wiswide", "$wlength",
+    //"$wreverse", "$xecute", "$zabs", "$zarccos", "$zarcsin", "$zarctan",
+    //"$zcos", "$zcot", "$zcsc", "$zdate", "$zdateh", "$zdatetime",
+    //"$zdatetimeh", "$zexp", "$zhex", "$zln", "$zlog", "$zpower", "$zsec",
+    //"$zsin", "$zsqr", "$ztan", "$ztime", "$ztimeh", "$zboolean",
+    //"$zconvert", "$zcrc", "$zcyc", "$zdascii", "$zdchar", "$zf",
+    //"$ziswide", "$zlascii", "$zlchar", "$zname", "$zposition", "$zqascii",
+    //"$zqchar", "$zsearch", "$zseek", "$zstrip", "$zwascii", "$zwchar",
+    //"$zwidth", "$zwpack", "$zwbpack", "$zwunpack", "$zwbunpack", "$zzenkaku",
+    //"$change", "$mv", "$mvat", "$mvfmt", "$mvfmts", "$mviconv",
+    //"$mviconvs", "$mvinmat", "$mvlover", "$mvoconv", "$mvoconvs", "$mvraise",
+    //"$mvtrans", "$mvv", "$mvname", "$zbitand", "$zbitcount", "$zbitfind",
+    //"$zbitget", "$zbitlen", "$zbitnot", "$zbitor", "$zbitset", "$zbitstr",
+    //"$zbitxor", "$zincrement", "$znext", "$zorder", "$zprevious", "$zsort",
+    //"device", "$ecode", "$estack", "$etrap", "$halt", "$horolog",
+    //"$io", "$job", "$key", "$namespace", "$principal", "$quit", "$roles",
+    //"$storage", "$system", "$test", "$this", "$tlevel", "$username",
+    //"$x", "$y", "$za", "$zb", "$zchild", "$zeof", "$zeos", "$zerror",
+    //"$zhorolog", "$zio", "$zjob", "$zmode", "$znspace", "$zparent", "$zpi",
+    //"$zpos", "$zreference", "$zstorage", "$ztimestamp", "$ztimezone",
+    //"$ztrap", "$zversion"
+
+  return {
+    case_insensitive: true,
+    aliases: ["cos", "cls"],
+    keywords: COS_KEYWORDS,
+    contains: [
+      NUMBERS,
+      STRINGS,
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      {
+        className: "comment",
+        begin: /;/, end: "$",
+        relevance: 0
+      },
+      { // Functions and user-defined functions: write $ztime(60*60*3), $$myFunc(10), $$^Val(1)
+        className: "built_in",
+        begin: /(?:\$\$?|\.\.)\^?[a-zA-Z]+/
+      },
+      { // Macro command: quit $$$OK
+        className: "built_in",
+        begin: /\$\$\$[a-zA-Z]+/
+      },
+      { // Special (global) variables: write %request.Content; Built-in classes: %Library.Integer
+        className: "built_in",
+        begin: /%[a-z]+(?:\.[a-z]+)*/
+      },
+      { // Global variable: set ^globalName = 12 write ^globalName
+        className: "symbol",
+        begin: /\^%?[a-zA-Z][\w]*/
+      },
+      { // Some control constructions: do ##class(Package.ClassName).Method(), ##super()
+        className: "keyword",
+        begin: /##class|##super|#define|#dim/
+      },
+
+      // sub-languages: are not fully supported by hljs by 11/15/2015
+      // left for the future implementation.
+      {
+        begin: /&sql\(/,    end: /\)/,
+        excludeBegin: true, excludeEnd: true,
+        subLanguage: "sql"
+      },
+      {
+        begin: /&(js|jscript|javascript)</, end: />/,
+        excludeBegin: true, excludeEnd: true,
+        subLanguage: "javascript"
+      },
+      {
+        // this brakes first and last tag, but this is the only way to embed a valid html
+        begin: /&html<\s*</, end: />\s*>/,
+        subLanguage: "xml"
+      }
+    ]
+  };
+}
+},{name:"crmsh",create:/*
+Language: crmsh
+Author: Kristoffer Gronlund <kgronlund@suse.com>
+Website: http://crmsh.github.io
+Description: Syntax Highlighting for the crmsh DSL
+Category: config
+*/
+
+function(hljs) {
+  var RESOURCES = 'primitive rsc_template';
+
+  var COMMANDS = 'group clone ms master location colocation order fencing_topology ' +
+      'rsc_ticket acl_target acl_group user role ' +
+      'tag xml';
+
+  var PROPERTY_SETS = 'property rsc_defaults op_defaults';
+
+  var KEYWORDS = 'params meta operations op rule attributes utilization';
+
+  var OPERATORS = 'read write deny defined not_defined in_range date spec in ' +
+      'ref reference attribute type xpath version and or lt gt tag ' +
+      'lte gte eq ne \\';
+
+  var TYPES = 'number string';
+
+  var LITERALS = 'Master Started Slave Stopped start promote demote stop monitor true false';
+
+  return {
+    aliases: ['crm', 'pcmk'],
+    case_insensitive: true,
+    keywords: {
+      keyword: KEYWORDS + ' ' + OPERATORS + ' ' + TYPES,
+      literal: LITERALS
+    },
+    contains: [
+      hljs.HASH_COMMENT_MODE,
+      {
+        beginKeywords: 'node',
+        starts: {
+          end: '\\s*([\\w_-]+:)?',
+          starts: {
+            className: 'title',
+            end: '\\s*[\\$\\w_][\\w_-]*'
+          }
+        }
+      },
+      {
+        beginKeywords: RESOURCES,
+        starts: {
+          className: 'title',
+          end: '\\s*[\\$\\w_][\\w_-]*',
+          starts: {
+            end: '\\s*@?[\\w_][\\w_\\.:-]*'
+          }
+        }
+      },
+      {
+        begin: '\\b(' + COMMANDS.split(' ').join('|') + ')\\s+',
+        keywords: COMMANDS,
+        starts: {
+          className: 'title',
+          end: '[\\$\\w_][\\w_-]*'
+        }
+      },
+      {
+        beginKeywords: PROPERTY_SETS,
+        starts: {
+          className: 'title',
+          end: '\\s*([\\w_-]+:)?'
+        }
+      },
+      hljs.QUOTE_STRING_MODE,
+      {
+        className: 'meta',
+        begin: '(ocf|systemd|service|lsb):[\\w_:-]+',
+        relevance: 0
+      },
+      {
+        className: 'number',
+        begin: '\\b\\d+(\\.\\d+)?(ms|s|h|m)?',
+        relevance: 0
+      },
+      {
+        className: 'literal',
+        begin: '[-]?(infinity|inf)',
+        relevance: 0
+      },
+      {
+        className: 'attr',
+        begin: /([A-Za-z\$_\#][\w_-]+)=/,
+        relevance: 0
+      },
+      {
+        className: 'tag',
+        begin: '</?',
+        end: '/?>',
+        relevance: 0
+      }
+    ]
+  };
+}
+},{name:"crystal",create:/*
+Language: Crystal
+Author: TSUYUSATO Kitsune <make.just.on@gmail.com>
+*/
+
+function(hljs) {
+  var INT_SUFFIX = '(_*[ui](8|16|32|64|128))?';
+  var FLOAT_SUFFIX = '(_*f(32|64))?';
+  var CRYSTAL_IDENT_RE = '[a-zA-Z_]\\w*[!?=]?';
+  var CRYSTAL_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?';
+  var CRYSTAL_PATH_RE = '[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?';
+  var CRYSTAL_KEYWORDS = {
+    keyword:
+      'abstract alias annotation as as? asm begin break case class def do else elsif end ensure enum extend for fun if ' +
+      'include instance_sizeof is_a? lib macro module next nil? of out pointerof private protected rescue responds_to? ' +
+      'return require select self sizeof struct super then type typeof union uninitialized unless until verbatim when while with yield ' +
+      '__DIR__ __END_LINE__ __FILE__ __LINE__',
+    literal: 'false nil true'
+  };
+  var SUBST = {
+    className: 'subst',
+    begin: '#{', end: '}',
+    keywords: CRYSTAL_KEYWORDS
+  };
+  var EXPANSION = {
+    className: 'template-variable',
+    variants: [
+      {begin: '\\{\\{', end: '\\}\\}'},
+      {begin: '\\{%', end: '%\\}'}
+    ],
+    keywords: CRYSTAL_KEYWORDS
+  };
+
+  function recursiveParen(begin, end) {
+    var
+    contains = [{begin: begin, end: end}];
+    contains[0].contains = contains;
+    return contains;
+  }
+  var STRING = {
+    className: 'string',
+    contains: [hljs.BACKSLASH_ESCAPE, SUBST],
+    variants: [
+      {begin: /'/, end: /'/},
+      {begin: /"/, end: /"/},
+      {begin: /`/, end: /`/},
+      {begin: '%[Qwi]?\\(', end: '\\)', contains: recursiveParen('\\(', '\\)')},
+      {begin: '%[Qwi]?\\[', end: '\\]', contains: recursiveParen('\\[', '\\]')},
+      {begin: '%[Qwi]?{', end: '}', contains: recursiveParen('{', '}')},
+      {begin: '%[Qwi]?<', end: '>', contains: recursiveParen('<', '>')},
+      {begin: '%[Qwi]?\\|', end: '\\|'},
+      {begin: /<<-\w+$/, end: /^\s*\w+$/},
+    ],
+    relevance: 0,
+  };
+  var Q_STRING = {
+    className: 'string',
+    variants: [
+      {begin: '%q\\(', end: '\\)', contains: recursiveParen('\\(', '\\)')},
+      {begin: '%q\\[', end: '\\]', contains: recursiveParen('\\[', '\\]')},
+      {begin: '%q{', end: '}', contains: recursiveParen('{', '}')},
+      {begin: '%q<', end: '>', contains: recursiveParen('<', '>')},
+      {begin: '%q\\|', end: '\\|'},
+      {begin: /<<-'\w+'$/, end: /^\s*\w+$/},
+    ],
+    relevance: 0,
+  };
+  var REGEXP = {
+    begin: '(?!%})(' + hljs.RE_STARTERS_RE + '|\\n|\\b(case|if|select|unless|until|when|while)\\b)\\s*',
+    keywords: 'case if select unless until when while',
+    contains: [
+      {
+        className: 'regexp',
+        contains: [hljs.BACKSLASH_ESCAPE, SUBST],
+        variants: [
+          {begin: '//[a-z]*', relevance: 0},
+          {begin: '/(?!\\/)', end: '/[a-z]*'},
+        ]
+      }
+    ],
+    relevance: 0
+  };
+  var REGEXP2 = {
+    className: 'regexp',
+    contains: [hljs.BACKSLASH_ESCAPE, SUBST],
+    variants: [
+      {begin: '%r\\(', end: '\\)', contains: recursiveParen('\\(', '\\)')},
+      {begin: '%r\\[', end: '\\]', contains: recursiveParen('\\[', '\\]')},
+      {begin: '%r{', end: '}', contains: recursiveParen('{', '}')},
+      {begin: '%r<', end: '>', contains: recursiveParen('<', '>')},
+      {begin: '%r\\|', end: '\\|'},
+    ],
+    relevance: 0
+  };
+  var ATTRIBUTE = {
+    className: 'meta',
+    begin: '@\\[', end: '\\]',
+    contains: [
+      hljs.inherit(hljs.QUOTE_STRING_MODE, {className: 'meta-string'})
+    ]
+  };
+  var CRYSTAL_DEFAULT_CONTAINS = [
+    EXPANSION,
+    STRING,
+    Q_STRING,
+    REGEXP2,
+    REGEXP,
+    ATTRIBUTE,
+    hljs.HASH_COMMENT_MODE,
+    {
+      className: 'class',
+      beginKeywords: 'class module struct', end: '$|;',
+      illegal: /=/,
+      contains: [
+        hljs.HASH_COMMENT_MODE,
+        hljs.inherit(hljs.TITLE_MODE, {begin: CRYSTAL_PATH_RE}),
+        {begin: '<'} // relevance booster for inheritance
+      ]
+    },
+    {
+      className: 'class',
+      beginKeywords: 'lib enum union', end: '$|;',
+      illegal: /=/,
+      contains: [
+        hljs.HASH_COMMENT_MODE,
+        hljs.inherit(hljs.TITLE_MODE, {begin: CRYSTAL_PATH_RE}),
+      ],
+      relevance: 10
+    },
+    {
+      beginKeywords: 'annotation', end: '$|;',
+      illegal: /=/,
+      contains: [
+        hljs.HASH_COMMENT_MODE,
+        hljs.inherit(hljs.TITLE_MODE, {begin: CRYSTAL_PATH_RE}),
+      ],
+      relevance: 10
+    },
+    {
+      className: 'function',
+      beginKeywords: 'def', end: /\B\b/,
+      contains: [
+        hljs.inherit(hljs.TITLE_MODE, {
+          begin: CRYSTAL_METHOD_RE,
+          endsParent: true
+        })
+      ]
+    },
+    {
+      className: 'function',
+      beginKeywords: 'fun macro', end: /\B\b/,
+      contains: [
+        hljs.inherit(hljs.TITLE_MODE, {
+          begin: CRYSTAL_METHOD_RE,
+          endsParent: true
+        })
+      ],
+      relevance: 5
+    },
+    {
+      className: 'symbol',
+      begin: hljs.UNDERSCORE_IDENT_RE + '(\\!|\\?)?:',
+      relevance: 0
+    },
+    {
+      className: 'symbol',
+      begin: ':',
+      contains: [STRING, {begin: CRYSTAL_METHOD_RE}],
+      relevance: 0
+    },
+    {
+      className: 'number',
+      variants: [
+        { begin: '\\b0b([01_]+)' + INT_SUFFIX },
+        { begin: '\\b0o([0-7_]+)' + INT_SUFFIX },
+        { begin: '\\b0x([A-Fa-f0-9_]+)' + INT_SUFFIX },
+        { begin: '\\b([1-9][0-9_]*[0-9]|[0-9])(\\.[0-9][0-9_]*)?([eE]_*[-+]?[0-9_]*)?' + FLOAT_SUFFIX + '(?!_)' },
+        { begin: '\\b([1-9][0-9_]*|0)' + INT_SUFFIX }
+      ],
+      relevance: 0
+    }
+  ];
+  SUBST.contains = CRYSTAL_DEFAULT_CONTAINS;
+  EXPANSION.contains = CRYSTAL_DEFAULT_CONTAINS.slice(1); // without EXPANSION
+
+  return {
+    aliases: ['cr'],
+    lexemes: CRYSTAL_IDENT_RE,
+    keywords: CRYSTAL_KEYWORDS,
+    contains: CRYSTAL_DEFAULT_CONTAINS
+  };
+}
+},{name:"cs",create:/*
+Language: C#
+Author: Jason Diamond <jason@diamond.name>
+Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>
+Category: common
+*/
+
+function(hljs) {
+  var KEYWORDS = {
+    keyword:
+      // Normal keywords.
+      'abstract as base bool break byte case catch char checked const continue decimal ' +
+      'default delegate do double enum event explicit extern finally fixed float ' +
+      'for foreach goto if implicit in int interface internal is lock long nameof ' +
+      'object operator out override params private protected public readonly ref sbyte ' +
+      'sealed short sizeof stackalloc static string struct switch this try typeof ' +
+      'uint ulong unchecked unsafe ushort using virtual void volatile while ' +
+      // Contextual keywords.
+      'add alias ascending async await by descending dynamic equals from get global group into join ' +
+      'let on orderby partial remove select set value var where yield',
+    literal:
+      'null false true'
+  };
+  var NUMBERS = {
+    className: 'number',
+    variants: [
+      { begin: '\\b(0b[01\']+)' },
+      { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
+      { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
+    ],
+    relevance: 0
+  };
+  var VERBATIM_STRING = {
+    className: 'string',
+    begin: '@"', end: '"',
+    contains: [{begin: '""'}]
+  };
+  var VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, {illegal: /\n/});
+  var SUBST = {
+    className: 'subst',
+    begin: '{', end: '}',
+    keywords: KEYWORDS
+  };
+  var SUBST_NO_LF = hljs.inherit(SUBST, {illegal: /\n/});
+  var INTERPOLATED_STRING = {
+    className: 'string',
+    begin: /\$"/, end: '"',
+    illegal: /\n/,
+    contains: [{begin: '{{'}, {begin: '}}'}, hljs.BACKSLASH_ESCAPE, SUBST_NO_LF]
+  };
+  var INTERPOLATED_VERBATIM_STRING = {
+    className: 'string',
+    begin: /\$@"/, end: '"',
+    contains: [{begin: '{{'}, {begin: '}}'}, {begin: '""'}, SUBST]
+  };
+  var INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
+    illegal: /\n/,
+    contains: [{begin: '{{'}, {begin: '}}'}, {begin: '""'}, SUBST_NO_LF]
+  });
+  SUBST.contains = [
+    INTERPOLATED_VERBATIM_STRING,
+    INTERPOLATED_STRING,
+    VERBATIM_STRING,
+    hljs.APOS_STRING_MODE,
+    hljs.QUOTE_STRING_MODE,
+    NUMBERS,
+    hljs.C_BLOCK_COMMENT_MODE
+  ];
+  SUBST_NO_LF.contains = [
+    INTERPOLATED_VERBATIM_STRING_NO_LF,
+    INTERPOLATED_STRING,
+    VERBATIM_STRING_NO_LF,
+    hljs.APOS_STRING_MODE,
+    hljs.QUOTE_STRING_MODE,
+    NUMBERS,
+    hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, {illegal: /\n/})
+  ];
+  var STRING = {
+    variants: [
+      INTERPOLATED_VERBATIM_STRING,
+      INTERPOLATED_STRING,
+      VERBATIM_STRING,
+      hljs.APOS_STRING_MODE,
+      hljs.QUOTE_STRING_MODE
+    ]
+  };
+
+  var TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
+
+  return {
+    aliases: ['csharp', 'c#'],
+    keywords: KEYWORDS,
+    illegal: /::/,
+    contains: [
+      hljs.COMMENT(
+        '///',
+        '$',
+        {
+          returnBegin: true,
+          contains: [
+            {
+              className: 'doctag',
+              variants: [
+                {
+                  begin: '///', relevance: 0
+                },
+                {
+                  begin: '<!--|-->'
+                },
+                {
+                  begin: '</?', end: '>'
+                }
+              ]
+            }
+          ]
+        }
+      ),
+      hljs.C_LINE_COMMENT_MODE,
+      hljs.C_BLOCK_COMMENT_MODE,
+      {
+        className: 'meta',
+        begin: '#', end: '$',
+        keywords: {
+          'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
+        }
+      },
+      STRING,
+      NUMBERS,
+      {
+        beginKeywords: 'class interface', end: /[{;=]/,
+        illegal: /[^\s:,]/,
+        contains: [
+          hljs.TITLE_MODE,
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
+        ]
+      },
+      {
+        beginKeywords: 'namespace', end: /[{;=]/,
+        illegal: /[^\s:]/,
+        contains: [
+          hljs.inherit(hljs.TITLE_MODE, {begin: '[a-zA-Z](\\.?\\w)*'}),
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
+        ]
+      },
+      {
+        // [Attributes("")]
+        className: 'meta',
+        begin: '^\\s*\\[', excludeBegin: true, end: '\\]', excludeEnd: true,
+        contains: [
+          {className: 'meta-string', begin: /"/, end: /"/}
+        ]
+      },
+      {
+        // Expression keywords prevent 'keyword Name(...)' from being
+        // recognized as a function definition
+        beginKeywords: 'new return throw await else',
+        relevance: 0
+      },
+      {
+        className: 'function',
+        begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*\\(', returnBegin: true,
+        end: /\s*[{;=]/, excludeEnd: true,
+        keywords: KEYWORDS,
+        contains: [
+          {
+            begin: hljs.IDENT_RE + '\\s*\\(', returnBegin: true,
+            contains: [hljs.TITLE_MODE],
+            relevance: 0
+          },
+          {
+            className: 'params',
+            begin: /\(/, end: /\)/,
+            excludeBegin: true,
+            excludeEnd: true,
+            keywords: KEYWORDS,
+            relevance: 0,
+            contains: [
+              STRING,
+              NUMBERS,
+              hljs.C_BLOCK_COMMENT_MODE
+            ]
+          },
+          hljs.C_LINE_COMMENT_MODE,
+          hljs.C_BLOCK_COMMENT_MODE
+        ]
+      }
+    ]
+  };
+}
+},{name:"csp",create:/*
+Language: CSP
+Description: Content Security Policy definition highlighting 
+Author: Taras <oxdef@oxdef.info>
+
+vim: ts=2 sw=2 st=2
+*/
+
+function(hljs) {
+  return {
+    case_insensitive: false,
+    lexemes: '[a-zA-Z][a-zA-Z0-9_-]*',
+    keywords: {
+      keyword: 'base-uri child-src connect-src default-src font-src form-action' +
+        ' frame-ancestors frame-src img-src media-src object-src plugin-types' +
+        ' report-uri sandbox script-src style-src', 
+    },
+    contains: [
+    {
+      className: 'string',
+      begin: "'", end: "'"
+    },
+    {
+      className: 'attribute',
+      begin: '^Content', end: ':', excludeEnd: true,
+    },
+    ]
+  };
+}
+},{name:"css",create:/*
+Language: CSS
+Category: common, css
+*/
+
+function(hljs) {
+  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';
+  var RULE = {
+    begin: /(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/, returnBegin: true, end: ';', endsWithParent: true,
+    contains: [
+      {
+        className: 'attribute',
+        begin: /\S/, end: ':', excludeEnd: true,
+        starts: {
+          endsWithParent: true, excludeEnd: true,
+          contains: [
+            {
+              begin: /[\w-]+\(/, returnBegin: true,
+              contains: [
+                {
+                  className: 'built_in',
+                  begin: /[\w-]+/
+                },
+                {
+                  begin: /\(/, end: /\)/,
+                  contains: [
+                    hljs.APOS_STRING_MODE,
+                    hljs.QUOTE_STRING_MODE
+                  ]
+                }
+              ]
+            },
+            hljs.CSS_NUMBER_MODE,
+