From 38650369e678a64e456280f83c1c565104ec84dd Mon Sep 17 00:00:00 2001
From: Bye <bye@byecorps.com>
Date: Mon, 29 Aug 2022 17:24:30 +0100
Subject: [PATCH] a good day's worth of progress

---
 #foo.bar#  |   1 +
 .swp       | Bin 0 -> 12288 bytes
 game.js    | 274 ++++++++++++++++++++++++++++++++++++++++++++++-------
 index.html |  11 +++
 t.aseprite | Bin 2419 -> 3191 bytes
 t.png      | Bin 765 -> 1390 bytes
 test.html  |  24 +++++
 7 files changed, 278 insertions(+), 32 deletions(-)
 create mode 100644 #foo.bar#
 create mode 100644 .swp
 create mode 100644 test.html

diff --git a/#foo.bar# b/#foo.bar#
new file mode 100644
index 0000000..ce7c795
--- /dev/null
+++ b/#foo.bar#
@@ -0,0 +1 @@
+ByeMC is awesome
\ No newline at end of file
diff --git a/.swp b/.swp
new file mode 100644
index 0000000000000000000000000000000000000000..3bffb92fcf05120f22984d74137996aeb902964e
GIT binary patch
literal 12288
zcmYc?2=nw+u+TGNU|?Vn01*)Uy^Vn(sWKJ9AwXv2mlmh$7UUNYP&X<)8UmvsFpwd@
z8ER}~XaI77vXY{Luuv$7If_R^U^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qNC=b^Ff!CL
zFfcGd{mY1hh6;~TqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd70wFa#1)
z7#Pm;Gcdg8hs^)O`u|}55cJQelSe~fGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q
ZLtr!nKuh{_lNB<H6%xx+i}Q0+82|<d75)GK

literal 0
HcmV?d00001

diff --git a/game.js b/game.js
index ee76db8..4b69b43 100644
--- a/game.js
+++ b/game.js
@@ -13,7 +13,20 @@ const log = (logType, msg) => {
 const fontStack = '"Comic Sans MS"';
 var id = 0;
 var pi = Math.PI;
-var customLevel = document.location.hash;
+gPar = (key) => {
+
+    // Address of the current window
+    let address = window.location.search
+
+    // Returns a URLSearchParams object instance
+    let parameterList = new URLSearchParams(address)
+
+    // Returning the respected value associated
+    // with the provided key
+    return parameterList.get(key)
+}
+
+var customLv = gPar("lv");
 
 class Canvas {
     constructor(id) {
@@ -209,7 +222,7 @@ class Canvas {
     }
 
     // Camera stuff
-    mvCamera(x, y, s) {
+    mvCamera(x, y) {
         this.camera.x += x;
         this.camera.y += y;
     }
@@ -285,6 +298,9 @@ class Room {
     click(x, y) {
         // console.log(x, y);
     }
+    mHeld(x,y){
+
+    }
 
     start() {
 
@@ -385,33 +401,35 @@ for (var key in images) {
 
 var levels = [
     {
-        "name": "The First One",
-        "data": `@R>1!""!#"!$"!&""""#""$""%""&""&#"&$"&%"&&"&'"%'"$'"#'""'"!'""#!##!$#!%#!%$!%%!%&!$&!#&!"%!!%""$!#$!$$!$%!#%!"&!`,
-        "tile": images.level.tileset,
-    }
+        "name": "Tutorial",
+        "data": "[[1,1,2],[1,1,3],[5,1,4],[1,1,1],[2,0,3],[2,0,2],[2,0,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[5,4,0],[5,6,0],[5,5,0],[5,7,0],[6,8,0],[0,9,0],[0,10,0],[2,8,1],[2,8,2],[2,8,3],[8,8,4],[5,7,4],[5,5,4],[5,6,4],[5,4,4],[5,2,4],[5,3,4],[7,0,4],[1,2,3],[9,2,2],[1,2,1],[1,3,1],[1,3,2],[1,3,3],[1,4,3],[1,4,2],[1,4,1],[1,5,1],[1,5,2],[1,5,3],[1,6,3],[10,6,2],[1,6,1],[1,7,1],[1,7,2],[1,7,3]]"
+    },
+    {
+        "name": "First Floor"
+    },
 ]
 
 hamsterRef = {
     "file": images.player.car,
-    "nolights": {
+    "nl": {
         "x": 1,
         "y": 1,
         "w": 32,
         "h": 16,
     },
-    "brake": {
+    "b": {
         "x": 35,
         "y": 1,
         "w": 32,
         "h": 16,
     },
-    "brakereverse": {
+    "br": {
         "x": 1,
         "y": 20,
         "w": 32,
         "h": 16,
     },
-    "reverse": {
+    "r": {
         "x": 35,
         "y": 20,
         "w": 32,
@@ -436,6 +454,30 @@ var levelRef = {
         {
             "x": 64,
         },
+        {
+            "x": 96,
+        },
+        {
+            "x": 128,
+        },
+        {
+            "x": 160,
+        },
+        {
+            "x": 192,
+        },
+        {
+            "x": 224,
+        },
+        {
+            "x": 256,
+        },
+        { // player
+            "x": 32
+        },
+        { // human
+            "x": 32
+        }
     ]
 }
 
@@ -459,7 +501,7 @@ menu.s = 0
 menu.o = [
     {
         "t": "Play",
-        "a": _=>{ setRoom(2) } // go to game room
+        "a": _=>{ setRoom(4) } // go to game room
     },
     {
         "t": "Editor",
@@ -535,9 +577,9 @@ player.direction = 0;
 player.accel = 1;
 player.sprite = images.player.car;
 console.debug(player.sprite);
-player.crop = hamsterRef.nolights;
-player.x = c.w/2;
-player.y = c.h/2;
+player.crop = hamsterRef.nl;
+player.x = 0;
+player.y = 0;
 player.w = player.crop.w*2;
 player.h = player.crop.h*2;
 
@@ -561,7 +603,7 @@ player.draw = () => {
     // canvas.strokeRect(player.x, player.y, player.w, player.h, "white");
 
     let gun = images.player.gun;
-    let gunOx = 14;
+    let gunOx = 13;
     let gunOy = 0;
 
     let carCx = player.x + player.w/2;
@@ -675,17 +717,24 @@ gameRoom.click = (e) => {
     player.shoot();
 }
 
-gameRoom.start = () => {
-    gameRoom.level = load_level(gameRoom.level.data);
-    if (customLevel) {
-        gameRoom.level = load_level(customLevel);
+gameRoom.start = () =>{
+    if (customLv) {
+        gameRoom.level = customLv
+    }
+    gameRoom.level = JSON.parse(gameRoom.level);
+
+    for (let tile of gameRoom.level) {
+        if (tile[0] === 9) {
+            player.x = tile[1]*64
+            player.y = tile[2]*64
+        }
     }
 }
 
 gameRoom.draw = () => {
-    for (let tile of gameRoom.level.m) {
+    for (let tile of gameRoom.level) {
         // [index, x, y]
-        c.sliceImage(levelRef.file, tile[1]*32, tile[2]*32, 32,32, tile[0]*32, 0, 32, 32);
+        c.sliceImage(levelRef.file, (tile[1]*32)*2, (tile[2]*32)*2, 32*2,32*2, levelRef.tiles[tile[0]].x, 0, 32, 32);
     }
     
     for (let i = 0; i < cRoom.objects.length; i++) {
@@ -694,17 +743,159 @@ gameRoom.draw = () => {
 }
 
 let editor = new Room("Editor");
+editor.i = 0;
+editor.t = levelRef;
+editor.l = []
+editor.n = "LV1"
+editor.saving = false
+editor.sa = 0
+
+editor.start = _=>{
+    editor.dPos = [15,65]
+}
+editor.draw = _=>{
+    for (let tile of editor.l) {
+        // [index, x, y]
+        c.sliceImage(levelRef.file, (tile[1]*32)+editor.dPos[0], tile[2]*32+editor.dPos[1], 32,32, tile[0]*32, 0, 32, 32);
+        c.drawRect(editor.dPos[0], editor.dPos[1], 1,1, "red")
+    }
+}
+editor.step = _=>{
+    if (editor.i < 0) {
+        editor.i = levelRef.tiles.length-1;
+    }
+    if (editor.i > levelRef.tiles.length-1) {
+        editor.i = 0;
+    }
+}
+editor.generate = _=>{
+    editor.saving=1
+    let encodedLevel = encodeURIComponent(JSON.stringify(editor.l))
+    if (encodedLevel != editor.data){
+        encodedLevel = "?lvl=" + encodedLevel;
+        document.getElementById("leveltext").innerText = encodedLevel
+    }
+    editor.data = encodedLevel;
+    editor.saving=0;
+    editor.sa = 1;
+}
+editor.click = (x,y)=>{
+    if (y < 50) {
+        if (x> 516 && y < 50) {
+            if (!editor.saving){
+                editor.generate()
+            }
+            editor.saveclick = true
+        }
+    }
+     else {
+        x = Math.floor((x-editor.dPos[0])/32)
+        y = Math.floor((y-editor.dPos[1])/32)
+        // console.debug(x,y)
+        for (let t in editor.l) {
+            if (editor.l[t][1] == x && editor.l[t][2] == y) {
+                editor.l[t] = [editor.i, x, y];
+                return;
+            }
+        }
+        editor.l.push([editor.i,x,y])
+        editor.sa = 0
+    }
+}
+editor.keyHeld = (key) => {
+    switch (key) {
+        case "KeyW":
+        case "ArrowUp":
+            editor.dPos[1] += 4
+            break;
+        case "KeyS":
+        case "ArrowDown":
+            editor.dPos[1] -= 4
+            break;
+        case "KeyA":
+        case "ArrowLeft":
+            editor.dPos[0] += 4
+            break;
+        case "KeyD":
+        case "ArrowRight":
+            editor.dPos[0] -= 4
+            break;
+    }
+}
+
 editor.drawGUI = _=>{
-    c.dT("bye", c.w/2,c.h/2,1,1,"#fff")
+    c.drawRect(0,0,c.w,50,"gray")
+    c.dT(`DBH Editor::${editor.n}`, 15,25,2,2,"#fff","start","middle");
+    let s = c.dT(`Save`, c.w-15,25,2,2,"#fff","end","middle");
+    if (c.mousePos.x > (c.w-30)-s.w && c.mousePos.y < 50) {
+        // console.debug((c.w-30)-s.w)
+        c.dT(`Save`, c.w-15,25,2,2,"#e5e5e5","end","middle");
+    }
+    if (editor.sa) {
+        c.dT(`Save`, c.w-15,25,2,2,"#1fdc2f","end","middle");
+    } if (editor.saving) {
+        c.dT(`Save`, c.w-15,25,2,2,"#1fccdc","end","middle");
+    }
+
+    c.sliceImage(editor.t.file, c.mousePos.x+16,c.mousePos.y+16,32,32,32*editor.i,0,32,32);
+}
+
+let lvlS = new Room("Level Select")
+lvlS.s = 0
+lvlS.o = levels
+
+lvlS.drawGUI = () => {
+    c.dT("Death by Hamster", c.w/2, 25, 2, 2, "white", "middle", "top");
+    c.dT("Level Select", c.w/2, 44, 1,1,"gray","middle","middle");
+    for (let o in lvlS.o) {
+        let n = parseInt(o)+1
+        let slice = 15
+        if (n >= 100){
+            let slice = 13;
+        } else if (n >= 10) {
+            let slice = 14;
+        }
+        let txt = c.dT(`${n}.${lvlS.o[o].name.slice(0,slice)}`, 40, (70)+(o*20), 2,2,"#fff");
+        if (lvlS.s == o) {
+            let a = images.ui.a;
+            let ap = (40)-a.width-4;
+            let ap2 = (40+txt.w)+a.width-4;
+            c.drawImg(a, ap, (70)+(o*20), a.width*2, a.height*2)
+            c.drawImg(a, ap2, (70)+(o*20), a.width*2, a.height*2, 180)
+        }
+    }
+    c.drawLine(c.w/2, 60, c.w/2, c.h-20, "white")
+}
+
+lvlS.keyDown = (key) => {
+    if (key == "ArrowUp" || key == "KeyW") {
+        lvlS.s -= 1
+        if (lvlS.s < 0) {
+            lvlS.s = lvlS.o.length-1
+        }
+    }
+    if (key == "ArrowDown" || key == "KeyS") {
+        lvlS.s += 1
+        if (lvlS.s > lvlS.o.length-1) {
+            lvlS.s = 0
+        }
+    }
+    if (key == "Space" || key == "Enter") {
+        gameRoom.level = lvlS.o[lvlS.s].data;
+        setRoom(2)
+    }
 }
 
-rooms.push(loader)
+rooms.push(loader);
 rooms.push(menu);
 rooms.push(gameRoom);
-rooms.push(editor)
-var roomI = 0;
+rooms.push(editor);
+rooms.push(lvlS);
+var roomI = !gPar("goto") ? 0 : gPar("goto");
+
 var cRoom = rooms[roomI];
 
+
 var keysPressed = {};
 var keysLastPressed = {};
 
@@ -720,18 +911,36 @@ var lastTime = 0;
 
 var mse = {x: 0, y: 0};
 var lastClick = {x: 0, y: 0};
-var clicked = false;
+var startclicked = false;
+var endclicked = false
 
 c.c.addEventListener('mousemove', (e) => {
     mse = c.getMousePos(e);
 } );
 
-c.c.addEventListener("click", (e) => {
-    console.log(e);
+c.c.addEventListener("mousedown", (e) => {
+    // console.log(e);
     lastClick = c.getMousePos(e);
     mse = c.getMousePos(e);
-    clicked = true;
+    startclicked = true;
 });
+c.c.addEventListener("mouseup", (e)=>{
+    // console.log(e);
+    lastClick = c.getMousePos(e);
+    mse = c.getMousePos(e);
+    endclicked = true;
+})
+
+window.onwheel = (e)=>{
+    if (e.deltaY > 0) {
+        editor.i += 1;
+    }
+    if (e.deltaY < 0) {
+        editor.i -= 1;
+    }
+}
+
+cRoom.start();
 
 var gameLoop = setInterval(() => {
     c.tW = c.c.offsetWidth;
@@ -750,11 +959,11 @@ var gameLoop = setInterval(() => {
             }
         }
     }
-    if (clicked) {
+    if (startclicked) {
         cRoom.click(lastClick.x, lastClick.y);
-        clicked = false;
+        startclicked = false;
     }
-    
+
     cRoom.step();
     cRoom.draw();
     cRoom.drawGUI(); 
@@ -764,6 +973,7 @@ var gameLoop = setInterval(() => {
 
     switch (cRoom.name) {
         case "menu":
+        case "Editor":
             c.ctx.drawImage(images.mouse.cursor, Math.round(mse.x), Math.round(mse.y), images.mouse.cursor.width*2, images.mouse.cursor.height*2);
             break;
         case "Game":
diff --git a/index.html b/index.html
index f41d3a4..30b0ff2 100644
--- a/index.html
+++ b/index.html
@@ -16,13 +16,24 @@ cursor: none;
 }
 /* if the canvas can't fit the screen, shrink it, maintaining the aspect ratio */
 
+    aside {
+        float:left;
+    }
+    aside pre {
+        color: white;
+    }
+
 @media screen and (max-height: 800px) {
     #gameCanvas {
         width: auto;
         height: 100%;
     }
 }
+
 </style>
+<aside >
+    <pre id="leveltext">    </pre>
+</aside>
 <canvas width="600" height="400" id="gameCanvas">
 </canvas>
 <script id="fontScript" src="./letters.js"></script>
diff --git a/t.aseprite b/t.aseprite
index 3b8a3293977887579da088b9a0a92661fcca0b73..52c9e7b9b68564b35e02721e04dabb65ee07f358 100644
GIT binary patch
delta 586
zcmew?^j(6zoQHwo!BXyx>~d_34<_5Ox--t0ypdVD{_S)}t^)=fEPwwO|4H!5Uz)Hf
zZR@s>ME{d#*zyG@D$ccEzPuo$bWY-pSoXvBBiA=4ZvGW`FDcMnb$^m_#p%XPl7HUF
zy>|Ga|1DnD`niVmM)@@JK)!AFA9tiFR~#`+zG$BEZM_Un|Azb*+hus(CsxbNef8gc
zxdD4?{^3{m85kxzu(~o%hq&a5BVU68kITh-|1I_|$cvqEgRfpdStWMA<`lOhg1i64
zY(D=@f9lL{xBl(=cS3>F>>0P-qi$Q}e+#sKJDlIde|yFKlEU~iA6EWepH^_LUcLQt
zdy&u0{qO$XKl$*Bw&a|D(SO75?|<<4_lt-89(E7B>|WgZv#9#@eAkU_Zci8(7$!Ti
zx-iaxxa3+aUxNV$bHclN89j^nrfS+3_=F=bxqrSo-|%eCP1_Ge-?yGVo$9auMtR*K
z{au;!pS0C(>i)+0lXd$W;Wv}k@2lU^{OYfJwMK0s|II(aKPSq0$-i9itz33W-Sf}y
z|NPtaZGHw@;IsHct$&!)1)ly_p8awEYx$_h{&lmtH6FAvxxE5M&?1Oqt{CziP~c%c
z@aMl}%>=#JgoAy_w-hJZgr#eFxSWaDd`2R9-lqEE8FwewZeo8bUA5%TA-O5(F9IJK
z+s?7Obns<;Y28D<Q~Q3fU9P*xx2X2>zsb25w*FWW`%3*y(Enrq%}X}ywcp-f!cY}+
obAO)v%Z4}gCEGPK|L?aef9$pFuOIvKv&@tA+uSy<V>`+O09Ya_O8@`>

delta 80
zcmew^@mYwyn3I9w!BUQm>~d_3os;cY-5DJxZ)6tN;%2Crlbn$7<GewayCKtM>7I<=
m=DD}N$hW=BmEZgJ*z>lDS@sOqY|cBUPnP2L*!-Kbh6w<kMIY|~

diff --git a/t.png b/t.png
index 3e8190fc4f3c8292230fa528fd6bde5f9c911aa8..bd2c211e511e380f3b330f03afbe694c702de509 100644
GIT binary patch
literal 1390
zcmeAS@N?(olHy`uVBq!ia0y~yU`$|OU{K&-V_;y=@mn;7fq{XsILO_JVcj{ImkbQ7
z8lEnWAr*7p&OMv^*g&B5<x#N(YBlFo+eIdpBrq0oYO1KJG+c5FYT@7c<el1;#_t;@
zC>s8mshDn|TxplEahlJ^K(4<wQj<QN<1Du17x(;ocVB!C|KWypi(l`0QT^CLZ`<#E
z{ZmYMV*Y!7-OZWv|MORGlb|2JrW^nJyiN6=mwCcj2dm|Y0gKn(_kDX%;^Un4zpo$t
z_V~MZ>1+e5<ChaR{(t+h+0}kYGFuEsX-a~GrNJ@ptKXMZDcsuXR?|I$QGCMdo@<P}
zUMfB2VfxDj?R)M2$G@px?y2|uVfe0sTlR+a_ET=nc=i9yyQW|7|GxYGzwx`qm*v0a
zr$>exC$Q))x;IJ2ge`~f!U9%fwgZWKw${gYcVrqevn2(tUnsb;uHEpFO#glTgD->*
zmB^$SywCg-Ii<e(N5-oE_uj92dbYthV%_x%U2S#deab%<C>%MHq}jOj<!nav31;!D
z`eJV#o3{9^YVMcY?Q0ib{aN^R;=0#Id}lnC`gKgq$fe`w)1pmMU;Z~lr|L)?58U%P
zpYsj7Wr$pG`?i%aiVA;MzqXoK-1y4LUU})~M*ZiFDS8{H?2{}|%>Kb3{hIxk>-|mk
zPQBB$93Fa^W?a}V;=(GG$GDy4OVu(ShM?n8`)w4P<L+$c+Yww;r!v#Xu1~Z?=vUeS
zP6cM3IdkQ#4ji=nJ~{gS`uV@T*P7+eS*6YLb*IM{&llohy>g{fUS6NRI^OGkkbvZp
zd`87za|GvZsp|||!;@;Qcv;ADzeM!clh<Ch30%l94mo!}eA4EpSIn8&m`s)Yl&4+F
zTYEln!Ia#~M(Q!nzr3BLuk|cdnBcKYbwQ=W$)_tK{@(by#+JYD^@5`nwZ1Fom_7aJ
z^!(nmDG%4|4!f`PfXQTuYSFIf&NkBpny=<6*Unw}wfuM8$NXF3+UEEB_RhQhSYAB4
z`M=e6{iU<B<`<_O2=%yE=jrd8wb0()E-c))Z`LcBC1=dpU3W))-yG9dw*CG3)Sxsg
zee?CRC(Uqdzm?uxAnj6R$T8J!dgC%BlT~HeCh@Pzw#sz0x~vqin6C9(%G7(hE_+PJ
zwCJ3dWdVBA*G1k{o5-DO%O7JUbv`z^Ya@Th%+_gK?LkZnEBC5?U4B3(m~ZQ4r3953
zd&IxD7i&MWZj{}Vy>Rm4tM?s>Zb^r=|DM%yNo2yy)C((ilvNr&tLScM%&5@#*78N1
zVR~Ke-U%8Kx7A)AwYU_R@3r~rsy%m<<(>KW&YYc_`)>LsJ$d5?JhOVPTmIx%S-$Vd
zlvN@Z((eZ?S6Oh~>9OhT12MucoY?-Co)Ixj4L<(lmf&jpt@(#|EE-FeSf-yo_WJt7
zOQ$lI^sUdG-}c;4;`Sk)9Zb5%Uf=n3i8tHLN_V4c5Oem<#&vhzZ<=azfBV#ZyoWU1
zs$};~sna?hU1j4gz4Up~eXWhI0vFgHT=DZ?d}TYw4yKpK1HIhC?*z|N=|BF$V{OG9
zr5TRvuIP&<fAfA7%`%5U>Y<0L<)w>Lx9nqkBXz-PtAKLY_TtRRxoh*;<~aUd`|R30
z_6=frU-wx4*i~OT|88vX-u1t)zy9{Iq~QGFr8ED1EGamC`JiRGCWnEL@`DR6{bg>&
z{HoRe{n^N}O|h2yl&x;y@2?M+l^oCxySIL~3hTj@`GN*Qom*Ja7IZ5cO}=)Wp^Wv3
z?z8;tpKsoYP0ZvuA#>+Knck&3Ilb#Ara0S+WJa^ZG+a6IN7wDht&7_Po=@|5nx)vS
z|EE@<`1uw4d3Dpxnb$dFJrz5~v3<pQUgLXKa{J?5O7F?p&3e&Z@{h4y-7jnH-ctt|
Q7#J8lUHx3vIVCg!0A%)~yZ`_I

literal 765
zcmeAS@N?(olHy`uVBq!ia0y~yU|7Jwz@Wgv#=yWZwZ8Z(0|NtNage(c!@6@aFBuq^
zwtKobhE&XXJI6au$&sgRwfoMXz6l<YlbAO?a5!9~QpCb{_2v?x{?EJR-mTikSRcf4
z<#g|ljj?)G-bQJA<HEduzyBYnb9VXueEDVH*8WVcWjvTH%*5kUxoKa+gZ8ICL*GQN
z7r(JTPQSn|_xhLjsrEJr30@o*I91;V&t5+F^})K9g!Tm=T95Sz%-i}`V1e@w_S>`9
zFErF$v}uF9;tft)riY)m6x-h5XS~O-*=a5NZ^0(ngSMV)b&B}E9cHd8w9|X^`g7sW
zue;3VZ~N%(a?khDe%%j0w|-sorkz21PQSO+oNFZ(Yh4-7F1dPpLE#?X$(zq^c^}m9
z;<nMMd!dKDQu@1g%UrN}=$7GHX|eW$;Kiuw%RMu9ehd4pXS;ya^2jCkTgQ)1{_HeG
z+iPdM?+Fd|>`u0&&r9Y`(`dT3YU|WD)7I&$w#!`*db09D@spEYxw>)&llQi&OnLhA
z>wd#Y<&L$B{rxxb>KT;OUfSBmUUF<jO!>1w+3g#jzIdl*v*7ri0x?~AH7hM=MZv3I
zO<qrbVY$rtdS$TO29dk~zM$;O3vN#6xfi)O$jiHO=~eAK+ql;=-(O?S;ybdmWiR_K
z#)XF#{*=D8=0k7ymW3B5+;@J-J>z8ZiW}SJMfJpVC&ztRWUlI&AH*eFV&mJfRAt7E
zKXrcjUXK<zK5|SBI<z~(^T3oHnlBkAIu))yzN*sU-uA1^_l)zL3~pUoT=&ar>AndU
zjKZ`IUitO&M%>4#W@5JA%NLaST5X<QD=xQT+VYR)H>x)1tu>sr*LKd7-`oB%BwXX?
zHTf1>ap0bn(BHIPu~}1Yr>1qUy}o!c|IY1qFYV)I+}7m9ue`D|pFi!bS@iXLxA%1m
zylD+g6@DKf{_SpS!l^ScYgy0!eCx4=bHB;F^=ml~8ozC4-{ZI>B&Dp&=<vSPPFq+%
j-rtzR$uBYE6Q}#stnK>8{goLQ7#KWV{an^LB{Ts5a$<EN

diff --git a/test.html b/test.html
new file mode 100644
index 0000000..062cd98
--- /dev/null
+++ b/test.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+</head>
+<body>
+    <li>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Sed accusamus id architecto fugiat enim eveniet dolor labore odio quas. Exercitationem ea mollitia quisquam laudantium! Cumque sunt dignissimos dolorem sed suscipit.</li>
+    <li>Dolorem, vitae. Tempora earum iure autem error quia eum, eligendi neque quidem ea quasi tenetur nobis. Exercitationem, architecto impedit? Architecto ex adipisci ducimus odit esse quia perferendis at voluptas minima?</li>
+    <li>Fugiat nulla id accusamus iusto dolorem labore facilis est quibusdam, accusantium, tempora cumque culpa minus? Cumque fugiat veritatis, officiis eaque fuga nostrum aliquam? Architecto explicabo cumque fugiat. Laborum, omnis asperiores!</li>
+    <li>Ducimus praesentium consequuntur cum suscipit velit quam aut corrupti debitis in necessitatibus quasi possimus quisquam nihil tenetur veritatis amet molestias dolor quia ratione sit eveniet, quaerat at. Quam, eos libero.</li>
+    <li>Natus, dolore. Mollitia doloribus in molestias iusto est temporibus non quas vero, debitis eveniet eaque nam voluptates sed ducimus aut facere obcaecati dolorem beatae repudiandae eum, sapiente tempora perferendis cum!</li>
+    <li>Itaque, quo nam architecto placeat reiciendis expedita quibusdam eos tempora accusantium aliquid commodi accusamus repellat? Tempore blanditiis eos, magnam sequi, perspiciatis impedit eveniet placeat alias velit praesentium voluptates. Totam, minus.</li>
+    <li>Iusto recusandae sint accusantium voluptatibus quo illum molestias, amet, at voluptates ducimus tempora tempore error nemo impedit quos architecto esse fugiat eaque molestiae unde dolorem laudantium. Aspernatur suscipit sint adipisci?</li>
+    <li>Vel optio quod quas. Perferendis, dolorum. Minima nihil ipsa eligendi temporibus! Sit praesentium maxime expedita, dolorem libero consequatur error quae quisquam iste vel possimus temporibus culpa repellendus molestiae eum aliquam?</li>
+    <li>Repellat distinctio, necessitatibus minima ipsa debitis unde quidem nobis consequatur aliquam deleniti perferendis ullam nostrum maiores ea voluptate obcaecati optio aliquid vero nihil. Nesciunt culpa molestias quisquam cum? Blanditiis, amet.</li>
+    <li>Harum velit accusantium aspernatur perspiciatis labore blanditiis facere fugiat non repudiandae, animi nostrum quidem necessitatibus officia perferendis fugit? Vitae fugit enim facilis animi quasi in magnam atque sed esse sit.</li>
+    <li>Molestiae atque, vitae earum similique voluptas dolorem ea pariatur veniam cupiditate eius debitis, qui dolores cum quis est. At aperiam quisquam sed atque rem animi et tempora excepturi quos minima.</li>
+    <li>Sunt quos tempore fugit ab modi, eligendi amet cumque ipsum excepturi aperiam consectetur autem accusantium? Quas qui exercitationem iusto harum voluptatum odit illo quidem deleniti. Voluptatem eaque fuga cumque laboriosam?</li>
+    <li>Quos officia inventore rerum assumenda! Aliquam quasi, libero molestiae dignissimos delectus quos ipsa minima mollitia qui dolorum quibusdam maiores accusamus? Voluptates autem, placeat eaque laudantium tempora quisquam minima at explicabo.</li>
+</body>
+</html>
\ No newline at end of file
-- 
GitLab