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