changelog shortlog graph tags branches files raw help

Mercurial > infra / changeset: merge

changeset 216: aec98998d25e
parent 215: f9dd5267b566 (current diff)
parent 213: a7129c8e52d1 (diff)
child 217: 98abb7f50885
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 30 Apr 2024 23:08:08 +0000
files:
description: merge
     1.1--- a/.hgignore	Tue Apr 30 23:07:50 2024 +0000
     1.2+++ b/.hgignore	Tue Apr 30 23:08:08 2024 +0000
     1.3@@ -1,3 +1,4 @@
     1.4 .*[.](fasl|lock|elc|eln|scratch|tar)$
     1.5 .*(target|dist|node_modules|target-trunk|build)/.*
     1.6-linux/linux-[0-9]+[.].*/.*
     1.7\ No newline at end of file
     1.8+linux/linux-[0-9]+[.].*/.*
     1.9+host.sxp
    1.10\ No newline at end of file
     2.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2+++ b/Containerfile.mail	Tue Apr 30 23:08:08 2024 +0000
     2.3@@ -0,0 +1,1 @@
     2.4+FROM stalwartlabs/mail-server:latest
     2.5\ No newline at end of file
     3.1--- a/Containerfile.vc	Tue Apr 30 23:07:50 2024 +0000
     3.2+++ b/Containerfile.vc	Tue Apr 30 23:08:08 2024 +0000
     3.3@@ -1,3 +1,4 @@
     3.4 FROM octobus/heptapod:latest
     3.5 RUN gitlab-ctl upgrade
     3.6-COPY etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb
     3.7\ No newline at end of file
     3.8+# TODO: configure instance here, pull from comp/etc
     3.9+# COPY etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb
    3.10\ No newline at end of file
     4.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2+++ b/bootstrap.lisp	Tue Apr 30 23:08:08 2024 +0000
     4.3@@ -0,0 +1,35 @@
     4.4+;;; bootstrap.lisp --- let 'er rip
     4.5+
     4.6+;;
     4.7+
     4.8+;;; Code:
     4.9+(in-package :std-user)
    4.10+
    4.11+(defpkg :infra/bootstrap
    4.12+  (:use :cl :skel :log :std/named-readtables
    4.13+        :dat/json :dat/sxp :net/fetch :net/util
    4.14+        :cli/progress :cli/ansi :cli/ed :cli/prompt
    4.15+        :cli/shell :std/hash-table :std/alien))
    4.16+(in-package :infra/bootstrap)
    4.17+(in-readtable :shell)
    4.18+
    4.19+(eval-when (:compile-toplevel)
    4.20+  (defstruct host name cpus mem os kernel core)
    4.21+  (defparameter *config-file* (or (pathname (sb-posix:getenv "BUILD_PROFILE")) #P"default.sxp"))
    4.22+  (defparameter *build-config* (read-sxp-file *config-file*))
    4.23+  (defparameter *host-config* (make-host :name (sb-unix:unix-gethostname) :cpus (num-cpus) :mem #+nil (mem-total) 15815828
    4.24+                                   :os "archlinux" :kernel "linux" :core sb-ext:*core-pathname*))
    4.25+  (defparameter *env* (let ((table (make-hash-table :test 'equal))
    4.26+                      (keys (list "CC" "AR" "STASH" "STORE" "DIST" "PACKY_URL" "VC_URL" "PREFIX")))
    4.27+                  (dolist (k keys table)
    4.28+                    (setf (gethash k table) (sb-posix:getenv k))))))
    4.29+
    4.30+(info! "starting bootstrap.lisp")
    4.31+(debug! "host:" sb-sys::*machine-version*)
    4.32+(trace! "env:" (hash-table-alist *env*))
    4.33+
    4.34+;; build-config
    4.35+(defun apply-build-config ()
    4.36+  (setf *log-level* :trace))
    4.37+
    4.38+;; host-config
     5.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.2+++ b/bootstrap.sh	Tue Apr 30 23:08:08 2024 +0000
     5.3@@ -0,0 +1,1 @@
     5.4+#!/usr/bin/env sh
     6.1--- a/cdn/media/alien.svg	Tue Apr 30 23:07:50 2024 +0000
     6.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.3@@ -1,495 +0,0 @@
     6.4-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
     6.5-<!-- Created with Inkscape (http://www.inkscape.org/) -->
     6.6-<svg
     6.7-   xmlns:dc="http://purl.org/dc/elements/1.1/"
     6.8-   xmlns:cc="http://web.resource.org/cc/"
     6.9-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    6.10-   xmlns:svg="http://www.w3.org/2000/svg"
    6.11-   xmlns="http://www.w3.org/2000/svg"
    6.12-   xmlns:xlink="http://www.w3.org/1999/xlink"
    6.13-   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
    6.14-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    6.15-   width="744.09448819"
    6.16-   height="1052.3622047"
    6.17-   id="svg2"
    6.18-   sodipodi:version="0.32"
    6.19-   inkscape:version="0.42"
    6.20-   sodipodi:docbase="C:\home\logo_page"
    6.21-   sodipodi:docname="lisplogo_alien.svg"
    6.22-   inkscape:export-filename="C:\home\lisplogo_alien.png"
    6.23-   inkscape:export-xdpi="258.45999"
    6.24-   inkscape:export-ydpi="258.45999">
    6.25-  <defs
    6.26-     id="defs4">
    6.27-    <linearGradient
    6.28-       id="linearGradient8707">
    6.29-      <stop
    6.30-         style="stop-color:#8de17a;stop-opacity:1.0000000;"
    6.31-         offset="0.00000000"
    6.32-         id="stop8709" />
    6.33-      <stop
    6.34-         style="stop-color:#a3f590;stop-opacity:1.0000000;"
    6.35-         offset="1.0000000"
    6.36-         id="stop8711" />
    6.37-    </linearGradient>
    6.38-    <linearGradient
    6.39-       id="linearGradient7973">
    6.40-      <stop
    6.41-         id="stop7975"
    6.42-         offset="0.00000000"
    6.43-         style="stop-color:#71bc60;stop-opacity:1.0000000;" />
    6.44-      <stop
    6.45-         id="stop7977"
    6.46-         offset="1.0000000"
    6.47-         style="stop-color:#77ce64;stop-opacity:0.42352942;" />
    6.48-    </linearGradient>
    6.49-    <linearGradient
    6.50-       id="linearGradient6509">
    6.51-      <stop
    6.52-         style="stop-color:#7a73de;stop-opacity:1.0000000;"
    6.53-         offset="0.00000000"
    6.54-         id="stop6511" />
    6.55-      <stop
    6.56-         id="stop6517"
    6.57-         offset="0.50000000"
    6.58-         style="stop-color:#a2c8e9;stop-opacity:0.98039216;" />
    6.59-      <stop
    6.60-         style="stop-color:#7a73de;stop-opacity:1.0000000;"
    6.61-         offset="1.0000000"
    6.62-         id="stop6513" />
    6.63-    </linearGradient>
    6.64-    <linearGradient
    6.65-       id="linearGradient5773">
    6.66-      <stop
    6.67-         style="stop-color:#000000;stop-opacity:0.00000000;"
    6.68-         offset="0.00000000"
    6.69-         id="stop5775" />
    6.70-      <stop
    6.71-         id="stop5781"
    6.72-         offset="0.50000000"
    6.73-         style="stop-color:#616161;stop-opacity:1.0000000;" />
    6.74-      <stop
    6.75-         style="stop-color:#000000;stop-opacity:0;"
    6.76-         offset="1"
    6.77-         id="stop5777" />
    6.78-    </linearGradient>
    6.79-    <linearGradient
    6.80-       id="linearGradient5037">
    6.81-      <stop
    6.82-         id="stop5039"
    6.83-         offset="0.00000000"
    6.84-         style="stop-color:#d6d1f9;stop-opacity:1.0000000;" />
    6.85-      <stop
    6.86-         id="stop5041"
    6.87-         offset="1.0000000"
    6.88-         style="stop-color:#9687fa;stop-opacity:1.0000000;" />
    6.89-    </linearGradient>
    6.90-    <linearGradient
    6.91-       id="linearGradient4303">
    6.92-      <stop
    6.93-         style="stop-color:#d6d1f9;stop-opacity:1.0000000;"
    6.94-         offset="0.00000000"
    6.95-         id="stop4305" />
    6.96-      <stop
    6.97-         style="stop-color:#9687fa;stop-opacity:1.0000000;"
    6.98-         offset="1.0000000"
    6.99-         id="stop4307" />
   6.100-    </linearGradient>
   6.101-    <linearGradient
   6.102-       id="linearGradient2115">
   6.103-      <stop
   6.104-         style="stop-color:#d2f1cb;stop-opacity:1.0000000;"
   6.105-         offset="0.00000000"
   6.106-         id="stop2117" />
   6.107-      <stop
   6.108-         style="stop-color:#cdf9c3;stop-opacity:0.42268041;"
   6.109-         offset="1.0000000"
   6.110-         id="stop2119" />
   6.111-    </linearGradient>
   6.112-    <linearGradient
   6.113-       inkscape:collect="always"
   6.114-       xlink:href="#linearGradient2115"
   6.115-       id="linearGradient2121"
   6.116-       x1="272.79681"
   6.117-       y1="476.64795"
   6.118-       x2="254.12024"
   6.119-       y2="535.94427"
   6.120-       gradientUnits="userSpaceOnUse" />
   6.121-    <radialGradient
   6.122-       inkscape:collect="always"
   6.123-       xlink:href="#linearGradient4303"
   6.124-       id="radialGradient4309"
   6.125-       cx="300.83069"
   6.126-       cy="447.85394"
   6.127-       fx="300.83069"
   6.128-       fy="447.85394"
   6.129-       r="78.713470"
   6.130-       gradientTransform="matrix(1.000000,0.000000,0.000000,0.960976,0.000000,15.90946)"
   6.131-       gradientUnits="userSpaceOnUse" />
   6.132-    <linearGradient
   6.133-       inkscape:collect="always"
   6.134-       xlink:href="#linearGradient5037"
   6.135-       id="linearGradient5045"
   6.136-       x1="225.84930"
   6.137-       y1="641.64783"
   6.138-       x2="253.46617"
   6.139-       y2="543.98328"
   6.140-       gradientUnits="userSpaceOnUse" />
   6.141-    <linearGradient
   6.142-       inkscape:collect="always"
   6.143-       xlink:href="#linearGradient5773"
   6.144-       id="linearGradient5779"
   6.145-       x1="80.912460"
   6.146-       y1="670.96942"
   6.147-       x2="301.00812"
   6.148-       y2="670.96942"
   6.149-       gradientUnits="userSpaceOnUse" />
   6.150-    <linearGradient
   6.151-       inkscape:collect="always"
   6.152-       xlink:href="#linearGradient6509"
   6.153-       id="linearGradient6515"
   6.154-       x1="456.66621"
   6.155-       y1="428.55343"
   6.156-       x2="579.09352"
   6.157-       y2="428.55343"
   6.158-       gradientUnits="userSpaceOnUse" />
   6.159-    <linearGradient
   6.160-       inkscape:collect="always"
   6.161-       xlink:href="#linearGradient7973"
   6.162-       id="linearGradient7979"
   6.163-       gradientUnits="userSpaceOnUse"
   6.164-       x1="209.93025"
   6.165-       y1="609.15863"
   6.166-       x2="272.07062"
   6.167-       y2="554.45270" />
   6.168-    <linearGradient
   6.169-       inkscape:collect="always"
   6.170-       xlink:href="#linearGradient8707"
   6.171-       id="linearGradient8713"
   6.172-       x1="202.42282"
   6.173-       y1="630.79425"
   6.174-       x2="201.15987"
   6.175-       y2="501.72241"
   6.176-       gradientUnits="userSpaceOnUse" />
   6.177-  </defs>
   6.178-  <sodipodi:namedview
   6.179-     id="base"
   6.180-     pagecolor="#ffffff"
   6.181-     bordercolor="#666666"
   6.182-     borderopacity="1.0"
   6.183-     inkscape:pageopacity="0.0"
   6.184-     inkscape:pageshadow="2"
   6.185-     inkscape:zoom="1.8321488"
   6.186-     inkscape:cx="280.98857"
   6.187-     inkscape:cy="458.91807"
   6.188-     inkscape:document-units="px"
   6.189-     inkscape:current-layer="layer1"
   6.190-     inkscape:window-width="759"
   6.191-     inkscape:window-height="779"
   6.192-     inkscape:window-x="1"
   6.193-     inkscape:window-y="0" />
   6.194-  <metadata
   6.195-     id="metadata7">
   6.196-    <rdf:RDF>
   6.197-      <cc:Work
   6.198-         rdf:about="">
   6.199-        <dc:format>image/svg+xml</dc:format>
   6.200-        <dc:type
   6.201-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
   6.202-      </cc:Work>
   6.203-    </rdf:RDF>
   6.204-  </metadata>
   6.205-  <g
   6.206-     inkscape:label="Layer 1"
   6.207-     inkscape:groupmode="layer"
   6.208-     id="layer1">
   6.209-    <path
   6.210-       style="fill:url(#linearGradient5779);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.16666667"
   6.211-       d="M 67.144386,666.93597 C 74.120426,681.02585 87.234595,682.74658 102.89660,679.43686 C 111.72000,677.57228 140.39281,675.65602 160.44893,683.50406 C 180.50504,691.35211 204.88673,682.15623 233.66290,680.41222 C 262.43906,678.66821 271.19356,686.99208 290.37767,677.40003 C 309.56178,667.80797 354.03404,665.19196 329.61790,656.47191 C 305.20176,647.75186 219.74527,649.49587 187.48108,653.85589 C 155.21690,658.21592 83.712481,637.28780 71.504411,642.51983 C 58.555797,648.06924 64.528371,654.72790 67.144386,666.93597 z "
   6.212-       id="path2123"
   6.213-       sodipodi:nodetypes="csssssszc" />
   6.214-    <path
   6.215-       style="fill:#8ed97d;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.216-       d="M 142.76766,550.12665 C 136.15502,574.26631 130.95896,630.57333 127.69749,652.88979 C 126.89916,652.62576 126.03531,652.46271 125.14665,652.50195 C 121.07030,652.68196 117.93038,656.25924 118.11662,660.47614 C 118.30285,664.69302 121.74452,667.94836 125.82086,667.76832 C 128.64019,667.64379 130.93357,665.85431 132.07147,663.39453 C 133.29062,666.04330 135.99007,667.85099 139.08140,667.71446 C 143.15772,667.53442 146.33369,664.06501 146.15367,659.98866 C 145.97364,655.91230 142.50558,652.76757 138.42924,652.94760 C 138.41852,652.94808 138.40872,652.94846 138.39802,652.94898 C 138.90516,649.31332 148.99544,582.24518 150.21242,575.50724 C 151.46757,568.55800 150.73287,521.04944 142.76766,550.12665 z "
   6.217-       id="path7191"
   6.218-       sodipodi:nodetypes="ccssscssscss" />
   6.219-    <path
   6.220-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.221-       d="M 70.112026,725.23378 C 196.77942,746.08337 316.58355,743.97138 438.34231,722.65281"
   6.222-       id="path3574"
   6.223-       sodipodi:nodetypes="cc" />
   6.224-    <path
   6.225-       style="opacity:1.0000000;color:#000000;fill:url(#linearGradient6515);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:3.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
   6.226-       d="M 456.66621,444.89871 C 475.28118,450.63386 493.51137,438.88145 504.22314,445.63641 C 514.93490,452.39137 524.28502,462.05589 541.13718,460.51176 C 557.80512,458.98451 579.09352,450.95426 579.09352,450.95426 C 579.09352,450.95426 558.17039,441.92846 549.14440,431.66233 C 540.11839,421.39621 535.83465,410.77594 519.99221,405.10761 C 498.47786,397.40990 479.61491,401.48012 470.70087,396.43061 C 459.46347,406.21159 456.66621,444.89871 456.66621,444.89871 z "
   6.227-       id="path3572"
   6.228-       sodipodi:nodetypes="csscsscc" />
   6.229-    <path
   6.230-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.231-       d="M 476.70033,405.01034 L 467.44645,438.27363 L 484.10745,436.34116"
   6.232-       id="path3586"
   6.233-       sodipodi:nodetypes="ccc" />
   6.234-    <path
   6.235-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.236-       d="M 498.25829,406.72852 L 492.61695,436.08784"
   6.237-       id="path3588"
   6.238-       sodipodi:nodetypes="cc" />
   6.239-    <path
   6.240-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.241-       d="M 523.32646,417.67134 C 519.81816,412.52468 506.68473,404.66125 505.33079,415.73168 C 503.97684,426.80214 525.41239,424.10169 520.11053,437.40330 C 515.79042,448.24184 501.89764,433.67985 501.89764,433.67985"
   6.242-       id="path3590"
   6.243-       sodipodi:nodetypes="cssc" />
   6.244-    <path
   6.245-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.8630000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.246-       d="M 525.36140,451.00300 L 531.36075,423.06948 C 531.36075,423.06948 545.14439,433.11252 542.29152,439.77667 C 538.41438,448.83345 528.95141,436.27401 528.95141,436.27401"
   6.247-       id="path3592"
   6.248-       sodipodi:nodetypes="ccsc" />
   6.249-    <path
   6.250-       style="fill:url(#linearGradient8713);fill-opacity:1.0;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
   6.251-       d="M 270.51899,473.63452 C 186.03183,473.32884 117.33411,508.62334 108.09375,537.32081 C 100.42250,561.14521 89.846437,628.73395 85.603534,650.88478 C 84.817635,650.58579 83.961816,650.38478 83.072284,650.38478 C 78.991969,650.38476 75.697281,653.82002 75.697284,658.04103 C 75.697282,662.26202 78.991971,665.66604 83.072284,665.66603 C 85.894372,665.66601 88.264466,663.97946 89.509784,661.57228 C 90.610880,664.27225 93.227950,666.19729 96.322284,666.19728 C 100.40259,666.19726 103.72853,662.87136 103.72853,658.79103 C 103.72853,654.71070 100.40259,651.41602 96.322284,651.41603 C 96.311560,651.41603 96.301744,651.41598 96.291034,651.41603 C 96.958087,647.80628 107.04943,590.82074 111.61669,581.08887 C 114.61685,574.69618 238.84164,568.85811 240.75000,574.72706 C 243.50651,583.20447 236.27814,637.10872 234.63478,658.67013 C 234.24628,658.61772 233.88360,658.50053 233.47853,658.51388 C 229.40043,658.64826 226.21453,662.20141 226.35353,666.42013 C 226.49253,670.63886 229.90044,673.92950 233.97853,673.79513 C 236.79908,673.70217 239.09441,671.92951 240.25978,669.48263 C 241.44920,672.14488 244.13588,673.99079 247.22853,673.88888 C 251.30663,673.75452 254.51915,670.31075 254.38478,666.23263 C 254.25042,662.15453 250.83789,658.97325 246.75978,659.10763 C 246.41000,659.11916 246.09186,659.23567 245.75978,659.29513 C 246.92433,642.74667 255.09873,576.54431 259.42392,571.64309 C 262.37946,568.29392 287.10830,566.78265 287.88858,572.13930 C 288.57332,576.84027 300.27776,647.89279 298.96818,655.28002 C 291.03140,655.02048 285.29440,664.47746 289.74349,668.25018 C 293.91482,671.78736 300.98301,672.97801 303.34529,665.55805 C 308.04368,673.55644 315.38495,669.99998 317.88153,666.13649 C 320.02882,662.81352 317.73746,656.01493 307.96818,654.90502 C 311.81199,638.22268 303.11619,563.96683 304.46875,561.97706 C 306.02930,559.68134 313.84474,546.65990 314.62500,537.47706 C 314.73280,536.20836 314.71985,533.92375 314.56250,531.16456 C 338.96788,535.84741 355.35651,538.98893 366.14040,533.06486 C 381.40207,524.68094 384.27702,518.47614 399.81250,508.25831 C 419.15908,495.53388 433.67678,503.16068 442.94710,501.26058 C 452.21743,499.36053 447.92808,486.96815 453.52398,477.50280 C 459.59978,467.22571 432.04243,459.98752 425.71986,468.08875 C 417.85160,478.17050 419.26202,485.20207 412.17309,487.66407 C 402.87743,490.89246 382.69140,503.22203 376.08702,507.88257 C 364.89903,515.77764 354.86141,522.38042 334.84375,514.75831 C 320.03993,507.37383 323.22898,490.84653 303.81250,482.63331 C 294.38984,477.78969 285.27126,473.96796 277.93750,472.69581 C 277.55554,472.60932 277.17096,472.55316 276.78125,472.47706 C 276.32712,472.41403 275.87541,472.36098 275.43750,472.32081 C 273.72290,472.04335 272.38271,473.70349 270.51899,473.63452 z "
   6.252-       id="path1306"
   6.253-       sodipodi:nodetypes="cscssscssscsscssscssscssczczcsscssssssscccscc" />
   6.254-    <path
   6.255-       transform="matrix(0.989097,0.147266,-0.270564,0.962702,0.000000,0.000000)"
   6.256-       style="fill:#e0773e;fill-opacity:1.0000000;stroke:#000000;stroke-width:2.7335560;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
   6.257-       d="M 560.34112,321.05953 C 562.60643,321.05953 564.62104,322.68769 564.62104,326.88038 L 563.99561,441.61088 C 563.99561,445.80357 562.59362,447.05283 560.32831,447.05283 C 558.06301,447.05283 555.81761,445.80357 555.81761,441.61088 L 556.44304,326.88038 C 556.44304,322.68769 558.07582,321.05953 560.34112,321.05953 z "
   6.258-       id="rect2844"
   6.259-       sodipodi:nodetypes="cccsccc" />
   6.260-    <path
   6.261-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.262-       d="M 246.14310,509.11110 C 241.02119,526.84076 255.00793,532.35666 255.00793,532.35666 C 255.00793,532.35666 260.52383,535.90259 264.85774,537.08457 C 269.19166,538.26655 286.67508,543.28995 288.10330,523.88582 C 281.45468,522.01436 246.14310,509.11110 246.14310,509.11110 z "
   6.263-       id="path9395"
   6.264-       sodipodi:nodetypes="ccscc" />
   6.265-    <path
   6.266-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.267-       d="M 281.99642,521.91586 L 278.25349,538.46354"
   6.268-       id="path10849" />
   6.269-    <path
   6.270-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.271-       d="M 275.88954,520.33989 L 271.75261,538.46354"
   6.272-       id="path10851" />
   6.273-    <path
   6.274-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.275-       d="M 270.17664,517.97593 L 266.03972,536.69058"
   6.276-       id="path10853" />
   6.277-    <path
   6.278-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.279-       d="M 264.66075,516.00597 L 260.52383,534.72061 L 264.66075,516.00597 z "
   6.280-       id="path10855" />
   6.281-    <path
   6.282-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.283-       d="M 258.94785,514.03601 L 255.00793,532.35666"
   6.284-       id="path10857" />
   6.285-    <path
   6.286-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.287-       d="M 254.02295,512.26304 L 250.28002,528.21974"
   6.288-       id="path10859" />
   6.289-    <path
   6.290-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.291-       d="M 249.49203,510.09608 L 246.53709,522.30985"
   6.292-       id="path10861" />
   6.293-    <path
   6.294-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.295-       d="M 286.52734,531.37168 C 273.91957,530.97769 253.43196,524.08282 244.96112,517.18795"
   6.296-       id="path10863"
   6.297-       sodipodi:nodetypes="cs" />
   6.298-    <path
   6.299-       style="opacity:1.0000000;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
   6.300-       d="M 314.73918,531.21038 C 287.29383,524.26287 246.50860,508.88870 246.50860,508.88870 C 246.50860,508.88870 236.65196,531.11393 269.32519,538.14820 C 287.57448,542.07710 288.12150,524.25744 288.12150,524.25744"
   6.301-       id="path1334"
   6.302-       sodipodi:nodetypes="ccsc" />
   6.303-    <path
   6.304-       style="opacity:1.0000000;color:#000000;fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
   6.305-       d="M 448.05225,488.20443 C 457.54479,489.43116 460.35916,478.75382 457.08417,473.68765 C 454.09991,469.07122 443.84736,464.04902 441.23893,470.41365 C 439.28318,475.18573 444.45174,477.89625 448.76518,477.45148"
   6.306-       id="path1319"
   6.307-       sodipodi:nodetypes="csss" />
   6.308-    <path
   6.309-       style="fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:1.0000000;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;display:inline;overflow:visible"
   6.310-       d="M 444.43069,493.83066 C 440.55788,491.80306 435.16203,492.23114 437.58543,485.56144 C 439.37673,480.63139 445.27629,484.41451 453.18149,489.82225 C 461.08670,495.22998 452.88813,501.92241 443.28704,501.09310"
   6.311-       id="path1317"
   6.312-       sodipodi:nodetypes="csss" />
   6.313-    <path
   6.314-       style="opacity:1.0000000;color:#000000;fill:#9af286;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
   6.315-       d="M 419.57651,478.78648 C 422.82017,473.02082 423.77214,467.20062 427.28746,465.99345 C 430.68152,464.82794 438.80518,458.88944 441.72524,460.45869 C 444.64525,462.02795 446.97626,467.63368 437.59210,472.14545 C 433.11706,474.29699 432.92789,479.97163 429.29171,482.22177"
   6.316-       id="path1315"
   6.317-       sodipodi:nodetypes="csssz" />
   6.318-    <path
   6.319-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.320-       d="M 204.67588,506.38984 C 204.67588,506.38984 224.38821,503.17905 222.72522,491.92631 C 221.32745,482.46817 207.13035,484.57698 199.99263,486.37428 C 200.44519,492.10976 201.21034,495.26298 194.65310,498.02106 C 201.24775,497.88549 202.75869,499.84733 204.67588,506.38984 z "
   6.321-       id="path15231"
   6.322-       sodipodi:nodetypes="csccc" />
   6.323-    <path
   6.324-       sodipodi:nodetypes="csccc"
   6.325-       id="path15959"
   6.326-       d="M 206.84427,528.80171 C 206.84427,528.80171 226.81416,528.50375 226.81212,517.12879 C 226.81042,507.56792 212.45756,507.58106 205.13390,508.31684 C 204.74411,514.05693 205.04063,517.28808 198.15093,519.05910 C 204.69469,519.88794 205.90297,522.04938 206.84427,528.80171 z "
   6.327-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.328-    <path
   6.329-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.330-       d="M 207.00459,552.07477 C 207.00459,552.07477 226.93742,553.32665 227.81769,541.98581 C 228.55758,532.45361 214.24694,531.35343 206.88827,531.51894 C 206.05443,537.21150 206.09943,540.45592 199.09312,541.68721 C 205.55288,543.02112 206.58987,545.26977 207.00459,552.07477 z "
   6.331-       id="path15961"
   6.332-       sodipodi:nodetypes="csccc" />
   6.333-    <path
   6.334-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.335-       d="M 206.34375 554.53125 C 205.13901 560.15699 204.97815 563.41757 197.90625 564.18750 C 203.30431 565.67653 204.70298 567.72897 205.00000 572.43750 C 211.46987 572.34077 217.37346 572.34767 222.50000 572.46875 C 224.58495 571.12494 226.12602 569.15846 226.53125 566.34375 C 227.89366 556.88047 213.69748 554.84789 206.34375 554.53125 z "
   6.336-       id="path15963" />
   6.337-    <path
   6.338-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.339-       d="M 196.03125 482.84375 C 187.52447 485.04283 179.42599 487.56587 171.87500 490.34375 C 176.36725 491.29017 177.56746 493.45549 178.37500 498.96875 C 178.37500 498.96874 198.12565 498.39857 198.12500 487.68750 C 198.12488 485.59722 197.29605 484.04852 196.03125 482.84375 z "
   6.340-       id="path15965" />
   6.341-    <path
   6.342-       sodipodi:nodetypes="csccc"
   6.343-       id="path15967"
   6.344-       d="M 182.55810,519.59489 C 182.55810,519.59489 202.29393,519.08874 202.32211,508.37771 C 202.34579,499.37485 188.16167,499.54934 180.92217,500.32491 C 180.52175,505.73438 180.80622,508.77360 173.99283,510.51910 C 180.45745,511.22563 181.64578,513.24729 182.55810,519.59489 z "
   6.345-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.346-    <path
   6.347-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.348-       d="M 184.40776,541.79081 C 184.40776,541.79081 204.14359,541.28466 204.17177,530.57363 C 204.19545,521.57077 190.01133,521.74526 182.77183,522.52083 C 182.37141,527.93030 182.65588,530.96952 175.84249,532.71502 C 182.30711,533.42155 183.49544,535.44321 184.40776,541.79081 z "
   6.349-       id="path15971"
   6.350-       sodipodi:nodetypes="csccc" />
   6.351-    <path
   6.352-       sodipodi:nodetypes="csccc"
   6.353-       id="path15973"
   6.354-       d="M 184.54511,562.87630 C 184.54511,562.87630 204.25568,563.99547 205.16493,553.32306 C 205.92917,544.35267 191.77877,543.35968 184.50001,543.53705 C 183.65592,548.89525 183.68940,551.94757 176.75551,553.12663 C 183.14009,554.36259 184.15808,556.47516 184.54511,562.87630 z "
   6.355-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.356-    <path
   6.357-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.358-       d="M 182.96875 564.81250 C 182.32423 568.90383 182.11368 571.62362 179.00000 573.21875 C 187.45278 572.83281 195.60321 572.57296 203.34375 572.43750 C 201.75888 565.52893 189.59312 564.65108 182.96875 564.81250 z "
   6.359-       id="path15975" />
   6.360-    <path
   6.361-       sodipodi:nodetypes="csccc"
   6.362-       id="path15977"
   6.363-       d="M 159.98437,513.05560 C 159.98437,513.05560 179.54898,510.41269 178.41571,499.76174 C 177.46318,490.80938 164.07633,494.00942 156.96360,495.56532 C 157.15202,500.98633 157.06958,502.48804 150.48559,504.96194 C 156.98871,504.96342 158.38922,506.84433 159.98437,513.05560 z "
   6.364-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.365-    <path
   6.366-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.367-       d="M 162.14231,533.71013 C 162.14231,533.71013 181.70692,531.06722 180.57365,520.41627 C 179.62112,511.46391 165.53952,513.17520 158.42679,514.73110 C 158.61521,520.15211 159.22752,523.14257 152.64353,525.61647 C 159.14665,525.61795 160.54716,527.49886 162.14231,533.71013 z "
   6.368-       id="path15979"
   6.369-       sodipodi:nodetypes="csccc" />
   6.370-    <path
   6.371-       sodipodi:nodetypes="csccc"
   6.372-       id="path15981"
   6.373-       d="M 161.73793,553.35464 C 161.73793,553.35464 181.48022,553.38736 181.80074,542.68108 C 182.07015,533.68222 167.88654,533.46950 160.62858,534.04718 C 160.08065,539.44372 160.28207,542.48957 153.42357,544.04844 C 159.86650,544.93116 160.99920,546.98451 161.73793,553.35464 z "
   6.374-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.375-    <path
   6.376-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.377-       d="M 160.85077,573.63589 C 160.85077,573.63589 180.55493,574.86270 181.52246,564.19542 C 182.33569,555.22933 168.19092,554.15908 160.91130,554.29668 C 160.03796,559.65019 160.05477,562.70265 153.11454,563.84381 C 159.49228,565.11464 160.49870,567.23275 160.85077,573.63589 z "
   6.378-       id="path15983"
   6.379-       sodipodi:nodetypes="csccc" />
   6.380-    <path
   6.381-       sodipodi:nodetypes="csccc"
   6.382-       id="path15987"
   6.383-       d="M 141.03633,527.19872 C 141.03633,527.19872 159.26152,523.13440 157.31335,513.12248 C 155.67587,504.70724 142.54253,507.45143 135.96590,509.49341 C 136.59135,514.62008 137.41560,517.40771 131.41325,520.27830 C 137.54385,519.76200 139.01949,521.43450 141.03633,527.19872 z "
   6.384-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.385-    <path
   6.386-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.387-       d="M 141.31895,546.24122 C 141.31895,546.24122 159.85370,543.97419 158.89150,533.81997 C 158.08275,525.28513 144.74435,526.73505 137.99989,528.12573 C 138.12224,533.28896 138.67062,536.14371 132.41687,538.41507 C 138.56859,538.49928 139.87404,540.30775 141.31895,546.24122 z "
   6.388-       id="path15989"
   6.389-       sodipodi:nodetypes="csccc" />
   6.390-    <path
   6.391-       sodipodi:nodetypes="csccc"
   6.392-       id="path15991"
   6.393-       d="M 140.64248,564.70916 C 140.64248,564.70916 159.29210,563.77735 159.06068,553.58027 C 158.86616,545.00940 145.45812,545.49891 138.63128,546.40227 C 138.38299,551.56098 138.72521,554.44771 132.32465,556.26467 C 138.45449,556.78989 139.62687,558.68734 140.64248,564.70916 z "
   6.394-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.395-    <path
   6.396-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.397-       d="M 139.81250 565.50000 C 139.07109 570.61119 139.13895 573.52338 132.59375 574.71875 C 134.51034 575.07033 135.80011 575.55551 136.84375 576.18750 C 143.66955 575.48857 151.25972 574.88782 159.43750 574.34375 C 159.75612 566.05514 146.61893 565.25757 139.81250 565.50000 z "
   6.398-       id="path15995" />
   6.399-    <path
   6.400-       sodipodi:nodetypes="csccc"
   6.401-       id="path15997"
   6.402-       d="M 120.55759,539.29735 C 120.55759,539.29735 138.57310,536.58485 137.29636,527.11255 C 136.22320,519.15085 123.25243,520.93302 116.71571,522.44950 C 117.00680,527.27769 117.63697,529.93188 111.60849,532.25691 C 117.61570,532.13961 118.95000,533.79049 120.55759,539.29735 z "
   6.403-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.404-    <path
   6.405-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.406-       d="M 120.00330,557.06167 C 120.00330,557.06167 138.19701,556.11039 137.84559,546.55890 C 137.55019,538.53063 124.46769,539.04557 117.81465,539.92050 C 117.63579,544.75414 118.00539,547.45696 111.77972,549.18595 C 117.76996,549.65221 118.93774,551.42479 120.00330,557.06167 z "
   6.407-       id="path15999"
   6.408-       sodipodi:nodetypes="csccc" />
   6.409-    <path
   6.410-       sodipodi:nodetypes="csccc"
   6.411-       id="path16003"
   6.412-       d="M 120.31158,575.55827 C 120.31158,575.55827 138.50529,574.60699 138.15387,565.05550 C 137.85847,557.02723 124.77597,557.54217 118.12293,558.41710 C 117.94407,563.25074 118.31367,565.95356 112.08800,567.68255 C 118.07824,568.14881 119.24602,569.92139 120.31158,575.55827 z "
   6.413-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.414-    <path
   6.415-       id="path16013"
   6.416-       d="M 196.03125 482.84375 C 187.52447 485.04283 179.42599 487.56587 171.87500 490.34375 C 176.36725 491.29017 177.56746 493.45549 178.37500 498.96875 C 178.37500 498.96874 198.12565 498.39857 198.12500 487.68750 C 198.12488 485.59722 197.29605 484.04852 196.03125 482.84375 z "
   6.417-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.418-    <path
   6.419-       style="fill:url(#linearGradient2121);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.85000000;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;display:inline;overflow:visible"
   6.420-       d="M 118.59268,523.92715 C 107.25662,543.11126 111.61664,542.23925 121.20870,539.62324 C 130.80075,537.00722 199.68915,522.18314 209.28120,524.79915 C 218.87326,527.41517 232.82534,523.92715 235.44135,513.46309 C 238.05737,502.99903 238.77435,497.54307 250.24821,501.98922 C 269.16027,509.31769 305.20175,516.07910 319.15383,518.69512 C 333.10591,521.31113 348.80200,533.51920 371.47413,520.43913 C 394.14627,507.35905 412.54953,496.39061 421.17842,489.91895 C 422.92243,488.61095 428.62957,475.76353 430.50800,471.34729 C 431.44721,469.13918 439.39286,464.86685 438.95096,463.74334 C 438.50906,462.61984 433.93678,464.55570 429.23763,467.66914 C 424.38217,470.88614 421.27227,486.21977 415.16824,488.83579 C 409.06420,491.45180 389.78624,502.12702 381.93820,508.23106 C 374.09015,514.33509 353.16203,526.54316 339.20995,519.56712 C 325.25787,512.59108 320.02584,499.51101 308.68977,491.66296 C 297.35371,483.81492 248.52143,468.11882 190.09709,487.30294 C 131.67276,506.48705 129.05674,513.46309 118.59268,523.92715 z "
   6.421-       id="path1387"
   6.422-       sodipodi:nodetypes="csssssssszssssssc" />
   6.423-    <path
   6.424-       id="path16018"
   6.425-       d="M 139.81250 565.50000 C 139.07109 570.61119 139.13895 573.52338 132.59375 574.71875 C 134.51034 575.07033 135.80011 575.55551 136.84375 576.18750 C 143.66955 575.48857 151.25972 574.88782 159.43750 574.34375 C 159.75612 566.05514 146.61893 565.25757 139.81250 565.50000 z "
   6.426-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.427-    <path
   6.428-       id="path16023"
   6.429-       d="M 182.96875 564.81250 C 182.32423 568.90383 182.11368 571.62362 179.00000 573.21875 C 187.45278 572.83281 195.60321 572.57296 203.34375 572.43750 C 201.75888 565.52893 189.59312 564.65108 182.96875 564.81250 z "
   6.430-       style="fill:#54de61;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.20767665px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.431-    <path
   6.432-       sodipodi:nodetypes="csccscssscssscss"
   6.433-       id="path16026"
   6.434-       d="M 277.93750,472.69581 C 277.55554,472.60932 277.17096,472.55316 276.78125,472.47706 C 276.32712,472.41403 275.87541,472.36098 275.43750,472.32081 C 273.72290,472.04335 272.38271,473.70349 270.51899,473.63452 C 186.03183,473.32884 117.33411,508.62334 108.09375,537.32081 C 100.42250,561.14521 89.846437,628.73395 85.603534,650.88478 C 84.817635,650.58579 83.961816,650.38478 83.072284,650.38478 C 78.991969,650.38476 75.697281,653.82002 75.697284,658.04103 C 75.697282,662.26202 78.991971,665.66604 83.072284,665.66603 C 85.894372,665.66601 88.264466,663.97946 89.509784,661.57228 C 90.610880,664.27225 93.227950,666.19729 96.322284,666.19728 C 100.40259,666.19726 103.72853,662.87136 103.72853,658.79103 C 103.72853,654.71070 100.40259,651.41602 96.322284,651.41603 C 96.311560,651.41603 96.301744,651.41598 96.291034,651.41603 C 96.958087,647.80628 107.04943,590.82074 111.61669,581.08887 C 114.61685,574.69618 238.84164,568.85811 240.75000,574.72706"
   6.435-       style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3e7e42;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
   6.436-    <path
   6.437-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
   6.438-       d="M 264.36900,453.69048 C 254.12520,453.88747 248.21531,462.55530 252.94322,469.64717 C 257.67113,476.73904 275.79479,475.75405 278.15875,468.46519 C 280.52270,461.17633 270.47589,452.90249 264.36900,453.69048 z "
   6.439-       id="path7197"
   6.440-       sodipodi:nodetypes="cssc" />
   6.441-    <path
   6.442-       id="path7933"
   6.443-       d="M 267.08631,465.48980 C 272.73936,464.34915 271.50467,460.81573 269.28413,458.04415 C 267.06360,455.27256 261.79147,456.90613 261.90136,460.20656 C 262.01124,463.50699 262.96803,465.05075 267.08631,465.48980 z "
   6.444-       style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.445-    <path
   6.446-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
   6.447-       d="M 297.07874,475.12108 C 299.24958,464.52072 293.46063,459.97771 284.05361,459.22055 C 274.64658,458.46337 263.06871,463.00639 267.41041,470.57806 C 271.75211,478.14976 290.56616,488.75011 297.07874,475.12108 z "
   6.448-       id="path1323" />
   6.449-    <path
   6.450-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
   6.451-       d="M 242.39530,460.52578 C 233.60908,465.79612 232.79847,476.25561 240.42934,480.05267 C 248.06021,483.84972 263.28824,473.97327 261.70998,466.47495 C 260.13171,458.97663 247.29944,456.80228 242.39530,460.52578 z "
   6.452-       id="path7199"
   6.453-       sodipodi:nodetypes="cssc" />
   6.454-    <path
   6.455-       style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.456-       d="M 243.68431,469.83581 C 245.28249,475.37691 248.70337,473.85799 251.28448,471.41867 C 253.86561,468.97936 251.80723,463.85812 248.52678,464.23699 C 245.24633,464.61586 243.78580,465.69544 243.68431,469.83581 z "
   6.457-       id="path7935" />
   6.458-    <path
   6.459-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
   6.460-       d="M 271.68386,472.17278 C 265.53310,466.49400 252.86981,463.08675 249.25172,469.90126 C 245.63364,476.71576 247.80448,490.34482 260.82959,489.58764 C 273.85471,488.83047 277.83459,477.85155 271.68386,472.17278 z "
   6.461-       id="path1321"
   6.462-       sodipodi:nodetypes="czzz" />
   6.463-    <path
   6.464-       style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.4350000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none"
   6.465-       d="M 277.96176,469.45019 C 270.27891,470.04118 265.35400,478.90602 271.06689,482.84594 C 276.77978,486.78587 288.59956,486.78587 289.58454,479.30001 C 290.56952,471.81415 284.26564,469.25320 277.96176,469.45019 z "
   6.466-       id="path7195" />
   6.467-    <path
   6.468-       style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.469-       d="M 262.20205,471.61714 C 256.48916,470.82916 256.48916,474.57209 257.67114,477.92102 C 258.85311,481.26996 264.36901,481.46696 265.35399,478.31502 C 266.33897,475.16308 265.94498,473.39011 262.20205,471.61714 z "
   6.470-       id="path7927" />
   6.471-    <path
   6.472-       id="path7929"
   6.473-       d="M 283.40203,472.86341 C 278.97987,472.29768 278.97987,474.98495 279.89481,477.38933 C 280.80972,479.79372 285.07940,479.93516 285.84184,477.67220 C 286.60427,475.40925 286.29931,474.13633 283.40203,472.86341 z "
   6.474-       style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.74548370px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
   6.475-    <path
   6.476-       style="fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.477-       d="M 287.01749,462.95586 C 281.94580,465.70104 284.16055,468.71839 287.09502,470.71872 C 290.02948,472.71907 294.59267,469.61404 293.52166,466.49028 C 292.45064,463.36653 291.08393,462.17038 287.01749,462.95586 z "
   6.478-       id="path7931" />
   6.479-    <path
   6.480-       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.481-       d="M 157.32993,388.01687 C 240.06214,383.69759 287.32367,387.19261 345.54264,390.07213"
   6.482-       id="path3573"
   6.483-       sodipodi:nodetypes="cs" />
   6.484-    <path
   6.485-       style="fill:url(#linearGradient7979);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:2.9830000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.52777778;color:#000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.00000000;visibility:visible;display:inline;overflow:visible"
   6.486-       d="M 299.17307,535.22016 C 307.72087,538.63929 303.44697,563.42791 290.62527,565.13747 C 277.80356,566.84703 191.47076,569.41137 176.08472,570.26615 C 160.69868,571.12093 119.66923,576.24961 119.66923,576.24961 C 119.66923,576.24961 113.68577,571.12093 112.83099,565.99225 C 111.97621,560.86357 169.24648,551.46099 189.76120,550.60621 C 210.27593,549.75143 248.25830,537.79821 253.86971,540.34885 C 272.67489,548.89665 294.04439,536.92972 299.17307,535.22016 z "
   6.487-       id="path7245"
   6.488-       sodipodi:nodetypes="csscsssc" />
   6.489-    <path
   6.490-       style="fill:#86d973;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.491-       d="M 453.19526,478.54252 C 450.22096,478.65268 448.56857,478.21204 448.01777,480.08475 C 447.46697,481.95746 449.44984,485.48255 450.66159,485.81303 C 451.87335,486.14351 455.50860,483.72001 455.72892,482.06762 C 455.94924,480.41523 454.95780,479.20348 453.19526,478.54252 z "
   6.492-       id="path8715" />
   6.493-    <path
   6.494-       style="fill:#86d973;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
   6.495-       d="M 451.76319,491.54131 C 449.56000,490.21940 445.15363,489.66861 444.49267,490.54988 C 443.83172,491.43116 447.35681,491.98195 446.58570,493.74450 C 445.81459,495.50705 444.27236,495.28673 443.72156,496.05784 C 443.17076,496.82896 442.17933,498.15087 443.28092,498.92199 C 444.38251,499.69310 452.20382,498.26103 452.86478,497.15944 C 453.52573,496.05784 455.61876,493.41402 451.76319,491.54131 z "
   6.496-       id="path8717" />
   6.497-  </g>
   6.498-</svg>
     7.1--- a/cdn/style/new.min.css	Tue Apr 30 23:07:50 2024 +0000
     7.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.3@@ -1,1 +0,0 @@
     7.4-:root{--nc-font-sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--nc-font-mono:Consolas,monaco,'Ubuntu Mono','Liberation Mono','Courier New',Courier,monospace;--nc-tx-1:#000000;--nc-tx-2:#1A1A1A;--nc-bg-1:#FFFFFF;--nc-bg-2:#F6F8FA;--nc-bg-3:#E5E7EB;--nc-lk-1:#0070F3;--nc-lk-2:#0366D6;--nc-lk-tx:#FFFFFF;--nc-ac-1:#79FFE1;--nc-ac-tx:#0C4047}@media (prefers-color-scheme:dark){:root{--nc-tx-1:#ffffff;--nc-tx-2:#eeeeee;--nc-bg-1:#000000;--nc-bg-2:#111111;--nc-bg-3:#222222;--nc-lk-1:#3291FF;--nc-lk-2:#0070F3;--nc-lk-tx:#FFFFFF;--nc-ac-1:#7928CA;--nc-ac-tx:#FFFFFF}}*{margin:0;padding:0}address,area,article,aside,audio,blockquote,datalist,details,dl,fieldset,figure,form,iframe,img,input,meter,nav,ol,optgroup,option,output,p,pre,progress,ruby,section,table,textarea,ul,video{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:break-word;overflow-wrap:break-word;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2)}abbr:hover{cursor:help}blockquote{padding:1.5rem;background:var(--nc-bg-2);border-left:5px solid var(--nc-bg-3)}abbr{cursor:help}blockquote :last-child{padding-bottom:0;margin-bottom:0}header{background:var(--nc-bg-2);border-bottom:1px solid var(--nc-bg-3);padding:2rem 1.5rem;margin:-2rem calc(0px - (50vw - 50%)) 2rem;padding-left:calc(50vw - 50%);padding-right:calc(50vw - 50%)}header h1,header h2,header h3{padding-bottom:0;border-bottom:0}header>:first-child{margin-top:0;padding-top:0}header>:last-child{margin-bottom:0}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5;cursor:not-allowed}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background:var(--nc-lk-2)}code,kbd,pre,samp{font-family:var(--nc-font-mono)}code,kbd,pre,samp{background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px;padding:3px 6px;font-size:.9rem}kbd{border-bottom:3px solid var(--nc-bg-3)}pre{padding:1rem 1.4rem;max-width:100%;overflow:auto}pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}code pre{display:inline;background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}details{padding:.6rem 1rem;background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px}summary{cursor:pointer;font-weight:700}details[open]{padding-bottom:.75rem}details[open] summary{margin-bottom:6px}details[open]>:last-child{margin-bottom:0}dt{font-weight:700}dd::before{content:'→ '}hr{border:0;border-bottom:1px solid var(--nc-bg-3);margin:1rem auto}fieldset{margin-top:1rem;padding:2rem;border:1px solid var(--nc-bg-3);border-radius:4px}legend{padding:auto .5rem}table{border-collapse:collapse;width:100%}td,th{border:1px solid var(--nc-bg-3);text-align:left;padding:.5rem}th{background:var(--nc-bg-2)}tr:nth-child(even){background:var(--nc-bg-2)}table caption{font-weight:700;margin-bottom:.5rem}textarea{max-width:100%}ol,ul{padding-left:2rem}li{margin-top:.4rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}mark{padding:3px 6px;background:var(--nc-ac-1);color:var(--nc-ac-tx)}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;background:var(--nc-bg-2);color:var(--nc-tx-2);border:1px solid var(--nc-bg-3);border-radius:4px;box-shadow:none;box-sizing:border-box}img{max-width:100%}
     8.1--- a/cdn/style/sakura.css	Tue Apr 30 23:07:50 2024 +0000
     8.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.3@@ -1,226 +0,0 @@
     8.4-/* Sakura.css v1.5.0
     8.5- * ================
     8.6- * Minimal css theme.
     8.7- * Project: https://github.com/oxalorg/sakura/
     8.8- */
     8.9-/* Body */
    8.10-html {
    8.11-  font-size: 62.5%;
    8.12-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
    8.13-}
    8.14-
    8.15-body {
    8.16-  font-size: 1.8rem;
    8.17-  line-height: 1.618;
    8.18-  max-width: 38em;
    8.19-  margin: auto;
    8.20-  color: #4a4a4a;
    8.21-  background-color: #f9f9f9;
    8.22-  padding: 13px;
    8.23-}
    8.24-
    8.25-@media (max-width: 684px) {
    8.26-  body {
    8.27-    font-size: 1.53rem;
    8.28-  }
    8.29-}
    8.30-@media (max-width: 382px) {
    8.31-  body {
    8.32-    font-size: 1.35rem;
    8.33-  }
    8.34-}
    8.35-h1, h2, h3, h4, h5, h6 {
    8.36-  line-height: 1.1;
    8.37-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
    8.38-  font-weight: 700;
    8.39-  margin-top: 3rem;
    8.40-  margin-bottom: 1.5rem;
    8.41-  overflow-wrap: break-word;
    8.42-  word-wrap: break-word;
    8.43-  -ms-word-break: break-all;
    8.44-  word-break: break-word;
    8.45-}
    8.46-
    8.47-h1 {
    8.48-  font-size: 2.35em;
    8.49-}
    8.50-
    8.51-h2 {
    8.52-  font-size: 2em;
    8.53-}
    8.54-
    8.55-h3 {
    8.56-  font-size: 1.75em;
    8.57-}
    8.58-
    8.59-h4 {
    8.60-  font-size: 1.5em;
    8.61-}
    8.62-
    8.63-h5 {
    8.64-  font-size: 1.25em;
    8.65-}
    8.66-
    8.67-h6 {
    8.68-  font-size: 1em;
    8.69-}
    8.70-
    8.71-p {
    8.72-  margin-top: 0px;
    8.73-  margin-bottom: 2.5rem;
    8.74-}
    8.75-
    8.76-small, sub, sup {
    8.77-  font-size: 75%;
    8.78-}
    8.79-
    8.80-hr {
    8.81-  border-color: #1d7484;
    8.82-}
    8.83-
    8.84-a {
    8.85-  text-decoration: none;
    8.86-  color: #1d7484;
    8.87-}
    8.88-a:visited {
    8.89-  color: #144f5a;
    8.90-}
    8.91-a:hover {
    8.92-  color: #982c61;
    8.93-  border-bottom: 2px solid #4a4a4a;
    8.94-}
    8.95-
    8.96-ul {
    8.97-  padding-left: 1.4em;
    8.98-  margin-top: 0px;
    8.99-  margin-bottom: 2.5rem;
   8.100-}
   8.101-
   8.102-li {
   8.103-  margin-bottom: 0.4em;
   8.104-}
   8.105-
   8.106-blockquote {
   8.107-  margin-left: 0px;
   8.108-  margin-right: 0px;
   8.109-  padding-left: 1em;
   8.110-  padding-top: 0.8em;
   8.111-  padding-bottom: 0.8em;
   8.112-  padding-right: 0.8em;
   8.113-  border-left: 5px solid #1d7484;
   8.114-  margin-bottom: 2.5rem;
   8.115-  background-color: #f1f1f1;
   8.116-}
   8.117-
   8.118-blockquote p {
   8.119-  margin-bottom: 0;
   8.120-}
   8.121-
   8.122-img, video {
   8.123-  height: auto;
   8.124-  max-width: 100%;
   8.125-  margin-top: 0px;
   8.126-  margin-bottom: 2.5rem;
   8.127-}
   8.128-
   8.129-/* Pre and Code */
   8.130-pre {
   8.131-  background-color: #f1f1f1;
   8.132-  display: block;
   8.133-  padding: 1em;
   8.134-  overflow-x: auto;
   8.135-  margin-top: 0px;
   8.136-  margin-bottom: 2.5rem;
   8.137-  font-size: 0.9em;
   8.138-}
   8.139-
   8.140-code, kbd, samp {
   8.141-  font-size: 0.9em;
   8.142-  padding: 0 0.5em;
   8.143-  background-color: #f1f1f1;
   8.144-  white-space: pre-wrap;
   8.145-}
   8.146-
   8.147-pre > code {
   8.148-  padding: 0;
   8.149-  background-color: transparent;
   8.150-  white-space: pre;
   8.151-  font-size: 1em;
   8.152-}
   8.153-
   8.154-/* Tables */
   8.155-table {
   8.156-  text-align: justify;
   8.157-  width: 100%;
   8.158-  border-collapse: collapse;
   8.159-  margin-bottom: 2rem;
   8.160-}
   8.161-
   8.162-td, th {
   8.163-  padding: 0.5em;
   8.164-  border-bottom: 1px solid #f1f1f1;
   8.165-}
   8.166-
   8.167-/* Buttons, forms and input */
   8.168-input, textarea {
   8.169-  border: 1px solid #4a4a4a;
   8.170-}
   8.171-input:focus, textarea:focus {
   8.172-  border: 1px solid #1d7484;
   8.173-}
   8.174-
   8.175-textarea {
   8.176-  width: 100%;
   8.177-}
   8.178-
   8.179-.button, button, input[type=submit], input[type=reset], input[type=button], input[type=file]::file-selector-button {
   8.180-  display: inline-block;
   8.181-  padding: 5px 10px;
   8.182-  text-align: center;
   8.183-  text-decoration: none;
   8.184-  white-space: nowrap;
   8.185-  background-color: #1d7484;
   8.186-  color: #f9f9f9;
   8.187-  border-radius: 1px;
   8.188-  border: 1px solid #1d7484;
   8.189-  cursor: pointer;
   8.190-  box-sizing: border-box;
   8.191-}
   8.192-.button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled], input[type=file]::file-selector-button[disabled] {
   8.193-  cursor: default;
   8.194-  opacity: 0.5;
   8.195-}
   8.196-.button:hover, button:hover, input[type=submit]:hover, input[type=reset]:hover, input[type=button]:hover, input[type=file]::file-selector-button:hover {
   8.197-  background-color: #982c61;
   8.198-  color: #f9f9f9;
   8.199-  outline: 0;
   8.200-}
   8.201-.button:focus-visible, button:focus-visible, input[type=submit]:focus-visible, input[type=reset]:focus-visible, input[type=button]:focus-visible, input[type=file]::file-selector-button:focus-visible {
   8.202-  outline-style: solid;
   8.203-  outline-width: 2px;
   8.204-}
   8.205-
   8.206-textarea, select, input {
   8.207-  color: #4a4a4a;
   8.208-  padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
   8.209-  margin-bottom: 10px;
   8.210-  background-color: #f1f1f1;
   8.211-  border: 1px solid #f1f1f1;
   8.212-  border-radius: 4px;
   8.213-  box-shadow: none;
   8.214-  box-sizing: border-box;
   8.215-}
   8.216-textarea:focus, select:focus, input:focus {
   8.217-  border: 1px solid #1d7484;
   8.218-  outline: 0;
   8.219-}
   8.220-
   8.221-input[type=checkbox]:focus {
   8.222-  outline: 1px dotted #1d7484;
   8.223-}
   8.224-
   8.225-label, legend, fieldset {
   8.226-  display: block;
   8.227-  margin-bottom: 0.5rem;
   8.228-  font-weight: 600;
   8.229-}
     9.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2+++ b/check.sh	Tue Apr 30 23:08:08 2024 +0000
     9.3@@ -0,0 +1,396 @@
     9.4+#!/usr/bin/env sh
     9.5+set -eu
     9.6+main() {
     9.7+  need_cmd uname
     9.8+  need_cmd mktemp
     9.9+  need_cmd chmod
    9.10+  need_cmd mkdir
    9.11+  need_cmd rm
    9.12+  need_cmd rmdir
    9.13+  need_cmd tar
    9.14+  need_cmd zstd
    9.15+  need_cmd hg
    9.16+  need_cmd git
    9.17+  need_cmd clang
    9.18+  need_cmd grep
    9.19+  need_cmd awk
    9.20+  need_cmd head
    9.21+  need_cmd tail
    9.22+  host_config_file=host.sxp
    9.23+  rm $host_config_file
    9.24+  check_mem
    9.25+  check_disk
    9.26+  check_mod kvm
    9.27+  get_architecture || return 1
    9.28+  local _arch="$RETVAL"
    9.29+  assert_nz "$_arch" "arch"
    9.30+  _write ";; -*- mode:skel -*-"
    9.31+  _write ":arch \"$_arch\""
    9.32+  kernel_version
    9.33+  local _kernel_version="$RETVAL"
    9.34+  _write ":kernel \"$_kernel_version\""
    9.35+  check_cpus
    9.36+  local _num_cpus="$RETVAL"
    9.37+  _write ":cpus $_num_cpus"
    9.38+  case "$_arch" in
    9.39+    *windows*)
    9.40+      _write ":ext \"exe\""
    9.41+      ;;
    9.42+    *)
    9.43+      _write ":ext nil"
    9.44+  esac
    9.45+}
    9.46+
    9.47+say() {
    9.48+  printf '%s\n' "$1"
    9.49+}
    9.50+
    9.51+_write() {
    9.52+  say "$1" >> $host_config_file
    9.53+}
    9.54+
    9.55+err() {
    9.56+  say "$1" >&2
    9.57+  exit 1
    9.58+}
    9.59+
    9.60+assert_nz() {
    9.61+  if [ -z "$1" ]; then err "assert_nz $2"; fi
    9.62+}
    9.63+
    9.64+check_cmd() {
    9.65+  command -v "$1" > /dev/null 2>&1
    9.66+}
    9.67+
    9.68+need_cmd() {
    9.69+  if ! check_cmd "$1"; then
    9.70+    err "need '$1' (command not found)"
    9.71+  fi
    9.72+}
    9.73+
    9.74+ensure() {
    9.75+  if ! "$@"; then err "command failed: $*"; fi
    9.76+}
    9.77+
    9.78+check_proc() {
    9.79+  # Check for /proc by looking for the /proc/self/exe link
    9.80+  # This is only run on Linux
    9.81+  if ! test -L /proc/self/exe ; then
    9.82+    err "fatal: Unable to find /proc/self/exe.  Is /proc mounted?  Installation cannot proceed without /proc."
    9.83+  fi
    9.84+}
    9.85+
    9.86+get_bitness() {
    9.87+  # Architecture detection without dependencies beyond coreutils.
    9.88+  # ELF files start out "\x7fELF", and the following byte is
    9.89+  #   0x01 for 32-bit and
    9.90+  #   0x02 for 64-bit.
    9.91+  # The printf builtin on some shells like dash only supports octal
    9.92+  # escape sequences, so we use those.
    9.93+  local _current_exe_head
    9.94+  _current_exe_head=$(head -c 5 /proc/self/exe )
    9.95+  if [ "$_current_exe_head" = "$(printf '\177ELF\001')" ]; then
    9.96+    echo 32
    9.97+  elif [ "$_current_exe_head" = "$(printf '\177ELF\002')" ]; then
    9.98+    echo 64
    9.99+  else
   9.100+    err "unknown platform bitness"
   9.101+  fi
   9.102+}
   9.103+
   9.104+is_host_amd64_elf() {
   9.105+  # ELF e_machine detection without dependencies beyond coreutils.
   9.106+  # Two-byte field at offset 0x12 indicates the CPU,
   9.107+  # but we're interested in it being 0x3E to indicate amd64, or not that.
   9.108+  local _current_exe_machine
   9.109+  _current_exe_machine=$(head -c 19 /proc/self/exe | tail -c 1)
   9.110+  [ "$_current_exe_machine" = "$(printf '\076')" ]
   9.111+}
   9.112+
   9.113+get_endianness() {
   9.114+  local cputype=$1
   9.115+  local suffix_eb=$2
   9.116+  local suffix_el=$3
   9.117+
   9.118+  # detect endianness without od/hexdump, like get_bitness() does.
   9.119+  local _current_exe_endianness
   9.120+  _current_exe_endianness="$(head -c 6 /proc/self/exe | tail -c 1)"
   9.121+  if [ "$_current_exe_endianness" = "$(printf '\001')" ]; then
   9.122+    echo "${cputype}${suffix_el}"
   9.123+  elif [ "$_current_exe_endianness" = "$(printf '\002')" ]; then
   9.124+    echo "${cputype}${suffix_eb}"
   9.125+  else
   9.126+    err "unknown platform endianness"
   9.127+  fi
   9.128+}
   9.129+
   9.130+get_architecture() {
   9.131+  local _ostype _cputype _bitness _arch _clibtype
   9.132+  _ostype="$(uname -s)"
   9.133+  _cputype="$(uname -m)"
   9.134+  _clibtype="gnu"
   9.135+
   9.136+  if [ "$_ostype" = Linux ]; then
   9.137+    if [ "$(uname -o)" = Android ]; then
   9.138+      _ostype=Android
   9.139+    fi
   9.140+    if ldd --version 2>&1 | grep -q 'musl'; then
   9.141+      _clibtype="musl"
   9.142+    fi
   9.143+  fi
   9.144+
   9.145+  if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then
   9.146+    # Darwin `uname -m` lies
   9.147+    if sysctl hw.optional.x86_64 | grep -q ': 1'; then
   9.148+      _cputype=x86_64
   9.149+    fi
   9.150+  fi
   9.151+
   9.152+  if [ "$_ostype" = SunOS ]; then
   9.153+    # Both Solaris and illumos presently announce as "SunOS" in "uname -s"
   9.154+    # so use "uname -o" to disambiguate.  We use the full path to the
   9.155+    # system uname in case the user has coreutils uname first in PATH,
   9.156+    # which has historically sometimes printed the wrong value here.
   9.157+    if [ "$(/usr/bin/uname -o)" = illumos ]; then
   9.158+      _ostype=illumos
   9.159+    fi
   9.160+
   9.161+    # illumos systems have multi-arch userlands, and "uname -m" reports the
   9.162+    # machine hardware name; e.g., "i86pc" on both 32- and 64-bit x86
   9.163+    # systems.  Check for the native (widest) instruction set on the
   9.164+    # running kernel:
   9.165+    if [ "$_cputype" = i86pc ]; then
   9.166+      _cputype="$(isainfo -n)"
   9.167+    fi
   9.168+  fi
   9.169+
   9.170+  case "$_ostype" in
   9.171+
   9.172+    Android)
   9.173+      _ostype=linux-android
   9.174+      ;;
   9.175+
   9.176+    Linux)
   9.177+      check_proc
   9.178+      _ostype=unknown-linux-$_clibtype
   9.179+      _bitness=$(get_bitness)
   9.180+      ;;
   9.181+
   9.182+    FreeBSD)
   9.183+      _ostype=unknown-freebsd
   9.184+      ;;
   9.185+
   9.186+    NetBSD)
   9.187+      _ostype=unknown-netbsd
   9.188+      ;;
   9.189+
   9.190+    DragonFly)
   9.191+      _ostype=unknown-dragonfly
   9.192+      ;;
   9.193+
   9.194+    Darwin)
   9.195+      _ostype=apple-darwin
   9.196+      ;;
   9.197+
   9.198+    illumos)
   9.199+      _ostype=unknown-illumos
   9.200+      ;;
   9.201+
   9.202+    MINGW* | MSYS* | CYGWIN* | Windows_NT)
   9.203+      _ostype=pc-windows-gnu
   9.204+      ;;
   9.205+
   9.206+    *)
   9.207+      err "unrecognized OS type: $_ostype"
   9.208+      ;;
   9.209+
   9.210+  esac
   9.211+
   9.212+  case "$_cputype" in
   9.213+
   9.214+    i386 | i486 | i686 | i786 | x86)
   9.215+      _cputype=i686
   9.216+      ;;
   9.217+
   9.218+    xscale | arm)
   9.219+      _cputype=arm
   9.220+      if [ "$_ostype" = "linux-android" ]; then
   9.221+        _ostype=linux-androideabi
   9.222+      fi
   9.223+      ;;
   9.224+
   9.225+    armv6l)
   9.226+      _cputype=arm
   9.227+      if [ "$_ostype" = "linux-android" ]; then
   9.228+        _ostype=linux-androideabi
   9.229+      else
   9.230+        _ostype="${_ostype}eabihf"
   9.231+      fi
   9.232+      ;;
   9.233+
   9.234+    armv7l | armv8l)
   9.235+      _cputype=armv7
   9.236+      if [ "$_ostype" = "linux-android" ]; then
   9.237+        _ostype=linux-androideabi
   9.238+      else
   9.239+        _ostype="${_ostype}eabihf"
   9.240+      fi
   9.241+      ;;
   9.242+
   9.243+    aarch64 | arm64)
   9.244+      _cputype=aarch64
   9.245+      ;;
   9.246+
   9.247+    x86_64 | x86-64 | x64 | amd64)
   9.248+      _cputype=x86_64
   9.249+      ;;
   9.250+
   9.251+    mips)
   9.252+      _cputype=$(get_endianness mips '' el)
   9.253+      ;;
   9.254+
   9.255+    mips64)
   9.256+      if [ "$_bitness" -eq 64 ]; then
   9.257+        # only n64 ABI is supported for now
   9.258+        _ostype="${_ostype}abi64"
   9.259+        _cputype=$(get_endianness mips64 '' el)
   9.260+      fi
   9.261+      ;;
   9.262+
   9.263+    ppc)
   9.264+      _cputype=powerpc
   9.265+      ;;
   9.266+
   9.267+    ppc64)
   9.268+      _cputype=powerpc64
   9.269+      ;;
   9.270+
   9.271+    ppc64le)
   9.272+      _cputype=powerpc64le
   9.273+      ;;
   9.274+
   9.275+    s390x)
   9.276+      _cputype=s390x
   9.277+      ;;
   9.278+    riscv64)
   9.279+      _cputype=riscv64gc
   9.280+      ;;
   9.281+    loongarch64)
   9.282+      _cputype=loongarch64
   9.283+      ;;
   9.284+    *)
   9.285+      err "unknown CPU type: $_cputype"
   9.286+
   9.287+  esac
   9.288+
   9.289+  # Detect 64-bit linux with 32-bit userland
   9.290+  if [ "${_ostype}" = unknown-linux-gnu ] && [ "${_bitness}" -eq 32 ]; then
   9.291+    case $_cputype in
   9.292+      x86_64)
   9.293+        if [ -n "${CPUTYPE:-}" ]; then
   9.294+          _cputype="$CPUTYPE"
   9.295+        else {
   9.296+          # 32-bit executable for amd64 = x32
   9.297+          if is_host_amd64_elf; then {
   9.298+            echo "This host is running an x32 userland; as it stands, x32 support is poor," 1>&2
   9.299+            echo "and there isn't a native toolchain -- you will have to install" 1>&2
   9.300+            echo "multiarch compatibility with i686 and/or amd64, then select one" 1>&2
   9.301+            echo "by re-running this script with the CPUTYPE environment variable" 1>&2
   9.302+            echo "set to i686 or x86_64, respectively." 1>&2
   9.303+            exit 1
   9.304+          }; else
   9.305+            _cputype=i686
   9.306+          fi
   9.307+        }; fi
   9.308+        ;;
   9.309+      mips64)
   9.310+        _cputype=$(get_endianness mips '' el)
   9.311+        ;;
   9.312+      powerpc64)
   9.313+        _cputype=powerpc
   9.314+        ;;
   9.315+      aarch64)
   9.316+        _cputype=armv7
   9.317+        if [ "$_ostype" = "linux-android" ]; then
   9.318+          _ostype=linux-androideabi
   9.319+        else
   9.320+          _ostype="${_ostype}eabihf"
   9.321+        fi
   9.322+        ;;
   9.323+      riscv64gc)
   9.324+        err "riscv64 with 32-bit userland unsupported"
   9.325+        ;;
   9.326+    esac
   9.327+  fi
   9.328+
   9.329+  if [ "$_ostype" = "unknown-linux-gnueabihf" ] && [ "$_cputype" = armv7 ]; then
   9.330+    if ensure grep '^Features' /proc/cpuinfo | grep -q -v neon; then
   9.331+      # At least one processor does not have NEON.
   9.332+      _cputype=arm
   9.333+    fi
   9.334+  fi
   9.335+
   9.336+  _arch="${_cputype}-${_ostype}"
   9.337+
   9.338+  RETVAL="$_arch"
   9.339+}
   9.340+
   9.341+mem_total () {
   9.342+  local _mem_total
   9.343+  _mem_total=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
   9.344+  RETVAL="$_mem_total"
   9.345+}
   9.346+
   9.347+check_mem () {
   9.348+  mem_total
   9.349+  local _mem_total="$RETVAL"
   9.350+  local _mem_min=8388608 # 8Gb in kB
   9.351+  if [ "$_mem_total" -lt "$_mem_min" ]; then
   9.352+    err "not enough memory: $_mem_total < $_mem_min";
   9.353+  fi
   9.354+}
   9.355+
   9.356+disk_free () {
   9.357+  local _disk_free
   9.358+  _disk_free=$(df -kh . | tail -n1 | awk '{print $4}')
   9.359+  RETVAL="${_disk_free%?}"
   9.360+}
   9.361+
   9.362+check_disk () {
   9.363+  disk_free
   9.364+  local _disk_free="$RETVAL"
   9.365+  local _disk_min=32 # in Gigabytes
   9.366+  if [ "$_disk_free" -lt "$_disk_min" ]; then
   9.367+    err "not enough disk space: $_disk_free < $_disk_min"
   9.368+  fi
   9.369+}
   9.370+
   9.371+kernel_version () {
   9.372+  local _kernel_version
   9.373+  _kernel_version=$(uname -r)
   9.374+  RETVAL="$_kernel_version"
   9.375+}
   9.376+
   9.377+check_mod () {
   9.378+  if ! lsmod | grep -wq "$1"; then
   9.379+    err "kernel module $1 isn't loaded"
   9.380+  fi
   9.381+}
   9.382+
   9.383+num_cpus () {
   9.384+  local _num_cpus
   9.385+  _num_cpus=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null)
   9.386+  RETVAL="$_num_cpus"
   9.387+  # sysctl -n hw.ncpu # nproc --all
   9.388+}
   9.389+
   9.390+check_cpus () {
   9.391+  num_cpus
   9.392+  local _num_cpus="$RETVAL"
   9.393+  local _min_cpus=8
   9.394+  if [ "$_num_cpus" -lt "$_min_cpus" ]; then
   9.395+    err "not enough cpu threads ($_num_cpus < $_min_cpus)"
   9.396+  fi
   9.397+}
   9.398+
   9.399+main "$@" || exit 1
    10.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2+++ b/default.sxp	Tue Apr 30 23:08:08 2024 +0000
    10.3@@ -0,0 +1,13 @@
    10.4+;; -*- mode:skel -*-
    10.5+:sbcl-version "2.4.4"
    10.6+:stash ".stash"
    10.7+:dist nil
    10.8+:install-root "/usr/local"
    10.9+:log-level :debug
   10.10+:features
   10.11+(:sbcl
   10.12+ :sbcl-docs
   10.13+ :rust :cargo-tools
   10.14+ :tree-sitter :tree-sitter-langs
   10.15+ :skel :packy
   10.16+ :emacs-mini)
    11.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2+++ b/deploy.lisp	Tue Apr 30 23:08:08 2024 +0000
    11.3@@ -0,0 +1,11 @@
    11.4+;;; deploy.lisp --- yeeting blobs across the yard
    11.5+
    11.6+;;
    11.7+
    11.8+;;; Code:
    11.9+(in-package :std-user)
   11.10+
   11.11+(defpkg :infra/deploy
   11.12+  (:use :cl :skel :packy :dat/json))
   11.13+
   11.14+(in-package :infra/deploy)
    12.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2+++ b/install.sh	Tue Apr 30 23:08:08 2024 +0000
    12.3@@ -0,0 +1,577 @@
    12.4+#!/bin/sh
    12.5+set -eu
    12.6+main() {
    12.7+  downloader --check
    12.8+  need_cmd uname
    12.9+  need_cmd mktemp
   12.10+  need_cmd chmod
   12.11+  need_cmd mkdir
   12.12+  need_cmd rm
   12.13+  need_cmd rmdir
   12.14+  get_architecture || return 1
   12.15+  local _arch="$RETVAL"
   12.16+  assert_nz "$_arch" "arch"
   12.17+  local _ext=""
   12.18+  case "$_arch" in
   12.19+    *windows*)
   12.20+      _ext=".exe"
   12.21+      ;;
   12.22+  esac
   12.23+  local _url="https://packy.compiler.company/dist/${_arch}/cc-install${_ext}"
   12.24+  local _dir
   12.25+  if ! _dir="$(ensure mktemp -d)"; then
   12.26+    # Because the previous command ran in a subshell, we must manually
   12.27+    # propagate exit status.
   12.28+    exit 1
   12.29+  fi
   12.30+  local _file="${_dir}/cc-install${_ext}"
   12.31+  printf '%s\n' 'info: installing artifacts...' 1>&2
   12.32+  ensure mkdir -p "$_dir"
   12.33+  ensure downloader "$_url" "$_file" "$_arch"
   12.34+  ensure chmod u+x "$_file"
   12.35+  if [ ! -x "$_file" ]; then
   12.36+    printf '%s\n' "Cannot execute $_file (likely because of mounting /tmp as noexec)." 1>&2
   12.37+    printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./cc-install${_ext}." 1>&2
   12.38+    exit 1
   12.39+  fi
   12.40+  "$_file" "$@"
   12.41+  local _retval=$?
   12.42+  rm "$_file"
   12.43+  rmdir "$_dir"
   12.44+  return "$_retval"
   12.45+}
   12.46+
   12.47+say() {
   12.48+  printf 'compiler.company: %s\n' "$1"
   12.49+}
   12.50+
   12.51+err() {
   12.52+  say "$1" >&2
   12.53+  exit 1
   12.54+}
   12.55+
   12.56+assert_nz() {
   12.57+  if [ -z "$1" ]; then err "assert_nz $2"; fi
   12.58+}
   12.59+
   12.60+check_cmd() {
   12.61+  command -v "$1" > /dev/null 2>&1
   12.62+}
   12.63+
   12.64+need_cmd() {
   12.65+  if ! check_cmd "$1"; then
   12.66+    err "need '$1' (command not found)"
   12.67+  fi
   12.68+}
   12.69+
   12.70+# Run a command that should never fail. If the command fails execution
   12.71+# will immediately terminate with an error showing the failing
   12.72+# command.
   12.73+ensure() {
   12.74+  if ! "$@"; then err "command failed: $*"; fi
   12.75+}
   12.76+
   12.77+# Check if curl supports the --retry flag, then pass it to the curl invocation.
   12.78+check_curl_for_retry_support() {
   12.79+  local _retry_supported=""
   12.80+  # "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.
   12.81+  if check_help_for "notspecified" "curl" "--retry"; then
   12.82+    _retry_supported="--retry 3"
   12.83+    if check_help_for "notspecified" "curl" "--continue-at"; then
   12.84+      # "-C -" tells curl to automatically find where to resume the download when retrying.
   12.85+      _retry_supported="--retry 3 -C -"
   12.86+    fi
   12.87+  fi
   12.88+
   12.89+  RETVAL="$_retry_supported"
   12.90+}
   12.91+
   12.92+# Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites
   12.93+# if support by local tools is detected. Detection currently supports these curl backends:
   12.94+# GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty.
   12.95+get_ciphersuites_for_curl() {
   12.96+  if [ -n "${TLS_CIPHERSUITES-}" ]; then
   12.97+    # user specified custom cipher suites, assume they know what they're doing
   12.98+    RETVAL="$TLS_CIPHERSUITES"
   12.99+    return
  12.100+  fi
  12.101+
  12.102+  local _openssl_syntax="no"
  12.103+  local _gnutls_syntax="no"
  12.104+  local _backend_supported="yes"
  12.105+  if curl -V | grep -q ' OpenSSL/'; then
  12.106+    _openssl_syntax="yes"
  12.107+  elif curl -V | grep -iq ' LibreSSL/'; then
  12.108+    _openssl_syntax="yes"
  12.109+  elif curl -V | grep -iq ' BoringSSL/'; then
  12.110+    _openssl_syntax="yes"
  12.111+  elif curl -V | grep -iq ' GnuTLS/'; then
  12.112+    _gnutls_syntax="yes"
  12.113+  else
  12.114+    _backend_supported="no"
  12.115+  fi
  12.116+
  12.117+  local _args_supported="no"
  12.118+  if [ "$_backend_supported" = "yes" ]; then
  12.119+    # "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.
  12.120+    if check_help_for "notspecified" "curl" "--tlsv1.2" "--ciphers" "--proto"; then
  12.121+      _args_supported="yes"
  12.122+    fi
  12.123+  fi
  12.124+
  12.125+  local _cs=""
  12.126+  if [ "$_args_supported" = "yes" ]; then
  12.127+    if [ "$_openssl_syntax" = "yes" ]; then
  12.128+      _cs=$(get_strong_ciphersuites_for "openssl")
  12.129+    elif [ "$_gnutls_syntax" = "yes" ]; then
  12.130+      _cs=$(get_strong_ciphersuites_for "gnutls")
  12.131+    fi
  12.132+  fi
  12.133+
  12.134+  RETVAL="$_cs"
  12.135+}
  12.136+
  12.137+# Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites
  12.138+# if support by local tools is detected. Detection currently supports these wget backends:
  12.139+# GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty.
  12.140+get_ciphersuites_for_wget() {
  12.141+  if [ -n "${TLS_CIPHERSUITES-}" ]; then
  12.142+    # user specified custom cipher suites, assume they know what they're doing
  12.143+    RETVAL="$TLS_CIPHERSUITES"
  12.144+    return
  12.145+  fi
  12.146+
  12.147+  local _cs=""
  12.148+  if wget -V | grep -q '\-DHAVE_LIBSSL'; then
  12.149+    # "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.
  12.150+    if check_help_for "notspecified" "wget" "TLSv1_2" "--ciphers" "--https-only" "--secure-protocol"; then
  12.151+      _cs=$(get_strong_ciphersuites_for "openssl")
  12.152+    fi
  12.153+  elif wget -V | grep -q '\-DHAVE_LIBGNUTLS'; then
  12.154+    # "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.
  12.155+    if check_help_for "notspecified" "wget" "TLSv1_2" "--ciphers" "--https-only" "--secure-protocol"; then
  12.156+      _cs=$(get_strong_ciphersuites_for "gnutls")
  12.157+    fi
  12.158+  fi
  12.159+
  12.160+  RETVAL="$_cs"
  12.161+}
  12.162+
  12.163+check_help_for() {
  12.164+    local _arch
  12.165+    local _cmd
  12.166+    local _arg
  12.167+    _arch="$1"
  12.168+    shift
  12.169+    _cmd="$1"
  12.170+    shift
  12.171+
  12.172+    local _category
  12.173+    if "$_cmd" --help | grep -q 'For all options use the manual or "--help all".'; then
  12.174+      _category="all"
  12.175+    else
  12.176+      _category=""
  12.177+    fi
  12.178+
  12.179+    case "$_arch" in
  12.180+
  12.181+        *darwin*)
  12.182+        if check_cmd sw_vers; then
  12.183+            case $(sw_vers -productVersion) in
  12.184+                10.*)
  12.185+                    # If we're running on macOS, older than 10.13, then we always
  12.186+                    # fail to find these options to force fallback
  12.187+                    if [ "$(sw_vers -productVersion | cut -d. -f2)" -lt 13 ]; then
  12.188+                        # Older than 10.13
  12.189+                        echo "Warning: Detected macOS platform older than 10.13"
  12.190+                        return 1
  12.191+                    fi
  12.192+                    ;;
  12.193+                11.*)
  12.194+                    # We assume Big Sur will be OK for now
  12.195+                    ;;
  12.196+                *)
  12.197+                    # Unknown product version, warn and continue
  12.198+                    echo "Warning: Detected unknown macOS major version: $(sw_vers -productVersion)"
  12.199+                    echo "Warning TLS capabilities detection may fail"
  12.200+                    ;;
  12.201+            esac
  12.202+        fi
  12.203+        ;;
  12.204+
  12.205+    esac
  12.206+
  12.207+    for _arg in "$@"; do
  12.208+        if ! "$_cmd" --help "$_category" | grep -q -- "$_arg"; then
  12.209+            return 1
  12.210+        fi
  12.211+    done
  12.212+
  12.213+    true # not strictly needed
  12.214+}
  12.215+
  12.216+# Return strong TLS 1.2-1.3 cipher suites in OpenSSL or GnuTLS syntax. TLS 1.2
  12.217+# excludes non-ECDHE and non-AEAD cipher suites. DHE is excluded due to bad
  12.218+# DH params often found on servers (see RFC 7919). Sequence matches or is
  12.219+# similar to Firefox 68 ESR with weak cipher suites disabled via about:config.
  12.220+# $1 must be openssl or gnutls.
  12.221+get_strong_ciphersuites_for() {
  12.222+  if [ "$1" = "openssl" ]; then
  12.223+    # OpenSSL is forgiving of unknown values, no problems with TLS 1.3 values on versions that don't support it yet.
  12.224+    echo "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"
  12.225+  elif [ "$1" = "gnutls" ]; then
  12.226+    # GnuTLS isn't forgiving of unknown values, so this may require a GnuTLS version that supports TLS 1.3 even if wget doesn't.
  12.227+    # Begin with SECURE128 (and higher) then remove/add to build cipher suites. Produces same 9 cipher suites as OpenSSL but in slightly different order.
  12.228+    echo "SECURE128:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-DTLS-ALL:-CIPHER-ALL:-MAC-ALL:-KX-ALL:+AEAD:+ECDHE-ECDSA:+ECDHE-RSA:+AES-128-GCM:+CHACHA20-POLY1305:+AES-256-GCM"
  12.229+  fi
  12.230+}
  12.231+
  12.232+check_proc() {
  12.233+  # Check for /proc by looking for the /proc/self/exe link
  12.234+  # This is only run on Linux
  12.235+  if ! test -L /proc/self/exe ; then
  12.236+    err "fatal: Unable to find /proc/self/exe.  Is /proc mounted?  Installation cannot proceed without /proc."
  12.237+  fi
  12.238+}
  12.239+
  12.240+get_bitness() {
  12.241+  need_cmd head
  12.242+  # Architecture detection without dependencies beyond coreutils.
  12.243+  # ELF files start out "\x7fELF", and the following byte is
  12.244+  #   0x01 for 32-bit and
  12.245+  #   0x02 for 64-bit.
  12.246+  # The printf builtin on some shells like dash only supports octal
  12.247+  # escape sequences, so we use those.
  12.248+  local _current_exe_head
  12.249+  _current_exe_head=$(head -c 5 /proc/self/exe )
  12.250+  if [ "$_current_exe_head" = "$(printf '\177ELF\001')" ]; then
  12.251+    echo 32
  12.252+  elif [ "$_current_exe_head" = "$(printf '\177ELF\002')" ]; then
  12.253+    echo 64
  12.254+  else
  12.255+    err "unknown platform bitness"
  12.256+  fi
  12.257+}
  12.258+
  12.259+is_host_amd64_elf() {
  12.260+  need_cmd head
  12.261+  need_cmd tail
  12.262+  # ELF e_machine detection without dependencies beyond coreutils.
  12.263+  # Two-byte field at offset 0x12 indicates the CPU,
  12.264+  # but we're interested in it being 0x3E to indicate amd64, or not that.
  12.265+  local _current_exe_machine
  12.266+  _current_exe_machine=$(head -c 19 /proc/self/exe | tail -c 1)
  12.267+  [ "$_current_exe_machine" = "$(printf '\076')" ]
  12.268+}
  12.269+
  12.270+get_endianness() {
  12.271+  local cputype=$1
  12.272+  local suffix_eb=$2
  12.273+  local suffix_el=$3
  12.274+
  12.275+  # detect endianness without od/hexdump, like get_bitness() does.
  12.276+  need_cmd head
  12.277+  need_cmd tail
  12.278+
  12.279+  local _current_exe_endianness
  12.280+  _current_exe_endianness="$(head -c 6 /proc/self/exe | tail -c 1)"
  12.281+  if [ "$_current_exe_endianness" = "$(printf '\001')" ]; then
  12.282+    echo "${cputype}${suffix_el}"
  12.283+  elif [ "$_current_exe_endianness" = "$(printf '\002')" ]; then
  12.284+    echo "${cputype}${suffix_eb}"
  12.285+  else
  12.286+    err "unknown platform endianness"
  12.287+  fi
  12.288+}
  12.289+
  12.290+get_architecture() {
  12.291+  local _ostype _cputype _bitness _arch _clibtype
  12.292+  _ostype="$(uname -s)"
  12.293+  _cputype="$(uname -m)"
  12.294+  _clibtype="gnu"
  12.295+
  12.296+  if [ "$_ostype" = Linux ]; then
  12.297+    if [ "$(uname -o)" = Android ]; then
  12.298+      _ostype=Android
  12.299+    fi
  12.300+    if ldd --version 2>&1 | grep -q 'musl'; then
  12.301+      _clibtype="musl"
  12.302+    fi
  12.303+  fi
  12.304+
  12.305+  if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then
  12.306+    # Darwin `uname -m` lies
  12.307+    if sysctl hw.optional.x86_64 | grep -q ': 1'; then
  12.308+      _cputype=x86_64
  12.309+    fi
  12.310+  fi
  12.311+
  12.312+  if [ "$_ostype" = SunOS ]; then
  12.313+    # Both Solaris and illumos presently announce as "SunOS" in "uname -s"
  12.314+    # so use "uname -o" to disambiguate.  We use the full path to the
  12.315+    # system uname in case the user has coreutils uname first in PATH,
  12.316+    # which has historically sometimes printed the wrong value here.
  12.317+    if [ "$(/usr/bin/uname -o)" = illumos ]; then
  12.318+      _ostype=illumos
  12.319+    fi
  12.320+
  12.321+    # illumos systems have multi-arch userlands, and "uname -m" reports the
  12.322+    # machine hardware name; e.g., "i86pc" on both 32- and 64-bit x86
  12.323+    # systems.  Check for the native (widest) instruction set on the
  12.324+    # running kernel:
  12.325+    if [ "$_cputype" = i86pc ]; then
  12.326+      _cputype="$(isainfo -n)"
  12.327+    fi
  12.328+  fi
  12.329+
  12.330+  case "$_ostype" in
  12.331+
  12.332+    Android)
  12.333+      _ostype=linux-android
  12.334+      ;;
  12.335+
  12.336+    Linux)
  12.337+      check_proc
  12.338+      _ostype=unknown-linux-$_clibtype
  12.339+      _bitness=$(get_bitness)
  12.340+      ;;
  12.341+
  12.342+    FreeBSD)
  12.343+      _ostype=unknown-freebsd
  12.344+      ;;
  12.345+
  12.346+    NetBSD)
  12.347+      _ostype=unknown-netbsd
  12.348+      ;;
  12.349+
  12.350+    DragonFly)
  12.351+      _ostype=unknown-dragonfly
  12.352+      ;;
  12.353+
  12.354+    Darwin)
  12.355+      _ostype=apple-darwin
  12.356+      ;;
  12.357+
  12.358+    illumos)
  12.359+      _ostype=unknown-illumos
  12.360+      ;;
  12.361+
  12.362+    MINGW* | MSYS* | CYGWIN* | Windows_NT)
  12.363+      _ostype=pc-windows-gnu
  12.364+      ;;
  12.365+
  12.366+    *)
  12.367+      err "unrecognized OS type: $_ostype"
  12.368+      ;;
  12.369+
  12.370+  esac
  12.371+
  12.372+  case "$_cputype" in
  12.373+
  12.374+    i386 | i486 | i686 | i786 | x86)
  12.375+      _cputype=i686
  12.376+      ;;
  12.377+
  12.378+    xscale | arm)
  12.379+      _cputype=arm
  12.380+      if [ "$_ostype" = "linux-android" ]; then
  12.381+        _ostype=linux-androideabi
  12.382+      fi
  12.383+      ;;
  12.384+
  12.385+    armv6l)
  12.386+      _cputype=arm
  12.387+      if [ "$_ostype" = "linux-android" ]; then
  12.388+        _ostype=linux-androideabi
  12.389+      else
  12.390+        _ostype="${_ostype}eabihf"
  12.391+      fi
  12.392+      ;;
  12.393+
  12.394+    armv7l | armv8l)
  12.395+      _cputype=armv7
  12.396+      if [ "$_ostype" = "linux-android" ]; then
  12.397+        _ostype=linux-androideabi
  12.398+      else
  12.399+        _ostype="${_ostype}eabihf"
  12.400+      fi
  12.401+      ;;
  12.402+
  12.403+    aarch64 | arm64)
  12.404+      _cputype=aarch64
  12.405+      ;;
  12.406+
  12.407+    x86_64 | x86-64 | x64 | amd64)
  12.408+      _cputype=x86_64
  12.409+      ;;
  12.410+
  12.411+    mips)
  12.412+      _cputype=$(get_endianness mips '' el)
  12.413+      ;;
  12.414+
  12.415+    mips64)
  12.416+      if [ "$_bitness" -eq 64 ]; then
  12.417+        # only n64 ABI is supported for now
  12.418+        _ostype="${_ostype}abi64"
  12.419+        _cputype=$(get_endianness mips64 '' el)
  12.420+      fi
  12.421+      ;;
  12.422+
  12.423+    ppc)
  12.424+      _cputype=powerpc
  12.425+      ;;
  12.426+
  12.427+    ppc64)
  12.428+      _cputype=powerpc64
  12.429+      ;;
  12.430+
  12.431+    ppc64le)
  12.432+      _cputype=powerpc64le
  12.433+      ;;
  12.434+
  12.435+    s390x)
  12.436+      _cputype=s390x
  12.437+      ;;
  12.438+    riscv64)
  12.439+      _cputype=riscv64gc
  12.440+      ;;
  12.441+    loongarch64)
  12.442+      _cputype=loongarch64
  12.443+      ;;
  12.444+    *)
  12.445+      err "unknown CPU type: $_cputype"
  12.446+
  12.447+  esac
  12.448+
  12.449+  # Detect 64-bit linux with 32-bit userland
  12.450+  if [ "${_ostype}" = unknown-linux-gnu ] && [ "${_bitness}" -eq 32 ]; then
  12.451+    case $_cputype in
  12.452+      x86_64)
  12.453+        if [ -n "${CPUTYPE:-}" ]; then
  12.454+          _cputype="$CPUTYPE"
  12.455+        else {
  12.456+          # 32-bit executable for amd64 = x32
  12.457+          if is_host_amd64_elf; then {
  12.458+            echo "This host is running an x32 userland; as it stands, x32 support is poor," 1>&2
  12.459+            echo "and there isn't a native toolchain -- you will have to install" 1>&2
  12.460+            echo "multiarch compatibility with i686 and/or amd64, then select one" 1>&2
  12.461+            echo "by re-running this script with the CPUTYPE environment variable" 1>&2
  12.462+            echo "set to i686 or x86_64, respectively." 1>&2
  12.463+            exit 1
  12.464+          }; else
  12.465+            _cputype=i686
  12.466+          fi
  12.467+        }; fi
  12.468+        ;;
  12.469+      mips64)
  12.470+        _cputype=$(get_endianness mips '' el)
  12.471+        ;;
  12.472+      powerpc64)
  12.473+        _cputype=powerpc
  12.474+        ;;
  12.475+      aarch64)
  12.476+        _cputype=armv7
  12.477+        if [ "$_ostype" = "linux-android" ]; then
  12.478+          _ostype=linux-androideabi
  12.479+        else
  12.480+          _ostype="${_ostype}eabihf"
  12.481+        fi
  12.482+        ;;
  12.483+      riscv64gc)
  12.484+        err "riscv64 with 32-bit userland unsupported"
  12.485+        ;;
  12.486+    esac
  12.487+  fi
  12.488+
  12.489+  if [ "$_ostype" = "unknown-linux-gnueabihf" ] && [ "$_cputype" = armv7 ]; then
  12.490+    if ensure grep '^Features' /proc/cpuinfo | grep -q -v neon; then
  12.491+      # At least one processor does not have NEON.
  12.492+      _cputype=arm
  12.493+    fi
  12.494+  fi
  12.495+
  12.496+  _arch="${_cputype}-${_ostype}"
  12.497+
  12.498+  RETVAL="$_arch"
  12.499+}
  12.500+
  12.501+# This wraps curl or wget. Try curl first, if not installed,
  12.502+# use wget instead.
  12.503+downloader() {
  12.504+  local _dld
  12.505+  local _ciphersuites
  12.506+  local _err
  12.507+  local _status
  12.508+  local _retry
  12.509+  if check_cmd curl; then
  12.510+    _dld=curl
  12.511+  elif check_cmd wget; then
  12.512+    _dld=wget
  12.513+  else
  12.514+    _dld='curl or wget' # to be used in error message of need_cmd
  12.515+  fi
  12.516+
  12.517+  if [ "$1" = --check ]; then
  12.518+    need_cmd "$_dld"
  12.519+  elif [ "$_dld" = curl ]; then
  12.520+    check_curl_for_retry_support
  12.521+    _retry="$RETVAL"
  12.522+    get_ciphersuites_for_curl
  12.523+    _ciphersuites="$RETVAL"
  12.524+    if [ -n "$_ciphersuites" ]; then
  12.525+      _err=$(curl $_retry --proto '=https' --tlsv1.2 --ciphers "$_ciphersuites" --silent --show-error --fail --location "$1" --output "$2" 2>&1)
  12.526+      _status=$?
  12.527+    else
  12.528+      echo "Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure"
  12.529+      if ! check_help_for "$3" curl --proto --tlsv1.2; then
  12.530+        echo "Warning: Not enforcing TLS v1.2, this is potentially less secure"
  12.531+        _err=$(curl $_retry --silent --show-error --fail --location "$1" --output "$2" 2>&1)
  12.532+        _status=$?
  12.533+      else
  12.534+        _err=$(curl $_retry --proto '=https' --tlsv1.2 --silent --show-error --fail --location "$1" --output "$2" 2>&1)
  12.535+        _status=$?
  12.536+      fi
  12.537+    fi
  12.538+    if [ -n "$_err" ]; then
  12.539+      echo "$_err" >&2
  12.540+      if echo "$_err" | grep -q 404$; then
  12.541+        err "installer for platform '$3' not found, this may be unsupported"
  12.542+      fi
  12.543+    fi
  12.544+    return $_status
  12.545+  elif [ "$_dld" = wget ]; then
  12.546+    if [ "$(wget -V 2>&1|head -2|tail -1|cut -f1 -d" ")" = "BusyBox" ]; then
  12.547+      echo "Warning: using the BusyBox version of wget.  Not enforcing strong cipher suites for TLS or TLS v1.2, this is potentially less secure"
  12.548+      _err=$(wget "$1" -O "$2" 2>&1)
  12.549+      _status=$?
  12.550+    else
  12.551+      get_ciphersuites_for_wget
  12.552+      _ciphersuites="$RETVAL"
  12.553+      if [ -n "$_ciphersuites" ]; then
  12.554+        _err=$(wget --https-only --secure-protocol=TLSv1_2 --ciphers "$_ciphersuites" "$1" -O "$2" 2>&1)
  12.555+        _status=$?
  12.556+      else
  12.557+        echo "Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure"
  12.558+        if ! check_help_for "$3" wget --https-only --secure-protocol; then
  12.559+          echo "Warning: Not enforcing TLS v1.2, this is potentially less secure"
  12.560+          _err=$(wget "$1" -O "$2" 2>&1)
  12.561+          _status=$?
  12.562+        else
  12.563+          _err=$(wget --https-only --secure-protocol=TLSv1_2 "$1" -O "$2" 2>&1)
  12.564+          _status=$?
  12.565+        fi
  12.566+      fi
  12.567+    fi
  12.568+    if [ -n "$_err" ]; then
  12.569+      echo "$_err" >&2
  12.570+      if echo "$_err" | grep -q ' 404 Not Found$'; then
  12.571+        err "installer for platform '$3' not found, this may be unsupported"
  12.572+      fi
  12.573+    fi
  12.574+    return $_status
  12.575+  else
  12.576+    err "Unknown downloader"   # should not reach here
  12.577+  fi
  12.578+}
  12.579+
  12.580+main "$@" || exit 1
    13.1--- a/makefile	Tue Apr 30 23:07:50 2024 +0000
    13.2+++ b/makefile	Tue Apr 30 23:08:08 2024 +0000
    13.3@@ -27,11 +27,9 @@
    13.4 box:Containerfile.box archlinux;podman build -f $< -t box
    13.5 alpine:Containerfile.alpine;podman build -f $< -t alpine
    13.6 ubuntu:Containerfile.ubuntu;podman build -f $< -t ubuntu
    13.7-vc:Containerfile.vc ubuntu;podman build -f $< -t vc
    13.8-vc-runner:Containerfile.vc-runner ubuntu;podman build -f $< -t vc-runner
    13.9 worker:Containerfile.worker alpine;podman build -f $< -t worker
   13.10 operator:Containerfile.operator box;podman build -f $< -t operator
   13.11-pods:archlinux alpine ubuntu box worker operator vc # vc-runner ## requires token
   13.12+pods:archlinux alpine ubuntu box worker operator
   13.13 quick:code
   13.14 all:dist/cdn dist/code dist/lisp dist/rust dist/sbcl dist/rocksdb dist/emacs dist/pods
   13.15 clean:;rm -rf $(B) $(D)
   13.16@@ -92,7 +90,7 @@
   13.17 	cd $< && ./scripts/install-all.sh
   13.18 ### SBCL
   13.19 SBCL_TARGET:=build/src/sbcl
   13.20-SBCL_VERSION:=2.4.3+
   13.21+SBCL_VERSION:=2.4.4+
   13.22 $(SBCL_TARGET):scripts/get-sbcl.sh $(B)
   13.23 	$<
   13.24 	cd $(SBCL_TARGET) && \
   13.25@@ -152,13 +150,18 @@
   13.26 	$<
   13.27 tree-sitter:$(TREE_SITTER_TARGET)
   13.28 tree-sitter-build:$(TREE_SITTER_TARGET)
   13.29-	cd $< && make all
   13.30 tree-sitter-install:$(TREE_SITTER_TARGET) tree-sitter-build
   13.31-	cd $< && make install && cp -r lib/include/* /usr/local/include/
   13.32+
   13.33 ### Tree-sitter Langs
   13.34 TREE_SITTER_LANGS_TARGET:=build/src/tree-sitter-langs
   13.35 tree-sitter-langs-install:scripts/tree-sitter-install-langs.sh
   13.36 	$<
   13.37+### Etc
   13.38+ETC_TARGET:=build/etc
   13.39+$(ETC_TARGET):scripts/get-etc.sh
   13.40+	$<
   13.41+etc:$(ETC_TARGET)
   13.42+
   13.43 ### Code
   13.44 CODE_TARGET:=build/src/$(SRC)
   13.45 $(CODE_TARGET):scripts/get-code.sh $(B)
   13.46@@ -255,16 +258,23 @@
   13.47 core-install:core-lisp-install core-rust-install
   13.48 
   13.49 dist/core:dist/rust/bin dist/lisp
   13.50-	mkdir -pv $@
   13.51-	cp -rf dist/lisp/fasl dist/lisp/bin $@
   13.52-	cp -rf $< $@
   13.53-	cd dist && tar -I 'zstd' -cf core.tar.zst core
   13.54+	mkdir -pv $(D)/core
   13.55+	cp -rf $(D)/lisp/fasl $(D)/lisp/bin $(D)/core
   13.56+	cp -rf $< $(D)/core
   13.57+	cd $(D) && tar -I 'zstd' -cf core.tar.zst core
   13.58+
   13.59+ETC:=$(USER)
   13.60+
   13.61+dist/etc:$(ETC_TARGET)
   13.62+	cd $(ETC_TARGET) && hg up $(ETC)
   13.63+	cp -rf $(ETC_TARGET) $(D)/etc
   13.64+
   13.65 dist/code:code
   13.66-	mkdir -pv $(D)/code
   13.67-	cp -r $(CODE_TARGET)/{org,core,infra,demo} $@
   13.68+	mkdir -pv $@
   13.69+	cp -r $(CODE_TARGET)/{org,core,infra,demo,etc} $@
   13.70 dist/pods:pods
   13.71-	mkdir -pv $(D)/pods
   13.72-	podman image save -o $(D)/pods/all.tar archlinux alpine ubuntu box worker operator vv
   13.73-	cd $(D)/pods && zstd --ultra -T8 --rm all.tar -o all.tar.zst
   13.74-clean-dist:;rm -rf dist
   13.75+	mkdir -pv $@
   13.76+	podman image save -o $@/all.tar archlinux alpine ubuntu box worker operator
   13.77+	cd $@ && zstd --ultra -T4 --rm all.tar -o all.tar.zst
   13.78+clean-dist:;rm -rf $(D)
   13.79 clean-build:;rm -rf $(B)
    14.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2+++ b/profile.sh	Tue Apr 30 23:08:08 2024 +0000
    14.3@@ -0,0 +1,1 @@
    14.4+#!/bin/sh
    15.1--- a/readme.org	Tue Apr 30 23:07:50 2024 +0000
    15.2+++ b/readme.org	Tue Apr 30 23:08:08 2024 +0000
    15.3@@ -5,6 +5,6 @@
    15.4 #+EXPORT_FILE_NAME: index
    15.5 
    15.6 This project contains scripts, utils, and applications used to host
    15.7-and maintain The Compiler Company services.
    15.8+and maintain The Compiler Company infrastructure.
    15.9 
   15.10 - [[https://compiler.company/docs/infra/quickstart.html][Quickstart]]
    16.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2+++ b/scripts/get-etc.sh	Tue Apr 30 23:08:08 2024 +0000
    16.3@@ -0,0 +1,3 @@
    16.4+#!/bin/bash
    16.5+TARGETDIR=${1:-build/etc}
    16.6+hg clone https://vc.compiler.company/comp/etc $TARGETDIR