--- /dev/null
+<!-- Copyright 2020-2021 Ian Jackson and contributors to Otter
+ SPDX-License-Identifier: AGPL-3.0-or-later
+ There is NO WARRANTY. -->
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <title>server::dummy - alice - Otter
+ </title>
+<link rel="license" href="http://localhost:8000/_/libre"><script>
+ orig_console = window.console;
+ window.console = (function(){
+ var new_console = { saved: [] };
+ for (k of ['log','error','warn','info']) {
+ (function(k){
+ var orig = orig_console[k];
+ new_console[k] = function() {
+ let args = [].slice.call(arguments);
+ new_console.saved.push([k, [args.map(s => (
+ s === undefined ? "<undefined>" :
+ s === null ? "<null>" :
+ s.toString()
+ ))]]);
+ orig.apply(orig_console, arguments);
+ }
+ })(k);
+ }
+ return new_console;
+ })();
+ console.log('wdriver.rs console log starts');
+</script>
+
+<script defer="defer">let wasm_input = fetch('/_/wasm.wasm');</script>
+<script src="server%20dummy%20-%20alice%20-%20Otter_files/wasm.js" defer="defer"></script>
+<script id="global-info" data-layout="Portrait"></script>
+<script src="server%20dummy%20-%20alice%20-%20Otter_files/script.js" defer="defer"></script>
+</head>
+<!-- Copyright 2020u Ian Jackson
+ SPDX-License-Identifier: AGPL-3.0-or-later
+ There is NO WARRANTY. --><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body id="main-body" data-ctoken="TdWGr534zPXTH8v9wp0FF15bHs7R9bxyhFY2soYoN2Fg7U1R8RU09JQgasqN4jTC" data-us="1#1" data-gen="538" data-sse-url-prefix="" style="transform-origin: top left;">
+<style>
+ html {
+ background-color: #eef;
+ }
+ .footer {
+ background-color: #ddf;
+ }
+ div[id=infopane] {
+ display: flex;
+ flex-direction: column;
+ background-color: white;
+ overflow-y: scroll;
+ }
+ div[class=uos] {
+ flex: initial;
+ }
+ div[id=uos] {
+ flex: auto;
+ }
+ div[class=somepane] {
+ flex: auto;
+ display: flex;
+ flex-direction: column;
+ }
+ div[id=player_list_columns] {
+ }
+</style>
+
+<style>
+ body {
+ min-height: 100vw;
+ }
+ div[class=uos] { display: flex; flex-wrap: wrap; }
+ div[class|=uokey] {
+ outline: 1px solid #000;
+ margin: 1px;
+ padding-left: 5px;
+ padding-right: 6.5px;
+ align-self: start;
+ }
+ table[id=log] {
+ width: 100%;
+ }
+ td[class=logts] {
+ padding-left: 5px;
+ text-align: right;
+ }
+ div[class=uokey-r] {
+ align-self: end;
+ }
+ div[id=infopane] {
+ height: 100px;
+ }
+ .uos-mid {
+ flex-grow: 1;
+ }
+ div[id=player_list_columns] {
+ columns: 3;
+ }
+</style>
+<div class="upper">
+
+Hi alice
+
+|
+g
+<span id="wresting-warning"></span>
+
+|
+<strong>FAKING RANDOMNESS!</strong>
+<span id="status">server online 1#1 1C1 G538 U1 K1</span>
+
+|
+<a href="http://localhost:8000/l?kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe">switch to landscape view</a> |
+<span id="links">links: <a href="https://jitsi.example.com/initial">Voice</a> <a href="http://localhost:8000/_/shapelib.html">Shapelib</a> |</span>
+
+<span style="white-space: nowrap;"><button id="zoom-btn" disabled="disabled" onclick="zoom_activate()">Zoom</button><input id="zoom-val" type="number" max="1000" min="10" step="5" size="4" value="100" oninput="zoom_enable()">%</span>
+
+
+<pre id="error"></pre>
+
+
+
+ <svg id="space" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 200" width="1800" height="1200">
+ <rect fill="#bbd" x="0" y="0" width="300" height="200"></rect>
+ <g id="pieces_marker"></g>
+ <use id="use170.5" href="#piece170.5" x="150" y="100" data-piece="170.5"></use>
+ <use id="use166.7" href="#piece166.7" x="115" y="135" data-piece="166.7"></use>
+ <use id="use111.7" href="#piece111.7" x="125" y="135" data-piece="111.7"></use>
+ <use id="use155.7" href="#piece155.7" x="135" y="135" data-piece="155.7"></use>
+ <use id="use72.7" href="#piece72.7" x="145" y="135" data-piece="72.7"></use>
+ <use id="use82.7" href="#piece82.7" x="155" y="135" data-piece="82.7"></use>
+ <use id="use54.7" href="#piece54.7" x="165" y="135" data-piece="54.7"></use>
+ <use id="use126.7" href="#piece126.7" x="175" y="135" data-piece="126.7"></use>
+ <use id="use81.7" href="#piece81.7" x="185" y="135" data-piece="81.7"></use>
+ <use id="use125.7" href="#piece125.7" x="115" y="65" data-piece="125.7"></use>
+ <use id="use94.7" href="#piece94.7" x="125" y="65" data-piece="94.7"></use>
+ <use id="use141.7" href="#piece141.7" x="135" y="65" data-piece="141.7"></use>
+ <use id="use47.7" href="#piece47.7" x="145" y="65" data-piece="47.7"></use>
+ <use id="use134.7" href="#piece134.7" x="155" y="65" data-piece="134.7"></use>
+ <use id="use163.7" href="#piece163.7" x="165" y="65" data-piece="163.7"></use>
+ <use id="use66.7" href="#piece66.7" x="175" y="65" data-piece="66.7"></use>
+ <use id="use161.7" href="#piece161.7" x="185" y="65" data-piece="161.7"></use>
+ <use id="use36.7" href="#piece36.7" x="115" y="125" data-piece="36.7"></use>
+ <use id="use20.7" href="#piece20.7" x="125" y="125" data-piece="20.7"></use>
+ <use id="use27.7" href="#piece27.7" x="135" y="125" data-piece="27.7"></use>
+ <use id="use29.7" href="#piece29.7" x="145" y="125" data-piece="29.7"></use>
+ <use id="use130.7" href="#piece130.7" x="155" y="125" data-piece="130.7"></use>
+ <use id="use146.7" href="#piece146.7" x="165" y="125" data-piece="146.7"></use>
+ <use id="use19.7" href="#piece19.7" x="175" y="125" data-piece="19.7"></use>
+ <use id="use149.7" href="#piece149.7" x="185" y="125" data-piece="149.7"></use>
+ <use id="use34.7" href="#piece34.7" x="115" y="75" data-piece="34.7"></use>
+ <use id="use70.7" href="#piece70.7" x="125" y="75" data-piece="70.7"></use>
+ <use id="use159.7" href="#piece159.7" x="135" y="75" data-piece="159.7"></use>
+ <use id="use89.7" href="#piece89.7" x="145" y="75" data-piece="89.7"></use>
+ <use id="use132.7" href="#piece132.7" x="155" y="75" data-piece="132.7"></use>
+ <use id="use160.7" href="#piece160.7" x="165" y="75" data-piece="160.7"></use>
+ <use id="use124.7" href="#piece124.7" x="175" y="75" data-piece="124.7"></use>
+ <use id="use30.7" href="#piece30.7" x="185" y="75" data-piece="30.7"></use>
+ <use id="use123.7" href="#piece123.7" x="20" y="75" data-piece="123.7"></use>
+ <use id="use140.7" href="#piece140.7" x="30" y="75" data-piece="140.7"></use>
+ <use id="use49.7" href="#piece49.7" x="40" y="75" data-piece="49.7"></use>
+ <use id="use63.7" href="#piece63.7" x="50" y="75" data-piece="63.7"></use>
+ <use id="use46.7" href="#piece46.7" x="60" y="75" data-piece="46.7"></use>
+ <use id="use18.7" href="#piece18.7" x="70" y="75" data-piece="18.7"></use>
+ <use id="use88.7" href="#piece88.7" x="80" y="75" data-piece="88.7"></use>
+ <use id="use165.7" href="#piece165.7" x="90" y="75" data-piece="165.7"></use>
+ <use id="use39.7" href="#piece39.7" x="20" y="85" data-piece="39.7"></use>
+ <use id="use9.7" href="#piece9.7" x="30" y="85" data-piece="9.7"></use>
+ <use id="use145.7" href="#piece145.7" x="40" y="85" data-piece="145.7"></use>
+ <use id="use139.7" href="#piece139.7" x="50" y="85" data-piece="139.7"></use>
+ <use id="use43.7" href="#piece43.7" x="60" y="85" data-piece="43.7"></use>
+ <use id="use122.7" href="#piece122.7" x="70" y="85" data-piece="122.7"></use>
+ <use id="use32.7" href="#piece32.7" x="80" y="85" data-piece="32.7"></use>
+ <use id="use26.7" href="#piece26.7" x="90" y="85" data-piece="26.7"></use>
+ <use id="use93.7" href="#piece93.7" x="20" y="95" data-piece="93.7"></use>
+ <use id="use154.7" href="#piece154.7" x="30" y="95" data-piece="154.7"></use>
+ <use id="use38.7" href="#piece38.7" x="40" y="95" data-piece="38.7"></use>
+ <use id="use25.7" href="#piece25.7" x="50" y="95" data-piece="25.7"></use>
+ <use id="use129.7" href="#piece129.7" x="60" y="95" data-piece="129.7"></use>
+ <use id="use48.7" href="#piece48.7" x="70" y="95" data-piece="48.7"></use>
+ <use id="use158.7" href="#piece158.7" x="80" y="95" data-piece="158.7"></use>
+ <use id="use164.7" href="#piece164.7" x="90" y="95" data-piece="164.7"></use>
+ <use id="use51.7" href="#piece51.7" x="20" y="100" data-piece="51.7"></use>
+ <use id="use69.7" href="#piece69.7" x="30" y="100" data-piece="69.7"></use>
+ <use id="use113.7" href="#piece113.7" x="40" y="100" data-piece="113.7"></use>
+ <use id="use14.7" href="#piece14.7" x="50" y="100" data-piece="14.7"></use>
+ <use id="use10.7" href="#piece10.7" x="60" y="100" data-piece="10.7"></use>
+ <use id="use110.7" href="#piece110.7" x="70" y="100" data-piece="110.7"></use>
+ <use id="use28.7" href="#piece28.7" x="80" y="100" data-piece="28.7"></use>
+ <use id="use102.7" href="#piece102.7" x="90" y="100" data-piece="102.7"></use>
+ <use id="use153.7" href="#piece153.7" x="17" y="110" data-piece="153.7"></use>
+ <use id="use33.7" href="#piece33.7" x="22" y="110" data-piece="33.7"></use>
+ <use id="use119.7" href="#piece119.7" x="27" y="110" data-piece="119.7"></use>
+ <use id="use169.7" href="#piece169.7" x="32" y="110" data-piece="169.7"></use>
+ <use id="use57.7" href="#piece57.7" x="37" y="110" data-piece="57.7"></use>
+ <use id="use91.7" href="#piece91.7" x="42" y="110" data-piece="91.7"></use>
+ <use id="use118.7" href="#piece118.7" x="47" y="110" data-piece="118.7"></use>
+ <use id="use78.7" href="#piece78.7" x="52" y="110" data-piece="78.7"></use>
+ <use id="use120.7" href="#piece120.7" x="57" y="110" data-piece="120.7"></use>
+ <use id="use148.7" href="#piece148.7" x="62" y="110" data-piece="148.7"></use>
+ <use id="use90.7" href="#piece90.7" x="67" y="110" data-piece="90.7"></use>
+ <use id="use138.7" href="#piece138.7" x="72" y="110" data-piece="138.7"></use>
+ <use id="use35.7" href="#piece35.7" x="77" y="110" data-piece="35.7"></use>
+ <use id="use40.7" href="#piece40.7" x="82" y="110" data-piece="40.7"></use>
+ <use id="use99.7" href="#piece99.7" x="87" y="110" data-piece="99.7"></use>
+ <use id="use168.7" href="#piece168.7" x="92" y="110" data-piece="168.7"></use>
+ <use id="use11.7" href="#piece11.7" x="20" y="125" data-piece="11.7"></use>
+ <use id="use31.7" href="#piece31.7" x="30" y="125" data-piece="31.7"></use>
+ <use id="use45.7" href="#piece45.7" x="40" y="125" data-piece="45.7"></use>
+ <use id="use77.7" href="#piece77.7" x="50" y="125" data-piece="77.7"></use>
+ <use id="use84.7" href="#piece84.7" x="60" y="125" data-piece="84.7"></use>
+ <use id="use65.7" href="#piece65.7" x="70" y="125" data-piece="65.7"></use>
+ <use id="use68.7" href="#piece68.7" x="80" y="125" data-piece="68.7"></use>
+ <use id="use42.7" href="#piece42.7" x="90" y="125" data-piece="42.7"></use>
+ <use id="use167.7" href="#piece167.7" x="20" y="135" data-piece="167.7"></use>
+ <use id="use127.7" href="#piece127.7" x="30" y="135" data-piece="127.7"></use>
+ <use id="use62.7" href="#piece62.7" x="40" y="135" data-piece="62.7"></use>
+ <use id="use101.7" href="#piece101.7" x="50" y="135" data-piece="101.7"></use>
+ <use id="use17.7" href="#piece17.7" x="60" y="135" data-piece="17.7"></use>
+ <use id="use44.7" href="#piece44.7" x="70" y="135" data-piece="44.7"></use>
+ <use id="use100.7" href="#piece100.7" x="80" y="135" data-piece="100.7"></use>
+ <use id="use144.7" href="#piece144.7" x="90" y="135" data-piece="144.7"></use>
+ <use id="use117.7" href="#piece117.7" x="20" y="145" data-piece="117.7"></use>
+ <use id="use71.7" href="#piece71.7" x="30" y="145" data-piece="71.7"></use>
+ <use id="use60.7" href="#piece60.7" x="40" y="145" data-piece="60.7"></use>
+ <use id="use15.7" href="#piece15.7" x="50" y="145" data-piece="15.7"></use>
+ <use id="use157.7" href="#piece157.7" x="60" y="145" data-piece="157.7"></use>
+ <use id="use41.7" href="#piece41.7" x="70" y="145" data-piece="41.7"></use>
+ <use id="use83.7" href="#piece83.7" x="80" y="145" data-piece="83.7"></use>
+ <use id="use115.7" href="#piece115.7" x="90" y="145" data-piece="115.7"></use>
+ <use id="use86.7" href="#piece86.7" x="210" y="55" data-piece="86.7"></use>
+ <use id="use59.7" href="#piece59.7" x="220" y="55" data-piece="59.7"></use>
+ <use id="use73.7" href="#piece73.7" x="230" y="55" data-piece="73.7"></use>
+ <use id="use136.7" href="#piece136.7" x="240" y="55" data-piece="136.7"></use>
+ <use id="use121.7" href="#piece121.7" x="250" y="55" data-piece="121.7"></use>
+ <use id="use80.7" href="#piece80.7" x="260" y="55" data-piece="80.7"></use>
+ <use id="use23.7" href="#piece23.7" x="270" y="55" data-piece="23.7"></use>
+ <use id="use151.7" href="#piece151.7" x="280" y="55" data-piece="151.7"></use>
+ <use id="use162.7" href="#piece162.7" x="210" y="65" data-piece="162.7"></use>
+ <use id="use108.7" href="#piece108.7" x="220" y="65" data-piece="108.7"></use>
+ <use id="use135.7" href="#piece135.7" x="230" y="65" data-piece="135.7"></use>
+ <use id="use142.7" href="#piece142.7" x="240" y="65" data-piece="142.7"></use>
+ <use id="use107.7" href="#piece107.7" x="250" y="65" data-piece="107.7"></use>
+ <use id="use55.7" href="#piece55.7" x="260" y="65" data-piece="55.7"></use>
+ <use id="use53.7" href="#piece53.7" x="270" y="65" data-piece="53.7"></use>
+ <use id="use143.7" href="#piece143.7" x="280" y="65" data-piece="143.7"></use>
+ <use id="use67.7" href="#piece67.7" x="210" y="75" data-piece="67.7"></use>
+ <use id="use52.7" href="#piece52.7" x="220" y="75" data-piece="52.7"></use>
+ <use id="use76.7" href="#piece76.7" x="230" y="75" data-piece="76.7"></use>
+ <use id="use112.7" href="#piece112.7" x="240" y="75" data-piece="112.7"></use>
+ <use id="use22.7" href="#piece22.7" x="250" y="75" data-piece="22.7"></use>
+ <use id="use85.7" href="#piece85.7" x="260" y="75" data-piece="85.7"></use>
+ <use id="use13.7" href="#piece13.7" x="270" y="75" data-piece="13.7"></use>
+ <use id="use56.7" href="#piece56.7" x="280" y="75" data-piece="56.7"></use>
+ <use id="use92.7" href="#piece92.7" x="210" y="45" data-piece="92.7"></use>
+ <use id="use106.7" href="#piece106.7" x="220" y="45" data-piece="106.7"></use>
+ <use id="use21.7" href="#piece21.7" x="230" y="45" data-piece="21.7"></use>
+ <use id="use114.7" href="#piece114.7" x="240" y="45" data-piece="114.7"></use>
+ <use id="use97.7" href="#piece97.7" x="250" y="45" data-piece="97.7"></use>
+ <use id="use147.7" href="#piece147.7" x="260" y="45" data-piece="147.7"></use>
+ <use id="use137.7" href="#piece137.7" x="270" y="45" data-piece="137.7"></use>
+ <use id="use133.7" href="#piece133.7" x="280" y="45" data-piece="133.7"></use>
+ <use id="use96.7" href="#piece96.7" x="205" y="125" data-piece="96.7"></use>
+ <use id="use87.7" href="#piece87.7" x="215" y="125" data-piece="87.7"></use>
+ <use id="use156.7" href="#piece156.7" x="225" y="125" data-piece="156.7"></use>
+ <use id="use75.7" href="#piece75.7" x="235" y="125" data-piece="75.7"></use>
+ <use id="use95.7" href="#piece95.7" x="245" y="125" data-piece="95.7"></use>
+ <use id="use150.7" href="#piece150.7" x="255" y="125" data-piece="150.7"></use>
+ <use id="use24.7" href="#piece24.7" x="265" y="125" data-piece="24.7"></use>
+ <use id="use104.7" href="#piece104.7" x="275" y="125" data-piece="104.7"></use>
+ <use id="use116.7" href="#piece116.7" x="205" y="135" data-piece="116.7"></use>
+ <use id="use105.7" href="#piece105.7" x="215" y="135" data-piece="105.7"></use>
+ <use id="use98.7" href="#piece98.7" x="225" y="135" data-piece="98.7"></use>
+ <use id="use103.7" href="#piece103.7" x="235" y="135" data-piece="103.7"></use>
+ <use id="use37.7" href="#piece37.7" x="245" y="135" data-piece="37.7"></use>
+ <use id="use64.7" href="#piece64.7" x="255" y="135" data-piece="64.7"></use>
+ <use id="use74.7" href="#piece74.7" x="265" y="135" data-piece="74.7"></use>
+ <use id="use109.7" href="#piece109.7" x="275" y="135" data-piece="109.7"></use>
+ <use id="use128.7" href="#piece128.7" x="205" y="145" data-piece="128.7"></use>
+ <use id="use131.7" href="#piece131.7" x="215" y="145" data-piece="131.7"></use>
+ <use id="use50.7" href="#piece50.7" x="225" y="145" data-piece="50.7"></use>
+ <use id="use58.7" href="#piece58.7" x="235" y="145" data-piece="58.7"></use>
+ <use id="use12.7" href="#piece12.7" x="245" y="145" data-piece="12.7"></use>
+ <use id="use16.7" href="#piece16.7" x="255" y="145" data-piece="16.7"></use>
+ <use id="use79.7" href="#piece79.7" x="265" y="145" data-piece="79.7"></use>
+ <use id="use152.7" href="#piece152.7" x="275" y="145" data-piece="152.7"></use>
+ <use id="use61.7" href="#piece61.7" x="205" y="155" data-piece="61.7"></use>
+ <use id="use8.9" href="#piece8.9" x="215" y="155" data-piece="8.9"></use>
+ <use id="use7.9" href="#piece7.9" x="225" y="155" data-piece="7.9"></use>
+ <use id="use6.9" href="#piece6.9" x="235" y="155" data-piece="6.9"></use>
+ <use id="use5.9" href="#piece5.9" x="245" y="155" data-piece="5.9"></use>
+ <use id="use4.9" href="#piece4.9" x="255" y="155" data-piece="4.9"></use>
+ <use id="use3.9" href="#piece3.9" x="265" y="155" data-piece="3.9"></use>
+ <use id="use2.9" href="#piece2.9" x="275" y="155" data-piece="2.9"></use>
+ <use id="use1.9" href="#piece1.9" x="240" y="100" data-piece="1.9"></use>
+ <g id="defs_marker"></g>
+ <defs id="defs170.5"><g id="piece170.5" transform="" data-dragraise="45"><g transform="scale(0.38 0.38) translate(-121 -123)"><!-- otter.git#67b62ea1ec2e0c2855d08397cd599bf2a951da0b+ library/edited/chess-board.usvg CC-BY-SA-4.0, see library/edited/LICENCE -->
+<svg width="242" height="246" viewBox="0 0 242 246" xmlns="http://www.w3.org/2000/svg" xmlns:usvg="https://github.com/RazrFalcon/resvg" usvg:version="0.11.0">
+ <defs></defs>
+ <path id="rect2850" fill="#d18b47" stroke="#b0b0b0" stroke-width="0.99999994" d="M 16.5 18.5 L 225.5 18.5 L 225.5 227.5 L 16.5 227.5 Z"></path>
+ <path fill="none" stroke="#cccccc" d="M 21 13.5 C 27 15.5 20 17.5 22 20.5"></path>
+</svg>
+</g></g><path id="surround2.9" d="M 0 4.94923 a 4.94923 4.94923 0 1 0 0 -9.89846 a 4.94923 4.94923 0 1 0 0 9.89846 z"></path></defs>
+ <defs id="defs1.9"><g id="piece1.9" transform="" data-dragraise="10">
+
+<g transform="translate(-25,-10)">
+ <rect fill="white" stroke="black" width="50" height="20"></rect>
+</g>
+
+ <use href="#surround1.9" stroke="black" fill="none" stroke-dasharray="3 1"></use></g><path id="surround1.9" d="M -27.500000000000004 -11 h 55.00000000000001 v 22 h -55.00000000000001 z"></path></defs>
+ </svg>
+
+<p>
+</p><div id="infopane">
+
+ <div id="pane_help" class="somepane">
+ <div id="uos" class="uos">
+ <div class="uokey-l"><b>b</b> send to bottom (below other pieces)</div><div class="uokey-l"><b>l</b> rotate left</div><div class="uokey-l"><b>r</b> rotate right</div><div class="uos-mid" id="uos-mid"></div>
+ <div class="uokey-r"><b>P</b> Pin to table</div><div class="uokey-r"><b>W</b> Enter wresting mode</div></div>
+ <div class="uos">
+ <div class="uokey"><strong>Mouse</strong> select/deselect/drag</div>
+ <div class="uokey"><strong>shift</strong> multiple selection</div>
+ <div class="uokey">Show
+ <strong>H</strong> this help
+ <strong>U</strong> players
+ </div>
+ </div>
+ </div>
+
+ <div id="pane_players" class="somepane" style="display:none">
+ <div id="player_list_columns">
+<div><strong>Players</strong> (<strong>H</strong>/<strong>U</strong>: return to help)</div>
+ <div id="player_list">
+
+<!-- Copyright 2020-2021 Ian Jackson and contributors to Otter
+ SPDX-License-Identifier: AGPL-3.0-or-later
+ There is NO WARRANTY. -->
+
+<div class="player">
+<span class="player_num">#1</span>
+<span class="nick">alice</span>
+<span class="account">[server:alice]</span>
+</div>
+
+<div class="player">
+<span class="player_num">#2</span>
+<span class="nick">bob</span>
+<span class="account">[server:bob]</span>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+
+</div>
+
+
+<p>
+ </p><div id="logscroll" style="overflow-y: scroll; height: 200px;">
+ <table id="log">
+
+ <tbody><tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:40 +0000</td></tr>
+ <tr><td class="logmsg">alice [server:alice] joined the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">bob [server:bob] joined the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] set the link <a href="https://www.example.org/newinfo">Info</a></td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] removed the link Info</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:42 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:05:55 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:06:56 +0000</td></tr>
+ <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:23 +0000</td></tr>
+ <tr><td class="logmsg">alice released the chess clock</td><td class="logts">2021-03-16 18:15:25 +0000</td></tr>
+ <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+ <tr><td class="logmsg">alice released the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+ <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:15:26 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">[server:] (re)configured the game</td><td class="logts">2021-03-16 18:16:01 +0000</td></tr>
+ <tr><td class="logmsg">alice grasped the chess clock</td><td class="logts">2021-03-16 18:16:07 +0000</td></tr>
+ </tbody></table>
+ </div>
+</div>
+
+ <div class="footer">
+ <!--
+ this affects the document's overall scrollbars
+ which is not what we want. so get rid of it for now
+ <div class="footer"; style="
+ height: 100vw;
+ width: 200vw;
+ left: -50vw;
+ overflow-y: clip;
+ position: absolute;
+ z-index: -1;
+ "><!-- this fills in the rest of the page, including the margins
+ --x
+ </div>
+ -->
+ <hr>
+ <address style="max-height: 100vh;">
+ This server is running Otter, the Online TableTop Environment
+ Renderer. Otter and its shape (piece picture) libraries
+ are <a href="http://localhost:8000/_/libre">Free Software</a> and come with NO
+ WARRANTY.
+ </address></div>
+
+</body></html>
--- /dev/null
+"use strict";
+// -*- JavaScript -*-
+// autogenerated from templates/script.ts webassembly-types/webassembly.d.ts templates/otter_wasm.ns.d.ts
+// -*- JavaScript -*-
+
+// Copyright 2020-2021 Ian Jackson and contributors to Otter
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// There is NO WARRANTY. -->
+
+// elemnts for a piece
+//
+// In svg toplevel
+//
+// uelem
+// #use{}
+// <use id="use{}", href="#piece{}" x= y= >
+// .piece piece id (static)
+// container to allow quick movement and hang stuff off
+//
+// delem
+// #defs{}
+// <def id="defs{}">
+//
+// And in each delem
+//
+// pelem
+// #piece{}
+// .dragraise dragged more than this ? raise to top!
+// <g id="piece{}" >
+// currently-displayed version of the piece
+// to allow addition/removal of selected indication
+// contains 1 or 3 subelements:
+// one is straight from server and not modified
+// one is possible <use href="#select{}" >
+// one is possible <use href="#halo{}" >
+//
+// #select{}
+// generated by server, referenced by JS in pelem for selection
+//
+// #def.{}.stuff
+// generated by server, reserved for Piece trait impl
+
+let wasm;
+var pieces = Object.create(null);
+;
+// todo turn all var into let
+// todo any exceptions should have otter in them or something
+var globalinfo_elem;
+var layout;
+var held_surround_colour;
+var general_timeout = 10000;
+var messages = Object();
+var pieceops = Object();
+var update_error_handlers = Object();
+var piece_error_handlers = Object();
+var our_dnd_type = "text/puvnex-game-server-dummy";
+var api_queue = [];
+var api_posting = false;
+var us;
+var gen = 0;
+var cseq = 0;
+var ctoken;
+var uo_map = Object.create(null);
+var keyops_local = Object();
+var last_log_ts;
+var last_zoom_factor = 1.0;
+var firefox_bug_zoom_factor_compensation = 1.0;
+var gen_update_hook = function () { };
+var svg_ns;
+var space;
+var pieces_marker;
+var defs_marker;
+var log_elem;
+var logscroll_elem;
+var status_node;
+var uos_node;
+var zoom_val;
+var zoom_btn;
+var links_elem;
+var wresting;
+const pane_keys = {
+ "H": "help",
+ "U": "players",
+};
+const uo_kind_prec = {
+ 'GlobalExtra': 50,
+ 'Client': 70,
+ 'Global': 100,
+ 'Piece': 200,
+ 'ClientExtra': 500,
+};
+var players;
+var movements = [];
+function xhr_post_then(url, data, good) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState != XMLHttpRequest.DONE) {
+ return;
+ }
+ if (xhr.status != 200) {
+ xhr_report_error(xhr);
+ }
+ else {
+ good(xhr);
+ }
+ };
+ xhr.timeout = general_timeout;
+ xhr.open('POST', url);
+ xhr.setRequestHeader('Content-Type', 'application/json');
+ xhr.send(data);
+}
+function xhr_report_error(xhr) {
+ json_report_error({
+ statusText: xhr.statusText,
+ responseText: xhr.responseText,
+ });
+}
+function json_report_error(error_for_json) {
+ let error_message = JSON.stringify(error_for_json);
+ string_report_error(error_message);
+}
+function string_report_error(error_message) {
+ let errornode = document.getElementById('error');
+ errornode.textContent += '\nError (reloading may help?):' + error_message;
+ console.error("ERROR reported via log", error_message);
+ // todo want to fix this for at least basic game reconfigs, auto-reload?
+}
+function api(meth, data) {
+ api_queue.push([meth, data]);
+ api_check();
+}
+function api_delay(meth, data) {
+ if (api_queue.length == 0)
+ window.setTimeout(api_check, 10);
+ api_queue.push([meth, data]);
+}
+function api_check() {
+ if (api_posting) {
+ return;
+ }
+ if (!api_queue.length) {
+ return;
+ }
+ do {
+ var [meth, data] = api_queue.shift();
+ if (meth != 'm')
+ break;
+ let piece = data.piece;
+ let p = pieces[piece];
+ if (p == null)
+ break;
+ p.queued_moves--;
+ if (p.queued_moves == 0)
+ break;
+ } while (1);
+ api_posting = true;
+ xhr_post_then('/_/api/' + meth, JSON.stringify(data), api_posted);
+}
+function api_posted() {
+ api_posting = false;
+ api_check();
+}
+function api_piece(f, meth, piece, p, op) {
+ clear_halo(piece, p);
+ cseq += 1;
+ p.cseq = cseq;
+ f(meth, {
+ ctoken: ctoken,
+ piece: piece,
+ gen: gen,
+ cseq: cseq,
+ op: op,
+ });
+}
+function svg_element(id) {
+ let elem = document.getElementById(id);
+ return elem;
+}
+function piece_element(base, piece) {
+ return svg_element(base + piece);
+}
+// ----- key handling -----
+function recompute_keybindings() {
+ uo_map = Object.create(null);
+ let all_targets = [];
+ for (let piece of Object.keys(pieces)) {
+ let p = pieces[piece];
+ if (p.held != us)
+ continue;
+ all_targets.push(piece);
+ for (var uo of p.uos) {
+ let currently = uo_map[uo.def_key];
+ if (currently === null)
+ continue;
+ if (currently !== undefined) {
+ if (currently.opname != uo.opname) {
+ uo_map[uo.def_key] = null;
+ continue;
+ }
+ }
+ else {
+ currently = Object.assign({ targets: [] }, uo);
+ uo_map[uo.def_key] = currently;
+ }
+ currently.desc = currently.desc < uo.desc ? currently.desc : uo.desc;
+ currently.targets.push(piece);
+ }
+ }
+ let add_uo = function (targets, uo) {
+ uo_map[uo.def_key] = Object.assign({ targets: targets }, uo);
+ };
+ if (all_targets.length) {
+ add_uo(all_targets, {
+ def_key: 'l',
+ kind: 'Client',
+ wrc: 'Predictable',
+ opname: "left",
+ desc: "rotate left",
+ });
+ add_uo(all_targets, {
+ def_key: 'r',
+ kind: 'Client',
+ wrc: 'Predictable',
+ opname: "right",
+ desc: "rotate right",
+ });
+ add_uo(all_targets, {
+ def_key: 'b',
+ kind: 'Client',
+ wrc: 'Predictable',
+ opname: "lower",
+ desc: "send to bottom (below other pieces)",
+ });
+ }
+ if (all_targets.length) {
+ let got = 0;
+ for (let t of all_targets) {
+ got |= 1 << Number(pieces[t].pinned);
+ }
+ if (got == 1) {
+ add_uo(all_targets, {
+ def_key: 'P',
+ kind: 'ClientExtra',
+ opname: 'pin',
+ desc: 'Pin to table',
+ wrc: 'Predictable',
+ });
+ }
+ else if (got == 2) {
+ add_uo(all_targets, {
+ def_key: 'P',
+ kind: 'ClientExtra',
+ opname: 'unpin',
+ desc: 'Unpin from table',
+ wrc: 'Predictable',
+ });
+ }
+ }
+ add_uo(null, {
+ def_key: 'W',
+ kind: 'ClientExtra',
+ opname: 'wrest',
+ desc: wresting ? 'Exit wresting mode' : 'Enter wresting mode',
+ wrc: 'Predictable',
+ });
+ var uo_keys = Object.keys(uo_map);
+ uo_keys.sort(function (ak, bk) {
+ let a = uo_map[ak];
+ let b = uo_map[bk];
+ return uo_kind_prec[a.kind] - uo_kind_prec[b.kind]
+ || ak.localeCompare(bk);
+ });
+ let mid_elem = null;
+ for (let celem = uos_node.firstElementChild; celem != null; celem = nextelem) {
+ var nextelem = celem.nextElementSibling;
+ let cid = celem.getAttribute("id");
+ if (cid == "uos-mid")
+ mid_elem = celem;
+ else if (celem.getAttribute("class") == 'uos-mid') { }
+ else
+ celem.remove();
+ }
+ for (var kk of uo_keys) {
+ let uo = uo_map[kk];
+ let prec = uo_kind_prec[uo.kind];
+ let ent = document.createElement('div');
+ ent.innerHTML = '<b>' + kk + '</b> ' + uo.desc;
+ if (prec < 400) {
+ ent.setAttribute('class', 'uokey-l');
+ uos_node.insertBefore(ent, mid_elem);
+ }
+ else {
+ ent.setAttribute('class', 'uokey-r');
+ uos_node.appendChild(ent);
+ }
+ }
+}
+function some_keydown(e) {
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/keydown_event
+ // says to do this, something to do with CJK composition.
+ // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
+ // says that keyCode is deprecated
+ // my tsc says this isComposing thing doesn't exist. wat.
+ if (e.isComposing /* || e.keyCode === 229 */)
+ return;
+ if (e.ctrlKey || e.altKey || e.metaKey)
+ return;
+ let pane = pane_keys[e.key];
+ if (pane) {
+ return pane_switch(pane);
+ }
+ let uo = uo_map[e.key];
+ if (uo === undefined || uo === null)
+ return;
+ console.log('KEY UO', e, uo);
+ if (uo.kind == 'Client' || uo.kind == 'ClientExtra') {
+ let f = keyops_local[uo.opname];
+ f(uo);
+ return;
+ }
+ if (!(uo.kind == 'Global' || uo.kind == 'GlobalExtra' || uo.kind == 'Piece'))
+ throw 'bad kind ' + uo.kind;
+ for (var piece of uo.targets) {
+ let p = pieces[piece];
+ api_piece(api, 'k', piece, p, { opname: uo.opname, wrc: uo.wrc });
+ if (uo.wrc == 'UpdateSvg') {
+ p.cseq_updatesvg = p.cseq;
+ redisplay_ancillaries(piece, p);
+ }
+ }
+}
+function pane_switch(newpane) {
+ let new_e;
+ for (;;) {
+ new_e = document.getElementById('pane_' + newpane);
+ let style = new_e.getAttribute('style');
+ if (style || newpane == 'help')
+ break;
+ newpane = 'help';
+ }
+ for (let old_e = new_e.parentElement.firstElementChild; old_e; old_e = old_e.nextElementSibling) {
+ old_e.setAttribute('style', 'display: none;');
+ }
+ new_e.removeAttribute('style');
+}
+keyops_local['left'] = function (uo) { rotate_targets(uo, +1); };
+keyops_local['right'] = function (uo) { rotate_targets(uo, -1); };
+function rotate_targets(uo, dangle) {
+ for (let piece of uo.targets) {
+ let p = pieces[piece];
+ p.angle += dangle + 8;
+ p.angle %= 8;
+ let transform = wasm_bindgen.angle_transform(p.angle);
+ p.pelem.setAttributeNS(null, 'transform', transform);
+ api_piece(api, 'rotate', piece, p, p.angle);
+ }
+ recompute_keybindings();
+ return true;
+}
+keyops_local['lower'] = function (uo) { lower_targets(uo); };
+function lower_targets(uo) {
+ function target_treat_pinned(p) {
+ return wresting || p.pinned;
+ ;
+ }
+ let targets_todo = Object.create(null);
+ for (let piece of uo.targets) {
+ let p = pieces[piece];
+ let pinned = target_treat_pinned(p);
+ targets_todo[piece] = { p, piece, pinned, };
+ }
+ let problem = lower_pieces(targets_todo);
+ if (problem !== null) {
+ add_log_message('Cannot lower: ' + problem);
+ return false;
+ }
+ return true;
+}
+function lower_pieces(targets_todo) {
+ // This is a bit subtle. We don't want to lower below pinned pieces
+ // (unless we are pinned too, or the user is wresting). But maybe
+ // the pinned pieces aren't already at the bottom. For now we will
+ // declare that all pinned pieces "should" be below all non-pinned
+ // ones. Not as an invariant, but as a thing we will do here to try
+ // to make a sensible result. We implement this as follows: if we
+ // find pinned pieces above non-pinned pieces, we move those pinned
+ // pieces to the bottom too, just below us, preserving their
+ // relative order.
+ //
+ // Disregarding pinned targets:
+ //
+ // Z <some stuff not including any unpinned targets>
+ // Z
+ // topmost unpinned target *
+ // B (
+ // B unpinned non-target
+ // B | unpinned target *
+ // B | pinned non-target, mis-stacked *
+ // B )*
+ // B
+ // bottommost unpinned non-target
+ // if that is below topmost unpinned target
+ // <- tomove_unpinned: insert targets from * here Q ->
+ // <- tomove_misstacked: insert non-targets from * here Q->
+ // A
+ // A pinned things (nomove_pinned)
+ // <- tomove_pinned: insert all pinned targets here P ->
+ //
+ // When wresting, treat all targets as pinned.
+ // bottom of the stack order first
+ let tomove_unpinned = [];
+ let tomove_misstacked = [];
+ let nomove_pinned = [];
+ let tomove_pinned = [];
+ let bottommost_unpinned = null;
+ let n_targets_todo_unpinned = 0;
+ for (const piece of Object.keys(targets_todo)) {
+ let p = targets_todo[piece];
+ if (!p.pinned)
+ n_targets_todo_unpinned++;
+ }
+ let walk = pieces_marker;
+ for (;;) { // starting at the bottom of the stack order
+ if (n_targets_todo_unpinned == 0
+ && bottommost_unpinned !== null) {
+ // no unpinned targets left, state Z, we can stop now
+ console.log('LOWER STATE Z FINISHED');
+ break;
+ }
+ if (Object.keys(targets_todo).length == 0 &&
+ bottommost_unpinned !== null) {
+ console.log('LOWER NO TARGETS BUT UNPINNED!', n_targets_todo_unpinned);
+ break;
+ }
+ let new_walk = walk.nextElementSibling;
+ if (new_walk == null) {
+ console.log('LOWER WALK NO SIBLING!');
+ break;
+ }
+ walk = new_walk;
+ let piece = walk.dataset.piece;
+ if (piece == null) {
+ console.log('LOWER WALK REACHED TOP');
+ break;
+ }
+ let todo = targets_todo[piece];
+ if (todo) {
+ console.log('LOWER WALK', piece, 'TODO', todo.pinned);
+ delete targets_todo[piece];
+ if (!todo.pinned)
+ n_targets_todo_unpinned--;
+ (todo.pinned ? tomove_pinned : tomove_unpinned).push(todo);
+ continue;
+ }
+ let p = pieces[piece];
+ if (bottommost_unpinned === null) { // state A
+ if (!p.pinned) {
+ console.log('LOWER WALK', piece, 'STATE A -> Z');
+ bottommost_unpinned = { p, piece };
+ }
+ else {
+ console.log('LOWER WALK', piece, 'STATE A');
+ nomove_pinned.push({ p, piece });
+ }
+ continue;
+ }
+ // state B
+ if (p.pinned) {
+ console.log('LOWER WALK', piece, 'STATE B MIS-STACKED');
+ tomove_misstacked.push({ p, piece });
+ }
+ else {
+ console.log('LOWER WALK', piece, 'STATE B');
+ }
+ }
+ let z_top = bottommost_unpinned ? bottommost_unpinned.p.z :
+ walk.dataset.piece != null ? pieces[walk.dataset.piece].z :
+ // rather a lack of things we are not adjusting!
+ wasm_bindgen.def_zcoord();
+ let plan = [];
+ let partQ = tomove_unpinned.concat(tomove_misstacked);
+ let partP = tomove_pinned;
+ if (nomove_pinned.length == 0) {
+ plan.push({
+ content: partQ.concat(partP),
+ z_top,
+ z_bot: null,
+ });
+ }
+ else {
+ plan.push({
+ content: partQ,
+ z_top,
+ z_bot: nomove_pinned[nomove_pinned.length - 1].p.z,
+ }, {
+ content: partP,
+ z_top: nomove_pinned[0].p.z,
+ z_bot: null,
+ });
+ }
+ console.log('LOWER PLAN', plan);
+ for (const pe of plan) {
+ for (const e of pe.content) {
+ if (e.p.held != null && e.p.held != us) {
+ return "lowering would disturb a piece held by another player";
+ }
+ }
+ }
+ z_top = null;
+ for (const pe of plan) {
+ if (pe.z_top != null)
+ z_top = pe.z_top;
+ let z_bot = pe.z_bot;
+ let zrange = wasm_bindgen.range(z_bot, z_top, pe.content.length);
+ console.log('LOQER PLAN PE', pe, z_bot, z_top, pe.content.length, zrange.debug());
+ for (const e of pe.content) {
+ let p = e.p;
+ piece_set_zlevel(e.piece, p, (oldtop_piece) => {
+ let z = zrange.next();
+ p.z = z;
+ api_piece(api, "setz", e.piece, e.p, { z });
+ });
+ }
+ }
+ return null;
+}
+keyops_local['wrest'] = function (uo) {
+ wresting = !wresting;
+ document.getElementById('wresting-warning').innerHTML = !wresting ? "" :
+ " <strong>(wresting mode!)</strong>";
+ ungrab_all();
+ recompute_keybindings();
+};
+keyops_local['pin'] = function (uo) {
+ if (!lower_targets(uo))
+ return;
+ pin_unpin(uo, true);
+};
+keyops_local['unpin'] = function (uo) {
+ pin_unpin(uo, false);
+};
+function pin_unpin(uo, newpin) {
+ for (let piece of uo.targets) {
+ let p = pieces[piece];
+ p.pinned = newpin;
+ api_piece(api, 'pin', piece, p, newpin);
+ redisplay_ancillaries(piece, p);
+ }
+ recompute_keybindings();
+}
+var DRAGGING;
+(function (DRAGGING) {
+ DRAGGING[DRAGGING["NO"] = 0] = "NO";
+ DRAGGING[DRAGGING["MAYBE_GRAB"] = 1] = "MAYBE_GRAB";
+ DRAGGING[DRAGGING["MAYBE_UNGRAB"] = 2] = "MAYBE_UNGRAB";
+ DRAGGING[DRAGGING["YES"] = 4] = "YES";
+ DRAGGING[DRAGGING["RAISED"] = 8] = "RAISED";
+})(DRAGGING || (DRAGGING = {}));
+;
+var drag_pieces = [];
+var dragging = DRAGGING.NO;
+var dcx;
+var dcy;
+const DRAGTHRESH = 5;
+function drag_add_piece(piece, p) {
+ drag_pieces.push({
+ piece: piece,
+ dox: parseFloat(p.uelem.getAttributeNS(null, "x")),
+ doy: parseFloat(p.uelem.getAttributeNS(null, "y")),
+ });
+}
+function some_mousedown(e) {
+ console.log('mousedown', e, e.clientX, e.clientY, e.target);
+ if (e.button != 0) {
+ return;
+ }
+ if (e.altKey) {
+ return;
+ }
+ if (e.metaKey) {
+ return;
+ }
+ if (e.ctrlKey) {
+ return;
+ }
+ else {
+ drag_mousedown(e, e.shiftKey);
+ }
+}
+function drag_mousedown(e, shifted) {
+ var target = e.target; // we check this just now!
+ var piece = target.dataset.piece;
+ if (!piece) {
+ if (!shifted) {
+ ungrab_all();
+ }
+ return;
+ }
+ let p = pieces[piece];
+ let held = p.held;
+ drag_cancel();
+ drag_pieces = [];
+ if (held == us) {
+ dragging = DRAGGING.MAYBE_UNGRAB;
+ drag_add_piece(piece, p); // contrive to have this one first
+ for (let tpiece of Object.keys(pieces)) {
+ if (tpiece == piece)
+ continue;
+ let tp = pieces[tpiece];
+ if (tp.held != us)
+ continue;
+ drag_add_piece(tpiece, tp);
+ }
+ }
+ else if (held == null || wresting) {
+ // xxx prevent clicking on anything that is occulting, unless wresting
+ if (!shifted) {
+ ungrab_all();
+ }
+ if (p.pinned && !wresting) {
+ add_log_message('That piece is pinned to the table.');
+ return;
+ }
+ dragging = DRAGGING.MAYBE_GRAB;
+ drag_add_piece(piece, p);
+ set_grab(piece, p, us);
+ api_piece(api, wresting ? 'wrest' : 'grab', piece, p, {});
+ }
+ else {
+ add_log_message('That piece is held by another player.');
+ return;
+ }
+ dcx = e.clientX;
+ dcy = e.clientY;
+ window.addEventListener('mousemove', drag_mousemove, true);
+ window.addEventListener('mouseup', drag_mouseup, true);
+}
+function ungrab_all() {
+ for (let tpiece of Object.keys(pieces)) {
+ let tp = pieces[tpiece];
+ if (tp.held == us) {
+ set_ungrab(tpiece, tp);
+ api_piece(api, 'ungrab', tpiece, tp, {});
+ }
+ }
+}
+function set_grab(piece, p, owner) {
+ p.held = owner;
+ redisplay_ancillaries(piece, p);
+ recompute_keybindings();
+}
+function set_ungrab(piece, p) {
+ p.held = null;
+ redisplay_ancillaries(piece, p);
+ recompute_keybindings();
+}
+function clear_halo(piece, p) {
+ p.last_seen_moved = null;
+ redisplay_ancillaries(piece, p);
+}
+function ancillary_node(piece, stroke) {
+ var nelem = document.createElementNS(svg_ns, 'use');
+ nelem.setAttributeNS(null, 'href', '#surround' + piece);
+ nelem.setAttributeNS(null, 'stroke', stroke);
+ nelem.setAttributeNS(null, 'fill', 'none');
+ return nelem;
+}
+function redisplay_ancillaries(piece, p) {
+ let href = '#surround' + piece;
+ console.log('REDISPLAY ANCILLARIES', href);
+ for (let celem = p.pelem.firstElementChild; celem != null; celem = nextelem) {
+ var nextelem = celem.nextElementSibling;
+ let thref = celem.getAttributeNS(null, "href");
+ if (thref == href) {
+ celem.remove();
+ }
+ }
+ let halo_colour = null;
+ if (p.cseq_updatesvg != null) {
+ halo_colour = 'purple';
+ }
+ else if (p.last_seen_moved != null) {
+ halo_colour = 'yellow';
+ }
+ else if (p.held != null && p.pinned) {
+ halo_colour = '#8cf';
+ }
+ if (halo_colour != null) {
+ let nelem = ancillary_node(piece, halo_colour);
+ if (p.held != null) {
+ nelem.setAttributeNS(null, 'stroke-width', '2px');
+ }
+ p.pelem.prepend(nelem);
+ }
+ if (p.held != null) {
+ let da = players[p.held].dasharray;
+ let nelem = ancillary_node(piece, held_surround_colour);
+ nelem.setAttributeNS(null, 'stroke-dasharray', da);
+ p.pelem.appendChild(nelem);
+ }
+}
+function drag_mousemove(e) {
+ var ctm = space.getScreenCTM();
+ var ddx = (e.clientX - dcx) / (ctm.a * firefox_bug_zoom_factor_compensation);
+ var ddy = (e.clientY - dcy) / (ctm.d * firefox_bug_zoom_factor_compensation);
+ var ddr2 = ddx * ddx + ddy * ddy;
+ if (!(dragging & DRAGGING.YES)) {
+ if (ddr2 > DRAGTHRESH) {
+ dragging |= DRAGGING.YES;
+ }
+ }
+ //console.log('mousemove', ddx, ddy, dragging);
+ if (dragging & DRAGGING.YES) {
+ console.log('DRAG PIECES', drag_pieces);
+ for (let dp of drag_pieces) {
+ console.log('DRAG PIECES PIECE', dp);
+ let tpiece = dp.piece;
+ let tp = pieces[tpiece];
+ var x = Math.round(dp.dox + ddx);
+ var y = Math.round(dp.doy + ddy);
+ tp.uelem.setAttributeNS(null, "x", x + "");
+ tp.uelem.setAttributeNS(null, "y", y + "");
+ tp.queued_moves++;
+ api_piece(api_delay, 'm', tpiece, tp, [x, y]);
+ }
+ if (!(dragging & DRAGGING.RAISED) && drag_pieces.length == 1) {
+ let dp = drag_pieces[0];
+ let piece = dp.piece;
+ let p = pieces[piece];
+ let dragraise = +p.pelem.dataset.dragraise;
+ if (dragraise > 0 && ddr2 >= dragraise * dragraise) {
+ dragging |= DRAGGING.RAISED;
+ console.log('CHECK RAISE ', dragraise, dragraise * dragraise, ddr2);
+ piece_set_zlevel(piece, p, (oldtop_piece) => {
+ let oldtop_p = pieces[oldtop_piece];
+ let z = wasm_bindgen.increment(oldtop_p.z);
+ p.z = z;
+ api_piece(api, "setz", piece, p, { z: z });
+ });
+ }
+ }
+ }
+ return ddr2;
+}
+function drag_mouseup(e) {
+ console.log('mouseup', dragging);
+ let ddr2 = drag_mousemove(e);
+ drag_end();
+}
+function drag_end() {
+ if (dragging == DRAGGING.MAYBE_UNGRAB ||
+ (dragging & ~DRAGGING.RAISED) == (DRAGGING.MAYBE_GRAB | DRAGGING.YES)) {
+ let dp = drag_pieces[0];
+ let piece = dp.piece;
+ let p = pieces[piece];
+ set_ungrab(piece, p);
+ api_piece(api, 'ungrab', piece, p, {});
+ }
+ drag_cancel();
+}
+function drag_cancel() {
+ window.removeEventListener('mousemove', drag_mousemove, true);
+ window.removeEventListener('mouseup', drag_mouseup, true);
+ dragging = DRAGGING.NO;
+ drag_pieces = [];
+}
+messages.AddPlayer = function (j) {
+ players[j.player] = j.data;
+ player_info_pane_set(j);
+};
+messages.RemovePlayer = function (j) {
+ delete players[j.player];
+ player_info_pane_set(j);
+};
+function player_info_pane_set(j) {
+ document.getElementById('player_list')
+ .innerHTML = j.new_info_pane;
+}
+messages.SetLinks = function (msg) {
+ if (msg.length != 0 && layout == 'Portrait') {
+ msg += " |";
+ }
+ links_elem.innerHTML = msg;
+};
+// ----- logs -----
+messages.Log = function (j) {
+ add_timestamped_log_message(j.when, j.logent.html);
+};
+function add_log_message(msg_html) {
+ add_timestamped_log_message('', msg_html);
+}
+function add_timestamped_log_message(ts_html, msg_html) {
+ var lastent = log_elem.lastElementChild;
+ var in_scrollback = lastent == null ||
+ // inspired by
+ // https://stackoverflow.com/questions/487073/how-to-check-if-element-is-visible-after-scrolling/21627295#21627295
+ // rejected
+ // https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
+ (() => {
+ let le_top = lastent.getBoundingClientRect().top;
+ let le_bot = lastent.getBoundingClientRect().bottom;
+ let ld_bot = logscroll_elem.getBoundingClientRect().bottom;
+ console.log("ADD_LOG_MESSAGE bboxes: le t b, bb", le_top, le_bot, ld_bot);
+ return 0.5 * (le_bot + le_top) > ld_bot;
+ })();
+ console.log('ADD LOG MESSAGE ', in_scrollback, layout, msg_html);
+ var ne;
+ function add_thing(elemname, cl, html) {
+ var ie = document.createElement(elemname);
+ ie.innerHTML = html;
+ ie.setAttribute("class", cl);
+ ne.appendChild(ie);
+ }
+ if (layout == 'Portrait') {
+ ne = document.createElement('tr');
+ add_thing('td', 'logmsg', msg_html);
+ add_thing('td', 'logts', ts_html);
+ }
+ else if (layout == 'Landscape') {
+ ts_html = last_log_ts.update(ts_html);
+ ne = document.createElement('div');
+ add_thing('span', 'logts', ts_html);
+ ne.appendChild(document.createElement('br'));
+ add_thing('span', 'logmsg', msg_html);
+ ne.appendChild(document.createElement('br'));
+ }
+ else {
+ throw 'bad layout ' + layout;
+ }
+ log_elem.appendChild(ne);
+ if (!in_scrollback) {
+ logscroll_elem.scrollTop = logscroll_elem.scrollHeight;
+ }
+}
+// ----- zoom -----
+function zoom_pct() {
+ let str = zoom_val.value;
+ let val = parseFloat(str);
+ if (isNaN(val)) {
+ return undefined;
+ }
+ else {
+ return val;
+ }
+}
+function zoom_enable() {
+ zoom_btn.disabled = (zoom_pct() === undefined);
+}
+function zoom_activate() {
+ let pct = zoom_pct();
+ if (pct !== undefined) {
+ let fact = pct * 0.01;
+ let last_ctm_a = space.getScreenCTM().a;
+ document.getElementsByTagName('body')[0]
+ .style.transform = 'scale(' + fact + ',' + fact + ')';
+ if (fact != last_zoom_factor) {
+ if (last_ctm_a == space.getScreenCTM().a) {
+ console.log('FIREFOX GETSCREENCTM BUG');
+ firefox_bug_zoom_factor_compensation = fact;
+ }
+ else {
+ console.log('No firefox getscreenctm bug');
+ firefox_bug_zoom_factor_compensation = 1.0;
+ }
+ last_zoom_factor = fact;
+ }
+ }
+ zoom_btn.disabled = true;
+}
+function handle_piece_update(j) {
+ console.log('PIECE UPDATE ', j);
+ var piece = j.piece;
+ var m = j.op;
+ var k = Object.keys(m)[0];
+ let p = pieces[piece];
+ pieceops[k](piece, p, m[k]);
+}
+;
+messages.Piece = handle_piece_update;
+pieceops.ModifyQuiet = function (piece, p, info) {
+ console.log('PIECE UPDATE MODIFY QUIET ', piece, info);
+ piece_modify(piece, p, info, false);
+};
+pieceops.Modify = function (piece, p, info) {
+ console.log('PIECE UPDATE MODIFY LOuD ', piece, info);
+ piece_note_moved(piece, p);
+ piece_modify(piece, p, info, false);
+};
+piece_error_handlers.PosOffTable = function () { return true; };
+piece_error_handlers.Conflict = function () { return true; };
+function piece_modify(piece, p, info, conflict_expected) {
+ p.delem.innerHTML = info.svg;
+ p.pelem = piece_element('piece', piece);
+ p.uelem.setAttributeNS(null, "x", info.pos[0] + "");
+ p.uelem.setAttributeNS(null, "y", info.pos[1] + "");
+ p.held = info.held;
+ p.pinned = info.pinned;
+ p.angle = info.angle;
+ p.uos = info.uos;
+ piece_set_zlevel(piece, p, (oldtop_piece) => {
+ p.z = info.z;
+ p.zg = info.zg;
+ });
+ piece_checkconflict_nrda(piece, p, conflict_expected);
+ redisplay_ancillaries(piece, p);
+ recompute_keybindings();
+ console.log('MODIFY DONE');
+}
+/*
+pieceops.Insert = <PieceHandler>function
+(piece: PieceId, p: null,
+ info: { svg: string, held: PlayerId, pos: Pos, z: number, zg: Generation}) {
+ console.log('PIECE UPDATE INSERT ',piece,info)
+ delem = document.createElementNS(svg_ns,'defs');
+ delem.setAttributeNS(null,'id','defs'+piece);
+ delem.innerHTML = info.svg;
+ space.appendChild(delem);
+ pelem =
+
+ nelem.setAttributeNS(null,'stroke',stroke);
+ nelem.setAttributeNS(null,'fill','none');
+*/
+function piece_set_zlevel(piece, p, modify) {
+ // Calls modify, which should set .z and/or .gz, and/or
+ // make any necessary API call.
+ //
+ // Then moves uelem to the right place in the DOM. This is done
+ // by assuming that uelem ought to go at the end, so this is
+ // O(new depth), which is right (since the UI for inserting
+ // an object is itself O(new depth) UI operations to prepare.
+ let oldtop_elem = defs_marker.previousElementSibling;
+ let oldtop_piece = oldtop_elem.dataset.piece;
+ modify(oldtop_piece);
+ let ins_before = defs_marker;
+ let earlier_elem;
+ for (;; ins_before = earlier_elem) {
+ earlier_elem = ins_before.previousElementSibling;
+ if (earlier_elem == pieces_marker)
+ break;
+ if (earlier_elem == p.uelem)
+ continue;
+ let earlier_p = pieces[earlier_elem.dataset.piece];
+ if (!piece_z_before(p, earlier_p))
+ break;
+ }
+ if (ins_before != p.uelem)
+ space.insertBefore(p.uelem, ins_before);
+}
+function piece_note_moved(piece, p) {
+ let now = performance.now();
+ let need_redisplay = p.last_seen_moved == null;
+ p.last_seen_moved = now;
+ if (need_redisplay)
+ redisplay_ancillaries(piece, p);
+ let cutoff = now - 1000.;
+ while (movements.length > 0 && movements[0].this_motion < cutoff) {
+ let mr = movements.shift();
+ if (mr.p.last_seen_moved != null &&
+ mr.p.last_seen_moved < cutoff) {
+ mr.p.last_seen_moved = null;
+ redisplay_ancillaries(mr.piece, mr.p);
+ }
+ }
+ movements.push({ piece: piece, p: p, this_motion: now });
+}
+function piece_z_before(a, b) {
+ if (a.z < b.z)
+ return true;
+ if (a.z > b.z)
+ return false;
+ if (a.zg < b.zg)
+ return true;
+ if (a.zg > b.zg)
+ return false;
+ return false;
+}
+pieceops.Move = function (piece, p, info) {
+ piece_checkconflict_nrda(piece, p, false);
+ piece_note_moved(piece, p);
+ p.uelem.setAttributeNS(null, "x", info[0] + "");
+ p.uelem.setAttributeNS(null, "y", info[1] + "");
+};
+pieceops.SetZLevel = function (piece, p, info) {
+ piece_note_moved(piece, p);
+ piece_set_zlevel(piece, p, (oldtop_piece) => {
+ let oldtop_p = pieces[oldtop_piece];
+ p.z = info.z;
+ p.zg = info.zg;
+ });
+};
+messages.Recorded = function (j) {
+ let piece = j.piece;
+ let p = pieces[piece];
+ piece_recorded_cseq(p, j);
+ if (p.cseq_updatesvg != null && j.cseq >= p.cseq_updatesvg) {
+ p.cseq_updatesvg = null;
+ redisplay_ancillaries(piece, p);
+ }
+ if (j.svg != null) {
+ p.delem.innerHTML = j.svg;
+ p.pelem = piece_element('piece', piece);
+ redisplay_ancillaries(piece, p);
+ }
+ if (j.zg != null) {
+ var zg_new = j.zg; // type narrowing doesn't propagate :-/
+ piece_set_zlevel(piece, p, (oldtop_piece) => {
+ p.zg = zg_new;
+ });
+ }
+};
+function piece_recorded_cseq(p, j) {
+ if (p.cseq != null && j.cseq >= p.cseq) {
+ p.cseq = null;
+ }
+}
+messages.RecordedUnpredictable = function (j) {
+ let piece = j.piece;
+ let p = pieces[piece];
+ piece_recorded_cseq(p, j);
+ piece_modify(piece, p, j.ns, false);
+};
+messages.Error = function (m) {
+ console.log('ERROR UPDATE ', m);
+ var k = Object.keys(m)[0];
+ update_error_handlers[k](m[k]);
+};
+update_error_handlers.PieceOpError = function (m) {
+ let piece = m.state.piece;
+ let p = pieces[piece];
+ console.log('ERROR UPDATE PIECE ', m, p);
+ if (p == null)
+ return;
+ let conflict_expected = piece_error_handlers[m.error](piece, p, m);
+ handle_piece_update(m.state);
+};
+function piece_checkconflict_nrda(piece, p, conflict_expected) {
+ if (p.cseq != null) {
+ p.cseq = null;
+ if (drag_pieces.some(function (dp) { return dp.piece == piece; })) {
+ console.log('drag end due to conflict');
+ drag_end();
+ }
+ if (!conflict_expected) {
+ add_log_message('Conflict! - simultaneous update');
+ }
+ }
+ return false;
+}
+function test_swap_stack() {
+ let old_bot = pieces_marker.nextElementSibling;
+ let container = old_bot.parentElement;
+ container.insertBefore(old_bot, defs_marker);
+ window.setTimeout(test_swap_stack, 1000);
+}
+function startup() {
+ console.log('STARTUP');
+ console.log(wasm_bindgen.setup("OK"));
+ var body = document.getElementById("main-body");
+ zoom_btn = document.getElementById("zoom-btn");
+ zoom_val = document.getElementById("zoom-val");
+ links_elem = document.getElementById("links");
+ ctoken = body.dataset.ctoken;
+ us = body.dataset.us;
+ gen = +body.dataset.gen;
+ let sse_url_prefix = body.dataset.sseUrlPrefix;
+ status_node = document.getElementById('status');
+ status_node.innerHTML = 'js-done';
+ log_elem = document.getElementById("log");
+ logscroll_elem = document.getElementById("logscroll") || log_elem;
+ let dataload = JSON.parse(body.dataset.load);
+ held_surround_colour = dataload.held_surround_colour;
+ players = dataload.players;
+ delete body.dataset.load;
+ uos_node = document.getElementById("uos");
+ space = svg_element('space');
+ pieces_marker = svg_element("pieces_marker");
+ defs_marker = svg_element("defs_marker");
+ svg_ns = space.getAttribute('xmlns');
+ for (let uelem = pieces_marker.nextElementSibling; uelem != defs_marker; uelem = uelem.nextElementSibling) {
+ let piece = uelem.dataset.piece;
+ let p = JSON.parse(uelem.dataset.info);
+ p.uelem = uelem;
+ p.delem = piece_element('defs', piece);
+ p.pelem = piece_element('piece', piece);
+ p.queued_moves = 0;
+ delete uelem.dataset.info;
+ pieces[piece] = p;
+ redisplay_ancillaries(piece, p);
+ }
+ last_log_ts = wasm_bindgen.timestamp_abbreviator(dataload.last_log_ts);
+ var es = new EventSource(sse_url_prefix + "/_/updates?ctoken=" + ctoken + '&gen=' + gen);
+ es.onmessage = function (event) {
+ console.log('GOTEVE', event.data);
+ var k;
+ var m;
+ try {
+ var [tgen, ms] = JSON.parse(event.data);
+ for (m of ms) {
+ k = Object.keys(m)[0];
+ messages[k](m[k]);
+ }
+ gen = tgen;
+ gen_update_hook();
+ }
+ catch (exc) {
+ var s = exc.toString();
+ string_report_error('exception handling update '
+ + k + ': ' + JSON.stringify(m) + ': ' + s);
+ }
+ };
+ es.addEventListener('commsworking', function (event) {
+ console.log('GOTDATA', event.data);
+ status_node.innerHTML = event.data;
+ });
+ es.addEventListener('player-gone', function (event) {
+ console.log('PLAYER-GONE', event);
+ status_node.innerHTML = event.data;
+ add_log_message('<strong>You are no longer in the game</strong>');
+ space.removeEventListener('mousedown', some_mousedown);
+ document.removeEventListener('keydown', some_keydown);
+ es.close();
+ });
+ es.addEventListener('updates-expired', function (event) {
+ console.log('UPDATES-EXPIRED', event);
+ string_report_error('connection to server interrupted too long');
+ });
+ es.onerror = function (e) {
+ console.log('FOO', e, es);
+ json_report_error({
+ updates_error: e,
+ updates_event_source: es,
+ updates_event_source_ready: es.readyState,
+ update_oe: e.className,
+ });
+ };
+ recompute_keybindings();
+ space.addEventListener('mousedown', some_mousedown);
+ document.addEventListener('keydown', some_keydown);
+}
+var wasm_promise;
+;
+function doload() {
+ console.log('DOLOAD');
+ globalinfo_elem = document.getElementById('global-info');
+ layout = globalinfo_elem.dataset.layout;
+ var elem = document.getElementById('loading_token');
+ var ptoken = elem.dataset.ptoken;
+ xhr_post_then('/_/session/' + layout, JSON.stringify({ ptoken: ptoken }), loaded);
+ wasm_promise = wasm_input
+ .then(wasm_bindgen);
+}
+function loaded(xhr) {
+ console.log('LOADED');
+ var body = document.getElementById('loading_body');
+ wasm_promise.then((got_wasm) => {
+ wasm = got_wasm;
+ body.outerHTML = xhr.response;
+ startup();
+ });
+}
+// todo scroll of log messages to bottom did not always work somehow
+// think I have fixed this with approximation
+doload();