~rycwo/blog

40b041eb125eaa7abd1b885eed260a38ee4cc82e — Ryan Chan 2 years ago bbe887b
Migrate blog to zola and sourcehut pages
70 files changed, 404 insertions(+), 1249 deletions(-)

A .build.yml
M .gitignore
M .gitmodules
D CNAME
D Gemfile
D Gemfile.lock
M README.md
D _config.yml
D _drafts/two-screens-is-too-many.md
D _layouts/default.html
D _layouts/page.html
D _layouts/post.html
D _posts/2019-02-27-new-icon.md
D _sass/_highlight.scss
D _sass/_reset.scss
D about.md
D assets/css/style.scss
D assets/img/new-icon/initial_design.png
D assets/img/new-icon/two_tone.01.png
D assets/img/new-icon/two_tone.02.png
D assets/img/new-icon/two_tone.03.png
D assets/img/new-icon/two_tone.04.png
D assets/img/new-icon/two_tone.05.png
D assets/img/new-icon/two_tone.06.png
D assets/img/new-icon/two_tone.07.png
D assets/img/new-icon/two_tone.08.png
A build-css
A config.toml
A content/blog/_index.md
R _posts/2017-02-15-code-semantics.md => content/blog/code-semantics.md
R _posts/2020-02-11-cpp-const-correctness.md => content/blog/cpp-const-correctness.md
R _posts/2019-06-09-first-six-months-2019-update.md => content/blog/first-six-months-2019-update.md
R _posts/2020-09-01-forging-redplanet-day-001-gentle-start.md => content/blog/forging-redplanet-day-001-gentle-start.md
R _posts/2020-09-06-forging-redplanet-day-002-imgui-intro.md => content/blog/forging-redplanet-day-002-imgui-intro.md
R _posts/2020-09-09-forging-redplanet-day-003-imgui-canvas.md => content/blog/forging-redplanet-day-003-imgui-canvas.md
R _posts/2018-07-29-nixos-series-dual-boot.md => content/blog/nixos-series-001-dual-boot.md
R _posts/2018-08-22-nixos-series-swapfiles.md => content/blog/nixos-series-002-swapfiles.md
R _posts/2019-01-29-nixos-series-configuration-primer.md => content/blog/nixos-series-003-configuration-primer.md
R _posts/2019-02-07-nixos-series-configuring-xinit.md => content/blog/nixos-series-004-configuring-xinit.md
R _posts/2019-02-16-nixos-series-dev-env.md => content/blog/nixos-series-005-dev-env.md
R assets/img/rust-wasm-interpolation/artifact.01.png => content/blog/rust-wasm-interpolation/artifact.01.png
R assets/img/rust-wasm-interpolation/artifact.02.png => content/blog/rust-wasm-interpolation/artifact.02.png
R assets/img/rust-wasm-interpolation/artifact.03.png => content/blog/rust-wasm-interpolation/artifact.03.png
R assets/img/rust-wasm-interpolation/artifact.04.png => content/blog/rust-wasm-interpolation/artifact.04.png
R assets/img/rust-wasm-interpolation/artifact.05.png => content/blog/rust-wasm-interpolation/artifact.05.png
R assets/img/rust-wasm-interpolation/artifact.06.png => content/blog/rust-wasm-interpolation/artifact.06.png
R assets/img/rust-wasm-interpolation/idw_epsilon_example.png => content/blog/rust-wasm-interpolation/idw_epsilon_example.png
R assets/img/rust-wasm-interpolation/idw_example.png => content/blog/rust-wasm-interpolation/idw_example.png
R assets/img/rust-wasm-interpolation/idw_fields_example.png => content/blog/rust-wasm-interpolation/idw_fields_example.png
R assets/img/rust-wasm-interpolation/idw_voronoi_example.png => content/blog/rust-wasm-interpolation/idw_voronoi_example.png
R _posts/2019-03-03-rust-wasm-interpolation.md => content/blog/rust-wasm-interpolation/index.md
R assets/img/rust-wasm-interpolation/rbf_example.png => content/blog/rust-wasm-interpolation/rbf_example.png
R assets/img/rust-wasm-interpolation/rbf_fields_example.png => content/blog/rust-wasm-interpolation/rbf_fields_example.png
R assets/img/rust-wasm-interpolation/rbf_gaussian_example.png => content/blog/rust-wasm-interpolation/rbf_gaussian_example.png
R assets/img/rust-wasm-interpolation/rbf_invmultiquadric_example.png => content/blog/rust-wasm-interpolation/rbf_invmultiquadric_example.png
D favicon-16x16.png
D favicon-32x32.png
D favicon.ico
D index.html
A postcss.config.js
R publickey.txt => static/publickey.txt
A static/style.min.css
A style.css
A templates/base.html
A templates/index.html
A templates/page.html
A templates/section.html
A templates/shortcodes/raw.md
A templates/shortcodes/video.html
A turretcss
A .build.yml => .build.yml +24 -0
@@ 0,0 1,24 @@
---
image: alpine/edge
packages:
  - rsync
  - zola
sources:
  - git@git.sr.ht:~rycwo/blog
environment:
  deploy: deploy@178.79.145.29
secrets:
  - 1512bcb0-44a2-4b2a-b441-12a864de961c
tasks:
  - build: |
      cd blog
      zola build
  - deploy: |
      cd blog
      rsh="ssh -o StrictHostKeyChecking=no"
      rsync -avz --rsh="$rsh" --delete public/ "$deploy"":/var/www/rycwo.dev/"
triggers:
  - action: email
    condition: always
    to: "Ryan Chan <rycwo@posteo.net>"
...

M .gitignore => .gitignore +4 -3
@@ 1,3 1,4 @@
_site
.sass-cache
.jekyll-metadata
public
node_modules
package.json
package-lock.json

M .gitmodules => .gitmodules +3 -0
@@ 0,0 1,3 @@
[submodule "turretcss"]
	path = turretcss
	url = https://github.com/turretcss/turretcss.git

D CNAME => CNAME +0 -1
@@ 1,1 0,0 @@
rycwo.xyz
\ No newline at end of file

D Gemfile => Gemfile +0 -10
@@ 1,10 0,0 @@
source "https://rubygems.org"

gem 'github-pages', group: :jekyll_plugins

group :jekyll_plugins do
  # Add dependencies not already included by the github-pages gem here.
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem.
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

D Gemfile.lock => Gemfile.lock +0 -259
@@ 1,259 0,0 @@
GEM
  remote: https://rubygems.org/
  specs:
    activesupport (6.0.3.2)
      concurrent-ruby (~> 1.0, >= 1.0.2)
      i18n (>= 0.7, < 2)
      minitest (~> 5.1)
      tzinfo (~> 1.1)
      zeitwerk (~> 2.2, >= 2.2.2)
    addressable (2.7.0)
      public_suffix (>= 2.0.2, < 5.0)
    coffee-script (2.4.1)
      coffee-script-source
      execjs
    coffee-script-source (1.11.1)
    colorator (1.1.0)
    commonmarker (0.17.13)
      ruby-enum (~> 0.5)
    concurrent-ruby (1.1.7)
    dnsruby (1.61.4)
      simpleidn (~> 0.1)
    em-websocket (0.5.1)
      eventmachine (>= 0.12.9)
      http_parser.rb (~> 0.6.0)
    ethon (0.12.0)
      ffi (>= 1.3.0)
    eventmachine (1.2.7)
    execjs (2.7.0)
    faraday (1.0.1)
      multipart-post (>= 1.2, < 3)
    ffi (1.13.1)
    forwardable-extended (2.6.0)
    gemoji (3.0.1)
    github-pages (207)
      github-pages-health-check (= 1.16.1)
      jekyll (= 3.9.0)
      jekyll-avatar (= 0.7.0)
      jekyll-coffeescript (= 1.1.1)
      jekyll-commonmark-ghpages (= 0.1.6)
      jekyll-default-layout (= 0.1.4)
      jekyll-feed (= 0.13.0)
      jekyll-gist (= 1.5.0)
      jekyll-github-metadata (= 2.13.0)
      jekyll-mentions (= 1.5.1)
      jekyll-optional-front-matter (= 0.3.2)
      jekyll-paginate (= 1.1.0)
      jekyll-readme-index (= 0.3.0)
      jekyll-redirect-from (= 0.15.0)
      jekyll-relative-links (= 0.6.1)
      jekyll-remote-theme (= 0.4.1)
      jekyll-sass-converter (= 1.5.2)
      jekyll-seo-tag (= 2.6.1)
      jekyll-sitemap (= 1.4.0)
      jekyll-swiss (= 1.0.0)
      jekyll-theme-architect (= 0.1.1)
      jekyll-theme-cayman (= 0.1.1)
      jekyll-theme-dinky (= 0.1.1)
      jekyll-theme-hacker (= 0.1.1)
      jekyll-theme-leap-day (= 0.1.1)
      jekyll-theme-merlot (= 0.1.1)
      jekyll-theme-midnight (= 0.1.1)
      jekyll-theme-minimal (= 0.1.1)
      jekyll-theme-modernist (= 0.1.1)
      jekyll-theme-primer (= 0.5.4)
      jekyll-theme-slate (= 0.1.1)
      jekyll-theme-tactile (= 0.1.1)
      jekyll-theme-time-machine (= 0.1.1)
      jekyll-titles-from-headings (= 0.5.3)
      jemoji (= 0.11.1)
      kramdown (= 2.3.0)
      kramdown-parser-gfm (= 1.1.0)
      liquid (= 4.0.3)
      mercenary (~> 0.3)
      minima (= 2.5.1)
      nokogiri (>= 1.10.4, < 2.0)
      rouge (= 3.19.0)
      terminal-table (~> 1.4)
    github-pages-health-check (1.16.1)
      addressable (~> 2.3)
      dnsruby (~> 1.60)
      octokit (~> 4.0)
      public_suffix (~> 3.0)
      typhoeus (~> 1.3)
    html-pipeline (2.14.0)
      activesupport (>= 2)
      nokogiri (>= 1.4)
    http_parser.rb (0.6.0)
    i18n (0.9.5)
      concurrent-ruby (~> 1.0)
    jekyll (3.9.0)
      addressable (~> 2.4)
      colorator (~> 1.0)
      em-websocket (~> 0.5)
      i18n (~> 0.7)
      jekyll-sass-converter (~> 1.0)
      jekyll-watch (~> 2.0)
      kramdown (>= 1.17, < 3)
      liquid (~> 4.0)
      mercenary (~> 0.3.3)
      pathutil (~> 0.9)
      rouge (>= 1.7, < 4)
      safe_yaml (~> 1.0)
    jekyll-avatar (0.7.0)
      jekyll (>= 3.0, < 5.0)
    jekyll-coffeescript (1.1.1)
      coffee-script (~> 2.2)
      coffee-script-source (~> 1.11.1)
    jekyll-commonmark (1.3.1)
      commonmarker (~> 0.14)
      jekyll (>= 3.7, < 5.0)
    jekyll-commonmark-ghpages (0.1.6)
      commonmarker (~> 0.17.6)
      jekyll-commonmark (~> 1.2)
      rouge (>= 2.0, < 4.0)
    jekyll-default-layout (0.1.4)
      jekyll (~> 3.0)
    jekyll-feed (0.13.0)
      jekyll (>= 3.7, < 5.0)
    jekyll-gist (1.5.0)
      octokit (~> 4.2)
    jekyll-github-metadata (2.13.0)
      jekyll (>= 3.4, < 5.0)
      octokit (~> 4.0, != 4.4.0)
    jekyll-mentions (1.5.1)
      html-pipeline (~> 2.3)
      jekyll (>= 3.7, < 5.0)
    jekyll-optional-front-matter (0.3.2)
      jekyll (>= 3.0, < 5.0)
    jekyll-paginate (1.1.0)
    jekyll-readme-index (0.3.0)
      jekyll (>= 3.0, < 5.0)
    jekyll-redirect-from (0.15.0)
      jekyll (>= 3.3, < 5.0)
    jekyll-relative-links (0.6.1)
      jekyll (>= 3.3, < 5.0)
    jekyll-remote-theme (0.4.1)
      addressable (~> 2.0)
      jekyll (>= 3.5, < 5.0)
      rubyzip (>= 1.3.0)
    jekyll-sass-converter (1.5.2)
      sass (~> 3.4)
    jekyll-seo-tag (2.6.1)
      jekyll (>= 3.3, < 5.0)
    jekyll-sitemap (1.4.0)
      jekyll (>= 3.7, < 5.0)
    jekyll-swiss (1.0.0)
    jekyll-theme-architect (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-cayman (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-dinky (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-hacker (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-leap-day (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-merlot (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-midnight (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-minimal (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-modernist (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-primer (0.5.4)
      jekyll (> 3.5, < 5.0)
      jekyll-github-metadata (~> 2.9)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-slate (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-tactile (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-theme-time-machine (0.1.1)
      jekyll (~> 3.5)
      jekyll-seo-tag (~> 2.0)
    jekyll-titles-from-headings (0.5.3)
      jekyll (>= 3.3, < 5.0)
    jekyll-watch (2.2.1)
      listen (~> 3.0)
    jemoji (0.11.1)
      gemoji (~> 3.0)
      html-pipeline (~> 2.2)
      jekyll (>= 3.0, < 5.0)
    kramdown (2.3.0)
      rexml
    kramdown-parser-gfm (1.1.0)
      kramdown (~> 2.0)
    liquid (4.0.3)
    listen (3.2.1)
      rb-fsevent (~> 0.10, >= 0.10.3)
      rb-inotify (~> 0.9, >= 0.9.10)
    mercenary (0.3.6)
    mini_portile2 (2.4.0)
    minima (2.5.1)
      jekyll (>= 3.5, < 5.0)
      jekyll-feed (~> 0.9)
      jekyll-seo-tag (~> 2.1)
    minitest (5.14.2)
    multipart-post (2.1.1)
    nokogiri (1.10.10)
      mini_portile2 (~> 2.4.0)
    octokit (4.18.0)
      faraday (>= 0.9)
      sawyer (~> 0.8.0, >= 0.5.3)
    pathutil (0.16.2)
      forwardable-extended (~> 2.6)
    public_suffix (3.1.1)
    rb-fsevent (0.10.4)
    rb-inotify (0.10.1)
      ffi (~> 1.0)
    rexml (3.2.4)
    rouge (3.19.0)
    ruby-enum (0.8.0)
      i18n
    rubyzip (2.3.0)
    safe_yaml (1.0.5)
    sass (3.7.4)
      sass-listen (~> 4.0.0)
    sass-listen (4.0.0)
      rb-fsevent (~> 0.9, >= 0.9.4)
      rb-inotify (~> 0.9, >= 0.9.7)
    sawyer (0.8.2)
      addressable (>= 2.3.5)
      faraday (> 0.8, < 2.0)
    simpleidn (0.1.1)
      unf (~> 0.1.4)
    terminal-table (1.8.0)
      unicode-display_width (~> 1.1, >= 1.1.1)
    thread_safe (0.3.6)
    typhoeus (1.4.0)
      ethon (>= 0.9.0)
    tzinfo (1.2.7)
      thread_safe (~> 0.1)
    unf (0.1.4)
      unf_ext
    unf_ext (0.0.7.7)
    unicode-display_width (1.7.0)
    zeitwerk (2.4.0)

PLATFORMS
  ruby

DEPENDENCIES
  github-pages
  tzinfo-data

BUNDLED WITH
   2.1.4

M README.md => README.md +3 -1
@@ 1,3 1,5 @@
# [rycwo.xyz](https://rycwo.xyz/)
# [rycwo.dev](https://rycwo.dev/)

[![builds.sr.ht status](https://builds.sr.ht/~rycwo/blog.svg)](https://builds.sr.ht/~rycwo/blog?)

Source for personal blog.

D _config.yml => _config.yml +0 -30
@@ 1,30 0,0 @@
---
title: "Ryan Chan's Blog"
author: "Ryan Chan"
description: "Musings on software development and computer graphics"

permalink: /:year/:month/:day/:title
excerpt_separator: "<!-- Excerpt -->"

# Media links
email: rycwo@posteo.net
srht_username: rycwo
gitlab_username: rycwo
github_username: rycwo

google_site_verification: "LWfTb1g2Z13gIicTBSg64NbD9gLN4Goczo9e_0NKUG4"

# Build settings
markdown: kramdown
feed:
  excerpt_only: true
plugins:
    - jekyll-feed
    - jekyll-sitemap
exclude:
    - Gemfile
    - Gemfile.lock
    - LICENSE
    - README.md
    - third-party
...

D _drafts/two-screens-is-too-many.md => _drafts/two-screens-is-too-many.md +0 -12
@@ 1,12 0,0 @@
---
published: true
layout: post
title: "Two Screens Is Too Many"
date: "2019-07-01"
tags:
    - "thoughts"
    - "hardware"
    - "focus"
category: "sysadmin"
---
<!-- Excerpt -->

D _layouts/default.html => _layouts/default.html +0 -108
@@ 1,108 0,0 @@
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>
      {%- if page.title -%}
      {{ page.title | escape }}
      {%- else -%}
      {{ site.title | escape }}
      {%- endif -%}
    </title>
    <link
      rel="stylesheet"
      type="text/css"
      href="{{ '/assets/css/style.css' | prepend: site.baseurl }}"
    />
    <link
      rel="icon"
      type="image/png"
      sizes="32x32"
      href="{{ '/favicon-32x32.png?v=qABXr2G3L0' | prepend: site.baseurl }}"
    />
    <link
      rel="icon"
      type="image/png"
      sizes="16x16"
      href="{{ '/favicon-16x16.png?v=qABXr2G3L0' | prepend: site.baseurl }}"
    />
    <link
      rel="shortcut icon"
      href="{{ '/favicon.ico?v=qABXr2G3L0' | prepend: site.baseurl }}"
    />
    <link
      rel="alternate"
      type="application/rss+xml"
      title="{{ site.title }}"
      href="{{ '/feed.xml' | prepend: site.baseurl | prepend: site.url }}"
    />
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML"
      async
    ></script>
  </head>
  <body>
    <header class="site-header">
      <!-- TODO: Add icon. -->
      <h2 class="site-title">
        <a class="nav-link" href="{{ site.url }}{{ site.baseurl }}/"
        >Ryan Chan's Blog</a>
      </h2>
      <nav>
        {% for page in site.pages -%}
        {%- if page.title -%}
        <a
          class="nav-link page-link"
          href="{{ page.url | prepend: site.baseurl }}"
        >{{ page.title }}</a>
        {%- endif %}
        {%- endfor -%}
        <a
          class="nav-link"
          href="{{ '/feed.xml' | prepend: site.baseurl }}"
        >RSS</a>
      </nav>
    </header>
    <main>
      {{ content }}
    </main>
    <footer class="site-footer">
      <div class="media-links">
        {%- if site.email %}
        <address>
          <a class="ext-link" href="mailto:{{ site.email }}">Email</a>
        </address>
        {%- endif %}
        {% if site.srht_username -%}
        <a
          class="ext-link"
          href="https://git.sr.ht/%7E{{ site.srht_username }}"
        >Sourcehut</a>
        {%- endif %}
        {%- if site.gitlab_username -%}
        <a
          class="ext-link"
          href="https://gitlab.com/{{ site.gitlab_username }}"
        >GitLab</a>
        {%- endif %}
        {%- if site.github_username -%}
        <a
          class="ext-link"
          href="https://github.com/{{ site.github_username }}"
        >GitHub</a>
        {%- endif %}
        <a
          class="ext-link"
          href="{{ '/publickey.txt' | prepend: site.baseurl }}"
        >PGP</a>
      </div>
      <p>
        Site content under
        <a href="https://creativecommons.org/licenses/by-sa/2.0/"
        >CC BY-SA</a>.
        Source under <a href="https://mit-license.org/">MIT</a>.
      </p>
    </footer>
  </body>
</html>

D _layouts/page.html => _layouts/page.html +0 -11
@@ 1,11 0,0 @@
---
layout: default
---
<article>
  <header class="post-header">
    <h1>{{ page.title }}</h1>
  </header>
  <section>
    {{ content }}
  </section>
</article>

D _layouts/post.html => _layouts/post.html +0 -17
@@ 1,17 0,0 @@
---
layout: default
---
<article class="post" itemscope itemtype="https://schema.org/BlogPosting">
  <header class="post-header">
    <h1 itemprop="name headline">{{ page.title }}</h1>
    <h6 class="post-meta">
      <time
        datetime="{{ page.date | date_to_xmlschema }}"
        itemprop="datePublished"
      >{{ page.date | date: "%B %d, %Y" }}</time>
    </h6>
  </header>
  <section>
    {{ content }}
  </section>
</article>

D _posts/2019-02-27-new-icon.md => _posts/2019-02-27-new-icon.md +0 -46
@@ 1,46 0,0 @@
---
published: true
layout: post
title: "New Icon Design"
date: "2019-02-27"
tags:
    - "rust"
    - "logo"
    - "icon"
    - "colors"
category: "design"
---
# Raising the Rustacean flag

As an avid fan of the [Rust programming language][rust], my new icon is loosely
inspired by [Ferris the crab][rustacean]. A hermit crab seemed like the perfect
projection of my current, introverted self.

<!-- Excerpt -->

It has been a while since I had done anything visually creative - I had a lot of
fun creating the icon. My most wonderful partner, [Mariya Nedeva][mars-insta],
helped me during the design process.

![initial design](/assets/img/new-icon/initial_design.png)

The icon itself was finalized in [Krita][krita], which was surprisingly pleasant
to use coming from a history with Photoshop. Keeping things brief for this post,
I just wanted to share a number of the two-tone color schemes we tried before
settling on the final.

<figure class="figure-grid">
  <img src="/assets/img/new-icon/two_tone.01.png"/>
  <img src="/assets/img/new-icon/two_tone.02.png"/>
  <img src="/assets/img/new-icon/two_tone.03.png"/>
  <img src="/assets/img/new-icon/two_tone.04.png"/>
  <img src="/assets/img/new-icon/two_tone.05.png"/>
  <img src="/assets/img/new-icon/two_tone.06.png"/>
  <img src="/assets/img/new-icon/two_tone.07.png"/>
  <img src="/assets/img/new-icon/two_tone.08.png"/>
</figure>

[mars-insta]: https://www.instagram.com/marsnedeva/
[rust]: https://www.rust-lang.org/
[rustacean]: http://rustacean.net/
[krita]: https://krita.org/en/

D _sass/_highlight.scss => _sass/_highlight.scss +0 -69
@@ 1,69 0,0 @@
.highlight .hll { background-color: #ffffcc }
.highlight  { background: #ffffff; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

D _sass/_reset.scss => _sass/_reset.scss +0 -122
@@ 1,122 0,0 @@
/* http://meyerweb.com/eric/tools/css/reset/
   v2.0 | 20110126
   License: none (public domain)
*/

html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
dfn,
img,
ins,
kbd,
q,
s,
samp,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}

article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
  display: block;
}

body {
  line-height: 1;
}

blockquote,
q {
  quotes: none;
}

blockquote:before,
blockquote:after,
q:before,
q:after {
  content: "";
  content: none;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

D about.md => about.md +0 -37
@@ 1,37 0,0 @@
---
published: true
layout: page
title: "About"
permalink: "/about"
---
I develop software. Some things I care about: computer graphics, linear algebra,
sysadmin, ops, [software freedom][floss], and [writing software that doesn't
suck][suckless].

I currently work in the Creature Research and Development Group at [DNEG][dneg].
Most of my time is spent developing rigging technology. Our current project,
Loom, was presented [DigiPro][digipro] and [CVMP][cvmp] in 2018.

Previously, I was at [MPC][mpc] working on various projects in the Animation and
Rigging departments. Together with [Marco Romeo][marco-romeo], we implemented
Thalia, a proof-of-concept high-performance deformation framework, which was
presented at [FMX][fmx] and [GTC][gtc] in 2016.

Currently hacking on [redplanet, a toy physically based renderer written in
C][redplanet].

---

Please feel free to contact me via [email](mailto:rycwo@posteo.net) with comments.

[contrib]: https://github.com/rycwo/rycwo.github.io#contributing
[cvmp]: https://www.cvmp-conference.org/2018/
[digipro]: http://dp2018.digiproconf.org/
[dneg]: https://www.dneg.com/
[floss]: https://www.gnu.org/philosophy/floss-and-foss.en.html
[fmx]: https://www.awn.com/news/mpc-showcase-year-spectacular-visual-effects-fmx-2016
[gtc]: https://www.nvidia.com/en-us/gtc/
[marco-romeo]: https://uk.linkedin.com/in/marcoromeoin
[mpc]: https://moving-picture.com/
[redplanet]: https://git.sr.ht/~rycwo/redplanet
[suckless]: https://suckless.org/philosophy/

D assets/css/style.scss => assets/css/style.scss +0 -248
@@ 1,248 0,0 @@
---
# Dummy frontmatter.
---
@charset "utf-8";

@import "reset";
@import "highlight";

html {
  height: 100%;
  color: #000000;
  background-color: #ffffff;
  font-family: "DejaVu Sans", sans-serif;
  font-size: 16px;
}

body {
  display: flex;
  flex-direction: column;
  height: 100%;
  max-width: 800px;
  margin: 0 auto;
  line-height: 1.4em;
}

main {
  flex: 1 0 auto; // Sticky footer.
}

article {
  p,
  img,
  figure,
  video,
  pre,
  ol,
  ul {
    margin-bottom: 1.5em;
  }

  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    margin-bottom: 0.5em;
  }
}

nav {
  flex: 0 1 auto; // Wrap header columns.
  font-weight: bold;

  .page-link {
    margin-right: 1.6em;
  }
}

a {
  color: #000000;
  text-decoration: none;
  display: inline-block;
  border-bottom: 1px dotted #000000;
}

ul,
ol {
  margin-left: 1em;
}

h1 {
  font-size: 1.36em;
}

h2 {
  font-size: 1.2em;
}

h3 {
  font-size: 1.1em;
}

h6 {
  font-size: 0.9em;
}

blockquote {
  padding-left: 1em;
  color: lighten(#000000, 40%);
  border-left: 1px solid lighten(#000000, 80%);
}

hr {
  height: 1px;
  width: 60px;
  margin: 1.5em auto;
  border: none;
  background: lighten(#000000, 80%);
}

pre,
code {
  font-family: "DejaVu Mono Sans", monospace;
}

pre {
  padding: 1.5em 2em 2em;
  outline: dotted 1px;
  overflow-x: auto;
  font-size: 0.9em;
}

object,
iframe,
img,
video{
  display: block;
  max-width: 100%;
  margin: 0 auto;
}

figure > img {
  display: block;
}

figcaption {
  font-size: 0.9em;
}

address {
  font-style: normal;
  float: left;
}

::selection {
  background: #000000;
  color: #ffffff;
}

.site-header {
  display: flex;
  flex-flow: row wrap;
  padding: 4em 0 3em;
}

.site-title {
  flex: 1 0 auto; // Wrap header columns.
  margin: 0 2em 1em 0;
  font-weight: bold;
}

.site-footer {
  display: flex;
  flex-flow: row wrap;
  padding: 2.5em 0 3em;
  color: lighten(#000000, 40%);
  font-size: 0.9em;

  flex-shrink: 0; // Sticky footer (see body, main).
}

.media-links {
  display: flex;
  flex-flow: row wrap;
  margin: 0 1em 1em 0;

  flex: 1 0 auto; // Wrap footer columns.

  > address, > a {
    margin-right: 1em;
  }
}

.nav-link,
.ext-link {
  margin-bottom: 1px;
  border-bottom: none;

  &:hover {
    margin-bottom: 0;
    border-bottom: 1px dotted #000000;
  }
}

.post-list {
  padding: 0;
  margin: 0;
  list-style: none;

  > li {
    margin-bottom: 1.2em;
  }
}

.post-header {
  margin: 0 0 1.4em;

  > h1 {
    font-weight: bold;
  }
}

.post-meta {
  color: lighten(#000000, 40%);
}

.footnotes ol {
  padding: 1em 0 0 1em;
  font-size: 0.9em;

  a {
    text-decoration: none;
  }
}

.figure-grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;

  img {
    margin: 1px;
  }
}

@media only screen and (max-width: 860px) {
  html {
    font-size: 14px;
  }

  body {
    margin: 0 1.4em;
  }

  .site-header {
    padding-top: 2em;
  }

  .site-footer {
    padding-bottom: 2em;
  }

  .media-links {
    // Hack to get media links wrapping.
    width: 100%;
  }
}

D assets/img/new-icon/initial_design.png => assets/img/new-icon/initial_design.png +0 -0
D assets/img/new-icon/two_tone.01.png => assets/img/new-icon/two_tone.01.png +0 -0
D assets/img/new-icon/two_tone.02.png => assets/img/new-icon/two_tone.02.png +0 -0
D assets/img/new-icon/two_tone.03.png => assets/img/new-icon/two_tone.03.png +0 -0
D assets/img/new-icon/two_tone.04.png => assets/img/new-icon/two_tone.04.png +0 -0
D assets/img/new-icon/two_tone.05.png => assets/img/new-icon/two_tone.05.png +0 -0
D assets/img/new-icon/two_tone.06.png => assets/img/new-icon/two_tone.06.png +0 -0
D assets/img/new-icon/two_tone.07.png => assets/img/new-icon/two_tone.07.png +0 -0
D assets/img/new-icon/two_tone.08.png => assets/img/new-icon/two_tone.08.png +0 -0
A build-css => build-css +2 -0
@@ 0,0 1,2 @@
#!/usr/bin/env bash
npx postcss style.css -o static/style.min.css

A config.toml => config.toml +12 -0
@@ 0,0 1,12 @@
base_url = "https://rycwo.dev"
title = "rycwo"
description = "Notes on graphics programming"
generate_feed = true

[markdown]
highlight_code = true
highlight_theme = "classic-modified"

[extra]
email = "rycwo@posteo.net"
sourcehut = "https://git.sr.ht/~rycwo/"

A content/blog/_index.md => content/blog/_index.md +5 -0
@@ 0,0 1,5 @@
+++
title = "Blog"
sort_by = "date"
paginate_by = 8
+++

R _posts/2017-02-15-code-semantics.md => content/blog/code-semantics.md +5 -12
@@ 1,13 1,8 @@
---
published: true
layout: post
title: "A Note On Semantics"
date: "2017-02-15"
tags:
    - "thoughts"
    - "python"
category: "programming"
---
+++
title = "A Note On Semantics"
date = 2017-02-15
+++

# What are "semantics"?

Semantics are deeply ingrained with most of what we interact with.


@@ 19,8 14,6 @@ Everything we use in our daily lives, including words, have been designed in one
way or another.  The design of these daily "things", guide us to use them in a
specific way.

<!-- Excerpt -->

> Apparently, the design of a bowler hat implies butt apparel.
> \- [Gunther, from Futurama][gunther]


R _posts/2020-02-11-cpp-const-correctness.md => content/blog/cpp-const-correctness.md +5 -12
@@ 1,20 1,13 @@
---
published: true
layout: post
title: "C++ const-correctness in 2020"
date: "2020-02-11"
tags:
    - "thoughts"
    - "cpp"
category: "editorial"
---
+++
title = "C++ const-correctness in 2020"
date = 2020-02-11
+++

It has been a while since I last wrote something for the blog. This should only
take about a minute.

I don't know if writing C++ used to be fun. But it sure isn't any more.

<!-- Excerpt -->

> A [`constexpr`][constexpr] specifier used in an object declaration or
> non-static member function (until C++14) implies `const`.


R _posts/2019-06-09-first-six-months-2019-update.md => content/blog/first-six-months-2019-update.md +10 -18
@@ 1,14 1,8 @@
---
published: true
layout: post
title: "Six Months Into 2019, An Update"
date: "2019-06-09"
tags:
    - "thoughts"
    - "open source"
    - "goals"
category: "update"
---
+++
title = "Six Months Into 2019, An Update"
date = 2019-06-09
+++

This first half of the year has been productive and inspirational.

To start with, enough time has been invested into this blog to make it into a


@@ 17,8 11,6 @@ software development-related tidbits in my life! I [wrapped up the series on my
NixOS setup][nixos-setup] and tried my best to [explain multivariate
interpolation in a little WebAssembly demo I wrote in Rust][rust-wasm].

<!-- Excerpt -->

In February, I made my first sizable[^1] contribution to open source software!
The project I contributed to is [Sourcehut][sourcehut]. It's ["brutalist"
design][sourcehut-design] and Unix-style, modular components make it appealing


@@ 83,9 75,9 @@ talking.

It is from these talks that I feel compelled to share my personal goals and
aspirations for: the short term (the next six months), and the long-term
foreseeable future. There is also something about making your goals public that
1) make them more official, and 2) puts a healthy amount of accountability and
expectation on yourself.
foreseeable future. There is also something about making your goals public
that for one make them more official, and also puts a healthy amount of
accountability and expectation on yourself.

As a broad, overarching goal, I would like to revisit some of the core
directions that the computer graphics industry appears to be heading. What are


@@ 135,8 127,8 @@ I would love to hear any thoughts and opinions by
      interesting-yet-gory details. Ultimately, C is arguably more simple and
      powerful than any of the existing options.

[nixos-setup]: {{ site.baseurl }}{% post_url 2019-02-16-nixos-series-dev-env %}
[rust-wasm]: {{ site.baseurl }}{% post_url 2019-03-03-rust-wasm-interpolation %}
[nixos-setup]: @/blog/nixos-series-005-dev-env.md
[rust-wasm]: @/blog/rust-wasm-interpolation/index.md

[aerc]: https://git.sr.ht/~sircmpwn/aerc/
[algo-course]: https://lagunita.stanford.edu/courses/course-v1:Engineering+Algorithms1+SelfPaced/about

R _posts/2020-09-01-forging-redplanet-day-001-gentle-start.md => content/blog/forging-redplanet-day-001-gentle-start.md +6 -14
@@ 1,14 1,8 @@
---
published: true
layout: post
title: "Forging redplanet (Day 1): A Gentle Start"
date: "2020-09-01"
tags:
    - "redplanet"
    - "forge"
    - "tau"
category: "devlog"
---
+++
title = "Forging redplanet (Day 1): A Gentle Start"
date = 2020-09-01
+++

The other night, prompted by my partner's recommendation, we watched
[_Julie & Julia_][julie-and-julia], dir. Nora Ephron. I thoroughly enjoyed the
film - although I was expecting as much considering the narrative revolved


@@ 23,8 17,6 @@ becomes clear, however, is that her mission simply acted as a vehicle for her to
"self-therapize" through blogging, the cooking itself serving as a
prompt/conversation starter for the day's blog post.

<!-- Excerpt -->

I have come away from this film re-invigorated and inspired to continue a
personal project that had gone stale for the past couple of months. In addition
to chipping away on said project, I had already been considering documenting my


@@ 55,7 47,7 @@ and it is this spin-off in particular, that I have made the most progress on.
The library is called [**Forge**][forge]. It currently possesses at most 20% of
the features I mentioned. Here is the immediate-mode GUI in action.

<video src="https://files.rycwo.xyz/borann_db82840.mp4" muted controls></video>
{{ video(url="https://files.rycwo.dev/borann_db82840.mp4", width=16, height=9, scale=100) }}

So there we have it. The short term plan is to fix a few existing bugs with the
GUI framework, implement text rendering, and demo some fancier widgets. Only

R _posts/2020-09-06-forging-redplanet-day-002-imgui-intro.md => content/blog/forging-redplanet-day-002-imgui-intro.md +7 -22
@@ 1,23 1,14 @@
---
published: true
layout: post
title: "Forging redplanet (Day 2): Intro To IMGUI"
date: "2020-09-06"
tags:
    - "redplanet"
    - "forge"
    - "tau"
    - "imgui"
category: "devlog"
---
+++
title = "Forging redplanet (Day 2): Intro To IMGUI"
date = 2020-09-06
+++

With the first day behind me, I look onwards to the path ahead of me, and I am
reminded of why I'd lost momentum in the first place. I had gotten wrapped up
in a painfully basic problem - trying to create a pan/zoom behavior on the
canvas layout the Immediate-Mode Graphical User Interface (a.k.a. IMGUI)
provides.

<!-- Excerpt -->

# IMGUI design

To understand the layout problem, I feel it conducive for today's post to


@@ 86,10 77,7 @@ if (pressed) {
}
```

<video
  src="https://files.rycwo.xyz/borann_imgui_ex_01.mp4"
  loop muted controls
></video>
{{ video(url="https://files.rycwo.dev/borann_imgui_ex_01.mp4", width=1, height=1, scale=60) }}

Bear in mind most of the verbosity currently lies in styling the GUI elements
and can be vastly minimized with presets or external configuration. This is an


@@ 124,10 112,7 @@ gui_button(...);
pop_gui_layout_container(context);
```

<video
  src="https://files.rycwo.xyz/borann_imgui_ex_02.mp4"
  loop muted controls
></video>
{{ video(url="https://files.rycwo.dev/borann_imgui_ex_02.mp4", width=1, height=1, scale=60) }}

Any fancier layout functionality just does a bit of arithmetic to figure out
sizes and spacing for upcoming elements. Currently on the roadmap are a

R _posts/2020-09-09-forging-redplanet-day-003-imgui-canvas.md => content/blog/forging-redplanet-day-003-imgui-canvas.md +10 -20
@@ 1,30 1,20 @@
---
published: true
layout: post
title: "Forging redplanet (Day 3): IMGUI 2D Canvas"
date: "2020-09-09"
tags:
    - "redplanet"
    - "forge"
    - "tau"
    - "imgui"
    - "linalg"
category: "devlog"
---
+++
title = "Forging redplanet (Day 3): IMGUI 2D Canvas"
date = 2020-09-09
+++

Day three! What a day! I finally managed to move past my writer's block - if you
can call it that - and make good progress on the canvas layout for Forge's IMGUI
as I had been wanting to. It's not a whole ton of work, but to paraphrase a good
friend of mine: when it comes to personal projects, the "initial inertia" is
the hardest bit. So I'll pat myself on the back and take this small win.

<!-- Excerpt -->

Rather than starting with a wall of text, I figured it would be much more
interesting to see the layout in action. Apologies in advance for the jittery
mouse movement, some evenings I work best off-desk so I was stuck with the
trackpad for navigation!

<video src="https://files.rycwo.xyz/borann_d9173fd.mp4" muted controls></video>
{{ video(url="https://files.rycwo.dev/borann_d9173fd.mp4", width=16, height=9, scale=100) }}

# Canvas components



@@ 72,11 62,11 @@ camera problem. With this in mind, a couple of points became clear:
  the view as we are scaling so that at some maximum scale the mouse position
  is at the center of the view.

It then became trivial to build a suitable transformation matrix $$C$$.
It then became trivial to build a suitable transformation matrix \\(C\\).

$$C = S_pSS_p^{-1}T$$
\\[C = S_pSS_p^{-1}T\\]

Where $$S_p$$ is the scale pivot, and $$S$$ and $$T$$ are the scale and
Where \\(S_p\\) is the scale pivot, and \\(S\\) and \\(T\\) are the scale and
translation respectively. The key insight here is that unlike a regular object
transformation, we want to first translate, **then** scale, so that the view
behaves like a camera zooming in/out of objects that have already been moved in


@@ 93,6 83,6 @@ clear I will be knee-deep in shader programming for the next few days. I have my
sights set on nailing the shaders for the primitives so I will not have to visit
them again for a long while.

[day-2]: {{ site.baseurl }}{% post_url 2020-09-06-forging-redplanet-day-002-imgui-intro %}#api-examples
[day-2]: @/blog/forging-redplanet-day-002-imgui-intro.md

[slab-alloc]: https://en.wikipedia.org/wiki/Slab_allocation

R _posts/2018-07-29-nixos-series-dual-boot.md => content/blog/nixos-series-001-dual-boot.md +7 -19
@@ 1,18 1,8 @@
---
published: true
layout: post
title: "Diving Into NixOS (Part 1): Dual-Booting On A New Laptop"
date: "2018-07-29"
tags:
    - "linux"
    - "nixos"
    - "tutorial"
    - "windows"
    - "dell"
    - "xps"
    - "partitioning"
category: "sysadmin"
---
+++
title = "Diving Into NixOS (Part 1): Dual-Booting On A New Laptop"
date = 2018-07-29
+++

# NixOS and Windows 10 on the XPS 13 9370

I recently purchased the [XPS 13 9370][xps] (Notebookcheck felt the least


@@ 27,8 17,6 @@ section goes into what went astray purely for contextual reasons, the helpful
instructions follow-on after. I should also mention that as always, the [Arch
Wiki][arch-wiki] has greatly facilitated the learning process.

<!-- Excerpt -->

# Out-of-the-box

If you chose to have Windows 10 installed by default, the XPS 13 should come


@@ 232,8 220,8 @@ because the file can be dynamically re-sized on a needs basis. I've [made a
post][part-1.5] on my process of updating the partition table and expanding the
filesystem at `/`.

[part-1.5]: {{ site.baseurl }}{% post_url 2018-08-22-nixos-series-swapfiles %}
[part-2]: {{ site.baseurl }}{% post_url 2019-01-29-nixos-series-configuration-primer %}
[part-1.5]: @/blog/nixos-series-002-swapfiles.md
[part-2]: @/blog/nixos-series-003-configuration-primer.md

[arch-wiki-partition-examples]: https://wiki.archlinux.org/index.php/Partitioning#Example_layouts
[arch-wiki-partition]: https://wiki.archlinux.org/index.php/Partitioning

R _posts/2018-08-22-nixos-series-swapfiles.md => content/blog/nixos-series-002-swapfiles.md +7 -16
@@ 1,15 1,8 @@
---
published: true
layout: post
title: "Diving Into NixOS (Part 1.5): Swap Files, And Other Tidbits"
date: "2018-08-22"
tags:
    - "linux"
    - "nixos"
    - "tutorial"
    - "partitioning"
category: "programming"
---
+++
title = "Diving Into NixOS (Part 1.5): Swap Files, And Other Tidbits"
date = 2018-08-22
+++

# A brief digression

As mentioned in [Part 1][part-1], my swap partition may have been a little


@@ 23,8 16,6 @@ space is the following (snippet from the Arch Wiki itself):
> killer mechanism will automatically attempt to free up memory by killing
> processes.

<!-- Excerpt -->

# Swap files on NixOS

Configuring a swap file on NixOS is trivial. A quick search through the [NixOS


@@ 189,8 180,8 @@ partitions/file systems to a certain degree.  Now, onto [Part 2][part-2].
- [redhat article on fdisk](https://access.redhat.com/articles/1190213)
- [redhat article on resizing a file system](https://access.redhat.com/articles/1196333)

[part-1]: {{ site.baseurl }}{% post_url 2018-07-29-nixos-series-dual-boot %}
[part-2]: {{ site.baseurl }}{% post_url 2019-01-29-nixos-series-configuration-primer %}
[part-1]: @/blog/nixos-series-001-dual-boot.md
[part-2]: @/blog/nixos-series-003-configuration-primer.md

[arch-wiki-swap]: https://wiki.archlinux.org/index.php/Swap
[nixos-options]: https://nixos.org/nixos/options.html

R _posts/2019-01-29-nixos-series-configuration-primer.md => content/blog/nixos-series-003-configuration-primer.md +8 -17
@@ 1,15 1,8 @@
---
published: true
layout: post
title: "Diving Into NixOS (Part 2): The Power Of Declarative Configuration"
date: "2019-01-29"
tags:
    - "linux"
    - "nixos"
    - "nixpkgs"
    - "tutorial"
category: "sysadmin"
---
+++
title = "Diving Into NixOS (Part 2): The Power Of Declarative Configuration"
date = 2019-01-29
+++

# Landing on planet NixOS

If you've ever taken a look at the Linux universe, you will have found numerous


@@ 38,8 31,6 @@ of options][de-options]. Functional, because each part of the garden is
organized into [modular, declarative components][nixpkgs], allowing newcomers to
[grow the "garden of their dreams"][configuration.nix].

<!-- Excerpt -->

# The NixOS ecosystem

Enough with the analogies, what I really want to hone in on, are the reasons why


@@ 200,9 191,9 @@ _NB I've intentionally avoided mentioning `nix-shell` at this stage as we see mo
- [Paper by Eelco Dolstra on NixOS in 2008](https://nixos.org/~eelco/pubs/nixos-icfp2008-final.pdf)
- [Paper by Eelco Dolstra on NixOS in 2010](https://nixos.org/~eelco/pubs/nixos-jfp-final.pdf)

[part-1]: {{ site.baseurl }}{% post_url 2018-07-29-nixos-series-dual-boot %}
[part-3]: {{ site.baseurl }}{% post_url 2019-02-07-nixos-series-configuring-xinit %}
[part-4]: {{ site.baseurl }}{% post_url 2019-02-16-nixos-series-dev-env %}
[part-1]: @/blog/nixos-series-001-dual-boot.md
[part-3]: @/blog/nixos-series-004-configuring-xinit.md
[part-4]: @/blog/nixos-series-005-dev-env.md

[apt]: https://wiki.debian.org/Apt
[arch]: https://www.archlinux.org/

R _posts/2019-02-07-nixos-series-configuring-xinit.md => content/blog/nixos-series-004-configuring-xinit.md +7 -16
@@ 1,15 1,8 @@
---
published: true
layout: post
title: "Diving Into NixOS (Part 3): Lightweight Startup With xinit"
date: "2019-02-07"
tags:
    - "linux"
    - "nixos"
    - "tutorial"
    - "x11"
category: "sysadmin"
---
+++
title = "Diving Into NixOS (Part 3): Lightweight Startup With xinit"
date = 2019-02-07
+++

# Brief case study

In this post, we continue on directly from [part 2][part-2]. I would recommend


@@ 19,8 12,6 @@ thought, instead of plainly listing some of the configuration options and
explaining them without any context, I thought it would be more interesting to
examine the steps I took to configure [xinit][].

<!-- Excerpt -->

## Configurable services

As mentioned, NixOS has a [wealthy host of configuration options][nixos-options]


@@ 151,8 142,8 @@ with a couple of other utilities.
- [Discourse topic](https://discourse.nixos.org/t/nixos-without-a-display-manager/360)
- [NixOS Wiki page with alternative setup](https://nixos.wiki/wiki/Using_X_without_a_Display_Manager)

[part-2]: {{ site.baseurl }}{% post_url 2019-01-29-nixos-series-configuration-primer %}
[part-4]: {{ site.baseurl }}{% post_url 2019-02-16-nixos-series-dev-env %}
[part-2]: @/blog/nixos-series-003-configuration-primer.md
[part-4]: @/blog/nixos-series-005-dev-env.md

[archwiki-xinit]: https://wiki.archlinux.org/index.php/Xinit
[bspwm]: https://github.com/baskerville/bspwm

R _posts/2019-02-16-nixos-series-dev-env.md => content/blog/nixos-series-005-dev-env.md +7 -17
@@ 1,16 1,8 @@
---
published: true
layout: post
title: "Diving Into NixOS (Part 4): Dev Workflow With Nix Shell"
date: "2019-02-16"
tags:
    - "linux"
    - "nixos"
    - "nixpkgs"
    - "workflow"
    - "tutorial"
category: "sysadmin"
---
+++
title = "Diving Into NixOS (Part 4): Dev Workflow With Nix Shell"
date = 2019-02-16
+++

# Workflow improvements with Nix

Development workflows are always interesting to examine and are oftentimes


@@ 28,8 20,6 @@ we have yet to examine [`nix-shell`][nix-shell], another powerful tool in the
Nix toolset, and how this can be coupled with [direnv][direnv] to make
development truly seamless and buttery smooth.

<!-- Excerpt -->

# Smooth sailing

There are a whole number of factors that contribute to the time it takes to


@@ 252,8 242,8 @@ Have fun, and happy hacking!
- [Setting up NixOS on VirtualBox](https://fluffynukeit.com/installing-virtualbox-for-nixos/)
- [Drew DeVault on minimalism/old hardware](https://drewdevault.com/2019/01/23/Why-I-use-old-hardware.html)

[part-2]: {{ site.baseurl }}{% post_url 2019-01-29-nixos-series-configuration-primer %}
[part-3]: {{ site.baseurl }}{% post_url 2019-02-07-nixos-series-configuring-xinit %}
[part-2]: @/blog/nixos-series-003-configuration-primer.md
[part-3]: @/blog/nixos-series-004-configuring-xinit.md

[bench-ispc]: https://git.sr.ht/~rycwo/ispc-bench
[clang]: https://clang.llvm.org/

R assets/img/rust-wasm-interpolation/artifact.01.png => content/blog/rust-wasm-interpolation/artifact.01.png +0 -0
R assets/img/rust-wasm-interpolation/artifact.02.png => content/blog/rust-wasm-interpolation/artifact.02.png +0 -0
R assets/img/rust-wasm-interpolation/artifact.03.png => content/blog/rust-wasm-interpolation/artifact.03.png +0 -0
R assets/img/rust-wasm-interpolation/artifact.04.png => content/blog/rust-wasm-interpolation/artifact.04.png +0 -0
R assets/img/rust-wasm-interpolation/artifact.05.png => content/blog/rust-wasm-interpolation/artifact.05.png +0 -0
R assets/img/rust-wasm-interpolation/artifact.06.png => content/blog/rust-wasm-interpolation/artifact.06.png +0 -0
R assets/img/rust-wasm-interpolation/idw_epsilon_example.png => content/blog/rust-wasm-interpolation/idw_epsilon_example.png +0 -0
R assets/img/rust-wasm-interpolation/idw_example.png => content/blog/rust-wasm-interpolation/idw_example.png +0 -0
R assets/img/rust-wasm-interpolation/idw_fields_example.png => content/blog/rust-wasm-interpolation/idw_fields_example.png +0 -0
R assets/img/rust-wasm-interpolation/idw_voronoi_example.png => content/blog/rust-wasm-interpolation/idw_voronoi_example.png +0 -0
R _posts/2019-03-03-rust-wasm-interpolation.md => content/blog/rust-wasm-interpolation/index.md +57 -78
@@ 1,30 1,18 @@
---
published: true
layout: post
title: "Making Rainbows With Rust And WebAssembly"
date: "2019-03-03"
tags:
    - "rust"
    - "webassembly"
    - "wasm"
    - "interpolation"
    - "colors"
    - "linear algebra"
    - "mathematics"
category: "programming"
---
# A millennial spiral
+++
title = "Making Rainbows With Rust And WebAssembly"
date = 2019-03-03
+++

If you saw my [previous post][new-icon], you will have seen that I took a small
break from programming to play around with designing a new icon for the blog. As
always, the design process wasn't so straightforward. In the spirit of a
developer raised in an age full of technological distractions, I somehow
spiraled completely off-topic and wound-up examining methods for [multivariate
interpolation][interp-multi]. My thinking was that I needed a more advanced
gradient/blending tool than what photo editing programs currently provide, in
order to make a pretty gradient for the icon background!
# A millennial spiral

<!-- Excerpt -->
If you saw my previous post (the post has now been removed), you will have seen
that I took a small break from programming to play around with designing a new
icon for the blog. As always, the design process wasn't so straightforward. In
the spirit of a developer raised in an age full of technological distractions, I
somehow spiraled completely off-topic and wound-up examining methods for
[multivariate interpolation][interp-multi]. My thinking was that I needed a more
advanced gradient/blending tool than what photo editing programs currently
provide, in order to make a pretty gradient for the icon background!

For those of you who just want to mess about with pretty gradients, you can
[skip ahead to the demo](#demo).


@@ 50,12 38,12 @@ using [Monaco][monaco] to edit JSON input, whilst displaying the result in a
WebGL quad. Here are just some of the abstract masterpieces I generated.

<figure class="figure-grid">
    <img src="/assets/img/rust-wasm-interpolation/artifact.01.png"/>
    <img src="/assets/img/rust-wasm-interpolation/artifact.02.png"/>
    <img src="/assets/img/rust-wasm-interpolation/artifact.03.png"/>
    <img src="/assets/img/rust-wasm-interpolation/artifact.04.png"/>
    <img src="/assets/img/rust-wasm-interpolation/artifact.05.png"/>
    <img src="/assets/img/rust-wasm-interpolation/artifact.06.png"/>
  <img src="artifact.01.png"/>
  <img src="artifact.02.png"/>
  <img src="artifact.03.png"/>
  <img src="artifact.04.png"/>
  <img src="artifact.05.png"/>
  <img src="artifact.06.png"/>
</figure>

Some combinations create some pretty wacky results! I've placed the JSON snippet


@@ 182,11 170,11 @@ is used to compute unknown values within the range of a discrete set of known
points of data. More often than not, this boils down to a weighted average of
said data points.

What I hadn't realized, was that many methods existed for interpolation of $$N$$
number of data points. These methods have endless applications: from obvious
tasks such as image reconstruction or building topographic maps from sparse data
sets; to more creative industries, such as [pose space deformation][psd] for
better shape interpolation of skeleton-driven deformation.
What I hadn't realized, was that many methods existed for interpolation of
\\(N\\) number of data points. These methods have endless applications: from
obvious tasks such as image reconstruction or building topographic maps from
sparse data sets; to more creative industries, such as [pose space
deformation][psd] for better shape interpolation of skeleton-driven deformation.

[Shepard's method][idw], or inverse distance weighting (IDW), is a common method
of multivariate interpolation. To compute the value of an unknown point, it is


@@ 207,7 195,9 @@ option.
One of the interesting properties of the algorithm is that as the power
increases, the colors more closely approximate a [Voronoi diagram][voronoi].

![idw voronoi](/assets/img/rust-wasm-interpolation/idw_voronoi_example.png)
<figure class="figure-grid">
  <img src="rbf_gaussian_example.png"/>
</figure>

As the power increases, a side effect of the algorithm also becomes more
obvious. Whereby if the queried value sits on top of one of the known data


@@ 215,7 205,9 @@ points we end-up computing zero weights.  The naive way to work around this is
to increase the size of the epsilon value used when checking for zero-length
distances.

![idw epsilon](/assets/img/rust-wasm-interpolation/idw_epsilon_example.png)
<figure class="figure-grid">
  <img src="rbf_gaussian_example.png"/>
</figure>

### Radial basis functions (RBF)



@@ 233,37 225,37 @@ One of the key benefits of using RBFs is its ability to generate values
**outside** of the range of known values.[^3] This produces much smoother
functions than IDW. Another nice property of the method is that it can be
evaluated for nearly anything which can define a distance function.  In our
case, we use the Euclidean distance between positions in $$\mathbb{R}^2$$.
case, we use the Euclidean distance between positions in \\(\mathbb{R}^2\\).

The SIGGRAPH paper gives a decent description of the implementation, but for my
own understanding I thought I would regurgitate it with a bit more specificity.
We can essentially express the problem as a matrix multiplication in the form
$$AX = B$$, where:
\\(AX = B\\), where:

- $$A$$ is a square matrix filled with the results of evaluating an RBF kernel
- \\(A\\) is a square matrix filled with the results of evaluating an RBF kernel
  for the distances between every known position with each other, i.e., its size
  will increase exponentially by the number of defined data points.
- $$X$$ is a column vector of (unknown) weights.
- $$B$$ is a column vector of the known values.
- \\(X\\) is a column vector of (unknown) weights.
- \\(B\\) is a column vector of the known values.

Solving the RBF becomes as simple as solving the unknown matrix $$X$$. We can
imagine this as, _"What are the weights $$X$$, so that the RBF will produce the
known values $$B$$ when evaluating it at each of their respective known
Solving the RBF becomes as simple as solving the unknown matrix \\(X\\). We can
imagine this as, _"What are the weights \\(X\\), so that the RBF will produce
the known values \\(B\\) when evaluating it at each of their respective known
positions?"_

Each value in $$B$$ is expected to be a single scalar value. If values have more
components, like our tuples of red, green, and blue, each component is evaluated
independently. Thankfully, nalgebra handles this for us, [solving the systems
simultaneously][nalgebra-solve]. When we enable the `visualize_fields` option in
the [demo](#demo), we can see that each color component is computed
Each value in \\(B\\) is expected to be a single scalar value. If values have
more components, like our tuples of red, green, and blue, each component is
evaluated independently. Thankfully, nalgebra handles this for us, [solving the
systems simultaneously][nalgebra-solve]. When we enable the `visualize_fields`
option in the [demo](#demo), we can see that each color component is computed
independently of the others.

Here we have a comparison of evaluating two different RBF kernels. Gaussian on
the left, and inverse multiquadric on the right.

<figure class="figure-grid">
    <img src="/assets/img/rust-wasm-interpolation/rbf_gaussian_example.png"/>
    <img src="/assets/img/rust-wasm-interpolation/rbf_invmultiquadric_example.png"/>
  <img src="rbf_gaussian_example.png"/>
  <img src="rbf_invmultiquadric_example.png"/>
</figure>

It was quite interesting to compare the two interpolation methods I implemented.


@@ 274,29 266,21 @@ data point become less well-defined, e.g., we can see the green from the bottom
right point "bleeding" more into the red of the bottom left.

<figure class="figure-grid">
    <img src="/assets/img/rust-wasm-interpolation/idw_example.png"/>
    <img src="/assets/img/rust-wasm-interpolation/rbf_example.png"/>
  <img src="idw_example.png"/>
  <img src="rbf_example.png"/>
</figure>

The differences between the two methods are made more obvious when we enable
visualization of the field for each color component.

<figure class="figure-grid">
    <img src="/assets/img/rust-wasm-interpolation/idw_fields_example.png"/>
    <img src="/assets/img/rust-wasm-interpolation/rbf_fields_example.png"/>
  <img src="idw_fields_example.png"/>
  <img src="rbf_fields_example.png"/>
</figure>

# Demo

Here is an embedded demo of scattered color interpolation working almost
You can play around with the demo [**here**][demo]! This is implemented almost
entirely in WASM with the exception of the JSON editor which uses
[Monaco][monaco].

<!-- Colormap has a breakpoint at 800px, so we keep set the iframe at 801px. -->
<iframe style="min-width: 801px; min-height: 410px;" src="https://rycwo.gitlab.io/colormap/"></iframe>

The full-sized demo can be found [here][demo]. The source is available on
[GitLab][demo-src].
[Monaco][monaco]. The source is available on [GitLab][demo-src].

---



@@ 317,27 301,22 @@ and WebAssembly_][wasm-book].  For the "learn-by-example" inclined, take
advantage of the plethora of examples available in the wasm-bindgen
[guide][wasm-bindgen-guide].

Oh, and by-the-way, in case you hadn't noticed: I decided not to use the
gradients in my [new icon][new-icon]!

# Helpful links

- [Scholarpedia on RBFs](http://www.scholarpedia.org/article/Radial_basis_function)
- [RBFs for Geostatistical Analysis](https://pro.arcgis.com/en/pro-app/help/analysis/geostatistical-analyst/how-radial-basis-functions-work.htm)

[^1]: Traditionally-speaking, web apps fail to reach necessary requirements
      without leveraging native hardware (think [React Native][react-native]).
  without leveraging native hardware (think [React Native][react-native]).

[^2]: Some complications with "spawning Web Workers" means Rayon can't be
      compiled to WASM just yet. [But the WG is getting
      there!][wasm-wg-multithreading]
  compiled to WASM just yet. [But the WG is getting
  there!][wasm-wg-multithreading]

[^3]: In fact, I've had to [clamp interpolated values to the standard 8-bit
      color range][demo-src-clamp] in the demo as there were cases where the
      function would produce values over 1.0, which would overflow when casting
      to `u8` color values.

[new-icon]: {{ site.baseurl }}{% post_url 2019-02-27-new-icon %}
  color range][demo-src-clamp] in the demo as there were cases where the
  function would produce values over 1.0, which would overflow when casting to
  `u8` color values.

[basis-functions]: https://en.wikipedia.org/wiki/Basis_function
[color-space]: https://en.wikipedia.org/wiki/Color_space

R assets/img/rust-wasm-interpolation/rbf_example.png => content/blog/rust-wasm-interpolation/rbf_example.png +0 -0
R assets/img/rust-wasm-interpolation/rbf_fields_example.png => content/blog/rust-wasm-interpolation/rbf_fields_example.png +0 -0
R assets/img/rust-wasm-interpolation/rbf_gaussian_example.png => content/blog/rust-wasm-interpolation/rbf_gaussian_example.png +0 -0
R assets/img/rust-wasm-interpolation/rbf_invmultiquadric_example.png => content/blog/rust-wasm-interpolation/rbf_invmultiquadric_example.png +0 -0
D favicon-16x16.png => favicon-16x16.png +0 -0
D favicon-32x32.png => favicon-32x32.png +0 -0
D favicon.ico => favicon.ico +0 -0
D index.html => index.html +0 -14
@@ 1,14 0,0 @@
---
layout: default
---
<ul class="post-list">
  {% for post in site.posts -%}
  <li>
    <p>
      <a class="nav-link" href="{{ post.url | prepend: site.baseurl }}"
      >{{ post.title }}</a>
    </p>
    <h6 class="post-meta">{{ post.date | date: "%B %d, %Y" }}</h6>
  </li>
  {% endfor %}
</ul>

A postcss.config.js => postcss.config.js +20 -0
@@ 0,0 1,20 @@
module.exports = {
  plugins: [
    require('postcss-import'),
    require('postcss-preset-env')({
      stage: 1,
      features: {
        'color-mod-function': {
          unresolved: 'warn'
        },
        'custom-properties': {
          preserve: false
        },
        'nesting-rules': true
      }
    }),
    require('cssnano')({
      autoprefixer: false
    })
  ]
}
\ No newline at end of file

R publickey.txt => static/publickey.txt +0 -0
A static/style.min.css => static/style.min.css +10 -0
@@ 0,0 1,10 @@
@import url("https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/inter.min.css");/*!
 * turretcss v5.2.1
 * https://turretcss.com
 *
 * Licensed under the MIT license.
 * https://www.opensource.org/licenses/mit-license.php
 * 
 * Copyright 2019 Bigfish
 * https://www.bigfish.tv
 *//*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;display:table;max-width:100%;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}html{box-sizing:border-box;text-rendering:optimizeLegibility;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,:after,:before{box-sizing:inherit}:focus{outline:.125rem solid #08c;outline-offset:.125rem}body,html{width:100%;min-height:100%}img{max-width:100%;height:auto}.all-caps:first-child,.control:first-child,.display-title:first-child,.field:first-child,.select:first-child,.table-responsive:first-child,blockquote:first-child,caption:first-child,cite:first-child,dd:first-child,dl:first-child,dt:first-child,fieldset:first-child,figcaption:first-child,h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,hr:first-child,input:first-child,label:first-child,legend:first-child,ol:first-child,ol li:first-child,p:first-child,progress:first-child,table:first-child,textarea:first-child,ul:first-child,ul li:first-child{margin-top:0}.all-caps:last-child,.control:last-child,.display-title:last-child,.field:last-child,.select:last-child,.table-responsive:last-child,blockquote:last-child,caption:last-child,cite:last-child,dd:last-child,dl:last-child,dt:last-child,fieldset:last-child,figcaption:last-child,h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,hr:last-child,input:last-child,label:last-child,legend:last-child,ol:last-child,ol li:last-child,p:last-child,progress:last-child,table:last-child,textarea:last-child,ul:last-child,ul li:last-child{margin-bottom:0}:root{font-size:16px}body{font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-weight:400;color:#2e3138;line-height:1.375;letter-spacing:0;background:#fff}.container{margin:0 auto;padding-left:1rem;padding-right:1rem;width:100%}@media (min-width:1920px){.container{max-width:80rem}}@media (min-width:1680px) and (max-width:1919px){.container{max-width:80rem}}@media (min-width:1280px) and (max-width:1679px){.container{max-width:80rem}}@media (min-width:960px) and (max-width:1279px){.container{max-width:70rem}}@media (min-width:640px) and (max-width:959px){.container{max-width:100%}}@media (min-width:320px) and (max-width:639px){.container{max-width:100%}}@media (max-width:320px){.container{max-width:100%}}.group>ul{display:flex;flex-wrap:wrap;align-items:center;margin:0;padding:0;list-style:none}.group>ul>li{flex:none;margin:0;padding:0}.group-center>ul{justify-content:center}.group-column>ul{flex-direction:column}.group-nowrap>ul{flex-wrap:nowrap}.group-space-between>ul{justify-content:space-between}.group-space-around>ul{justify-content:space-around}.group-space-evenly>ul{justify-content:space-evenly}.group-stretch>ul>li{flex:1 1 0px}.group-xxl>ul{margin:-.875rem}.group-xxl>ul>li{margin:.875rem}.group-xl>ul{margin:-.75rem}.group-xl>ul>li{margin:.75rem}.group-l>ul{margin:-.625rem}.group-l>ul>li{margin:.625rem}.group-m>ul{margin:-.5rem}.group-m>ul>li{margin:.5rem}.group-s>ul{margin:-.375rem}.group-s>ul>li{margin:.375rem}.group-xs>ul{margin:-.25rem}.group-xs>ul>li{margin:.25rem}.group-xxs>ul{margin:-.125rem}.group-xxs>ul>li{margin:.125rem}@page{size:A4;margin:1.5cm 2cm}@media print{*,:after,:before{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a{text-decoration:underline!important}a[href]:after{margin-left:.2em;content:attr(href)}a[href^="#"]:after{content:""}abbr[title]:after{margin-left:.2em;content:attr(title)}pre{border:1px solid #5c6370!important}.control,.field,.media,blockquote,input,pre,textarea{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}table{border-collapse:collapse!important}table td,table th{background-color:#fff!important}}.screen-reader{position:absolute;padding:0;width:1px;height:1px;margin:-1px;border:0;overflow:hidden;clip:rect(0 0 0 0)}.screen-reader-focusable:active,.screen-reader-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin:1em 0 .5em;font-family:inherit;font-weight:600;font-style:normal;color:inherit;line-height:1.375;text-transform:none;letter-spacing:0}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-family:inherit;font-weight:inherit;font-style:inherit;font-size:.6em;color:inherit}.h1,h1{font-size:1.75rem}.h1+.h2,.h1+h2,h1+.h2,h1+h2{margin-top:0}.h2,h2{font-size:1.5rem}.h2+.h3,.h2+h3,h2+.h3,h2+h3{margin-top:0}.h3,h3{font-size:1.25rem}.h3+.h4,.h3+h4,h3+.h4,h3+h4{margin-top:0}.h4,h4{font-size:1.125rem}.h4+.h5,.h4+h5,h4+.h5,h4+h5{margin-top:0}.h5,h5{font-size:1rem}.h5+.h6,.h5+h6,h5+.h6,h5+h6{margin-top:0}.h6,h6{font-size:.875rem}.display-title{margin:.125em 0;font-family:inherit;font-weight:700;font-size:1.5rem;font-style:normal;color:inherit;line-height:1;text-transform:none;letter-spacing:0}.display-title-xxl{font-size:2.5rem}.display-title-xl{font-size:2rem}.display-title-l{font-size:1.75rem}.display-title-s{font-size:1.25rem}.display-title-xs{font-size:1.125rem}.display-title-xxs{font-size:1rem}.all-caps{margin:.5em 0;font-family:inherit;font-weight:600;font-size:.875rem;font-style:normal;color:inherit;line-height:1.25;text-transform:uppercase;letter-spacing:0}.all-caps-xxl{font-size:1.0625rem}.all-caps-xl{font-size:1rem}.all-caps-l{font-size:.9375rem}.all-caps-s{font-size:.8125rem}.all-caps-xs{font-size:.75rem}.all-caps-xxs{font-size:.6875rem}.lead{margin:.5em 0;font-family:inherit;font-weight:inherit;font-size:1.375rem;font-style:normal;color:#5b606b;line-height:1.25;text-transform:none;letter-spacing:0}.lead-xxl{font-size:1.75rem}.lead-xl{font-size:1.625rem}.lead-l{font-size:1.5rem}.lead-s{font-size:1.25rem}.lead-xs{font-size:1.125rem}.lead-xxs,p{font-size:1rem}p{margin:1em 0;font-family:inherit;font-weight:inherit;font-style:normal;color:inherit;line-height:1.5;text-transform:none;letter-spacing:0}a{transition:color .2s ease-in-out,background .2s ease-in-out,border .2s ease-in-out}a,a:focus,a:hover{color:currentColor;text-decoration:underline;-webkit-text-decoration-skip:objects;text-decoration-skip:objects;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}strong{font-weight:600;font-style:inherit}em,strong{font-family:inherit;color:inherit}em{font-weight:inherit;font-style:italic}hr{clear:both;margin:1rem auto;border:0;height:1px;background:#d5d7dd}blockquote{margin:2em 0 2em 2em;padding:0;font-family:inherit;font-weight:inherit;font-size:1rem;font-style:normal;color:#5b606b;line-height:1.25;text-transform:none;letter-spacing:0}blockquote p{font-size:inherit;font-style:inherit;line-height:inherit;text-transform:inherit;letter-spacing:inherit}blockquote p,cite{font-family:inherit;font-weight:inherit;color:inherit}cite{display:block;font-size:.875rem;text-align:inherit;line-height:1.375}cite,ol,ul{margin:1em 0;font-style:normal;text-transform:none;letter-spacing:0}ol,ul{padding:0;font-family:inherit;font-weight:inherit;font-size:1rem;color:inherit;line-height:1.5}ol li,ul li{margin:.5em 0 .5em 1.5em;padding:0 0 0 .5em}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin:.5em 0;padding:0}ol li>ol:first-child,ol li>ul:first-child,ul li>ol:first-child,ul li>ul:first-child{margin:.5em 0}ol li>ol li,ol li>ul li,ul li>ol li,ul li>ul li{margin:.5em 0 .5em 1.5em;padding:0 0 0 .5em}ul,ul li ul{list-style:disc}.list-unstyled{list-style:none}.list-unstyled li{margin-left:0;padding-left:0}.list-inline li{display:inline-block}dl{margin:1em 0;padding:0;font-size:1rem}dt{margin:.5em 0;font-weight:600;line-height:1.375}dd,dt{font-family:inherit;font-size:inherit;font-style:normal;color:inherit;text-transform:none;letter-spacing:0}dd{margin:0 0 1em;font-weight:inherit;line-height:1.5}code{color:#195de6}code,pre{font-family:Monaco,Menlo,Consolas,Courier New,monospace;font-weight:400;font-size:90%;font-style:normal}pre{margin:1em 0;padding:1em;overflow:auto;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;background:#f8f9fa;border:1px solid #d5d7dd;border-radius:.25em}pre,pre code{color:inherit}pre code{font-size:inherit}kbd{margin:0 .2em;padding:.2em .4em;font-family:Monaco,Menlo,Consolas,Courier New,monospace;font-weight:400;font-size:90%;font-style:normal;color:#195de6;background:#f8f9fa;border:1px solid #d5d7dd;border-radius:.25em}mark{margin:0;padding:.2em .4em;font-size:inherit;background:#ff0}.form-message,mark{font-family:inherit;font-weight:inherit;font-style:normal;color:inherit}.form-message{margin:.5em 0;font-size:.875rem;line-height:1.5;text-transform:none;letter-spacing:0}.form-message:empty{display:none}.form-message.error{color:#c00}.form-message.warning{color:#f50}.form-message.success{color:#00b300}.form-message.info{color:#08c}.field{margin:1rem 0}.field .form-message:first-child,.field .select:first-child,.field input:first-child,.field label:first-child,.field textarea:first-child{margin-top:0}.field .form-message:last-child,.field .select:last-child,.field input:last-child,.field label:last-child,.field textarea:last-child{margin-bottom:0}.field-float-label{position:relative}.field-float-label input+label,.field-float-label textarea+label{position:absolute;top:0;left:0;opacity:0;margin:0 1em;padding:.25em;transform:translateY(50%);pointer-events:none;transition:all .2s ease-in-out}.field-float-label input:focus::-moz-placeholder,.field-float-label textarea:focus::-moz-placeholder{opacity:0}.field-float-label input:focus:-ms-input-placeholder,.field-float-label textarea:focus:-ms-input-placeholder{opacity:0}.field-float-label input:focus::placeholder,.field-float-label textarea:focus::placeholder{opacity:0}.field-float-label input:focus+label,.field-float-label textarea:focus+label{opacity:1;transform:translateY(-50%);background-color:transparent;background-image:linear-gradient(180deg,transparent 50%,#f2f2f2 0)}fieldset{display:block;margin:1rem 0;padding:0;border:0 transparent;border-radius:0}legend{padding:0;font-size:1rem}label,legend{font-family:inherit;font-weight:inherit;color:inherit}label{font-size:.875rem}input,label,textarea{display:block;margin:.5em 0;font-style:normal;line-height:1.5;text-transform:none;letter-spacing:0}input,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;padding:0 1em;width:100%;height:2.5rem;font-family:inherit;font-weight:inherit;font-size:1rem;color:inherit;border:1px solid #d5d7dd;background:#fff;border-radius:.25em;box-shadow:none;transition:all .2s ease-in-out}input::-moz-placeholder,textarea::-moz-placeholder{color:inherit;opacity:.5}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:inherit;opacity:.5}input::placeholder,textarea::placeholder{color:inherit;opacity:.5}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1}input:hover,textarea:hover{color:inherit;background:#f9f9f9;border-color:#d0d2d7;box-shadow:none}input:focus,textarea:focus{color:inherit;background:#f2f2f2;border-color:#cacdd2;box-shadow:none}input:disabled,textarea:disabled{pointer-events:none;color:inherit;background:#f2f2f2;border-color:#d5d7dd}input.error,textarea.error{color:#c00!important;border-color:#c00!important}input.warning,textarea.warning{color:#f50!important;border-color:#f50!important}input.success,textarea.success{color:#00b300!important;border-color:#00b300!important}input.info,textarea.info{color:#08c!important;border-color:#08c!important}input[type=search]{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box}input[type=file]{padding:0!important;height:auto!important;font-size:.7em!important;background:transparent!important;border:none!important;box-sizing:border-box!important;box-shadow:none!important}input[type=checkbox],input[type=radio]{display:inline-block;margin-right:10px;width:auto;height:auto;box-shadow:none!important}input[type=checkbox]+p,input[type=radio]+p{margin:0;display:inline-block}input[type=checkbox]+label,input[type=radio]+label{display:inline-block}input[type=checkbox]{-webkit-appearance:checkbox;-moz-appearance:checkbox;appearance:checkbox}input[type=radio]{-webkit-appearance:radio;-moz-appearance:radio;appearance:radio}input[type=color]{display:inline-block;margin:0;padding:0;width:2.5rem;-webkit-appearance:none}input[type=color]::-moz-focus-inner{padding:1px}input[type=color]::-webkit-color-swatch-wrapper{padding:1px}input[type=color]::-moz-color-swatch{border:none}input[type=color]::-webkit-color-swatch{border:none}.input-xxl{height:3.25rem;font-size:1.5rem}.input-xl{height:3rem;font-size:1.25rem}.input-l{height:2.75rem;font-size:1.125rem}.input-s{height:2.25rem;font-size:.875rem}.input-xs{height:2rem;font-size:.75rem}.input-xxs{height:1.75rem;font-size:.625rem}input[type=color].input-xxl{width:3.25rem}input[type=color].input-xl{width:3rem}input[type=color].input-l{width:2.75rem}input[type=color].input-s{width:2.25rem}input[type=color].input-xs{width:2rem}input[type=color].input-xxs{width:1.75rem}.input-group{display:flex}.input-group input{flex:1 1 auto;margin:0}.input-group input:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group .button,.input-group button{flex:0 0 auto}.input-group .button,.input-group button,.input-group input{position:relative}.input-group .button:active,.input-group .button:focus,.input-group .button:hover,.input-group button:active,.input-group button:focus,.input-group button:hover,.input-group input:active,.input-group input:focus,.input-group input:hover{z-index:2}.input-group .button+.button,.input-group .button+button,.input-group .button+input,.input-group button+.button,.input-group button+button,.input-group button+input,.input-group input+.button,.input-group input+button,.input-group input+input{border-top-left-radius:0;border-bottom-left-radius:0}.input-group .button+.button,.input-group .button+button,.input-group .button+input,.input-group button+.button,.input-group button+button,.input-group button+input,.input-group input+.button,.input-group input+button,.input-group input+input{margin-left:-1px}textarea{padding:1em;max-width:100%;height:auto;line-height:inherit;transition:color .2s ease-in-out,background .2s ease-in-out,border .2s ease-in-out}select{display:block;width:100%}.select{position:relative;display:block;margin:.5em 0;font-size:1rem;font-style:normal;line-height:auto;text-transform:none;letter-spacing:0}.select,.select select{font-family:inherit;font-weight:inherit}.select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;margin:0;outline:0;padding:0 1em;height:2.5rem;font-size:inherit;font-style:inherit;color:inherit;line-height:inherit;text-transform:inherit;letter-spacing:inherit;background:#fff;border:1px solid #d5d7dd;border-radius:.25em;box-shadow:none;transition:all .2s ease-in-out}.select select::-moz-focusring{color:transparent;text-shadow:0 0 0 #000}.select select::-ms-expand{display:none}.select select:hover{color:inherit;background:#f9f9f9;border-color:#d0d2d7;box-shadow:none}.select select:focus{color:inherit;background:#f2f2f2;border-color:#cacdd2;box-shadow:none;outline:.125rem solid #08c;outline-offset:.125rem}.select select:disabled{pointer-events:none;color:inherit;background:#f2f2f2;border-color:#d5d7dd}.select.error select{color:#c00!important;border-color:#c00!important}.select.error:after{border-top-color:#c00!important}.select.warning select{color:#f50!important;border-color:#f50!important}.select.warning:after{border-top-color:#f50!important}.select.success select{color:#00b300!important;border-color:#00b300!important}.select.success:after{border-top-color:#00b300!important}.select.info select{color:#08c!important;border-color:#08c!important}.select.info:after{border-top-color:#08c!important}.select:after{position:absolute;top:50%;right:1em;margin-top:-2px;width:0;height:0;content:"";pointer-events:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #2e3138}@moz-document url-prefix(){.select:before{z-index:2;position:absolute;top:0;right:0;bottom:0;content:"";pointer-events:none;width:1em;border:1px solid #d5d7dd;border-left-width:0;background:#fff}.select.large:before{width:1.5em}}.select-xxl select,select.select-xxl{height:3.25rem;font-size:1.5rem}.select-xl select,select.select-xl{height:3rem;font-size:1.25rem}.select-l select,select.select-l{height:2.75rem;font-size:1.125rem}.select-s select,select.select-s{height:2.25rem;font-size:.875rem}.select-xs select,select.select-xs{height:2rem;font-size:.75rem}.select-xxs select,select.select-xxs{height:1.75rem;font-size:.625rem}.control{display:flex;position:relative;margin:.5em 0;padding:0;font-family:inherit;font-weight:inherit;font-size:1rem;font-style:normal;color:inherit;line-height:1.25;text-transform:none;letter-spacing:0;cursor:pointer}.control.control-inline{display:inline-flex;margin-right:2rem}.control:hover .control-indicator{background-color:#f9f9f9;border-color:#d0d2d7;box-shadow:none}.control input[type=checkbox],.control input[type=radio]{z-index:-1;position:absolute;margin:0;opacity:0}.control input[type=checkbox]:focus~.control-indicator,.control input[type=radio]:focus~.control-indicator{background-color:#f2f2f2;border-color:#cacdd2;box-shadow:none;outline:.125rem solid #08c;outline-offset:.125rem}.control input[type=checkbox]:checked~.control-indicator,.control input[type=radio]:checked~.control-indicator{background-color:#195de6;border:1px solid #195de6}.control input[type=checkbox]:checked~.control-label,.control input[type=radio]:checked~.control-label{color:inherit}.control.checkbox .control-indicator{border-radius:.25em}.control.checkbox input[type=checkbox]:checked~.control-indicator{background-color:#195de6;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 16 16"><polyline points="4 8.43 6.67 11 12 5" fill="none" stroke="white" stroke-miterlimit="10" stroke-width="2"/></svg>')}.control.radio .control-indicator{border-radius:1.375rem}.control.radio input[type=radio]:checked~.control-indicator:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);content:"";width:.5em;height:.5em;background:#fff;border-radius:1.375rem}.control.switch .control-indicator{width:2em;border-radius:1.375rem}.control.switch .control-indicator:before{display:block;position:absolute;top:-1px;left:-1px;content:"";width:1em;height:1em;background-color:#fff;border:inherit;border-radius:1.375rem;transition:all .2s ease-in-out}.control.switch input[type=checkbox]:checked~.control-indicator:before{left:calc(100% - 1em + 1px)}.control.error input:checked~.control-indicator{background-color:#c00!important;border-color:#c00!important}.control.warning input:checked~.control-indicator{background-color:#f50!important;border-color:#f50!important}.control.success input:checked~.control-indicator{background-color:#00b300!important;border-color:#00b300!important}.control.info input:checked~.control-indicator{background-color:#08c!important;border-color:#08c!important}.control-indicator{flex:0 0 auto;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:1em;height:1em;font-size:1.375rem;line-height:1;text-align:center;background-color:#fff;background-position:50%;background-repeat:no-repeat;border:1px solid #d5d7dd;box-shadow:none}.control-indicator,.control-label{display:block;transition:all .2s ease-in-out}.control-label{flex:1 1 auto;margin:0 0 0 .75em;color:inherit}.control-reversed>.control-label{order:1;margin:0}.control-reversed>.control-indicator{order:2;margin:0 0 0 .75em}.control-xxl{font-size:1.5rem}.control-xxl .control-indicator{font-size:1.75rem}.control-xl{font-size:1.25rem}.control-xl .control-indicator{font-size:1.625rem}.control-l{font-size:1.125rem}.control-l .control-indicator{font-size:1.5rem}.control-s{font-size:.875rem}.control-s .control-indicator{font-size:1.25rem}.control-xs{font-size:.75rem}.control-xs .control-indicator{font-size:1.125rem}.control-xxs{font-size:.625rem}.control-xxs .control-indicator{font-size:1rem}input[type=range]{margin:1rem 0;padding:0;width:100%;height:auto;font-size:.625rem;color:#d5d7dd;border:none;background:transparent;border-radius:.25em;box-shadow:none!important;-webkit-appearance:none;transition:all .2s ease-in-out}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-.5em;height:2em;width:2em;background:#fff;border:1px solid #d5d7dd;border-radius:50%}input[type=range]::-webkit-slider-runnable-track,input[type=range]::-webkit-slider-thumb{cursor:pointer;box-shadow:none;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}input[type=range]::-webkit-slider-runnable-track{width:100%;height:1em;background:currentColor;border:0;border-radius:.25em}input[type=range]::-moz-range-thumb{height:2em;width:2em;background:#fff;border:1px solid #d5d7dd;border-radius:50%}input[type=range]::-moz-range-thumb,input[type=range]::-moz-range-track{cursor:pointer;box-shadow:none;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}input[type=range]::-moz-range-track{width:100%;height:1em;background:currentColor;border:0;border-radius:.25em}input[type=range]::-ms-thumb{height:2em;width:2em;cursor:pointer;background:#fff;border:1px solid #d5d7dd;border-radius:50%;box-shadow:none;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}input[type=range]::-ms-fill-lower,input[type=range]::-ms-fill-upper{width:100%;height:1em;cursor:pointer;background:currentColor;border:0;border-radius:.25em;box-shadow:none;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}input[type=range]::-ms-track{width:100%;height:1em;cursor:pointer;background:currentColor;border:0;border-radius:.25em;box-shadow:none;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;color:transparent}input[type=range]:hover{color:#d0d2d7;background:transparent}input[type=range]:hover::-webkit-slider-thumb{background:#f9f9f9}input[type=range]:hover::-webkit-slider-runnable-track{border-color:none;box-shadow:none}input[type=range]:hover::-moz-range-thumb{border-color:#d0d2d7}input[type=range]:hover::-ms-thumb{box-shadow:none}input[type=range]:hover::-ms-fill-lower,input[type=range]:hover::-ms-fill-upper{border-color:none;box-shadow:none}input[type=range]:hover::-ms-track{border-color:none;box-shadow:none}input[type=range]:focus{color:#cacdd2;background:transparent}input[type=range]:focus::-webkit-slider-thumb{background:#f2f2f2;border-color:#cacdd2;box-shadow:none}input[type=range]:focus::-webkit-slider-runnable-track{border-color:none;box-shadow:none}input[type=range]:focus::-moz-range-thumb,input[type=range]:focus::-moz-range-track{background:#f2f2f2;border-color:#cacdd2;box-shadow:none}input[type=range]:focus::-ms-thumb{background:#f2f2f2;border-color:#cacdd2;box-shadow:none}input[type=range]:focus::-ms-fill-lower,input[type=range]:focus::-ms-fill-upper{border-color:none;box-shadow:none}input[type=range]:focus::-ms-track{border-color:none;box-shadow:none}input[type=range].error{color:#c00!important}input[type=range].warning{color:#f50!important}input[type=range].success{color:#00b300!important}input[type=range].info{color:#08c!important}input[type=range]:disabled{pointer-events:none}input[type=range].range-xxl{font-size:1rem}input[type=range].range-xl{font-size:.875rem}input[type=range].range-l{font-size:.75rem}input[type=range].range-s{font-size:.5rem}input[type=range].range-xs{font-size:.375rem}input[type=range].range-xxs{font-size:.25rem}progress{display:block;margin:.5em 0;width:100%;height:.625rem}progress[value]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;color:#195de6}progress[value]::-webkit-progress-bar{background:#d5d7dd;border:0;border-radius:1rem;box-shadow:none}progress[value]::-webkit-progress-value{background:currentColor;border-radius:1rem}progress[value].error{color:#c00!important}progress[value].warning{color:#f50!important}progress[value].success{color:#00b300!important}progress[value].info{color:#08c!important}@-moz-document url-prefix(){progress[value]{background:#d5d7dd;border:0;border-radius:1rem;box-shadow:none}progress[value]::-moz-progress-bar{border-radius:1rem}}.progress-xxl{height:1rem}.progress-xl{height:.875rem}.progress-l{height:.75rem}.progress-s{height:.5rem}.progress-xs{height:.375rem}.progress-xxs{height:.25rem}.button,button{display:inline-block;padding:calc(.75rem - 1px) 1em;min-width:2.5rem;height:2.5rem;font-family:inherit;font-weight:600;line-height:1;font-size:1rem;color:#2e3138;letter-spacing:0;text-align:center;text-transform:none;text-decoration:none;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #d5d7dd;border-radius:.25em;box-shadow:none;transition:all .2s ease-in-out}.button:focus,.button:hover,button:focus,button:hover{text-decoration:none;color:#2e3138;background:#f9f9f9;border-color:#d0d2d7;box-shadow:none}.button:active,button:active{color:#2e3138;background:#f2f2f2;border-color:#cacdd2;box-shadow:none}.button.spinner,button.spinner{color:transparent!important}.button.spinner:before,button.spinner:before{margin-top:-.5em;margin-left:-.5em;width:1em;height:1em}.button svg,button svg{width:1rem;height:1rem;fill:currentColor}.button-error,.button.error,button.error{color:#fff;background:#c00;border-color:#c00}.button-error.button-border,.button.error.button-border,button.error.button-border{color:#c00;background:transparent}.button-error:focus,.button-error:hover,.button.error:focus,.button.error:hover,button.error:focus,button.error:hover{color:#fff;background:#d41717;border-color:#d41717}.button-error:active,.button.error:active,button.error:active{color:#fff;background:#ad0000;border-color:#ad0000}.button-error.button-text,.button.error.button-text,button.error.button-text{color:#c00}.button-error.button-text:focus,.button-error.button-text:hover,.button.error.button-text:focus,.button.error.button-text:hover,button.error.button-text:focus,button.error.button-text:hover{color:#d41717}.button-error.button-text:active,.button.error.button-text:active,button.error.button-text:active{color:#ad0000}.button-warning,.button.warning,button.warning{color:#fff;background:#f50;border-color:#f50}.button-warning.button-border,.button.warning.button-border,button.warning.button-border{color:#f50;background:transparent}.button-warning:focus,.button-warning:hover,.button.warning:focus,.button.warning:hover,button.warning:focus,button.warning:hover{color:#fff;background:#ff661a;border-color:#ff661a}.button-warning:active,.button.warning:active,button.warning:active{color:#fff;background:#d94800;border-color:#d94800}.button-warning.button-text,.button.warning.button-text,button.warning.button-text{color:#f50}.button-warning.button-text:focus,.button-warning.button-text:hover,.button.warning.button-text:focus,.button.warning.button-text:hover,button.warning.button-text:focus,button.warning.button-text:hover{color:#ff661a}.button-warning.button-text:active,.button.warning.button-text:active,button.warning.button-text:active{color:#d94800}.button-success,.button.success,button.success{color:#fff;background:#00b300;border-color:#00b300}.button-success.button-border,.button.success.button-border,button.success.button-border{color:#00b300;background:transparent}.button-success:focus,.button-success:hover,.button.success:focus,.button.success:hover,button.success:focus,button.success:hover{color:#fff;background:#17bd17;border-color:#17bd17}.button-success:active,.button.success:active,button.success:active{color:#fff;background:#009800;border-color:#009800}.button-success.button-text,.button.success.button-text,button.success.button-text{color:#00b300}.button-success.button-text:focus,.button-success.button-text:hover,.button.success.button-text:focus,.button.success.button-text:hover,button.success.button-text:focus,button.success.button-text:hover{color:#17bd17}.button-success.button-text:active,.button.success.button-text:active,button.success.button-text:active{color:#009800}.button-info,.button.info,button.info{color:#fff;background:#08c;border-color:#08c}.button-info.button-border,.button.info.button-border,button.info.button-border{color:#08c;background:transparent}.button-info:focus,.button-info:hover,.button.info:focus,.button.info:hover,button.info:focus,button.info:hover{color:#fff;background:#1795d4;border-color:#1795d4}.button-info:active,.button.info:active,button.info:active{color:#fff;background:#0074ad;border-color:#0074ad}.button-info.button-text,.button.info.button-text,button.info.button-text{color:#08c}.button-info.button-text:focus,.button-info.button-text:hover,.button.info.button-text:focus,.button.info.button-text:hover,button.info.button-text:focus,button.info.button-text:hover{color:#1795d4}.button-info.button-text:active,.button.info.button-text:active,button.info.button-text:active{color:#0074ad}.button.button-text,button.button-text{padding:0}.button.button-text,.button.button-text:active,.button.button-text:focus,.button.button-text:hover,button.button-text,button.button-text:active,button.button-text:focus,button.button-text:hover{background-color:transparent;border-color:transparent}.button[disabled],button:disabled{pointer-events:none;opacity:.65}[role=button]{cursor:pointer}.button-block{display:block;width:100%;text-align:center}.button-border{background:transparent}.button-square{padding:calc(.75rem - 1px)}.button-pill{border-radius:1.25rem}.button-xxl{padding:calc(.875rem - 1px) 1em;min-width:3.25rem;height:3.25rem;font-size:1.5rem}.button-xxl svg{width:1.5rem;height:1.5rem}.button-xxl.button-square{padding:calc(.875rem - 1px)}.button-xxl.button-pill{border-radius:1.625rem}.button-xl{padding:calc(.875rem - 1px) 1em;min-width:3rem;height:3rem;font-size:1.25rem}.button-xl svg{width:1.25rem;height:1.25rem}.button-xl.button-square{padding:calc(.875rem - 1px)}.button-xl.button-pill{border-radius:1.5rem}.button-l{padding:calc(.8125rem - 1px) 1em;min-width:2.75rem;height:2.75rem;font-size:1.125rem}.button-l svg{width:1.125rem;height:1.125rem}.button-l.button-square{padding:calc(.8125rem - 1px)}.button-l.button-pill{border-radius:1.375rem}.button-s{padding:calc(.6875rem - 1px) 1em;min-width:2.25rem;height:2.25rem;font-size:.875rem}.button-s svg{width:.875rem;height:.875rem}.button-s.button-square{padding:calc(.6875rem - 1px)}.button-s.button-pill{border-radius:1.125rem}.button-xs{padding:calc(.625rem - 1px) 1em;min-width:2rem;height:2rem;font-size:.75rem}.button-xs svg{width:.75rem;height:.75rem}.button-xs.button-square{padding:calc(.625rem - 1px)}.button-xs.button-pill{border-radius:1rem}.button-xxs{padding:calc(.5625rem - 1px) 1em;min-width:1.75rem;height:1.75rem;font-size:.625rem}.button-xxs svg{width:.625rem;height:.625rem}.button-xxs.button-square{padding:calc(.5625rem - 1px)}.button-xxs.button-pill{border-radius:.875rem}.button-white{color:#000;background:#fff;border-color:#fff}.button-white.button-border{color:#fff;background:transparent}.button-white:focus,.button-white:hover{color:#000;background:#f2f2f2;border-color:#f2f2f2}.button-white:active{color:#000;background:#e6e6e6;border-color:#e6e6e6}.button-white.button-text{color:#fff}.button-white.button-text:focus,.button-white.button-text:hover{color:#f2f2f2}.button-white.button-text:active{color:#e6e6e6}.button-light{color:#2e3138;background:#d5d7dd;border-color:#d5d7dd}.button-light.button-border{color:#d5d7dd;background:transparent}.button-light:focus,.button-light:hover{color:#2e3138;background:#d9dbe0;border-color:#d9dbe0}.button-light:active{color:#2e3138;background:#c8ccd4;border-color:#c8ccd4}.button-light.button-text{color:#d5d7dd}.button-light.button-text:focus,.button-light.button-text:hover{color:#d9dbe0}.button-light.button-text:active{color:#c8ccd4}.button-grey{color:#fff;background:#5c6370;border-color:#5c6370}.button-grey.button-border{color:#5c6370;background:transparent}.button-grey:focus,.button-grey:hover{color:#fff;background:#697181;border-color:#697181}.button-grey:active{color:#fff;background:#555d6d;border-color:#555d6d}.button-grey.button-text{color:#5c6370}.button-grey.button-text:focus,.button-grey.button-text:hover{color:#697181}.button-grey.button-text:active{color:#555d6d}.button-dark{color:#fff;background:#2e3138;border-color:#2e3138}.button-dark.button-border{color:#2e3138;background:transparent}.button-dark:focus,.button-dark:hover{color:#fff;background:#41454e;border-color:#41454e}.button-dark:active{color:#fff;background:#2a2e37;border-color:#2a2e37}.button-dark.button-text{color:#2e3138}.button-dark.button-text:focus,.button-dark.button-text:hover{color:#41454e}.button-dark.button-text:active{color:#2a2e37}.button-black{color:#fff;background:#000;border-color:#000}.button-black.button-border{color:#000;background:transparent}.button-black:focus,.button-black:hover{color:#fff;background:#333;border-color:#333}.button-black:active{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.button-black.button-text{color:#000}.button-black.button-text:focus,.button-black.button-text:hover{color:#333}.button-black.button-text:active{color:#1a1a1a}.button-primary{color:#fff;background:#195de6;border-color:#195de6}.button-primary.button-border{color:#195de6;background:transparent}.button-primary:focus,.button-primary:hover{color:#fff;background:#2e6deb;border-color:#2e6deb}.button-primary:active{color:#fff;background:#134fc6;border-color:#134fc6}.button-primary.button-text{color:#195de6}.button-primary.button-text:focus,.button-primary.button-text:hover{color:#2e6deb}.button-primary.button-text:active{color:#134fc6}.button-secondary{color:#fff;background:#7f19e6;border-color:#7f19e6}.button-secondary.button-border{color:#7f19e6;background:transparent}.button-secondary:focus,.button-secondary:hover{color:#fff;background:#8c2eeb;border-color:#8c2eeb}.button-secondary:active{color:#fff;background:#6c13c6;border-color:#6c13c6}.button-secondary.button-text{color:#7f19e6}.button-secondary.button-text:focus,.button-secondary.button-text:hover{color:#8c2eeb}.button-secondary.button-text:active{color:#6c13c6}.button-tertiary{color:#fff;background:#e619a1;border-color:#e619a1}.button-tertiary.button-border{color:#e619a1;background:transparent}.button-tertiary:focus,.button-tertiary:hover{color:#fff;background:#eb2eac;border-color:#eb2eac}.button-tertiary:active{color:#fff;background:#c6138a;border-color:#c6138a}.button-tertiary.button-text{color:#e619a1}.button-tertiary.button-text:focus,.button-tertiary.button-text:hover{color:#eb2eac}.button-tertiary.button-text:active{color:#c6138a}.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-icon.button-square{padding:calc(.5rem - 1px)}.button-icon span,.button-icon svg{vertical-align:middle}.button-icon svg{display:inline-block;width:1.5rem;height:1.5rem}.button-icon svg:not(:first-child){margin-left:.8em}.button-icon svg:not(:last-child){margin-right:.8em}a.button-icon{display:inline-flex;align-items:center}a.button-icon.button-block{display:flex;justify-content:space-between}a.button-icon span,a.button-icon svg{flex:none}.button-xxs.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-xxs.button-icon.button-square{padding:calc(.5rem - 1px)}.button-xxs.button-icon svg{width:.75rem;height:.75rem}.button-xs.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-xs.button-icon.button-square{padding:calc(.5rem - 1px)}.button-xs.button-icon svg{width:1rem;height:1rem}.button-s.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-s.button-icon.button-square{padding:calc(.5rem - 1px)}.button-s.button-icon svg{width:1.25rem;height:1.25rem}.button-l.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-l.button-icon.button-square{padding:calc(.5rem - 1px)}.button-l.button-icon svg{width:1.75rem;height:1.75rem}.button-xl.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-xl.button-icon.button-square{padding:calc(.5rem - 1px)}.button-xl.button-icon svg{width:2rem;height:2rem}.button-xxl.button-icon{padding-top:calc(.5rem - 1px);padding-bottom:calc(.5rem - 1px)}.button-xxl.button-icon.button-square{padding:calc(.5rem - 1px)}.button-xxl.button-icon svg{width:2.25rem;height:2.25rem}.button-group{display:flex}.button-group>*{position:relative;flex:0 0 auto}.button-group>:active,.button-group>:focus,.button-group>:hover{z-index:2}.button-group>:not(:first-child):not(:last-child){border-radius:0;margin-left:-1px}.button-group>:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.button-group>:last-child{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.button-group-block{width:100%}.button-group-block .button,.button-group-block button{flex:1 1 auto}figure{display:block;margin:0;padding:0}figcaption{margin:1em 0;font-family:inherit;font-weight:inherit;font-size:.875rem;color:inherit;text-align:left}.media{display:block;position:relative;overflow:hidden;background:rgba(0,0,0,.1);border-radius:.25em}.media>.media-inner,.media>canvas,.media>iframe,.media>img,.media>svg,.media>video{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;border-radius:inherit}.media>canvas,.media>img,.media>video{-o-object-fit:cover;object-fit:cover}.media-cover{position:absolute;top:0;right:0;bottom:0;left:0}.media-cover,.media-cover>div{width:100%;height:100%}.media-cover img,.media-cover video{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.media-1{padding-top:100%}.media-1-2{padding-top:200%}.media-9-16{padding-top:177.77778%}.media-9-14{padding-top:155.55556%}.media-2-3{padding-top:150%}.media-3-4{padding-top:133.33333%}.media-4-5{padding-top:125%}.media-4-3{padding-top:75%}.media-3-2{padding-top:66.66667%}.media-5-4{padding-top:80%}.media-16-9{padding-top:56.25%}.media-2-1{padding-top:50%}.nav ul,nav ul{margin:0;list-style:none}.nav li,nav li{margin:1rem 0;padding:0}.nav-inline li{display:inline-block;margin:0 1rem}.spinner{position:relative}.spinner:before{display:block;position:absolute;top:50%;left:50%;margin-top:-.875rem;margin-left:-.875rem;width:1.75rem;height:1.75rem;content:"";border-radius:50%;border:.125rem solid rgba(0,0,0,.1);border-left-color:#fff;-webkit-animation:spin .5s linear infinite;animation:spin .5s linear infinite}.spinner-xxl:before{margin-top:-1.25rem;margin-left:-1.25rem;width:2.5rem;height:2.5rem}.spinner-xl:before{margin-top:-1.125rem;margin-left:-1.125rem;width:2.25rem;height:2.25rem}.spinner-l:before{margin-top:-1rem;margin-left:-1rem;width:2rem;height:2rem}.spinner-s:before{margin-top:-.75rem;margin-left:-.75rem;width:1.5rem;height:1.5rem}.spinner-xs:before{margin-top:-.625rem;margin-left:-.625rem;width:1.25rem;height:1.25rem}.spinner-xxs:before{margin-top:-.5rem;margin-left:-.5rem;width:1rem;height:1rem}table{margin:1em 0;width:100%;background:#fff;border:1px solid #d5d7dd;border-radius:.25em;border-collapse:collapse}caption{margin:1em 0}caption,th{font-family:inherit;font-weight:inherit;font-size:inherit;color:inherit;text-align:left}th{text-transform:none;background:#f8f9fa}td,th{padding:.5em;border:1px solid #d5d7dd}td{font-family:inherit;font-weight:inherit;font-size:inherit;color:inherit;line-height:1.375;vertical-align:middle}.table-responsive{margin:1em 0;overflow-x:auto;min-height:.01%}@media (min-width:640px) and (max-width:959px){.table-responsive{width:100%;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #d5d7dd}.table-responsive>table{margin:0;border:none}.table-responsive>table td,.table-responsive>table th{white-space:nowrap}.table-responsive>table td:first-child,.table-responsive>table th:first-child{border-left:none}.table-responsive>table td:last-child,.table-responsive>table th:last-child{border-right:none}.table-responsive>table tr:first-child>td,.table-responsive>table tr:first-child>th{border-top:none}.table-responsive>table tr:last-child>td,.table-responsive>table tr:last-child>th{border-bottom:none}}.background-repeat{background-repeat:repeat}.background-no-repeat{background-repeat:no-repeat}.background-fixed{background-attachment:fixed}.background-cover{background-size:cover}.background-center{background-position:50%}.background-transparent{background:transparent}.background-current-color{background-color:currentColor}.background-inherit{background-color:inherit}.background,.background-white{background-color:#fff}.background-black{background-color:#000}.background-light{background-color:#d5d7dd}.background-light-50{background-color:#f8f9fa}.background-light-100{background-color:#f2f3f5}.background-light-200{background-color:#e9ebee}.background-light-300{background-color:#e0e2e7}.background-light-400{background-color:#d9dbe0}.background-light-500{background-color:#d5d7dd}.background-light-600{background-color:#c8ccd4}.background-light-700{background-color:#b0b6c2}.background-light-800{background-color:#9199aa}.background-light-900{background-color:#6e798e}.background-grey{background-color:#5c6370}.background-grey-50{background-color:#c5cbd7}.background-grey-100{background-color:#adb5c4}.background-grey-200{background-color:#949dae}.background-grey-300{background-color:#7d8697}.background-grey-400{background-color:#697181}.background-grey-500{background-color:#5c6370}.background-grey-600{background-color:#555d6d}.background-grey-700{background-color:#4a5364}.background-grey-800{background-color:#3d4657}.background-grey-900{background-color:#2f3747}.background-dark{background-color:#2e3138}.background-dark-50{background-color:#b5bbc6}.background-dark-100{background-color:#989eab}.background-dark-200{background-color:#797f8c}.background-dark-300{background-color:#5b606b}.background-dark-400{background-color:#41454e}.background-dark-500{background-color:#2e3138}.background-dark-600{background-color:#2a2e37}.background-dark-700{background-color:#252932}.background-dark-800{background-color:#1f232c}.background-dark-900{background-color:#181c24}.background-primary{background-color:#195de6}.background-primary-50{background-color:#e1ebfe}.background-primary-100{background-color:#b6cdfb}.background-primary-200{background-color:#87acf7}.background-primary-300{background-color:#5589f1}.background-primary-400{background-color:#2e6deb}.background-primary-500{background-color:#195de6}.background-primary-600{background-color:#134fc6}.background-primary-700{background-color:#0d3ea0}.background-primary-800{background-color:#082e7a}.background-primary-900{background-color:#052056}.background-secondary{background-color:#7f19e6}.background-secondary-50{background-color:#f2e6fe}.background-secondary-100{background-color:#dfc2fc}.background-secondary-200{background-color:#bf87f7}.background-secondary-300{background-color:#a355f1}.background-secondary-400{background-color:#8c2eeb}.background-secondary-500{background-color:#7f19e6}.background-secondary-600{background-color:#6c13c6}.background-secondary-700{background-color:#570da0}.background-secondary-800{background-color:#41087a}.background-secondary-900{background-color:#2e0556}.background-tertiary{background-color:#e619a1}.background-tertiary-50{background-color:#fee6f6}.background-tertiary-100{background-color:#fcc2e9}.background-tertiary-200{background-color:#f787d1}.background-tertiary-300{background-color:#f155bd}.background-tertiary-400{background-color:#eb2eac}.background-tertiary-500{background-color:#e619a1}.background-tertiary-600{background-color:#c6138a}.background-tertiary-700{background-color:#a00d6f}.background-tertiary-800{background-color:#7a0854}.background-tertiary-900{background-color:#56053b}.background-error{background-color:#c00}.background-error-50{background-color:#fce3e3}.background-error-100{background-color:#f6bbbb}.background-error-200{background-color:#eb7979}.background-error-300{background-color:#df4242}.background-error-400{background-color:#d41717}.background-error-500{background-color:#c00}.background-error-600{background-color:#ad0000}.background-error-700{background-color:#8b0000}.background-error-800{background-color:#680000}.background-error-900{background-color:#490000}.background-warning{background-color:#f50}.background-warning-50{background-color:#ffeee5}.background-warning-100{background-color:#ffd4bf}.background-warning-200{background-color:#ffa97e}.background-warning-300{background-color:#ff8547}.background-warning-400{background-color:#ff661a}.background-warning-500{background-color:#f50}.background-warning-600{background-color:#d94800}.background-warning-700{background-color:#ad3a00}.background-warning-800{background-color:#822b00}.background-warning-900{background-color:#5b1e00}.background-success{background-color:#00b300}.background-success-50{background-color:#e3f9e3}.background-success-100{background-color:#bbf0bb}.background-success-200{background-color:#79de79}.background-success-300{background-color:#42cd42}.background-success-400{background-color:#17bd17}.background-success-500{background-color:#00b300}.background-success-600{background-color:#009800}.background-success-700{background-color:#007900}.background-success-800{background-color:#005b00}.background-success-900{background-color:#004000}.background-info{background-color:#08c}.background-info-50{background-color:#e3f4fc}.background-info-100{background-color:#bbe2f6}.background-info-200{background-color:#79c5eb}.background-info-300{background-color:#42abdf}.background-info-400{background-color:#1795d4}.background-info-500{background-color:#08c}.background-info-600{background-color:#0074ad}.background-info-700{background-color:#005c8b}.background-info-800{background-color:#004568}.background-info-900{background-color:#003149}.border-radius-none,.no-border-radius{border-radius:0}.border-radius{border-radius:.25em}.border-radius-top{border-top-left-radius:.25em;border-top-right-radius:.25em}.border-radius-right{border-top-right-radius:.25em;border-bottom-right-radius:.25em}.border-radius-bottom{border-bottom-left-radius:.25em;border-bottom-right-radius:.25em}.border-radius-left{border-bottom-left-radius:.25em}.border-radius-left,.border-radius-top-left{border-top-left-radius:.25em}.border-radius-top-right{border-top-right-radius:.25em}.border-radius-bottom-left{border-bottom-left-radius:.25em}.border-radius-bottom-right{border-bottom-right-radius:.25em}.no-border{border:none!important}.border{border:1px solid #d5d7dd}.border-vertical{border-top:1px solid #d5d7dd;border-bottom:1px solid #d5d7dd}.border-horizontal{border-left:1px solid #d5d7dd;border-right:1px solid #d5d7dd}.border-top{border-top:1px solid #d5d7dd}.border-right{border-right:1px solid #d5d7dd}.border-bottom{border-bottom:1px solid #d5d7dd}.border-left{border-left:1px solid #d5d7dd}.border-color-current-color{border-color:currentColor}.border-color-inherit{border-color:inherit}.border-color-white{border-color:#fff}.border-color-black{border-color:#000}.border-color-light{border-color:#d5d7dd}.border-color-light-50{border-color:#f8f9fa}.border-color-light-100{border-color:#f2f3f5}.border-color-light-200{border-color:#e9ebee}.border-color-light-300{border-color:#e0e2e7}.border-color-light-400{border-color:#d9dbe0}.border-color-light-500{border-color:#d5d7dd}.border-color-light-600{border-color:#c8ccd4}.border-color-light-700{border-color:#b0b6c2}.border-color-light-800{border-color:#9199aa}.border-color-light-900{border-color:#6e798e}.border-color-grey{border-color:#5c6370}.border-color-grey-50{border-color:#c5cbd7}.border-color-grey-100{border-color:#adb5c4}.border-color-grey-200{border-color:#949dae}.border-color-grey-300{border-color:#7d8697}.border-color-grey-400{border-color:#697181}.border-color-grey-500{border-color:#5c6370}.border-color-grey-600{border-color:#555d6d}.border-color-grey-700{border-color:#4a5364}.border-color-grey-800{border-color:#3d4657}.border-color-grey-900{border-color:#2f3747}.border-color-dark{border-color:#2e3138}.border-color-dark-50{border-color:#b5bbc6}.border-color-dark-100{border-color:#989eab}.border-color-dark-200{border-color:#797f8c}.border-color-dark-300{border-color:#5b606b}.border-color-dark-400{border-color:#41454e}.border-color-dark-500{border-color:#2e3138}.border-color-dark-600{border-color:#2a2e37}.border-color-dark-700{border-color:#252932}.border-color-dark-800{border-color:#1f232c}.border-color-dark-900{border-color:#181c24}.border-color-primary{border-color:#195de6}.border-color-primary-50{border-color:#e1ebfe}.border-color-primary-100{border-color:#b6cdfb}.border-color-primary-200{border-color:#87acf7}.border-color-primary-300{border-color:#5589f1}.border-color-primary-400{border-color:#2e6deb}.border-color-primary-500{border-color:#195de6}.border-color-primary-600{border-color:#134fc6}.border-color-primary-700{border-color:#0d3ea0}.border-color-primary-800{border-color:#082e7a}.border-color-primary-900{border-color:#052056}.border-color-secondary{border-color:#7f19e6}.border-color-secondary-50{border-color:#f2e6fe}.border-color-secondary-100{border-color:#dfc2fc}.border-color-secondary-200{border-color:#bf87f7}.border-color-secondary-300{border-color:#a355f1}.border-color-secondary-400{border-color:#8c2eeb}.border-color-secondary-500{border-color:#7f19e6}.border-color-secondary-600{border-color:#6c13c6}.border-color-secondary-700{border-color:#570da0}.border-color-secondary-800{border-color:#41087a}.border-color-secondary-900{border-color:#2e0556}.border-color-tertiary{border-color:#e619a1}.border-color-tertiary-50{border-color:#fee6f6}.border-color-tertiary-100{border-color:#fcc2e9}.border-color-tertiary-200{border-color:#f787d1}.border-color-tertiary-300{border-color:#f155bd}.border-color-tertiary-400{border-color:#eb2eac}.border-color-tertiary-500{border-color:#e619a1}.border-color-tertiary-600{border-color:#c6138a}.border-color-tertiary-700{border-color:#a00d6f}.border-color-tertiary-800{border-color:#7a0854}.border-color-tertiary-900{border-color:#56053b}.border-color-error{border-color:#c00}.border-color-error-50{border-color:#fce3e3}.border-color-error-100{border-color:#f6bbbb}.border-color-error-200{border-color:#eb7979}.border-color-error-300{border-color:#df4242}.border-color-error-400{border-color:#d41717}.border-color-error-500{border-color:#c00}.border-color-error-600{border-color:#ad0000}.border-color-error-700{border-color:#8b0000}.border-color-error-800{border-color:#680000}.border-color-error-900{border-color:#490000}.border-color-warning{border-color:#f50}.border-color-warning-50{border-color:#ffeee5}.border-color-warning-100{border-color:#ffd4bf}.border-color-warning-200{border-color:#ffa97e}.border-color-warning-300{border-color:#ff8547}.border-color-warning-400{border-color:#ff661a}.border-color-warning-500{border-color:#f50}.border-color-warning-600{border-color:#d94800}.border-color-warning-700{border-color:#ad3a00}.border-color-warning-800{border-color:#822b00}.border-color-warning-900{border-color:#5b1e00}.border-color-success{border-color:#00b300}.border-color-success-50{border-color:#e3f9e3}.border-color-success-100{border-color:#bbf0bb}.border-color-success-200{border-color:#79de79}.border-color-success-300{border-color:#42cd42}.border-color-success-400{border-color:#17bd17}.border-color-success-500{border-color:#00b300}.border-color-success-600{border-color:#009800}.border-color-success-700{border-color:#007900}.border-color-success-800{border-color:#005b00}.border-color-success-900{border-color:#004000}.border-color-info{border-color:#08c}.border-color-info-50{border-color:#e3f4fc}.border-color-info-100{border-color:#bbe2f6}.border-color-info-200{border-color:#79c5eb}.border-color-info-300{border-color:#42abdf}.border-color-info-400{border-color:#1795d4}.border-color-info-500{border-color:#08c}.border-color-info-600{border-color:#0074ad}.border-color-info-700{border-color:#005c8b}.border-color-info-800{border-color:#004568}.border-color-info-900{border-color:#003149}.box-shadow-xxl{box-shadow:0 1px 10px 1px rgba(46,49,56,.1)}.box-shadow-xl{box-shadow:0 1px 8px 1px rgba(46,49,56,.1)}.box-shadow-l{box-shadow:0 1px 6px 1px rgba(46,49,56,.1)}.box-shadow-m{box-shadow:0 1px 4px 1px rgba(46,49,56,.1)}.box-shadow-s{box-shadow:0 1px 2px 1px rgba(46,49,56,.1)}.box-shadow-xs{box-shadow:0 1px 1px 1px rgba(46,49,56,.1)}.box-shadow-xxs{box-shadow:0 0 1px rgba(46,49,56,.1)}.box-shadow{box-shadow:none}.current-color{color:currentColor}.color-inherit{color:inherit}.color{color:#2e3138}.color-white{color:#fff}.color-black{color:#000}.color-light{color:#d5d7dd}.color-light-50{color:#f8f9fa}.color-light-100{color:#f2f3f5}.color-light-200{color:#e9ebee}.color-light-300{color:#e0e2e7}.color-light-400{color:#d9dbe0}.color-light-500{color:#d5d7dd}.color-light-600{color:#c8ccd4}.color-light-700{color:#b0b6c2}.color-light-800{color:#9199aa}.color-light-900{color:#6e798e}.color-grey{color:#5c6370}.color-grey-50{color:#c5cbd7}.color-grey-100{color:#adb5c4}.color-grey-200{color:#949dae}.color-grey-300{color:#7d8697}.color-grey-400{color:#697181}.color-grey-500{color:#5c6370}.color-grey-600{color:#555d6d}.color-grey-700{color:#4a5364}.color-grey-800{color:#3d4657}.color-grey-900{color:#2f3747}.color-dark{color:#2e3138}.color-dark-50{color:#b5bbc6}.color-dark-100{color:#989eab}.color-dark-200{color:#797f8c}.color-dark-300{color:#5b606b}.color-dark-400{color:#41454e}.color-dark-500{color:#2e3138}.color-dark-600{color:#2a2e37}.color-dark-700{color:#252932}.color-dark-800{color:#1f232c}.color-dark-900{color:#181c24}.color-primary{color:#195de6}.color-primary-50{color:#e1ebfe}.color-primary-100{color:#b6cdfb}.color-primary-200{color:#87acf7}.color-primary-300{color:#5589f1}.color-primary-400{color:#2e6deb}.color-primary-500{color:#195de6}.color-primary-600{color:#134fc6}.color-primary-700{color:#0d3ea0}.color-primary-800{color:#082e7a}.color-primary-900{color:#052056}.color-secondary{color:#7f19e6}.color-secondary-50{color:#f2e6fe}.color-secondary-100{color:#dfc2fc}.color-secondary-200{color:#bf87f7}.color-secondary-300{color:#a355f1}.color-secondary-400{color:#8c2eeb}.color-secondary-500{color:#7f19e6}.color-secondary-600{color:#6c13c6}.color-secondary-700{color:#570da0}.color-secondary-800{color:#41087a}.color-secondary-900{color:#2e0556}.color-tertiary{color:#e619a1}.color-tertiary-50{color:#fee6f6}.color-tertiary-100{color:#fcc2e9}.color-tertiary-200{color:#f787d1}.color-tertiary-300{color:#f155bd}.color-tertiary-400{color:#eb2eac}.color-tertiary-500{color:#e619a1}.color-tertiary-600{color:#c6138a}.color-tertiary-700{color:#a00d6f}.color-tertiary-800{color:#7a0854}.color-tertiary-900{color:#56053b}.color-error{color:#c00}.color-error-50{color:#fce3e3}.color-error-100{color:#f6bbbb}.color-error-200{color:#eb7979}.color-error-300{color:#df4242}.color-error-400{color:#d41717}.color-error-500{color:#c00}.color-error-600{color:#ad0000}.color-error-700{color:#8b0000}.color-error-800{color:#680000}.color-error-900{color:#490000}.color-warning{color:#f50}.color-warning-50{color:#ffeee5}.color-warning-100{color:#ffd4bf}.color-warning-200{color:#ffa97e}.color-warning-300{color:#ff8547}.color-warning-400{color:#ff661a}.color-warning-500{color:#f50}.color-warning-600{color:#d94800}.color-warning-700{color:#ad3a00}.color-warning-800{color:#822b00}.color-warning-900{color:#5b1e00}.color-success{color:#00b300}.color-success-50{color:#e3f9e3}.color-success-100{color:#bbf0bb}.color-success-200{color:#79de79}.color-success-300{color:#42cd42}.color-success-400{color:#17bd17}.color-success-500{color:#00b300}.color-success-600{color:#009800}.color-success-700{color:#007900}.color-success-800{color:#005b00}.color-success-900{color:#004000}.color-info{color:#08c}.color-info-50{color:#e3f4fc}.color-info-100{color:#bbe2f6}.color-info-200{color:#79c5eb}.color-info-300{color:#42abdf}.color-info-400{color:#1795d4}.color-info-500{color:#08c}.color-info-600{color:#0074ad}.color-info-700{color:#005c8b}.color-info-800{color:#004568}.color-info-900{color:#003149}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-none{cursor:none}.cursor-context-menu{cursor:context-menu}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.cursor-progress{cursor:progress}.cursor-wait{cursor:wait}.cursor-cell{cursor:cell}.cursor-crosshair{cursor:crosshair}.cursor-text{cursor:text}.cursor-vertical-text{cursor:vertical-text}.cursor-alias{cursor:alias}.cursor-copy{cursor:copy}.cursor-move{cursor:move}.cursor-no-drop{cursor:no-drop}.cursor-not-allowed{cursor:not-allowed}.cursor-e-resize{cursor:e-resize}.cursor-n-resize{cursor:n-resize}.cursor-ne-resize{cursor:ne-resize}.cursor-nw-resize{cursor:nw-resize}.cursor-s-resize{cursor:s-resize}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.cursor-w-resize{cursor:w-resize}.cursor-ew-resize{cursor:ew-resize}.cursor-ns-resize{cursor:ns-resize}.cursor-nesw-resize{cursor:nesw-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-col-resize{cursor:col-resize}.cursor-row-resize{cursor:row-resize}.cursor-all-scroll{cursor:all-scroll}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.cursor-grab{cursor:-webkit-grab;cursor:grab}.cursor-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.display-none{display:none}.display-contents{display:contents}.display-block{display:block}.display-inline-block{display:inline-block}.display-flex{display:flex}.display-inline-flex{display:inline-flex}.display-grid{display:grid}.display-table{display:table}.display-table-cell{display:table-cell}.fill-current-color,svg.fill-current-color{fill:currentColor}.fill-inherit,svg.fill-inherit{fill:inherit}.fill-white,svg.fill-white{fill:#fff}.fill-black,svg.fill-black{fill:#000}.fill-light,svg.fill-light{fill:#d5d7dd}.fill-light-50,svg.fill-light-50{fill:#f8f9fa}.fill-light-100,svg.fill-light-100{fill:#f2f3f5}.fill-light-200,svg.fill-light-200{fill:#e9ebee}.fill-light-300,svg.fill-light-300{fill:#e0e2e7}.fill-light-400,svg.fill-light-400{fill:#d9dbe0}.fill-light-500,svg.fill-light-500{fill:#d5d7dd}.fill-light-600,svg.fill-light-600{fill:#c8ccd4}.fill-light-700,svg.fill-light-700{fill:#b0b6c2}.fill-light-800,svg.fill-light-800{fill:#9199aa}.fill-light-900,svg.fill-light-900{fill:#6e798e}.fill-grey,svg.fill-grey{fill:#5c6370}.fill-grey-50,svg.fill-grey-50{fill:#c5cbd7}.fill-grey-100,svg.fill-grey-100{fill:#adb5c4}.fill-grey-200,svg.fill-grey-200{fill:#949dae}.fill-grey-300,svg.fill-grey-300{fill:#7d8697}.fill-grey-400,svg.fill-grey-400{fill:#697181}.fill-grey-500,svg.fill-grey-500{fill:#5c6370}.fill-grey-600,svg.fill-grey-600{fill:#555d6d}.fill-grey-700,svg.fill-grey-700{fill:#4a5364}.fill-grey-800,svg.fill-grey-800{fill:#3d4657}.fill-grey-900,svg.fill-grey-900{fill:#2f3747}.fill-dark,svg.fill-dark{fill:#2e3138}.fill-dark-50,svg.fill-dark-50{fill:#b5bbc6}.fill-dark-100,svg.fill-dark-100{fill:#989eab}.fill-dark-200,svg.fill-dark-200{fill:#797f8c}.fill-dark-300,svg.fill-dark-300{fill:#5b606b}.fill-dark-400,svg.fill-dark-400{fill:#41454e}.fill-dark-500,svg.fill-dark-500{fill:#2e3138}.fill-dark-600,svg.fill-dark-600{fill:#2a2e37}.fill-dark-700,svg.fill-dark-700{fill:#252932}.fill-dark-800,svg.fill-dark-800{fill:#1f232c}.fill-dark-900,svg.fill-dark-900{fill:#181c24}.fill-primary,svg.fill-primary{fill:#195de6}.fill-primary-50,svg.fill-primary-50{fill:#e1ebfe}.fill-primary-100,svg.fill-primary-100{fill:#b6cdfb}.fill-primary-200,svg.fill-primary-200{fill:#87acf7}.fill-primary-300,svg.fill-primary-300{fill:#5589f1}.fill-primary-400,svg.fill-primary-400{fill:#2e6deb}.fill-primary-500,svg.fill-primary-500{fill:#195de6}.fill-primary-600,svg.fill-primary-600{fill:#134fc6}.fill-primary-700,svg.fill-primary-700{fill:#0d3ea0}.fill-primary-800,svg.fill-primary-800{fill:#082e7a}.fill-primary-900,svg.fill-primary-900{fill:#052056}.fill-secondary,svg.fill-secondary{fill:#7f19e6}.fill-secondary-50,svg.fill-secondary-50{fill:#f2e6fe}.fill-secondary-100,svg.fill-secondary-100{fill:#dfc2fc}.fill-secondary-200,svg.fill-secondary-200{fill:#bf87f7}.fill-secondary-300,svg.fill-secondary-300{fill:#a355f1}.fill-secondary-400,svg.fill-secondary-400{fill:#8c2eeb}.fill-secondary-500,svg.fill-secondary-500{fill:#7f19e6}.fill-secondary-600,svg.fill-secondary-600{fill:#6c13c6}.fill-secondary-700,svg.fill-secondary-700{fill:#570da0}.fill-secondary-800,svg.fill-secondary-800{fill:#41087a}.fill-secondary-900,svg.fill-secondary-900{fill:#2e0556}.fill-tertiary,svg.fill-tertiary{fill:#e619a1}.fill-tertiary-50,svg.fill-tertiary-50{fill:#fee6f6}.fill-tertiary-100,svg.fill-tertiary-100{fill:#fcc2e9}.fill-tertiary-200,svg.fill-tertiary-200{fill:#f787d1}.fill-tertiary-300,svg.fill-tertiary-300{fill:#f155bd}.fill-tertiary-400,svg.fill-tertiary-400{fill:#eb2eac}.fill-tertiary-500,svg.fill-tertiary-500{fill:#e619a1}.fill-tertiary-600,svg.fill-tertiary-600{fill:#c6138a}.fill-tertiary-700,svg.fill-tertiary-700{fill:#a00d6f}.fill-tertiary-800,svg.fill-tertiary-800{fill:#7a0854}.fill-tertiary-900,svg.fill-tertiary-900{fill:#56053b}.fill-error,svg.fill-error{fill:#c00}.fill-error-50,svg.fill-error-50{fill:#fce3e3}.fill-error-100,svg.fill-error-100{fill:#f6bbbb}.fill-error-200,svg.fill-error-200{fill:#eb7979}.fill-error-300,svg.fill-error-300{fill:#df4242}.fill-error-400,svg.fill-error-400{fill:#d41717}.fill-error-500,svg.fill-error-500{fill:#c00}.fill-error-600,svg.fill-error-600{fill:#ad0000}.fill-error-700,svg.fill-error-700{fill:#8b0000}.fill-error-800,svg.fill-error-800{fill:#680000}.fill-error-900,svg.fill-error-900{fill:#490000}.fill-warning,svg.fill-warning{fill:#f50}.fill-warning-50,svg.fill-warning-50{fill:#ffeee5}.fill-warning-100,svg.fill-warning-100{fill:#ffd4bf}.fill-warning-200,svg.fill-warning-200{fill:#ffa97e}.fill-warning-300,svg.fill-warning-300{fill:#ff8547}.fill-warning-400,svg.fill-warning-400{fill:#ff661a}.fill-warning-500,svg.fill-warning-500{fill:#f50}.fill-warning-600,svg.fill-warning-600{fill:#d94800}.fill-warning-700,svg.fill-warning-700{fill:#ad3a00}.fill-warning-800,svg.fill-warning-800{fill:#822b00}.fill-warning-900,svg.fill-warning-900{fill:#5b1e00}.fill-success,svg.fill-success{fill:#00b300}.fill-success-50,svg.fill-success-50{fill:#e3f9e3}.fill-success-100,svg.fill-success-100{fill:#bbf0bb}.fill-success-200,svg.fill-success-200{fill:#79de79}.fill-success-300,svg.fill-success-300{fill:#42cd42}.fill-success-400,svg.fill-success-400{fill:#17bd17}.fill-success-500,svg.fill-success-500{fill:#00b300}.fill-success-600,svg.fill-success-600{fill:#009800}.fill-success-700,svg.fill-success-700{fill:#007900}.fill-success-800,svg.fill-success-800{fill:#005b00}.fill-success-900,svg.fill-success-900{fill:#004000}.fill-info,svg.fill-info{fill:#08c}.fill-info-50,svg.fill-info-50{fill:#e3f4fc}.fill-info-100,svg.fill-info-100{fill:#bbe2f6}.fill-info-200,svg.fill-info-200{fill:#79c5eb}.fill-info-300,svg.fill-info-300{fill:#42abdf}.fill-info-400,svg.fill-info-400{fill:#1795d4}.fill-info-500,svg.fill-info-500{fill:#08c}.fill-info-600,svg.fill-info-600{fill:#0074ad}.fill-info-700,svg.fill-info-700{fill:#005c8b}.fill-info-800,svg.fill-info-800{fill:#004568}.fill-info-900,svg.fill-info-900{fill:#003149}.flex{display:flex}.inline-flex{display:inline-flex}.flex-justify,.flex-justify-center{display:flex;justify-content:space-between}.flex-justify-center{align-items:center}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.flex-1{flex:1 1 0px}.flex-auto{flex:auto}.flex-none{flex:none}.flex-1-1-auto{flex:1 1 auto}.flex-1-0-auto{flex:1 0 auto}.flex-0-1-auto{flex:0 1 auto}.flex-0-0-auto{flex:0 0 auto}.justify-content-flex-start{justify-content:flex-start}.justify-content-flex-end{justify-content:flex-end}.justify-content-center{justify-content:center}.justify-content-space-between{justify-content:space-between}.justify-content-space-around{justify-content:space-around}.align-content-flex-start{align-content:flex-start}.align-content-flex-end{align-content:flex-end}.align-content-center{align-content:center}.align-content-space-between{align-content:space-between}.align-content-space-around{align-content:space-around}.align-content-stretch{align-content:stretch}.align-items-flex-start{align-items:flex-start}.align-items-flex-end{align-items:flex-end}.align-items-center{align-items:center}.align-items-baseline{align-items:baseline}.align-items-stretch{align-items:stretch}.align-self-flex-start{align-self:flex-start}.align-self-flex-end{align-self:flex-end}.align-self-center{align-self:center}.align-self-baseline{align-self:baseline}.align-self-stretch{align-self:stretch}.font-family,.font-family-system{font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.font-family-sans-serif{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif}.font-family-serif{font-family:Georgia,Times New Roman,Times,serif}.font-family-monospace{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.font-size-inherit{font-size:inherit}.font-size-initial{font-size:medium}.font-size-unset{font-size:unset}.font-size{font-size:1rem}.font-size-xxl{font-size:1.5rem}.font-size-xl{font-size:1.25rem}.font-size-l{font-size:1.125rem}.font-size-m{font-size:1rem}.font-size-s{font-size:.875rem}.font-size-xs{font-size:.75rem}.font-size-xxs{font-size:.625rem}.font-style-inherit{font-style:inherit}.font-style-initial{font-style:normal}.font-style-unset{font-style:unset}.font-style-normal{font-style:normal}.font-style-italic{font-style:italic}.font-style-oblique{font-style:oblique}.font-weight-thin{font-weight:100}.font-weight-extra-light{font-weight:200}.font-weight-light{font-weight:300}.font-weight-regular{font-weight:400}.font-weight-medium{font-weight:500}.font-weight-semibold{font-weight:600}.font-weight-bold{font-weight:700}.font-weight-extra-bold{font-weight:800}.font-weight-black{font-weight:900}.font-weight{font-weight:400}.font-weight-100{font-weight:100}.font-weight-200{font-weight:200}.font-weight-300{font-weight:300}.font-weight-400{font-weight:400}.font-weight-500{font-weight:500}.font-weight-600{font-weight:600}.font-weight-700{font-weight:700}.font-weight-800{font-weight:800}.font-weight-900{font-weight:900}.height-100{height:100%}.icon,.icon>svg,svg.icon{display:inline-block;width:3rem;height:3rem}.icon-xxl,.icon-xxl>svg,svg.icon-xxl{display:inline-block;width:6rem;height:6rem}.icon-xl,.icon-xl>svg,svg.icon-xl{display:inline-block;width:5rem;height:5rem}.icon-l,.icon-l>svg,svg.icon-l{display:inline-block;width:4rem;height:4rem}.icon-m,.icon-m>svg,svg.icon-m{display:inline-block;width:3rem;height:3rem}.icon-s,.icon-s>svg,svg.icon-s{display:inline-block;width:2rem;height:2rem}.icon-xs,.icon-xs>svg,svg.icon-xs{display:inline-block;width:1.5rem;height:1.5rem}.icon-xxs,.icon-xxs>svg,svg.icon-xxs{display:inline-block;width:1rem;height:1rem}.letter-spacing-xxl{letter-spacing:.1em}.letter-spacing-xl{letter-spacing:.0825em}.letter-spacing-l{letter-spacing:.075em}.letter-spacing-m{letter-spacing:.05em}.letter-spacing-s{letter-spacing:.0375em}.letter-spacing-xs{letter-spacing:.025em}.letter-spacing-xxs{letter-spacing:.0125em}.letter-spacing{letter-spacing:0}.line-height-1{line-height:1}.line-height-xxl{line-height:2}.line-height-xl{line-height:1.75}.line-height-l{line-height:1.625}.line-height-m{line-height:1.5}.line-height-s{line-height:1.375}.line-height-xs{line-height:1.25}.line-height-xxs{line-height:1}.line-height{line-height:1.375}.no-margin{margin:0!important}.no-margin-horizontal{margin-left:0!important;margin-right:0!important}.no-margin-vertical{margin-bottom:0!important}.no-margin-top,.no-margin-vertical{margin-top:0!important}.no-margin-right{margin-right:0!important}.no-margin-bottom{margin-bottom:0!important}.no-margin-left{margin-left:0!important}.margin-vertical-1{margin-top:1em;margin-bottom:1em}.margin-vertical-3-4{margin-top:.75em;margin-bottom:.75em}.margin-vertical-1-2{margin-top:.5em;margin-bottom:.5em}.margin-vertical-1-4{margin-top:.25em;margin-bottom:.25em}.margin-auto{margin:auto}.margin-horizontal-auto{margin-left:auto;margin-right:auto}.margin-vertical-auto{margin-top:auto;margin-bottom:auto}.margin-top-auto{margin-top:auto}.margin-right-auto{margin-right:auto}.margin-bottom-auto{margin-bottom:auto}.margin-left-auto{margin-left:auto}.margin-xxl{margin:4rem}.margin-negative-xxl{margin:-4rem}.margin-horizontal-xxl{margin-left:4rem;margin-right:4rem}.margin-vertical-xxl{margin-top:4rem;margin-bottom:4rem}.margin-top-xxl{margin-top:4rem}.margin-bottom-xxl{margin-bottom:4rem}.margin-left-xxl{margin-left:4rem}.margin-right-xxl{margin-right:4rem}.margin-xl{margin:3rem}.margin-negative-xl{margin:-3rem}.margin-horizontal-xl{margin-left:3rem;margin-right:3rem}.margin-vertical-xl{margin-top:3rem;margin-bottom:3rem}.margin-top-xl{margin-top:3rem}.margin-bottom-xl{margin-bottom:3rem}.margin-left-xl{margin-left:3rem}.margin-right-xl{margin-right:3rem}.margin-l{margin:2rem}.margin-negative-l{margin:-2rem}.margin-horizontal-l{margin-left:2rem;margin-right:2rem}.margin-vertical-l{margin-top:2rem;margin-bottom:2rem}.margin-top-l{margin-top:2rem}.margin-bottom-l{margin-bottom:2rem}.margin-left-l{margin-left:2rem}.margin-right-l{margin-right:2rem}.margin-m{margin:1.5rem}.margin-negative-m{margin:-1.5rem}.margin-horizontal-m{margin-left:1.5rem;margin-right:1.5rem}.margin-vertical-m{margin-top:1.5rem;margin-bottom:1.5rem}.margin-top-m{margin-top:1.5rem}.margin-bottom-m{margin-bottom:1.5rem}.margin-left-m{margin-left:1.5rem}.margin-right-m{margin-right:1.5rem}.margin-s{margin:1rem}.margin-negative-s{margin:-1rem}.margin-horizontal-s{margin-left:1rem;margin-right:1rem}.margin-vertical-s{margin-top:1rem;margin-bottom:1rem}.margin-top-s{margin-top:1rem}.margin-bottom-s{margin-bottom:1rem}.margin-left-s{margin-left:1rem}.margin-right-s{margin-right:1rem}.margin-xs{margin:.75rem}.margin-negative-xs{margin:-.75rem}.margin-horizontal-xs{margin-left:.75rem;margin-right:.75rem}.margin-vertical-xs{margin-top:.75rem;margin-bottom:.75rem}.margin-top-xs{margin-top:.75rem}.margin-bottom-xs{margin-bottom:.75rem}.margin-left-xs{margin-left:.75rem}.margin-right-xs{margin-right:.75rem}.margin-xxs{margin:.5rem}.margin-negative-xxs{margin:-.5rem}.margin-horizontal-xxs{margin-left:.5rem;margin-right:.5rem}.margin-vertical-xxs{margin-top:.5rem;margin-bottom:.5rem}.margin-top-xxs{margin-top:.5rem}.margin-bottom-xxs{margin-bottom:.5rem}.margin-left-xxs{margin-left:.5rem}.margin-right-xxs{margin-right:.5rem}.max-width-xxl{max-width:70rem}.max-width-xl{max-width:60rem}.max-width-l{max-width:50rem}.max-width-m{max-width:40rem}.max-width-s{max-width:30rem}.max-width-xs{max-width:20rem}.max-width-xxs{max-width:10rem}.min-height-25vh{min-height:25vh}.min-height-33vh{min-height:33vh}.min-height-50vh{min-height:50vh}.min-height-66vh{min-height:66vh}.min-height-75vh{min-height:75vh}.min-height-80vh{min-height:80vh}.min-height-90vh{min-height:90vh}.min-height-100vh{min-height:100vh}.order-1,.order-first{order:1}.order-2,.order-middle{order:2}.order-3,.order-last{order:3}.opacity-10{opacity:.1}.opacity-15{opacity:.15}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll;-webkit-overflow-scrolling:touch}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll;-webkit-overflow-scrolling:touch}.overflow-y-scroll{overflow-y:scroll;-webkit-overflow-scrolling:touch}.overflow-wrap-inherit{word-wrap:inherit}.overflow-wrap-initial{word-wrap:normal}.overflow-wrap-unset{word-wrap:unset}.overflow-wrap-normal{word-wrap:normal}.overflow-wrap-break-word{word-wrap:break-word}.overflow-wrap-anywhere{word-wrap:anywhere}.no-padding{padding:0!important}.no-padding-horizontal{padding-left:0!important;padding-right:0!important}.no-padding-vertical{padding-bottom:0!important}.no-padding-top,.no-padding-vertical{padding-top:0!important}.no-padding-right{padding-right:0!important}.no-padding-bottom{padding-bottom:0!important}.no-padding-left{padding-left:0!important}.padding-xxl{padding:4rem}.padding-horizontal-xxl{padding-left:4rem;padding-right:4rem}.padding-vertical-xxl{padding-top:4rem;padding-bottom:4rem}.padding-top-xxl{padding-top:4rem}.padding-bottom-xxl{padding-bottom:4rem}.padding-left-xxl{padding-left:4rem}.padding-right-xxl{padding-right:4rem}.padding-xl{padding:3rem}.padding-horizontal-xl{padding-left:3rem;padding-right:3rem}.padding-vertical-xl{padding-top:3rem;padding-bottom:3rem}.padding-top-xl{padding-top:3rem}.padding-bottom-xl{padding-bottom:3rem}.padding-left-xl{padding-left:3rem}.padding-right-xl{padding-right:3rem}.padding-l{padding:2rem}.padding-horizontal-l{padding-left:2rem;padding-right:2rem}.padding-vertical-l{padding-top:2rem;padding-bottom:2rem}.padding-top-l{padding-top:2rem}.padding-bottom-l{padding-bottom:2rem}.padding-left-l{padding-left:2rem}.padding-right-l{padding-right:2rem}.padding-m{padding:1.5rem}.padding-horizontal-m{padding-left:1.5rem;padding-right:1.5rem}.padding-vertical-m{padding-top:1.5rem;padding-bottom:1.5rem}.padding-top-m{padding-top:1.5rem}.padding-bottom-m{padding-bottom:1.5rem}.padding-left-m{padding-left:1.5rem}.padding-right-m{padding-right:1.5rem}.padding-s{padding:1rem}.padding-horizontal-s{padding-left:1rem;padding-right:1rem}.padding-vertical-s{padding-top:1rem;padding-bottom:1rem}.padding-top-s{padding-top:1rem}.padding-bottom-s{padding-bottom:1rem}.padding-left-s{padding-left:1rem}.padding-right-s{padding-right:1rem}.padding-xs{padding:.75rem}.padding-horizontal-xs{padding-left:.75rem;padding-right:.75rem}.padding-vertical-xs{padding-top:.75rem;padding-bottom:.75rem}.padding-top-xs{padding-top:.75rem}.padding-bottom-xs{padding-bottom:.75rem}.padding-left-xs{padding-left:.75rem}.padding-right-xs{padding-right:.75rem}.padding-xxs{padding:.5rem}.padding-horizontal-xxs{padding-left:.5rem;padding-right:.5rem}.padding-vertical-xxs{padding-top:.5rem;padding-bottom:.5rem}.padding-top-xxs{padding-top:.5rem}.padding-bottom-xxs{padding-bottom:.5rem}.padding-left-xxs{padding-left:.5rem}.padding-right-xxs{padding-right:.5rem}.pointer-events-inherit{pointer-events:inherit}.pointer-events-initial{pointer-events:auto}.pointer-events-unset{pointer-events:unset}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.fixed,.position-fixed{position:fixed}.position-relative,.relative{position:relative}.absolute,.position-absolute{position:absolute}.position-sticky,.sticky{position:sticky}.position-static,.static{position:static}.position-top{top:0}.position-top-left{top:0;left:0}.position-top-right{top:0;right:0}.position-right{right:0}.position-bottom{bottom:0}.position-bottom-left{bottom:0;left:0}.position-bottom-right{bottom:0;right:0}.position-left{left:0}.space-xxl{width:4rem;height:4rem}.space-xl{width:3rem;height:3rem}.space-l{width:2rem;height:2rem}.space-m{width:1.5rem;height:1.5rem}.space-s{width:1rem;height:1rem}.space-xs{width:.75rem;height:.75rem}.space-xxs{width:.5rem;height:.5rem}.stroke-current-color,svg.stroke-current-color{stroke:currentColor}.stroke-inherit,svg.stroke-inherit{stroke:inherit}.stroke-white,svg.stroke-white{stroke:#fff}.stroke-black,svg.stroke-black{stroke:#000}.stroke-light,svg.stroke-light{stroke:#d5d7dd}.stroke-light-50,svg.stroke-light-50{stroke:#f8f9fa}.stroke-light-100,svg.stroke-light-100{stroke:#f2f3f5}.stroke-light-200,svg.stroke-light-200{stroke:#e9ebee}.stroke-light-300,svg.stroke-light-300{stroke:#e0e2e7}.stroke-light-400,svg.stroke-light-400{stroke:#d9dbe0}.stroke-light-500,svg.stroke-light-500{stroke:#d5d7dd}.stroke-light-600,svg.stroke-light-600{stroke:#c8ccd4}.stroke-light-700,svg.stroke-light-700{stroke:#b0b6c2}.stroke-light-800,svg.stroke-light-800{stroke:#9199aa}.stroke-light-900,svg.stroke-light-900{stroke:#6e798e}.stroke-grey,svg.stroke-grey{stroke:#5c6370}.stroke-grey-50,svg.stroke-grey-50{stroke:#c5cbd7}.stroke-grey-100,svg.stroke-grey-100{stroke:#adb5c4}.stroke-grey-200,svg.stroke-grey-200{stroke:#949dae}.stroke-grey-300,svg.stroke-grey-300{stroke:#7d8697}.stroke-grey-400,svg.stroke-grey-400{stroke:#697181}.stroke-grey-500,svg.stroke-grey-500{stroke:#5c6370}.stroke-grey-600,svg.stroke-grey-600{stroke:#555d6d}.stroke-grey-700,svg.stroke-grey-700{stroke:#4a5364}.stroke-grey-800,svg.stroke-grey-800{stroke:#3d4657}.stroke-grey-900,svg.stroke-grey-900{stroke:#2f3747}.stroke-dark,svg.stroke-dark{stroke:#2e3138}.stroke-dark-50,svg.stroke-dark-50{stroke:#b5bbc6}.stroke-dark-100,svg.stroke-dark-100{stroke:#989eab}.stroke-dark-200,svg.stroke-dark-200{stroke:#797f8c}.stroke-dark-300,svg.stroke-dark-300{stroke:#5b606b}.stroke-dark-400,svg.stroke-dark-400{stroke:#41454e}.stroke-dark-500,svg.stroke-dark-500{stroke:#2e3138}.stroke-dark-600,svg.stroke-dark-600{stroke:#2a2e37}.stroke-dark-700,svg.stroke-dark-700{stroke:#252932}.stroke-dark-800,svg.stroke-dark-800{stroke:#1f232c}.stroke-dark-900,svg.stroke-dark-900{stroke:#181c24}.stroke-primary,svg.stroke-primary{stroke:#195de6}.stroke-primary-50,svg.stroke-primary-50{stroke:#e1ebfe}.stroke-primary-100,svg.stroke-primary-100{stroke:#b6cdfb}.stroke-primary-200,svg.stroke-primary-200{stroke:#87acf7}.stroke-primary-300,svg.stroke-primary-300{stroke:#5589f1}.stroke-primary-400,svg.stroke-primary-400{stroke:#2e6deb}.stroke-primary-500,svg.stroke-primary-500{stroke:#195de6}.stroke-primary-600,svg.stroke-primary-600{stroke:#134fc6}.stroke-primary-700,svg.stroke-primary-700{stroke:#0d3ea0}.stroke-primary-800,svg.stroke-primary-800{stroke:#082e7a}.stroke-primary-900,svg.stroke-primary-900{stroke:#052056}.stroke-secondary,svg.stroke-secondary{stroke:#7f19e6}.stroke-secondary-50,svg.stroke-secondary-50{stroke:#f2e6fe}.stroke-secondary-100,svg.stroke-secondary-100{stroke:#dfc2fc}.stroke-secondary-200,svg.stroke-secondary-200{stroke:#bf87f7}.stroke-secondary-300,svg.stroke-secondary-300{stroke:#a355f1}.stroke-secondary-400,svg.stroke-secondary-400{stroke:#8c2eeb}.stroke-secondary-500,svg.stroke-secondary-500{stroke:#7f19e6}.stroke-secondary-600,svg.stroke-secondary-600{stroke:#6c13c6}.stroke-secondary-700,svg.stroke-secondary-700{stroke:#570da0}.stroke-secondary-800,svg.stroke-secondary-800{stroke:#41087a}.stroke-secondary-900,svg.stroke-secondary-900{stroke:#2e0556}.stroke-tertiary,svg.stroke-tertiary{stroke:#e619a1}.stroke-tertiary-50,svg.stroke-tertiary-50{stroke:#fee6f6}.stroke-tertiary-100,svg.stroke-tertiary-100{stroke:#fcc2e9}.stroke-tertiary-200,svg.stroke-tertiary-200{stroke:#f787d1}.stroke-tertiary-300,svg.stroke-tertiary-300{stroke:#f155bd}.stroke-tertiary-400,svg.stroke-tertiary-400{stroke:#eb2eac}.stroke-tertiary-500,svg.stroke-tertiary-500{stroke:#e619a1}.stroke-tertiary-600,svg.stroke-tertiary-600{stroke:#c6138a}.stroke-tertiary-700,svg.stroke-tertiary-700{stroke:#a00d6f}.stroke-tertiary-800,svg.stroke-tertiary-800{stroke:#7a0854}.stroke-tertiary-900,svg.stroke-tertiary-900{stroke:#56053b}.stroke-error,svg.stroke-error{stroke:#c00}.stroke-error-50,svg.stroke-error-50{stroke:#fce3e3}.stroke-error-100,svg.stroke-error-100{stroke:#f6bbbb}.stroke-error-200,svg.stroke-error-200{stroke:#eb7979}.stroke-error-300,svg.stroke-error-300{stroke:#df4242}.stroke-error-400,svg.stroke-error-400{stroke:#d41717}.stroke-error-500,svg.stroke-error-500{stroke:#c00}.stroke-error-600,svg.stroke-error-600{stroke:#ad0000}.stroke-error-700,svg.stroke-error-700{stroke:#8b0000}.stroke-error-800,svg.stroke-error-800{stroke:#680000}.stroke-error-900,svg.stroke-error-900{stroke:#490000}.stroke-warning,svg.stroke-warning{stroke:#f50}.stroke-warning-50,svg.stroke-warning-50{stroke:#ffeee5}.stroke-warning-100,svg.stroke-warning-100{stroke:#ffd4bf}.stroke-warning-200,svg.stroke-warning-200{stroke:#ffa97e}.stroke-warning-300,svg.stroke-warning-300{stroke:#ff8547}.stroke-warning-400,svg.stroke-warning-400{stroke:#ff661a}.stroke-warning-500,svg.stroke-warning-500{stroke:#f50}.stroke-warning-600,svg.stroke-warning-600{stroke:#d94800}.stroke-warning-700,svg.stroke-warning-700{stroke:#ad3a00}.stroke-warning-800,svg.stroke-warning-800{stroke:#822b00}.stroke-warning-900,svg.stroke-warning-900{stroke:#5b1e00}.stroke-success,svg.stroke-success{stroke:#00b300}.stroke-success-50,svg.stroke-success-50{stroke:#e3f9e3}.stroke-success-100,svg.stroke-success-100{stroke:#bbf0bb}.stroke-success-200,svg.stroke-success-200{stroke:#79de79}.stroke-success-300,svg.stroke-success-300{stroke:#42cd42}.stroke-success-400,svg.stroke-success-400{stroke:#17bd17}.stroke-success-500,svg.stroke-success-500{stroke:#00b300}.stroke-success-600,svg.stroke-success-600{stroke:#009800}.stroke-success-700,svg.stroke-success-700{stroke:#007900}.stroke-success-800,svg.stroke-success-800{stroke:#005b00}.stroke-success-900,svg.stroke-success-900{stroke:#004000}.stroke-info,svg.stroke-info{stroke:#08c}.stroke-info-50,svg.stroke-info-50{stroke:#e3f4fc}.stroke-info-100,svg.stroke-info-100{stroke:#bbe2f6}.stroke-info-200,svg.stroke-info-200{stroke:#79c5eb}.stroke-info-300,svg.stroke-info-300{stroke:#42abdf}.stroke-info-400,svg.stroke-info-400{stroke:#1795d4}.stroke-info-500,svg.stroke-info-500{stroke:#08c}.stroke-info-600,svg.stroke-info-600{stroke:#0074ad}.stroke-info-700,svg.stroke-info-700{stroke:#005c8b}.stroke-info-800,svg.stroke-info-800{stroke:#004568}.stroke-info-900,svg.stroke-info-900{stroke:#003149}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-align-justify{text-align:justify}.text-align-center{text-align:center}.text-decoration-underline{text-decoration:underline}.text-decoration-none{text-decoration:none}.text-transform-none{text-transform:none}.text-transform-capitalize{text-transform:capitalize}.text-transform-uppercase{text-transform:uppercase}.text-transform-lowercase{text-transform:lowercase}.text-transform-full-width{text-transform:full-width}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.transition-fast{transition:all .2s ease-in-out}.transition-medium{transition:all .3s ease-in-out}.transition-slow{transition:all .5s ease-in-out}.clearfix:after,.clearfix:before{content:"";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}.cover{top:0;right:0;bottom:0;left:0;width:100%;height:100%}.center,.cover{position:absolute}.center{top:50%;left:50%;transform:translate(-50%,-50%)}.circle{border-radius:50%}.full-height{height:100%}.pointer{cursor:pointer}.hide{display:none!important}.show{display:block!important}.visible{visibility:visible!important}.hidden{visibility:hidden!important}.show-print{display:none!important}@media print{.show-print{display:block!important}}@media print{.hide-print{display:none!important}}.show-screen{display:none!important}@media screen{.show-screen{display:block!important}}@media screen{.hide-screen{display:none!important}}.hide-visually{position:absolute;padding:0;width:1px;height:1px;margin:-1px;border:0;overflow:hidden;clip:rect(0 0 0 0)}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}@media (max-width:320px){.hide-xxs{display:none!important}}@media (min-width:320px) and (max-width:639px){.hide-xs{display:none!important}}@media (min-width:320px){.hide-xs-up{display:none!important}}@media (max-width:639px){.hide-xs-down{display:none!important}}@media (min-width:640px) and (max-width:959px){.hide-s{display:none!important}}@media (min-width:640px){.hide-s-up{display:none!important}}@media (max-width:959px){.hide-s-down{display:none!important}}@media (min-width:960px) and (max-width:1279px){.hide-m{display:none!important}}@media (min-width:960px){.hide-m-up{display:none!important}}@media (max-width:1279px){.hide-m-down{display:none!important}}@media (min-width:1280px) and (max-width:1679px){.hide-l{display:none!important}}@media (min-width:1280px){.hide-l-up{display:none!important}}@media (max-width:1679px){.hide-l-down{display:none!important}}@media (min-width:1680px) and (max-width:1919px){.hide-xl{display:none!important}}.show-xxs{display:none!important}@media (max-width:320px){.show-xxs{display:block!important}}.show-xs{display:none!important}@media (min-width:320px) and (max-width:639px){.show-xs{display:block!important}}.show-xs-up{display:none!important}@media (min-width:320px){.show-xs-up{display:block!important}}.show-xs-down{display:none!important}@media (max-width:639px){.show-xs-down{display:block!important}}.show-s{display:none!important}@media (min-width:640px) and (max-width:959px){.show-s{display:block!important}}.show-s-up{display:none!important}@media (min-width:640px){.show-s-up{display:block!important}}.show-s-down{display:none!important}@media (max-width:959px){.show-s-down{display:block!important}}.show-m{display:none!important}@media (min-width:960px) and (max-width:1279px){.show-m{display:block!important}}.show-m-up{display:none!important}@media (min-width:960px){.show-m-up{display:block!important}}.show-m-down{display:none!important}@media (max-width:1279px){.show-m-down{display:block!important}}.show-l{display:none!important}@media (min-width:1280px) and (max-width:1679px){.show-l{display:block!important}}.show-l-up{display:none!important}@media (min-width:1280px){.show-l-up{display:block!important}}.show-l-down{display:none!important}@media (max-width:1679px){.show-l-down{display:block!important}}.show-xl{display:none!important}@media (min-width:1680px) and (max-width:1919px){.show-xl{display:block!important}}.width-100{width:100%}.z-index-low{z-index:9}.z-index-medium{z-index:99}.z-index-high{z-index:999}body{max-width:960px}address{font-style:normal}.footnote-reference a,.group a{text-decoration:none}.footnote-definition{padding-top:1em}.footnote-definition p{margin:-1.5em 0 1em .8em;font-size:.875rem}.figure-grid{display:flex;flex-flow:row wrap;justify-content:center}.figure-grid img{margin:1px}
\ No newline at end of file

A style.css => style.css +49 -0
@@ 0,0 1,49 @@
@import "turretcss/turret/turret.css";

@import url("https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/inter.min.css");

/* Override styles from turret.css */
:root {
  --font-family-system: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  --font-family-sans-serif: "Inter", "Helvetica Neue", Helvetica, Arial, sans-serif;

  --lead-color: var(--dark-300);

  --h1-font-size: 1.75rem;
  --code-font-size: 90%;

  --blockquote-font-size: var(--font-size);
  --blockquote-margin: 2em 0 2em 2em;
}

body {
  max-width: 960px;
}

address {
  font-style: normal;
}

.group a,
.footnote-reference a {
  text-decoration: none;
}

.footnote-definition {
  padding-top: 1em;
}

.footnote-definition p {
  margin: -1.5em 0 1em 0.8em;
  font-size: var(--font-size-s);
}

.figure-grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;
}

.figure-grid img {
  margin: 1px;
}

A templates/base.html => templates/base.html +51 -0
@@ 0,0 1,51 @@
<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>{% block title %}{% endblock %}</title>
    <link
      rel="stylesheet" type="text/css"
      href="{{ get_url(path="style.min.css") }}" />
    <script
      src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
    <script>
    MathJax = {
      options: {
        enableMenu: false
      }
    };
    </script>
    <script
      id="MathJax-script"
      async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
  </head>
  <body class="center full-height">
    <div class="container">
      <header class="flex-justify-center flex-wrap align-content-flex-start padding-vertical-xl">
        <nav class="group group-xl margin-top-s">
          <ul>
            <li><h3><a href="{{ config.base_url }}">{{ config.title }}</a></h3></li>
            <li><a href="{{ get_url(path="@/blog/_index.md") }}">Blog</a></li>
            <li><a href="{{ get_url(path="atom.xml") }}">RSS</a></li>
          </ul>
        </nav>
        <div class="group group-xl margin-top-s">
          <ul>
            <li><address><a href="mailto:{{ config.extra.email }}">Email</a></address></li>
            <li><a href="{{ config.extra.sourcehut }}">Sourcehut</a></li>
            <li><a href="{{ get_url(path="publickey.txt") }}">PGP</a></li>
          </ul>
        </div>
      </header>
      <main>
        {% block content %}{% endblock %}
      </main>
      <footer class="padding-vertical-xl">
        <p class="font-size-s color-dark-200">Site content under <a
          href="https://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA</a>.
        Source under <a href="https://mit-license.org/">MIT</a>.</p>
      </footer>
    </div>
  </body>
</html>

A templates/index.html => templates/index.html +22 -0
@@ 0,0 1,22 @@
{% extends "base.html" %}

{% block title %}{{ config.title }}{% endblock %}

{% block content %}
<p class="margin-bottom-xl">My name is Ryan Chan. I write software with a focus
on computer graphics and geometry processing.</p>

<p>Currently at <a href="https://www.framestore.com">Framestore</a> working on
real-time applications with Unreal Engine.</p>

<p>Part-time consultant for <a href="https://www.meshconsultants.ca/">Mesh</a>
and <a href="">Metafold</a>, solving a variety of geometric problems.

<p class="margin-bottom-xl">Previously at <a href="https://dneg.com">DNEG</a>
and <a href="https://www.moving-picture.com">Moving Picture Company</a>
developing high-performance rigging frameworks and tooling.

<p>Check out <b><a href="https://sr.ht/~rycwo/forge/">Forge</a></b>, a suite of
<b>free and open source</b> 2d/3d artist tools that I develop in my free
time!</p>
{% endblock %}

A templates/page.html => templates/page.html +15 -0
@@ 0,0 1,15 @@
{% extends "base.html" %}

{% block title %}{{ page.title }}{% endblock %}

{% block content %}
<article>
  <header class="margin-bottom-l">
    <h2 class="no-margin-vertical">{{ page.title }}</h2>
    <time datetime="{{ page.date }}" class="font-size-s">{{ page.date }}</time>
  </header>
  <section>
    {{ page.content | safe }}
  </section>
</article>
{% endblock %}

A templates/section.html => templates/section.html +36 -0
@@ 0,0 1,36 @@
{% extends "base.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<ul>
  {% for page in paginator.pages %}
  <li class="no-margin-left no-padding-left margin-vertical-s" style="list-style: none">
    <a href="{{ page.permalink | safe }}" class="font-size-l text-decoration-none">
      {{ page.title }}</a><br>
    <time datetime="{{ page.date }}" class="font-size-s">{{ page.date }}</time>
  </li>
  {% endfor %}
</ul>
<nav class="group group-s">
  <ul>
    {% if paginator.current_index > 2 %}
    <li><a href="{{ paginator.first }}">1</a></li>
    <li>...</li>
    {% endif %}
    {% if paginator.previous %}
    {% set prev_index = paginator.current_index - 1 %}
    <li><a href="{{ paginator.previous }}">{{ prev_index }}</a></li>
    {% endif %}
    <li><b>{{ paginator.current_index }}</b></li>
    {% if paginator.next %}
    {% set next_index = paginator.current_index + 1 %}
    <li><a href="{{ paginator.next }}">{{ next_index }}</a></li>
    {% endif %}
    {% if paginator.current_index < paginator.number_pagers - 1 %}
    <li>...</li>
    <li><a href="{{ paginator.last }}">{{ paginator.number_pagers }}</a></li>
    {% endif %}
  </ul>
</nav>
{% endblock %}

A templates/shortcodes/raw.md => templates/shortcodes/raw.md +4 -0
@@ 0,0 1,4 @@
{% set r = load_data(url=url) %}
```{% if syntax %}{{ syntax }}{% endif %}
{{ r }}
```

A templates/shortcodes/video.html => templates/shortcodes/video.html +7 -0
@@ 0,0 1,7 @@
<div class="flex justify-content-center">
  <div
    class="media"
    style="width: {{ scale }}%; padding-top: calc(({{ height }} / {{ width }}) * {{ scale }}%)">
    <video src="{{ url }}" muted controls></video>
  </div>
</div>

A turretcss => turretcss +1 -0
@@ 0,0 1,1 @@
Subproject commit b392cc4f8a7f4424dc060fcda389bf165cc7782c