~bfiedler/website

d432a04d7fa128011a5d5f5955628b735d0eefa7 — Ben Fiedler 2 years ago 0e5743b
Post about my first chess game
M LICENSE => LICENSE +39 -4
@@ 1,6 1,15 @@
All code pertaining to this blog uses the MIT License.
Copyright (c) 2020 Ben Fiedler

    Copyright (c) 2020 Ben Fiedler
For files /static/img/chess/*.svg
  Copyright (c) Colin M. L. Burnett, reproduced under the BSD License

All content included in this blog is licensed under the Creative Commons BY-SA
4.0 License, unless stated otherwise.

All code pertaining to this blog is licensed under the MIT License, unless
stated otherwise.

MIT License

    Permission is hereby granted, free of charge, to any person obtaining a
    copy of this software and associated documentation files (the "Software"),


@@ 20,8 29,7 @@ All code pertaining to this blog uses the MIT License.
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    DEALINGS IN THE SOFTWARE.

All content included in this blog is licensed under the Creative Commons BY-SA
4.0 license below.
Creative Commons BY-SA 4.0 License
    
    By exercising the Licensed Rights (defined below), You accept and agree
    to be bound by the terms and conditions of this Creative Commons


@@ 369,3 377,30 @@ All content included in this blog is licensed under the Creative Commons BY-SA
         as a limitation upon, or waiver of, any privileges and immunities
         that apply to the Licensor or You, including from the legal
         processes of any jurisdiction or authority.

BSD License

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

M assets/style.scss => assets/style.scss +150 -47
@@ 9,6 9,9 @@

    --code-fg-color: #272822;
    --code-bg-color: #fafafa;

    --chess-square-dark: #AE8A68;
    --chess-square-light: #ECDAB9;
}

html {


@@ 48,12 51,6 @@ ul.nav {
    }
}

time.post-time {
    display: none;
    color: var(--aside-fg-color);
    font-family: 'Fira Code', monospace;
}

.content {
    max-width: 920px;



@@ 66,6 63,82 @@ time.post-time {
    // see: https://css-tricks.com/preventing-a-grid-blowout/
    grid-template-columns: minmax(240px, 1fr);
    grid-template-rows: auto auto 1fr auto;

    .list-time {
        display: none;
        color: var(--aside-fg-color);
        font-family: 'Fira Code', monospace;
    }

    .chess-time {
        display: none;
        color: var(--aside-fg-color);
        font-family: 'Fira Code', monospace;
    }

    time.time {
        color: var(--aside-fg-color);
        font-family: 'Fira Code', monospace;
    }

    > header {
        grid-column: 1;

        img {
            display: none;
        }

        > h1 {
            font-size: 1.8rem;
            font-weight: normal;
            margin: 10px 0;
            padding: 0;

            display: flex;
            justify-content: center;
            text-align: center;

            a {
                text-decoration: none;
            }
        }

        > nav {
            display: flex;
            justify-content: center;

            dl {
                display: none;
            }
        }
    }

    .result {
        margin: 0 0.3em;
        font-family: 'Fira Code', monospace;

        word-break: keep-all;
        white-space: nowrap;
    }

    .color-white {
        background-color: #ffffff;
    }

    .color {
        margin: 0;
        margin-left: 0.4em;
        margin-right: 0.2em;
        display: inline-block;
        min-width: 7px;
        min-height: 7px;
        border-radius: 7px;
        border: 1px solid var(--main-fg-color);
    }

    .color-black {
        background-color: #000000;
    }
}

#intro {


@@ 86,38 159,6 @@ time.post-time {
    }
}

.content > header {
    grid-column: 1;

    img {
        display: none;
    }

    > h1 {
        font-size: 1.8rem;
        font-weight: normal;
        margin: 10px 0;
        padding: 0;

        display: flex;
        justify-content: center;
        text-align: center;

        a {
            text-decoration: none;
        }
    }

    > nav {
        display: flex;
        justify-content: center;

        dl {
            display: none;
        }
    }
}

.content main {
    grid-column: 1;



@@ 129,7 170,7 @@ time.post-time {
    }
}

.post-metadata-small {
.article-metadata-small {
    color: var(--aside-fg-color);
    font-size: 0.9em;
}


@@ 139,7 180,7 @@ time.post-time {
        margin: 0;
        padding: 0;

        h1.post-title {
        h1.article-title {
            font-size: 1.2rem;
            margin-top: 0.5rem;
        }


@@ 227,14 268,14 @@ time.post-time {

.blogpost {
    header {
        .post-title {
        .article-title {
            margin: 0;
            margin-bottom: 2px;
        }
    }
}

.post-metadata {
.article-metadata {
    color: var(--aside-fg-color);
    align-items: center;
    align-items: center;


@@ 250,7 291,7 @@ time.post-time {
    }
}

.post-tags {
.tags {
    margin: 0;
    padding: 0;
    display: inline;


@@ 276,7 317,7 @@ time.post-time {
    margin: 0.5rem 0;
}

.post-list {
.article-list {
    margin: 0;
    padding: 0;



@@ 302,7 343,7 @@ time.post-time {
    }
}

.tag-list {
.taxonomy-list {
    margin: 0;
    padding: 0;



@@ 387,7 428,20 @@ section.webring {
}

@media (min-width: 360px) {
    time.post-time {
    .content .list-time {
        // Works on FF and Webkit
        word-break: keep-all;

        // For Chrome-based stuff
        white-space: nowrap;

        display: initial;
    }

}

@media (min-width: 400px) {
    .content .chess-time {
        // Works on FF and Webkit
        word-break: keep-all;



@@ 399,6 453,11 @@ section.webring {
}

@media (min-width: 640px) {
    .square {
        height: 45px !important;
        width: 45px !important;
    }

    .blogpost figure.resizable img {
        width: 616px; // 640 - 1em (= 16px) - 2 * 4px
    }


@@ 471,7 530,6 @@ section.webring {
                text-decoration: none;
            }
        }

    }

    .list-title {


@@ 528,3 586,48 @@ section.webring {
        filter: invert(92.6%);
    }
}

.flipped {
    flex-direction: column-reverse !important;

    .row {
        flex-direction: row-reverse !important;
    }
}

.fen {
    .board {
        height: calc(8 * 45 px);
        border: 2px solid var(--main-fg-color);
        display: flex;

        flex-direction: column;

        user-select: none;
        -webkit-user-select: none;
    }

    .row {
        display: flex;
        flex-direction: row;
    }

    .square {
        height: 29px;
        width: 29px;

        img {
            width: 100%;
        }
    }

    .row:nth-child(2n) .square:nth-child(2n),
    .row:nth-child(2n+1) .square:nth-child(2n+1) {
        background-color: var(--chess-square-light);
    }

    .row:nth-child(2n+1) .square:nth-child(2n),
    .row:nth-child(2n) .square:nth-child(2n+1) {
        background-color: var(--chess-square-dark);
    }
}

D config.toml => config.toml +0 -52
@@ 1,52 0,0 @@
baseURL = "https://3fx.ch"
languageCode = "en-us"
title = "3fx.ch"

pygmentsUseClasses = true

[taxonomies]
  tag = "tags"

[permalinks]
  blog = "/blog/:year/:month/:day/:filename"

[outputs]
  home = ["HTML"]
  blog = ["HTML", "RSS"]
  taxonomy = ["HTML"]
  taxonomyTerm = ["HTML"]

[security]
  [security.exec]
  allow = ['^pandoc$', '^dart-sass-embedded$', '^go$', '^npx$', '^postcss$']

[menu]
  [[menu.main]]
  identifier = "you are here"
  name = "Blog"
  url = "/blog/"
  weight = 1

  [[menu.main]]
  identifier = "Ben Fiedler"
  name = "About me"
  url = "/about/"
  weight = 2

  [[menu.main]]
  identifier = "bfiedler@mastodon.3fx.ch"
  name = "Mastodon"
  url = "https://mastodon.3fx.ch/@bfiedler"
  weight = 3

  [[menu.main]]
  identifier = "~bfiedler"
  name = "Sourcehut"
  url = "https://sr.ht/~bfiedler"
  weight = 4

  [[menu.main]]
  identifier = "ThreeFx"
  name = "GitHub"
  url = "https://github.com/ThreeFx"
  weight = 5

A config.yaml => config.yaml +88 -0
@@ 0,0 1,88 @@
---
baseURL: "https://3fx.ch"
languageCode: "en-us"
title: "3fx.ch"
defaultContentLanguage: 'en'

languages:
  en:
    weight: 2
  de:
    weight: 1

pygmentsUseClasses: true

taxonomies:
  tag: tags

permalinks:
  blog: "/blog/:year/:month/:day/:filename"
  chess: "/chess/:year/:month/:day/:filename"

outputs:
  home: ["HTML"]
  blog: ["HTML", "RSS"]
  chess: ["HTML", "RSS"]
  taxonomy: ["HTML"]
  taxonomyTerm: ["HTML"]

security:
  exec:
    allow: ['^pandoc$', '^dart-sass-embedded$', '^go$', '^npx$', '^postcss$']

menu:
  main:
    - identifier: "posts"
      name: "Blog"
      url: "/blog"
      weight: 1
    - identifier: "my chess games"
      name: "Chess"
      url: "/chess"
      weight: 2
    - identifier: "Ben Fiedler"
      name: "About me"
      url: "/about/"
      weight: 3
    - identifier: "bfiedler@mastodon.3fx.ch"
      name: "Mastodon"
      url: "https://mastodon.3fx.ch/@bfiedler"
      weight: 4
    - identifier: "~bfiedler"
      name: "Sourcehut"
      url: "https://sr.ht/~bfiedler"
      weight: 5
    - identifier: "ThreeFx"
      name: "GitHub"
      url: "https://github.com/ThreeFx"
      weight: 6

#[[languages.de.menu.main]]
#  identifier = "du bist hier"
#  name = "Blog"
#  url = "/de/blog/"
#  weight = 1
#
#[[languages.de.menu.main]]
#  identifier = "Ben Fiedler"
#  name = "Über mich"
#  url = "/de/about/"
#  weight = 2
#
#[[languages.de.menu.main]]
#  identifier = "bfiedler@mastodon.3fx.ch"
#  name = "Mastodon"
#  url = "https://mastodon.3fx.ch/@bfiedler"
#  weight = 3
#
#[[languages.de.menu.main]]
#  identifier = "~bfiedler"
#  name = "Sourcehut"
#  url = "https://sr.ht/~bfiedler"
#  weight = 4
#
#[[languages.de.menu.main]]
#  identifier = "ThreeFx"
#  name = "GitHub"
#  url = "https://github.com/ThreeFx"
#  weight = 5

M content/about.md => content/about.md +3 -0
@@ 8,6 8,9 @@ I am a PhD student in [Computer Science](https://inf.ethz.ch) with the
have a formal methods background, and am currently working on low-level
high-assurance systems.

In my free time I enjoy [playing chess](https://lichess.org/@/bfiedler) and
administering [my own systems](https://mastodon.3fx.ch).

## About this blog

A disclaimer in advance: I am not a frontend developer. Barring some basic HTML

A content/blog/_index.md => content/blog/_index.md +3 -0
@@ 0,0 1,3 @@
---
title: "Blog posts" 
---

A content/chess/_index.md => content/chess/_index.md +3 -0
@@ 0,0 1,3 @@
---
title: "Chess games"
---

A content/chess/first-rated-game.md => content/chess/first-rated-game.md +146 -0
@@ 0,0 1,146 @@
---
author: "Ben Fiedler"
title: "My first officially rated chess game"
date: "2022-05-06"
tournament: "SMM"
color: "white"
result: "1-0"
---

I first played chess with my father when I was a child, and I also remember
playing (but not understanding) the chess computer game [Fritz und
Fertig](https://fritzundfertig.chessbase.com). In school, I've been part of the
chess club in some years, and spent some breaks playing chess with a friend.

In January 2019 I picked up online chess[^1], and joined [SC
Réti](https://screti.ch), a local chess club, in late summer of 2021. We meet
almost every Monday to have dinner and play, analyze or study chess. Having
played two years of online chess, meeting with other people in person and
playing on physical boards is a very different experience compared to online
games, and I enjoy it immensely.

I played my first nationally rated chess game on April 30, 2022, in a tournament
called the ["Schweizerische Mannschaftsmeisterschaft"
(SMM)](https://www.swisschess.ch/smm.html)[^2] for the [SC
Réti](https://screti.ch) in our sixth team, Réti 6. I've played a few games
before with long time controls, mainly during Réti-internal tournaments, but
those did not count towards my offical rating.

To hold myself accountable, I'll try to share analyses of my games here.

# The Analysis

The time control during SMM games is 90 minutes per player from move 1, with a
30 second increment from move 1 as well. Time control is reached after 40 moves,
and both players get an additional 30 minutes added to their clock.

My opponent is rated about 1200-1300 Swiss ELO. We begin **1\. d4 Nf6 2.
Bf4 g6 3. Nc3 d6 4. e4**, which I looked at briefly before the game.

{{< fen pos="rnbqk2r/ppppppbp/5np1/8/3PPB2/2N5/PPP2PPP/R2QKBNR b KQkq - 0 4"
    caption="The opening after **4. e4**" >}}

Black gives me good control of the center, and I feel very comfortable. After
the game the Black player told me he disliked his position during the opening.
We continue **4. ... Bg7 5. Qd2 0-0 6. 0-0-0 a6**. I avoid all problems Black's
fianchettoed Bishop poses with **7. Bh6**, leading to **7. ... Re1 8. Bxg7
Kxg7**.

{{< fen pos="rnbqr3/1pp1ppkp/p2p1np1/8/3PP3/2N5/PPPQ1PPP/2KR1BNR w - - 0 9"
    caption="White to play after **8. ... Kxg7**">}}

Having castled on opposite sides, nothing prevents me from pushing the f-pawn.
of course, pushing the h-pawn is also an option here, but I like pushing the
f-pawn a bit more because it also fights for the center and prevents Black from
playing e5. Thus, it continues **9. f4 b5 10. e5 dxe5 11. fxe5 Nd5**. I'm not
scared of Black exchanging our knights on c3. Taking Black's knight would run
into 12. ... Qxd4!, a double attack against the g2 and a2 pawns, equalizing.

{{< fen pos="rnbqr3/2p1ppkp/p5p1/1p1nP3/3P4/2N5/PPPQ2PP/2KR1BNR w - - 1 12"
    caption="After **11. ... Nd5**">}}

The g2 pawn feels a bit weak anyway, so I decide to develop the bishop to f3 via
e2. **12. Be2 Nxc3 13. Qxc3 Bb7 14. Bf3**. Only after moving my bishop to f3 I
notice that the Black bishop can go to d5, posing the exact same problems as the
knight did. Thus we get **14. ... Bd5**. Taking on a2 is not an option for
Black, as I can trap the bishop with b3!. We continue **15. Nh3 e6 16. Nf4 c6**,
with me completing my development and my opponent still having some troubles
with his knight. We both start our attacks with **17. h4 a5**. I feel like I am
faster though, especially since my queen quickly enters the kingside with **18.
Bxd5 cxd5 19. Qg3**.

{{< fen pos="rn1qr3/5pkp/4p1p1/pp1pP3/3P1N1P/6Q1/PPP3P1/2KR3R b - - 1 19"
    caption="White's attack looks scary after **19. Qd3**">}}

Black develops his knight with **19. ... Nd7**. I don't see how Black can stop
my attack, so I play **20. h5 Nf8 21. Kb1 b4 22. b3 a4 23. hxg6 fxg6**. 23. ...
hxg6?? would have immediately lost to 24. Qh3!.

I spent some time considering 24. Rxh7, but I didn't see a sensible continuation
After 24. ... Nxf7, Stockfish shows the way: 25. Qxg6+ Kh8 (26. ... Kf8? 27.
Rf1! with mate to follow, as the Black king cannot escape via e7 due to Qg7#)
26\. Qf7! and Black must sacrifice his queen avoid getting checkmated.

24\. ... Kxh7 also loses material after 25. Qh3+ Kg1 26. Rh1 Kf7 27. Qh1! and
Black is completely paralyzed. The knight must defend the mate threat on h7, and
27\. ... Ke7?? runs into 28. Qg7#. Black must sacrifice material to survive.

{{< fen pos="r2qrn2/6kR/4p1p1/3pP3/pp1P1N2/1P4Q1/P1P3P1/1K1R4 b - - 0 24"
  caption="White's winning variation, sacrificing the rook with 24. Rxh7" >}}

However, I am not Stockfish, so I play **24. Nh5+ Kh8** after some
consideration. Both Kg8 and Kf7 lose by force, but it is not terribly difficult
to see. **25. Nf6 Re7 26. Qh3** and my attack has seemingly halted. During the
game I don't feel like I missed something obvious, but I have a very strong
feeling that the position is equal now, if not slightly better for Black.

Now its Black's turn to attack: **26. ... axb3 27. Qxb3??**. 27. cxa3 looks much
easier to defend than Qxb3, which the engine agrees. 27\. Qxb3 blundered into
27\. ... Ra2!, which my opponent fortunately overlooked as well. Instead we get
**27. ... Qa5 28. Rd3 Ra2 (now too late) 29. Kb2 Qxa2+ 30. Qxa2 Rxa2+ 31. Kb3
Ra3+ 32. Kxb4**.

{{< fen pos="5n1k/7p/4pNp1/3pP3/1K1P4/r2R4/r1P3P1/7R b - - 0 32"
    caption="Black's rooks are very active after **32. Kxb4**" >}}

**32\. ... Rxd3 33. cxd3 Rxg2** Black exchanges a pair of rooks and wins a pawn,
however my king enters the black position after **34. Kc5 Kg7 35. Rf1 h5 36. Kd6
Rd2 37. Ke7**, threatening to win the knight with Ne8+. Thus we get **37. ...
Nh7**. I decide to take the pawn first, thinking that Nxf6 is better for me. In
hindsight this isn't true, and only gave black the opportunity to exchange his
bad knight for my great one. **38. Kxe6 Rxd3 39. Ne8+ Kh6 40. Kxd5**. 38. ...
Nxf6 would have been better according to the engine. I feel very comfortable
again, as my pieces are well placed for the endgame: my rook defends the first
rank and prevents lone pawns from promoting, my knight dominates Black's knight
and my connected passed pawns are one square closer to promotion than Black's.

{{< fen pos="4N3/7n/6pk/3KP3/3P3p/3r4/8/5R2 w - - 0 41"
    caption="White's pieces look much more active than Black's after **40. ... h4**" >}}

Black tries to push with **40\. ... h4** but the h-pawn alone cannot promote
while my rook patrols the first rank. **41. Ke4?**, better would have been 41. e6
immediately. **41. ... Ka3 42. e6 Ra8 43. Nc7 Rd8+ 44. Ke5 Rf8?**. After my
opponent offered me the exchange of rooks, I can win the game on the spot and
take my time to calculate the following sequence: **45. Rxf8 Nxf8 46. e7 Nd7+
47\. Ke6!** only winning move, as otherwise the black knight defends the e8
square from f6. **47. ... Nc5+ 48. dxc5 h2 49. a8=Q** and Black resigns, because
49\. ... h1=Q is followed by 50. Qh8+! ... 51. Qxh1, and the game is over.

{{< fen pos="4Q3/2N5/4K1pk/2P5/8/8/7p/8 b - - 0 50"
    caption="Black resigns after **49. a8=Q**" >}}

I was very happy to have won my first rated game, but I felt that I was lucky my
opponent made some mistakes in the endgame, allowing me to win after he had
equalized in the middle game.

# A fun puzzle

During the game, my endgame was winning due to having **48. dxc5** after **47.
... Nc5+**. It turns out that this endgame is also winning without the pawn on
c5, can you find an alternative winning sequence?

{{< fen pos="5r2/2N4n/4P1pk/4K3/8/7p/8/5R2 w - - 1 48"
    caption="White to play and win by force" >}}

[^1]: one year before the pandemic and the ensuing popularity surge
[^2]: translates to "Swiss Team Championship"

A content/chess/test.md => content/chess/test.md +11 -0
@@ 0,0 1,11 @@
---
title: "Test game (drawn)"
date: "2022-05-05"
color: "black"
result: "½-½"
draft: true
---

{{< fen "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR" >}}

{{< fen pos="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR" flip=true >}}

A content/imprint.md => content/imprint.md +13 -0
@@ 0,0 1,13 @@
---
title: "Imprint"
layout: "imprint"
---

Unless stated otherwise, all content is licensed under the [CC BY-SA
4.0](https://creativecommons.org/licenses/by-sa/4.0) license.

The [chess
pieces](https://en.wikipedia.org/wiki/User:Cburnett/GFDL_images/Chess) used [my
chess posts](/chess/) were created by [Colin M.L.
Burnett](https://en.wikipedia.org/wiki/User:Cburnett) are licensed under the
[BSD License](https://opensource.org/licenses/BSD-3-Clause).

M layouts/_default/about.html => layouts/_default/about.html +1 -1
@@ 6,4 6,4 @@
    </article>
</main>
{{ partial "footer.html" }}
{{ end }} 
{{ end }}

M layouts/_default/baseof.html => layouts/_default/baseof.html +6 -5
@@ 4,6 4,7 @@
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="color-scheme" content="light dark">
        <meta name="author" content="Ben Fiedler">
        <title>{{ block "title" . }}{{ .Title }}{{ end }}</title>
        {{- $fira := resources.Get "fira-code.css" | minify | fingerprint }}
        <link rel="stylesheet" href="{{ $fira.RelPermalink }}" integrity="{{ $fira.Data.Integrity }}">


@@ 11,11 12,11 @@
        <link rel="stylesheet" href="{{ $worksans.RelPermalink }}" integrity="{{ $worksans.Data.Integrity }}">
        {{- $main := resources.Get "style.scss" | toCSS | minify | fingerprint }}
        <link rel="stylesheet" href="{{ $main.RelPermalink }}" integrity="{{ $main.Data.Integrity }}">
        {{- block "rss" . -}}
        {{- with .OutputFormats.Get "rss" -}}
        {{ printf `<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }}
        {{- end -}}
        {{- end -}}
        {{ block "rss" . -}}
        {{ end -}}
        {{ with .OutputFormats.Get "rss" -}}
        {{ printf `<link rel="%s" type="%s" href="%s" title="%s on 3fx.ch" />` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }}
        {{ end -}}
        <link rel="icon" href="data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20'-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN'%20'http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd'%3E%3Csvg%20enable-background%3D%22new%200%200%20142.916%20142.916%22%20version%3D%221.1%22%20viewBox%3D%220%200%20142.92%20142.92%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22m32.901%20114.8-12.015%2016.507c-2.375%203.265-1.656%207.835%201.608%2010.21%201.301%200.945%202.807%201.4%204.295%201.4%202.261%200%204.487-1.043%205.917-3.006l12.11-16.638c7.951%204.239%2017.019%206.651%2026.644%206.651%2031.342%200%2056.84-25.499%2056.84-56.842%200-15.979-6.636-30.427-17.283-40.764l15.074-20.709c2.375-3.265%201.655-7.834-1.607-10.21-3.273-2.377-7.84-1.651-10.209%201.608l-14.962%2020.556c-8.241-4.655-17.739-7.323-27.856-7.323-31.343%200-56.842%2025.499-56.842%2056.841%200%2016.477%207.05%2031.329%2018.286%2041.719zm80.781-41.719c0%2023.284-18.94%2042.226-42.226%2042.226-6.407%200-12.461-1.477-17.905-4.039l48.729-66.951c7.051%207.548%2011.402%2017.648%2011.402%2028.764zm-42.225-42.224c6.901%200%2013.403%201.698%2019.159%204.646l-49.043%2067.381c-7.623-7.643-12.344-18.181-12.344-29.801%203e-3%20-23.284%2018.944-42.226%2042.228-42.226z%22%2F%3E%3C%2Fsvg%3E%0A" type="image/svg+xml" sizes="any">
        <link rel="mask-icon" href="/favicon.svg" color="#000000">
    </head>

M layouts/_default/home.html => layouts/_default/home.html +4 -1
@@ 1,5 1,8 @@
{{ define "title" }}Ben Fiedler{{ end }}
{{ define "rss" }}<link rel="alternate" type="application/rss+xml" href="{{ "/blog/index.xml" | absURL }}" title="3fx.ch" />{{ end }}
{{ define "rss" }}
<link rel="alternate" type="application/rss+xml" href="{{ "/blog/index.xml" | absURL }}" title="Blog posts on 3fx.ch" />
<link rel="alternate" type="application/rss+xml" href="{{ "/chess/index.xml" | absURL }}" title="Chess games on 3fx.ch" />
{{ end }}
{{ define "main" }}
<main id="intro">
    <h1>Ben Fiedler</h1>

A layouts/_default/imprint.html => layouts/_default/imprint.html +10 -0
@@ 0,0 1,10 @@
{{ define "main" }}
{{ partial "header.html" (dict "context" . "IsDetailed" false "DisplayImage" false) }}
<main class="blogpost">
    <article class="imprint">
        <h1>{{ .Title }}</h1>
	<section>{{ .Content }}</section>
    </article>
</main>
{{ partial "footer.html" }}
{{ end }}

R layouts/blog/list.html => layouts/_default/list.html +4 -12
@@ 1,18 1,10 @@
{{ define "title" }}Blog posts{{ end }}
{{ define "main" }}
{{ partial "header.html" (dict "context" . "IsDetailed" true "DisplayImage" true) }}
{{ partial "header.html" (dict "context" . "IsDetailed" true "DisplayImage" true "Section" "blog") }}
<main>
    <h1 class="list-title all-posts-title">{{ block "title" . }}{{ end }}</h1>
    <ol class="post-list">
    <h1 class="list-title">{{ .Title }}</h1>
    <ol class="article-list">
        {{- range .Pages.ByPublishDate.Reverse }}
        <li>
            <article>
                <header>
                    <time class="post-time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
                    <h1><a href="{{ .RelPermalink }}">{{ .Title }}</a></h1>
                </header>
            </article>
        </li>
        {{ .Render "li" }}
        {{- end }}
    </ol>
</main>

R layouts/blog/rss.xml => layouts/_default/rss.xml +2 -2
@@ 14,8 14,8 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>3fx.ch</title>
    <link>https://3fx.ch/blog</link>
    <description>Recent posts on 3fx.ch</description>
    <link>{{ .Permalink }}</link>
    <description>Recent {{ .Title }} on 3fx.ch</description>
    <generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
    <language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
    <managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}

R layouts/blog/single.html => layouts/_default/single.html +7 -33
@@ 3,15 3,15 @@
<main class="blogpost">
    <article>
        <header>
            <h1 class="post-title">{{ .Title }}</h1>
            <aside class="post-metadata">
                <time class="post-time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
                on <a href="/blog/">this blog</a>
                {{ partial "feed-icon.html" }}
            <h1 class="article-title">{{ .Title }}</h1>
            <aside class="article-metadata">
                <time class="time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
                on <a href="{{ .Section | relURL }}">this blog</a>
                {{ partial "feed-icon.html" .Section }}
            </aside>
            {{- with .Params.Tags -}}
            <aside class="post-metadata-small">
            tags: <ul class="post-tags">
            <aside class="article-metadata-small">
            tags: <ul class="tags">
                {{- range . }}<li><a href="/tags/{{ . }}">{{ . }}</a></li>{{- end }}
            </ul>
            </aside>


@@ 21,33 21,7 @@
        {{- if in .Params.tags "math" }}
        {{ $content = replace $content "$" "<span class=\"inline-math\">$</span>" | safeHTML }}
        {{- end }}
        {{- if .Params.tags }}
        {{ $footnotes_tag := `<section class="footnotes" role="doc-endnotes">` }}
        {{- if strings.Contains $content $footnotes_tag }}
        {{ $split := split $content $footnotes_tag }}
        <section>{{ index $split 0 | safeHTML }}</section>
        <footer>
            <section class="post-metadata">
            tags: [
            <ul class="post-tags">
                {{- range .Params.tags }}
                <li>
                    <a href="/tags/{{ . }}">{{ . }}</a>
                </li>
                {{- end }}
            </ul>
            ]
            </section>
            {{ $footnotes_tag | safeHTML }}{{ index $split 1 | safeHTML }}
        </footer>
        {{- else }}
        <section>{{ $content }}</section>
        <footer class="post-metadata">
        </footer>
        {{- end -}}
        {{- else }}
        <section>{{ $content }}</section>
        {{- end }}
    </article>
</main>
{{ partial "openring.html" . }}

A layouts/blog/li.html => layouts/blog/li.html +8 -0
@@ 0,0 1,8 @@
<li>
    <article>
        <header>
            <time class="list-time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
            <h1><a href="{{ .RelPermalink }}">{{ .Title }}</a></h1>
        </header>
    </article>
</li>

A layouts/chess/li.html => layouts/chess/li.html +10 -0
@@ 0,0 1,10 @@
<li>
    <article>
        <header>
            <time class="chess-time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
            <aside class="color color-{{ .Params.Color }}"></aside>
            <aside class="result">{{ .Params.Result }}</aside>
            <h1><a href="{{ .RelPermalink }}">{{ .Title }}</a></h1>
        </header>
    </article>
</li>

M layouts/partials/feed-icon.html => layouts/partials/feed-icon.html +1 -1
@@ 1,1 1,1 @@
<a href="/blog/index.xml"><svg class="feed-icon" version="1.1" viewBox="0 0 512 512"><g><path d="M119.9,336.1c-30.8,0-55.9,25.1-55.9,55.8c0,30.8,25.1,55.6,55.9,55.6c30.9,0,55.9-24.9,55.9-55.6   C175.8,361.2,150.8,336.1,119.9,336.1z"/><path d="M64,192v79.9c48,0,94.1,14.2,128,48.1c33.9,33.9,48,79.9,48,128h80C320,308.1,204,192,64,192z"/><path d="M64,64v79.9c171,0,303.9,133,303.9,304.1H448C448,236.3,276,64,64,64z"/></g></svg></a>
<a href="/{{ . }}/index.xml"><svg class="feed-icon" version="1.1" viewBox="0 0 512 512"><g><path d="M119.9,336.1c-30.8,0-55.9,25.1-55.9,55.8c0,30.8,25.1,55.6,55.9,55.6c30.9,0,55.9-24.9,55.9-55.6   C175.8,361.2,150.8,336.1,119.9,336.1z"/><path d="M64,192v79.9c48,0,94.1,14.2,128,48.1c33.9,33.9,48,79.9,48,128h80C320,308.1,204,192,64,192z"/><path d="M64,64v79.9c171,0,303.9,133,303.9,304.1H448C448,236.3,276,64,64,64z"/></g></svg></a>

M layouts/partials/footer.html => layouts/partials/footer.html +5 -1
@@ 1,4 1,8 @@
<footer>
    <p>&copy; {{ now.Year }} Ben Fiedler.
    <a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode">Some rights reserved.</a>
    <a href="{{ "/imprint" | relLangURL }}">Some rights reserved.</a>
    {{ if in .Params.Tags "chess" }}Chess pieces by <a
      href="https://en.wikipedia.org/wiki/User:Cburnett">Colin M. L. Burnett.</a>
    {{- end }}
    </p>
</footer>

M layouts/partials/header.html => layouts/partials/header.html +6 -3
@@ 6,11 6,14 @@
    <nav{{ if default false .IsDetailed }} class="detailed"{{ end }}>
        <dl>
            {{- range .context.Site.Menus.main }}
            {{- if ne .Name "Blog" }}
            <dt>{{ .Name | lower }}</dt>
            {{- if eq .Name "Blog" }}
            <dt>{{ .Name | lower }} {{ partial "feed-icon.html" "blog" }}</dt>
            <dd><a href="{{ .URL }}">{{ .Identifier }}</a></dd>
            {{- else if eq .Name "Chess" }}
            <dt>{{ .Name | lower }} {{ partial "feed-icon.html" "chess" }}</dt>
            <dd><a href="{{ .URL }}">{{ .Identifier }}</a></dd>
            {{- else }}
            <dt>{{ .Name | lower }} {{ partial "feed-icon.html" }}</dt>
            <dt>{{ .Name | lower }}</dt>
            <dd><a href="{{ .URL }}">{{ .Identifier }}</a></dd>
            {{- end }}
            {{- end }}

A layouts/shortcodes/fen.html => layouts/shortcodes/fen.html +115 -0
@@ 0,0 1,115 @@
{{ $fen := cond .IsNamedParams (.Get "pos") (.Get 0) }}
<figure class="fen">
  <div class="board{{ if (.Get "flip") }} flipped{{ end }}">
    {{- range $f := split $fen " " | first 1 }}
    {{- range $r := split $f "/" }}
    <div class="row">
      {{ range $i := seq (len $r) }}
      {{ $c := string (index $r (sub $i 1)) }}
      {{ if (eq $c "114") }}
      <div class="square">
        <img src="/img/chess/bR.svg">
      </div>
      {{ else if (eq $c "110") }}
      <div class="square">
        <img src="/img/chess/bN.svg">
      </div>
      {{ else if (eq $c "98") }}
      <div class="square">
        <img src="/img/chess/bB.svg">
      </div>
      {{ else if (eq $c "113") }}
      <div class="square">
        <img src="/img/chess/bQ.svg">
      </div>
      {{ else if (eq $c "107") }}
      <div class="square">
        <img src="/img/chess/bK.svg">
      </div>
      {{ else if (eq $c "112") }}
      <div class="square">
        <img src="/img/chess/bP.svg">
      </div>
      {{ else if (eq $c "49") }}
      <div class="square">
      </div>
      {{ else if (eq $c "50") }}
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "51") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "52") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "53") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "54") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "55") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "56") }}
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      <div class="square"></div>
      {{ else if (eq $c "80") }}
      <div class="square">
        <img src="/img/chess/wP.svg">
      </div>
      {{ else if (eq $c "82") }}
      <div class="square">
        <img src="/img/chess/wR.svg">
      </div>
      {{ else if (eq $c "78") }}
      <div class="square">
        <img src="/img/chess/wN.svg">
      </div>
      {{ else if (eq $c "66") }}
      <div class="square">
        <img src="/img/chess/wB.svg">
      </div>
      {{ else if (eq $c "81") }}
      <div class="square">
        <img src="/img/chess/wQ.svg">
      </div>
      {{ else if (eq $c "75") }}
      <div class="square">
        <img src="/img/chess/wK.svg">
      </div>
      {{ end }}
      {{ end }}
    </div>
    {{- end }}
  {{- end }}
  </div>
  <figcaption>
    {{ if .IsNamedParams }}
    <p>{{ .Get "caption" | markdownify }}</p>
    {{ else }}
    <p>FEN {{ $fen }}</p>
    {{ end }}
  </figcaption>
</figure>

M layouts/taxonomy/taxonomy.html => layouts/taxonomy/taxonomy.html +4 -6
@@ 4,12 4,10 @@
<main>
    <h1 class="list-title">{{ block "title" . }}{{ end }}</h1>
    <p>Below you can find a list of tags I've used on this blog.</p>
    <ol class="tag-list">
        {{- range .Data.Terms.Alphabetical }}
        <li>
            <a href="/tags/{{ .Name }}">{{ .Name }}</a>
        </li>
        {{- end }}
    <ol class="taxonomy-list">
        {{- range .Data.Terms.Alphabetical -}}
        <li><a href="/tags/{{ .Name }}">{{ .Name }}</a></li>
        {{- end -}}
    </ol>
</main>
{{ partial "footer.html" }}

M layouts/term/term.html => layouts/term/term.html +4 -11
@@ 3,17 3,10 @@
{{ partial "header.html" (dict "context" . "IsDetailed" true "DisplayImage" true) }}
<main>
    <h1 class="list-title">{{ block "title" . }}{{ end }}</h1>
    <ol class="post-list">
        {{- range .Pages.ByPublishDate.Reverse }}
        <li>
            <article>
                <header>
                    <time class="post-time" datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "2006-01-02" }}</time>
                    <h1><a href="{{ .RelPermalink }}">{{ .Title }}</a></h1>
                </header>
            </article>
        </li>
        {{- end }}
    <ol class="article-list">
      {{- range .Pages.ByPublishDate.Reverse }}
      {{ .Render "li" }}
      {{- end }}
    </ol>
</main>
{{ partial "footer.html" }}

A static/img/chess/bB.svg => static/img/chess/bB.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><g fill="#000" stroke-linecap="butt"><path d="M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2z"/><path d="M15 32c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2z"/><path d="M25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z"/></g><path d="M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5" stroke="#ececec" stroke-linejoin="miter"/></g></svg>
\ No newline at end of file

A static/img/chess/bK.svg => static/img/chess/bK.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22.5 11.63V6" stroke-linejoin="miter"/><path d="M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5" fill="#000" stroke-linecap="butt" stroke-linejoin="miter"/><path d="M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z" fill="#000"/><path d="M20 8h5" stroke-linejoin="miter"/><path d="M32 29.5s8.5-4 6.03-9.65C34.15 14 25 18 22.5 24.5l.01 2.1-.01-2.1C20 18 9.906 14 6.997 19.85c-2.497 5.65 4.853 9 4.853 9" stroke="#ececec"/><path d="M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0" stroke="#ececec"/></g></svg>
\ No newline at end of file

A static/img/chess/bN.svg => static/img/chess/bN.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10c10.5 1 16.5 8 16 29H15c0-9 10-6.5 8-21" fill="#000"/><path d="M24 18c.38 2.91-5.55 7.37-8 9-3 2-2.82 4.34-5 4-1.042-.94 1.41-3.04 0-3-1 0 .19 1.23-1 2-1 0-4.003 1-4-4 0-2 6-12 6-12s1.89-1.9 2-3.5c-.73-.994-.5-2-.5-3 1-1 3 2.5 3 2.5h2s.78-1.992 2.5-3c1 0 1 3 1 3" fill="#000"/><path d="M9.5 25.5a.5.5 0 1 1-1 0 .5.5 0 1 1 1 0zm5.433-9.75a.5 1.5 30 1 1-.866-.5.5 1.5 30 1 1 .866.5z" fill="#ececec" stroke="#ececec"/><path d="M24.55 10.4l-.45 1.45.5.15c3.15 1 5.65 2.49 7.9 6.75S35.75 29.06 35.25 39l-.05.5h2.25l.05-.5c.5-10.06-.88-16.85-3.25-21.34-2.37-4.49-5.79-6.64-9.19-7.16l-.51-.1z" fill="#ececec" stroke="none"/></g></svg>
\ No newline at end of file

A static/img/chess/bP.svg => static/img/chess/bP.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><path d="M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z" stroke="#000" stroke-width="1.5" stroke-linecap="round"/></svg>
\ No newline at end of file

A static/img/chess/bQ.svg => static/img/chess/bQ.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><g stroke="none"><circle cx="6" cy="12" r="2.75"/><circle cx="14" cy="9" r="2.75"/><circle cx="22.5" cy="8" r="2.75"/><circle cx="31" cy="9" r="2.75"/><circle cx="39" cy="12" r="2.75"/></g><path d="M9 26c8.5-1.5 21-1.5 27 0l2.5-12.5L31 25l-.3-14.1-5.2 13.6-3-14.5-3 14.5-5.2-13.6L14 25 6.5 13.5 9 26z" stroke-linecap="butt"/><path d="M9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z" stroke-linecap="butt"/><path d="M11 38.5a35 35 1 0 0 23 0" fill="none" stroke-linecap="butt"/><path d="M11 29a35 35 1 0 1 23 0m-21.5 2.5h20m-21 3a35 35 1 0 0 22 0m-23 3a35 35 1 0 0 24 0" fill="none" stroke="#ececec"/></g></svg>
\ No newline at end of file

A static/img/chess/bR.svg => static/img/chess/bR.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 39h27v-3H9v3zm3.5-7l1.5-2.5h17l1.5 2.5h-20zm-.5 4v-4h21v4H12z" stroke-linecap="butt"/><path d="M14 29.5v-13h17v13H14z" stroke-linecap="butt" stroke-linejoin="miter"/><path d="M14 16.5L11 14h23l-3 2.5H14zM11 14V9h4v2h5V9h5v2h5V9h4v5H11z" stroke-linecap="butt"/><path d="M12 35.5h21m-20-4h19m-18-2h17m-17-13h17M11 14h23" fill="none" stroke="#ececec" stroke-width="1" stroke-linejoin="miter"/></g></svg>
\ No newline at end of file

A static/img/chess/wB.svg => static/img/chess/wB.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><g fill="#fff" stroke-linecap="butt"><path d="M9 36c3.39-.97 10.11.43 13.5-2 3.39 2.43 10.11 1.03 13.5 2 0 0 1.65.54 3 2-.68.97-1.65.99-3 .5-3.39-.97-10.11.46-13.5-1-3.39 1.46-10.11.03-13.5 1-1.354.49-2.323.47-3-.5 1.354-1.94 3-2 3-2z"/><path d="M15 32c2.5 2.5 12.5 2.5 15 0 .5-1.5 0-2 0-2 0-2.5-2.5-4-2.5-4 5.5-1.5 6-11.5-5-15.5-11 4-10.5 14-5 15.5 0 0-2.5 1.5-2.5 4 0 0-.5.5 0 2z"/><path d="M25 8a2.5 2.5 0 1 1-5 0 2.5 2.5 0 1 1 5 0z"/></g><path d="M17.5 26h10M15 30h15m-7.5-14.5v5M20 18h5" stroke-linejoin="miter"/></g></svg>
\ No newline at end of file

A static/img/chess/wK.svg => static/img/chess/wK.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22.5 11.63V6M20 8h5" stroke-linejoin="miter"/><path d="M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5" fill="#fff" stroke-linecap="butt" stroke-linejoin="miter"/><path d="M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z" fill="#fff"/><path d="M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0"/></g></svg>
\ No newline at end of file

A static/img/chess/wN.svg => static/img/chess/wN.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22 10c10.5 1 16.5 8 16 29H15c0-9 10-6.5 8-21" fill="#fff"/><path d="M24 18c.38 2.91-5.55 7.37-8 9-3 2-2.82 4.34-5 4-1.042-.94 1.41-3.04 0-3-1 0 .19 1.23-1 2-1 0-4.003 1-4-4 0-2 6-12 6-12s1.89-1.9 2-3.5c-.73-.994-.5-2-.5-3 1-1 3 2.5 3 2.5h2s.78-1.992 2.5-3c1 0 1 3 1 3" fill="#fff"/><path d="M9.5 25.5a.5.5 0 1 1-1 0 .5.5 0 1 1 1 0zm5.433-9.75a.5 1.5 30 1 1-.866-.5.5 1.5 30 1 1 .866.5z" fill="#000"/></g></svg>
\ No newline at end of file

A static/img/chess/wP.svg => static/img/chess/wP.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><path d="M22.5 9c-2.21 0-4 1.79-4 4 0 .89.29 1.71.78 2.38C17.33 16.5 16 18.59 16 21c0 2.03.94 3.84 2.41 5.03-3 1.06-7.41 5.55-7.41 13.47h23c0-7.92-4.41-12.41-7.41-13.47 1.47-1.19 2.41-3 2.41-5.03 0-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38 0-2.21-1.79-4-4-4z" fill="#fff" stroke="#000" stroke-width="1.5" stroke-linecap="round"/></svg>
\ No newline at end of file

A static/img/chess/wQ.svg => static/img/chess/wQ.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zm16.5-4.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM41 12a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM16 8.5a2 2 0 1 1-4 0 2 2 0 1 1 4 0zM33 9a2 2 0 1 1-4 0 2 2 0 1 1 4 0z"/><path d="M9 26c8.5-1.5 21-1.5 27 0l2-12-7 11V11l-5.5 13.5-3-15-3 15-5.5-14V25L7 14l2 12z" stroke-linecap="butt"/><path d="M9 26c0 2 1.5 2 2.5 4 1 1.5 1 1 .5 3.5-1.5 1-1.5 2.5-1.5 2.5-1.5 1.5.5 2.5.5 2.5 6.5 1 16.5 1 23 0 0 0 1.5-1 0-2.5 0 0 .5-1.5-1-2.5-.5-2.5-.5-2 .5-3.5 1-2 2.5-2 2.5-4-8.5-1.5-18.5-1.5-27 0z" stroke-linecap="butt"/><path d="M11.5 30c3.5-1 18.5-1 22 0M12 33.5c6-1 15-1 21 0" fill="none"/></g></svg>
\ No newline at end of file

A static/img/chess/wR.svg => static/img/chess/wR.svg +1 -0
@@ 0,0 1,1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><g fill="#fff" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 39h27v-3H9v3zm3-3v-4h21v4H12zm-1-22V9h4v2h5V9h5v2h5V9h4v5" stroke-linecap="butt"/><path d="M34 14l-3 3H14l-3-3"/><path d="M31 17v12.5H14V17" stroke-linecap="butt" stroke-linejoin="miter"/><path d="M31 29.5l1.5 2.5h-20l1.5-2.5"/><path d="M11 14h23" fill="none" stroke-linejoin="miter"/></g></svg>
\ No newline at end of file