diff --git a/.gitignore b/.gitignore index a360796..33bca5c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .direnv /target result +.DS_Store diff --git a/demo.cast b/demo.cast index 1da3952..e8d4337 100644 --- a/demo.cast +++ b/demo.cast @@ -143,6 +143,7 @@ [17.779694, "o", "\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;36H _.-' .(( ._ )\u001b[71G\u001b(B\u001b[0m\u001b[35m\u001b[40m``\u001b(B\u001b[0;1m\u001b[34m\u001b[40m\\\u001b(B\u001b[0m\u001b[35m\u001b[40m```\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[19;12H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[33G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[61G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[20;11H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[23G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[20;71H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[21;11H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;23H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[34G\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[32m\u001b[40m )\u001b[21;71H(\u001b[33m\u001b[40m|\u001b[22;34H\u001b[32m\u001b[40m )\u001b[37m\u001b[40m \u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[22;71H\u001b[32m\u001b[40m )\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [17.889084, "o", "\u001b[12;42H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[12;61H\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[31m\u001b[40m__\u001b[13;41H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[59G\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;14H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[14;41H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m) `\\\u001b[31m\u001b[40m/\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b[30m\u001b[40m _ \u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;12H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[15;41H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\__\u001b[31m\u001b[40m///\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;13H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b[16;32H"] [17.889381, "o", "\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;51H `~~~~-._\u001b[17;14H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\u001b[17;55H \u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b(B\u001b[0;1m\u001b[31m\u001b[40mb\u001b[36m\u001b[40m `--._\u001b[18;16H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;38H _.-' .(( ._ )\u001b[19;14H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[35G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[63G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[20;13H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[25G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[21;13H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;25H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[22;89H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[18.0, "m", "fish"] [18.002821, "o", "\u001b[12;44H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[12;63H\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[31m\u001b[40m__\u001b[13;43H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;61H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;16H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[14;43H,,) `\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[30m\u001b[40m _ \u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;14H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[15;41H\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:::( `\\__\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;15H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b[16;34H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;53H `~~~~-._\u001b[16;71H"] [18.004308, "o", "\u001b(B\u001b[0m\u001b[35m\u001b[40m,/..\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[17;16H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\u001b[17;57H \u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b(B\u001b[0;1m\u001b[31m\u001b[40mb\u001b[36m\u001b[40m `--._\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[36m\u001b[40m<\u001b(B\u001b[0;1m\u001b[37m\u001b[40m'\u001b[34m\u001b[40m)\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[35m\u001b[40m`\u001b[34m\u001b[40m=<\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[18;18H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;40H _.-' .(( ._ )\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[35m\u001b[40m``\u001b(B\u001b[0;1m\u001b[34m\u001b[40m\\\u001b(B\u001b[0m\u001b[35m\u001b[40m```\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[19;16H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[37G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[65G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[75G\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[20;15H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[27G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[20;75H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[21;15H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;27H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[21;75H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[33m\u001b[40m|\u001b[22d\b\b\u001b[32m\u001b[40m )\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [18.107165, "o", "\u001b[12;46H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[12;65H\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[31m\u001b[40m__\u001b[13;45H\u001b(B\u001b[0;1m\u001b[31m\u001b[40m.:\u001b[36m\u001b[40m( `\\\u001b[13;63H\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;18H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[14;42H,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m) `\\\u001b[31m\u001b[40m;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[63G\u001b(B\u001b[0;1m\u001b[30m\u001b[40m_ \u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;16H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[15;40H.::::::( `\\__\u001b[16;17H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b[16;36H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;55H `~~~~-._\u001b[30m\u001b[40m =_|_\u001b(B\u001b[0m\u001b[35m\u001b[40m,/..\u001b(B\u001b[0;1m\u001b[30m\u001b[40m[\u001b[17;18H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\u001b[17;59H"] @@ -164,6 +165,7 @@ [18.863213, "o", "53G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[81G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[20;31H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m )\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[21;31H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[21;75H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[33m\u001b[40m|\u001b[22;39H\u001b[32m\u001b[40m )\u001b[22;75H )\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [18.962728, "o", "\u001b[12;62H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m__\u001b[12;75H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[31m\u001b[40m__\u001b[13;34H\u001b(B\u001b[0;1m\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;61H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m( `\\\u001b[13;76H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;31H\u001b(B\u001b[0;1m\u001b[36m\u001b[40m,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m,,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;61H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m) `\\\u001b[14;78H\u001b[30m\u001b[40m _\u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;29H\u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b[36m\u001b[40m::::;' `.\u001b[31m\u001b[40m///\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[15;61H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m_[\u001b[36m\u001b[40m( `\\__\u001b[16;28H\u001b(B\u001b[0m\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m::::::; `.\u001b[31m\u001b[40m\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;52H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;71H `~~~~-._\u001b[17;30H''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\u001b[17;75H \u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b(B\u001b[0;1m\u001b[31m\u001b[40mb\u001b[36m\u001b[40m `--._\u001b[18;36H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;58H _.-' .(( ._ )\u001b[19;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m"] [18.962993, "o", "\u001b[40m.`.-`--...__\u001b[55G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[83G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[20;33H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[45G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[21;33H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m(\u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;45H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[21;80H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[22d\b\b\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[19.0, "m", "fish"] [19.073494, "o", "\u001b[12;64H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m__\u001b[75G\u001b[82G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[31m\u001b[40m__\u001b[13;32H\u001b(B\u001b[0;1m\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;63H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m( `\\\u001b[76G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;29H\u001b(B\u001b[0;1m\u001b[36m\u001b[40m,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;63H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m_ \u001b[36m\u001b[40m) `\\\u001b[14;80H\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;27H\u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:::::::;;' `.\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[15;63H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m ]\u001b[36m\u001b[40m( `\\__\u001b[16;26H\u001b(B\u001b[0m\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m::\u001b[36G;; `.\u001b[16;54H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;73H `~~~~-._\u001b[17;28H''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\u001b[17;77H \u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b(B\u001b[0;1m\u001b[31m\u001b[40mb\u001b[36m\u001b[40m `--._\u001b[18;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[32m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;60H _.-' .(( ._ "] [19.073879, "o", " )\u001b[19;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[57G .-' -.___.....-\u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b[85G\u001b(B\u001b[0;1m\u001b[37m\u001b[40m|/\u001b[36m\u001b[40m'\u001b[20;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[47G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. ...----`.___.',,,_______......---'\u001b[21;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;47H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'-'\u001b[21;71H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[22;34H(\u001b[37m\u001b[40m \u001b[22;71H\u001b[32m\u001b[40m(\u001b[33m\u001b[40m|\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [19.176445, "o", "\u001b[12;66H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m__\u001b[75G\u001b[84G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[31m\u001b[40m__\u001b[13;31H\u001b(B\u001b[0;1m\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;65H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m( `\\\u001b[76G\u001b[82G\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m\\\u001b[31m\u001b[40m/\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b(B\u001b[0m\u001b[31m\u001b[40m\\\u001b[14;28H\u001b(B\u001b[0;1m\u001b[36m\u001b[40m,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;\u001b[36m\u001b[40m,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;65H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[36m\u001b[40m) `\\\u001b[82G\u001b[30m\u001b[40m _\u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[31m\u001b[40m\\__/\u001b[15;26H\u001b(B\u001b[0;1m\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:\u001b[34G;;\u001b[31m\u001b[40m//\u001b[36m\u001b[40m;' `.\u001b[15;65H\u001b[30m\u001b[40m_[\u001b[36m\u001b[40m( `\\__\u001b[16;25H\u001b(B\u001b[0m\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m:\u001b[34G;;\u001b[31m\u001b[40m\\\\\\\u001b[36m\u001b[40m; `.\u001b[16;56H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__..---''\u001b[16;75H `~~~~-._\u001b[17;27H''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m';\\\u001b[36m\u001b[40m`. `.____...--''\u001b[17;79H \u001b(B\u001b[0m\u001b[36m\u001b[40m(\u001b(B\u001b[0;1m\u001b[31m\u001b[40mb\u001b[36m\u001b[40m `--._\u001b[18;40H\u001b(B\u001b[0m\u001b[32m\u001b[40m)\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;62H _.-' .("] @@ -183,6 +185,7 @@ [19.824187, "o", "[71G .-' -.___....\u001b[20;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[20;49H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[61G\u001b[30m\u001b[40m \u001b[36m\u001b[40m`. ...----`.___.',,,_______\u001b[21;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[21;49H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;61H\u001b[30m\u001b[40m =\u001b[36m\u001b[40m'-'\u001b[21;80H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b[22;34H\u001b(B\u001b[0m\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[22;80H\u001b[32m\u001b[40m )\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [19.929534, "o", "\u001b[12;75H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[13;21H\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;76H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\\u001b[14;18H,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;52H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[14;79H\u001b[30m\u001b[40m_ \u001b[36m\u001b[40m) `\\\u001b[15;16H\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:\u001b[24G;;\u001b[31m\u001b[40m///\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[15;50H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[15;79H\u001b[30m\u001b[40m ]\u001b[36m\u001b[40m( `\\_\u001b[16;1H\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\u001b[16;15H\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m:\u001b[24G;;\u001b[31m\u001b[40m\\\\\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;51H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b[30m\u001b[40m_=\u001b(B\u001b[0m\u001b[35m\u001b[40m,/..\u001b(B\u001b[0;1m\u001b[30m\u001b[40m =_|_[ \u001b[36m\u001b[40m__..---''\u001b[K\r\u001b[17d\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[34m\u001b[40m\\\u001b[17;17H\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m';\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[17;52H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\r\u001b[18d\u001b(B\u001b[0m\u001b[34m\u001b[40m(\u001b(B\u001b[0;1m\u001b[37m\u001b[40m'\u001b(B\u001b[0m\u001b[35m\u001b[40m>\u001b[18;54H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;76H _.-' .(\u001b[19;1H\u001b[34m\u001b[40m_/\u001b[19;52H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b"] [19.929784, "o", "(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[73G .-' -.___\r\u001b[20d\u001b(B\u001b[0m\u001b[32m\u001b[40m/\u001b[20;51H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[63G\u001b[30m\u001b[40m[]\u001b[36m\u001b[40m`. ...----`.___.',,,\u001b[21;51H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;63H\u001b[30m\u001b[40m_ \u001b[36m\u001b[40m'-'\u001b[30m\u001b[40m =\u001b(B\u001b[0m\u001b[33m\u001b[40m|\u001b[32m\u001b[40m )\u001b[22d\b\b(\u001b[33m\u001b[40m|\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[20.0, "m", "fish"] [20.038844, "o", "\u001b[12;75H\u001b[82G\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[13;20H\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;76H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\\u001b[14;17H,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;54H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[14;81H\u001b[30m\u001b[40m \u001b[36m\u001b[40m) `\\\u001b[15;15H\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:\u001b[23G;;\u001b[31m\u001b[40m///\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[15;52H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[15;81H\u001b[30m\u001b[40m_[\u001b[36m\u001b[40m( `\u001b[16;1H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[33m\u001b[40m\\\u001b[16;14H\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m:\u001b[23G;;\u001b[31m\u001b[40m\\\\\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;53H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b[16;72H\u001b[30m\u001b[40m]_\u001b[36m\u001b[40m__..---''\r\u001b[17d\u001b[34m\u001b[40m/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[34m\u001b[40m\\\u001b[17;16H\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m';\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[17;54H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\r\u001b[18d\u001b[34m\u001b[40m_\u001b(B\u001b[0m\u001b[34m\u001b[40m(\u001b(B\u001b[0;1m\u001b[37m\u001b[40m'\u001b(B\u001b[0m\u001b[35m\u001b[40m>\u001b[18;39H\u001b[32m\u001b[40m(\u001b[37m\u001b[40m \u001b[18;56H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m>\u001b[18;78H _.-'\u001b[K\r\u001b[19d\u001b[34m\u001b[40m\\_/\u001b[19;39H\u001b(B\u001b[0m\u001b[32m\u001b["] [20.039077, "o", "40m )\u001b[19;54H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m.`.-`--...__\u001b[75G .-' -.___\u001b[20;1H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[32m\u001b[40m/\u001b[20;39H(\u001b[37m\u001b[40m \u001b[20;53H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;.'\u001b[65G\u001b[30m\u001b[40m- \u001b[36m\u001b[40m`. ...----`.___.',,,\u001b[21;39H\u001b(B\u001b[0m\u001b[32m\u001b[40m )\u001b[21;53H\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m'\u001b[21;65H\u001b[30m\u001b[40m \u001b[36m\u001b[40m'-'\u001b(B\u001b[0m\u001b[33m\u001b[40m|\u001b[32m\u001b[40m )\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[33m\u001b[40m|\u001b[32m\u001b[40m )\u001b[22;39H(\u001b[37m\u001b[40m \u001b[22;75H\u001b[32m\u001b[40m(\u001b[33m\u001b[40m|\u001b[89G\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [20.145535, "o", "\u001b[12;75H\u001b[84G\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[36m\u001b[40m__\u001b[13;18H\u001b[31m\u001b[40m.:/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[13;76H\u001b[83G \u001b(B\u001b[0;1m\u001b[36m\u001b[40m( `\\\u001b[14;15H,,\u001b[31m\u001b[40m///\u001b[36m\u001b[40m;,\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m,;/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[14;56H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m,\u001b[83G\u001b[30m\u001b[40m_ \u001b[36m\u001b[40m) `\u001b[15;13H\u001b[37m\u001b[40mo\u001b[36m\u001b[40m:::::::;;\u001b[31m\u001b[40m///\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[15;54H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m;' `.\u001b[83G\u001b[30m\u001b[40m ]\u001b[36m\u001b[40m(\u001b[K\u001b[16;2H\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[33m\u001b[40m\\\u001b[16;12H\u001b[31m\u001b[40m>\u001b(B\u001b[0;1m\u001b[36m\u001b[40m::\u001b[21G;;\u001b[31m\u001b[40m\\\\\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[16;55H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m; `.\u001b(B\u001b[0m\u001b[35m\u001b[40m.\u001b(B\u001b[0;1m\u001b[30m\u001b[40m_\u001b[16;74H[ \u001b[36m\u001b[40m__..---''\r\u001b[17d\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[34m\u001b[40m/\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[34m\u001b[40m\\\u001b[17;14H\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[33m\u001b[40m\\\\\\\\\\\u001b(B\u001b[0;1m\u001b[36m\u001b[40m''\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b(B\u001b[0;1m\u001b[31m\u001b[40m';\\\u001b(B\u001b[0m\u001b[37m\u001b[40m \u001b[17;56H \u001b(B\u001b[0;1m\u001b[36m\u001b[40m`. `.____...--''\r\u001b[18d\u001b(B\u001b[0m\u001b[34m\u001b[40m=\u001b(B\u001b[0;1m\u001b[34m\u001b[40m_\u001b(B\u001b[0m\u001b[34m\u001b[40m(\u001b(B\u001b[0;1m\u001b[37m\u001b[40m'\u001b(B\u001b[0m\u001b[35m\u001b[40m>\u001b[18;58H\u001b(B\u001b[0;1m\u001b[30m\u001b[40m \u001b(B\u001b[0m\u001b[35"] @@ -230,6 +233,7 @@ [23.703261, "o", "21;1H\u001b[91m\u001b[41m:.\u001b[34m\u001b[40m%\u001b[31m\u001b[40m. \u001b[34m\u001b[40m.:;\u001b[32m\u001b[40m:\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40mS\u001b[91m\u001b[41m.\u001b[31m\u001b[101m@\u001b[91m\u001b[41m%\u001b[34m\u001b[40mS\u001b[90m\u001b[40m@\u001b[34m\u001b[40mS;\u001b[32m\u001b[40m.\u001b[34m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m.\u001b[31m\u001b[40m@\u001b[35m\u001b[41m;\u001b[30m\u001b[41mX\u001b[31m\u001b[40mt\u001b[34m\u001b[40m%\u001b[31m\u001b[40m8\u001b[30m\u001b[41mt\u001b[90m\u001b"] [23.703489, "o", "[41mt\u001b[91m\u001b[41m@\u001b[33m\u001b[101m.%\u001b[30m\u001b[41mX\u001b[34m\u001b[40m.\u001b[32m\u001b[40m.\u001b[34m\u001b[40m \u001b[31m\u001b[40m .\u001b[34m\u001b[40mt;:\u001b[31m\u001b[40m@\u001b[30m\u001b[41m8\u001b[31m\u001b[40m%\u001b[34m\u001b[40mS\u001b[35m\u001b[41m;\u001b[91m\u001b[41mX\u001b[31m\u001b[40m8\u001b[34m\u001b[40m:;\u001b[91m\u001b[41m;\u001b[31m\u001b[101m8\u001b[30m\u001b[41mt\u001b[88G\u001b[34m\u001b[40m.\u001b[31m\u001b[40mS\u001b[22;1H\u001b[34m\u001b[40mt\u001b[31m\u001b[40m;\u001b[34m\u001b[40m:\u001b[31m\u001b[40m.\u001b[32m\u001b[40m ...\u001b[34m\u001b[40m.\u001b[32m\u001b[40m \u001b[31m\u001b[40m \u001b[34m\u001b[40m;\u001b[31m\u001b[40mX\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[34m\u001b[40mX\u001b[30m\u001b[41mX\u001b[34m\u001b[40mS\u001b[31m\u001b[40m;\u001b[32m\u001b[40m \u001b[34m\u001b[40m;tt\u001b[91m\u001b[41mX\u001b[33m\u001b[101m.\u001b[31m\u001b[101m8\u001b[90m\u001b[41m%\u001b[30m\u001b[41m@\u001b[91m\u001b[41m8\u001b[33m\u001b[103m.\u001b[33m\u001b[101m:\u001b[91m\u001b[43m8\u001b[33m\u001b[101mX\u001b[33m\u001b[41mX\u001b[30m\u001b[41m@\u001b[34m\u001b[40mt\u001b[32m\u001b[40m \u001b[34m\u001b[40m t\u001b[30m\u001b[41mt\u001b[31m\u001b[40m8\u001b[34m\u001b[40m.\u001b[31m\u001b[40mX\u001b[31m\u001b[101mS\u001b[33m\u001b[101m.\u001b[91m\u001b[41m@\u001b[34m\u001b[40mt\u001b[30m\u001b[41m8S\u001b[34m\u001b[40mX.\u001b[31m\u001b[40m%8\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[90m\u001b[41mt\u001b[30m\u001b[41m8\u001b[34m\u001b[40m: .\u001b[31m\u001b[40m8\u001b[31m\u001b[101m8\u001b[33m\u001b[101m8\u001b[33m\u001b[41m8\u001b[34m\u001b[40m;..\u001b[31m\u001b[40m..\u001b[34m\u001b[40m::\u001b[32m\u001b[40m \u001b[34m\u001b[40m.\u001b[31m\u001b[40m@\u001b[33m\u001b[101m%\u001b[33m\u001b[103m \u001b[31m\u001b[101m.XX\u001b[90m\u001b[41m%\u001b[34m\u001b[40m;\u001b[31m\u001b[40m.\u001b[34m\u001b[40m.\u001b[?7l."] [23.703627, "o", "\u001b[?7h\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[23.71, "m", "fire"] [23.714112, "o", "\u001b[16;6H\u001b[34m\u001b[40m:\u001b[30m\u001b[41m8\u001b[35m\u001b[41mt\u001b[30m\u001b[41m;8\u001b[34m\u001b[40m%\u001b[31m\u001b[40m.\u001b[16;72H\u001b[34m\u001b[40m;;;:\u001b[31m\u001b[40m \u001b[17;6H\u001b[30m\u001b[41m8\u001b[31m\u001b[101m8.\u001b[33m\u001b[101m.\u001b[31m\u001b[101m%\u001b[33m\u001b[41mt\u001b[34m\u001b[40mX.;\u001b[31m\u001b[40mSSSt\u001b[34m\u001b[40m;\u001b[32m\u001b[40m \u001b[17;36H\u001b[34m\u001b[40mtS%\u001b[31m\u001b[40m.\u001b[34m\u001b[40m .;;. ;\u001b[31m\u001b[40m%\u001b[34m\u001b[40mS;\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m:;%.\u001b[32m\u001b[40m \u001b[34m\u001b[40m ;\u001b[30m\u001b[41mS\u001b[91m\u001b[41mt%\u001b[35m\u001b[41m.\u001b[31m\u001b[40m8\u001b[34m\u001b[40m;\u001b[31m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[18;4H"] [23.714316, "o", "\u001b[31m\u001b[40m \u001b[34m\u001b[40m.%\u001b[91m\u001b[41m;\u001b[31m\u001b[101m8\u001b[31m\u001b[43m8\u001b[90m\u001b[41m%\u001b[31m\u001b[40m@\u001b[34m\u001b[40mt%\u001b[91m\u001b[41m;X@8X\u001b[31m\u001b[40m8\u001b[34m\u001b[40m;\u001b[31m\u001b[40m \u001b[34m\u001b[40m .SS:\u001b[31m\u001b[40m \u001b[34m\u001b[40m.;:\u001b[31m\u001b[40m \u001b[34m\u001b[40m ;\u001b[30m\u001b[41m@X\u001b[34m\u001b[40mX\u001b[31m\u001b[40m.\u001b[34m\u001b[40m \u001b[32m\u001b[40m \u001b[34m\u001b[40mt\u001b[31m\u001b[40m@8\u001b[34m\u001b[40mX\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m%\u001b[31m\u001b[40mX\u001b[34m\u001b[40m@\u001b[31m\u001b[40m \u001b[34m\u001b[40m .: \u001b[32m\u001b[40m \u001b[34m\u001b[40m:\u001b[31m\u001b[40mS\u001b[35m\u001b[41mt.\u001b[30m\u001b[41m:\u001b[31m\u001b[40m8\u001b[34m\u001b[40m%\u001b[31m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[19;4H\u001b[31m\u001b[40m ..\u001b[34m\u001b[40mX\u001b[90m\u001b[40m8\u001b[34m\u001b[40mS\u001b[31m\u001b[40m;\u001b[34m\u001b[40m:\u001b[31m\u001b[40m.\u001b[34m\u001b[40m%\u001b[35m\u001b[41m.\u001b[91m\u001b[41m..%%\u001b[31m\u001b[40m@\u001b[34m\u001b[40m;\u001b[32m\u001b[40m \u001b[34m\u001b[40m : \u001b[31m\u001b[40m \u001b[34m\u001b[40m:t\u001b[31m\u001b[40m.\u001b[34m\u001b[40m::\u001b[31m\u001b[40m . \u001b[34m\u001b[40m \u001b[31m\u001b[40m \u001b[34m\u001b[40m;\u001b[31m\u001b[40m8\u001b[30m\u001b[41mX\u001b[34m\u001b[40m@\u001b[31m\u001b[40m \u001b[34m\u001b[40m ;@\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@\u001b[31m\u001b[40m \u001b[34m\u001b[40mX\u001b[31m\u001b[40m@\u001b[34m\u001b[40m@\u001b[32m\u001b[40m \u001b[31m\u001b[40m \u001b[34m\u001b[40m %\u001b[31m\u001b[40mX\u001b[35m\u001b[41m;\u001b[30m\u001b[41mt\u001b[34m\u001b[40mS\u001b[31m\u001b[40m.\u001b[34m\u001b[40m.S\u001b[30m\u001b[41m::\u001b[34m\u001b[40mXt\u001b[31m\u001b[40m. "] [23.714572, "o", "\u001b[34m\u001b[40m:tt ;% %\u001b[20;1H\u001b[30m\u001b[41m8\u001b[31m\u001b[40m@\u001b[34m\u001b[40mS\u001b[31m\u001b[40m \u001b[32m\u001b[40m .\u001b[31m\u001b[40m.::\u001b[34m\u001b[40m. :\u001b[30m\u001b[41m8\u001b[91m\u001b[41m:\u001b[35m\u001b[41m:\u001b[34m\u001b[40mS\u001b[31m\u001b[40mX\u001b[34m\u001b[40m8t\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40mt\u001b[31m\u001b[40mX\u001b[34m\u001b[40mX:.;\u001b[31m\u001b[40mt@\u001b[90m\u001b[41m%\u001b[91m\u001b[41m8S\u001b[31m\u001b[40m%\u001b[34m\u001b[40m:\u001b[32m\u001b[40m \u001b[34m\u001b[40m \u001b[32m\u001b[40m \u001b[34m\u001b[40m.SS\u001b[31m\u001b[40m.\u001b[34m\u001b[40m;;:;\u001b[30m\u001b[41mt\u001b[35m\u001b[41m;\u001b[31m\u001b[40mX\u001b[34m\u001b[40m:.\u001b[30m\u001b[41m8\u001b[35m\u001b[41m%\u001b[31m\u001b[40m@\u001b[34m\u001b[40m;\u001b[31m\u001b[40m \u001b[32m\u001b[40m \u001b[31m\u001b[40mX\u001b[91m\u001b[41m8\u001b[33m\u001b[101mt;\u001b[31m\u001b[101m8\u001b[90m\u001b[41mt\u001b[34m\u001b[40mS.%\u001b[30m\u001b[41m:X\u001b[34m\u001b[40m%\u001b[31m\u001b[40m: @\u001b[91m\u001b[41mS8\u001b[30m\u001b[41mX\u001b[31m\u001b[40m8\u001b[90m\u001b[41m%\u001b[30m\u001b[41mt\u001b[34m\u001b[40mS\u001b[31m\u001b[40m \r\u001b[21dS\u001b[34m\u001b[40mS\u001b[31m\u001b[40m:\u001b[34m\u001b[40m.\u001b[31m\u001b[40m \u001b[32m\u001b[40m \u001b[34m\u001b[40m ;\u001b[31m\u001b[40m@\u001b[35m\u001b[41m%\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@@%\u001b[31m\u001b[40m;\u001b[32m\u001b[40m \u001b[34m\u001b[40m;\u001b[35m\u001b[41m.\u001b[31m\u001b[101mS\u001b[91m\u001b[41m8\u001b[30m\u001b[41m%\u001b[31m\u001b[40m8\u001b[91m\u001b[41m8\u001b[33m\u001b[101m..;%\u001b[31m\u001b[101m8\u001b[90m\u001b[40m8\u001b[31m\u001b[40m.\u001b[34m\u001b[40m .;\u001b[31m\u001b[40m;\u001b[34m\u001b[40m.%\u001b[91m\u001b[41m8\u001b[31m\u001b[101mS\u001b[33m\u001b[41m;\u001b[34m\u001b["] @@ -306,6 +310,7 @@ [23.983183, "o", "\u001b[31m\u001b[40m;;\u001b[34m\u001b[40m:\u001b[32m\u001b[40m \u001b[34m\u001b[40m:%\u001b[31m\u001b[40m@\u001b[30m\u001b[41m@\u001b[31m\u001b[40m8\u001b[34m\u001b[40mt;;::;;: ;\u001b[90m\u001b[41m;\u001b[91m\u001b[41m:\u001b[31m\u001b[40mS\u001b[34m\u001b[40m: ;t;t;t%XSSSS%\u001b[31m\u001b[40m \u001b[34m\u001b[40m.%. ;%%:\u001b[31m\u001b[40m.\u001b[34m\u001b[40m.;:\u001b[31m\u001b[40m:\u001b[34m\u001b[40m:.SS%t\u001b[89Gt\u001b[22;1H\u001b[30m\u001b[41m%8\u001b[34m\u001b[40mS:SS\u001b[91m\u001b[41m@\u001b[33m\u001b[101m..\u001b[33m\u001b[41mX\u001b[91m\u001b[41mS\u001b[30m\u001b[41mX\u001b[34m\u001b[40mX%SS\u001b[31m\u001b[40m88\u001b[30m\u001b[41m8\u001b[91m\u001b[41m8\u001b[31m\u001b[101mt\u001b[90m\u001b[41m@\u001b[34m\u001b[40m;;%%t%%St;S\u001b[30m\u001b[41m@\u001b[31m\u001b[40m@\u001b[34m\u001b[40m8S%SSS%\u001b[31m\u001b[40m \u001b[34m\u001b[40m.%\u001b[30m\u001b[41mX\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@%\u001b[31m\u001b[40m8\u001b[30m\u001b[41mX\u001b[31m\u001b[40m@\u001b[34m\u001b[40m@;S\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[35m\u001b[41mt\u001b[91m\u001b[41m8\u001b[30m\u001b[41m%\u001b[34m\u001b[40mt%%tSS%\u001b[31m\u001b[40mS\u001b[34m\u001b[40mSSS\u001b[31m\u001b[40mX\u001b[35m\u001b[41m%\u001b[33m\u001b[101m:\u001b[33m\u001b[103m.\u001b[31m\u001b[101m%\u001b[31m\u001b[40m88X\u001b[34m\u001b[40m@;S%\u001b[31m\u001b[40mS\u001b[34m\u001b[40mt :\u001b[31m\u001b[40m;\u001b[?7l\u001b[34m\u001b[40m;\u001b[?7h\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [23.994643, "o", "\u001b[16;53H\u001b[34m\u001b[40m:\u001b[17;10H.;:\u001b[17;52H%St\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[18;10H.%t\u001b[31m\u001b[40m \u001b[34m\u001b[40m \u001b[18;51H :SS\u001b[31m\u001b[40m. \u001b[32m\u001b[40m \u001b[19;9H\u001b[34m\u001b[40m \u001b[31m\u001b[40m \u001b[34m\u001b[40m \u001b[19;50H \u001b[31m\u001b[40m .\u001b[34m\u001b[40m%%\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \r\u001b[20d\u001b[34m\u001b[40m. .;;;.\u001b[31m\u001b[40m \u001b[34m\u001b[40m .\u001b[31m\u001b[40mS@\u001b[34m\u001b[40mt\u001b[31m\u001b[40m.\u001b[20;32H\u001b[34m\u001b[40m;%t:.\u001b[32m\u001b[40m \u001b[20;46H\u001b[34m\u001b[40m:: \u001b[31m\u001b[40m \u001b[34m\u001b[40m \u001b[31m\u001b[40m ..\u001b[32m\u001b[40m \u001b[34m\u001b[40m.:\u001b[32m\u001b[40m \u001b[66G\u001b[34m\u001b[40m \u001b[73G.\u001b[31m\u001b[40mt@\u001b[34m\u001b[40mt\u001b[31m\u001b[40m.\u001b[89G\u001b[34m\u001b[40m.\u001b[21;1H"] [23.994871, "o", "\u001b[31m\u001b[40mX\u001b[34m\u001b[40mX\u001b[31m\u001b[40m.\u001b[34m\u001b[40m.\u001b[31m\u001b[40m \u001b[34m\u001b[40m%\u001b[91m\u001b[41m;\u001b[31m\u001b[101m%8\u001b[90m\u001b[41mt\u001b[30m\u001b[41m8\u001b[34m\u001b[40m%;::;;;\u001b[31m\u001b[40mS\u001b[91m\u001b[41mS\u001b[31m\u001b[101m8\u001b[30m\u001b[41m@\u001b[34m\u001b[40m;\u001b[32m\u001b[40m \u001b[34m\u001b[40m:\u001b[32m\u001b[40m \u001b[34m\u001b[40m.:;::%SS%;: :t. tSS;:t%t.\u001b[31m\u001b[40m \u001b[34m\u001b[40m;SS\u001b[31m\u001b[40m8\u001b[30m\u001b[41m@\u001b[89G\u001b[34m\u001b[40m;\u001b[22;1H:t;%%S\u001b[30m\u001b[41mS\u001b[31m\u001b[101m8\u001b[33m\u001b[41mX\u001b[31m\u001b[101m::\u001b[91m\u001b[41m@\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@SS\u001b[30m\u001b[41m888\u001b[35m\u001b[41mS\u001b[91m\u001b[41m@\u001b[30m\u001b[41m8\u001b[34m\u001b[40mX%SSSS\u001b[31m\u001b[40m8\u001b[34m\u001b[40mX\u001b[31m\u001b[40m:\u001b[34m\u001b[40m:%\u001b[30m\u001b[41m;@\u001b[34m\u001b[40mXt%%t::;:SSSS\u001b[31m\u001b[40mX\u001b[30m\u001b[41m@@\u001b[34m\u001b[40m@t%%\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[31m\u001b[101m8:\u001b[91m\u001b[41mS\u001b[31m\u001b[40m8\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[34m\u001b[40m%S\u001b[31m\u001b[40mS8\u001b[35m\u001b[41mt\u001b[30m\u001b[41mt\u001b[34m\u001b[40mXSX\u001b[30m\u001b[41m8\u001b[90m\u001b[41m@\u001b[33m\u001b[41m@\u001b[31m\u001b[101mS\u001b[91m\u001b[43m88\u001b[31m\u001b[101m8\u001b[34m\u001b[40mS\u001b[32m\u001b[40m.\u001b[34m\u001b[40mt%\u001b[30m\u001b[41m@\u001b[31m\u001b[40mXS\u001b[90m\u001b[41m%\u001b[91m\u001b[41m;\u001b[?7l\u001b[31m\u001b[40m8\u001b[?7h\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[24.0, "m", "fire"] [24.006364, "o", "\u001b[16;52H\u001b[34m\u001b[40m.;.\u001b[32m\u001b[40m \u001b[17;10H\u001b[34m\u001b[40m : \u001b[17;52H.%:\u001b[32m\u001b[40m \u001b[18;50H\u001b[34m\u001b[40m\u001b[1K \u001b[32m\u001b[40m \u001b[34m\u001b[40m:.\u001b[32m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[19;19H\u001b[1K ;%\u001b[19;51H \u001b[32m\u001b[40m \u001b[34m\u001b[40m \u001b[19;74H:t:\u001b[32m\u001b[40m \r\u001b[20d\u001b[34m\u001b[40m;: ;\u001b[30m\u001b[41m8\u001b[35m\u001b[41m;\u001b[30m\u001b[41m;\u001b[31m\u001b[40mX\u001b[34m\u001b[40mt:\u001b[31m\u001b[40m \u001b[34m\u001b[40m t\u001b[30m\u001b[41m;\u001b[35m\u001b[41m.\u001b[31m\u001b[40mS\u001b[34m\u001b[40m:\u001b[31G :: \u001b[20;50H : ::;;:\u001b[31m\u001b[40m \u001b[72G\u001b[34m\u001b[40m:\u001b[31m\u001b[40mX\u001b[91m\u001b[41mS\u001b[31m\u001b[101m8\u001b[90m\u001b[41m;\u001b[34m\u001b[40mt\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m\u001b[K\r\u001b[21d"] [24.007821, "o", ";: :t\u001b[90m\u001b[41mt\u001b[31m\u001b[101m8@88\u001b[90m\u001b[41m;\u001b[34m\u001b[40m%t:%SS\u001b[31m\u001b[40m8\u001b[91m\u001b[41m;S\u001b[31m\u001b[40m8\u001b[34m\u001b[40m%\u001b[31m\u001b[40m \u001b[34m\u001b[40m:;:;;: t%%t\u001b[31m\u001b[40m.\u001b[34m\u001b[40m :%%;tSS%\u001b[31m\u001b[40m.\u001b[34m\u001b[40m.tS\u001b[31m\u001b[40mX\u001b[91m\u001b[41m%\u001b[31m\u001b[101m8\u001b[88G\u001b[31m\u001b[40m8\u001b[34m\u001b[40mt\u001b[22;1H \u001b[30m\u001b[41m@\u001b[91m\u001b[41mX\u001b[90m\u001b[41m%\u001b[34m\u001b[40mSSS\u001b[31m\u001b[40m@\u001b[34m\u001b[40mX\u001b[31m\u001b[101m8\u001b[33m\u001b[101mt\u001b[33m\u001b[41mt\u001b[31m\u001b[40mS\u001b[34m\u001b[40m@t\u001b[30m\u001b[41m88\u001b[31m\u001b[40m@\u001b[30m\u001b[44m8\u001b[30m\u001b[41m88\u001b[34m\u001b[40m8:.;%%S\u001b[31m\u001b[40m8\u001b[35m\u001b[41m;\u001b[30m\u001b[41mS\u001b[31m\u001b[40mt\u001b[34m\u001b[40mX\u001b[30m\u001b[41m%S\u001b[34m\u001b[40mXtt%t;t%S%%tS\u001b[31m\u001b[40m@8\u001b[34m\u001b[40m@S\u001b[31m\u001b[40m%\u001b[34m\u001b[40mX\u001b[31m\u001b[40mX\u001b[34m\u001b[40m8X\u001b[90m\u001b[41mt\u001b[91m\u001b[41m@\u001b[35m\u001b[41m.\u001b[30m\u001b[41m:\u001b[91m\u001b[41m%t\u001b[30m\u001b[41m8\u001b[34m\u001b[40mX\u001b[31m\u001b[40m8\u001b[35m\u001b[41mt\u001b[91m\u001b[41mt\u001b[35m\u001b[41m;\u001b[30m\u001b[41mX\u001b[31m\u001b[40m@\u001b[34m\u001b[40m8X@\u001b[31m\u001b[40m8\u001b[33m\u001b[101mt\u001b[33m\u001b[103m \u001b[31m\u001b[101m;\u001b[34m\u001b[40m%;%\u001b[31m\u001b[40m%8\u001b[34m\u001b[40mX\u001b[30m\u001b[41mX\u001b[91m\u001b[41mS8\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] [24.011477, "o", "\u001b[16d\u001b[34m\u001b[40m\u001b[K\u001b[17d\u001b[K\u001b[18;8H:.\u001b[18;20H:;.\u001b[32m\u001b[40m \u001b[18;51H\u001b[34m\u001b[40m \u001b[18;74H:;.\u001b[19;7HS\u001b[35m\u001b[41m.\u001b[30m\u001b[41mX\u001b[34m\u001b[40mX\u001b[31m\u001b[40m \u001b[34m\u001b[40m ;\u001b[31m\u001b[40m8\u001b[30m\u001b[41mS\u001b[34m\u001b[40mX\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[19;52H\u001b[34m\u001b[40m \u001b[19;73H%\u001b[91m\u001b[41m:%\u001b[30m\u001b[41m%\u001b[34m\u001b[40mt\r\u001b[20d. :\u001b[30m\u001b[41m;\u001b[91m\u001b[41m88t\u001b[30m\u001b[41mt\u001b[31m\u001b[40mX\u001b[34m\u001b[40m%\u001b[32m\u001b[40m \u001b[34m\u001b[40m:;S\u001b[35m\u001b[41m;\u001b[91m\u001b[41m;\u001b[20;35H\u001b[34m\u001b[40m;\u001b[32m\u001b[40m \u001b[46G"] @@ -479,6 +484,7 @@ [24.497287, "o", "[31m\u001b[40mS\u001b[19;1H\u001b[91m\u001b[41m%;\u001b[34m\u001b[40m%\u001b[31m\u001b[40m: \u001b[34m\u001b[40m :SS%S\u001b[31m\u001b[40m%\u001b[34m\u001b[40mX\u001b[31m\u001b[40m88\u001b[30m\u001b[41m@\u001b[35m\u001b[41mS\u001b[30m\u001b[41m:\u001b[35m\u001b[41m:\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@t%S\u001b[30m\u001b[41mX\u001b[35m\u001b[41mX;:\u001b[91m\u001b[41m.\u001b[35m\u001b[41m:;;:;\u001b[30m\u001b[41mStX8S\u001b[35m\u001b[41m;\u001b[91m\u001b[41m:St.\u001b[30m\u001b[41m .\u001b[35m\u001b[41m;\u001b[30m\u001b[41mS@S\u001b[35m\u001b[41m:\u001b[30m\u001b[41m.\u001b[35m\u001b[41mt\u001b[30m\u001b[41m@\u001b[34m\u001b[40m@tS@\u001b[31m\u001b[40mS\u001b[30m\u001b[41m8\u001b[34m\u001b[40m8;\u001b[31m\u001b[40m.\u001b[34m\u001b[40mt\u001b[31m\u001b[40m@\u001b[35m\u001b[41m;.\u001b[91m\u001b[41mt\u001b[31m\u001b[101mX.t\u001b[33m\u001b[41mt\u001b[35m\u001b[41m:::\u001b[91m\u001b[41mt;\u001b[35m\u001b[41mt\u001b[91m\u001b[41mt\u001b[30m\u001b[41mt\u001b[34m\u001b[40mX\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m.\u001b[31m\u001b[40mX\u001b[20;1H\u001b[30m\u001b[41m%@\u001b[34m\u001b[40mt\u001b[31m\u001b[40m.\u001b[34m\u001b[40m ;SSS\u001b[31m\u001b[40mX\u001b[35m\u001b[41mS\u001b[91m\u001b[41m:\u001b[35m\u001b[41m%\u001b[30m\u001b[41m@\u001b[34m\u001b[40m8\u001b[30m\u001b[41mX\u001b[35m\u001b[41m:.\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@S\u001b[30m\u001b[41mX\u001b[35m\u001b[41mt:\u001b[30m\u001b[41m;;\u001b[35m\u001b[41m.\u001b[30m\u001b[41m:t;\u001b[35m\u001b[41m:\u001b[30m\u001b[41m;8\u001b[35m\u001b[41mS:;\u001b[91m\u001b[41m;tt:\u001b[30m\u001b[41m:SX\u001b[35m\u001b[41m;\u001b[30m\u001b[41m:;\u001b[35m\u001b[41mS\u001b[30m\u001b[41mX\u001b[35m\u001b[41m%\u001b[30m\u001b[41mX@\u001b[35m\u001b[41m;::\u001b[31m\u001b[40mX\u001b[34m\u001b[40mXS8@\u001b[30m\u001b[41m8\u001b[34m\u001b[40mX\u001b[31m\u001b[40mt\u001b[34m"] [24.497338, "o", "\u001b[40m@\u001b[31m\u001b[40mX\u001b[35m\u001b[41mt\u001b[91m\u001b[41m:8\u001b[31m\u001b[101m:\u001b[33m\u001b[101m.S\u001b[91m\u001b[41mS\u001b[33m\u001b[41m.\u001b[91m\u001b[41mtt;%St\u001b[35m\u001b[41m;\u001b[34m\u001b[40m%:\u001b[31m\u001b[40m.\u001b[34m\u001b[40m \u001b[32m\u001b[40m \u001b[34m\u001b[40m.%\u001b[21;1H\u001b[30m\u001b[41mX\u001b[90m\u001b[41m@\u001b[31m\u001b[40mS\u001b[34m\u001b[40m:.;;%\u001b[30m\u001b[41m@%8\u001b[34m\u001b[40m8X\u001b[91m\u001b[41m%\u001b[31m\u001b[101m88\u001b[91m\u001b[41m%\u001b[30m\u001b[41mS\u001b[90m\u001b[41mX\u001b[91m\u001b[41mtS\u001b[35m\u001b[41m;\u001b[30m\u001b[41mX%\u001b[35m\u001b[41m;\u001b[91m\u001b[41m:S:\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@\u001b[30m\u001b[41m88@\u001b[35m\u001b[41mt\u001b[30m\u001b[41mt%\u001b[35m\u001b[41m:\u001b[91m\u001b[41m;@88St\u001b[35m\u001b[41m;\u001b[30m\u001b[41m88\u001b[35m\u001b[41mt\u001b[30m\u001b[41m:S%\u001b[35m\u001b[41m;\u001b[30m\u001b[41m.8\u001b[34m\u001b[40m@\u001b[30m\u001b[41m:\u001b[91m\u001b[41m;tt\u001b[35m\u001b[41m:\u001b[89G\u001b[30m\u001b[41m8\u001b[22;1H\u001b[33m\u001b[101m.\u001b[91m\u001b[43m8\u001b[91m\u001b[41mS\u001b[34m\u001b[40m%\u001b[31m\u001b[40mX8\u001b[30m\u001b[41m8\u001b[35m\u001b[41m%\u001b[91m\u001b[41m;t\u001b[35m\u001b[41mt\u001b[30m\u001b[41m;\u001b[91m\u001b[41m;\u001b[31m\u001b[101m8X\u001b[91m\u001b[41m8\u001b[90m\u001b[41mt\u001b[31m\u001b[40m@\u001b[35m\u001b[41mt\u001b[31m\u001b[101mS:%\u001b[91m\u001b[41m8;\u001b[90m\u001b[41m.\u001b[35m\u001b[41m...\u001b[31m\u001b[40m@\u001b[30m\u001b[41m8\u001b[35m\u001b[41mS;:\u001b[91m\u001b[41mS\u001b[31m\u001b[101m%8\u001b[91m\u001b[41mt8\u001b[31m\u001b[101m%@\u001b[91m\u001b[41m%\u001b[90m\u001b[41m:\u001b[91m\u001b[41m%@\u001b[35m\u001b[41m;;\u001b[91m\u001b[41m:\u001b[35m\u001b[41m.\u001b[31m\u001b[40m8\u001b[30m\u001b[41m8\u001b[35m\u001b[41mt\u001b[91m\u001b[41m:\u001b[35m\u001b"] [24.497364, "o", "[41m;\u001b[91m\u001b[41m:%8S::St\u001b[35m\u001b[41m:\u001b[30m\u001b[41m:SS\u001b[35m\u001b[41m:\u001b[91m\u001b[41m%;\u001b[90m\u001b[41m.\u001b[91m\u001b[41m;@\u001b[33m\u001b[41m8\u001b[91m\u001b[41m8\u001b[33m\u001b[41m.\u001b[35m\u001b[41m.\u001b[91m\u001b[41m;\u001b[31m\u001b[101m8X\u001b[91m\u001b[41m8\u001b[33m\u001b[41m.\u001b[30m\u001b[41mS\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@\u001b[31m\u001b[40m@\u001b[34m\u001b[40m@\u001b[31m\u001b[40m@\u001b[34m\u001b[40m8%\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[24.5, "m", "fire"] [24.501676, "o", "\u001b[15;17H\u001b[34m\u001b[40m:t%: \u001b[15;66Htt\u001b[32m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[16;15H .%SS;\u001b[31m\u001b[40m \u001b[34m\u001b[40m \u001b[16;44H.:;;:. .;tt;%t%t%S%SSSS\u001b[31m\u001b[40mS\u001b[34m\u001b[40m@.\u001b[31m\u001b[40m \u001b[34m\u001b[40m:;:\u001b[K\r\u001b[17d;:\u001b[17;14H ;%S\u001b[31m\u001b[40mS\u001b[34m\u001b[40m@:\u001b[31m\u001b[40m \u001b[34m\u001b[40m.%%%t;::;%%%%;. :%\u001b[30m\u001b[41m88@8\u001b[31m\u001b[40m@\u001b[34m\u001b[40m8%S\u001b[31m\u001b[40mX\u001b[30m\u001b[41m88\u001b[34m\u001b[40mXX%%%S\u001b[30m\u001b[41m88\u001b[34m\u001b[40m@t\u001b[31m\u001b[40m;\u001b[34m\u001b[40m@\u001b[31m\u001b[40m88\u001b[34m\u001b[40m@\u001b[31m\u001b[40m8\u001b[30m\u001b[41m%\u001b[35m\u001b[41m;\u001b[30m\u001b[41m%\u001b[34m\u001b[40mS::;;;;;.\u001b[89G;\u001b[18;1H\u001b[30m\u001b[41m:S\u001b[34m\u001b[40m%\u001b[31m\u001b[40m \u001b[34m\u001b[40m ::::%%SS\u001b[31m\u001b[40m8\u001b[30m\u001b[41m8@\u001b[31m\u001b[40m8\u001b[34m\u001b[40m8;\u001b[31m\u001b[40m.\u001b[34m\u001b[40m:S\u001b[31m\u001b[40mX\u001b[30m\u001b[41m8SS8\u001b[31m\u001b[40m8\u001b[30m\u001b[41m8%X\u001b[31m\u001b[40m8@\u001b[34m\u001b[40m@\u001b[31m\u001b[40m8\u001b[34m\u001b[40mX\u001b[31m\u001b[40m8\u001b[30m\u001b[41m@\u001b[35m\u001b[41mt:;t\u001b[30m\u001b[41m@\u001b[35m\u001b[41mX\u001b[30m\u001b[41m8\u001b[31m\u001b[40m88\u001b[30m\u001b[41m8\u001b[35m\u001b[41m8\u001b[30m\u001b[41m@%\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@..%@X%\u001b[31m\u001b[40m;\u001b[34m\u001b[40m.:8\u001b[30m\u001b[41mS\u001b[35m\u001b[41mt\u001b[91m\u001b[41m;8\u001b[31m\u001b[101m%8\u001b[33m\u001b[41m:\u001b[30m\u001b[41m88St\u001b[35m\u001b[41m;\u001b[30m\u001b[41m;t\u001b[31m\u001b[40m@\u001b[34m\u001b[40mS\u001b[32m\u001b[40m \u001b[34m\u001b[40m \u001b[31m\u001b[40m"] [24.501727, "o", " \u001b[34m\u001b[40m%\u001b[19;1H"] [24.502055, "o", "\u001b[30m\u001b[41m@\u001b[31m\u001b[40m@\u001b[34m\u001b[40m%\u001b[31m\u001b[40m \u001b[34m\u001b[40m t%%S\u001b[30m\u001b[41mX\u001b[35m\u001b[41m;\u001b[30m\u001b[41m%\u001b[31m\u001b[40m@\u001b[30m\u001b[44m8\u001b[31m\u001b[40m8\u001b[35m\u001b[41m8\u001b[30m\u001b[41mX\u001b[31m\u001b[40m@\u001b[34m\u001b[40m8%S\u001b[30m\u001b[41mX\u001b[35m\u001b[41mS\u001b[30m\u001b[41m@\u001b[35m\u001b[41mX\u001b[30m\u001b[41m@\u001b[35m\u001b[41mX\u001b[30m\u001b[41m8\u001b[35m\u001b[41mX\u001b[30m\u001b[41mX@\u001b[30m\u001b[44m8\u001b[30m\u001b[41m%\u001b[35m\u001b[41m%:\u001b[91m\u001b[41m.\u001b[35m\u001b[41m;:\u001b[30m\u001b[41m %8\u001b[31m\u001b[40m@\u001b[30m\u001b[41m8@88\u001b[35m\u001b[44m8\u001b[30m\u001b[41m8\u001b[31m\u001b[40m@8\u001b[35m\u001b[41m8\u001b[30m\u001b[41m@8\u001b[34m\u001b[40m@t:%SX%::X\u001b[30m\u001b[41mX\u001b[35m\u001b[41m:\u001b[91m\u001b[41mX\u001b[31m\u001b[101m%:8\u001b[91m\u001b[41m;\u001b[35m\u001b[41m;::\u001b[91m\u001b[41m.::\u001b[35m\u001b[41m:\u001b[30m\u001b[41m@\u001b[34m\u001b[40m@\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[31m\u001b[40m .\u001b[34m\u001b[40m:\u001b[20;1H%\u001b[31m\u001b[40mX\u001b[34m\u001b[40m% .tSS%S\u001b[35m\u001b[41m:\u001b[91m\u001b[41mtS\u001b[35m\u001b[41mt\u001b[31m\u001b[40m88\u001b[35m\u001b[41mt;\u001b[30m\u001b[41m8\u001b[34m\u001b[40m@\u001b[31m\u001b[40m@\u001b[30m\u001b[41mS\u001b[35m\u001b[41mt.\u001b[30m\u001b[41m;\u001b[34m\u001b[40mXS\u001b[31m\u001b[40mX\u001b[34m\u001b[40m8\u001b[31m\u001b[40m8\u001b[30m\u001b[41m888@\u001b[35m\u001b[41mt\u001b[91m\u001b[41m:%St\u001b[35m\u001b[41m.\u001b[30m\u001b[41m8\u001b[34m\u001b[40m88\u001b[35m\u001b[41mS\u001b[30m\u001b[41m8\u001b[31m\u001b[40m8\u001b[35m\u001b[41m8\u001b[30m\u001b[41m@X\u001b[34m\u001b[40m88\u001b[30m\u001b[41m8\u001b[35m\u001b[41mt:\u001b[30m\u001b[41mt8\u001b[31m\u001b[40m8\u001b[30m\u001b[41m88X8\u001b[3"] @@ -729,6 +735,7 @@ [24.995781, "o", "[31m\u001b[101m@t;\u001b[33m\u001b[101m;\u001b[31m\u001b[101m;%8\u001b[90m\u001b[41mt\u001b[34m\u001b[40mXS\u001b[30m\u001b[41m@\u001b[35m\u001b[41m:\u001b[91m\u001b[41mS@\u001b[31m\u001b[101m88X%tS\u001b[91m\u001b[41m8%S\u001b[31m\u001b[101m8;\u001b[33m\u001b[101m.....;\u001b[91m\u001b[41m8\u001b[33m\u001b[41m:\u001b[91m\u001b[41mt8\u001b[31m\u001b[101m;;S8\u001b[91m\u001b[41mX;\u001b[30m\u001b[41mX\u001b[34m\u001b[40m@:\u001b[31m\u001b[40m. \u001b[34m\u001b[40m;\u001b[35m\u001b[41m.\u001b[31m\u001b[101m%;\u001b[91m\u001b[41m%\u001b[19;1H\u001b[34m\u001b[40m%\u001b[31m\u001b[40m. \u001b[34m\u001b[40m :%\u001b[35m\u001b[41m;\u001b[91m\u001b[41m:%%:\u001b[35m\u001b[41m;\u001b[91m\u001b[41mS\u001b[31m\u001b[101m8SX8\u001b[91m\u001b[41mXSt::%8\u001b[31m\u001b[101m888\u001b[91m\u001b[41m8%\u001b[90m\u001b[41m:\u001b[30m\u001b[41m%\u001b[35m\u001b[41m:\u001b[91m\u001b[41mt@\u001b[31m\u001b[101mS\u001b[33m\u001b[101m;;X\u001b[91m\u001b[41m%\u001b[30m\u001b[41m8\u001b[34m\u001b[40m%%\u001b[31m\u001b[40m8\u001b[35m\u001b[41mt\u001b[91m\u001b[41m..%\u001b[31m\u001b[101m8t\u001b[33m\u001b[101m...%\u001b[31m\u001b[101m@8X\u001b[33m\u001b[101mSX8S.\u001b[91m\u001b[43m8\u001b[33m\u001b[101m \u001b[31m\u001b[101mS8\u001b[91m\u001b[41m@X88@\u001b[33m\u001b[41mS\u001b[90m\u001b[41m;\u001b[30m\u001b[41mS8\u001b[34m\u001b[40m8%\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[31m\u001b[40m \u001b[34m\u001b[40m:\u001b[31m\u001b[40m8\u001b[91m\u001b[41m@\u001b[31m\u001b[101m8\u001b[90m\u001b[41m%\u001b[20;1H\u001b[31m\u001b[40m%\u001b[34m\u001b[40mt:\u001b[31m\u001b[40m.\u001b[34m\u001b[40m ;%;;%\u001b[30m\u001b[41m;\u001b[91m\u001b[41m;;.\u001b[35m\u001b[41m.\u001b[91m\u001b[41mt\u001b[31m\u001b[101m8t\u001b[33m\u001b[101m.::::\u001b[31m\u001b[101m%\u001b[91m\u001b[41m8t\u001b[90m\u001b[41m:\u001b[33m\u001b[41m.\u001b[91m\u001b[41m"] [24.995965, "o", "X\u001b[31m\u001b[101m%\u001b[33m\u001b[101m;.;\u001b[31m\u001b[101m8\u001b[91m\u001b[41m@S;\u001b[90m\u001b[41mt\u001b[30m\u001b[41m8\u001b[33m\u001b[41mX\u001b[33m\u001b[101m:.%\u001b[33m\u001b[41m%\u001b[31m\u001b[40m8\u001b[34m\u001b[40mX\u001b[30m\u001b[41mX\u001b[35m\u001b[41m%\u001b[91m\u001b[41m%\u001b[35m\u001b[41m.\u001b[30m\u001b[41mt\u001b[90m\u001b[41m:\u001b[91m\u001b[41m8\u001b[33m\u001b[101m%.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m:@88\u001b[33m\u001b[101mX\u001b[31m\u001b[101m8\u001b[33m\u001b[41m%\u001b[91m\u001b[41mt8\u001b[33m\u001b[101m.\u001b[93m\u001b[101m8\u001b[33m\u001b[101m :.:\u001b[91m\u001b[41m8\u001b[33m\u001b[41mX\u001b[90m\u001b[41mt\u001b[33m\u001b[41m;\u001b[91m\u001b[41m%\u001b[35m\u001b[41m;t\u001b[30m\u001b[41mtS\u001b[31m\u001b[40m@\u001b[34m\u001b[40mX;;;X\u001b[31m\u001b[40mS@\u001b[30m\u001b[41m8\u001b[21;1H\u001b[31m\u001b[101mt\u001b[33m\u001b[101m \u001b[33m\u001b[41mS\u001b[34m\u001b[40m;;S\u001b[31m\u001b[40mX\u001b[30m\u001b[41m8S\u001b[35m\u001b[41mt\u001b[91m\u001b[41m@8;\u001b[31m\u001b[40m8\u001b[35m\u001b[41mt\u001b[31m\u001b[101mX\u001b[33m\u001b[101m.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m \u001b[33m\u001b[101mX\u001b[33m\u001b[41m@\u001b[31m\u001b[101mt\u001b[33m\u001b[101m;;:\u001b[31m\u001b[101m;@\u001b[91m\u001b[41m@@\u001b[31m\u001b[101m8\u001b[33m\u001b[101m%:.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m \u001b[33m\u001b[101m.;\u001b[91m\u001b[41m8\u001b[90m\u001b[41m%\u001b[30m\u001b[41mS\u001b[33m\u001b[41mX\u001b[31m\u001b[101m:X\u001b[90m\u001b[41m%\u001b[30m\u001b[41m@\u001b[91m\u001b[41mS\u001b[31m\u001b[101m;\u001b[33m\u001b[101m..\u001b[31m\u001b[101m%\u001b[91m\u001b[41m8\u001b[31m\u001b[101m8S\u001b[33m\u001b[101m:..t\u001b[91m\u001b[41m@8\u001b[88G\u001b[34m\u001b[40mt\u001b[30m\u001b[41m@\u001b[22;1H\u001b[91m\u001b[41m8\u001b[33m\u001b[101m \u001b[93m\u001b[43m.\u001b[31m\u001b"] [24.996022, "o", "[101mX\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@@\u001b[30m\u001b[41mX\u001b[91m\u001b[41m@\u001b[31m\u001b[101mS@X\u001b[91m\u001b[41mX;\u001b[31m\u001b[101mt\u001b[33m\u001b[101m.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m \u001b[33m\u001b[101m.%\u001b[91m\u001b[41m8\u001b[31m\u001b[101mX\u001b[33m\u001b[101m;.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m;S\u001b[33m\u001b[101m%S\u001b[91m\u001b[41m8\u001b[33m\u001b[41m@@\u001b[31m\u001b[101m.\u001b[33m\u001b[101m..\u001b[33m\u001b[103m.\u001b[31m\u001b[101m.\u001b[91m\u001b[41m%X\u001b[31m\u001b[101mS\u001b[33m\u001b[101m..\u001b[33m\u001b[103m.\u001b[31m\u001b[101m.\u001b[91m\u001b[41m@@\u001b[33m\u001b[101m..\u001b[31m\u001b[43mS\u001b[33m\u001b[41mt\u001b[91m\u001b[41m;\u001b[31m\u001b[101m@\u001b[33m\u001b[101m.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m:\u001b[33m\u001b[101m%:::\u001b[93m\u001b[43m.\u001b[93m\u001b[101mX\u001b[33m\u001b[101m \u001b[31m\u001b[101m@\u001b[33m\u001b[101mt\u001b[33m\u001b[103m.\u001b[33m\u001b[101m.\u001b[33m\u001b[103m \u001b[31m\u001b[101m S\u001b[33m\u001b[101mX.\u001b[93m\u001b[43m.\u001b[31m\u001b[101m \u001b[91m\u001b[41m8\u001b[31m\u001b[101mt\u001b[33m\u001b[101m.\u001b[33m\u001b[103m.\u001b[31m\u001b[101m.S\u001b[91m\u001b[41m8;\u001b[30m\u001b[41m@\u001b[31m\u001b[40m@\u001b[35m\u001b[41m@\u001b[30m\u001b[41m%\u001b[31m\u001b[40mX\u001b[34m\u001b[40mX;\u001b[?7l\u001b[30m\u001b[41m8\u001b[?7h\u001b[H\u001b(B\u001b[m\u001b[39;49m\u001b[37m\u001b[40m"] +[25.0, "m", "fire"] [25.001819, "o", "\u001b[10d\u001b[34m\u001b[40m\u001b[K\u001b[11;48Ht:\u001b[K\u001b[12;18Ht:\u001b[32m\u001b[40m \u001b[12;39H\u001b[34m\u001b[40m%tt :SX%: :%%:\u001b[K\u001b[13;16H;%S%: .:;:\u001b[36G .;tS%%;%S\u001b[31m\u001b[40mS8\u001b[34m\u001b[40m@%.\u001b[31m\u001b[40m \u001b[34m\u001b[40mt%\u001b[31m\u001b[40m@\u001b[34m\u001b[40m@;\u001b[31m\u001b[40m.\u001b[34m\u001b[40m .::t%t.\u001b[14;15H\u001b[1K tSSS%:\u001b[31m\u001b[40m \u001b[34m\u001b[40m:S\u001b[31m\u001b[40m8\u001b[30m\u001b[41m@8\u001b[34m\u001b[40m@;\u001b[31m\u001b[40m.\u001b[34m\u001b[40m .t%S\u001b[31m\u001b[40mS\u001b[34m\u001b[40m@SSX\u001b[31m\u001b[40m@88\u001b[34m\u001b[40m8S%%%\u001b[31m\u001b[40m@\u001b[35m\u001b[41m%:\u001b[30m\u001b[41m:\u001b[31m\u001b[40m8\u001b[34m\u001b[40mS\u001b[31m\u001b[40m;\u001b[34m\u001b[40m%\u001b[31m\u001b[40m88@\u001b[34m\u001b[40m@\u001b[31m\u001b[40mX\u001b[34m\u001b[40m@% ::.\u001b[83G .\u001b[K\u001b[15;14H\u001b[1K \u001b[32m\u001b[40m \u001b[34m\u001b[40m;S\u001b[31m\u001b[40mS\u001b[34m\u001b[40m@S%\u001b[31m\u001b[40m.\u001b[34m\u001b[40m ;S\u001b[35m\u001b[41m;;\u001b[91m\u001b[41m;\u001b[30m\u001b[41m%\u001b[34m\u001b[40mX%t%t\u001b[31m\u001b[40m \u001b[34m\u001b[40mtS\u001b[31m\u001b[40m8\u001b[30m\u001b[41m@\u001b[35m\u001b[41m%\u001b[30m\u001b[41mSS\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@@\u001b[30m\u001b[44m8\u001b[34m\u001b[40m8\u001b[30m\u001b[41m88\u001b[31m\u001b[40m8@8\u001b[30m\u001b[41m8\u001b[35m\u001b[41m%\u001b[91m\u001b[41m.St\u001b[35m\u001b[41m:\u001b[30m\u001b[41mt\u001b[35m\u001b[41m;\u001b[91m\u001b[41m:\u001b[35m\u001b[41m;\u001b[91m\u001b[41mt\u001b[35m\u001b[41mt\u001b[91m\u001b[41m;\u001b[30m\u001b[41mX\u001b[34m\u001b[40mXS%t%%\u001b[30m\u001b[41m@8\u001b[31m\u001b[40m8\u001b[34m\u001b[40m@SS:\u001b[31m\u001b[40m \u001b[34m\u001b[40m\u001b[K\u001b[1"] [25.001858, "o", "6;14H\u001b[1K :%X@SSS;tS\u001b[30m\u001b[41mt\u001b[91m\u001b[41m:SS;\u001b[30m\u001b[41m%\u001b[34m\u001b[40mS\u001b[31m\u001b[40mX888\u001b[30m\u001b[41m@\u001b[35m\u001b[41mt\u001b[91m\u001b[41m:%t%%\u001b[35m\u001b[41mt\u001b[91m\u001b[41m;\u001b[30m\u001b[41mX\u001b[34m\u001b[40mX@\u001b[30m\u001b[41m8\u001b[35m\u001b[41m8t%t:\u001b[91m\u001b[41m%@8S:\u001b[30m\u001b[41m;\u001b[35m\u001b[41m.\u001b[91m\u001b[41m%8\u001b[31m\u001b[1"] [25.002132, "o", "01m88\u001b[91m\u001b[41m8@X\u001b[35m\u001b[41m:\u001b[30m\u001b[41mX\u001b[31m\u001b[40m8\u001b[30m\u001b[41mS\u001b[35m\u001b[41m;\u001b[91m\u001b[41mXSSS;\u001b[30m\u001b[41m%\u001b[34m\u001b[40mSt\u001b[31m\u001b[40m.\u001b[32m\u001b[40m \u001b[34m\u001b[40m .;;.\u001b[17;1H.\u001b[17;11H t%\u001b[31m\u001b[40m88\u001b[34m\u001b[40mX\u001b[31m\u001b[40mX\u001b[34m\u001b[40m@\u001b[30m\u001b[41m8@8\u001b[31m\u001b[40m@8\u001b[30m\u001b[41mX\u001b[35m\u001b[41mt\u001b[91m\u001b[41m:%@Xt\u001b[35m\u001b[41m;tt;t:\u001b[91m\u001b[41mt8\u001b[31m\u001b[101mXSXS@\u001b[91m\u001b[41mX\u001b[35m\u001b[41m;\u001b[34m\u001b[40mSX\u001b[31m\u001b[40m@\u001b[35m\u001b[41m;\u001b[91m\u001b[41m.%X88\u001b[31m\u001b[101m88\u001b[91m\u001b[41m8t\u001b[35m\u001b[41m:\u001b[91m\u001b[41m:@\u001b[31m\u001b[101mS; \u001b[33m\u001b[101m.:\u001b[31m\u001b[101m:@\u001b[91m\u001b[41m%\u001b[35m\u001b[41mt.\u001b[91m\u001b[41m8\u001b[31m\u001b[101m@X8\u001b[91m\u001b[41m8S\u001b[35m\u001b[41m:\u001b[30m\u001b[41m8\u001b[34m\u001b[40mS .\u001b[30m\u001b[41m8\u001b[91m\u001b[41mX@\u001b[30m\u001b[41m%\u001b[18;1H\u001b[34m\u001b[40m;\u001b[31m\u001b[40m \u001b[34m\u001b[40m \u001b[12G\u001b[30m\u001b[41m8\u001b[35m\u001b[41m;;\u001b[91m\u001b[41mt\u001b[35m\u001b[41m:;\u001b[91m\u001b[41mtX88@\u001b[35m\u001b[41mS\u001b[91m\u001b[41m%:\u001b[35m\u001b[41m..\u001b[91m\u001b[41m;X@XXS;\u001b[30m\u001b[41m;X\u001b[35m\u001b[41m;\u001b[91m\u001b[41m.X\u001b[31m\u001b[101m8SS8\u001b[33m\u001b[41mt\u001b[31m\u001b[40m8\u001b[34m\u001b[40mt;@\u001b[30m\u001b[41m%:\u001b[35m\u001b[41m:\u001b[91m\u001b[41m;8\u001b[31m\u001b[101mXt;%8\u001b[91m\u001b[41m8@8\u001b[31m\u001b[101m88\u001b[33m\u001b[41m8\u001b[31m\u001b[101m;\u001b[33m\u001b[101mt;S\u001b[31m\u001b[101m8\u001b[91m\u001b[41mXSSX@S\u001b[90m\u001b[41m;\u001b[30m\u001b[41m;@\u001b[34"] @@ -1297,11 +1304,13 @@ [25.743689, "o", "\u001b[2m⏎\u001b(B\u001b[m \r⏎ \r\u001b[K"] [25.748365, "o", "\u001b[?2004h"] [25.754084, "o", "\u001b]0;~\u0007\u001b[30m\u001b(B\u001b[m\u001b[92mmarcin\u001b(B\u001b[m@\u001b(B\u001b[mputer\u001b(B\u001b[m \u001b[32m~\u001b(B\u001b[m\u001b(B\u001b[m> \u001b[K\r\u001b[16C"] +[26.0, "m", ""] [27.763048, "o", "\r\n\u001b[30m\u001b(B\u001b[m\u001b[30m\u001b(B\u001b[m\u001b[?2004l"] [27.766922, "o", "\u001b[0;32masciinema: recording finished\u001b[0m\r\r\n\u001b[0;32masciinema: asciicast saved to demo.cast\u001b[0m\r\r\n"] [27.777752, "o", "\u001b[2m⏎\u001b(B\u001b[m \r⏎ \r\u001b[K"] [27.780857, "o", "\u001b[?2004h"] [27.786256, "o", "\u001b]0;~\u0007\u001b[30m\u001b(B\u001b[m\u001b[92mmarcin\u001b(B\u001b[m@\u001b(B\u001b[mputer\u001b(B\u001b[m \u001b[32m~\u001b(B\u001b[m\u001b(B\u001b[m> \u001b[K\r\u001b[16C"] +[28.0, "m", ""] [29.789511, "o", "a\r\u001b[17C"] [29.789767, "o", "\b\u001b[38;2;255;0;0ma\r\u001b[17C\u001b[30m\u001b(B\u001b[m"] [29.795483, "o", "\u001b[38;2;85;85;85mafire \r\u001b[17C\u001b[30m\u001b(B\u001b[m"] @@ -1312,6 +1321,7 @@ [30.502224, "o", "\u001b[38;2;85;85;85m \r\u001b[19C\u001b[30m\u001b(B\u001b[m"] [30.560805, "o", "\u001b[38;2;0;95;215m \r\u001b[20C\u001b[30m\u001b(B\u001b[m"] [30.560998, "o", "\b \r\u001b[20C"] +[31.0, "m", ""] [31.941234, "o", "d\r\u001b[21C\b\u001b[38;2;0;175;255m\u001b[4md\r\u001b[21C\u001b[30m\u001b(B\u001b[m\u001b[38;2;85;85;85memo.cast \r\u001b[21C\u001b[30m\u001b(B\u001b[m"] [31.997237, "o", "\u001b[38;2;0;175;255m\u001b[4me\u001b[38;2;85;85;85m\u001b[24mmo.cast \r\u001b[22C\u001b[30m\u001b(B\u001b[m"] [32.100874, "o", "\u001b[38;2;0;175;255m\u001b[4mm\u001b[38;2;85;85;85m\u001b[24mo.cast \r\u001b[23C\u001b[30m\u001b(B\u001b[m"] @@ -1323,6 +1333,7 @@ [33.914229, "o", "\u001b[38;2;0;175;255m\u001b[4mt\u001b[38;2;85;85;85m\u001b[24m \r\u001b[29C\u001b[30m\u001b(B\u001b[m"] [33.985777, "o", "\u001b[38;2;0;175;255m\u001b[4m \r\u001b[30C\u001b[30m\u001b(B\u001b[m"] [33.985976, "o", "\b \r\u001b[30C"] +[34.0, "m", ""] [34.278363, "o", "d\r\u001b[31C"] [34.280125, "o", "\b\u001b[38;2;0;175;255m\u001b[4md\r\u001b[31C\u001b[30m\u001b(B\u001b[m\u001b[38;2;85;85;85memo.gz.b64 \r\u001b[31C\u001b[30m\u001b(B\u001b[m"] [34.343251, "o", "\u001b[38;2;0;175;255m\u001b[4me\u001b[38;2;85;85;85m\u001b[24mmo.gz.b64 \r\u001b[32C\u001b[30m\u001b(B\u001b[m"] @@ -1478,5 +1489,6 @@ [38.233006, "o", "\u001b[2m⏎\u001b(B\u001b[m \r⏎ \r\u001b[K"] [38.235648, "o", "\u001b[?2004h"] [38.240396, "o", "\u001b]0;~\u0007\u001b[30m\u001b(B\u001b[m\u001b[92mmarcin\u001b(B\u001b[m@\u001b(B\u001b[mputer\u001b(B\u001b[m \u001b[32m~\u001b(B\u001b[m\u001b(B\u001b[m> \u001b[K\r\u001b[16C"] +[40.0, "m", ""] [40.24287, "o", "\r\n\u001b[30m\u001b(B\u001b[m\u001b[30m\u001b(B\u001b[m"] [40.243514, "o", "\u001b[?2004l"] diff --git a/src/asciicast.rs b/src/asciicast.rs index a2c3757..3425a43 100644 --- a/src/asciicast.rs +++ b/src/asciicast.rs @@ -10,7 +10,7 @@ use crate::theme::Theme; pub struct Asciicast<'a> { pub header: Header, - pub events: Box> + 'a>, + pub events: Box> + 'a>, } pub struct Header { @@ -20,6 +20,12 @@ pub struct Header { pub idle_time_limit: Option, } +#[derive(Debug, PartialEq)] +pub enum Event { + Output(f64, String), + Marker(f64, String), +} + pub type OutputEvent = (f64, String); impl Default for Header { diff --git a/src/asciicast/v1.rs b/src/asciicast/v1.rs index 2b8cb78..92db623 100644 --- a/src/asciicast/v1.rs +++ b/src/asciicast/v1.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Result}; use serde::Deserialize; -use super::{Asciicast, Header}; +use super::{Asciicast, Event, Header}; #[derive(Deserialize)] struct V1 { @@ -34,7 +34,7 @@ pub fn load(json: String) -> Result> { let time = *prev_time + event.time; *prev_time = time; - Some(Ok((time, event.data))) + Some(Ok(Event::Output(time, event.data))) })); Ok(Asciicast { header, events }) diff --git a/src/asciicast/v2.rs b/src/asciicast/v2.rs index 18cc9d2..b06268b 100644 --- a/src/asciicast/v2.rs +++ b/src/asciicast/v2.rs @@ -3,7 +3,7 @@ use std::io; use anyhow::{bail, Context, Result}; use serde::{Deserialize, Deserializer}; -use super::{Asciicast, Header, Theme}; +use super::{Asciicast, Event, Header, Theme}; #[derive(Deserialize)] struct V2Header { @@ -76,7 +76,7 @@ impl Parser { } } -fn parse_line(line: io::Result) -> Option> { +fn parse_line(line: io::Result) -> Option> { match line { Ok(line) => { if line.is_empty() { @@ -90,13 +90,13 @@ fn parse_line(line: io::Result) -> Option> { } } -fn parse_event(line: String) -> Result> { +fn parse_event(line: String) -> Result> { let event = serde_json::from_str::(&line).context("asciicast parse error")?; - let output = if let V2EventCode::Output = event.code { - Some((event.time, event.data)) - } else { - None + let output = match event.code { + V2EventCode::Output => Some(Event::Output(event.time, event.data)), + V2EventCode::Marker => Some(Event::Marker(event.time, event.data)), + _ => None, }; Ok(output) diff --git a/src/asciicast/v3.rs b/src/asciicast/v3.rs index 8cb5f36..bb73aff 100644 --- a/src/asciicast/v3.rs +++ b/src/asciicast/v3.rs @@ -3,7 +3,7 @@ use std::io; use anyhow::{bail, Context, Result}; use serde::{Deserialize, Deserializer}; -use super::{Asciicast, Header, Theme}; +use super::{Asciicast, Event, Header, Theme}; #[derive(Deserialize)] struct V3Header { @@ -90,7 +90,7 @@ impl Parser { Asciicast { header, events } } - fn parse_line(&mut self, line: io::Result) -> Option> { + fn parse_line(&mut self, line: io::Result) -> Option> { match line { Ok(line) => { if line.is_empty() || line.starts_with('#') { @@ -104,16 +104,16 @@ impl Parser { } } - fn parse_event(&mut self, line: String) -> Result> { + fn parse_event(&mut self, line: String) -> Result> { let event = serde_json::from_str::(&line).context("asciicast parse error")?; let time = self.prev_time + event.time; self.prev_time = time; - let output = if let V3EventCode::Output = event.code { - Some((time, event.data)) - } else { - None + let output = match event.code { + V3EventCode::Output => Some(Event::Output(time, event.data)), + V3EventCode::Marker => Some(Event::Marker(time, event.data)), + _ => None, }; Ok(output) diff --git a/src/lib.rs b/src/lib.rs index 4b74472..01a1373 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ mod renderer; mod theme; mod vt; +use std::collections::HashMap; use std::fmt::{Debug, Display}; use std::io::{BufRead, Write}; use std::{iter, thread, time::Instant}; @@ -13,7 +14,8 @@ use anyhow::{anyhow, Result}; use clap::ArgEnum; use log::info; -use crate::asciicast::Asciicast; +use crate::asciicast::{Asciicast, Event, Header}; +use crate::renderer::Renderer as _; pub const DEFAULT_FONT_FAMILY: &str = "JetBrains Mono,Fira Code,SF Mono,Menlo,Consolas,DejaVu Sans Mono,Liberation Mono"; @@ -26,6 +28,8 @@ pub const DEFAULT_SPEED: f64 = 1.0; pub const DEFAULT_IDLE_TIME_LIMIT: f64 = 5.0; pub struct Config { + pub width: Option, + pub height: Option, pub cols: Option, pub font_dirs: Vec, pub font_family: String, @@ -40,11 +44,14 @@ pub struct Config { pub speed: f64, pub theme: Option, pub show_progress_bar: bool, + pub fill_background: bool, } impl Default for Config { fn default() -> Self { Self { + width: None, + height: None, cols: None, font_dirs: vec![], font_family: String::from(DEFAULT_FONT_FAMILY), @@ -59,6 +66,7 @@ impl Default for Config { speed: DEFAULT_SPEED, theme: Default::default(), show_progress_bar: true, + fill_background: true, } } } @@ -70,6 +78,16 @@ pub enum Renderer { Fontdue, } +#[derive(Clone, Debug, ArgEnum, Default)] +pub enum OutputMode { + /// Write a single animated GIF of the entire input + #[default] + AnimatedGif, + + /// Write a snapshot PNG of each marker in the input + SnapshotMarkers, +} + #[derive(Clone, Debug, ArgEnum, Default)] pub enum Theme { Asciinema, @@ -129,9 +147,7 @@ impl Display for Theme { } } -pub fn run(input: I, output: O, config: Config) -> Result<()> { - let Asciicast { header, events, .. } = asciicast::open(input)?; - +fn renderer_settings(header: &Header, config: &Config) -> Result { if header.term_cols == 0 || header.term_rows == 0 { return Err(anyhow!( "the recording has invalid terminal size: {}x{}", @@ -145,19 +161,6 @@ pub fn run(input: I, output: O, config: Config) -> config.rows.unwrap_or(header.term_rows as usize), ); - let itl = config - .idle_time_limit - .or(header.idle_time_limit) - .unwrap_or(DEFAULT_IDLE_TIME_LIMIT); - - let events = iter::once(Ok((0.0, "".to_owned()))).chain(events); - let events = events::limit_idle_time(events, itl); - let events = events::accelerate(events, config.speed); - let events = events::batch(events, config.fps_cap); - let events = events.collect::>(); - let count = events.len() as u64; - let frames = vt::frames(events.into_iter(), terminal_size); - info!("terminal size: {}x{}", terminal_size.0, terminal_size.1); let (font_db, font_families) = fonts::init(&config.font_dirs, &config.font_family) @@ -167,7 +170,8 @@ pub fn run(input: I, output: O, config: Config) -> let theme_opt = config .theme - .or_else(|| header.term_theme.map(Theme::Embedded)) + .clone() + .or_else(|| header.term_theme.clone().map(Theme::Embedded)) .unwrap_or(Theme::Dracula); info!("selected theme: {}", theme_opt); @@ -179,8 +183,17 @@ pub fn run(input: I, output: O, config: Config) -> font_size: config.font_size, line_height: config.line_height, theme: theme_opt.try_into()?, + pixel_width: config.width, + pixel_height: config.height, + fill_background: config.fill_background, }; + Ok(settings) +} +pub fn run(input: I, output: O, config: Config) -> Result<()> { + let Asciicast { header, events } = asciicast::open(input)?; + let settings = renderer_settings(&header, &config)?; + let terminal_size = settings.terminal_size; let mut renderer: Box = match config.renderer { Renderer::Fontdue => Box::new(renderer::fontdue(settings)), Renderer::Resvg => Box::new(renderer::resvg(settings)), @@ -190,6 +203,24 @@ pub fn run(input: I, output: O, config: Config) -> info!("gif dimensions: {}x{}", width, height); + let itl = config + .idle_time_limit + .or(header.idle_time_limit) + .unwrap_or(DEFAULT_IDLE_TIME_LIMIT); + + let events = events.into_iter().filter_map(|event| match event { + Ok(Event::Output(time, data)) => Some(Ok((time, data))), + Ok(Event::Marker(..)) => None, + Err(e) => Some(Err(e)), + }); + let events = iter::once(Ok((0.0, "".to_owned()))).chain(events); + let events = events::limit_idle_time(events, itl); + let events = events::accelerate(events, config.speed); + let events = events::batch(events, config.fps_cap); + let events = events.collect::>(); + let count = events.len() as u64; + let frames = vt::frames(events.into_iter(), terminal_size); + let repeat = if config.no_loop { gifski::Repeat::Finite(0) } else { @@ -223,7 +254,7 @@ pub fn run(input: I, output: O, config: Config) -> for (i, frame) in frames.enumerate() { let (time, lines, cursor) = frame?; - let image = renderer.render(lines, cursor); + let image = renderer.render(&lines, cursor); let time = if i == 0 { 0.0 } else { time }; collector.add_frame_rgba(i, image, time + config.last_frame_duration)?; } @@ -240,3 +271,57 @@ pub fn run(input: I, output: O, config: Config) -> Ok(()) } + +pub fn write_snapshots(input: I, snapshots_path: &str, config: Config) -> Result<()> { + let Asciicast { header, events } = asciicast::open(input)?; + let settings = renderer_settings(&header, &config)?; + let terminal_size = settings.terminal_size; + let renderer = renderer::resvg(settings); + + let (width, height) = renderer.pixel_size(); + + info!("snapshot dimensions: {}x{}", width, height); + + let mut vt = avt::Vt::builder() + .size(terminal_size.0, terminal_size.1) + .scrollback_limit(0) + .build(); + + let mut label_counters: HashMap = HashMap::new(); + + for event in events { + match event? { + Event::Output(_time, data) => { + vt.feed_str(&data); + } + Event::Marker(_time, label) => { + let label = sanitize(&label); + let counter = label_counters.entry(label.clone()).or_insert(0); + let name = if label.is_empty() { "marker" } else { &label }; + let filename = if *counter == 0 { + format!("{snapshots_path}/{name}") + } else { + format!("{snapshots_path}/{name}({counter:03})") + }; + *counter += 1; + + let lines = vt.view(); + let cursor: Option<(usize, usize)> = vt.cursor().into(); + info!("rendering {}.svg, {}.png, {}.txt", filename, filename, filename); + use std::fs; + let svg = renderer.render_svg(lines, cursor); + let pixmap = renderer.render_pixmap(&svg); + fs::write(format!("{}.txt", filename), vt.dump())?; + fs::write(format!("{}.svg", filename), &svg)?; + pixmap.save_png(format!("{}.png", filename))?; + } + } + } + Ok(()) +} + +fn sanitize(s: &str) -> String { + s.chars() + .filter(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-' | ' ' | '.')) + .collect() +} diff --git a/src/main.rs b/src/main.rs index e225ac3..30f6c64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,9 +50,13 @@ struct Cli { /// asciicast path/filename or URL input_filename_or_url: String, - /// GIF path/filename + /// Output path/filename output_filename: String, + /// Whether to write an animated GIF or snapshot PNGs at markers + #[clap(long, arg_enum, default_value_t = agg::OutputMode::default())] + mode: agg::OutputMode, + /// Select frame rendering backend #[clap(long, arg_enum, default_value_t = agg::Renderer::default())] renderer: agg::Renderer, @@ -112,6 +116,18 @@ struct Cli { /// Quiet mode - suppress diagnostic messages and progress bars #[clap(short, long)] quiet: bool, + + /// Override output image width (in pixels) + #[clap(long)] + width: Option, + + /// Override output image height (in pixels) + #[clap(long)] + height: Option, + + /// Disable filling images with the background color + #[clap(long)] + transparent_background: bool, } fn download(url: &str) -> Result { @@ -173,6 +189,8 @@ fn main() -> Result<()> { .init(); let config = agg::Config { + width: cli.width, + height: cli.height, cols: cli.cols, font_dirs: cli.font_dir, font_family: cli.font_family, @@ -187,16 +205,27 @@ fn main() -> Result<()> { speed: cli.speed, theme: cli.theme.map(|theme| theme.0), show_progress_bar: !cli.quiet, + fill_background: !cli.transparent_background, }; let input = BufReader::new(reader(&cli.input_filename_or_url)?); - let mut output = File::create(&cli.output_filename)?; - match agg::run(input, &mut output, config) { - Ok(ok) => Ok(ok), - Err(err) => { - std::fs::remove_file(cli.output_filename)?; - Err(err) + match cli.mode { + agg::OutputMode::AnimatedGif => { + let mut output = File::create(&cli.output_filename)?; + + match agg::run(input, &mut output, config) { + Ok(()) => (), + Err(err) => { + std::fs::remove_file(&cli.output_filename)?; + return Err(err); + } + } + } + agg::OutputMode::SnapshotMarkers => { + agg::write_snapshots(input, &cli.output_filename, config)?; } } + + Ok(()) } diff --git a/src/renderer.rs b/src/renderer.rs index 5d386e8..fc8cd6f 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -7,7 +7,7 @@ use rgb::{RGB8, RGBA8}; use crate::theme::Theme; pub trait Renderer { - fn render(&mut self, lines: Vec, cursor: Option<(usize, usize)>) -> ImgVec; + fn render(&mut self, lines: &[avt::Line], cursor: Option<(usize, usize)>) -> ImgVec; fn pixel_size(&self) -> (usize, usize); } @@ -18,6 +18,9 @@ pub struct Settings { pub font_size: usize, pub line_height: f64, pub theme: Theme, + pub pixel_width: Option, + pub pixel_height: Option, + pub fill_background: bool, } pub fn resvg<'a>(settings: Settings) -> resvg::ResvgRenderer<'a> { diff --git a/src/renderer/fontdue.rs b/src/renderer/fontdue.rs index 4a4fd34..4b96ab1 100644 --- a/src/renderer/fontdue.rs +++ b/src/renderer/fontdue.rs @@ -12,6 +12,7 @@ type Glyph = (fontdue::Metrics, Vec); pub struct FontdueRenderer { font_families: Vec, theme: Theme, + background_color: RGBA8, pixel_width: usize, pixel_height: usize, font_size: usize, @@ -73,13 +74,23 @@ impl FontdueRenderer { let (cols, rows) = settings.terminal_size; let col_width = metrics.advance_width as f64; let row_height = (settings.font_size as f64) * settings.line_height; + let background_color = if settings.fill_background { + settings.theme.background.alpha(255) + } else { + settings.theme.background.alpha(0) + }; Self { font_db: settings.font_db, font_families: settings.font_families, theme: settings.theme, - pixel_width: ((cols + 2) as f64 * col_width).round() as usize, - pixel_height: ((rows + 1) as f64 * row_height).round() as usize, + background_color, + pixel_width: settings + .pixel_width + .unwrap_or(((cols + 2) as f64 * col_width).round() as usize), + pixel_height: settings + .pixel_height + .unwrap_or(((rows + 1) as f64 * row_height).round() as usize), font_size: settings.font_size, col_width, row_height, @@ -167,9 +178,9 @@ fn mix_colors(fg: RGBA8, bg: RGBA8, ratio: u8) -> RGBA8 { } impl Renderer for FontdueRenderer { - fn render(&mut self, lines: Vec, cursor: Option<(usize, usize)>) -> ImgVec { + fn render(&mut self, lines: &[avt::Line], cursor: Option<(usize, usize)>) -> ImgVec { let mut buf: Vec = - vec![self.theme.background.alpha(255); self.pixel_width * self.pixel_height]; + vec![self.background_color; self.pixel_width * self.pixel_height]; let margin_l = self.col_width; let margin_t = (self.row_height / 2.0).round() as usize; diff --git a/src/renderer/resvg.rs b/src/renderer/resvg.rs index ecab714..c9a5f0b 100644 --- a/src/renderer/resvg.rs +++ b/src/renderer/resvg.rs @@ -3,6 +3,7 @@ use crate::theme::Theme; use imgref::ImgVec; use rgb::{FromSlice, RGBA8}; use std::{fmt::Write, sync::Arc}; +use tiny_skia::Pixmap; pub struct ResvgRenderer<'a> { terminal_size: (usize, usize), @@ -73,13 +74,16 @@ impl<'a> ResvgRenderer<'a> { font_size, row_height, &settings.theme, + settings.fill_background, ); let mut svg = header.clone(); svg.push_str(Self::footer()); let tree = usvg::Tree::from_str(&svg, &options).unwrap(); - let pixel_width = tree.size().width() as usize; - let pixel_height = tree.size().height() as usize; + let pixel_width = settings.pixel_width.unwrap_or(tree.size().width() as usize); + let pixel_height = settings + .pixel_height + .unwrap_or(tree.size().height() as usize); Self { terminal_size: settings.terminal_size, @@ -100,13 +104,14 @@ impl<'a> ResvgRenderer<'a> { font_size: f64, row_height: f64, theme: &Theme, + fill_background: bool, ) -> String { let width = (cols + 2) as f64 * (font_size * 0.6); let height = (rows + 1) as f64 * row_height; let x = 1.0 * 100.0 / (cols as f64 + 2.0); let y = 0.5 * 100.0 / (rows as f64 + 1.0); - format!( + let mut header = format!( r#" - -"#, - width, height, font_size, font_family, 4, 4, theme.background, x, y, theme.foreground +"#, + width, height, font_size, font_family + ); + if fill_background { + writeln!( + &mut header, + r#""#, + 4, 4, theme.background + ) + .unwrap(); + } + writeln!( + &mut header, + r#""#, + x, y, theme.foreground ) + .unwrap(); + header } fn footer() -> &'static str { "" } - fn push_lines(&self, svg: &mut String, lines: Vec, cursor: Option<(usize, usize)>) { + fn push_lines(&self, svg: &mut String, lines: &[avt::Line], cursor: Option<(usize, usize)>) { self.push_background(svg, &lines, cursor); self.push_text(svg, &lines, cursor); } @@ -238,19 +257,29 @@ impl<'a> ResvgRenderer<'a> { svg.push_str(""); } -} -impl<'a> Renderer for ResvgRenderer<'a> { - fn render(&mut self, lines: Vec, cursor: Option<(usize, usize)>) -> ImgVec { + pub fn render_svg(&self, lines: &[avt::Line], cursor: Option<(usize, usize)>) -> String { let mut svg = self.header.clone(); self.push_lines(&mut svg, lines, cursor); svg.push_str(Self::footer()); - let tree = usvg::Tree::from_str(&svg, &self.options).unwrap(); + svg + } + + pub fn render_pixmap(&self, svg: &str) -> Pixmap { + let tree = usvg::Tree::from_str(svg, &self.options).unwrap(); let mut pixmap = tiny_skia::Pixmap::new(self.pixel_width as u32, self.pixel_height as u32).unwrap(); resvg::render(&tree, self.transform, &mut pixmap.as_mut()); + pixmap + } +} + +impl<'a> Renderer for ResvgRenderer<'a> { + fn render(&mut self, lines: &[avt::Line], cursor: Option<(usize, usize)>) -> ImgVec { + let svg = self.render_svg(lines, cursor); + let pixmap = self.render_pixmap(&svg); let buf = pixmap.take().as_rgba().to_vec(); ImgVec::new(buf, self.pixel_width, self.pixel_height)