aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-07 23:06:23 +0900
committernsfisis <nsfisis@gmail.com>2026-02-07 23:06:23 +0900
commit9d5ec5e3bc01c6174dea048e118edee579c36565 (patch)
tree8bdb98836728e14f61bad56043f67bb352590963 /services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html
parent479747454273abdbe9b5cc3f5c3dd18bbda7741a (diff)
downloadnsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.gz
nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.tar.zst
nsfisis.dev-9d5ec5e3bc01c6174dea048e118edee579c36565.zip
fix(style): fix codeblock style for rouge
Diffstat (limited to 'services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html')
-rw-r--r--services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html256
1 files changed, 124 insertions, 132 deletions
diff --git a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html
index 510f3062..25859d88 100644
--- a/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html
+++ b/services/nuldoc/public/blog/posts/2025-01-08/phperkaigi-2023-tokens-q1/index.html
@@ -15,7 +15,7 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPerKaigi 2023 トークン問題解説 (1/5)|REPL: Rest-Eat-Program Loop</title>
- <link rel="stylesheet" href="/style.css?h=81dfc0b483beda175e3e17562faac7c9">
+ <link rel="stylesheet" href="/style.css?h=c3724e2d900f13528c82005e79a8ec23">
</head>
<body class="single">
<header class="header">
@@ -167,8 +167,7 @@
まずはトークンを得る方法を解説抜きで説明する。次のように実行する。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "#iwillblog" | php Q1.png &gt;/dev/null
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "#iwillblog" | php Q1.png &gt;/dev/null</div></code></pre>
</div>
<p>
無事に実行できていれば「#ModernPHPisStaticallyTypedLanguage」というトークンが得られる。
@@ -182,8 +181,7 @@
まずは素直に画像として見てみよう。全体は QR コードになっている。適当な QR コードリーダで読み込むと、次のようなテキストが表示されるはずだ。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png &gt;/dev/null
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png &gt;/dev/null</div></code></pre>
</div>
<p>
メッセージは、この画像の実行方法とこの問題でやるべきこと (パスワードの推測) を示している。
@@ -198,9 +196,8 @@
不正なパスワードを使って実行してみると、次のようなエラーメッセージが表示される。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code>$ echo "foo" | php Q1.png &gt;/dev/null
-401 Unauthorized
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ echo "foo" | php Q1.png &gt;/dev/null
+</div><div class="codeblock-line">401 Unauthorized</div></code></pre>
</div>
<p>
すでに <a href="#section--how-to-solve">「解き方」の節</a> で示したように、パスワードである PHPer トークンは「#iwillblog」である。これを与えて実行すると正解のトークンが得られる。
@@ -270,25 +267,23 @@
<code>strings</code> コマンドを使うと、隠されたデータを簡単に閲覧できる。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code>IHDR
--HHc
-&lt;PLTE
-IDATx
-IEND
-&lt;?php
-error_reporting(-1);
-$b = unpack('C*', file_get_contents(__FILE__));
-$w = $b[20]+2;
-$h = $b[24]+2;
-// (以下略)
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">IHDR
+</div><div class="codeblock-line">-HHc
+</div><div class="codeblock-line">&lt;PLTE
+</div><div class="codeblock-line">IDATx
+</div><div class="codeblock-line">IEND
+</div><div class="codeblock-line">&lt;?php
+</div><div class="codeblock-line">error_reporting(-1);
+</div><div class="codeblock-line">$b = unpack('C*', file_get_contents(__FILE__));
+</div><div class="codeblock-line">$w = $b[20]+2;
+</div><div class="codeblock-line">$h = $b[24]+2;
+</div><div class="codeblock-line">// (以下略)</div></code></pre>
</div>
<p>
<code>IHDR</code> や <code>IEND</code> が PNG 画像の一部で、<code>&lt;?php</code> からが実際のプログラムになっている。もちろんこれを PHP プログラムとして動かすと、PHP タグより前にある PNG 画像としてのデータはそのまま標準出力へと出力されてしまう。それを防ぐため、QR コードを読み込んだときの実行方法
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code>Guess password. $ echo "password" | php Q1.png &gt;/dev/null
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">Guess password. $ echo "password" | php Q1.png &gt;/dev/null</div></code></pre>
</div>
<p>
には標準出力を捨てるよう <code>&gt;/dev/null</code> と指定されている。
@@ -303,108 +298,107 @@ $h = $b[24]+2;
画像の正体がわかったところで、画像に隠されていた PHP プログラムについて見ていこう。先ほどは一部しか記載しなかったので、全体を載せる。なお、ある程度ゴルフしながら書いたので、空白こそ残しているものの可読性は非常に低いことと思う。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">&lt;?php</span>
-<span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
-<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
-<span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
-<span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span>
- <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
-<span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span>
- <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span>
-<span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
-<span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">&gt;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
- <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">1</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
- <span style="color: #0550ae">2</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
- <span style="color: #0550ae">3</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
- <span style="color: #0550ae">4</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #0550ae">5</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
- <span style="color: #0550ae">8</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
- <span style="color: #0550ae">11</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #0550ae">12</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span>
- <span style="color: #0550ae">13</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #24292f;background-color: #f6f8fa">[</span>
- <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
- <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span>
- <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #24292f;background-color: #f6f8fa">]),</span>
- <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #0550ae">15</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
- <span style="color: #0550ae">16</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #0550ae">17</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
- <span style="color: #cf222e">default</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
- <span style="color: #24292f;background-color: #f6f8fa">};</span>
- <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
- <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
- <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
- <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
- <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
- <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
- <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
- <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
- <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
- <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
- <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
- <span style="color: #24292f;background-color: #f6f8fa">)</span>
- <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #24292f;background-color: #f6f8fa">}</span>
- <span style="color: #24292f;background-color: #f6f8fa">}</span>
- <span style="color: #24292f;background-color: #f6f8fa">}</span>
- <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
- <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
- <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #24292f;background-color: #f6f8fa">}</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
- <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
-<span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span>
-<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span>
-<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span>
-<span style="color: #6e7781">// Piet any longer at that time.</span>
-<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">&lt;?php</span>
+</div><div class="codeblock-line"><span style="color: #953800">error_reporting</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$w</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">20</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$h</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">]</span><span style="color: #0550ae">+</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$cs</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
+</div><div class="codeblock-line"><span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$h</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$x</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span> <span style="color: #0550ae">||</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #0550ae">0</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">122</span><span style="color: #0550ae">+</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$i</span> <span style="color: #0550ae">=</span> <span style="color: #953800">stream_isatty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">?</span> <span style="color: #24292f;background-color: #f6f8fa">[]</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">:</span> <span style="color: #953800">array_map</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">ord</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">...</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">str_split</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">trim</span><span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #24292f;background-color: #f6f8fa">string</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #953800">fgets</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDIN</span><span style="color: #24292f;background-color: #f6f8fa">))));</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #0550ae">$o</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">''</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$ns</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ns</span> <span style="color: #0550ae">&gt;</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">e5</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"infinite loop detected</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$c1</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">6</span> <span style="color: #0550ae">+</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">-</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c0</span><span style="color: #0550ae">-</span><span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">6</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$c1</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$c0</span><span style="color: #0550ae">%</span><span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">((</span><span style="color: #0550ae">$c0</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">3</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">1</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$b</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">2</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">3</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">+</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">4</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">5</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">*</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">8</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">?</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">:</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">11</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">*=</span> <span style="color: #953800">pow</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">12</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">],</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$m</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">fn</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #24292f;background-color: #f6f8fa">[</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">([</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$d</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$d</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">...</span><span style="color: #953800">array_reverse</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_slice</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$l</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$n</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">]),</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">])(</span><span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">15</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">and</span> <span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_shift</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">16</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%d'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">17</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0550ae">$o</span> <span style="color: #0550ae">.</span><span style="color: #0550ae">=</span> <span style="color: #953800">sprintf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$m</span><span style="color: #24292f;background-color: #f6f8fa">)),</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">default</span> <span style="color: #0550ae">=&gt;</span> <span style="color: #0a3069">'nop'</span><span style="color: #24292f;background-color: #f6f8fa">,</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">};</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$c0</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$j</span><span style="color: #0550ae">++</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[];</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$c1</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$h</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$y</span><span style="color: #0550ae">*</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$z</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">for</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">-=</span> <span style="color: #0550ae">$z</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">else</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$pc</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">!</span><span style="color: #cf222e">empty</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">))</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$qq</span> <span style="color: #0550ae">=</span> <span style="color: #953800">array_pop</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qq</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">true</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">foreach</span> <span style="color: #24292f;background-color: #f6f8fa">([</span><span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">+</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$qq</span><span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #cf222e">as</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">$c1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">isset</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">]))</span> <span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$q</span><span style="color: #24292f;background-color: #f6f8fa">[]</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">=</span> <span style="color: #953800">intdiv</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$ep</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">);</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$qy</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$y</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$x</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qx</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$x</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$y</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">3</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">&lt;</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">||</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$qy</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$y</span> <span style="color: #0550ae">&amp;&amp;</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$x</span><span style="color: #0550ae">&lt;=&gt;</span><span style="color: #0550ae">$qx</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">)))</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">)</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$qp</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$np</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$ep</span> <span style="color: #0550ae">+</span> <span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$w</span><span style="color: #24292f;background-color: #f6f8fa">][</span><span style="color: #0550ae">$dp</span><span style="color: #24292f;background-color: #f6f8fa">];</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$cs</span><span style="color: #24292f;background-color: #f6f8fa">[</span><span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">]</span> <span style="color: #0550ae">!==</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">count</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">array_keys</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$v</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
+</div><div class="codeblock-line"> <span style="color: #0550ae">$pc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$np</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">7</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">break</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$cc</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">-</span><span style="color: #0550ae">$cc</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$j</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">2</span> <span style="color: #0550ae">===</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">$dp</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$dp</span><span style="color: #0550ae">+</span><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">%</span> <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">;</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span>
+</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre>
</div>
<p>
これは一体なんなのか。ずばり、難解プログラミング言語の一つ Piet のインタプリタである。Piet はピエト・モンドリアン (『赤・青・黄のコンポジション』などで知られる抽象画家) の作品にインスピレーションを受けて作られた、画像をソースコードとするプログラミング言語である。インタプリタは画像の各ピクセルの上を進みながら、色等に応じて特定の処理をおこなっていく。ここでは詳しい言語仕様については解説しないので、気になる方は <a href="https://ja.wikipedia.org/wiki/Piet" rel="noreferrer" target="_blank">Wikipedia の記事「Piet」</a> などを参照してほしい。
@@ -413,8 +407,7 @@ $h = $b[24]+2;
プログラムの冒頭にあるこの箇所
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #0550ae">$b</span> <span style="color: #0550ae">=</span> <span style="color: #953800">unpack</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'C*'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">file_get_contents</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">__FILE__</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre>
</div>
<p>
で <code>__FILE__</code> つまりこの画像ファイルを読み込んでいる。先ほど Piet は画像をソースコードにしていると説明した。そう、今回の問題の画像ファイル <code>Q1.png</code> は、PHP 製 Piet インタプリタであると同時に、Piet のソースコード画像でもあるのだ。QR コード中央のカラフルな部分が Piet の命令になっている。
@@ -466,12 +459,11 @@ $h = $b[24]+2;
ところで、先ほど掲載した Piet のインタプリタのソースコード末尾には次のような箇所がある。
</p>
<div class="codeblock">
- <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span>
-<span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span>
-<span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span>
-<span style="color: #6e7781">// Piet any longer at that time.</span>
-<span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span>
-</code></pre>
+ <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// The original Piet image is wrong: it outputs 403 error for invalid passwords.</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// Failure of authentication should be notified by 401, not 403.</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// I noticed that one month before PHPerKaigi, but I could not read or write (paint)</span>
+</div><div class="codeblock-line"><span style="color: #6e7781">// Piet any longer at that time.</span>
+</div><div class="codeblock-line"><span style="color: #953800">fwrite</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">STDERR</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">str_replace</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'403 Forbidden'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0a3069">'401 Unauthorized'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$o</span><span style="color: #24292f;background-color: #f6f8fa">));</span></div></code></pre>
</div>
<p>
コメントにも書かれているが、この Piet のソースコード画像には誤りがあった。本来 HTTP のステータスコードを真似るのなら、認証の失敗には 401 を返さなければならない。しかし、Piet のソースは 403 を返すように書いてしまっていた。そのことに私が気付いたのは PHPerKaigi 2023 が開催されるひと月前で、その時点で私はこの Piet のソースコードを (ちょうどこの記事でそうなっているのと同じように) 読解できなくなっていた。さらに悪いことに、正しいメッセージ「401 Unauthorized」は元の「403 Forbidden」よりも3文字長い。3文字出力が長くなるということは、それだけ Piet で塗るべきピクセルが増えることを意味する。もはや3文字追加で出力するだけの余白はこの画像に残されていなかった (と思う。腕ききの Piet プログラマならできるかもしれないので挑戦してみてほしい)。