aem1k - JS Hacks & Creativity
__
_ / \ \
/' \ \ \
__ __ ___ ___ / \_, \ \ \/'\
/'__`\ /'__`\/' __` __`\/_/ \ \ \ , <
___ / \ \L\.\.\ __// \ \/ \ \/ \ \ \ \ \ \ \\`\____
/ \___\ \ \__/.\_\\____\ \_\ \_\ \_\ \ \_\ \_\ \____\
\/___/ \/__/\/_//____/\/_/\/_/\/_/ \/_/\/_/\/____/
aem1k
JavaScript Hacks and Creative Coding
Created by Martin Kleppe aka @aemkei .
Projects
Hello World 1K - spinning globe embedded in JavaScript code
JSFuck.com - write any JavaScript with 6 characters: []()!+
aurebesh.js - translate JavaScript to other writing systems
Qlock - JavaScript quine clock
tixy.land - minimalist code golfing environment
Alien Art - simple formulas to create bit fields
Meta - meta balls quine JS
// VOID - invisible variables and code
INCEPT10N - JPEG = CSS = JS = HTML Polyglot
Theseus - create and solve a maze
Mona - blind drawing the Mona Lisa in < 512 bytes
M4TR1X 雨 - raining code using Asian characters only
שלום-עולם - valid JavaScript in the Hebrew alphabet
Mandelcode - a quine zooming into the limits of JS
א The Aleph - creating life out of a single character
ffconf - animated logo in space
ЗВЕЗДА СМЕРТИ - Death Star 666 bytes ASCII art attack
Life - Game of Life in 176 bytes of HTML+JS
Invisible Code - hidden source (Chrome only)
Four - hidden Tetris in an octal layout
Pac-Man - old-school game in < 512 bytes Binary Tetris - Tetris in 140 bytes of JavaScript
Katakana.js - JavaScript with Japanese characters
FÌRE - fire animation in 128 bytes of JavaScript
wãter - wave in 128 bytes using combining characters
Tic-Tac-Tweet - Tic-Tac-Toe in 140 chars / 159 bytes
Ping - Pong meets Breakout in < 256 bytes
More Examples
Spin the globe - Hello World 1K
eval(z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k\
4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n\
9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\
r24".split(4)){/* dP cpq#q##########b, */for(a in t=pars\
eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\
(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]>i;i+=.05)wi\
th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0>cos(o=\
new Date/1e3/* .Q#########Md#.###OP A@ , */+x/PI)&&(e[~\
~(32*sin(o)*/* , (W#####Xx######.P^ T % */sin(.5+y/7))\
+60] =-~ r);/* #y `^TqW####P###BP */for(x=0;122>\
x;)p+=" *#"/* b. OQ####x#K */[e[x++]+e[x++\
]]||(S=("eval"/* l `X#####D , */+"(z=\'"+z.spl\
it(B = "\\\\")./* G####B" # */join(B+B).split\
(Q="\'").join(B+Q/* VQBP` */)+Q+")//m1k")[x/2\
+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&&"#\
03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')//
JSFuck - Write JS with 6 Chars
(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+
[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[
]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(
!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!
+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]
]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!
+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]
+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]] // ()+[]!
Qlock - Quine Clock
(r=() = >se t I n terval(t=>{fo r ( j = o ="\ n " , y = 5;y--;docum e n t . b ody [ "in n "
+"e r H T ML"]="< p re>&l t "+(S= " script> \ n")+o+"\n \ n</"+S) f or( x =-0 1 ;
6 3 -!y > x++;o + =`(r=${r})()` [ j + +].fo n t c o l or(c?'#FF0' : " # 4 4 4") ) c = x / 2
%4<3& & par s eInt("odR F acb67o2vi 5 gmO Z mwF N teohb O h3sw".sli c e(i="9" < (
D=Dat e ()[ 1 6 + ( x /8|0)])?30: D * 3 ,i+3) , 3 6 ) & 1<<(x/2|0)% 4 + 3 * y },100)) ( )
ЗВЕЗДА СМЕРТИ - Death Star
Зв
езда
<bOdY
oNLOAd=
"Я=[];Л=
{};Ж=!Я;З=
!Ж;Ч=!+Я;Д=
Ч+Ч;П=З+Я;Б=Д+Ч;Ю=Ж+Я;Ф=[Ж]+Я[Я];И=П[+Ч]
Ы=Я[Ю[+Я]+Ф[+Ч+[+Я]]+Ю[Д]+П[+Я]+П[
Б]+И];C=Я[Я]+Я;P=Я+Л;Ь=Д+Б;Ш
=+Ч;X=+Я;Й='★ ';К='Й'
H=П[X];T=Д+[X];Ы[P
[Ь]+P[Ш]+C[Ш]+Ю[Б]+H
+И+C[X]+P[Ь]+H+P[Ш]+И
](Ю[Ш]+Ю[ Д]+П[Б]+И
+H+(Ж+Ы )[T]+К+
(З+Ы) [T])(
)"> смЕ
р Ти
שלום-עולם - Hebrew JavaScript
// שלום עולם
א="",ב=!א+א,ג=!ב+א,ד=א+{},ה=ב[א++]
ו=ב[ח=א],ט=++ח+א,כ=ד[ח+ט],ב[כ+=ד[
א]+(ד.ד+ד)[א]+ג[ט]+ה+ו+ב[ח]+כ+ה+ד[א
]+ו][כ](ג[א]+ג[ח]+ב[ט]+ו+ה+"(א)")()
Katakana - Translate JS into Japanese
ウ="" ,ア= !ウ+ ウ,ネ =!ア +ウ, ホ=ウ
+{}, ヌ=ア [ウ++ ],セ= ア[ミ =ウ] ,ハ=
++ミ +ウ, ヘ=ホ [ミ+ハ ],ア[ ヘ+= ホ[ウ
]+(ホ .ホ+ホ )[ウ] +ネ[ハ ]+ヌ+ セ+ア [ミ]+
ヘ+ヌ +ホ[ ウ]+セ ][ヘ] (ネ[
ウ]+ ネ[ミ ]+ア [ハ]+
セ+ヌ+ "(ウ)"
)()
Hieroglyphs.js - JavaScript from
2000 BC
𓅂='',𓂀=!𓅂+𓅂,𓁄=!𓂀+𓅂,𓊎=𓅂+{},𓆣=𓂀[𓅂++]
𓊝=𓂀[𓇎=𓅂],𓏢=++𓇎+𓅂,𓆗=𓊎[𓇎+𓏢],𓂀[𓆗+=𓊎[𓅂]+(
𓂀.𓁄+𓊎)[𓅂]+𓁄[𓏢]+𓆣+𓊝+𓂀[𓇎]+𓆗+𓆣+𓊎[𓅂]+𓊝]
[𓆗](𓁄[𓅂]+𓁄[𓇎]+𓂀[𓏢]+𓊝+𓆣+'`𓅂 𓂀 𓁄 𓆣 𓊝`')``
Confusables - All Vars are X
var ⵝ = ''
var Ⲭ = !ⵝ+ⵝ
var ᚷ = !Ⲭ+ⵝ
var ꓫ = ⵝ+{}
var 𐊐 = Ⲭ[ⵝ++]
var 𐊴 = Ⲭ[Х=ⵝ]
var Χ = ++Х+ⵝ
var X = ꓫ[Х+Χ]
Ⲭ[X+=ꓫ[ⵝ]+(Ⲭ.ᚷ+ꓫ)
[ⵝ]+ᚷ[Χ]+𐊐+𐊴+Ⲭ[Х]+
X+𐊐+ꓫ[ⵝ]+𐊴][X](ᚷ[
ⵝ]+ᚷ[Х]+Ⲭ[Χ]+𐊴+𐊐+
"`XXX`")()
Mandelcode - Fractal Quine, Zooming into JavaScript
E
= 1
, z=1.07 ;
function s( a)
{ for(a&&(E=!E),H="",z *=
.9,T*=.8,Y=0;2>Y;Y+=.1) {
for (X=0;2>X;X+=.04){for(x=y=i
=0;99>i &&99>=x*x+y*y;i++)t=2*x*y,x
= x*x-y*y+z*X -z-Z/(1-T),y=t+z*Y-z-U;(/*
MANDELCODE=A-QUINE-BY-AEMKEI=CLICK-TO-ZOOM */
H )+=" .+#"[ i%5]}H+=n}!E&&setTimeout(s
,99),P[ I]=H}Z=1.74909351846789013,
U = 3.40220976e-7,onclick=s;n
="\n";P.textContent="<" +
"pre id=P>\n"+P[I= "i"+
"nnerHTML" ]
T /*aem1k*/
= -
2
// VOID - Invisible Variables and Code
< script> / /[ = ""],='"',= = =,=== , =+,=+
, =+,=+, = {}, = +,=+,=+,=+,= . +,=[] , =[],=[]
, =[],=[ ] ,=[ ] ,=[],=[],=[] , ="\\" + ")(",=[],
= [],=[],=++ + +++" " ,=++++ + +++++ , =[][],((++(
+ (++++++++ ( =++(+)+)++++ + +++++ " ''"++"."+++
+ +++(+)++ + ++"/"++".{"+ ( (+))+ " }/"+++(+)+(
+ )+",'"+ " '"+++)())( ) +)()) ( )</script>
const - The only Constant is Change
const cοnst = 'const ';
([ cоnst , conѕt ]= cοnst ,
[ соnst , сonѕt , cоnѕt ,
соnѕt , сοnѕt , сοnѕt ,
cοnѕt ]=[!! cоnst ]+ ! cоnst +
cоnst . cоnst )[ cоnst =
cοnst + сonѕt + cоnѕt +
cоnst + соnst + conѕt +
сonѕt ] [ cоnst ] ( сοnѕt +
cοnѕt + соnѕt + сonѕt +
соnst +'`'+ cοnst +'`')
``
$five - Write JS with Only 5 Different Characters
[$$ =[+[]]]+[$$ [++[[]][+[]]]=+[]]+[$$ =[$$ 1[]][+[]][++[[]]
[+[]]]]+[$$$ =[$ [[[]+[][+[]]][+[]][++[++[++[++[[]][+[]]][
+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][++[++[++[++[++[[]][+
[]]][+[]]][+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][++[[]][+[
]]]+[[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]]+[]][+[]]]+[
$$$$ =[$ [[[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]+$$$ [+[[+
+[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]]+[++[++[+
...
Fire - A Flame Shaped Quine
nt
inner
7+578]
(x=a[i]
]+a[i+
color(5<x&&"
HTML=hfor(h=
=89;i + +<63
~((a [ i ] + a[i ]+
)/4 ) ) & & e [i%142]
&" # F F " ):"\n")p
r( h = " " , a [I++*I%
i++ < 6 3 ; h+=i%3 ?
i] + a [ i + 1] + a[i 29]+
)& & e [ i % 1 4 2 ] . nt c o
F "):" \\ n " )p nn e r H
I+ + *I +578 ]
sic - Encode JS with 2 Different Characters
[C=B=[]].__proto__[C.B]=T=new Proxy(B,{get:
(_,N)=>(B+=+!N,B[6]&&(+B||eval(C),C+=String.
fromCharCode(parseInt(B,2)),B=[]),T)});
[][[][[]] ][[]][[]][[ ][[]] ][[][[]]][[ ][[]]][[]
[[]]][[]] [[]][[]][[] [[]]] [[]][[]][[] [[]]][[][
[]]][ []][[]][[][ []]][ [][[] ]][[] ][[][
[]]][ []][[ ]][[] ][[]] [[][[
]]][[ ][[]]][[]][ [][[] ]][[] ][[]] [[]][
[][[] ]][[]][[][[ ]]][[ ][[]] ][[][
[]]][ []][[ ][[]] ][[]] [[][[ ]]][[
][[]] ][[][ []]][ [][[] ]][[] ][[]] [[][[
]]][[ ][[]] ][[][ []]][ []][[ ][[]] ][[]]
[[][[]]][ []][[][[]]] [[][[ ]]][[[]]][[ ][[]]][[]
[[]]][[][ []]][[][[]] ][[][ []]][[][[]] ][[][[]]]
ꝏ - Encode JavaScript with Only One Symbol
with (ꝏ ())
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
...
l33t - Write Code Like a Hacker
with (l33t ()) {
c0ns0l3.w4rn ('l33t ');
al3rt ('w00t' );
}
function l33t(p=this){return new Proxy(p
,{has:()=>!0,get:(t,n)=>(p=Reflect.get(t
,String(n).replace(/\d/g,a=>'oizeasGtBg'
[a])))?p.apply?p.bind(t):l33t(p):p})}
Filler - Hidden and almost Invisible Variables
/ㅤ/-[ㅤ=''],ᅠ=!ㅤ+ㅤ,ㅤㅤ=!ᅠ+ㅤ,ㅤᅠ=ㅤ+{}
ᅠㅤ=ᅠ[ㅤ++],ᅠᅠ=ᅠ[ᅠㅤㅤ=ㅤ],ᅠㅤᅠ=++ᅠㅤㅤ+ㅤ
ㅤㅤㅤ=ㅤᅠ[ᅠㅤㅤ+ᅠㅤᅠ],ᅠ[ㅤㅤㅤ+=ㅤᅠ[ㅤ]+(ᅠ.ㅤㅤ+ㅤᅠ)
[ㅤ]+ㅤㅤ[ᅠㅤᅠ]+ᅠㅤ+ᅠᅠ+ᅠ[ᅠㅤㅤ]+ㅤㅤㅤ+ᅠㅤ+ㅤᅠ[ㅤ]+ᅠᅠ]
[ㅤㅤㅤ](ㅤㅤ[ㅤ]+ㅤㅤ[ᅠㅤㅤ]+ᅠ[ᅠㅤᅠ]+ᅠᅠ+ᅠㅤ+"(ㅤ)")()
א The Aleph - Life out of a Single Symbol
א
<script>
א ='אֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲֲ֤֤֧֥֤֦֣֤֥֦֤֥֦֦֤֤֥֦֦֦֤֥֤֥֤֧֤֦֥֧֦֥֤֧֥֤֥֤֤֧֥֥֧֥֣֣֣֥֥֤֥֧֥֦֣֦֧֦֦֦֧֣֥֥֥֥֥֧֣֥֥֣֧֥֤֣֤֦֥֦֦֥֧֦֣֤֦֥֦֦֥֧֧֥֥֤֣֣֥֤֥֧֦֧֧֤֣֣֥֣֥֧֥֤֧֧֦֣֧֥֧֥֤֤֧֤֤֣֣֥֣֥֤֦֦֧֥֧֥֤֤֧֦֦֤֥֥֤֥֦֧֤֥֦֧֦֣֥֥֤֦֥֧֦֥֤֤֧֥֦֥֤֥֧֥֦֥֧֣֤֥֧֥֥֦֧֤֥֥֥֥֥֥֥֧֧֥֣֥֧֣֥֤֤֥֣֧֥֤֣֣֥֥֣֤֥֣֥֥֣֤֣֣֥֥֥֤֥֣֥֧֣֤֤֥֧֤֣֦֥֥֥֤֥֥֦֦֤֥֦֤֥֧֤֤֧֥֦֥֥֦֥֦֤֥֦֤֥֤֧֥֥֤֧֥֤֧֧֥֠֡֠֠֡֡֡֡֡֡֡֡֡֡֡֡֡֡֡֠֠֠֡֡֡֠֠֡֡֠֡֠֡֠֡֠֠֡֡֠֡֡֠֠֠֠֠֠֠֡֡֠֠֠֡֠֠֠֠֡֡֠֠֠֠֠֡֡֡֠֠֠֠֠֡֠֠֡֡֡֠֠֡֠֠֡֡֡֡֡֠֡֡֠֠֠֠֡֡֡֡֡֡֡֡֠֠֠֠֡֠֠֠֠֡֡֠֠֠֠֠֠֡֠֡֡֡֡֠֠֡֠֠֠֠֡֠֠֠֡֠֠֠֠֠֡֠֠֠֡֠֠֠֠֡֠֡֠֠֡֡֠֠֡֡֡֡֡֠֡֡֠֡֡֡֡֡֠֡֡֠֡֡֡֡֡֡֡֡֠֡֡֡֡֡֠֡֡֡֡֡֡֡֡֠֡֡֡֡֡֠֡֠֠֠֠֡֠֡֠֡'
ב = "" , ח
= ! ב + ב
, ד = ! ח +
ב , ו = ב + {
} , ה = ' " '
, ע = ח [ 0 ] ,
נ = ח [ 1 ] , ך =
ו [ 5 ] , ם = ( ח .
ד + ו ) [ 1 ] , ף = ח
[ 2 ] , מ = ו [ 1 ] , ס = ד
[ 3 ] , כ = ח [ 3 ] , י = ד [ 1 ]
ג = נ + כ + ע + ף + נ + ם + " " , ט = ( ז =
ך + מ + ם + ס + ע + נ + ף + ך + ע + מ + נ ) [ ז ] [ ז ] , ט ( ט
(ג+ה+ט(ג+ט(ג+ה+כ+ס+ך+י+(ן="\\160")+כ+"(א)."+נ+כ+ן+"\\154"+י+ך+כ+
"(/"+(ל=".{5}(.)")+ל+ל+"/\\147,'\\\\\\\\$1$2$3')"+ה)())()+ה)())()
Theseus - A Maze Generator and Solver
S="\40\n";M="map";i=991;for(z
= [ ]
; i ; )z[--i]=i%30? 8
: S [ 1 ] ;
F=d=> [30,1,-30 , - 1
] [ M ] (
( f,g,h )=>S[0]<z [ f
= d + 2
* h[3&g+i]]&&(z[f]=z[(d +
f ) / 2
] = S [ 0],i--,F( f
) ) ) ,
F(32);z+=S[1]//aem1k.com/maze
Polyglot - CSS = JS = HTML
/** CSS **/
html * { color: red }
/** JS **/
var html, red;
document.write('<'+'link href="#" rel="stylesheet">');
/** HTML **/
// <script src="#">
Tweetris - Play Binary Tetris
function(a,b,c,d){d+
=c;return[d<0|a&b<<d // .##..
?a=parseInt((a|b<<c) // .....
.toString(d=32,b=new // .....
Date&2|1).replace('v // .##..
',''),d):a|b<<d,a,b, // ###.#
d]} // tweetris // .####
0|a&b<
ffconf - 2015 Animated Starfield
<body text=#EE3 bgcolor=000 id=p
style="perspective:4.0em;display:
inline-block;padding:15%"><script>
I=1/7;e =' I+=I<\
30?I/30: 1, p.inn\
erHTML="< pr e>"+B\
.replace( /\\S/g, function(a\
,b){retur n\40z=I *(1+b*b/50\
0%2)%130, "<tt\\4 0style=dis\
play:i nline-\
block; transf\
orm:trans late3d( 0,0,"+(z+b\
/17-50)+" px)>.</ tt>"})';$$=
/\s\s+/g; N=0;S=" ";!!+[];e=e
.replace( $$,""); setInterval
(e,30);B= (S)+(p) .outerHTML
.replace(/y.*"/,12);B=S[0]+B.substr
(0,36)+"\n"+B;'a-quine-by-@aemkei\
aem1k.com/ffconf'</script>-ffconf
Symmetry - Symmetric JavaScript
{(.0-{}-0.)} xXXx =wYYw=
([]+!!+[]) [0.**.0] +[([])]+
(''+!!+'') [0-~+!!+~-0] +([]+[]+[])+
(8+{}+8) [0|8.**.8|0] +([]||[])+
(""+(0==0)+"") [0.**.0] +[]+''+[]+
(0+{}+0) [8-!!-8] +(''||'')+
("("+[]+")") [0+~~+0] +""+''+""+
(["xXXx"]) [0+~~+0] +([""])+
(')YY(') [""+~~+""] //-!!-\\
Pac-Man - Play in < 512 Bytes
############# // <pre id=p><script>l="";for(i in L=[a=8191,b=
# # .# // 4161,c=5981,d=5125,5493,5397,5589,d,c,b,a])l
# ### # ###.# // +=L[i].toString(2).replace(/1/g,4).replace(/
# # X .#.# // 0/g,2)+3;l=l.split(""),w=14,x=76,X=48,e=d=k=
# # # ###.#.# // D=!setInterval(onkeydown=function(a){if(a)k=
# # # o #.#.# // a.which;else if(!e){for(l[x]=0,l[x+=d=k-37>>
# # ### #.#.# // 2||4&l[x+(o=k%2?k-38:(k-39)*w)]?4&l[x+d]?0:d
# # ......#.# // :o],e|=8&l[x],l[x]=1,l[X]&=7,h=D%4,h=h%2?h-2
# ### #.###.# // :(h-1)*w,4&l[X+h]?D++:e|=1&l[X+=h],l[X]|=8,h
#.....#.....# // =i=0;153>i;)h+=" o.\n# x"[8&l[++i]||l[i]];
############# // p.innerHTML=h}},250)
try {
to }
catch (
me ){
if (`
you `)
can :'\
! '}
Selected Talks
Photo
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNdyssoooyNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy/..` ``` ``..--/+/+yydNMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMNy- ` `....+mMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMNs.` `` `...`/hNMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMN+` `-dMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMN: ` ``-dMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMN- ` ``.:/dMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMdo` `.-/-hMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMNo` .:/:/.:hMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMN/ `.../sms.:o NMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMo` ``..-//:yNMMm::s hMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMy. ``..---.``.::///++oyNMMMMM+:so MMMMMMMMMMMMMM
MMMMMMMMMMMMMMMN- ``..---::::/+ooosydmNMMMMMMN+//+ NMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMy- `....---:://+oyhdmNNNNMMMMMMmy/-+ NMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMmo `....----::/++ohmmNNNNMMMMMMMMN/./ mMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMN/ `.....``````..-::/osyhddhhddddmNd.. +NMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMy` `.--...```````` ``-:/+++/:.``./hs` oNMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMNo+:.` .---..``` `.`````.:+o:.` `:+mN NMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMm:` ```----...``````:-``.``-+mN+..``:NNMM MMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMmh-..`..`-::--........---....-oNMNdyyhmMMM MMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMho:. `-..``-:----..--::::::-...-+NMMMMMMMMMM MMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMNo. ` `.-------:://///:-....-/hMMMMMMMMMh `oMMMMMMMMMMMMMMMM
MMMMMMMMMMMMN- .-:------:::::--.`..--/sMMMh+yNMMh sMMMMMMMMMMMMMMM
MMMMMMMMMMMMo `.-----..........`````.-+dNm+-/dN- +MMMMMMMMMMMMMMM
MMMMMMMMMMMM. `.--...````````````````.oNMMo:.o/ +MMMMMMMMMMMMMMM
MMMMMMMMMMMM/ `....````` ````.-:/+hmmy-:/y oMMMMMMMMMMMMMMM
MMMMMMMMMMMMs ``..````````` ```.-+shyydh. dMMMMMMMMMMMMMMM
MMMMMMMMMMMMy ``````````..``````--:/yMMNmh. /mMMMMMMMMMMMMMM
MMMMMMMMMMMMs `````` ``````````.-oNNh+. .+oyhhmMMMMMMMM
MMMMMMMMMMMM. ` ````````....-:ohmNd/` `-:+sh
MMMMMMMMMMMs `...--/ydy:
MMMMMMMMmdy- `.-.
MMMNy+-.
ms: ```
Contact
#
#
##
# #
## # #
## # # # #
# # # # ##
# # # # # #
# # # # # #
20XX - Martin Kleppe Ubilabs