diff options
88 files changed, 22333 insertions, 335 deletions
diff --git a/desk/app/nostril.hoon b/backupdesk/app/nostrill.hoon index 51f9965..4dd6ae5 100644 --- a/desk/app/nostril.hoon +++ b/backupdesk/app/nostrill.hoon @@ -1,6 +1,6 @@ -/- sur=nostril, nsur=nostr -/+ lib=nostril, nlib=nostr, sr=sortug, - shim, dbug, muta=nostril-mutations, jsonlib=json-nostril, +/- sur=nostrill, nsur=nostr +/+ lib=nostrill, nlib=nostr, sr=sortug, + shim, dbug, muta=nostril-mutations, jsonlib=json-nostrill, trill=trill-post /= web /web/router |% @@ -15,9 +15,11 @@ rout ~(. router:web [state bowl]) cards ~(. cards:lib bowl) mutat ~(. muta [state bowl]) + shimm ~(. shim [state bowl]) ++ on-init ^- (quip card:agent:gall agent:gall) - :_ this(state default:sur) + =/ default (default-state:lib bowl) + :_ this(state default) :~ shim-binding:cards == :: @@ -36,27 +38,20 @@ ++ on-poke |~ [=mark =vase] ^- (quip card:agent:gall agent:gall) - ~& >> on-poke-nostril=mark |^ ?+ mark `this %noun debug %json on-ui - %handle-http-request serve + %handle-http-request handle-shim == :: handling shim events - ++ serve + ++ handle-shim =/ order !<(order:web vase) :: ~& request.req.order ?: .=(url.request.req.order '/nostr-shim') - =/ msg (handle:shim order) + =/ msg (parse-msg:shim order) ?~ msg `this - ~& "msg processed" - =/ relay (~(get by relays) url.u.msg) - =/ nevents=(list event:nsur) ?~ relay [event.u.msg ~] [event.u.msg u.relay] - =/ nevents2 (scag 100 nevents) - =. relays (~(put by relays) url.u.msg nevents2) - =/ response (ebail:rout id.order) - [response this] + (handle-shim-msg:mutat u.msg) :: :_ this (rout:rout order) @@ -68,12 +63,20 @@ =/ upoke=(unit poke:ui:sur) (ui:de:jsonlib jon) ?~ upoke ~& bad-ui-poke=jon `this ?- -.u.upoke + %keys handle-cycle-keys %fols (handle-fols +.u.upoke) %prof (handle-prof +.u.upoke) - %keys (handle-keys +.u.upoke) %post (handle-post +.u.upoke) %rela (handle-rela +.u.upoke) == + ++ handle-cycle-keys + =/ ks (gen-keys:nlib eny.bowl) + =. keys [ks keys] + :: =/ nkeys keys(i ks, t `(list keys:nsur)`keys) + :: :: =. keys nkeys + ~& new-keys=keys + `this + ++ handle-post |= poke=post-poke:ui:sur ?- -.poke %add @@ -95,34 +98,22 @@ =. profiles (~(del by profiles) +.poke) `this == - ++ handle-keys |= poke=keys-poke:ui:sur - ?- -.poke - %add - =/ ks (gen-keys:nlib eny.bowl) - =. keys (~(put by keys) -.ks +.ks) - ~& new-keys=keys - `this - %del - =. profiles (~(del by profiles) +.poke) - `this - == ++ handle-rela |= poke=relay-poke:ui:sur ?- -.poke %send =/ upoast (get-poast:mutat host.poke id.poke) ?~ upoast `this - :_ this :_ ~ - =/ keylist ~(tap by keys) - =/ key (snag 0 keylist) - =/ event (post-to-event:lib key eny.bowl u.upoast) - =/ =req:shim:nsur [%post event relays.poke] - (send:shim dap.bowl req) + =/ event (post-to-event:lib i.keys eny.bowl u.upoast) + =/ req=bulk-req:shim:nsur [relays.poke %event event] + =/ cards :~((send:shimm req)) + [cards this] == + :: ++ debug =/ noun !<(* vase) - ?+ -.noun `this + ?+ noun `this %wtf =/ lol=(unit @) ~ =/ l ~| "wtf" (need lol) @@ -132,33 +123,35 @@ ~& keys=keys `this %printkey - =/ keylist ~(tap by keys) - =/ key (snag 0 keylist) + =/ key i.keys ~& pub=(scow:sr %ux -.key) ~& priv=(scow:sr %ux +.key) `this %feed =/ lol debug-own-feed:mutat `this - %rt :: relay test - :_ this :_ ~ - :: khan - =/ =req:shim:nsur :- %get - %+ turn ~(tap by relays) - |= [url=@t *] - =/ kinds ~[0 1 6 7] - =/ =filter:nsur [~ ~ kinds ~ ~ ~ `5] - [url ~[filter]] - (send:shim dap.bowl req) - :: - %rt2 - =/ rls ~(tap by relays) - =/ lol - |- ?~ rls ~ - =/ rl i.rls - ~& > relay=[-.rl (lent +.rl)] - $(rls t.rls) + %nstats + ~& nostr-feed=~(wyt by nostr-feed) + ~& profiles=~(wyt in ~(key by profiles)) + =/ lol (print-relay-stats:lib relays) + `this + %rt :: relay test + =^ cards state get-posts:shimm + [cards this] + %rt0 + =/ ids + %+ roll (tap:norm:sur nostr-feed) |= [[@ ev=event:nsur] acc=[(set @ux) (set @ux)]] + ?. .=(kind.ev 1) acc + %= acc + - (~(put in -.acc) id.ev) + + (~(put in +.acc) pubkey.ev) + == + =/ sids (silt (scag 10 ~(tap in +.ids))) + =^ cards state (get-profiles:shimm sids) + :: (get-profiles:shimm +.ids) + :: (get-engagement:shimm -.ids) + [cards this] == :: -- diff --git a/backupdesk/desk.bill b/backupdesk/desk.bill new file mode 100644 index 0000000..ddea07e --- /dev/null +++ b/backupdesk/desk.bill @@ -0,0 +1,2 @@ +:~ %nostrill +== diff --git a/backupdesk/desk.docket-0 b/backupdesk/desk.docket-0 new file mode 100644 index 0000000..e30a841 --- /dev/null +++ b/backupdesk/desk.docket-0 @@ -0,0 +1,11 @@ +:~ + title+'Nostrill' + info+'Pater Nostr' + color+0xff.d400 + version+[0 1 0] + website+'https://sortug.com' + license+'© 2025 ~sortug. All rights reserved.' + image+'https://s3.sortug.com/img/nostril-icon.png' + base+'nostril' + glob-http+['https://s3.sortug.com/globs/glob-0v1.862v7.o85ao.krj6r.v1dgc.ek27l.glob' 0v1.862v7.o85ao.krj6r.v1dgc.ek27l] +==
\ No newline at end of file diff --git a/backupdesk/desk.ship b/backupdesk/desk.ship new file mode 100644 index 0000000..2d56596 --- /dev/null +++ b/backupdesk/desk.ship @@ -0,0 +1 @@ +~polwex
\ No newline at end of file diff --git a/backupdesk/lib/dbug.hoon b/backupdesk/lib/dbug.hoon new file mode 100644 index 0000000..ce98619 --- /dev/null +++ b/backupdesk/lib/dbug.hoon @@ -0,0 +1,155 @@ +:: dbug: agent wrapper for generic debugging tools +:: +:: usage: %-(agent:dbug your-agent) +:: +|% ++$ poke + $% [%bowl ~] + [%state grab=cord] + [%incoming =about] + [%outgoing =about] + == +:: ++$ about + $@ ~ + $% [%ship =ship] + [%path =path] + [%wire =wire] + [%term =term] + == +:: +++ agent + |= =agent:gall + ^- agent:gall + !. + |_ =bowl:gall + +* this . + ag ~(. agent bowl) + :: + ++ on-poke + |= [=mark =vase] + ^- (quip card:agent:gall agent:gall) + ?. ?=(%dbug mark) + =^ cards agent (on-poke:ag mark vase) + [cards this] + =/ dbug + !<(poke vase) + =; =tang + ((%*(. slog pri 1) tang) [~ this]) + ?- -.dbug + %bowl [(sell !>(bowl))]~ + :: + %state + =? grab.dbug =('' grab.dbug) '-' + =; product=^vase + [(sell product)]~ + =/ state=^vase + :: if the underlying app has implemented a /dbug/state scry endpoint, + :: use that vase in place of +on-save's. + :: + =/ result=(each ^vase tang) + (mule |.(q:(need (need (on-peek:ag /x/dbug/state))))) + ?:(?=(%& -.result) p.result on-save:ag) + %+ slap + (slop state !>([bowl=bowl ..zuse])) + (ream grab.dbug) + :: + %incoming + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by sup.bowl) + |= [[* a=[=ship =path]] [* b=[=ship =path]]] + (aor [path ship]:a [path ship]:b) + |= [=duct [=ship =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[path=path from=ship duct=duct]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire %+ lien duct + |=(=wire ?=(^ (find wire.about.dbug wire))) + %term !! + == + :: + %outgoing + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by wex.bowl) + |= [[[a=wire *] *] [[b=wire *] *]] + (aor a b) + |= [[=wire =ship =term] [acked=? =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[wire=wire agnt=[ship term] path=path ackd=acked]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire ?=(^ (find wire.about.dbug wire)) + %term =(term term.about.dbug) + == + == + :: + ++ on-peek + |= =path + ^- (unit (unit cage)) + ?. ?=([@ %dbug *] path) + (on-peek:ag path) + ?+ path [~ ~] + [%u %dbug ~] ``noun+!>(&) + [%x %dbug %state ~] ``noun+!>(on-save:ag) + [%x %dbug %subscriptions ~] ``noun+!>([wex sup]:bowl) + == + :: + ++ on-init + ^- (quip card:agent:gall agent:gall) + =^ cards agent on-init:ag + [cards this] + :: + ++ on-save on-save:ag + :: + ++ on-load + |= old-state=vase + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-load:ag old-state) + [cards this] + :: + ++ on-watch + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-watch:ag path) + [cards this] + :: + ++ on-leave + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-leave:ag path) + [cards this] + :: + ++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-agent:ag wire sign) + [cards this] + :: + ++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-arvo:ag wire sign-arvo) + [cards this] + :: + ++ on-fail + |= [=term =tang] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-fail:ag term tang) + [cards this] + -- +-- diff --git a/backupdesk/lib/docket.hoon b/backupdesk/lib/docket.hoon new file mode 100644 index 0000000..ef39b7f --- /dev/null +++ b/backupdesk/lib/docket.hoon @@ -0,0 +1,223 @@ +/- *docket +|% +:: +++ mime + |% + +$ draft + $: title=(unit @t) + info=(unit @t) + color=(unit @ux) + glob-http=(unit [=url hash=@uvH]) + glob-ames=(unit [=ship hash=@uvH]) + base=(unit term) + site=(unit path) + image=(unit url) + version=(unit version) + website=(unit url) + license=(unit cord) + == + :: + ++ finalize + |= =draft + ^- (unit docket) + ?~ title.draft ~ + ?~ info.draft ~ + ?~ color.draft ~ + ?~ version.draft ~ + ?~ website.draft ~ + ?~ license.draft ~ + =/ href=(unit href) + ?^ site.draft `[%site u.site.draft] + ?~ base.draft ~ + ?^ glob-http.draft + `[%glob u.base hash.u.glob-http %http url.u.glob-http]:draft + ?~ glob-ames.draft + ~ + `[%glob u.base hash.u.glob-ames %ames ship.u.glob-ames]:draft + ?~ href ~ + =, draft + :- ~ + :* %1 + u.title + u.info + u.color + u.href + image + u.version + u.website + u.license + == + :: + ++ from-clauses + =| =draft + |= cls=(list clause) + ^- (unit docket) + =* loop $ + ?~ cls (finalize draft) + =* clause i.cls + =. draft + ?- -.clause + %title draft(title `title.clause) + %info draft(info `info.clause) + %color draft(color `color.clause) + %glob-http draft(glob-http `[url hash]:clause) + %glob-ames draft(glob-ames `[ship hash]:clause) + %base draft(base `base.clause) + %site draft(site `path.clause) + %image draft(image `url.clause) + %version draft(version `version.clause) + %website draft(website `website.clause) + %license draft(license `license.clause) + == + loop(cls t.cls) + :: + ++ to-clauses + |= d=docket + ^- (list clause) + %- zing + :~ :~ title+title.d + info+info.d + color+color.d + version+version.d + website+website.d + license+license.d + == + ?~ image.d ~ ~[image+u.image.d] + ?: ?=(%site -.href.d) ~[site+path.href.d] + =/ ref=glob-reference glob-reference.href.d + :~ base+base.href.d + ?- -.location.ref + %http [%glob-http url.location.ref hash.ref] + %ames [%glob-ames ship.location.ref hash.ref] + == == == + :: + ++ spit-clause + |= =clause + ^- tape + %+ weld " {(trip -.clause)}+" + ?+ -.clause "'{(trip +.clause)}'" + %color (scow %ux color.clause) + %site (spud path.clause) + :: + %glob-http + "['{(trip url.clause)}' {(scow %uv hash.clause)}]" + :: + %glob-ames + "[{(scow %p ship.clause)} {(scow %uv hash.clause)}]" + :: + %version + =, version.clause + "[{(scow %ud major)} {(scow %ud minor)} {(scow %ud patch)}]" + == + :: + ++ spit-docket + |= dock=docket + ^- tape + ;: welp + ":~\0a" + `tape`(zing (join "\0a" (turn (to-clauses dock) spit-clause))) + "\0a==" + == + -- +:: +++ enjs + =, enjs:format + |% + :: + ++ charge-update + |= u=^charge-update + ^- json + %+ frond -.u + ^- json + ?- -.u + %del-charge s+desk.u + :: + %initial + %- pairs + %+ turn ~(tap by initial.u) + |=([=desk c=^charge] [desk (charge c)]) + :: + %add-charge + %- pairs + :~ desk+s+desk.u + charge+(charge charge.u) + == + == + :: + ++ num + |= a=@u + ^- ^tape + =/ p=json (numb a) + ?> ?=(%n -.p) + (trip p.p) + :: + ++ version + |= v=^version + ^- json + :- %s + %- crip + "{(num major.v)}.{(num minor.v)}.{(num patch.v)}" + :: + ++ merge + |= [a=json b=json] + ^- json + ?> &(?=(%o -.a) ?=(%o -.b)) + [%o (~(uni by p.a) p.b)] + :: + ++ href + |= h=^href + %+ frond -.h + ?- -.h + %site s+(spat path.h) + %glob + %- pairs + :~ base+s+base.h + glob-reference+(glob-reference glob-reference.h) + == + == + :: + ++ glob-reference + |= ref=^glob-reference + %- pairs + :~ hash+s+(scot %uv hash.ref) + location+(glob-location location.ref) + == + :: + ++ glob-location + |= loc=^glob-location + ^- json + %+ frond -.loc + ?- -.loc + %http s+url.loc + %ames s+(scot %p ship.loc) + == + :: + ++ charge + |= c=^charge + %+ merge (docket docket.c) + %- pairs + :~ chad+(chad chad.c) + == + :: + ++ docket + |= d=^docket + ^- json + %- pairs + :~ title+s+title.d + info+s+info.d + color+s+(scot %ux color.d) + href+(href href.d) + image+?~(image.d ~ s+u.image.d) + version+(version version.d) + license+s+license.d + website+s+website.d + == + :: + ++ chad + |= c=^chad + %+ frond -.c + ?+ -.c ~ + %hung s+err.c + == + -- +-- diff --git a/backupdesk/lib/json/common.hoon b/backupdesk/lib/json/common.hoon new file mode 100644 index 0000000..64d4b03 --- /dev/null +++ b/backupdesk/lib/json/common.hoon @@ -0,0 +1,29 @@ +/+ sr=sortug +|% +++ en +=, enjs:format + |% + ++ cord |= s=@t ^- json s+s + ++ hex |= h=@ux ^- json + [%s (crip (scow:sr %ux h))] + ++ b64 |= h=@uv ^- json + [%s (crip (scow:sr %uv h))] + ++ ud |= n=@ ^- json + [%s (crip (scow:sr %ud n))] + ++ patp |= p=@p ^- json + [%s (scot %p p)] + -- +++ de +=, dejs-soft:format + |% + ++ hex |= jon=json ^- (unit @ux) + ?. ?=(%s -.jon) ~ + =/ atom=(unit @) (slaw:sr %ux p.jon) + ?~ atom ~ + atom + ++ se |= aur=@tas |= jon=json + ?. ?=(%s -.jon) ~ + (slaw aur p.jon) + -- + +-- diff --git a/backupdesk/lib/json/nostr.hoon b/backupdesk/lib/json/nostr.hoon new file mode 100644 index 0000000..defbe77 --- /dev/null +++ b/backupdesk/lib/json/nostr.hoon @@ -0,0 +1,176 @@ +/- sur=nostr +/+ common=json-common, sr=sortug +|% +++ en +=, enjs:format + |% + :: shim comms + ++ bulk-req |= [relays=(list @t) r=req:shim:sur] ^- json + %: pairs + relays+a+(turn relays cord:en:common) + req+(req r) + ~ + == + ++ req |= =req:shim:sur ^- json + :- %a :- s+(crip (cuss (trip -.req))) + ?- -.req + %req (enreq +.req) + %event :_ ~ (event +.req) + %auth :_ ~ (event +.req) + %close :_ ~ [%s +.req] + == +++ enreq + |= [sub-id=@t fs=(list filter:sur)] + ^- (list json) + :- [%s sub-id] + %+ turn fs filter + + :: + ++ raw-event |= raw-event:sur + :: WTF nostr doesn't want the prefix on the pubkey + =/ pubkeyt (scow:sr %ux pubkey) + ?~ pubkeyt !! + =/ pubkeyj [%s (crip t.pubkeyt)] + :- %a :~ + [%n '0'] + pubkeyj + (numb created-at) + (numb kind) + a+(turn tags tag) + s+content + == + ++ event + |= e=event:sur ^- json + =/ pubkeyt (scow:sr %ux pubkey.e) + ?~ pubkeyt !! + =/ pubkeyj [%s (crip t.pubkeyt)] + %: pairs + id+(hex:en:common id.e) + :: pubkey+(hex:en:common pubkey.e) + pubkey+pubkeyj + sig+(hex:en:common sig.e) + ['created_at' (numb created-at.e)] + kind+(numb kind.e) + content+s+content.e + tags+a+(turn tags.e tag) + ~ + == + ++ tag + |= t=tag:sur ^- json [%a (turn t cord:en:common)] + :: :- s+key.t + :: :- s+value.t + :: (turn rest.t |=(tt=@t s+tt)) + :: + ++ filter + |= f=filter:sur ^- json + =| l=(list [key=@t jon=json]) + =. l ?~ ids.f l :_ l ['ids' %a (turn ~(tap in u.ids.f) hex:en:common)] + =. l ?~ authors.f l :_ l ['authors' %a (turn ~(tap in u.authors.f) hex:en:common)] + =. l ?~ kinds.f l :_ l ['kinds' %a (turn ~(tap in u.kinds.f) numb)] + =. l ?~ tags.f l %+ weld l (tags u.tags.f) + + =. l ?~ since.f l :_ l ['since' (sect u.since.f)] + =. l ?~ until.f l :_ l ['until' (sect u.until.f)] + =. l ?~ limit.f l :_ l ['limit' (numb u.limit.f)] + :: + %- pairs l + + + ++ tags + |= tm=(map @t (set @t)) ^- (list [@t json]) :: entries to the filter obeject + %+ turn ~(tap by tm) |= [key=@t values=(set @t)] + =/ nkey (cat 3 '#' key) + [nkey %a (turn ~(tap in values) cord:en:common)] + + ++ user-meta + |= meta=user-meta:sur + %: pairs + name+s+name.meta + picture+s+picture.meta + about+s+about.meta + other+o+other.meta + ~ + == + -- +++ de +=, dejs-soft:format + |% + :: shim + ++ msg + %- ot :~ + relay+so + msg+relay-msg + == + ++ relay-msg + %- of :~ + event+event-sub + ok+relay-ok + eose+so + closed+closed + notice+so + error+so + == + + + :: | { event: { subscription_id: string; event: NostrEvent } } + :: | { ok: { event_id: string; accepted: boolean; message: string } } + :: | { eose: string } + :: | { closed: { subscription_id: string; message: string } } + :: | { notice: string } + :: // this is ours + :: | { error: string }; + ++ event-sub + %- ot :~ + ['subscription_id' so] + event+event + == + ++ relay-ok + %- ot :~ + ['event_id' hex:de:common] + accepted+bo + message+so + == + ++ closed + %- ot :~ + ['subscription_id' so] + message+so + == + ++ event + %- ot :~ + id+hex:de:common + pubkey+hex:de:common + ['created_at' ni] + kind+ni + tags+(ar (ar so)) + content+so + sig+hex:de:common + == + ++ user-meta |= jon=json + ^- (unit user-meta:sur) + ?. ?=(%o -.jon) ~ + =| um=user-meta:sur + =/ fields ~(tap by p.jon) + |- ?~ fields (some um) + =/ k -.i.fields + =/ jn=json +.i.fields + ?+ k + =/ ot (~(put by other.um) k jn) + =. um um(other ot) $(fields t.fields) + %'name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'display_name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'displayName' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'about' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + %'picture' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + == + -- +-- diff --git a/desk/lib/json/nostril.hoon b/backupdesk/lib/json/nostrill.hoon index 16792a9..43f7708 100644 --- a/desk/lib/json/nostril.hoon +++ b/backupdesk/lib/json/nostrill.hoon @@ -1,4 +1,4 @@ -/- sur=nostril, nsur=nostr, feed=trill-feed +/- sur=nostrill, nsur=nostr, feed=trill-feed /+ sr=sortug, common=json-common, trill=json-trill, nostr=json-nostr |% ++ en @@ -8,18 +8,33 @@ ++ state |= state-0:sur ^- json %: pairs relays+(en-relays relays) - keys+a+(turn ~(tap in ~(key by keys)) hex:en:common) + key+(hex:en:common pub.i.keys) profiles+(en-profiles profiles) + :: TODO proper cursors feed+(feed-with-cursor:en:trill feed ~ ~) + nostr+(en-nostr-feed nostr-feed) following+(enfollowing following) ['followGraph' (engraph follow-graph)] ~ == + ++ en-nostr-feed + |= feed=nostr-feed:sur ^- json + :- %a %+ turn (tap:norm:sur feed) |= [id=@ud ev=event:nsur] + (event:en:nostr ev) + ++ en-relays - |= r=(map @t (list event:nsur)) ^- json + |= r=(map @t relay-stats:nsur) ^- json %- pairs %+ turn ~(tap by r) - |= [url=@t events=(list event:nsur)] - :- url :- %a %+ turn events event:en:nostr + |= [url=@t rs=relay-stats:nsur] + :- url %- pairs + :~ :- %connected ?~ connected.rs ~ (time u.connected.rs) + :- %reqs (relay-stats reqs.rs) + == + ++ relay-stats |= rm=(map @t event-stats:nsur) + %- pairs %+ turn ~(tap by rm) |= [sub-id=@t es=event-stats:nsur] + :: TODO do we even need this + :- sub-id (numb received.es) + ++ en-profiles |= m=(map @ux user-meta:nsur) %- pairs %+ turn ~(tap by m) |= [key=@ux p=user-meta:nsur] @@ -51,9 +66,9 @@ :: ui ++ ui %- of :~ + keys+ul fols+ui-fols prof+ui-prof - keys+ui-keys post+ui-post rela+ui-relay == @@ -71,11 +86,6 @@ pubkey+hex:de:common meta+user-meta:de:nostr == -++ ui-keys - %- of :~ - add+ul - del+hex:de:common - == ++ ui-post %- of :~ add+de-post diff --git a/backupdesk/lib/json/trill.hoon b/backupdesk/lib/json/trill.hoon new file mode 100644 index 0000000..efa4ffc --- /dev/null +++ b/backupdesk/lib/json/trill.hoon @@ -0,0 +1,191 @@ +/- feed=trill-feed, post=trill-post +/+ common=json-common, sr=sortug +|% +++ en +=, enjs:format + |% + ++ feed-with-cursor + |= [f=feed:^feed start=(unit @da) end=(unit @da)] ^- json + %: pairs + feed+(feed f) + start+(cursor start) + end+(cursor end) + ~ + == + ++ cursor |= c=(unit @da) + ?~ c ~ (time u.c) + ++ feed + |= f=feed:^feed ^- json + %- pairs + %+ turn (tap:orm:^feed f) + |= [post-id=@da p=post:post] + ^- [@ta json] + :- (crip (scow:sr %ud `@ud`post-id)) + (poast p) + + ++ poast + |= p=post:post ^- json + %- pairs + :~ id+(ud:en:common id.p) + host+(patp:en:common host.p) + author+(patp:en:common author.p) + thread+(ud:en:common thread.p) + parent+?~(parent.p ~ (ud:en:common u.parent.p)) + contents+(content contents.p) + hash+(b64:en:common hash.p) + engagement+(engagement engagement.p) + children+a+(turn ~(tap in children.p) ud:en:common) + time+(time id.p) + == + + ++ content + |= cm=content-map:post ^- json + =/ last (pry:corm:post cm) + ?~ last ~ + =/ blocks=content-list:post +.u.last + :- %a %+ turn blocks en-block + ++ en-block + |= b=block:post ^- json + %+ frond -.b + ?- -.b + %paragraph a+(turn p.b inline) + %blockquote a+(turn p.b inline) + %table a+(turn rows.b table-row) + %heading (heading +.b) + %list (ilist +.b) + %media (media media.b) + %codeblock (codespan +.b) + %eval s+hoon.b + %ref (en-ref +.b) + %json (external +.b) + %poll ~ + == + ++ table-row + |= l=(list content-list:post) + :- %a %+ turn l + |= b=content-list:post + :- %a %+ turn b en-block + ++ heading + |= [p=cord q=@] + %- pairs + :~ text+s+p + num+(numb q) + == + ++ ilist + |= [p=(list inline:post) q=?] + %- pairs + :~ text+a+(turn p inline) + ordered+b+q + == + ++ media + |= =media:post + %+ frond -.media + ?- -.media + %images a+(turn p.media string) + %video s+p.media + %audio s+p.media + == + ++ string + |= c=cord s+c + ++ en-ref :: TODO should the backend fetch this shit + |= [type=term s=@p p=^path] + %- pairs + :~ type+s+type + ship+(patp:en:common s) + path+(path p) + == + ++ external + |= [p=term q=cord] + %- pairs + :~ origin+s+p + content+s+q + == + ++ inline + |= i=inline:post ^- json + %+ frond -.i + ?+ -.i s+p.i + %ship (patp:en:common p.i) + %link (link +.i) + %ruby (ruby +.i) + %break ~ + == + ++ ruby + |= [p=@t q=@t] + %- pairs + :~ text+s+p + ruby+s+q + == + ++ codespan + |= [code=cord lang=cord] + %- pairs + :~ code+s+code + lang+s+lang + == + ++ link + |= [href=cord show=cord] + %- pairs + :~ href+s+href + show+s+show + == + + ++ engagement + |= =engagement:post ^- json + %- pairs + :~ reacts+(reacts reacts.engagement) + quoted+a+(turn ~(tap in quoted.engagement) signed-pid) + shared+a+(turn ~(tap in shared.engagement) signed-pid) + == + ++ reacts + |= rs=(map @p [react:post signature:post]) + ^- json + %- pairs + %+ turn ~(val by rs) + |= [r=react:post s=signature:post] + ^- [@ta json] + :- (scot %p q.s) + s+r + ++ signed-pid + |= =signed-pid:post + ^- json + %- pairs + :~ ship+(patp:en:common q.signature.signed-pid) + pid+(pid pid.signed-pid) + == + ++ time-pid + |= [t=@da s=@p =id:post] + %- pairs + :~ id+(ud:en:common id) + ship+(patp:en:common s) + time+(time t) + == + ++ time-ship + |= [t=@da s=@p] ^- json + %- pairs + :~ ship+(patp:en:common s) + time+(time t) + == + ++ mention + |= [t=@da s=@p p=pid:post] ^- json + %- pairs + :~ pid+(pid p) + ship+(patp:en:common s) + time+(time t) + == + ++ react + |= [t=@da s=@p p=pid:post react=@t] ^- json + %- pairs + :~ pid+(pid p) + ship+(patp:en:common s) + react+s+react + time+(time t) + == + ++ pid + |= =pid:post + %- pairs + :~ ship+(patp:en:common ship.pid) + id+(ud:en:common id.pid) + == + :: + :: + -- +-- diff --git a/backupdesk/lib/markdown.hoon b/backupdesk/lib/markdown.hoon new file mode 100644 index 0000000..67ee3ad --- /dev/null +++ b/backupdesk/lib/markdown.hoon @@ -0,0 +1,1711 @@ +/- m=markdown +:: + +=> |% + :: Set label for collapsed / shortcut reference links + ++ backfill-ref-link + |= [a=link:inline:m] + ^- link:inline:m + =/ t target.a + ?+ -.t a :: only reference links + %ref + ?: =(%full type.t) a :: only collapsed / shortcut links + =/ node=element:inline.m (head contents.a) + ?+ -.node a :: ...and it's a %text node + %text + %_ a + target %_ t + label text.node + == + == + == + == + :: + ++ whitespace (mask " \09\0d\0a") :: whitespace: space, tab, or newline + :: + ++ all-link-ref-definitions :: Recursively get link ref definitions + =< process-nodes + |% + ++ process-nodes + |= [nodes=markdown:m] + ^- (map @t urlt:ln:m) + ?~ nodes ~ + %- %~(uni by (process-node (head nodes))) + $(nodes +.nodes) + :: + ++ process-nodeses + |= [nodeses=(list markdown:m)] + ^- (map @t urlt:ln:m) + ?~ nodeses ~ + %- %~(uni by (process-nodes (head nodeses))) + $(nodeses +.nodeses) + :: + ++ process-node + |= [node=node:markdown:m] + ^- (map @t urlt:ln:m) + =/ result *(map @t urlt:ln:m) + ?- -.node + %leaf :: Leaf node: check if it's a link ref def + =/ leaf=node:leaf:m +.node + ?+ -.leaf result + %link-ref-definition (~(put by result) label.leaf urlt.leaf) + == + :: + %container + =/ container=node:container:m +.node + ?- -.container + %block-quote (process-nodes markdown.container) + %ol (process-nodeses contents.container) + %ul (process-nodeses contents.container) + %tl (process-nodeses (turn contents.container |=([is-checked=? =markdown:m] markdown))) + == + == + -- + -- +|% + :: + :: Parse to and from Markdown text format + ++ md + |% + ++ de :: de:md Deserialize (parse) + |% + ++ escaped + |= [char=@t] + (cold char (jest (crip (snoc "\\" char)))) + :: + ++ newline + %+ cold '\0a' :: EOL, with or without carriage return '\0d' + ;~(pfix ;~(pose (just '\0d') (easy ~)) (just '\0a')) + ++ line-end :: Either EOL or EOF + %+ cold '\0a' + ;~(pose newline (full (easy ~))) + :: + ++ ln :: Links and urls + |% + ++ url + =< %+ cook |=(a=url:ln:m a) :: Cast + ;~(pose with-triangles without-triangles) + |% + ++ with-triangles + ;~ plug + %+ cook crip + %+ ifix [gal gar] + %- star + ;~ pose + (escaped '<') + (escaped '>') + ;~(less gal gar line-end prn) :: Anything except '<', '>' or newline + == + (easy %.y) :: "yes triangles" + == + ++ without-triangles + ;~ plug + %+ cook crip + ;~ less + gal :: Doesn't start with '<' + %- plus :: Non-empty + ;~ less + whitespace :: No whitespace allowed + ;~ pose + (escaped '(') + (escaped ')') + ;~(less pal par line-end prn) :: Anything except '(', ')' or newline + == + == + == + (easy %.n) :: "no triangles" + == + -- + :: + ++ urlt + %+ cook |=(a=urlt:ln:m a) :: Cast + ;~ plug + url + %- punt :: Optional title-text + ;~ pfix (plus whitespace) :: Separated by some whitespace + %+ cook crip ;~ pose :: Enclosed in single quote, double quote, or '(...)' + (ifix [soq soq] (star ;~(pose (escaped '\'') ;~(less soq prn)))) + (ifix [doq doq] (star ;~(pose (escaped '"') ;~(less doq prn)))) + (ifix [pal par] (star ;~(pose (escaped '(') (escaped ')') ;~(less pal par prn)))) + == + == + == + :: + :: Labels are used in inline link targets and in a block-level element (labeled link references) + ++ label + %+ cook crip + %+ ifix [sel ser] :: Enclosed in '[...]' + %+ ifix :- (star whitespace) :: Strip leading and trailing whitespapce + (star whitespace) + %- plus ;~ pose :: Non-empty + (escaped '[') + (escaped ']') + ;~(less sel ser prn) :: Anything except '[', ']' (must be escaped) + == + :: + ++ target :: Link target, either reference or direct + =< %+ cook |=(a=target:ln:m a) + ;~(pose target-direct target-ref) + |% + ++ target-direct + %+ cook |=(a=target:ln:m a) + %+ stag %direct + %+ ifix [pal par] :: Direct links are enclosed in '(...)' + %+ ifix :- (star whitespace) :: Strip leading and trailing whitespace + (star whitespace) + urlt :: Just the target + ++ target-ref + %+ cook |=(a=target:ln:m a) + %+ stag %ref + ;~ pose + %+ stag %full label + %+ stag %collapsed (cold '' (jest '[]')) + %+ stag %shortcut (easy '') + == + -- + -- + ++ inline :: Inline elements + |% + ++ contents (cook |=(a=contents:inline:m a) (star element)) :: Element sequence + ++ element :: Any element + %+ cook |=(a=element:inline:m a) + ;~ pose + escape + entity + strong + emphasis + code + link + image + autolink + text + softbrk + hardbrk + == + :: + ++ text + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + entity + link + image + autolink + emphasis + strong + code + softbrk + hardbrk + :: ...etc + prn + == + :: + ++ escape + %+ cook |=(a=escape:inline:m a) + %+ stag %escape + ;~ pose + :: \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ + (escaped '[') (escaped ']') (escaped '(') (escaped ')') + (escaped '!') (escaped '*') (escaped '*') (escaped '_') + (escaped '&') (escaped '\\') + :: etc + == + ++ entity + %+ cook |=(a=entity:inline:m a) + %+ stag %entity + %+ ifix [pam mic] + %+ cook crip + ;~ pose + ;~(plug hax (stun [1 7] nud)) :: '#' and one to seven digits + (plus alf) :: Named entity + == + :: + ++ softbrk :: Newline + %+ cook |=(a=softbrk:inline:m a) + %+ stag %soft-line-break + (cold ~ newline) + :: + ++ hardbrk + %+ cook |=(a=hardbrk:inline:m a) + %+ stag %line-break + %+ cold ~ + ;~ pose + ;~(plug (jest ' ') (star ace) newline) :: Two or more spaces before a newline + ;~(plug (just '\\') newline) :: An escaped newline + == + ++ link + %+ knee *link:inline:m |. ~+ :: recurse + %+ cook backfill-ref-link + %+ stag %link + ;~ plug + %+ ifix [sel ser] :: Display text is wrapped in '[...]' + %- star ;~ pose :: Display text can contain various contents + escape + entity + emphasis + strong + code + image + :: Text: => + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + entity + emphasis + strong + code + ser :: No closing ']' + prn + == + == + target:ln + == + :: + ++ image + %+ cook |=(a=image:inline:m a) + %+ stag %image + ;~ plug + %+ ifix [(jest '![') (just ']')] :: alt-text is wrapped in '![...]' + %+ cook crip + %- star ;~ pose + (escaped ']') + ;~(less ser prn) + == + target:ln + == + :: + ++ autolink + %+ cook |=(a=autolink:inline:m a) + %+ stag %autolink + %+ ifix [gal gar] :: Enclosed in '<...>' + %+ cook crip + %- star ;~ pose + ;~(less ace gar prn) :: Spaces are not allowed; neither are backslash-escapes + == + :: + ++ emphasis + %+ knee *emphasis:inline:m |. ~+ :: recurse + %+ cook |=(a=emphasis:inline:m a) + %+ stag %emphasis + ;~ pose + %+ ifix [tar tar] + ;~ plug + (easy '*') + %- plus ;~ pose :: Display text can contain various contents + escape + entity + strong + link + autolink + code + image + link + softbrk + hardbrk + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + entity + strong + link + autolink + code + image + link + softbrk + hardbrk + :: + tar :: If a '*', then it's the end of the `emphasis` + :: + prn + == + == + == + %+ ifix [cab cab] + ;~ plug + (easy '_') + %- plus ;~ pose :: Display text can contain various contents + escape + entity + strong + link + autolink + code + image + link + softbrk + hardbrk + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + entity + strong + link + autolink + code + image + link + softbrk + hardbrk + :: + cab :: If a '*', then it's the end of the `emphasis` + :: + prn + == + == + == + == + :: + ++ strong + %+ knee *strong:inline:m |. ~+ :: recurse + %+ cook |=(a=strong:inline:m a) + %+ stag %strong + ;~ pose + %+ ifix [(jest '**') (jest '**')] + ;~ plug + (easy '*') + %- plus ;~ pose :: Display text can contain various contents + escape + emphasis + link + autolink + code + image + link + softbrk + hardbrk + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + emphasis + link + autolink + code + image + link + softbrk + hardbrk + :: ...etc + (jest '**') :: If a '**', then it's the end of the `emphasis` + prn + == + == + == + %+ ifix [(jest '__') (jest '__')] + ;~ plug (easy '_') + %- plus ;~ pose :: Display text can contain various contents + escape + emphasis + link + autolink + code + image + link + softbrk + hardbrk + %+ knee *text:inline:m |. ~+ :: recurse + %+ cook |=(a=text:inline:m a) + %+ stag %text + %+ cook crip + %- plus :: At least one character + ;~ less :: ...which doesn't match any other inline rule + escape + emphasis + link + autolink + code + image + link + softbrk + hardbrk + :: + (jest '__') :: If a '**', then it's the end of the `emphasis` + prn + == + == + == + == + :: + ++ code + =< %+ cook |=(a=code:inline:m a) + %+ stag %code-span + inner-parser + |% + ++ inner-parser + |= =nail + =/ vex ((plus tic) nail) :: Read the first backtick string + ?~ q.vex vex :: If no vex is found, fail + =/ tic-sequence ^- tape p:(need q.vex) + %. + q:(need q.vex) + %+ cook |= [a=tape] :: Attach the backtick length to it + [(lent tic-sequence) (crip a)] + ;~ sfix + %+ cook + |= [a=(list tape)] + ^- tape + (zing a) + %- star ;~ pose + %+ cook trip ;~(less tic prn) :: Any character other than a backtick + %+ sear :: A backtick string that doesn't match the opener + |= [a=tape] + ^- (unit tape) + ?: =((lent a) (lent tic-sequence)) + ~ + `a + (plus tic) + == + (jest (crip tic-sequence)) :: Followed by a closing backtick string + == + -- + -- + :: + ++ leaf + |% + ++ node + %+ cook |=(a=node:leaf:m a) + ;~ pose + blank-line + heading + break + codeblk-indent + codeblk-fenced + link-ref-def + :: ...etc + table + paragraph + == + ++ blank-line + %+ cook |=(a=blank-line:leaf:m a) + %+ stag %blank-line + (cold ~ newline) + ++ heading + =< %+ cook |=(a=heading:leaf:m a) + %+ stag %heading + ;~(pose atx setext) + |% + ++ atx + =/ atx-eol ;~ plug + (star ace) + (star hax) + (star ace) + line-end + == + + %+ stag %atx + %+ cook :: Parse heading inline content + |= [level=@ text=tape] + [level (scan text contents:inline)] + ;~ pfix + (stun [0 3] ace) :: Ignore up to 3 leading spaces + ;~ plug + (cook |=(a=tape (lent a)) (stun [1 6] hax)) :: Heading level + %+ ifix [(plus ace) atx-eol] :: One leading space is required; rest is ignored + %- star + ;~(less atx-eol prn) :: Trailing haxes/spaces are ignored + == + == + ++ setext + %+ stag %setext + %+ cook + |= [text=tape level=@] + [level (scan text contents:inline)] + ;~ plug :: Wow this is a mess + %+ ifix [(stun [0 3] ace) (star ace)] :: Strip up to 3 spaces, and trailing space + (star ;~(less ;~(pfix (star ace) newline) prn)) :: Any text... + ;~ pfix + newline :: ...followed by newline... + (stun [0 3] ace) :: ...up to 3 spaces (stripped)... + ;~ sfix + ;~ pose :: ...and an underline + (cold 1 (plus (just '-'))) :: Underlined by '-' means heading lvl 1 + (cold 2 (plus (just '='))) :: Underlined by '=' means heading lvl 2 + == + (star ace) + == + == + == + -- + ++ break + %+ cook |=(a=break:leaf:m a) + %+ stag %break + %+ cook + |= [first-2=@t trailing=tape] + [(head trailing) (add 2 (lent trailing))] + %+ ifix :- (stun [0 3] ace) :: Strip indent and trailing space + ;~ plug + (star (mask " \09")) + newline :: No other chars allowed on the line + == + ;~ pose + ;~(plug (jest '**') (plus tar)) :: At least 3, but can be more + ;~(plug (jest '--') (plus hep)) + ;~(plug (jest '__') (plus cab)) + == + :: + ++ codeblk-indent + %+ cook |=(a=codeblk-indent:leaf:m a) + %+ stag %indent-codeblock + %+ cook |=(a=(list tape) (crip (zing a))) + %- plus :: 1 or more lines + ;~ pfix + (jest ' ') :: 4 leading spaces + %+ cook snoc ;~ plug + (star ;~(less line-end prn)) + line-end + == + == + :: + ++ codeblk-fenced + =+ |% + :: Returns a 3-tuple: + :: - indent size + :: - char type + :: - fence length + ++ code-fence + ;~ plug + %+ cook |=(a=tape (lent a)) (stun [0 3] ace) + %+ cook |=(a=tape [(head a) (lent a)]) :: Get code fence char and length + ;~ pose + (stun [3 999.999.999] sig) + (stun [3 999.999.999] tic) + == + == + :: + ++ info-string + %+ cook crip + %+ ifix [(star ace) line-end] :: Strip leading whitespace + (star ;~(less line-end tic prn)) :: No backticks in a code fence + -- + |* =nail + :: Get the marker and indent size + =/ vex (code-fence nail) + ?~ q.vex vex :: If no match found, fail + =/ [indent=@ char=@t len=@] p:(need q.vex) + =/ closing-fence + ;~ plug + (star ace) + (stun [len 999.999.999] (just char)) :: Closing fence must be at least as long as opener + (star ace) :: ...and cannot have any following text except space + line-end + == + :: Read the rest of the list item block + %. + q:(need q.vex) + %+ cook |=(a=codeblk-fenced:leaf:m a) + %+ stag %fenced-codeblock + ;~ plug + %+ cook |=(a=@t a) (easy char) + (easy len) + %+ cook |=(a=@t a) info-string + (easy indent) + %+ cook |=(a=(list tape) (crip (zing a))) + ;~ sfix + %- star :: Any amount of lines + ;~ less closing-fence :: ...until the closing code fence + ;~ pfix (stun [0 indent] ace) :: Strip indent up to that of the opening fence + %+ cook |=(a=tape a) + ;~ pose :: Avoid infinite loop at EOF + %+ cook trip newline :: A line is either a blank line... + %+ cook snoc + ;~ plug :: Or a non-blank line + (plus ;~(less line-end prn)) + line-end + == + == + == + == + ;~(pose closing-fence (full (easy ~))) + == + == + :: + ++ link-ref-def + %+ cook |=(a=link-ref-def:leaf:m a) + %+ stag %link-ref-definition + %+ ifix [(stun [0 3] ace) line-end] :: Strip leading space + ;~ plug + ;~(sfix label:ln col) :: Label (enclosed in "[...]"), followed by col ":" + ;~ pfix :: Optional whitespace, including up to 1 newline + (star ace) + (stun [0 1] newline) + (star ace) + urlt:ln + == + == + :: + ++ paragraph + %+ cook |=(a=paragraph:leaf:m a) + %+ stag %paragraph + %+ cook :: Reparse the paragraph text as elements + |= [a=(list tape)] + (scan (zing a) contents:inline) + %- plus :: Read lines until a non-paragraph object is found + ;~ less + heading + break + block-quote-line:container :: Block quotes can interrupt paragraphs + %+ cook snoc ;~ plug + %- plus ;~(less line-end prn) :: Lines must be non-empty + line-end + == + == + :: + ++ table + => |% + +$ cell-t [len=@ =contents:inline:m] + ++ row + ;~ pfix bar :: A bar in front... + %- star + %+ cook :: compute the length and parse inlines + |= [pfx=@ stuff=tape sfx=@] + [;:(add pfx (lent stuff) sfx) (scan stuff contents:inline)] :: inline elements... + ;~ plug + (cook lent (star ace)) + (star ;~(less newline ;~(plug (star ace) bar) prn)) + (cook lent ;~(sfix (star ace) bar)) + == + == + ++ delimiter-row + ;~ pfix bar :: A bar in front... + %- star + %+ cook + |= [pfx=@ lal=? heps=@ ral=? sfx=@] + :- ;:(add pfx ?:(ral 1 0) heps ?:(lal 1 0) sfx) + ?:(ral ?:(lal %c %r) ?:(lal %l %n)) + ;~ plug + (cook lent (star ace)) :: Delimiter: leading space... + (cook |=(a=tape .?(a)) (stun [0 1] col)) :: maybe a ':'... + (cook lent (plus hep)) :: a bunch of '-'... + (cook |=(a=tape .?(a)) (stun [0 1] col)) :: maybe another ':'... + (cook lent ;~(sfix (star ace) bar)) :: ..and a bar as a terminator + == + == + -- + |* =nail :: Make it a (redundant) gate so I can use `=>` to add a helper core + %. nail :: apply the following parser + %+ cook + |= [hdr=(list cell-t) del=(list [len=@ al=?(%c %r %l %n)]) bdy=(list (list cell-t))] + ^- table:leaf:m + =/ widths=(list @) (turn del |=([len=@ al=*] len)) + =/ rows=(list (list cell-t)) (snoc bdy hdr) :: since they're the same data type + =/ computed-widths + |- + ?~ rows widths + %= $ + rows (tail rows) + widths =/ row=(list cell-t) (head rows) + |- + ?~ row ~ + :- (max (head widths) len:(head row)) + %= $ + widths (tail widths) + row (tail row) + == + == + :* %table + computed-widths + (turn hdr |=(cell=cell-t contents.cell)) + (turn del |=([len=@ al=?(%c %r %l %n)] al)) + (turn bdy |=(row=(list cell-t) (turn row |=(cell=cell-t contents.cell)))) + == + ;~ plug + ;~(sfix row line-end) + ;~(sfix delimiter-row line-end) + (star ;~(sfix row line-end)) + == + -- + :: + ++ container + =+ |% + :: + ++ line :: Read a line of plain text + %+ cook |=([a=tape b=tape c=tape] ;:(weld a b c)) + ;~ plug + (star ;~(less line-end prn)) + (cook trip line-end) + (star newline) :: Can have blank lines in a list item + == + ++ block-quote-marker + ;~ plug :: Single char '>' + (stun [0 3] ace) :: Indented up to 3 spaces + gar + (stun [0 1] ace) :: Optionally followed by a space + == + ++ block-quote-line + %+ cook snoc + ;~ plug :: Single line... + ;~ pfix block-quote-marker :: ...starting with ">..." + (star ;~(less line-end prn)) :: can be empty + == + line-end + == + :: + +$ ul-marker-t [indent=@ char=@t len=@] + ++ ul-marker + %+ cook :: Compute the length of the whole thing + |= [prefix=tape bullet=@t suffix=tape] + ^- ul-marker-t + :* (lent prefix) + bullet + ;:(add 1 (lent prefix) (lent suffix)) + == + ;~ plug + (stun [0 3] ace) + ;~(pose hep lus tar) :: Bullet char + (stun [1 4] ace) + == + :: + :: Produces a 3-tuple: + :: - bullet char (*, +, or -) + :: - indent level (number of spaces before the bullet) + :: - item contents (markdown) + +$ ul-item-t [char=@t indent=@ =markdown:m] + ++ ul-item + |* =nail + :: Get the marker and indent size + =/ vex (ul-marker nail) + ?~ q.vex vex :: If no match found, fail + =/ mrkr=ul-marker-t p:(need q.vex) + :: Read the rest of the list item block + %. + q:(need q.vex) + %+ cook + |= [a=(list tape)] + ^- ul-item-t + :* char.mrkr + indent.mrkr + (scan (zing a) markdown) + == + ;~ plug + line :: First line + %- star ;~ pfix :: Subsequent lines must have the same indent + (stun [len.mrkr len.mrkr] ace) :: the indent + line :: the line + == + == + :: + +$ ol-marker-t [indent=@ char=@t number=@ len=@] + ++ ol-marker + %+ cook :: Compute the length of the whole thing + |= [prefix=tape number=@ char=@t suffix=tape] + ^- ol-marker-t + :* (lent prefix) + char + number + ;:(add 1 (lent (a-co:co number)) (lent prefix) (lent suffix)) + == + ;~ plug + (stun [0 3] ace) + dem + ;~(pose dot par) :: Bullet char + (stun [1 4] ace) + == + :: + :: Produces a 4-tuple: + :: - delimiter char: either dot '.' or par ')' + :: - list item number + :: - indent level (number of spaces before the number) + :: - item contents (markdown) + +$ ol-item-t [char=@t number=@ indent=@ =markdown:m] + ++ ol-item + |* =nail + ::^- edge + :: Get the marker and indent size + =/ vex (ol-marker nail) + ?~ q.vex vex :: If no match found, fail + =/ mrkr=ol-marker-t p:(need q.vex) + :: Read the rest of the list item block + %. + q:(need q.vex) + %+ cook + |= [a=(list tape)] + ^- ol-item-t + :* char.mrkr + number.mrkr + indent.mrkr + (scan (zing a) markdown) + == + ;~ plug + line :: First line + %- star ;~ pfix :: Subsequent lines must have the same indent + (stun [len.mrkr len.mrkr] ace) :: the indent + line :: the line + == + == + :: + ++ tl-checkbox + ;~ pose + %+ cold %.y (jest '[x]') + %+ cold %.n (jest '[ ]') + == + :: + :: Produces a 4-tuple: + :: - bullet char (*, +, or -) + :: - indent level (number of spaces before the bullet) + :: - is-checked + :: - item contents (markdown) + +$ tl-item-t [char=@t indent=@ is-checked=? =markdown:m] + ++ tl-item + |* =nail + :: Get the marker and indent size + =/ vex (;~(plug ul-marker ;~(sfix tl-checkbox ace)) nail) + ?~ q.vex vex :: If no match found, fail + =/ [mrkr=ul-marker-t is-checked=?] p:(need q.vex) + :: Read the rest of the list item block + %. + q:(need q.vex) + %+ cook + |= [a=(list tape)] + ^- tl-item-t + :* char.mrkr + indent.mrkr + is-checked + (scan (zing a) markdown) + == + ;~ plug + line :: First line + %- star ;~ pfix :: Subsequent lines must have the same indent + (stun [len.mrkr len.mrkr] ace) :: the indent + line :: the line + == + == + -- + |% + ++ node + %+ cook |=(a=node:container:m a) + ;~ pose + block-quote + tl + ul + ol + == + :: + ++ block-quote + %+ cook |=(a=block-quote:container:m a) + %+ stag %block-quote + %+ cook |= [a=(list tape)] + (scan (zing a) markdown) + ;~ plug + block-quote-line + %- star :: At least one line + ;~ pose + block-quote-line + %+ cook zing %- plus :: Paragraph continuation (copied from `paragraph` above) + ;~ less :: ...basically just text that doesn't matchZ anything else + heading:leaf + break:leaf + :: ol + :: ul + block-quote-marker :: Can't start with ">" + line-end :: Can't be blank + %+ cook snoc ;~ plug + %- star ;~(less line-end prn) + line-end + == + == + == + == + :: + ++ ul + |* =nail + :: Start by finding the type of the first bullet (indent level and bullet char) + =/ vex (ul-item nail) + ?~ q.vex vex :: Fail if it doesn't match a list item + =/ first-item=ul-item-t p:(need q.vex) + :: Check for more list items + %. + q:(need q.vex) + %+ cook |=(a=ul:container:m a) + %+ stag %ul + ;~ plug :: Give the first item, first + (easy indent.first-item) + (easy char.first-item) + (easy markdown.first-item) + %- star + %+ sear :: Reject items that don't have the same bullet char + |= [item=ul-item-t] + ^- (unit markdown:m) + ?. =(char.item char.first-item) + ~ + `markdown.item + ul-item + == + :: + ++ ol + |* =nail + :: Start by finding the first number, char, and indent level + =/ vex (ol-item nail) + ?~ q.vex vex :: Fail if it doesn't match a list item + =/ first-item=ol-item-t p:(need q.vex) + :: Check for more list items + %. + q:(need q.vex) + %+ cook |=(a=ol:container:m a) + %+ stag %ol + ;~ plug :: Give the first item, first + (easy indent.first-item) + (easy char.first-item) + (easy number.first-item) + (easy markdown.first-item) + %- star + %+ sear :: Reject items that don't have the same delimiter + |= [item=ol-item-t] + ^- (unit markdown:m) + ?. =(char.item char.first-item) + ~ + `markdown.item + ol-item + == + :: + ++ tl + |* =nail + :: Start by finding the type of the first bullet (indent level and bullet char) + =/ vex (tl-item nail) + ?~ q.vex vex :: Fail if it doesn't match a list item + =/ first-item=tl-item-t p:(need q.vex) + :: Check for more list items + %. + q:(need q.vex) + %+ cook |=(a=tl:container:m a) + %+ stag %tl + ;~ plug :: Give the first item, first + (easy indent.first-item) + (easy char.first-item) + (easy [is-checked.first-item markdown.first-item]) + %- star + %+ sear :: Reject items that don't have the same bullet char + |= [item=tl-item-t] + ^- (unit [is-checked=? markdown:m]) + ?. =(char.item char.first-item) + ~ + `[is-checked.item markdown.item] + tl-item + == + -- + :: + ++ markdown + %+ cook |=(a=markdown:m a) + %- star ;~ pose + (stag %container node:container) + (stag %leaf node:leaf) + == + -- + :: + :: Enserialize (write out as text) + ++ en + |% + ++ escape-chars + |= [text=@t chars=(list @t)] + ^- tape + %+ rash text + %+ cook + |=(a=(list tape) `tape`(zing a)) + %- star ;~ pose + (cook |=(a=@t `tape`~['\\' a]) (mask chars)) + (cook trip prn) + == + :: + ++ ln + |% + ++ url + =< |= [u=url:ln:m] + ^- tape + ?: has-triangle-brackets.u + (with-triangles text.u) + (without-triangles text.u) + |% + ++ with-triangles + |= [text=@t] + ;: weld + "<" :: Put it inside triangle brackets + (escape-chars text "<>") :: Escape triangle brackets in the text + ">" + == + ++ without-triangles + |= [text=@t] + (escape-chars text "()") :: Escape all parentheses '(' and ')' + -- + ++ urlt + |= [u=urlt:ln:m] + ^- tape + ?~ title-text.u :: If there's no title text, then it's just an url + (url url.u) + ;:(weld (url url.u) " \"" (escape-chars (need title-text.u) "\"") "\"") + ++ label + |= [text=@t] + ^- tape + ;:(weld "[" (escape-chars text "[]") "]") + ++ target + |= [t=target:ln:m] + ^- tape + ?- -.t + %direct ;:(weld "(" (urlt urlt.t) ")") :: Wrap in parentheses + :: + %ref ?- type.t + %full (label label.t) + %collapsed "[]" + %shortcut "" + == + == + -- + :: + ++ inline + |% + ++ contents + |= [=contents:inline:m] + ^- tape + %- zing %+ turn contents element + ++ element + |= [e=element:inline:m] + ?+ -.e !! + %text (text e) + %link (link e) + %escape (escape e) + %entity (entity e) + %code-span (code e) + %strong (strong e) + %emphasis (emphasis e) + %soft-line-break (softbrk e) + %line-break (hardbrk e) + %image (image e) + %autolink (autolink e) + :: ...etc + == + ++ text + |= [t=text:inline:m] + ^- tape + (trip text.t) :: So easy! + :: + ++ entity + |= [e=entity:inline:m] + ^- tape + ;:(weld "&" (trip code.e) ";") + :: + ++ link + |= [l=link:inline:m] + ^- tape + ;: weld + "[" + (contents contents.l) + "]" + (target:ln target.l) + == + :: + ++ image + |= [i=image:inline:m] + ^- tape + ;: weld + "![" + (escape-chars alt-text.i "]") + "]" + (target:ln target.i) + == + :: + ++ autolink + |= [a=autolink:inline:m] + ^- tape + ;: weld + "<" + (trip text.a) + ">" + == + :: + ++ escape + |= [e=escape:inline:m] + ^- tape + (snoc "\\" char.e) :: Could use `escape-chars` but why bother-- this is shorter + :: + ++ softbrk + |= [s=softbrk:inline:m] + ^- tape + "\0a" + ++ hardbrk + |= [h=hardbrk:inline:m] + ^- tape + "\\\0a" + ++ code + |= [c=code:inline:m] + ^- tape + ;:(weld (reap num-backticks.c '`') (trip text.c) (reap num-backticks.c '`')) + :: + ++ strong + |= [s=strong:inline:m] + ^- tape + ;: weld + (reap 2 emphasis-char.s) + (contents contents.s) + (reap 2 emphasis-char.s) + == + :: + ++ emphasis + |= [e=emphasis:inline:m] + ^- tape + ;: weld + (trip emphasis-char.e) + (contents contents.e) + (trip emphasis-char.e) + == + -- + :: + ++ leaf + |% + ++ node + |= [n=node:leaf:m] + ?+ -.n !! + %blank-line (blank-line n) + %break (break n) + %heading (heading n) + %indent-codeblock (codeblk-indent n) + %fenced-codeblock (codeblk-fenced n) + %link-ref-definition (link-ref-def n) + %paragraph (paragraph n) + %table (table n) + :: ...etc + == + + ++ blank-line + |= [b=blank-line:leaf:m] + ^- tape + "\0a" + :: + ++ break + |= [b=break:leaf:m] + ^- tape + (weld (reap char-count.b char.b) "\0a") + :: + ++ heading + |= [h=heading:leaf:m] + ^- tape + ?- style.h + %atx + ;:(weld (reap level.h '#') " " (contents:inline contents.h) "\0a") + %setext + =/ line (contents:inline contents.h) + ;:(weld line "\0a" (reap (lent line) ?:(=(level.h 1) '-' '=')) "\0a") + == + :: + ++ codeblk-indent + |= [c=codeblk-indent:leaf:m] + ^- tape + %+ rash text.c + %+ cook + |= [a=(list tape)] + ^- tape + %- zing %+ turn a |=(t=tape (weld " " t)) + %- plus %+ cook snoc ;~(plug (star ;~(less (just '\0a') prn)) (just '\0a')) + :: + ++ codeblk-fenced + |= [c=codeblk-fenced:leaf:m] + ^- tape + ;: weld + (reap indent-level.c ' ') + (reap char-count.c char.c) + (trip info-string.c) + "\0a" + ^- tape %+ rash text.c + %+ cook zing %- star :: Many lines + %+ cook |= [a=tape newline=@t] :: Prepend each line with "> " + ^- tape + ;: weld + ?~(a "" (reap indent-level.c ' ')) :: If the line is blank, no indent + a + "\0a" + == + ;~ plug :: Break into lines + (star ;~(less (just '\0a') prn)) + (just '\0a') + == + (reap indent-level.c ' ') + (reap char-count.c char.c) + "\0a" + == + :: + ++ link-ref-def + |= [l=link-ref-def:leaf:m] + ^- tape + ;: weld + "[" + (trip label.l) + "]: " + (urlt:ln urlt.l) + "\0a" + == + :: + ++ table + => |% + ++ cell + |= [width=@ c=contents:inline:m] + ^- tape + =/ contents-txt (contents:inline c) + ;: weld + " " + contents-txt + (reap (sub width (add 1 (lent contents-txt))) ' ') + "|" + == + ++ row + |= [widths=(list @) cells=(list contents:inline:m)] + ^- tape + ;: weld + "|" + |- + ^- tape + ?~ widths ~ + %+ weld + (cell (head widths) (head cells)) + $(widths (tail widths), cells (tail cells)) + "\0a" + == + ++ delimiter-row + |= [widths=(list @) align=(list ?(%l %c %r %n))] + ^- tape + ;: weld + "|" + |- + ^- tape + ?~ align ~ + ;: weld + " " + ?- (head align) + %l (weld ":" (reap ;:(sub (head widths) 3) '-')) + %r (weld (reap ;:(sub (head widths) 3) '-') ":") + %c ;:(weld ":" (reap ;:(sub (head widths) 4) '-') ":") + %n (reap ;:(sub (head widths) 2) '-') + == + " |" + $(align (tail align), widths (tail widths)) + == + "\0a" + == + -- + |= [t=table:leaf:m] + ^- tape + ;: weld + (row widths.t head.t) + (delimiter-row widths.t align.t) + =/ rows rows.t + |- + ^- tape + ?~ rows ~ + %+ weld (row widths.t (head rows)) $(rows (tail rows)) + == + :: + ++ paragraph + |= [p=paragraph:leaf:m] + ^- tape + (contents:inline contents.p) + -- + :: + ++ container + => |% + ++ line + %+ cook snoc + ;~ plug + (star ;~(less (just '\0a') prn)) + (just '\0a') + == + -- + |% + ++ node + |= [n=node:container:m] + ?- -.n + %block-quote (block-quote n) + %ul (ul n) + %ol (ol n) + %tl (tl n) + == + :: + ++ block-quote + |= [b=block-quote:container:m] + ^- tape + %+ scan (markdown markdown.b) :: First, render the contents + %+ cook zing %- plus :: Many lines + %+ cook |= [a=tape newline=@t] :: Prepend each line with "> " + ^- tape + ;: weld + ">" + ?~(a "" " ") :: If the line is blank, no trailing space + a + "\0a" + == + ;~ plug :: Break into lines + (star ;~(less (just '\0a') prn)) + (just '\0a') + == + :: + ++ ul + |= [u=ul:container:m] + ^- tape + %- zing %+ turn contents.u :: Each bullet point... + |= [item=markdown:m] + ^- tape + %+ scan (markdown item) :: First, render bullet point contents + %+ cook zing + ;~ plug + %+ cook |= [a=tape] :: Prepend 1st line with indent + bullet char + ;: weld + (reap indent-level.u ' ') + (trip marker-char.u) + " " + a + == + line :: first line + %- star + %+ cook |= [a=tape] :: Subsequent lines just get indent + ?: ?|(=("" a) =("\0a" a)) a + ;: weld + (reap indent-level.u ' ') + " " :: 2 spaces, to make it even with the 1st line + a + == + line :: second and thereafter lines + == + ++ tl + |= [t=tl:container:m] + ^- tape + %- zing %+ turn contents.t :: Each bullet point... + |= [is-checked=? item=markdown:m] + ^- tape + %+ scan (markdown item) :: First, render bullet point contents + %+ cook zing + ;~ plug + %+ cook |= [a=tape] :: Prepend 1st line with indent, bullet char, checkbox + ;: weld + (reap indent-level.t ' ') + (trip marker-char.t) + " [" + ?:(is-checked "x" " ") + "] " + a + == + line :: first line + %- star + %+ cook |= [a=tape] :: Subsequent lines just get indent + ?: ?|(=("" a) =("\0a" a)) a + ;: weld + (reap indent-level.t ' ') + " " :: 2 spaces, to make it even with the 1st line + a + == + line :: second and thereafter lines + == + :: + ++ ol + |= [o=ol:container:m] + ^- tape + %- zing %+ turn contents.o :: Each item... + |= [item=markdown:m] + ^- tape + %+ scan (markdown item) :: First, render item contents + %+ cook zing + ;~ plug + %+ cook |= [a=tape] :: Prepend 1st line with indent + item number + ;: weld + (reap indent-level.o ' ') + (a-co:co start-num.o) + (trip marker-char.o) + " " + a + == + line :: first line + %- star + %+ cook |= [a=tape] :: Subsequent lines just get indent + ?: ?|(=("" a) =("\0a" a)) a + ;: weld + (reap indent-level.o ' ') + (reap (lent (a-co:co start-num.o)) ' ') + " " :: 2 spaces, to make it even with the 1st line + a + == + line :: second and thereafter lines + == + -- + :: + ++ markdown + |= [a=markdown:m] + ^- tape + %- zing %+ turn a |= [item=node:markdown:m] + ?- -.item + %leaf (node:leaf +.item) + %container (node:container +.item) + == + -- + -- + :: + :: Enserialize as Sail (manx and marl) + ++ sail-en + =< + |= [document=markdown:m] + =/ link-ref-defs (all-link-ref-definitions document) + ^- manx + ;div + ;* (~(markdown sail-en link-ref-defs) document) + == + :: + |_ [reference-links=(map @t urlt:ln:m)] + ++ inline + |% + ++ contents + |= [=contents:inline:m] + ^- marl + %+ turn contents element + ++ element + |= [e=element:inline:m] + ^- manx + ?+ -.e !! + %text (text e) + %link (link e) + %code-span (code e) + %escape (escape e) + %entity (entity e) + %strong (strong e) + %emphasis (emphasis e) + %soft-line-break (softbrk e) + %line-break (hardbrk e) + %image (image e) + %autolink (autolink e) + :: ...etc + == + ++ text + |= [t=text:inline:m] + ^- manx + [[%$ [%$ (trip text.t)] ~] ~] :: Magic; look up the structure of a `manx` if you want + ++ escape + |= [e=escape:inline:m] + ^- manx + [[%$ [%$ (trip char.e)] ~] ~] :: Magic; look up the structure of a `manx` if you want + ++ entity + |= [e=entity:inline:m] + ^- manx + =/ fulltext (crip ;:(weld "&" (trip code.e) ";")) + [[%$ [%$ `tape`[fulltext ~]] ~] ~] :: We do a little sneaky + ++ softbrk + |= [s=softbrk:inline:m] + ^- manx + (text [%text ' ']) + ++ hardbrk + |= [h=hardbrk:inline:m] + ^- manx + ;br; + ++ code + |= [c=code:inline:m] + ^- manx + ;code: {(trip text.c)} + ++ link + |= [l=link:inline:m] + ^- manx + =/ target target.l + =/ urlt ?- -.target + %direct urlt.target :: Direct link; use it + %ref :: Ref link; look it up + ~| "reflink not found: {<label.target>}" + (~(got by reference-links) label.target) + == + ;a(href (trip text.url.urlt), title (trip (fall title-text.urlt ''))) + ;* (contents contents.l) + == + ++ image + |= [i=image:inline:m] + ^- manx + =/ target target.i + =/ urlt ?- -.target + %direct urlt.target :: Direct link; use it + %ref :: Ref link; look it up + ~| "reflink not found: {<label.target>}" + (~(got by reference-links) label.target) + == + ;img(src (trip text.url.urlt), alt (trip alt-text.i)); + ++ autolink + |= [a=autolink:inline:m] + ^- manx + ;a(href (trip text.a)): {(trip text.a)} + ++ emphasis + |= [e=emphasis:inline:m] + ^- manx + ;em + ;* (contents contents.e) + == + ++ strong + |= [s=strong:inline:m] + ^- manx + ;strong + ;* (contents contents.s) + == + -- + ++ leaf + |% + ++ node + |= [n=node:leaf:m] + ^- manx + ?+ -.n !! + %blank-line (blank-line n) + %break (break n) + %heading (heading n) + %indent-codeblock (codeblk-indent n) + %fenced-codeblock (codeblk-fenced n) + %table (table n) + %paragraph (paragraph n) + %link-ref-definition (text:inline [%text ' ']) :: Link ref definitions don't render as anything + :: ...etc + == + ++ heading + |= [h=heading:leaf:m] + ^- manx + :- + :_ ~ ?+ level.h !! :: Tag and attributes; attrs are empty (~) + %1 %h1 + %2 %h2 + %3 %h3 + %4 %h4 + %5 %h5 + %6 %h6 + == + (contents:inline contents.h) + ++ blank-line + |= [b=blank-line:leaf:m] + ^- manx + (text:inline [%text ' ']) + ++ break + |= [b=break:leaf:m] + ^- manx + ;hr; + ++ codeblk-indent + |= [c=codeblk-indent:leaf:m] + ^- manx + ;pre + ;code: {(trip text.c)} + == + ++ codeblk-fenced + |= [c=codeblk-fenced:leaf:m] + ^- manx + ;pre + ;+ ?: =(info-string.c '') + ;code: {(trip text.c)} + ;code(class (weld "language-" (trip info-string.c))): {(trip text.c)} + == + ++ table + |= [t=table:leaf:m] + ^- manx + ;table + ;thead + ;tr + ;* =/ hdr head.t + =/ align align.t + |- + ?~ hdr ~ + :- ;th(align ?-((head align) %c "center", %r "right", %l "left", %n "")) + ;* (contents:inline (head hdr)) + == + $(hdr (tail hdr), align (tail align)) + + == + == + ;tbody + ;* %+ turn rows.t + |= [r=(list contents:inline:m)] + ^- manx + ;tr + ;* =/ row r + =/ align align.t + |- + ?~ row ~ + :- ;td(align ?-((head align) %c "center", %r "right", %l "left", %n "")) + ;* (contents:inline (head row)) + == + $(row (tail row), align (tail align)) + == + == + == + ++ paragraph + |= [p=paragraph:leaf:m] + ^- manx + ;p + ;* (contents:inline contents.p) + == + -- + :: + ++ container + |% + ++ node + |= [n=node:container:m] + ^- manx + ?- -.n + %block-quote (block-quote n) + %ul (ul n) + %ol (ol n) + %tl (tl n) + == + :: + ++ block-quote + |= [b=block-quote:container:m] + ^- manx + ;blockquote + ;* (~(. markdown reference-links) markdown.b) + == + :: + ++ ul + |= [u=ul:container:m] + ^- manx + ;ul + ;* %+ turn contents.u |= [a=markdown:m] + ^- manx + ;li + ;* (~(. markdown reference-links) a) + == + == + :: + ++ ol + |= [o=ol:container:m] + ^- manx + ;ol(start (a-co:co start-num.o)) + ;* %+ turn contents.o |= [a=markdown:m] + ^- manx + ;li + ;* (~(. markdown reference-links) a) + == + == + ++ tl + |= [t=tl:container:m] + ^- manx + ;ul.task-list + ;* %+ turn contents.t |= [is-checked=? a=markdown:m] + ^- manx + ;li + ;+ ?: is-checked + ;input(type "checkbox", checked "true"); + ;input(type "checkbox"); + ;* (~(. markdown reference-links) a) + == + == + -- + :: + ++ markdown + |= [a=markdown:m] + ^- marl + %+ turn a |= [item=node:markdown:m] + ?- -.item + %leaf (node:leaf +.item) + %container (node:container +.item) + == + -- +-- diff --git a/backupdesk/lib/nostr.hoon b/backupdesk/lib/nostr.hoon new file mode 100644 index 0000000..7cb719b --- /dev/null +++ b/backupdesk/lib/nostr.hoon @@ -0,0 +1,31 @@ +/- sur=nostr +/+ js=json-nostr, sr=sortug +|% +++ gen-sub-id |= eny=@ ^- @t + %- crip (scag 60 (scow:sr %uw eny)) +++ gen-keys |= eny=@ ^- keys:sur + =, secp256k1:secp:crypto + =/ privkey + |- + =/ k (~(rad og eny) (bex 256)) + ?. (lth k n.t) $ k + + =/ pubkey (priv-to-pub privkey) + =/ pub (compress-point pubkey) + :: =/ pub (serialize-point pubkey) + [pub=pub priv=privkey] +:: +++ hash-event |= raw=raw-event:sur ^- @ux + =/ jon (raw-event:en:js raw) + =/ jstring (en:json:html jon) + (swp 3 (shax jstring)) + +++ raws + |= [eny=@ bits=@] + ^- [@ @] + [- +>-]:(~(raws og eny) bits) + +++ sign-event |= [priv=@ux hash=@ux eny=@] + =^ sed eny (raws eny 256) + (sign:schnorr:secp256k1:secp:crypto priv hash sed) +-- diff --git a/backupdesk/lib/nostrill.hoon b/backupdesk/lib/nostrill.hoon new file mode 100644 index 0000000..c7283d4 --- /dev/null +++ b/backupdesk/lib/nostrill.hoon @@ -0,0 +1,54 @@ +/- post=trill-post, nsur=nostr, sur=nostrill +/+ trill=trill-post, nostr, sr=sortug +|% +:: +++ default-state |= =bowl:gall ^- state:sur + =/ s *state-0:sur + =/ l public-relays:nsur + :: =/ l ~['wss://relay.damus.io' 'wss://nos.lol'] + =/ rl %+ turn l |= t=@t [t *relay-stats:nsur] + :: =/ l ~[['wss://relay.damus.io' ~]] + =/ key (gen-keys:nostr eny.bowl) + =/ keyl [key ~] + s(relays (malt rl), keys keyl) + +++ print-relay-stats + |= rm=(map @t relay-stats:nsur) + =/ l ~(tap by rm) + |- ?~ l ~ + =/ [url=@t rs=relay-stats:nsur] i.l + ~& relay=url + ~& connected=connected.rs + ~& sub-count=~(wyt by reqs.rs) + =/ total-received + %+ roll ~(tap by reqs.rs) + |= [[* es=event-stats:nsur] acc=@ud] + %+ add acc received.es + ~& >> total=total-received + $(l t.l) + +:: +++ post-to-event |= [=keys:nsur eny=@ p=post:post] ^- event:nsur + =/ cl (latest-post-content:trill contents.p) + =/ string (crip (content-list-to-md:trill cl)) + =/ ts (to-unix-secs:jikan:sr id.p) + =/ raw=raw-event:nsur [pub.keys ts 1 ~ string] + =/ event-id (hash-event:nostr raw) + =/ signature (sign-event:nostr priv.keys event-id eny) + ~& hash-and-signed=[event-id signature] + =/ =event:nsur :* + event-id + pub.keys + created-at.raw + kind.raw + tags.raw + content.raw + signature + == + event +++ cards +|_ =bowl:gall + ++ shim-binding ^- card:agent:gall + [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] + -- +-- diff --git a/backupdesk/lib/nostrill/mutations.hoon b/backupdesk/lib/nostrill/mutations.hoon new file mode 100644 index 0000000..6a27e4f --- /dev/null +++ b/backupdesk/lib/nostrill/mutations.hoon @@ -0,0 +1,203 @@ +/- sur=nostrill, nsur=nostr, + post=trill-post, gate=trill-gate, feed=trill-feed + +/+ appjs=json-nostrill, + njs=json-nostr, + postlib=trill-post, + shim, + sr=sortug + +|_ [=state:sur =bowl:gall] ++$ card card:agent:gall +++ debug-own-feed + =/ postlist (tap:orm:feed feed.state) + =/ lol + |- ?~ postlist ~ + ~& >> poast=+.i.postlist + $(postlist t.postlist) + ~ +:: TODO not a mutation but fuck it +++ get-poast |= [host=@p id=@] ^- (unit post:post) + =/ poast ?: .=(host our.bowl) + (get:orm:feed feed.state id) + ~ + poast + +:: state +++ add-to-feed |= p=post:post + =. feed.state (put:orm:feed feed.state id.p p) + state +:: events +++ process-events ^- (quip card _state) + :: =/ l events.state + :: =| cards=(list card:agent:gall) + :: |- ?~ l [cards state] + :: =/ n (event-parsing i.l) + :: $(cards -.n, state +.n, l t.l) + :: TODO + `state + +:: ++ parse-events +:: |= evs=(list event:nsur) +:: ^- (quip card _state) +:: =| cards=(list card) +:: =^ cards state +:: |- ?~ evs [cards state] +:: =^ cards state (handle-event i.evs) +:: $(evs t.evs) +:: [cards state] + +++ handle-shim-msg |= [relay=@t msg=relay-msg:nsur] + =/ rs (~(get by relays.state) relay) + ?~ rs `state + =^ cards state + ?- -.msg + %event (handle-event relay sub-id.msg event.msg) + %ok (handle-ok relay +.msg) + %eose =/ creq (~(get by reqs.u.rs) +.msg) + ?~ creq `state + =. reqs.u.rs (~(del by reqs.u.rs) +.msg) + =. relays.state (~(put by relays.state) relay u.rs) + `state + %closed =. reqs.u.rs (~(del by reqs.u.rs) sub-id.msg) + =. relays.state (~(put by relays.state) relay u.rs) + `state + %auth ~& >> auth=+.msg :: TODO handle auth challenges? + `state + %notice ~& >> notice=+.msg :: TODO pass to UI? + `state + %error ~& >>> relay-error=+.msg + =. relays.state (~(del by relays.state) relay) + `state + == + [cards state] + :: =. relays (update-relay-stats:mutat url.u.msg sub-id.u.msg) + :: =^ cards state (handle-event:mutat url.u.msg sub-id.u.msg event.u.msg) + :: :: TODO not just stash events + :: =/ relay (~(get by relays) url.u.msg) + :: =/ nevents=(list event:nsur) ?~ relay [event.u.msg ~] [event.u.msg u.relay] + :: =/ nevents2 (scag 100 nevents) + + :: =. relays (~(put by relays) url.u.msg nevents2) + :: :: TODO respond better + :: =/ response (ebail:rout id.order) + :: =/ ncards (weld cards response) + + :: [ncards this] + :: `state + +++ update-relay-stats + |= [relay=@t sub-id=@t] ^+ relays.state + =/ cur (~(get by relays.state) relay) + =/ curr ?~ cur *relay-stats:nsur u.cur + =? connected.curr ?=(%~ connected.curr) (some now.bowl) + =/ creq (~(get by reqs.curr) sub-id) + ?~ creq relays.state :: bail + =/ nreq u.creq(received +(received.u.creq)) + =. reqs.curr (~(put by reqs.curr) sub-id nreq) + (~(put by relays.state) relay curr) + +++ handle-ok |= [relay=@t event-id=@ux accepted=? msg=@t] + ^- (quip card _state) + :: TODO pass to UI + `state + + +++ handle-event + |= [relay=@t sub-id=@t =event:nsur] + ^- (quip card _state) + |^ + ~& parsing-nostr-event=kind.event +:: https://nostrdata.github.io/kinds/ + ?: .=(kind.event 666) :: one_off subs eose cf. 999 + parse-shim-oneose + ?: .=(kind.event 0) :: user metadata + parse-metadata + ?: .=(kind.event 1) :: apparently a poast + parse-poast + ?: .=(kind.event 3) :: follow list + parse-follow + :: ?: .=(kind.event 5) :: delete + ?: .=(kind.event 6) :: RT + parse-follow + ?: .=(kind.event 7) :: Reaction + parse-follow + + `state + + ++ parse-metadata + ^- (quip card _state) + =/ jstring content.event + =/ ujon (de:json:html jstring) + ?~ ujon ~& failed-parse-metadata=ujon `state + =/ umeta (user-meta:de:njs u.ujon) + ?~ umeta ~& >> failed-dejs-metadata=ujon `state + =. profiles.state (~(put by profiles.state) pubkey.event u.umeta) + `state + + + ++ parse-poast + ^- (quip card _state) + =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event) + =/ uprof (~(get by profiles.state) pubkey.event) + ?~ uprof + =/ shimm ~(. shim [state bowl]) + =^ cards state (get-profiles:shimm (silt ~[pubkey.event])) + [cards state] + + + :: =/ fid (~(get by following.state) pubkey.event) + :: ?~ fid `state :: don't save post if we don't follow the fucker + + :: =/ cl (tokenize:postlib content.event) + + :: =/ ts (from-unix:jikan:sr created-at.event) + :: :: TODO wtf + :: =/ cm=content-map:post (init-content-map:postlib cl ts) + + :: =/ p=post:post :* + :: id=ts + :: host=`@p`pubkey.event + :: author=`@p`pubkey.event + :: thread=ts + :: parent=~ + :: children=~ + :: contents=cm + :: read=*lock:gate + :: write=*lock:gate + :: *engagement:post + :: 0v0 + :: *signature:post + :: tags=~ + :: == + :: =/ nfid (put:orm:feed u.fid ts p) + :: =. following.state (~(put by following.state) pubkey.event nfid) + `state + + + ++ parse-follow + ^- (quip card _state) + =/ following (~(get by follow-graph.state) pubkey.event) + =/ follow-set ?~ following *(set follow:sur) u.following + |- ?~ tags.event `state + =/ t=tag:nsur i.tags.event + :: ?. .=('p' key.t) $(tags.event t.tags.event) + :: =/ pubkeys value.t + :: =/ pubkey (slaw:sr %ux pubkeys) + :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event) + :: =/ relay (snag 0 rest.t) + :: =/ rel ?: .=(relay '') ~ (some relay) + :: =/ nickname (snag 1 rest.t) + :: =/ meta=follow:sur [u.pubkey nickname rel] + :: =. follow-set (~(put in follow-set) meta) + :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set) + $(tags.event t.tags.event) + ++ parse-shim-oneose + ^- (quip card _state) + =/ rs (~(get by relays.state) relay) + ?~ rs `state + =. reqs.u.rs (~(del by reqs.u.rs) sub-id) + =. relays.state (~(put by relays.state) relay u.rs) + `state + -- +-- diff --git a/backupdesk/lib/server.hoon b/backupdesk/lib/server.hoon new file mode 100644 index 0000000..f5cf8f0 --- /dev/null +++ b/backupdesk/lib/server.hoon @@ -0,0 +1,159 @@ +=, eyre +|% ++$ request-line + $: [ext=(unit @ta) site=(list @t)] + args=(list [key=@t value=@t]) + == +:: +parse-request-line: take a cord and parse out a url +:: +++ parse-request-line + |= url=@t + ^- request-line + (fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~]) +:: +++ manx-to-octs + |= man=manx + ^- octs + (as-octt:mimes:html (en-xml:html man)) +:: +++ json-to-octs + |= jon=json + ^- octs + (as-octs:mimes:html (en:json:html jon)) +:: +++ app + |% + :: + :: +require-authorization: + :: redirect to the login page when unauthenticated + :: otherwise call handler on inbound request + :: + ++ require-authorization + |= $: =inbound-request:eyre + handler=$-(inbound-request:eyre simple-payload:http) + == + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + ~! +:*handler + (handler inbound-request) + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + :: +require-authorization-simple: + :: redirect to the login page when unauthenticated + :: otherwise pass through simple-paylod + :: + ++ require-authorization-simple + |= [=inbound-request:eyre =simple-payload:http] + ^- simple-payload:http + :: + ?: authenticated.inbound-request + ~! this + simple-payload + :: + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request.inbound-request + :: + ++ give-simple-payload + |= [eyre-id=@ta =simple-payload:http] + ^- (list card:agent:gall) + =/ header-cage + [%http-response-header !>(response-header.simple-payload)] + =/ data-cage + [%http-response-data !>(data.simple-payload)] + :~ [%give %fact ~[/http-response/[eyre-id]] header-cage] + [%give %fact ~[/http-response/[eyre-id]] data-cage] + [%give %kick ~[/http-response/[eyre-id]] ~] + == + -- +++ gen + |% + :: + ++ max-1-da ['cache-control' 'max-age=86400'] + ++ max-1-wk ['cache-control' 'max-age=604800'] + :: + ++ html-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/html'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ css-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/css'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ js-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'text/javascript'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ png-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/png'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ svg-response + =| cache=? + |= =octs + ^- simple-payload:http + :_ `octs + [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]] + :: + ++ ico-response + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs] + :: + ++ woff2-response + =| cache=? + |= =octs + ^- simple-payload:http + [[200 [['content-type' 'font/woff2'] max-1-wk ~]] `octs] + :: + ++ json-response + =| cache=_| + |= =json + ^- simple-payload:http + :_ `(json-to-octs json) + [200 [['content-type' 'application/json'] ?:(cache [max-1-da ~] ~)]] + :: + ++ manx-response + =| cache=_| + |= man=manx + ^- simple-payload:http + :_ `(manx-to-octs man) + [200 [['content-type' 'text/html'] ?:(cache [max-1-da ~] ~)]] + :: + ++ not-found + ^- simple-payload:http + [[404 ~] ~] + :: + ++ login-redirect + |= =request:http + ^- simple-payload:http + =- [[307 ['location' -]~] ~] + %^ cat 3 + '/~/login?redirect=' + url.request + :: + ++ redirect + |= redirect=cord + ^- simple-payload:http + [[307 ['location' redirect]~] ~] + -- +-- diff --git a/backupdesk/lib/shim.hoon b/backupdesk/lib/shim.hoon new file mode 100644 index 0000000..5cec0b0 --- /dev/null +++ b/backupdesk/lib/shim.hoon @@ -0,0 +1,88 @@ +/- sur=nostrill, nsur=nostr +/+ js=json-nostr, sr=sortug, nlib=nostr +/= web /web/router +|_ [=state:sur =bowl:gall] + ++$ card card:agent:gall +++ parse-msg + |= [eyre-id=@ta req=inbound-request:eyre] + ^- (unit [url=@ relay-msg:nsur]) + ?~ body.request.req ~ + =/ jstring q.u.body.request.req + =/ ures (de:json:html jstring) + ?~ ures ~ + (msg:de:js u.ures) +:: ++ get +:: |% +:: __ +++ get-req |= fs=(list filter:nsur) + ^- [bulk-req:shim:nsur _state] + =/ rls ~(tap by relays.state) + =| urls=(list @t) + =/ sub-id (gen-sub-id:nlib eny.bowl) + =/ =req:shim:nsur [%req sub-id fs] + |- ?~ rls [[urls req] state] + :: build http card + =/ [url=@t rs=relay-stats:nsur] i.rls + :: mutate relays stats + =/ es=event-stats:nsur [fs 0] + =/ nreqs (~(put by reqs.rs) sub-id es) + =/ nrs rs(reqs nreqs) + =. relays.state (~(put by relays.state) url nrs) + $(urls [url urls], rls t.rls) + +++ get-posts + ^- (quip card _state) + =/ kinds (silt ~[1]) + =/ last-week (sub now.bowl ~d7) + :: =/ since (to-unix-secs:jikan:sr last-week) + =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ kinds (silt ~[0]) + =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-engagement + |= post-ids=(set @ux) + ^- (quip card _state) + =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) + =/ =filter:nsur + =/ kinds (silt ~[6 7]) + =/ tags (malt :~([%e post-strings])) + [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + +++ get-quotes + |= post-id=@ux + ^- (quip card _state) + =/ post-string (crip (scow:sr %ux post-id)) + =/ kinds (silt ~[1]) + =/ tags (malt :~([%q (silt ~[post-string])])) + =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + + +++ send + |= req=bulk-req:shim:nsur ^- card:agent:gall + =/ req-body (bulk-req:en:js req) + :: ~& shim-req-json=(en:json:html req-body) + =/ headers :~ + [key='content-type' value='application/json'] + == + =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] + =/ pat /shim + [%pass (weld /ws pat) %arvo %k %fard dap.bowl %fetch %noun !>(request)] +:: +:: +:: + + +-- diff --git a/backupdesk/lib/sortug.hoon b/backupdesk/lib/sortug.hoon new file mode 100644 index 0000000..e1006b1 --- /dev/null +++ b/backupdesk/lib/sortug.hoon @@ -0,0 +1,145 @@ +:: Painstakingly built utility functions by Sortug Development Ltd. +:: There's more where it came from +|% +++ jikan +|% +++ from-unix |= ts=@ ^- @da + (from-unix:chrono:userlib ts) +++ to-unix-ms |= da=@da ^- @ud + (unm:chrono:userlib da) +++ to-unix-secs |= da=@da ^- @ud + (unt:chrono:userlib da) +-- +++ b64 (bass 64 (plus siw:ab)) +++ b16 (bass 16 (plus six:ab)) +++ scow +|= [mod=@tas a=@] ^- tape + ?+ mod "" + %s (signed-scow a) + %ud (a-co:co a) + %ux ((x-co:co 0) a) + %uv ((v-co:co 0) a) + %uw ((w-co:co 0) a) + == +++ signed-scow |= a=@s ^- tape + =/ old (old:si a) + =/ num (scow %ud +.old) + =/ sign=tape ?: -.old "" "-" + "{sign}{num}" +++ slaw + |= [mod=@tas txt=@t] ^- (unit @) + ?+ mod ~ + %ud (rush txt dem) + %ux (rush txt b16) + %uv (rush txt vum:ag) + %uw (rush txt b64) + == +++ csplit |* =rule + (more rule (cook crip (star ;~(less rule next)))) +:: List utils +++ foldi + |* [a=(list) b=* c=_|=(^ +<+)] + =| i=@ud + |- ^+ b + ?~ a b + =/ nb (c i i.a b) + $(a t.a, b nb, i +(i)) +++ parsing + |% + ++ link auri:de-purl:html + ++ para + |% + ++ eof ;~(less next (easy ~)) + ++ white (mask "\09 ") + ++ blank ;~(plug (star white) (just '\0a')) + ++ hard-wrap (cold ' ' ;~(plug blank (star white))) + ++ one-space (cold ' ' (plus white)) + ++ empty + ;~ pose + ;~(plug blank (plus blank)) + ;~(plug (star white) eof) + ;~(plug blank (star white) eof) + == + ++ para + %+ ifix + [(star white) empty] + %- plus + ;~ less + empty + next + == + -- + ++ trim para:para :: from whom/lib/docu + ++ youtube + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'www.youtube.com/watch?v=') + (jest 'youtube.com/watch?v=') + (jest 'youtu.be/') + == + == + ;~ sfix + (star aln) + (star next) + == + == + ++ twatter + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'x.com/') + (jest 'twitter.com/') + == + (star ;~(less fas next)) + (jest '/status/') + == + ;~ sfix + (star nud) + (star next) + == + == + ++ img-set + %- silt + :~ ~.webp + ~.png + ~.jpeg + ~.jpg + ~.svg + == + ++ is-img + |= t=@ta + (~(has in img-set) t) + ++ is-image + |= url=@t ^- ? + =/ u=(unit purl:eyre) (de-purl:html url) + ?~ u .n + =/ ext p.q.u.u + ?~ ext .n + (~(has in img-set) u.ext) + -- +++ string +|% +++ replace + |= [bit=tape bot=tape =tape] + ^- ^tape + |- + =/ off (find bit tape) + ?~ off tape + =/ clr (oust [(need off) (lent bit)] tape) + $(tape :(weld (scag (need off) clr) bot (slag (need off) clr))) + :: +++ split + |= [str=tape delim=tape] + ^- (list tape) + (split-rule str (jest (crip delim))) + ++ split-rule + |* [str=tape delim=rule] + ^- (list tape) + %+ fall + (rust str (more delim (star ;~(less delim next)))) + [str ~] +-- +-- diff --git a/backupdesk/lib/strand.hoon b/backupdesk/lib/strand.hoon new file mode 100644 index 0000000..b0db35b --- /dev/null +++ b/backupdesk/lib/strand.hoon @@ -0,0 +1 @@ +rand diff --git a/backupdesk/lib/strandio.hoon b/backupdesk/lib/strandio.hoon new file mode 100644 index 0000000..48f6e0d --- /dev/null +++ b/backupdesk/lib/strandio.hoon @@ -0,0 +1,965 @@ +/- spider +/+ libstrand=strand +=, strand=strand:libstrand +=, strand-fail=strand-fail:libstrand +|% +++ send-raw-cards + |= cards=(list =card:agent:gall) + =/ m (strand ,~) + ^- form:m + |= strand-input:strand + [cards %done ~] +:: +++ send-raw-card + |= =card:agent:gall + =/ m (strand ,~) + ^- form:m + (send-raw-cards card ~) +:: +++ ignore + |= tin=strand-input:strand + `[%fail %ignore ~] +:: +++ get-bowl + =/ m (strand ,bowl:strand) + ^- form:m + |= tin=strand-input:strand + `[%done bowl.tin] +:: +++ get-beak + =/ m (strand ,beak) + ^- form:m + |= tin=strand-input:strand + `[%done [our q.byk da+now]:bowl.tin] +:: +++ get-time + =/ m (strand ,@da) + ^- form:m + |= tin=strand-input:strand + `[%done now.bowl.tin] +:: +++ get-our + =/ m (strand ,ship) + ^- form:m + |= tin=strand-input:strand + `[%done our.bowl.tin] +:: +++ get-entropy + =/ m (strand ,@uvJ) + ^- form:m + |= tin=strand-input:strand + `[%done eny.bowl.tin] +:: +:: Convert skips to %ignore failures. +:: +:: This tells the main loop to try the next handler. +:: +++ handle + |* a=mold + =/ m (strand ,a) + |= =form:m + ^- form:m + |= tin=strand-input:strand + =/ res (form tin) + =? next.res ?=(%skip -.next.res) + [%fail %ignore ~] + res +:: +:: Wait for a poke with a particular mark +:: +++ take-poke + |= =mark + =/ m (strand ,vase) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %poke @ *] + ?. =(mark p.cage.u.in.tin) + `[%skip ~] + `[%done q.cage.u.in.tin] + == +:: +++ take-sign-arvo + =/ m (strand ,[wire sign-arvo]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %sign *] + `[%done [wire sign-arvo]:u.in.tin] + == +:: +:: Wait for a subscription update on a wire +:: +++ take-fact-prefix + |= =wire + =/ m (strand ,[path cage]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %fact *] + ?. =(watch+wire (scag +((lent wire)) wire.u.in.tin)) + `[%skip ~] + `[%done (slag (lent wire) wire.u.in.tin) cage.sign.u.in.tin] + == +:: +:: Wait for a subscription update on a wire +:: +++ take-fact + |= =wire + =/ m (strand ,cage) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %fact *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + `[%done cage.sign.u.in.tin] + == +:: +:: Wait for a subscription close +:: +++ take-kick + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %kick *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + `[%done ~] + == +:: +++ echo + =/ m (strand ,~) + ^- form:m + %- (main-loop ,~) + :~ |= ~ + ^- form:m + ;< =vase bind:m ((handle ,vase) (take-poke %echo)) + =/ message=tape !<(tape vase) + %- (slog leaf+"{message}..." ~) + ;< ~ bind:m (sleep ~s2) + %- (slog leaf+"{message}.." ~) + (pure:m ~) + :: + |= ~ + ^- form:m + ;< =vase bind:m ((handle ,vase) (take-poke %over)) + %- (slog leaf+"over..." ~) + (pure:m ~) + == +:: +++ take-watch + =/ m (strand ,path) + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %watch *] + `[%done path.u.in.tin] + == +:: +++ take-wake + |= until=(unit @da) + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign [%wait @ ~] %behn %wake *] + ?. |(?=(~ until) =(`u.until (slaw %da i.t.wire.u.in.tin))) + `[%skip ~] + ?~ error.sign-arvo.u.in.tin + `[%done ~] + `[%fail %timer-error u.error.sign-arvo.u.in.tin] + == +:: +++ take-tune + |= =wire + =/ m (strand ,[spar:ames (unit roar:ames)]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %tune ^ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done +>.sign-arvo.u.in.tin] + == +:: +++ take-whey + |= =wire + =/ m (strand ,[spar:ames fragment-size=@ud num-fragments=@ud]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %sage sage=*] + ?. =(wire wire.u.in.tin) + `[%skip ~] + =/ =sage:mess:ames sage.sign-arvo.u.in.tin + :^ ~ %done spar=p.sage + ?~ q.sage + [boq=13 tot=0] + =< [boq tot] + ;;([%whey boq=@ud tot=@ud] q.sage) + == +:: +++ take-sage + |= =wire + =/ m (strand ,sage:mess:ames) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %sage sage=*] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done sage.sign-arvo.u.in.tin] + == +:: +++ take-message + => |% +$ out $% [%sage sage:mess:ames] + [%tune spar:ames (unit roar:ames)] + [%page spar:ames (unit (unit page))] + == + -- + |= =wire + =/ m (strand ,out) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %sage sage=*] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done %sage sage.sign-arvo.u.in.tin] + :: + [~ %sign * %ames %tune ^ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done %tune +>.sign-arvo.u.in.tin] + :: + [~ %sign * %ames %near ^ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done %page +>.sign-arvo.u.in.tin] + == +:: +++ take-near + |= =wire + =/ m (strand ,[spar:ames (unit (unit page))]) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign * %ames %near ^ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done +>.sign-arvo.u.in.tin] + == +:: +++ take-poke-ack + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %poke-ack *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + ?~ p.sign.u.in.tin + `[%done ~] + `[%fail %poke-fail u.p.sign.u.in.tin] + == +:: +++ take-watch-ack + |= =wire + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %agent * %watch-ack *] + ?. =(watch+wire wire.u.in.tin) + `[%skip ~] + ?~ p.sign.u.in.tin + `[%done ~] + `[%fail %watch-ack-fail u.p.sign.u.in.tin] + == +:: +++ poke + |= [=dock =cage] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass /poke %agent dock %poke cage] + ;< ~ bind:m (send-raw-card card) + (take-poke-ack /poke) +:: +++ raw-poke + |= [=dock =cage] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass /poke %agent dock %poke cage] + ;< ~ bind:m (send-raw-card card) + =/ m (strand ,~) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ + `[%wait ~] + :: + [~ %agent * %poke-ack *] + ?. =(/poke wire.u.in.tin) + `[%skip ~] + `[%done ~] + == +:: +++ raw-poke-our + |= [app=term =cage] + =/ m (strand ,~) + ^- form:m + ;< =bowl:spider bind:m get-bowl + (raw-poke [our.bowl app] cage) +:: +++ poke-our + |= [=term =cage] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (poke [our term] cage) +:: +++ watch + |= [=wire =dock =path] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass watch+wire %agent dock %watch path] + ;< ~ bind:m (send-raw-card card) + (take-watch-ack wire) +:: +++ watch-one + |= [=wire =dock =path] + =/ m (strand ,cage) + ^- form:m + ;< ~ bind:m (watch wire dock path) + ;< =cage bind:m (take-fact wire) + ;< ~ bind:m (take-kick wire) + (pure:m cage) +:: +++ watch-our + |= [=wire =term =path] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (watch wire [our term] path) +:: +++ scry + |* [=mold =path] + =/ m (strand ,mold) + ^- form:m + ?> ?=(^ path) + ?> ?=(^ t.path) + ;< =bowl:spider bind:m get-bowl + %- pure:m + .^(mold i.path (scot %p our.bowl) i.t.path (scot %da now.bowl) t.t.path) +:: +++ leave + |= [=wire =dock] + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall [%pass watch+wire %agent dock %leave ~] + (send-raw-card card) +:: +++ leave-our + |= [=wire =term] + =/ m (strand ,~) + ^- form:m + ;< our=@p bind:m get-our + (leave wire [our term]) +:: +++ rewatch + |= [=wire =dock =path] + =/ m (strand ,~) + ;< ~ bind:m ((handle ,~) (take-kick wire)) + ;< ~ bind:m (flog-text "rewatching {<dock>} {<path>}") + ;< ~ bind:m (watch wire dock path) + (pure:m ~) +:: +++ wait + |= until=@da + =/ m (strand ,~) + ^- form:m + ;< ~ bind:m (send-wait until) + (take-wake `until) +:: +++ mass + =/ m (strand ,(list quac:dill)) + ^- form:m + =/ =card:agent:gall [%pass /mass %arvo %d %mass ~] + ;< ~ bind:m (send-raw-card card) + ;< quz=(list quac:dill) bind:m take-meme + (pure:m quz) +:: +++ take-meme + =/ m (strand ,(list quac:dill)) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign [%mass ~] %dill %meme *] + `[%done p.sign-arvo.u.in.tin] + == +:: +++ keen + |= [=wire =spar:ames sec=(unit [@ @])] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %a %keen sec spar) +:: +++ chum + |= [=wire =spar:ames] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %a %chum spar) +:: +++ keen-shut + |= [=wire =spar:ames] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %keen & spar) +:: +++ yawn + |= [=wire =spar:ames] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %a %yawn spar) +:: +++ whey + |= [=wire boq=@ud =spar:ames] + =/ m (strand ,~) + ^- form:m + :: encrypted using %chum namespace + :: + ;< our=@p bind:m get-our + =. path.spar + [%a %x '1' %$ %whey (scot %ud boq) (scot %p our) path.spar] + (chum wire spar) +:: +++ meta + |= [=wire =spar:ames] + =/ m (strand ,~) + ^- form:m + ?+ path.spar !! + $% [%ames bone=@ ?(%clos %cork %next %last %curr) ~] + [%flow bone=@ =dire:ames ~] + [%flow bone=@ =dire:ames ?(%clos %cork %line %lods %next %last) ~] + :: XX rewrite in terms of %whey namespace + :: + [%flow bone=@ =dire:ames %whey boq=@ ~] + [%flow bone=@ =dire:ames seq=@ %naxp ~] + == + :: encrypted using %chum namespace + :: + ;< our=@p bind:m get-our + %- send-raw-card + :* %pass wire %arvo %a %chum + spar(path [%a %x '1' %$ %meta (scot %p our) path.spar]) + == + == +:: +++ sleep + |= for=@dr + =/ m (strand ,~) + ^- form:m + ;< now=@da bind:m get-time + (wait (add now for)) +:: +++ send-wait + |= until=@da + =/ m (strand ,~) + ^- form:m + =/ =card:agent:gall + [%pass /wait/(scot %da until) %arvo %b %wait until] + (send-raw-card card) +:: +++ map-err + |* computation-result=mold + =/ m (strand ,computation-result) + |= [f=$-([term tang] [term tang]) computation=form:m] + ^- form:m + |= tin=strand-input:strand + =* loop $ + =/ c-res (computation tin) + ?: ?=(%cont -.next.c-res) + c-res(self.next ..loop(computation self.next.c-res)) + ?. ?=(%fail -.next.c-res) + c-res + c-res(err.next (f err.next.c-res)) +:: +++ set-timeout + |* computation-result=mold + =/ m (strand ,computation-result) + |= [time=@dr computation=form:m] + ^- form:m + ;< now=@da bind:m get-time + =/ when (add now time) + =/ =card:agent:gall + [%pass /timeout/(scot %da when) %arvo %b %wait when] + ;< ~ bind:m (send-raw-card card) + |= tin=strand-input:strand + =* loop $ + ?: ?& ?=([~ %sign [%timeout @ ~] %behn %wake *] in.tin) + =((scot %da when) i.t.wire.u.in.tin) + == + `[%fail %timeout ~] + =/ c-res (computation tin) + ?: ?=(%cont -.next.c-res) + c-res(self.next ..loop(computation self.next.c-res)) + ?: ?=(%done -.next.c-res) + =/ =card:agent:gall + [%pass /timeout/(scot %da when) %arvo %b %rest when] + c-res(cards [card cards.c-res]) + c-res +:: +++ send-request + |= =request:http + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass /request %arvo %i %request request *outbound-config:iris) +:: +++ send-cancel-request + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass /request %arvo %i %cancel-request ~) +:: +++ take-client-response + =/ m (strand ,client-response:iris) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + :: + [~ %sign [%request ~] %iris %http-response %cancel *] + ::NOTE iris does not (yet?) retry after cancel, so it means failure + :- ~ + :+ %fail + %http-request-cancelled + ['http request was cancelled by the runtime']~ + :: + [~ %sign [%request ~] %iris %http-response %finished *] + `[%done client-response.sign-arvo.u.in.tin] + == +:: +:: Wait until we get an HTTP response or cancelation and unset contract +:: +++ take-maybe-sigh + =/ m (strand ,(unit httr:eyre)) + ^- form:m + ;< rep=(unit client-response:iris) bind:m + take-maybe-response + ?~ rep + (pure:m ~) + :: XX s/b impossible + :: + ?. ?=(%finished -.u.rep) + (pure:m ~) + (pure:m (some (to-httr:iris +.u.rep))) +:: +++ take-maybe-response + =/ m (strand ,(unit client-response:iris)) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign [%request ~] %iris %http-response %cancel *] + `[%done ~] + [~ %sign [%request ~] %iris %http-response %finished *] + `[%done `client-response.sign-arvo.u.in.tin] + == +:: +++ extract-body + |= =client-response:iris + =/ m (strand ,cord) + ^- form:m + ?> ?=(%finished -.client-response) + %- pure:m + ?~ full-file.client-response '' + q.data.u.full-file.client-response +:: +++ fetch-cord + |= url=tape + =/ m (strand ,cord) + ^- form:m + =/ =request:http [%'GET' (crip url) ~ ~] + ;< ~ bind:m (send-request request) + ;< =client-response:iris bind:m take-client-response + (extract-body client-response) +:: +++ fetch-json + |= url=tape + =/ m (strand ,json) + ^- form:m + ;< =cord bind:m (fetch-cord url) + =/ json=(unit json) (de:json:html cord) + ?~ json + (strand-fail %json-parse-error ~) + (pure:m u.json) +:: +++ hiss-request + |= =hiss:eyre + =/ m (strand ,(unit httr:eyre)) + ^- form:m + ;< ~ bind:m (send-request (hiss-to-request:html hiss)) + take-maybe-sigh +:: +:: +build-file: build the source file at the specified $beam +:: +++ build-file + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,(unit vase)) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %a case spur) + ?~ riot + (pure:m ~) + ?> =(%vase p.r.u.riot) + (pure:m (some !<(vase q.r.u.riot))) +:: +++ build-file-hard + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay + bind:m + (warp ship desk ~ %sing %a case spur) + ?> ?=(^ riot) + ?> ?=(%vase p.r.u.riot) + (pure:m !<(vase q.r.u.riot)) +:: +build-mark: build a mark definition to a $dais +:: +++ build-mark + |= [[=ship =desk =case] mak=mark] + =* arg +< + =/ m (strand ,dais:clay) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %b case /[mak]) + ?~ riot + (strand-fail %build-mark >arg< ~) + ?> =(%dais p.r.u.riot) + (pure:m !<(dais:clay q.r.u.riot)) +:: +build-tube: build a mark conversion gate ($tube) +:: +++ build-tube + |= [[=ship =desk =case] =mars:clay] + =* arg +< + =/ m (strand ,tube:clay) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %c case /[a.mars]/[b.mars]) + ?~ riot + (strand-fail %build-tube >arg< ~) + ?> =(%tube p.r.u.riot) + (pure:m !<(tube:clay q.r.u.riot)) +:: +:: +build-nave: build a mark definition to a $nave +:: +++ build-nave + |= [[=ship =desk =case] mak=mark] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %e case /[mak]) + ?~ riot + (strand-fail %build-nave >arg< ~) + ?> =(%nave p.r.u.riot) + (pure:m q.r.u.riot) +:: +build-cast: build a mark conversion gate (static) +:: +++ build-cast + |= [[=ship =desk =case] =mars:clay] + =* arg +< + =/ m (strand ,vase) + ^- form:m + ;< =riot:clay bind:m + (warp ship desk ~ %sing %f case /[a.mars]/[b.mars]) + ?~ riot + (strand-fail %build-cast >arg< ~) + ?> =(%cast p.r.u.riot) + (pure:m q.r.u.riot) +:: +:: Read from Clay +:: +++ warp + |= [=ship =riff:clay] + =/ m (strand ,riot:clay) + ;< ~ bind:m (send-raw-card %pass /warp %arvo %c %warp ship riff) + (take-writ /warp) +:: +++ read-file + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,cage) + ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur) + ?~ riot + (strand-fail %read-file >arg< ~) + (pure:m r.u.riot) +:: +++ check-for-file + |= [[=ship =desk =case] =spur] + =/ m (strand ,?) + ;< =riot:clay bind:m (warp ship desk ~ %sing %u case spur) + ?> ?=(^ riot) + (pure:m !<(? q.r.u.riot)) +:: +++ list-tree + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand ,(list path)) + ;< =riot:clay bind:m (warp ship desk ~ %sing %t case spur) + ?~ riot + (strand-fail %list-tree >arg< ~) + (pure:m !<((list path) q.r.u.riot)) +:: +++ list-desk + |= [[=ship =desk =case] =spur] + =* arg +< + =/ m (strand arch) + ;< =riot:clay bind:m (warp ship desk ~ %sing %y case spur) + ?~ riot + (strand-fail %list-desk >arg< ~) + (pure:m !<(arch q.r.u.riot)) +:: Take Clay read result +:: +++ take-writ + |= =wire + =/ m (strand ,riot:clay) + ^- form:m + |= tin=strand-input:strand + ?+ in.tin `[%skip ~] + ~ `[%wait ~] + [~ %sign * ?(%behn %clay) %writ *] + ?. =(wire wire.u.in.tin) + `[%skip ~] + `[%done +>.sign-arvo.u.in.tin] + == +:: +check-online: require that peer respond before timeout +:: +++ check-online + |= [who=ship lag=@dr] + =/ m (strand ,~) + ^- form:m + %+ (map-err ,~) |=(* [%offline *tang]) + %+ (set-timeout ,~) lag + ;< ~ bind:m + (poke [who %hood] %helm-hi !>(~)) + (pure:m ~) +:: +++ eval-hoon + |= [gen=hoon bez=(list beam)] + =/ m (strand ,vase) + ^- form:m + =/ sut=vase !>(..zuse) + |- + ?~ bez + (pure:m (slap sut gen)) + ;< vax=vase bind:m (build-file-hard i.bez) + $(bez t.bez, sut (slop vax sut)) +:: +++ send-thread + |= [=bear:khan =shed:khan =wire] + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass wire %arvo %k %lard bear shed) +:: +:: Queue on skip, try next on fail %ignore +:: +++ main-loop + |* a=mold + =/ m (strand ,~) + =/ m-a (strand ,a) + =| queue=(qeu (unit input:strand)) + =| active=(unit [in=(unit input:strand) =form:m-a forms=(list $-(a form:m-a))]) + =| state=a + |= forms=(lest $-(a form:m-a)) + ^- form:m + |= tin=strand-input:strand + =* top `form:m`..$ + =. queue (~(put to queue) in.tin) + |^ (continue bowl.tin) + :: + ++ continue + |= =bowl:strand + ^- output:m + ?> =(~ active) + ?: =(~ queue) + `[%cont top] + =^ in=(unit input:strand) queue ~(get to queue) + ^- output:m + =. active `[in (i.forms state) t.forms] + ^- output:m + (run bowl in) + :: + ++ run + ^- form:m + |= tin=strand-input:strand + ^- output:m + ?> ?=(^ active) + =/ res (form.u.active tin) + =/ =output:m + ?- -.next.res + %wait `[%wait ~] + %skip `[%cont ..$(queue (~(put to queue) in.tin))] + %cont `[%cont ..$(active `[in.u.active self.next.res forms.u.active])] + %done (continue(active ~, state value.next.res) bowl.tin) + %fail + ?: &(?=(^ forms.u.active) ?=(%ignore p.err.next.res)) + %= $ + active `[in.u.active (i.forms.u.active state) t.forms.u.active] + in.tin in.u.active + == + `[%fail err.next.res] + == + [(weld cards.res cards.output) next.output] + -- +:: +++ retry + |* result=mold + |= [crash-after=(unit @ud) computation=_*form:(strand (unit result))] + =/ m (strand ,result) + =| try=@ud + |- ^- form:m + =* loop $ + ?: =(crash-after `try) + (strand-fail %retry-too-many ~) + ;< ~ bind:m (backoff try ~m1) + ;< res=(unit result) bind:m computation + ?^ res + (pure:m u.res) + loop(try +(try)) +:: +++ backoff + |= [try=@ud limit=@dr] + =/ m (strand ,~) + ^- form:m + ;< eny=@uvJ bind:m get-entropy + %- sleep + %+ min limit + ?: =(0 try) ~s0 + %+ add + (mul ~s1 (bex (dec try))) + (mul ~s0..0001 (~(rad og eny) 1.000)) +:: +:: ---- +:: +:: Output +:: +++ flog + |= =flog:dill + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass / %arvo %d %flog flog) +:: +++ flog-text + |= =tape + =/ m (strand ,~) + ^- form:m + (flog %text tape) +:: +++ flog-tang + |= =tang + =/ m (strand ,~) + ^- form:m + =/ =wall + (zing (turn (flop tang) (cury wash [0 80]))) + |- ^- form:m + =* loop $ + ?~ wall + (pure:m ~) + ;< ~ bind:m (flog-text i.wall) + loop(wall t.wall) +:: +++ trace + |= =tang + =/ m (strand ,~) + ^- form:m + (pure:m ((slog tang) ~)) +:: +++ app-message + |= [app=term =cord =tang] + =/ m (strand ,~) + ^- form:m + =/ msg=tape :(weld (trip app) ": " (trip cord)) + ;< ~ bind:m (flog-text msg) + (flog-tang tang) +:: +:: ---- +:: +:: Handle domains +:: +++ install-domain + |= =turf + =/ m (strand ,~) + ^- form:m + (send-raw-card %pass / %arvo %e %rule %turf %put turf) +:: +:: ---- +:: +:: Threads +:: +++ start-thread + |= file=term + =/ m (strand ,tid:spider) + ;< =bowl:spider bind:m get-bowl + (start-thread-with-args byk.bowl file *vase) +:: +++ start-thread-with-args + |= [=beak file=term args=vase] + =/ m (strand ,tid:spider) + ^- form:m + ;< =bowl:spider bind:m get-bowl + =/ tid + (scot %ta (cat 3 (cat 3 'strand_' file) (scot %uv (sham file eny.bowl)))) + =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid beak file args]) + ;< ~ bind:m (poke-our %spider %spider-start poke-vase) + ;< ~ bind:m (sleep ~s0) :: wait for thread to start + (pure:m tid) +:: ++$ thread-result + (each vase [term tang]) +:: +++ await-thread + |= [file=term args=vase] + =/ m (strand ,thread-result) + ^- form:m + ;< =bowl:spider bind:m get-bowl + =/ tid (scot %ta (cat 3 'strand_' (scot %uv (sham file eny.bowl)))) + =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid byk.bowl file args]) + ;< ~ bind:m (watch-our /awaiting/[tid] %spider /thread-result/[tid]) + ;< ~ bind:m (poke-our %spider %spider-start poke-vase) + ;< ~ bind:m (sleep ~s0) :: wait for thread to start + ;< =cage bind:m (take-fact /awaiting/[tid]) + ;< ~ bind:m (take-kick /awaiting/[tid]) + ?+ p.cage ~|([%strange-thread-result p.cage file tid] !!) + %thread-done (pure:m %& q.cage) + %thread-fail (pure:m %| !<([term tang] q.cage)) + == +-- diff --git a/backupdesk/lib/trill/post.hoon b/backupdesk/lib/trill/post.hoon new file mode 100644 index 0000000..5bed037 --- /dev/null +++ b/backupdesk/lib/trill/post.hoon @@ -0,0 +1,377 @@ +/- tp=trill-post, md=markdown +/+ sr=sortug, mdlib=markdown +|% +++ build-sp + |= [host=@p author=@p input=@t] + ^- sent-post:tp + =/ cl (tokenise input) + ~| "parsing error!!" + ?: ?=(%| -.cl) !! + =| sp=sent-post:tp + %= sp + host host + author author + contents +.cl + == +++ build-post + |= [now=@da pubkey=@ux sp=sent-post:tp] + ^- post:tp + =/ cm (init-content-map contents.sp now) + =/ thread ?~ thread.sp now u.thread.sp + =/ =post:tp + :* id=now + host.sp + author.sp + thread + parent.sp + ~ + cm + read.sp + write.sp + *engagement:tp + `@uvH`pubkey + *signature:tp + ~ + == + post +:: new! using wispem's lib +++ tokenise +|= t=@t ^- (each content-list:tp @t) + =/ parsed (rush t markdown:de:md:mdlib) + ?~ parsed [%| 'parsing error'] + :- %& + %+ turn u.parsed de-node +++ de-node |= =node:markdown:md ^- block:tp + ?~ node [%paragraph ~] + ?- -.node + %leaf (de-leaf +.node) + %container (de-cont +.node) + == + +++ de-leaf |= =node:leaf:markdown:md ^- block:tp + ?~ node [%paragraph ~] + ?- -.node + %heading (de-heading node) + %break [%paragraph :~([%break ~])] + %indent-codeblock [%codeblock text.node ''] + %fenced-codeblock [%codeblock text.node info-string.node] + %html [%codeblock text.node 'html'] + %link-ref-definition [%paragraph :~([%link '' label.node])] + %paragraph [%paragraph (de-inline contents.node)] + %blank-line [%paragraph :~([%break ~])] + %table [%paragraph :~([%break ~])] :: TODO + == +++ de-heading |= h=heading:leaf:markdown:md + :+ %heading (flatten-inline contents.h) + ?: .=(1 level.h) %h1 + ?: .=(2 level.h) %h2 + ?: .=(3 level.h) %h3 + ?: .=(4 level.h) %h4 + ?: .=(5 level.h) %h5 %h6 +++ de-inline |= inls=contents:inline:md + =| res=(list inline:tp) + |- ?~ inls (flop res) + =/ inl i.inls + =/ r=inline:tp ?- -.inl + %escape [%codespan char.inl] + %entity [%codespan code.inl] + %code-span [%codespan text.inl] + %line-break [%break ~] + %soft-line-break [%break ~] + %text [%text text.inl] + %emphasis (de-strong +.inl) + %strong (de-strong +.inl) + %link [%link (de-target target.inl) (flatten-inline contents.inl)] + %image [%link (de-target target.inl) (de-target target.inl)] + :: %image [%img (de-target target.inl) alt-text.inl] + %autolink [%text ''] + %html [%codespan text.inl] + == + $(inls t.inls, res [r res]) +++ de-strong |= [char=@t inls=contents:inline:md] +?: .=('_' char) [%italic (flatten-inline inls)] + [%bold (flatten-inline inls)] +++ de-target |= tar=target:ln:md +:: TODO lotsa stuff here + ?- -.tar + %direct text.url.urlt.tar + %ref label.tar + == +++ flatten-inline |= inls=contents:inline:md ^- @t + =/ res "" + |- ?~ inls (crip res) + =/ inl i.inls + =/ r ?+ -.inl "" + %escape (trip char.inl) + %entity (trip code.inl) + %code-span (trip text.inl) + %text (trip text.inl) + %emphasis (trip (flatten-inline contents.inl)) + %strong (trip (flatten-inline contents.inl)) + %link (trip (flatten-inline contents.inl)) + %image (trip (de-target target.inl)) + %html (trip text.inl) + == + $(inls t.inls, res "{res} {r}") +++ de-cont |= =node:container:markdown:md ^- block:tp + ?~ node [%paragraph ~] + ?- -.node + %block-quote [%blockquote (denest +.node)] + %ol [%list (de-list contents.node) .y] + %ul [%list (de-list contents.node) .n] + %tl [%paragraph ~] + == +++ de-list |= lmd=(list markdown:md) ^- (list inline:tp) +:: TODO +~ + :: =| res=(list li:tp) + :: |- ?~ lmd (flop res) + :: =/ nodelist i.lmd + :: =/ blocks=(list block:tp) + :: %+ turn nodelist de-node + :: $(lmd t.lmd, res [blocks res]) + +++ denest |= mde=markdown:md ^- paragraph:tp + =| res=paragraph:tp + |- ?~ mde (flop res) + =/ block (de-node i.mde) + =/ r=paragraph:tp (break-block block) + =/ nr (weld res r) + $(mde t.mde, res nr) + +++ break-block |= =block:tp ^- paragraph:tp +?+ -.block ~ + %paragraph p.block + %blockquote p.block + %heading :~([%text p.block]) + %codeblock :~([%text code.block]) + %eval :~([%text hoon.block]) + :: %list (break-list p.block) +== +++ break-list |= lis=(list li:tp) ^- paragraph:tp + =| res=paragraph:tp + |- ?~ lis (flop res) + =/ par (ibreak-list i.lis) + =/ nr (weld res par) + $(lis t.lis, res nr) +++ ibreak-list |= blocks=(list block:tp) ^- paragraph:tp + =| res=paragraph:tp + |- ?~ blocks (flop res) + =/ par (break-block i.blocks) + =/ nr (weld res par) + $(blocks t.blocks, res nr) + +:: tape -> post:trill, parsing user input from Sail ++$ heading $?(%h1 %h2 %h3 %h4 %h5 %h6) + +++ parse :: Markdown parser. Actually udon parser but it'll do + |= s=tape ^- (unit marl:hoot) :: finally + :: Annoying it requires a line break but then parses it as a space wtf + =, vast + (rust s cram:(sail .y)) +++ tokenize +|= s=@t ^- content-list:tp + =/ t (weld (trip s) "\0a") + =/ parsed (parse t) + :: =/ parsed2 (parse:md t) + :: ~& > diary-parser=parsed2 + :: \0a can't be followed by a space. ever. those are the rules + ?~ parsed ~& error-parsing-markdown=t ~ + (marl-to-cl u.parsed) +++ marl-to-cl +|= =marl:hoot ^- content-list:tp + %- flop + %+ roll marl + |= [=tuna:hoot acc=content-list:tp] + :: man this is an annoying type if I ever saw one + ?@ -.tuna acc + =/ blk (manx-to-block tuna) + ?~ blk acc :_ acc u.blk +++ manx-to-block + |= =manx:hoot ^- (unit block:tp) + ?+ n.g.manx ~ + :: TODO + :: heading %- some [%heading (phead n.g.manx c.manx)] + %p %- some [%paragraph (inline-list c.manx)] + %blockquote %- some [%blockquote (inline-list c.manx)] + %pre %- some [%codeblock (pre c.manx)] + %hr %- some [%paragraph ~[[%break ~]]] + %ul %- some [%list (inline-list c.manx) .n] + %ol %- some [%list (inline-list c.manx) .y] + :: %table %- some (table-rows c.manx) + == +:: ++ list-items +:: |= =marl:hoot ^- (list li:tp) +:: %- flop +:: %+ roll marl |= [=tuna:hoot acc=(list li:tp)] +:: ?@ -.tuna acc +:: ?. ?=(%li n.g.tuna) acc :_ acc (marl-to-cl c.tuna) +:: ++ phead +:: |= [h=heading c=marl:hoot] ^- [p=cord q=heading] +:: :- (get-tag-text c) h +++ inline-list + |= c=marl:hoot ^- (list inline:tp) + %- flop + %+ roll c + |= [=tuna:hoot acc=(list inline:tp)] + ?@ -.tuna acc :_ acc (inline tuna) + ++ inline + |= =manx:hoot ^- inline:tp + ?: ?=(%$ n.g.manx) [%text (get-attrs-text a.g.manx)] + =/ text=@t (get-tag-text c.manx) + ?+ n.g.manx [%text text] + %i [%italic text] + %b [%bold text] + %code [%codespan text] + %br [%break ~] + %a :+ %link (get-attrs-text a.g.manx) (get-tag-text c.manx) + %img :+ %link (get-attr-text a.g.manx %src) (get-attr-text a.g.manx %alt) + == +:: +++ reduce-block +|= c=marl:hoot ^- @t + %+ roll c + |= [=tuna:hoot acc=@t] + ?@ -.tuna acc + ?+ n.g.tuna acc + %p (get-tag-text c.tuna) + == +++ get-attr-text +|= [a=mart:hoot attr=@tas] ^- @t + %- crip %- flop + %+ roll a + |= [[n=mane v=(list beer:hoot)] acc=tape] + ?. .=(attr n) acc + %+ roll v + |= [b=beer:hoot acc=tape] + ?^ b acc [b acc] +++ get-attrs-text :: this assumes we don't care about which attr, which we usually don't +|= a=mart:hoot ^- @t + :: ?: (gte (lent a) 1) + %- crip %- flop + %+ roll a + |= [[n=mane v=(list beer:hoot)] acc=tape] + %+ roll v + |= [b=beer:hoot acc=tape] + ?^ b acc [b acc] +++ get-tag-text +|= c=marl:hoot ^- @t +:: there's only really one child in these things + %+ roll c + |= [=tuna:hoot acc=@t] + ?@ -.tuna acc + %- crip + %- flop + %+ roll a.g.tuna + |= [[n=mane v=(list beer:hoot)] acc=tape] + %+ roll v + |= [b=beer:hoot acc=tape] + ?^ b acc [b acc] + +++ pre + |= c=marl:hoot ^- [cord cord] + :_ '' :: lang not supported, duh + %+ roll c + |= [=tuna:hoot acc=@t] + ?@ -.tuna acc + (get-attrs-text a.g.tuna) + +++ parse-tags +|= t=@t ^- (unit (set @t)) + =/ lst (rush t (csplit:sr com)) + ?~ lst ~ (some (sy u.lst)) +:: post:trill -> (markdown) tape for display on sail +++ block-to-md +|= b=block:tp ^- tape + ?+ -.b "" +%paragraph + %^ foldi:sr p.b "" |= [in=@ud i=inline:tp acc=tape] + =/ il (inline-to-tape i) + ?: .=(+(in) (lent p.b)) + "{acc}{il}" + "{acc}{il} " +%blockquote + %+ weld "> " + %^ foldi:sr p.b "" |= [in=@ud i=inline:tp acc=tape] + =/ il (inline-to-tape i) + ?: .=(+(in) (lent p.b)) + "{acc}{il}" + "{acc}{il} " +%list + %^ foldi:sr p.b "" |= [in=@ud i=inline:tp acc=tape] + =/ li-tape (inline-to-tape i) + =/ line ?: ordered.b + "{<+(in)>}. {li-tape}" + "- {li-tape}" + ?: .=(+(in) (lent p.b)) + "{acc}{line}" + "{acc}{line}\0a" +%media + ?+ -.media.b "})" + :: TODO +%images + :: %^ foldi:sr p.media.b "" |= [i=@ud [url=@t caption=@t] acc=tape] + :: =/ line "})" + :: ?: .=(+(i) (lent p.media.b)) + :: "{acc}{line}" + :: "{acc}{line}\0a" + "" + == +%codeblock + """ + ``` + {(trip code.b)} + ``` + """ +%heading =/ dashes=tape ?- q.b + %h1 "# " + %h2 "## " + %h3 "### " + %h4 "#### " + %h5 "##### " + %h6 "###### " + == "{dashes}{(trip p.b)}" +:: %tasklist "" ::TODO + :: + :: %table acc + :: %eval acc + :: %ref acc + :: %json acc + == +++ latest-post-content +|= cm=content-map:tp ^- content-list:tp + =/ last (pry:corm:tp cm) + ?~ last ~ + +.u.last + +++ content-list-to-md +|= =content-list:tp ^- tape + %^ foldi:sr content-list "" |= [i=@ud b=block:tp acc=tape] + =/ block-tape (block-to-md b) + ?: .=(+(i) (lent content-list)) + "{acc}{block-tape}" + "{acc}{block-tape}\0a\0a" +++ inline-to-tape +|= i=inline:tp ^- tape + ?+ -.i "" + %text (trip p.i) + %italic "_{(trip p.i)}_" + %bold "*{(trip p.i)}*" + %strike "~~{(trip p.i)}~~" + %ship (scow %p p.i) + %codespan "`{(trip p.i)}`" + %link "[{(trip show.i)}]({(trip href.i)})" + :: %img "})" + %break "\0a" + == +++ tags-to-tape +|= t=(set @t) ^- tape + %^ foldi:sr ~(tap in t) "" |= [i=@ud c=@t acc=tape] + ?: .=(+(i) ~(wyt in t)) + "{acc}{(trip c)}" + "{acc}{(trip c)}," + +++ init-content-map |= [cl=content-list:tp date=@da] ^- content-map:tp + (put:corm:tp *content-map:tp date cl) + +-- diff --git a/backupdesk/mar/bill.hoon b/backupdesk/mar/bill.hoon new file mode 100644 index 0000000..76cef34 --- /dev/null +++ b/backupdesk/mar/bill.hoon @@ -0,0 +1,34 @@ +|_ bil=(list dude:gall) +++ grow + |% + ++ mime `^mime`[/text/x-bill (as-octs:mimes:html hoon)] + ++ noun bil + ++ hoon + ^- @t + |^ (crip (of-wall:format (wrap-lines (spit-duz bil)))) + :: + ++ wrap-lines + |= taz=wall + ^- wall + ?~ taz ["~"]~ + :- (weld ":~ " i.taz) + %- snoc :_ "==" + (turn t.taz |=(t=tape (weld " " t))) + :: + ++ spit-duz + |= duz=(list dude:gall) + ^- wall + (turn duz |=(=dude:gall ['%' (trip dude)])) + -- + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun (list dude:gall) + ++ mime + |= [=mite len=@ud tex=@] + ~_ tex + !<((list dude:gall) (slap !>(~) (ream tex))) + -- +++ grad %noun +-- diff --git a/backupdesk/mar/css.hoon b/backupdesk/mar/css.hoon new file mode 100644 index 0000000..1a87081 --- /dev/null +++ b/backupdesk/mar/css.hoon @@ -0,0 +1,25 @@ +:: +:::: /hoon/css/mar + :: +/? 310 +=, eyre +=, mimes:html +|_ mud=@t +++ grow :: convert to + |% + ++ mime [/text/css (as-octs mud)] :: convert to %mime + ++ hymn :: convert to %hymn + |^ html + ++ style ;style + ;- (trip mud) + == + ++ html ;html:(head:"{style}" body) + -- + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (@t q.q)) + ++ noun @t :: clam from %noun + -- +++ grad %mime +-- diff --git a/backupdesk/mar/docket-0.hoon b/backupdesk/mar/docket-0.hoon new file mode 100644 index 0000000..c3b253b --- /dev/null +++ b/backupdesk/mar/docket-0.hoon @@ -0,0 +1,25 @@ +/+ dock=docket +|_ =docket:dock +++ grow + |% + ++ mime + ^- ^mime + [/text/x-docket (as-octt:mimes:html (spit-docket:mime:dock docket))] + ++ noun docket + ++ json (docket:enjs:dock docket) + -- +++ grab + |% + :: + ++ mime + |= [=mite len=@ud tex=@] + ^- docket:dock + %- need + %- from-clauses:mime:dock + !<((list clause:dock) (slap !>(~) (ream tex))) + + :: + ++ noun docket:dock + -- +++ grad %noun +-- diff --git a/backupdesk/mar/hoon.hoon b/backupdesk/mar/hoon.hoon new file mode 100644 index 0000000..428e105 --- /dev/null +++ b/backupdesk/mar/hoon.hoon @@ -0,0 +1,36 @@ +:::: /hoon/hoon/mar + :: +/? 310 +:: +=, eyre +|_ own=@t +:: +++ grow :: convert to + |% + ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime + ++ hymn + ;html + ;head + ;title:"Source" + ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js"; + ;script@"/lib/syntax/hoon.js"; + ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/". + "codemirror/4.3.0/codemirror.min.css"); + ;link/"/lib/syntax/codemirror.css"(rel "stylesheet"); + == + ;body + ;textarea#src:"{(trip own)}" + ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})' + == + == + ++ txt + (to-wain:format own) + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] q.q) + ++ noun @t :: clam from %noun + ++ txt of-wain:format + -- +++ grad %txt +-- diff --git a/backupdesk/mar/ico.hoon b/backupdesk/mar/ico.hoon new file mode 100644 index 0000000..e862b9b --- /dev/null +++ b/backupdesk/mar/ico.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/x-icon (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/backupdesk/mar/js.hoon b/backupdesk/mar/js.hoon new file mode 100644 index 0000000..fe010d9 --- /dev/null +++ b/backupdesk/mar/js.hoon @@ -0,0 +1,25 @@ +:: +:::: /hoon/js/mar + :: +/? 310 +:: +=, eyre +|_ mud=@ +++ grow + |% + ++ mime [/application/javascript (as-octs:mimes:html (@t mud))] + ++ hymn :: convert to %hymn + |^ html + ++ script ;script + ;- (trip (@t mud)) + == + ++ html ;html:(head:"{script}" body) + -- + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (@t q.q)) + ++ noun cord :: clam from %noun + -- +++ grad %mime +-- diff --git a/backupdesk/mar/kelvin.hoon b/backupdesk/mar/kelvin.hoon new file mode 100644 index 0000000..7f1b409 --- /dev/null +++ b/backupdesk/mar/kelvin.hoon @@ -0,0 +1,28 @@ +|_ kal=waft:clay +++ grow + |% + ++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)] + ++ noun kal + ++ hoon + %+ rap 3 + %+ turn + %+ sort + ~(tap in (waft-to-wefts:clay kal)) + |= [a=weft b=weft] + ?: =(lal.a lal.b) + (gte num.a num.b) + (gte lal.a lal.b) + |= =weft + (rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~) + :: + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun waft:clay + ++ mime + |= [=mite len=@ud tex=@] + (cord-to-waft:clay tex) + -- +++ grad %noun +-- diff --git a/backupdesk/mar/mime.hoon b/backupdesk/mar/mime.hoon new file mode 100644 index 0000000..83b4dae --- /dev/null +++ b/backupdesk/mar/mime.hoon @@ -0,0 +1,32 @@ +:: +:::: /hoon/mime/mar + :: +/? 310 +:: +|_ own=mime +++ grow + ^? + |% + ++ jam `@`q.q.own + -- +:: +++ grab :: convert from + ^? + |% + ++ noun mime :: clam from %noun + ++ tape + |=(a=_"" [/application/x-urb-unknown (as-octt:mimes:html a)]) + -- +++ grad + ^? + |% + ++ form %mime + ++ diff |=(mime +<) + ++ pact |=(mime +<) + ++ join |=([mime mime] `(unit mime)`~) + ++ mash + |= [[ship desk mime] [ship desk mime]] + ^- mime + ~|(%mime-mash !!) + -- +-- diff --git a/backupdesk/mar/noun.hoon b/backupdesk/mar/noun.hoon new file mode 100644 index 0000000..ff5443e --- /dev/null +++ b/backupdesk/mar/noun.hoon @@ -0,0 +1,22 @@ +:: +:::: /hoon/noun/mar + :: +/? 310 +!: +:::: A minimal noun mark +|_ non=* +++ grab |% + ++ noun * + -- +++ grow |% + ++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))] + -- +++ grad + |% + ++ form %noun + ++ diff |=(* +<) + ++ pact |=(* +<) + ++ join |=([* *] *(unit *)) + ++ mash |=([[ship desk *] [ship desk *]] `*`~|(%noun-mash !!)) + -- +-- diff --git a/backupdesk/mar/png.hoon b/backupdesk/mar/png.hoon new file mode 100644 index 0000000..6a60a6a --- /dev/null +++ b/backupdesk/mar/png.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/png (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/backupdesk/mar/ship.hoon b/backupdesk/mar/ship.hoon new file mode 100644 index 0000000..176bcad --- /dev/null +++ b/backupdesk/mar/ship.hoon @@ -0,0 +1,20 @@ +|_ s=ship +++ grad %noun +++ grow + |% + ++ noun s + ++ json s+(scot %p s) + ++ mime + ^- ^mime + [/text/x-ship (as-octt:mimes:html (scow %p s))] + + -- +++ grab + |% + ++ noun ship + ++ json (su:dejs:format ;~(pfix sig fed:ag)) + ++ mime + |= [=mite len=@ tex=@] + (slav %p (snag 0 (to-wain:format tex))) + -- +-- diff --git a/backupdesk/mar/svg.hoon b/backupdesk/mar/svg.hoon new file mode 100644 index 0000000..2911e49 --- /dev/null +++ b/backupdesk/mar/svg.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/'svg+xml' (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/backupdesk/mar/webmanifest.hoon b/backupdesk/mar/webmanifest.hoon new file mode 100644 index 0000000..6a60a6a --- /dev/null +++ b/backupdesk/mar/webmanifest.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/png (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/backupdesk/sur/docket.hoon b/backupdesk/sur/docket.hoon new file mode 100644 index 0000000..091c8c9 --- /dev/null +++ b/backupdesk/sur/docket.hoon @@ -0,0 +1,82 @@ +|% +:: ++$ version + [major=@ud minor=@ud patch=@ud] +:: ++$ glob (map path mime) +:: ++$ url cord +:: $glob-location: How to retrieve a glob +:: ++$ glob-reference + [hash=@uvH location=glob-location] +:: ++$ glob-location + $% [%http =url] + [%ames =ship] + == +:: $href: Where a tile links to +:: ++$ href + $% [%glob base=term =glob-reference] + [%site =path] + == +:: $chad: State of a docket +:: ++$ chad + $~ [%install ~] + $% :: Done + [%glob =glob] + [%site ~] + :: Waiting + [%install ~] + [%suspend glob=(unit glob)] + :: Error + [%hung err=cord] + == +:: +:: $charge: A realized $docket +:: ++$ charge + $: =docket + =chad + == +:: +:: $clause: A key and value, as part of a docket +:: +:: Only used to parse $docket +:: ++$ clause + $% [%title title=@t] + [%info info=@t] + [%color color=@ux] + [%glob-http url=cord hash=@uvH] + [%glob-ames =ship hash=@uvH] + [%image =url] + [%site =path] + [%base base=term] + [%version =version] + [%website website=url] + [%license license=cord] + == +:: +:: $docket: A description of JS bundles for a desk +:: ++$ docket + $: %1 + title=@t + info=@t + color=@ux + =href + image=(unit url) + =version + website=url + license=cord + == +:: ++$ charge-update + $% [%initial initial=(map desk charge)] + [%add-charge =desk =charge] + [%del-charge =desk] + == +-- diff --git a/backupdesk/sur/markdown.hoon b/backupdesk/sur/markdown.hoon new file mode 100644 index 0000000..baf266e --- /dev/null +++ b/backupdesk/sur/markdown.hoon @@ -0,0 +1,157 @@ +=> |% + ++ ln + |% + :: + :: Url: optionally enclosed in triangle brackets + :: A link destination consists of either + :: - a sequence of zero or more characters between an opening < and a closing > that + :: contains no line breaks or unescaped < or > characters, or + :: - a nonempty sequence of characters that does not start with <, does not include + :: ASCII space or control characters, and includes parentheses only if (a) they are + :: backslash-escaped or (b) they are part of a balanced pair of unescaped parentheses. + :: (Implementations may impose limits on parentheses nesting to avoid performance + :: issues, but at least three levels of nesting should be supported.) + +$ url [text=@t has-triangle-brackets=?] + :: + :: Url with optional title-text + +$ urlt [=url title-text=(unit @t)] + :: + :: Link target: the part of a link after the display text. can be direct or reference + :: A reference link is in square brackets, and refers to a named link elsewhere. + :: - full => [Display][foo] + :: - collapsed => [Display][] + :: - shortcut => [Display] + :: Collapsed and shortcut links have a `label` equal to the display text. + +$ target $% [%direct =urlt] + [%ref type=?(%full %collapsed %shortcut) label=@t] + == + -- + -- +:: +|% + :: + :: Markdown document or fragment: a list of nodes + ++ markdown =< $+ markdown + (list node) + |% + +$ node $+ markdown-node + $@ ~ :: `$@ ~` is magic that makes recursive structures work + $% [%leaf node:leaf] + [%container node:container] + == + -- + :: + ++ inline + |% + :: A single inline element + ++ element $+ inline-element + $@ ~ + $%(escape entity code hardbrk softbrk text emphasis strong link image autolink html) + :: + :: Any amount of elements + ++ contents (list element) + :: + :: ----------------------- + :: List of inline elements + :: ----------------------- + :: + :: Backslash-escaped character + +$ escape [%escape char=@t] + :: + :: HTML-entity + +$ entity [%entity code=@t] + :: + :: Code span (inline code). Interpreted literally, cannot have nested elements. + :: Can be enclosed by any amount of backticks on each side, >= 1. Must be balanced. + +$ code [%code-span num-backticks=@ text=@t] + :: + :: Line break + +$ hardbrk [%line-break ~] + :: + :: Soft line break: a newline in the source code, will be rendered as a single space + +$ softbrk [%soft-line-break ~] + :: + :: Text: Just text + +$ text [%text text=@t] + :: + :: Emphasis and strong emphasis + :: Can use either tar "*" or cab "_" as the emphasis character. + :: Can have nested inline elements. + +$ emphasis [%emphasis emphasis-char=@t =contents] + +$ strong [%strong emphasis-char=@t =contents] + :: + :: Link + +$ link [%link =contents =target:ln] + :: + :: Images + +$ image [%image alt-text=@t =target:ln] + :: + :: Autolink: a link that's just itself, surrounded by "<...>" + +$ autolink [%autolink text=@t] + :: + :: HTML + +$ html [%html text=@t] + -- + :: + :: Leaf nodes: non-nested (i.e., terminal) nodes + ++ leaf + |% + ++ node $+ leaf-node + $@ ~ + $%(heading break codeblk-indent codeblk-fenced html link-ref-def table paragraph blank-line) + :: + :: Heading, either setext or ATX style + +$ heading [%heading style=?(%setext %atx) level=@ =contents:inline] + :: + :: Thematic break (horizontal line) + :: Consists of at least 3 repetitions of either hep '-', cab '_', or tar '*' + +$ break [%break char=@t char-count=@] + :: + :: Indentation-based code block: indented 4 spaces. Can include newlines and blank lines. + +$ codeblk-indent [%indent-codeblock text=@t] + :: + :: Fenced code block: begins and ends with 3+ repetitions of tic (`) or sig (~). + :: Can be indented up to 3 spaces. + +$ codeblk-fenced [%fenced-codeblock char=@t char-count=@ info-string=@t indent-level=@ text=@t] + :: + :: HTML + +$ html [%html text=@t] + :: + :: Link reference definition (defines a named link which can be referenced elsewhere) + +$ link-ref-def [%link-ref-definition label=@t =urlt:ln] + :: + :: Paragraph + +$ paragraph [%paragraph =contents:inline] + :: + :: Blank lines (not rendered, but lets user control aethetic layout of the source code) + +$ blank-line [%blank-line ~] + :: + :: Table (alignments: [l]eft, [r]ight, [c]enter, [n]one) + +$ table [%table widths=(list @) head=(list contents:inline) align=(list ?(%l %c %r %n)) rows=(list (list contents:inline))] + -- + :: + :: Container node: can contain other nodes (either container or leaf). + ++ container + |% + ++ node $+ container-node + $@ ~ + $%(block-quote ol ul tl) + :: + :: Block quote. Can be nested. + +$ block-quote [%block-quote =markdown] + :: + :: Ordered list: numbered based on first list item marker. + :: Marker char can be either dot '1. asdf' or par '1) asdf' + :: Can be indented up to 3 spaces + +$ ol [%ol indent-level=@ marker-char=@t start-num=@ contents=(list markdown)] :: is-tight=? + :: + :: Unordered list: bullet point list + :: Marker char can be either hep (-), lus (+) or tar (*) + :: Can be indented up to 3 spaces + +$ ul [%ul indent-level=@ marker-char=@t contents=(list markdown)] :: is-tight=? + :: + :: Task list: unordered list of tasks + :: Can be indented up to 3 spaces + +$ tl [%tl indent-level=@ marker-char=@t contents=(list [is-checked=? =markdown])] :: is-tight=? + -- +-- diff --git a/backupdesk/sur/nostr.hoon b/backupdesk/sur/nostr.hoon new file mode 100644 index 0000000..652a106 --- /dev/null +++ b/backupdesk/sur/nostr.hoon @@ -0,0 +1,103 @@ +|% ++$ keys [pub=@ priv=@] ++$ event +$: id=@ux :: 32bytes + pubkey=@ux :: 32bytes + created-at=@ud :: seconds + kind=@ud + tags=(list tag) + content=@t + sig=@ux :: 64bytes +== ++$ raw-event +$: pubkey=@ux :: 32bytes + created-at=@ud :: seconds + kind=@ud + tags=(list tag) + content=@t +== ++$ tag (list @t) +:: $: key=@t +:: value=@t +:: rest=(list @t) +:: == ++$ user-meta :: NIP-1 +$: name=@t + about=@t + picture=@t + other=(map @t json) +== ++$ relay-stats +$: connected=(unit @da) + reqs=(map sub-id event-stats) +== ++$ event-stats + [filters=(list filter) received=event-count] ++$ sub-id @t ++$ event-count @ud + ++$ relay-req +$: sub-id=@t + filters=(list filter) +== +:: Relay comms ++$ filter +$: ids=(unit (set @ux)) + authors=(unit (set @ux)) + kinds=(unit (set @ud)) + tags=(unit (map @t (set @t))) + since=(unit @da) + until=(unit @da) + limit=(unit @ud) +== +:: messages from relay +++ relay-msg +$% [%event sub-id=@t =event] + [%ok id=@ux accepted=? msg=@t] + [%eose sub-id=@t] + [%closed sub-id=@t msg=@t] + [%notice msg=@t] + [%auth challenge=@t] + :: from our shim + [%error msg=@t] +== +++ shim + |% + ++ url 'http://localhost:8888/shim' + +$ req + $% [%req relay-req] + [%event =event] + [%auth =event] + [%close sub-id=@t] + == + +$ bulk-req [relays=(list @t) =req] + -- + +:: https://github.com/sesseor/nostr-relays-list/blob/main/relays.txt +++ public-relays ^- (list @t) + :~ 'wss://nos.lol' + :: 'wss://relay.damus.io' + :: 'wss://nostr.wine' + :: 'wss://offchain.pub' + == + :: 'wss://knostr.neutrine.com' +-- +:: event: { +:: content: "😂", +:: created_at: 1758049319, +:: id: "36c8a0bb6a9a1ff3ca3e6868fdf2c055a09aea39b1c078b75c38f5a7b580da87", +:: kind: 7, +:: pubkey: "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1", +:: sig: "7b5a9c799776935f959eccfd311af6152db6a1360296c9790b35544d0b83a8d75f8937ad1ad6f5da3e0d3e2bdb1bfb92686adbde42c3ef53ca06771080d08153", +:: tags: [ +:: [ "e", "091d00811bb9a57088ab7c1d39697b0ed9bbbe05dae135b406f3560290fba311", +:: "wss://relay.nostr.band/", "root", "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1" +:: ], [ "e", "1cd926b58a1bac70adcedf38212d72ee1380e17dad1aef6bbc18782c5c540236", +:: "wss://relay.nostr.band/", "reply", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083" +:: ], [ "p", "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1", +:: "wss://nostr.bitcoiner.social/" +:: ], [ "p", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083", +:: "ws://relay.snort.social/" +:: ], [ "e", "b9a0c3b28a291d80bcb41ee730f2c48366fd2fefba0e68f9fb928bb9ca96f757" ], [ "p", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083" ] +:: ], +:: }, diff --git a/desk/sur/nostril.hoon b/backupdesk/sur/nostrill.hoon index a1cc5ee..a0d270f 100644 --- a/desk/sur/nostril.hoon +++ b/backupdesk/sur/nostrill.hoon @@ -4,22 +4,23 @@ +$ state-0 $: %0 :: nostr config - relays=(map @t (list event:nostr)) - keys=(map @ux @ux) :: pubkey to privkey + relays=(map @t relay-stats:nostr) + keys=(lest keys:nostr) :: cycled, i.keys is current one :: own feed feed=feed:trill + :: nostr feed from relays + =nostr-feed + :: profiles profiles=(map @ux user-meta:nostr) following=(map @ux =feed:trill) follow-graph=(map @ux (set follow)) :: TODO global feed somehow? == ++$ nostr-feed ((mop @ud event:nostr) gth) +++ norm ((on @ud event:nostr) gth) +$ follow [pubkey=@ux name=@t relay=(unit @t)] -++ default ^- state-0 - =/ s *state-0 - =/ l ~[['wss://relay.damus.io' ~] ['wss://nos.lol' ~]] - s(relays (malt l)) - ++$ shim-msg ++ ui |% +$ poke @@ -27,7 +28,7 @@ [%post post-poke] :: [%reac reac-poke] [%prof prof-poke] - [%keys keys-poke] + [%keys ~] :: cycle-keys [%rela relay-poke] == +$ post-poke @@ -43,10 +44,6 @@ $% [%add pubkey=@ux meta=user-meta:nostr] [%del pubkey=@ux] == - +$ keys-poke - $% [%add ~] - [%del pubkey=@ux] - == +$ relay-poke $% [%send host=@p id=@ relays=(list @t)] == diff --git a/backupdesk/sur/spider.hoon b/backupdesk/sur/spider.hoon new file mode 100644 index 0000000..7c21268 --- /dev/null +++ b/backupdesk/sur/spider.hoon @@ -0,0 +1,27 @@ +/+ libstrand=strand +=, strand=strand:libstrand +|% ++$ thread $-(vase shed:khan) ++$ input [=tid =cage] ++$ tid tid:strand ++$ bowl bowl:strand ++$ http-error + $? %bad-request :: 400 + %forbidden :: 403 + %nonexistent :: 404 + %offline :: 504 + == ++$ start-args + $: parent=(unit tid) + use=(unit tid) + =beak + file=term + =vase + == ++$ inline-args + $: parent=(unit tid) + use=(unit tid) + =beak + =shed:khan + == +-- diff --git a/backupdesk/sur/trill/feed.hoon b/backupdesk/sur/trill/feed.hoon new file mode 100644 index 0000000..be7abb5 --- /dev/null +++ b/backupdesk/sur/trill/feed.hoon @@ -0,0 +1,16 @@ +/- post=trill-post +|% ++$ feeds (map ship feed) ++$ feed ((mop id:post post:post) gth) ++$ index (map @t (set pid:post)) +++ orm ((on id:post post:post) gth) ++$ full-graph ((mop id:post full-node:post) gth) +++ form ((on id:post full-node:post) gth) ++$ global ((mop pid:post post:post) ggth) +++ ggth |=([[ship a=time] [ship b=time]] (gth a b)) +++ gorm ((on pid:post post:post) ggth) + ++$ cursor (unit @da) ++$ fc [=feed:feed start=cursor end=cursor] ++$ gc [mix=global:feed start=cursor end=cursor] +-- diff --git a/backupdesk/sur/trill/gate.hoon b/backupdesk/sur/trill/gate.hoon new file mode 100644 index 0000000..ddc0adb --- /dev/null +++ b/backupdesk/sur/trill/gate.hoon @@ -0,0 +1,26 @@ +|% ++$ gate +$: =lock + begs=(set @p) :: follow requests + post-begs=(set post-beg) :: read requests for specific posts + :: TODO include whole thread? + mute=lock :: mute list to prevent request spamming + backlog=$~(50 @) :: size of backlog sent to followers by default +== ++$ post-beg [=ship id=@da] + ++$ lock +$: rank=[caveats=(set rank:title) locked=_| public=?] + luk=[caveats=(set ship) locked=_| public=?] + ship=[caveats=(set ship) locked=_| public=?] + tags=[caveats=(set @t) locked=_| public=?] + custom=[fn=(unit $-(@p ?)) public=?] +== ++$ change +$% [%set-rank set=(set rank:title) locked=? public=?] + [%set-luk set=(set ship) locked=? public=?] + [%set-ship set=(set ship) locked=? public=?] + [%set-tags set=(set @t) locked=? public=?] + [%set-custom term] :: Handle this and set in hoon +== +-- diff --git a/backupdesk/sur/trill/post.hoon b/backupdesk/sur/trill/post.hoon new file mode 100644 index 0000000..97912ce --- /dev/null +++ b/backupdesk/sur/trill/post.hoon @@ -0,0 +1,121 @@ +/- gate=trill-gate +|% ++$ id @da ++$ pid [=ship =id] +:: anon post type? ++$ tag @t ++$ post + $: =id + host=ship + author=ship + thread=id + parent=(unit id) + children=(set id) + contents=content-map + read=lock:gate + write=lock:gate + =engagement + =hash :: We'll reuse this for the Nostr pubkey + =signature + tags=(set tag) ::TODO make sure it's not infinite + == ++$ sent-post + $: host=ship + author=ship + thread=(unit id) + parent=(unit id) + contents=content-list + read=lock:gate + write=lock:gate + tags=(set tag) + == ++$ full-node + $: =id + host=ship + author=ship + thread=id + parent=(unit id) + children=internal-graph + contents=content-map + read=lock:gate + write=lock:gate + =engagement + =hash + =signature + tags=(set tag) + == +:: recursive types crash ++$ internal-graph + $~ [%empty ~] + $% [%full p=full-graph] + [%empty ~] + == ++$ full-graph ((mop id full-node) gth) +++ form ((on id full-node) gth) +:: from post:graph-store +:: +sham (half sha-256) hash of +validated-portion ++$ hash @uvH +:: ++$ signature [p=@uvH q=ship r=life] ++$ engagement + $: + =reacts + quoted=(set signed-pid) + shared=(set signed-pid) + == ++$ signed-pid [=signature =pid] ++$ react @t ++$ reacts (map ship signed-react-2) ++$ signed-react [=pid author=ship =react =signature] ++$ signed-react-2 [p=react q=signature] + + ++$ content-map ((mop time content-list) gth) +++ corm ((on time content-list) gth) +:: +$ content-list contents:contents-1 ++$ content-list contents ++$ li content-list ++$ contents (list block) ++$ paragraph (list inline) ++$ heading $?(%h1 %h2 %h3 %h4 %h5 %h6) ++$ block + $% [%paragraph p=(list inline)] + [%blockquote p=(list inline)] + [%table rows=(list (list contents))] + [%heading p=cord q=heading] + [%list p=(list inline) ordered=?] + [%media =media] + [%codeblock code=cord lang=cord] + [%eval hoon=cord] + :: + [%ref type=term =ship =path] + :: + [%json origin=term content=@t] + :: TODO get rid of this. should be a ref + [%poll id=@da] + == ++$ poll-opt [option=cord votes=@] ++$ media + $% [%images p=(list cord)] + [%video p=cord] + [%audio p=cord] + == ++$ inline + $% [%text p=cord] + [%italic p=cord] + [%bold p=cord] + [%strike p=cord] + [%codespan p=cord] + [%link href=cord show=cord] + [%break ~] + :: not strictly markdown + [%underline p=cord] + [%sup p=cord] + [%sub p=cord] + [%ruby p=cord q=cord] + :: custom types + [%ship p=ship] + :: TODO + :: [%date p=@da] + == +-- diff --git a/backupdesk/sys.kelvin b/backupdesk/sys.kelvin new file mode 100644 index 0000000..1ec239e --- /dev/null +++ b/backupdesk/sys.kelvin @@ -0,0 +1 @@ +[%zuse 410] diff --git a/backupdesk/ted/fetch.hoon b/backupdesk/ted/fetch.hoon new file mode 100644 index 0000000..76817f6 --- /dev/null +++ b/backupdesk/ted/fetch.hoon @@ -0,0 +1,23 @@ +/- spider +/+ strandio +=, strand=strand:spider +=, dejs-soft:format +=, strand-fail=strand-fail:libstrand:spider +^- thread:spider +|= arg=vase + =/ request ;;(request:http q.arg) + =/ m (strand ,vase) ^- form:m + :: =/ m (strand ,json) ^- form:m + ;< ~ bind:m (send-request:strandio request) + ;< res=client-response:iris bind:m take-client-response:strandio + ?. ?=(%finished -.res) (strand-fail:strand %no-body ~) + :: =/ headers headers.response-header.res + :: =/ redirect (get-header:http 'location' headers) + :: ?^ redirect (pure:m [%| u.redirect]) + + :: + ?~ full-file.res (strand-fail:strand %no-body ~) + =/ body=@t q.data.u.full-file.res + :: ~& resbody=body + =/ json [%s body] + (pure:m !>(json)) diff --git a/backupdesk/web/assets/apple-touch-icon.png b/backupdesk/web/assets/apple-touch-icon.png Binary files differnew file mode 100644 index 0000000..f77c873 --- /dev/null +++ b/backupdesk/web/assets/apple-touch-icon.png diff --git a/backupdesk/web/assets/favicon-16x16.png b/backupdesk/web/assets/favicon-16x16.png Binary files differnew file mode 100644 index 0000000..6ab2451 --- /dev/null +++ b/backupdesk/web/assets/favicon-16x16.png diff --git a/backupdesk/web/assets/favicon-32x32.png b/backupdesk/web/assets/favicon-32x32.png Binary files differnew file mode 100644 index 0000000..b81291b --- /dev/null +++ b/backupdesk/web/assets/favicon-32x32.png diff --git a/backupdesk/web/assets/favicon.ico b/backupdesk/web/assets/favicon.ico Binary files differnew file mode 100644 index 0000000..110004a --- /dev/null +++ b/backupdesk/web/assets/favicon.ico diff --git a/backupdesk/web/assets/script.js b/backupdesk/web/assets/script.js new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/backupdesk/web/assets/script.js diff --git a/backupdesk/web/assets/site.webmanifest b/backupdesk/web/assets/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/backupdesk/web/assets/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file diff --git a/backupdesk/web/assets/spinner.svg b/backupdesk/web/assets/spinner.svg new file mode 100644 index 0000000..a6763ca --- /dev/null +++ b/backupdesk/web/assets/spinner.svg @@ -0,0 +1 @@ +<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.spinner_0XTQ{transform-origin:center;animation:spinner_y6GP .75s linear infinite}@keyframes spinner_y6GP{100%{transform:rotate(360deg)}}</style><path class="spinner_0XTQ" d="M12,23a9.63,9.63,0,0,1-8-9.5,9.51,9.51,0,0,1,6.79-9.1A1.66,1.66,0,0,0,12,2.81h0a1.67,1.67,0,0,0-1.94-1.64A11,11,0,0,0,12,23Z"/></svg>
\ No newline at end of file diff --git a/backupdesk/web/assets/style.css b/backupdesk/web/assets/style.css new file mode 100644 index 0000000..9b8f0e5 --- /dev/null +++ b/backupdesk/web/assets/style.css @@ -0,0 +1,415 @@ +@font-face { + font-family: Urbit Sans; + src: url(https://media.urbit.org/fonts/UrbitSans/UrbitSansVFWeb-Regular.woff2) format("woff2"); + font-weight: 100 700; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-UltraThin.otf); + font-weight: 100; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-Thin.otf); + font-weight: 200; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-Light.otf); + font-weight: 300; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-Regular.otf); + font-weight: 400; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-Medium.otf); + font-weight: 500; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-SemiBold.otf); + font-weight: 600; + font-style: normal +} + +@font-face { + font-family: "Urbit Serif Italic"; + src: url(https://media.urbit.org/fonts/UrbitSerifItalic/UrbitSerifItalic-Bold.otf); + font-weight: 700; + font-style: normal +} + +body, +html { + font-family: Urbit Sans +} + +/* urbit intranav color scheme */ +.wit { + --muted: #14140F; + --primary: #F8FAF8; +} +/* fdn intranav color scheme */ +.mos { + --muted: #5A5A55; + --primary: #C3CDC3; +} +/* roadmap intranav color scheme */ +.mos-light { + --muted: #A3ABA3; + --primary: #54544F; +} +/* docs intranav color scheme */ +.blu { + --muted: #5A5A6E; + --primary: #A0DCE6; +} +/* network explorer intranav color scheme */ +.gry { + --muted: #141A14; + --primary: #C8C8C8 +} + +/* utility */ +.f { + display: flex; +} + +.fs { + display: flex; + justify-content: space-between; +} + +.g1 { + gap: 0.5rem; +} + +.g2 { + gap: 1rem; +} +.cp{ + cursor: pointer; +} +.tc{ + text-align:center; +} + +/* base */ + +:root { + --black: #141A14; + --white: #FFFFFF; + --primary: #FFF450; + --muted: #B9B13D; +} + + +body { + background-color: var(--primary); + color: var(--black); + margin: 0; + padding: 0; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +a { + color: inherit; + text-decoration: none; +} + +/* nav */ +#topnav { + height: 63px; + + & #login-div { + display: flex; + align-items: center; + text-decoration: underline; + margin-right: 2rem; + font-size: 18px; + line-height: 24.12px; + /* font-weight: 600; */ + } +} + +#nav-main { + background-color: var(--black); + color: var(--primary); + cursor: pointer; + font-size: 18px; + line-height: 24.12px; + /* font-weight: 600; */ + text-align: center; + display: flex; + align-items: center; + gap: 1rem; + padding: 0 1rem; +} + +#nav-links { + display: flex; + align-items: center; + font-size: 18px; + line-height: 24.12px; + /* font-weight: 600; */ + text-align: center; + gap: 1rem; + + & a { + opacity: 0.5; + } + + & .active { + opacity: 1 + } +} + + +/* index */ +main { + padding: 1rem 2rem; + flex-grow: 1; + overflow: auto; +} + +#index-top { + margin-bottom: 1.5rem; + font-size: 1.4rem; + font-weight: 600; + + div { + opacity: 0.5; + cursor: pointer; + } + + & .active { + opacity: 1; + } +} + +.thread-preview { + padding: 0.5rem 0; + + border-bottom: 2px solid black; + + &:first-child { + border-top: 2px solid black; + } + + & .num { + font-size: 1.5rem; + } + + & a { + text-decoration: none; + } + & .preview{ + max-width: 100%; + } + & .title { + font-weight: 600; + font-size: 25px; + line-height: 33px; + } + & .title-text{ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + & .out-link { + font-weight: 600; + font-size: 20px; + + & .arrow { + margin-left: 0.3rem; + font-size: 1.3rem; + } + } + + & .meta { + opacity: 0.5; + & .upvote-button, & .downvote-button{ + + } + } + +} + +.moar { + text-decoration: underline; + font-size: 20px; + margin-top: 1rem; + display: block; +} + +.white{ + background-color: var(--white); +} +/* thread page */ +#thread-main{ + background-color: var(--white); + & h1{ + margin-top: 0.3rem; + } + & ul{ + display: block; + list-style-image: none; + list-style-position: outside; + list-style-type: none; + padding: 0; + & li{ + margin-bottom: 1rem; + } + } + & .nested{ + padding-left: 2rem !important; + } + & .comment{ + & img{ + max-width: 60%; + display: block; + margin: 1rem auto; + } + & .comment-proper{ + margin-top: 0.5rem; + } + & .content{ + font-weight: 600; + margin: 1rem 0; + & p{ + margin: 0.2rem 0; + } + } + } +} +.red{ + color: red; +} +.green { + color: green; +} +.tally{ + font-weight: 600; +} +.uln{ + text-decoration: underline; + cursor: pointer; +} +.return-link{ + display: block; + margin-bottom: 2rem; +} +#og{ + border: 1px solid var(--black); + border-radius: 0.5rem; + & img{ + width: 100%; + max-height: 500px; + } +} +#link-url{ + padding: 0.5rem 1rem; +} +#thread-composer{ + & input{ + display: block; + height: 2rem; + width: 100%; + margin: 1rem 0; + } +} +#comment-composer{ + margin-top: 3rem; + margin-bottom: 1rem; + + padding: 0.5rem 1rem; + border: 1px solid var(--black); + border-radius: 0.5rem; +} +#composer-proper{ + margin: 1rem; + padding: 1rem; + & textarea{ + width: 100%; + height: 200px; + margin-bottom: 0.5rem; + resize: none; + } +} +#login-page{ + & form{ + display: block; + width: 50%; + margin: 2rem auto; + + & input{ + display: block; + width: 30ch; + padding: 0.4rem; + height: 2rem; + margin: 2rem auto; + } + & button{ + display: block; + margin: auto; + font-size: 1.2rem; + } + } +} +#sigil-img{ + margin: 1rem auto !important; +} +#user-page{ + & *{ + margin: auto; + } + & #main{ + width: 50%; + } +} +#logout{ + display: block; + margin: 2rem auto; + font-size: 1.2rem; +} +button, .button{ + border: 1px solid var(--black); + background: none; + padding: 0.5rem; + width: max-content; +} + +.footer { + /* height: 63px; */ + /* display: flex; */ + /* position: fixed; */ + left: 0; + bottom: 0; + /* width: 100%; */ + background-color: none; + padding: 0.5rem; + color: #141A14; + text-align: right; + margin-right: 2rem; + font-size: 20px; + line-height: 23px; + font-weight: 600; +} diff --git a/backupdesk/web/components/components.hoon b/backupdesk/web/components/components.hoon new file mode 100644 index 0000000..ced005e --- /dev/null +++ b/backupdesk/web/components/components.hoon @@ -0,0 +1,3 @@ +|% +++ lol %lol +-- diff --git a/backupdesk/web/components/navbar.hoon b/backupdesk/web/components/navbar.hoon new file mode 100644 index 0000000..0c87f80 --- /dev/null +++ b/backupdesk/web/components/navbar.hoon @@ -0,0 +1,54 @@ +/- sur=nostrill +/= sig /web/components/sigil/sigil +:: +|_ [=state:sur =bowl:gall] +++ new-post-link + ;+ ;a/"/nostril/add":"new post" +++ sigil + :: ;+ (sig(size 48) src.bowl) + :: =/ =ship + :: ?+ (clan:title (~(gut by sessions.state) src.bowl (dec (bex 128)))) + :: !! + :: %czar ?:((gte (bex 64) src.bowl) src.bowl (~(got by sessions.state) src.bowl)) + :: %king ?:((gte (bex 64) src.bowl) src.bowl (~(got by sessions.state) src.bowl)) + :: %duke ?:((gte (bex 64) src.bowl) src.bowl (~(got by sessions.state) src.bowl)) + :: %earl ?:((gte (bex 64) src.bowl) src.bowl (~(got by sessions.state) src.bowl)) + :: == + =/ ship src.bowl + =/ p (scow %p ship) + ;div.f.g2 + ;* new-post-link + ;a/"/forum/usr/{p}":"{p}" + == +++ $ + ;nav#topnav.fs.g2 + ;div.f.g2 + ;div#nav-main.fs + ;a/"https://urbitsystems.tech/"(class "lg:relative flex h-full items-center bg-black w-1/2 lg:w-[14.5rem] xl:w-64 type-ui"):"~ Technical Journal" + ;div#nav-dropdown:"↓" + == + ;div#nav-links + ;a/"https://urbitsystems.tech/information":"Information" + ;a.active/"/forum":"Forum" + == + == + ;div#login-div + ;+ sigil + == + ;script:"{script}" + == +++ script + ^~ + %- trip +''' + async function setSigil(){ + console.log("setting sigil") + const div = document.getElementById("login-div"); + const res = await fetch("/forum/f/sigil"); + const t = await res.text(); + console.log("sigil", t); + if (t) div.innerHTML = t; + } + setSigil(); +''' +-- diff --git a/backupdesk/web/components/post-text.hoon b/backupdesk/web/components/post-text.hoon new file mode 100644 index 0000000..f4b574f --- /dev/null +++ b/backupdesk/web/components/post-text.hoon @@ -0,0 +1,134 @@ +/- tp=post +/+ sr=sortug +|% +++ content + |= c=content-list:tp + ^- marl + (turn c block) +:: +++ block + |= b=block:tp + ^- manx + ?+ -.b ;p; + %paragraph (pg +.b) + %blockquote (bq +.b) + %heading (heading +.b) + %list (htmlist +.b) + %media (media +.b) + %codeblock (codeblock +.b) + %eval (eval +.b) + == +++ eval + |= txt=@t + ^- manx + :: +ream can crash if the cord is wrong, so soften instead + =/ uhoon (rush txt vest) + ?~ uhoon ;p:"The hoon you tried to run ({(trip txt)}) is invalid." + =/ run (mule |.((slap !>(..zuse) u.uhoon))) + ?: ?=(%.n -.run) :: if virtualization fails get a (list tank) + ;p + ;span:"Evaluation of {(trip txt)} failed:" + ;br; + ;* %+ turn p.run |= t=tank ;span:"{~(ram re t)}" + == + ;p:"{(text p.run)}" +++ pg + |= l=(list inline:tp) + ^- manx + ;p + ;* %+ turn l inline + == +++ bq + |= l=(list inline:tp) + ^- manx + ;blockquote + ;* %+ turn l inline + == +++ htmlist + |= [l=(list content-list:tp) ordered=?] + ?: ordered + ;ol + ;* %+ turn l li + == + ;ul + ;* %+ turn l li + == +++ li + |= l=content-list:tp ^- manx + ;li + ;* (turn l block) + == +++ media + |= m=media:tp + ^- manx + ?- -.m + %video ;video@"{(trip p.m)}"; + %audio ;audio@"{(trip p.m)}"; + %images ;div.images + ;* %+ turn p.m + |= [url=@t caption=@t] + ;img@"{(trip url)}"(alt (trip caption)); + == + == +++ codeblock + |= [code=@t lang=@t] :: TODO lang suff + ;pre + ;code:"{(trip code)}" + == +++ heading + |= [pp=@t q=@] + ^- manx + =/ p (trip pp) + ?: .=(1 q) ;h1:"{p}" + ?: .=(2 q) ;h2:"{p}" + ?: .=(3 q) ;h3:"{p}" + ?: .=(4 q) ;h4:"{p}" + ?: .=(5 q) ;h5:"{p}" + ?: .=(6 q) ;h6:"{p}" + ;p:"" +++ inline + |= l=inline:tp + ^- manx + ?+ -.l ;span; + %text (parse-text p.l) + %italic ;i:"{(trip p.l)}" + %bold ;strong:"{(trip p.l)}" + :: %strike ;del:"{(trip p.l)}" + %ship ;span.ship:"{(trip (scot %p p.l))}" + %codespan ;code:"{(trip p.l)}" + %break ;br; + %img ;a/"{(trip src.l)}" + ;img@"{(trip src.l)}"(alt (trip alt.l)); + == + %link ?. (is-image:parsing:sr href.l) + ;a/"{(trip href.l)}"(target "_blank"):"{(trip show.l)}" + ;a/"{(trip href.l)}" + =target "_blank" + ;img@"{(trip href.l)}"(alt (trip show.l)); + == + == +++ parse-text + |= txt=@t + ^- manx + =/ tpe (trip txt) + =/ youtube (rush txt youtube:parsing:sr) + ?^ youtube + :: ;a/"{tpe}" + :: ;img@"https://i.ytimg.com/vi/{u.youtube}/hqdefault.jpg"; + :: == + ;iframe.youtube-frame@"https://www.youtube.com/embed/{u.youtube}"; + =/ twatter-status (rush txt twatter:parsing:sr) + ?^ twatter-status + ;div :: goddamn twatter embeds insert themselves as last child + ;a.parsed-twatter(status u.twatter-status):"{tpe}" + == + =/ trimmed (rush txt trim:parsing:sr) + ?~ trimmed ~& parsing-error=txt ;span.parsing-error; + =/ link=(unit purl:eyre) (rust u.trimmed link:parsing:sr) + ?^ link + ?^ p.q.u.link + ?: (is-img:parsing:sr u.p.q.u.link) ;img@"{u.trimmed}"; + ;a.parsed-link/"{tpe}"(target "_blank"):"{tpe}" :: normal link + ;a.parsed-link/"{tpe}"(target "_blank"):"{tpe}" :: normal link + ;span:"{tpe}" +-- diff --git a/backupdesk/web/components/sigil/sigil.hoon b/backupdesk/web/components/sigil/sigil.hoon new file mode 100644 index 0000000..cee33a0 --- /dev/null +++ b/backupdesk/web/components/sigil/sigil.hoon @@ -0,0 +1,227 @@ +:: sigil: @p svg generation +:: +:: usage: do a named import, then invoke as a function: +:: (sigil ~zod) +:: +:: optionally modify configuration parameters: +:: %. ~paldev +:: %_ sigil +:: size 25 +:: fg "black" +:: bg "#2aa779" +:: margin | +:: icon & +:: == +:: +::NOTE svg construction logic is coupled to the symbols definitions. +:: the symbols' elements assume they live in a space of 128x128. +:: what we do here is assume an svg _canvas_ of 128x128, draw the +:: symbols at their original sizes, and then scale them down to fit. +:: +/= sigil-symbols /web/components/sigil/symbols +:: +:: config +:: +=/ fg=tape "white" +=/ bg=tape "black" +=/ size=@ud 128 +=/ margin=? & +=/ icon=? | +:: +:: +~% %sigil ..part ~ +=/ who=ship ~zod +=/ syc=@ud 1 +|^ |= =ship + ^- manx + :: + =. who ship + =/ syz (simp who) + =. syc (lent syz) + :: shift the sigil to account for the margin + :: scale the sigil to account for the amount of symbols + :: + =/ sire=@rd (sun:rd size) + =/ tr=tape + ::TODO render transform inside +sigil:svg? + %+ transform:svg + ?. margin ~ + =+ grid:pos + `[(gird:pos x) (gird:pos y)] + `span:pos + :: + =/ sw=@rd ::TODO + ?: icon .~0.8 ::TODO scale with size? + (add:rd .~0.33 (div:rd sire .~128)) + :: + %- outer:svg + %+ sigil:svg + [tr sw] + (symbols:svg syz) +:: +++ pos + |% + ++ span :: symbol scale (relative to full canvas) + ^- @rd + ::TODO accounting for margin here feels a bit ugly? + ?+ (max grid) !! + %1 ?:(margin .~0.4 .~1) + %2 ?:(margin .~0.4 .~0.5) + %4 ?:(margin .~0.2 .~0.25) + == + :: + ++ grid :: size in symbols + ^- [x=@ud y=@ud] + ?+ syc !! + %16 [4 4] + %8 [4 4] + %4 [2 2] + %2 [2 1] + %1 [1 1] + == + :: + ++ gird :: calculate margin + |= n=@ud + ^- @rd + =- (div:rd - .~2) :: / both sides + %+ sub:rd .~128 :: canvas size - + %+ mul:rd (sun:rd n) :: symbols * + %+ mul:rd span:pos :: symbol scale * + .~128 :: symbol size + :: + ++ plan :: as position on symbol grid + |= i=@ud + ^- [x=@ud y=@ud] + ?+ [syc i] !! + [%16 *] [(mod i 4) (div i 4)] + :: + [%8 %0] [0 0] + [%8 %1] [3 0] + [%8 %2] [0 3] + [%8 %3] [3 3] + [%8 %4] [1 1] + [%8 %5] [2 1] + [%8 %6] [1 2] + [%8 %7] [2 2] + :: + [%4 *] [(mod i 2) (div i 2)] + [%2 *] [i 0] + [%1 *] [0 0] + == + -- +:: +++ svg + |% + ++ outer + |= inner=manx + ^- manx + =/ s=tape ((d-co:co 1) size) + ;svg + =style "display: block; width: {s}px; height: {s}px;" :: prevent bottom margin on svg tag + =width s + =height s + =viewBox "0 0 128 128" + =version "1.1" + =xmlns "http://www.w3.org/2000/svg" + ::TODO additional attributes from config arg? + ;rect + =fill bg + =width "128" + =height "128"; + ;+ inner + == + :: + ::TODO should it be possible to get these svg elements out of this lib? + ++ sigil + |= [[tr=tape sw=@rd] symbols=(list manx)] + ^- manx + ;g + =transform tr + =stroke-width (say-rd sw) + =stroke-linecap "square" + =fill fg + =stroke bg + ::NOTE unfortunately, vector-effect cannot be inherited, + :: so it gets inlined in the symbol elements instead + :: =vector-effect "non-scaling-stroke" + ;* symbols + == + :: + ++ symbols + |= noms=(list @t) + ^- (list manx) + =| i=@ud + =/ l=@ud (lent noms) + |- + ?~ noms ~ + :_ $(noms t.noms, i +(i)) + ::TODO exclude if both 0 + =+ (plan:pos i) + ;g(transform (transform `[(sun:rd (mul x 128)) (sun:rd (mul y 128))] ~)) + ;* =+ ((symbol i.noms) fg bg) + ?.(icon - (scag 1 -)) + == + :: + ++ symbol ~(got by sigil-symbols) + :: + ++ transform ::TODO take manx instead so we can omit attr entirely? + |= [translate=(unit [x=@rd y=@rd]) scale=(unit @rd)] + ^- tape + %- zing + ^- (list tape) + ::TODO make cleaner + =- ?: ?=(?(~ [* ~]) -) - + (join " " `(list tape)`-) + ^- (list tape) + :~ ?~ translate ~ + ?: =([0 0] u.translate) ~ + "translate({(say-rd x.u.translate)} {(say-rd y.u.translate)})" + :: + ?~ scale ~ + "scale({(say-rd u.scale)})" + == + -- +:: +++ simp + |= =ship + ^- (list @t) + :: split into phonemes + :: + =/ noms=(list @t) + =/ nom=@t + (rsh 3 (scot %p ship)) + |- ?~ nom ~ + |- ?: =('-' (end 3 nom)) + $(nom (rsh 3 nom)) + :- (end 3^3 nom) + ^$(nom (rsh 3^3 nom)) + :: fill leading empties with 'zod' + :: + =/ left=@ud + =- (sub - (lent noms)) + %- bex + ?- (clan:title ship) + %czar 0 + %king 1 + %duke 2 + %earl 3 + %pawn 4 + == + |- + ?: =(0 left) noms + $(noms ['zod' noms], left (dec left)) +:: +++ rd ~(. ^rd %n) +++ say-rd + |= n=@rd + ^- tape + =/ =dn (drg:rd n) + ?> ?=(%d -.dn) + =/ [s=? m=@ud] (old:si e.dn) + =/ x=@ud (pow 10 m) + %+ weld + %- (d-co:co 1) + ?:(s (mul a.dn x) (div a.dn x)) + ?: s ~ + ['.' ((d-co:co m) (mod a.dn x))] +-- diff --git a/backupdesk/web/components/sigil/symbols.hoon b/backupdesk/web/components/sigil/symbols.hoon new file mode 100644 index 0000000..1131612 --- /dev/null +++ b/backupdesk/web/components/sigil/symbols.hoon @@ -0,0 +1,14332 @@ +:: sigil-symbols: svg symbols for phonemes, for use in /lib/sigil +:: +:: the map is keyed by phoneme cords and contains functions for +:: generating lists of manxes based on fore- and background colors, +:: intended to be wrapped up in an svg <g> for further processing. +:: +:: shapes and default attributes sourced from: +:: https://github.com/urbit/sigil-js/blob/fdea06f/src/index.json +:: +::NOTE to reduce svg size, we exclude certain common/shared attributes. +:: we expect the /lib/sigil to wrap these elements in a <g> which sets +:: those attributes, letting them be inherited. they are as follows: +:: =fill fg +:: =stroke bg +:: =stroke-linecap "square" +:: =stroke-width +:: we assume the defaults specified above, and only include those +:: attributes below if they deviate from those. (this includes adding +:: stroke="none" for elements whose original specification did not +:: include a stroke.) +:: unfortunately, the vector-effect attribute cannot be inherted by <g> +:: children, so we have to inline it for every element here. +:: for ease of change, we leave excluded attributes as comments here. +:: +^~ +%- ~(gas by *(map cord $-([fg=tape bg=tape] (list manx)))) +:~ + :- 'bac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'bal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "32.0072" + =x2 "32.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "64.0072" + =x2 "64.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "96.0072" + =x2 "96.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ban' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 70.6924 70.6924 128 -1.52588e-05 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 35.3462 99.3462 64 64 64C28.6538 64 0 35.3462 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ben' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ber' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'bet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0C32 70.6925 74.9807 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'bin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'bis' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'bos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'bur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'bus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'byl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'byn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'byr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'byt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'dac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L-5.96046e-08 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "63.29" + =y2 "63.2929" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "32.0072" + =x2 "32.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "64.0072" + =x2 "64.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "128" + =y1 "96.0072" + =x2 "96.7071" + =y2 "127.3" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'das' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'dat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 -1.54503e-06 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dav' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'deb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "112" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "112" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'def' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 94L94 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 64L64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 32L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'deg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'del' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'den' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'der' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'des' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'det' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32.5" + =y1 "3.07317e-08" + =x2 "32.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'dib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "5.25874e-08" + =y1 "32" + =x2 "128" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dif' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "16" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'dig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'din' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.0029152 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'div' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.19629e-06 96C70.6924 96 128 53.0193 128 5.59506e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-2.79753e-06 64C70.6924 64 128 35.3462 128 5.59506e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'doc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M127.997 0L-0.00291443 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726C28.8758 53.8694 28.8758 74.1306 41.3726 86.6274" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.19629e-06 16C26.5097 16 48 37.4903 48 64C48 90.5097 26.5097 112 0 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'don' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 128C-7.24632e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "63.5" + =x2 "128" + =y2 "63.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8693 86.6274 41.3725C74.1306 28.8758 53.8694 28.8758 41.3726 41.3725" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'doz' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128L0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M30.0589 30.0589C48.804 11.3137 79.196 11.3137 97.9411 30.0589C116.686 48.804 116.686 79.196 97.9411 97.9411" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M52.6863 52.6863C58.9347 46.4379 69.0653 46.4379 75.3137 52.6863C81.5621 58.9347 81.5621 69.0653 75.3137 75.3137" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M41.3726 41.3726C53.8694 28.8758 74.1306 28.8758 86.6274 41.3726C99.1242 53.8694 99.1242 74.1306 86.6274 86.6274" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'duc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dun' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dur' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'dus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'dut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dux' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'dys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 1.11901e-05C-7.24633e-07 35.3462 28.6538 64 64 64C99.3462 64 128 35.3462 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'dyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'fad' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'feb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fer' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'fid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "98" + =y1 "2.18557e-08" + =x2 "98" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fip' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'fog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'for' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fos' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 0C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 35.3462 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0C32 17.6731 17.6731 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ful' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fun' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'fur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M86.8823 41.6275C74.3855 29.1307 54.1242 29.1307 41.6274 41.6275C29.1307 54.1243 29.1307 74.3855 41.6274 86.8823" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'fyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'fyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'hac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'had' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'han' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'hap' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'har' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'has' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "16" + =r "8" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 32C48 40.8366 40.8366 48 32 48C23.1634 48 16 40.8366 16 32C16 23.1634 23.1634 16 32 16C40.8366 16 48 23.1634 48 32ZM32 40C36.4183 40 40 36.4183 40 32C40 27.5817 36.4183 24 32 24C27.5817 24 24 27.5817 24 32C24 36.4183 27.5817 40 32 40Z" + =fill bg; + == +:: + :- 'hav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'heb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'hes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 96C48 104.837 40.8366 112 32 112C23.1634 112 16 104.837 16 96C16 87.1634 23.1634 80 32 80C40.8366 80 48 87.1634 48 96ZM32 104C36.4183 104 40 100.418 40 96C40 91.5817 36.4183 88 32 88C27.5817 88 24 91.5817 24 96C24 100.418 27.5817 104 32 104Z" + =fill bg; + == +:: + :- 'het' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'hid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M48 64C48 72.8366 40.8366 80 32 80C23.1634 80 16 72.8366 16 64C16 55.1634 23.1634 48 32 48C40.8366 48 48 55.1634 48 64ZM32 72C36.4183 72 40 68.4183 40 64C40 59.5817 36.4183 56 32 56C27.5817 56 24 59.5817 24 64C24 68.4183 27.5817 72 32 72Z" + =fill bg; + == +:: + :- 'hob' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hoc' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'hol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "47" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "47" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "81" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "81" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "48" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'hut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lab' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 -9.40976e-06C64 70.6924 92.6538 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 -7.63193e-07C32 70.6924 74.9807 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lad' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "95.35" + =y1 "32.7071" + =x2 "32.0571" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lan' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "112" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "2.78181e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'las' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lav' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'leb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-1.64036e-05 32C53.0193 32 96 74.9807 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'led' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'leg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.63192e-07 32C17.6731 32 32 46.3269 32 64C32 81.6731 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'len' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ler' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'let' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'lib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'lig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "128" + =x2 "64" + =y2 "-6.55671e-08" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "80" + =cy "64" + =r "8" + =fill bg + =stroke "none"; + == +:: + :- 'lis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-4.70488e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00286865 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'liv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-5.21346e-06 32C70.6924 32 128 17.6731 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M3.4331e-06 96C70.6924 96 128 53.0193 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'loc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M16 64C16 90.5097 37.4903 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'los' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'luc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'lun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lux' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'lyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'lyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'lyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'mag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'map' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.0029152 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C110.327 32 96 17.6731 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'meb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'med' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'meg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mer' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'met' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.09815e-06 80C26.5097 80 48 101.49 48 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mig' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-4.37114e-08" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "96" + =x2 "-4.37114e-08" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'min' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'mip' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9964" + =x2 "48.0036" + =y2 "47.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00286865 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'mit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'moc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 96L128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 90.5097 90.5097 112 64 112C37.4903 112 16 90.5097 16 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 0C112 26.5097 90.5097 48 64 48C37.4903 48 16 26.5097 16 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'mop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0035" + =y1 "15.9964" + =x2 "48.0035" + =y2 "47.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.996" + =x2 "47.9964" + =y2 "79.9964" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mot' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'mus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'mut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'myl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "16" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'myn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 1.52638e-06C57.3076 -7.74381e-06 9.2702e-06 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'myr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'nal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.82114e-06 110C60.7513 110 110 60.7513 110 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-5.09828e-06 73C40.3168 73 73 40.3168 73 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-6.63647e-07 37C20.4345 37 37 20.4345 37 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "112" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nap' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-1.52588e-05 128C-9.07866e-06 57.3075 57.3076 1.44926e-06 128 7.62939e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'neb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ned' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 1.90735e-06C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C57.3076 128 3.09007e-06 70.6925 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C74.9807 96 32 53.0193 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32C110.327 32 96 17.6731 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ner' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'net' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'nib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C92.6538 128 64 70.6925 64 7.63192e-07" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nis' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00285435 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'noc' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "1.51277e-05" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M2.03434e-06 128C70.6924 128 128 70.6925 128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'num' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "31" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "31" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00268555 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M95.9984 0C95.9984 26.3298 85.3985 50.1839 68.2332 67.5278M63.9983 0C63.9983 17.4933 56.9799 33.3473 45.6054 44.8999M31.9983 0C31.9983 8.65672 28.5609 16.5106 22.9766 22.2711" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'nyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'nyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'pac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pad' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M41.3726 86.6274C28.8758 74.1306 28.8758 53.8693 41.3726 41.3725C53.8694 28.8758 74.1306 28.8758 86.6274 41.3725" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'par' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 -2.67054e-06C32 53.0193 74.9807 96 128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 -1.78036e-06C64 35.3462 92.6538 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 -8.9018e-07C96 17.6731 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ped' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'peg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'per' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'pet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'pic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'pil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'poc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96.5" + =y1 "-0.5" + =x2 "96.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32.5" + =y1 "-0.5" + =x2 "32.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pon' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'pos' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M80 64C80 55.1634 72.8366 48 64 48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pur' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M3.73284e-05 64C17.6633 64 33.6554 56.8445 45.2356 45.2741" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'put' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'pyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-5.59506e-06 128C35.3462 128 64 99.3462 64 64C64 28.6538 35.3462 1.54503e-06 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'pyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rab' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'rad' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ral' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ram' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'ran' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "-1.29797e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rav' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'reb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 -9.40976e-06C57.3075 -6.31969e-06 -3.09007e-06 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'red' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ref' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'reg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ren' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 74.9807 74.9807 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'res' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ret' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "53.9965" + =y2 "73.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "8.74228e-08" + =y1 "64" + =x2 "128" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ric' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ril' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rip' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ris' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'riv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'roc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + ;circle + =cx "112" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "112" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'rol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ron' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0C128 70.6924 70.6925 128 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ros' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ruc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9964" + =x2 "112.003" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'rum' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'run' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0L96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'rux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 64C32 81.6731 46.3269 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryg' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "16.0035" + =y1 "15.9965" + =x2 "48.0035" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ryl' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'rym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C57.3075 128 -3.09007e-06 70.6925 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryp' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'rys' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ryt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ryx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'sal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'san' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sap' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "64" + =r "8" + =fill bg + =stroke "none"; + == +:: + :- 'sar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C128 57.3076 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sav' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'seb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sef' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'seg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 128C32 110.327 46.3269 96 64 96C81.6731 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 128C96 110.327 81.6731 96 64 96C46.3269 96 32 110.327 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 128L64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128L32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 128L96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ser' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'set' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sib' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 9.40976e-06C64 35.3462 92.6538 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C110.327 128 96 113.673 96 96C96 78.3269 110.327 64 128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sig' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sil' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "16.0036" + =y1 "15.9965" + =x2 "48.0036" + =y2 "47.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'sim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sip' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 64C16 37.4903 37.4903 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'siv' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'soc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "16" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "16" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'sog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L-5.96046e-08 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'som' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'son' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "127.553" + =y1 "128.224" + =x2 "63.5528" + =y2 "0.223598" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sop' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sov' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128L128 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sub' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'sug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64C32 46.3269 46.3269 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sum' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sun' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =stroke "none"; + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sup' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sur' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M3.73284e-05 64.0001C17.6633 64.0001 33.6554 56.8446 45.2356 45.2742" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'sut' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'syd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 16C37.4903 16 16 37.4903 16 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'syl' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'sym' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syp' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'syr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'syt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'syx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 128C4.63574e-06 92.6488 14.3309 60.6449 37.5 37.4807" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tab' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "8" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'tac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tad' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tag' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9964" + =x2 "112.004" + =y2 "111.996" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "0.5" + =y1 "-0.5" + =x2 "181.5" + =y2 "-0.5" + =transform "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tam' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "32" + =x2 "-8.87604e-09" + =y2 "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M96 128C96 74.9807 53.0193 32 0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 128C64 92.6538 35.3462 64 0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M48 128C48 101.49 26.5097 80 0 80" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M32 128C32 110.327 17.6731 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 128C16 119.163 8.83656 112 0 112" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 128C128 57.3075 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tap' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "128" + =y1 "64" + =x2 "-8.87604e-09" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tar' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tas' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'teb' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tec' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'ted' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'teg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 80C119.163 80 112 72.8366 112 64C112 55.1634 119.163 48 128 48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "15" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "15" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;path + =d "M0 0L127.986 127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 0L128 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 0L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 0L128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tem' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.00285417" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'ten' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "48" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "48" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "48" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "80" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "80" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "48" + =cy "80" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "48" + =cy "80" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.14479e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'ter' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "96.5" + =y1 "3.07317e-08" + =x2 "96.5" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tev' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "15.9965" + =y1 "111.997" + =x2 "47.9965" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tic' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C110.327 32 96 17.6731 96 -1.39876e-06" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M112 32C112 40.8366 104.837 48 96 48C87.1634 48 80 40.8366 80 32C80 23.1634 87.1634 16 96 16C104.837 16 112 23.1634 112 32ZM96 40C100.418 40 104 36.4183 104 32C104 27.5817 100.418 24 96 24C91.5817 24 88 27.5817 88 32C88 36.4183 91.5817 40 96 40Z" + =fill bg; + == +:: + :- 'til' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0036" + =y1 "79.9965" + =x2 "112.004" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tim' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00291443 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tin' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tip' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 0L64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tir' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tob' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'toc' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "96" + =x2 "-8.87604e-09" + =y2 "96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tod' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "64" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tog' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'tol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "128" + =y1 "64" + =x2 "-4.37114e-08" + =y2 "64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M16 128C16 101.49 37.4903 80 64 80C90.5097 80 112 101.49 112 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tom' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'ton' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'top' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "16" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tuc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96L0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tud' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tug' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tul' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tun' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tus' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tux' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tyc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'tyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00280762 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "15.9964" + =y1 "111.997" + =x2 "47.9964" + =y2 "79.9965" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'tyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 -2.28831e-06C57.3076 -3.13131e-06 8.42999e-07 57.3075 0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'typ' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M96 1.90735e-06C96 53.0193 53.0193 96 0 96" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyr' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0L128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M0 64C35.3462 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'tyv' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M256 0L128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wac' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "16" + =cy "112" + =r "11.5" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + ;circle + =cx "16" + =cy "112" + =r "9" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + :: =stroke-width "2" + == +:: + :- 'wal' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64.5" + =y1 "-0.5" + =x2 "64.5" + =y2 "127.5" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wan' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'wat' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'web' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 128C128 57.3075 70.6925 0 0 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wed' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'weg' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M79.5254 0C79.5254 8.83656 72.3619 16 63.5254 16C54.6888 16 47.5254 8.83656 47.5254 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wel' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 32C74.9807 32 32 74.9807 32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 64C92.6538 64 64 92.6538 64 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 110.327 96 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wen' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + == +:: + :- 'wep' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wer' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M32 0L32 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wes' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "80.0035" + =y1 "79.9965" + =x2 "112.003" + =y2 "111.997" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "112" + =cy "112" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "112" + =cy "112" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wet' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M64 64H0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wex' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'wic' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wid' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "48.0035" + =y1 "80.0036" + =x2 "16.0035" + =y2 "112.004" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =fill-rule "evenodd" + =clip-rule "evenodd" + =stroke "none" + =d "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z" + =fill bg; + == +:: + :- 'win' + |= [fg=tape bg=tape] + :~ ;rect + =width "128" + =height "128" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wis' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 0C0 70.6925 57.3075 128 128 128V0H0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 64L0 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 32L0 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wit' + |= [fg=tape bg=tape] + :~ ;path + =d "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =x1 "64" + =y1 "2.18557e-08" + =x2 "64" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "32" + =y1 "2.18557e-08" + =x2 "32" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "96" + =y1 "2.18557e-08" + =x2 "96" + =y2 "128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wol' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M0 64L128 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wor' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;line + =y1 "-0.5" + =x2 "45.2548" + =y2 "-0.5" + =transform "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;line + =x1 "-0.0029152" + =x2 "127.983" + =y2 "127.986" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M64 96C46.3269 96 32 81.6731 32 64" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "64" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyc' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +:: + :- 'wyd' + |= [fg=tape bg=tape] + :~ ;path + =d "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;path + =d "M32 64C32 46.3269 46.3269 32 64 32" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "32" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyl' + |= [fg=tape bg=tape] + :~ ;path + =d "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-3.8147e-06 128C-7.24633e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wyn' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M1.52575e-06 96C53.0193 96 96 53.0193 96 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M1.01717e-06 64C35.3462 64 64 35.3462 64 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;path + =d "M5.08584e-07 32C17.6731 32 32 17.6731 32 0" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + == +:: + :- 'wyt' + |= [fg=tape bg=tape] + :~ ;path + =d "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M128 0L0 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "64" + =cy "64" + =r "48" + =vector-effect "non-scaling-stroke" + :: =stroke bg + =fill "none"; + ;circle + =cx "16" + =cy "64" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "16" + =cy "64" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'wyx' + |= [fg=tape bg=tape] + :~ ;path + =d "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + ;path + =d "M-0.00292969 0L127.997 128" + =vector-effect "non-scaling-stroke" + :: =stroke bg + :: =stroke-linecap "square" + =fill "none"; + ;circle + =cx "32" + =cy "96" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "96" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "32" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "32" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + ;circle + =cx "96" + =cy "32" + =r "11.5" + :: =fill fg + =vector-effect "non-scaling-stroke" + =stroke fg; + ;circle + =cx "96" + =cy "32" + =r "9" + =fill bg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "2" + == +:: + :- 'zod' + |= [fg=tape bg=tape] + :~ ;circle + =cx "64" + =cy "64" + =r "64" + :: =fill fg + =vector-effect "non-scaling-stroke"; + :: =stroke bg + :: =stroke-width "0.5" + == +==
\ No newline at end of file diff --git a/backupdesk/web/layout.hoon b/backupdesk/web/layout.hoon new file mode 100644 index 0000000..213046d --- /dev/null +++ b/backupdesk/web/layout.hoon @@ -0,0 +1,24 @@ +|_ children=marl +++ $ + ;html + ;head + ;meta(charset "utf-8"); + ;meta(name "viewport", content "width=device-width, initial-scale=1, shrink-to-fit=no"); + ;title:"Nostril" + ;link/"/forum/imgs/favicon.ico"(rel "icon", type "image/png"); + ;link/"/forum/imgs/favicon-32x32.png"(rel "icon", type "image/png", sizes "32x32"); + ;link/"/forum/imgs/favicon-16x16.png"(rel "icon", type "image/png", sizes "16x16"); + ;link/"/forum/imgs/apple-touch-icon.png"(rel "apple-touch-icon", type "image/png", sizes "180x180"); + ;link/"/forum/site.webmanifest"(rel "manifest"); + ;link/"/forum/style.css"(rel "stylesheet"); + == + ;body + ;* children + ;div.footer + ; Hosted on + ;a/"https://urbit.org/get-started": ~Urbit + ; . + == + == + == +-- diff --git a/backupdesk/web/pages/index.hoon b/backupdesk/web/pages/index.hoon new file mode 100644 index 0000000..99e49d0 --- /dev/null +++ b/backupdesk/web/pages/index.hoon @@ -0,0 +1,15 @@ +/- sur=nostrill +/= comps /web/components/components +|_ [=state-0:sur =bowl:gall] +++ $ + ^- manx + ;main + ;div#index-top.f.g1 + ;div:"Popular" + ;div.active:"Latest" + == + ;div.thread-list + ;p:"Hey" + == + == +-- diff --git a/backupdesk/web/router.hoon b/backupdesk/web/router.hoon new file mode 100644 index 0000000..3cd5b5e --- /dev/null +++ b/backupdesk/web/router.hoon @@ -0,0 +1,43 @@ +/- sur=nostrill +/+ lib=nostrill, sr=sortug +/+ server +:: pages and components +/= layout /web/layout +/= navbar /web/components/navbar +/= index /web/pages/index +:: assets +/* css %css /web/assets/style/css +/* spinner %noun /web/assets/spinner/svg +/* favicon %noun /web/assets/favicon/ico +/* favicon1 %noun /web/assets/favicon-32x32/png +/* favicon2 %noun /web/assets/favicon-16x16/png +:: +|% ++$ order [id=@ta req=inbound-request:eyre] +++ json-body json-to-octs:server +++ ebail |= id=@t %- give-simple-payload:app:server [id pbail] +++ pbail + %- html-response:gen:server + %- manx-to-octs:server + manx-bail +++ manx-bail ^- manx ;div:"404" +++ manx-payload + |= =manx + ^- simple-payload:http + %- html-response:gen:server + %- manx-to-octs:server manx +:: main +++ router + |_ [=state:sur =bowl:gall] + ++ rout + |= =order + ^- (list card:agent:gall) + =/ rl (parse-request-line:server url.request.req.order) + =. site.rl ?~ site.rl ~ t.site.rl + =/ met method.request.req.order + =/ fpath=(pole knot) [met site.rl] + |^ + ~ + -- + -- +-- diff --git a/desk/app/nostrill.hoon b/desk/app/nostrill.hoon new file mode 100644 index 0000000..575fa3e --- /dev/null +++ b/desk/app/nostrill.hoon @@ -0,0 +1,254 @@ +/- sur=nostrill, nsur=nostr +/+ lib=nostrill, nlib=nostr, sr=sortug, + shim, dbug, muta=nostrill-mutations, jsonlib=json-nostrill, + trill=trill-post +/= web /web/router +|% ++$ versioned-state $%(state-0:sur) +-- +=| versioned-state +=* state - +%- agent:dbug +^- agent:gall +|_ =bowl:gall ++* this . + rout ~(. router:web [state bowl]) + cards ~(. cards:lib bowl) + mutat ~(. muta [state bowl]) + shimm ~(. shim [state bowl]) +++ on-init + ^- (quip card:agent:gall agent:gall) + =/ default (default-state:lib bowl) + :_ this(state default) + :~ shim-binding:cards + == +:: +++ on-save + ^- vase + !>(state) +:: +++ on-load + |~ old-state=vase + ^- (quip card:agent:gall agent:gall) + =/ old-state !<(versioned-state old-state) + ?- -.old-state + %0 `this(state old-state) + == +:: +++ on-poke + |~ [=mark =vase] + ^- (quip card:agent:gall agent:gall) + |^ + ?+ mark `this + %noun debug + %json on-ui + %handle-http-request handle-shim + == + :: handling shim events + ++ handle-shim + =/ order !<(order:web vase) + :: ~& request.req.order + ?: .=(url.request.req.order '/nostr-shim') + =/ msg (parse-msg:shim order) + ?~ msg `this + ?> ?=(%ws -.u.msg) + :: =^ cards state (handle-shim-msg:mutat u.msg) + =^ cards state (handle-ws:mutat +.u.msg) + [cards this] + + :: + :_ this (rout:rout order) + + :: + ++ on-ui + =/ jon=json !<(json vase) + ~& > on-ui-jon=jon + =/ upoke=(unit poke:ui:sur) (ui:de:jsonlib jon) + ?~ upoke ~& bad-ui-poke=jon `this + ?- -.u.upoke + %keys handle-cycle-keys + %fols (handle-fols +.u.upoke) + %prof (handle-prof +.u.upoke) + %post (handle-post +.u.upoke) + %rela (handle-rela +.u.upoke) + == + ++ handle-cycle-keys + =/ ks (gen-keys:nlib eny.bowl) + =. keys [ks keys] + :: =/ nkeys keys(i ks, t `(list keys:nsur)`keys) + :: :: =. keys nkeys + ~& new-keys=keys + `this + + ++ handle-post |= poke=post-poke:ui:sur + ?- -.poke + %add + =/ sp (build-sp:trill our.bowl our.bowl content.poke) + =/ p (build-post:trill now.bowl pubkey.poke sp) + =. state (add-to-feed:mutat p) + `this + %rt `this + %del `this + == + ++ handle-fols |= poke=fols-poke:ui:sur + `this + ++ handle-prof |= poke=prof-poke:ui:sur + ?- -.poke + %add + =. profiles (~(put by profiles) +<.poke +>.poke) + `this + %del + =. profiles (~(del by profiles) +.poke) + `this + == + ++ handle-rela |= poke=relay-poke:ui:sur + ?- -.poke + %send + =/ upoast (get-poast:mutat host.poke id.poke) + ?~ upoast `this + =/ event (post-to-event:lib i.keys eny.bowl u.upoast) + =/ req=bulk-req:shim:nsur [relays.poke %event event] + =/ cards :~((send:shimm req)) + [cards this] + == + + + :: + ++ debug + =/ noun !<(* vase) + ?+ noun `this + %wtf + =/ lol=(unit @) ~ + =/ l ~| "wtf" (need lol) + `this + %genkey + =/ keys (gen-keys:nlib eny.bowl) + ~& keys=keys + `this + %printkey + =/ key i.keys + ~& pub=(scow:sr %ux -.key) + ~& priv=(scow:sr %ux +.key) + `this + %feed + =/ lol debug-own-feed:mutat + `this + %nstats + ~& nostr-feed=~(wyt by nostr-feed) + ~& profiles=~(wyt in ~(key by profiles)) + =/ lol (print-relay-stats:lib relays) + + `this + %http + ~& pending=pending + `this + %rt :: relay test + =^ cards state get-posts:shimm + [cards this] + %rt0 + =/ ids + %+ roll (tap:norm:sur nostr-feed) |= [[@ ev=event:nsur] acc=[(set @ux) (set @ux)]] + ?. .=(kind.ev 1) acc + %= acc + - (~(put in -.acc) id.ev) + + (~(put in +.acc) pubkey.ev) + == + =^ cards state (populate-profiles:mutat -.ids) + :: (get-profiles:shimm +.ids) + :: (get-engagement:shimm -.ids) + [cards this] + %rt1 + =/ l ~(tap by pending) + =/ l (scag 1 l) + =| cards=(list card:agent:gall) + |- + ?~ l + ~& cards=(lent cards) [cards this] + =/ [sub-id=@t pf=filter:nsur done=filter:nsur] i.l + =/ diff (diff-filters:nlib pf done) + :: ~& > diff=diff + ?~ authors.pf $(l t.l) + =^ cs state (populate-profiles:mutat u.authors.pf) + + $(l t.l, cards (weld cards cs)) + %rt2 + + =/ poasts (tap:norm:sur nostr-feed) + =/ pcount (lent poasts) + =| invalid=(list @t) + |- ?~ poasts + ~& >>> invalid=invalid + `this + =/ p=event:nsur +.i.poasts + =/ valid (validate-pubkey:nlib pubkey.p) + ?. valid + =/ ids (crip (scow:sr %ux id.p)) + ~& ids + ~& content.p + $(invalid [ids invalid], poasts t.poasts) + $(poasts t.poasts) + %rt3 + =/ poasts (tap:norm:sur nostr-feed) + =| pubkeys=(set @ux) + =/ pks=(set @ux) + |- ?~ poasts pubkeys + =/ p=event:nsur +.i.poasts + =/ npks (~(put in pubkeys) pubkey.p) + $(poasts t.poasts, pubkeys npks) + :: + =^ cards state (populate-profiles:mutat pks) + [cards this] + == + + :: + -- +:: +++ on-watch +|= =(pole knot) + ?> .=(our.bowl src.bowl) + ?+ pole !! + [%ui ~] + :_ this + =/ jon (state:en:jsonlib state) + [%give %fact ~ [%json !>(jon)]]^~ + == +:: +++ on-leave + |~ =(pole knot) + ^- (quip card:agent:gall agent:gall) + `this +:: +++ on-peek + |~ =(pole knot) + ^- (unit (unit cage)) + ~& > on-peek=pole + ?+ pole ~ + [%j %feed rest=*] ~ + [%j %post rest=*] ~ + == +:: +++ on-agent + |~ [wire sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + `this +:: +++ on-arvo + |~ [wire=(pole knot) =sign-arvo] + ^- (quip card:agent:gall agent:gall) + ?+ wire `this + [%http sub-id=@t *] + ?> ?=([%khan %arow *] sign-arvo) + ?: ?=(%| -.p.sign-arvo) `this + =/ jstring !<(@ +>.p.sign-arvo) + =/ msg (parse-body:shimm jstring) + ?~ msg ~& `@t`jstring `this + ?> ?=(%http -.u.msg) + =^ cards state (handle-http:mutat sub-id.wire +.u.msg) + `this + == +:: +++ on-fail + |~ [term tang] + ^- (quip card:agent:gall agent:gall) + `this +-- diff --git a/desk/desk.bill b/desk/desk.bill index 9611612..ddea07e 100644 --- a/desk/desk.bill +++ b/desk/desk.bill @@ -1,2 +1,2 @@ -:~ %nostril +:~ %nostrill == diff --git a/desk/desk.docket-0 b/desk/desk.docket-0 index 1eee1d5..e30a841 100644 --- a/desk/desk.docket-0 +++ b/desk/desk.docket-0 @@ -8,4 +8,4 @@ image+'https://s3.sortug.com/img/nostril-icon.png' base+'nostril' glob-http+['https://s3.sortug.com/globs/glob-0v1.862v7.o85ao.krj6r.v1dgc.ek27l.glob' 0v1.862v7.o85ao.krj6r.v1dgc.ek27l] -== +==
\ No newline at end of file diff --git a/desk/desk.ship b/desk/desk.ship index 56a71f3..2d56596 100644 --- a/desk/desk.ship +++ b/desk/desk.ship @@ -1 +1 @@ -~polwex +~polwex
\ No newline at end of file diff --git a/desk/lib/constants.hoon b/desk/lib/constants.hoon new file mode 100644 index 0000000..c7f72b7 --- /dev/null +++ b/desk/lib/constants.hoon @@ -0,0 +1,3 @@ +|% +++ http-delay 3.000 +-- diff --git a/desk/lib/json/common.hoon b/desk/lib/json/common.hoon index 64d4b03..0ed54cd 100644 --- a/desk/lib/json/common.hoon +++ b/desk/lib/json/common.hoon @@ -5,7 +5,8 @@ |% ++ cord |= s=@t ^- json s+s ++ hex |= h=@ux ^- json - [%s (crip (scow:sr %ux h))] + =/ scoww scow:sr + [%s (crip (scoww(min-chars 64) %ux h))] ++ b64 |= h=@uv ^- json [%s (crip (scow:sr %uv h))] ++ ud |= n=@ ^- json diff --git a/desk/lib/json/nostr.hoon b/desk/lib/json/nostr.hoon index aa5952a..9c36eb0 100644 --- a/desk/lib/json/nostr.hoon +++ b/desk/lib/json/nostr.hoon @@ -2,29 +2,39 @@ /+ common=json-common, sr=sortug |% ++ en -=, enjs:format +=, enjs:format |% :: shim comms - ++ req |= =req:shim:sur ^- json - %+ frond -.req - ?- -.req - %get (get +.req) - %post (post +.req) - == - ++ get |= rs=get:shim:sur - :- %a %+ turn rs |= [r=@t fs=(list filter:sur)] + ++ bulk-req |= [relays=(list @t) r=req:shim:sur] ^- json + %+ frond %ws %: pairs - relay+s+r - filters+a+(turn fs filter) + relays+a+(turn relays cord:en:common) + req+(req r) ~ == - :: - ++ post |= p=post:shim:sur + ++ http-req |= [relay=@t delay=@ud sub-id=@t fs=(list filter:sur)] + %+ frond %http %: pairs - event+(event event.p) - relays+a+(turn relays.p cord:en:common) - ~ + relay+s+relay + delay+(numb delay) + ['subscription_id' %s sub-id] + filters+a+(turn fs filter) + ~ == + ++ req |= =req:shim:sur ^- json + :- %a :- s+(crip (cuss (trip -.req))) + ?- -.req + %req (enreq +.req) + %event :_ ~ (event +.req) + %auth :_ ~ (event +.req) + %close :_ ~ [%s +.req] + == +++ enreq + |= [sub-id=@t fs=(list filter:sur)] + ^- (list json) + :- [%s sub-id] + %+ turn fs filter + :: ++ raw-event |= raw-event:sur :: WTF nostr doesn't want the prefix on the pubkey @@ -64,33 +74,82 @@ ++ filter |= f=filter:sur ^- json =| l=(list [key=@t jon=json]) - =. l ?~ ids.f l :_ l ['ids' [%a (turn ids.f hex:en:common)]] - =. l ?~ authors.f l :_ l ['authors' [%a (turn authors.f hex:en:common)]] - =. l ?~ kinds.f l :_ l ['kinds' [%a (turn kinds.f numb)]] - =. l ?~ since.f l :_ l ['since' (numb u.since.f)] - =. l ?~ until.f l :_ l ['until' (numb u.until.f)] + =. l ?~ ids.f l :_ l ['ids' %a (turn ~(tap in u.ids.f) hex:en:common)] + =. l ?~ authors.f l :_ l ['authors' %a (turn ~(tap in u.authors.f) hex:en:common)] + =. l ?~ kinds.f l :_ l ['kinds' %a (turn ~(tap in u.kinds.f) numb)] + =. l ?~ tags.f l %+ weld l (tags u.tags.f) + + =. l ?~ since.f l :_ l ['since' (sect u.since.f)] + =. l ?~ until.f l :_ l ['until' (sect u.until.f)] =. l ?~ limit.f l :_ l ['limit' (numb u.limit.f)] + :: %- pairs l + + + ++ tags + |= tm=(map @t (set @t)) ^- (list [@t json]) :: entries to the filter obeject + %+ turn ~(tap by tm) |= [key=@t values=(set @t)] + =/ nkey (cat 3 '#' key) + [nkey %a (turn ~(tap in values) cord:en:common)] + ++ user-meta |= meta=user-meta:sur - =/ other %+ turn ~(tap by other.meta) |= [key=@t val=@t] - [key %s val] %: pairs name+s+name.meta picture+s+picture.meta about+s+about.meta - other + other+o+other.meta + ~ == -- ++ de =, dejs-soft:format |% :: shim + ++ shim-res + %- of :~ + http+(ar relay-msg) + ws+msg + == ++ msg %- ot :~ relay+so + msg+relay-msg + == + ++ relay-msg + %- of :~ + event+event-sub + ok+relay-ok + eose+so + closed+closed + notice+so + error+so + == + + + :: | { event: { subscription_id: string; event: NostrEvent } } + :: | { ok: { event_id: string; accepted: boolean; message: string } } + :: | { eose: string } + :: | { closed: { subscription_id: string; message: string } } + :: | { notice: string } + :: // this is ours + :: | { error: string }; + ++ event-sub + %- ot :~ + ['subscription_id' so] event+event == + ++ relay-ok + %- ot :~ + ['event_id' hex:de:common] + accepted+bo + message+so + == + ++ closed + %- ot :~ + ['subscription_id' so] + message+so + == ++ event %- ot :~ id+hex:de:common @@ -103,14 +162,30 @@ == ++ user-meta |= jon=json ^- (unit user-meta:sur) - =/ all ((om so) jon) - ?~ all ~ - =/ base=(unit [name=@t about=@t picture=@t]) %. jon %- ot :~ - name+so - about+so - picture+so - == - ?~ base ~ - `[name.u.base about.u.base picture.u.base u.all] + ?. ?=(%o -.jon) ~ + =| um=user-meta:sur + =/ fields ~(tap by p.jon) + |- ?~ fields (some um) + =/ k -.i.fields + =/ jn=json +.i.fields + ?+ k + =/ ot (~(put by other.um) k jn) + =. um um(other ot) $(fields t.fields) + %'name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'display_name' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'displayName' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(name u.crd)) + %'about' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + %'picture' + =/ crd (so jn) + ?~ crd $(fields t.fields) $(fields t.fields, um um(picture u.crd)) + == -- -- diff --git a/desk/lib/json/nostrill.hoon b/desk/lib/json/nostrill.hoon new file mode 100644 index 0000000..43f7708 --- /dev/null +++ b/desk/lib/json/nostrill.hoon @@ -0,0 +1,123 @@ +/- sur=nostrill, nsur=nostr, feed=trill-feed +/+ sr=sortug, common=json-common, trill=json-trill, nostr=json-nostr +|% +++ en +=, enjs:format +|% + :: UI comms + ++ state |= state-0:sur ^- json + %: pairs + relays+(en-relays relays) + key+(hex:en:common pub.i.keys) + profiles+(en-profiles profiles) + :: TODO proper cursors + feed+(feed-with-cursor:en:trill feed ~ ~) + nostr+(en-nostr-feed nostr-feed) + following+(enfollowing following) + ['followGraph' (engraph follow-graph)] + ~ + == + ++ en-nostr-feed + |= feed=nostr-feed:sur ^- json + :- %a %+ turn (tap:norm:sur feed) |= [id=@ud ev=event:nsur] + (event:en:nostr ev) + + ++ en-relays + |= r=(map @t relay-stats:nsur) ^- json + %- pairs %+ turn ~(tap by r) + |= [url=@t rs=relay-stats:nsur] + :- url %- pairs + :~ :- %connected ?~ connected.rs ~ (time u.connected.rs) + :- %reqs (relay-stats reqs.rs) + == + ++ relay-stats |= rm=(map @t event-stats:nsur) + %- pairs %+ turn ~(tap by rm) |= [sub-id=@t es=event-stats:nsur] + :: TODO do we even need this + :- sub-id (numb received.es) + + ++ en-profiles |= m=(map @ux user-meta:nsur) + %- pairs + %+ turn ~(tap by m) |= [key=@ux p=user-meta:nsur] + :- (crip (scow:sr %ux key)) (user-meta:en:nostr p) + + ++ enfollowing + |= m=(map @ux feed:feed) + ^- json + %- pairs %+ turn ~(tap by m) |= [key=@ux f=feed:feed] + :- (crip (scow:sr %ux key)) (feed:en:trill f) + + ++ engraph + |= m=(map @ux (set follow:sur)) + ^- json + %- pairs %+ turn ~(tap by m) |= [key=@ux s=(set follow:sur)] + :- (crip (scow:sr %ux key)) + :- %a %+ turn ~(tap in s) |= f=follow:sur + %- pairs + :~ pubkey+(hex:en:common pubkey.f) + name+s+name.f + :- %relay ?~ relay.f ~ s+u.relay.f + == + + + -- +++ de +=, dejs-soft:format +|% + :: ui +++ ui + %- of :~ + keys+ul + fols+ui-fols + prof+ui-prof + post+ui-post + rela+ui-relay + == +++ ui-fols + %- of :~ + add+hex:de:common + del+hex:de:common + == +++ ui-prof + %- of :~ + add+add-prof + del+hex:de:common + == +++ add-prof %- ot :~ + pubkey+hex:de:common + meta+user-meta:de:nostr +== +++ ui-post + %- of :~ + add+de-post + rt+de-rt + del+hex:de:common + == +++ de-post + %- ot :~ + pubkey+hex:de:common + content+so + == +++ de-rt + %- ot :~ + id+hex:de:common + pubkey+hex:de:common + relay+so + == +++ ui-relay + %- of :~ + send+de-relay + == +++ de-relay %- ot :~ + host+(se:de:common %p) + id+de-atom-id + relays+(ar so) + == +++ de-atom-id + |= jon=json + ?. ?=([%s @t] jon) ~ + (rush p.jon dem) + + -- + +-- + diff --git a/desk/lib/nostr.hoon b/desk/lib/nostr.hoon index c05b0eb..90eb563 100644 --- a/desk/lib/nostr.hoon +++ b/desk/lib/nostr.hoon @@ -1,6 +1,8 @@ /- sur=nostr -/+ js=json-nostr +/+ js=json-nostr, sr=sortug |% +++ gen-sub-id |= eny=@ ^- @t + %- crip (scag 60 (scow:sr %uw eny)) ++ gen-keys |= eny=@ ^- keys:sur =, secp256k1:secp:crypto =/ privkey @@ -26,4 +28,24 @@ ++ sign-event |= [priv=@ux hash=@ux eny=@] =^ sed eny (raws eny 256) (sign:schnorr:secp256k1:secp:crypto priv hash sed) + + +:: +++ validate-pubkey |= pubkey=@ux ^- ? + =/ tap (scow:sr %ux pubkey) + .= (lent tap) 64 +:: +++ diff-filters +|= [a=filter:sur b=filter:sur] ^- filter:sur + =/ ids (unit-set-dif ids.a ids.b) + =/ authors (unit-set-dif authors.a authors.b) + =/ kinds (unit-set-dif kinds.a kinds.b) + =/ tags ~ + =/ since ~ + =/ until ~ + =/ limit ~ :: TODO + [ids authors kinds tags since until limit] +++ unit-set-dif + |* [a=(unit) b=(unit)] + %^ clap a b |* [x=(set) y=(set)] (~(dif in x) y) -- diff --git a/desk/lib/nostril.hoon b/desk/lib/nostril.hoon deleted file mode 100644 index 48d4eb7..0000000 --- a/desk/lib/nostril.hoon +++ /dev/null @@ -1,28 +0,0 @@ -/- post=trill-post, nsur=nostr -/+ trill=trill-post, nostr, sr=sortug -|% -:: -++ post-to-event |= [=keys:nsur eny=@ p=post:post] ^- event:nsur - =/ cl (latest-post-content:trill contents.p) - =/ string (crip (content-list-to-md:trill cl)) - =/ ts (to-unix-secs:jikan:sr id.p) - =/ raw=raw-event:nsur [pub.keys ts 1 ~ string] - =/ event-id (hash-event:nostr raw) - =/ signature (sign-event:nostr priv.keys event-id eny) - ~& hash-and-signed=[event-id signature] - =/ =event:nsur :* - event-id - pub.keys - created-at.raw - kind.raw - tags.raw - content.raw - signature - == - event -++ cards -|_ =bowl:gall - ++ shim-binding ^- card:agent:gall - [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] - -- --- diff --git a/desk/lib/nostril/mutations.hoon b/desk/lib/nostril/mutations.hoon deleted file mode 100644 index f7de23b..0000000 --- a/desk/lib/nostril/mutations.hoon +++ /dev/null @@ -1,117 +0,0 @@ -/- sur=nostril, nsur=nostr, - post=trill-post, gate=trill-gate, feed=trill-feed - -/+ appjs=json-nostril, - njs=json-nostr, - postlib=nostril-post, - sr=sortug - -|_ [=state:sur =bowl:gall] -++ debug-own-feed - =/ postlist (tap:orm:feed feed.state) - =/ lol - |- ?~ postlist ~ - ~& >> poast=+.i.postlist - $(postlist t.postlist) - ~ -:: TODO not a mutation but fuck it -++ get-poast |= [host=@p id=@] ^- (unit post:post) - =/ poast ?: .=(host our.bowl) - (get:orm:feed feed.state id) - ~ - poast - -:: state -++ add-to-feed |= p=post:post - =. feed.state (put:orm:feed feed.state id.p p) - state -:: events -++ process-events ^- (quip card _state) - :: =/ l events.state - :: =| cards=(list card:agent:gall) - :: |- ?~ l [cards state] - :: =/ n (event-parsing i.l) - :: $(cards -.n, state +.n, l t.l) - :: TODO - `state - -++ event-parsing - |= =event:nsur - ^- (quip card _state) - |^ -:: https://nostrdata.github.io/kinds/ - ?: .=(kind.event 0) :: user metadata - parse-metadata - ?: .=(kind.event 1) :: apparently a poast - parse-poast - ?: .=(kind.event 3) :: follow list - parse-follow - :: ?: .=(kind.event 5) :: delete - ?: .=(kind.event 6) :: RT - parse-follow - ?: .=(kind.event 7) :: Reaction - parse-follow - - `state - - ++ parse-metadata - ^- (quip card _state) - =/ jstring content.event - =/ ujon (de:json:html jstring) - ?~ ujon !! - =/ umeta (user-meta:de:njs u.ujon) - ?~ umeta `state - =. profiles.state (~(put by profiles.state) pubkey.event u.umeta) - `state - - - ++ parse-poast - ^- (quip card _state) - =/ fid (~(get by following.state) pubkey.event) - ?~ fid `state :: don't save post if we don't follow the fucker - - =/ cl (tokenize:postlib content.event) - - =/ ts (from-unix:jikan:sr created-at.event) - :: TODO wtf - =/ cm=content-map:post (init-content-map:postlib cl ts) - - =/ p=post:post :* - id=ts - host=`@p`pubkey.event - author=`@p`pubkey.event - thread=ts - parent=~ - children=~ - contents=cm - read=*lock:gate - write=*lock:gate - *engagement:post - 0v0 - *signature:post - tags=~ - == - =/ nfid (put:orm:feed u.fid ts p) - =. following.state (~(put by following.state) pubkey.event nfid) - `state - - - ++ parse-follow - ^- (quip card _state) - =/ following (~(get by follow-graph.state) pubkey.event) - =/ follow-set ?~ following *(set follow:sur) u.following - |- ?~ tags.event `state - =/ t=tag:nsur i.tags.event - :: ?. .=('p' key.t) $(tags.event t.tags.event) - :: =/ pubkeys value.t - :: =/ pubkey (slaw:sr %ux pubkeys) - :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event) - :: =/ relay (snag 0 rest.t) - :: =/ rel ?: .=(relay '') ~ (some relay) - :: =/ nickname (snag 1 rest.t) - :: =/ meta=follow:sur [u.pubkey nickname rel] - :: =. follow-set (~(put in follow-set) meta) - :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set) - $(tags.event t.tags.event) - -- --- diff --git a/desk/lib/nostrill.hoon b/desk/lib/nostrill.hoon new file mode 100644 index 0000000..c7e940c --- /dev/null +++ b/desk/lib/nostrill.hoon @@ -0,0 +1,55 @@ +/- post=trill-post, nsur=nostr, sur=nostrill +/+ trill=trill-post, nostr, sr=sortug +|% +:: +++ default-state |= =bowl:gall ^- state:sur + =/ s *state-0:sur + =/ l public-relays:nsur + =/ l (scag 1 l) + :: =/ l ~['wss://relay.damus.io' 'wss://nos.lol'] + =/ rl %+ turn l |= t=@t [t *relay-stats:nsur] + :: =/ l ~[['wss://relay.damus.io' ~]] + =/ key (gen-keys:nostr eny.bowl) + =/ keyl [key ~] + s(relays (malt rl), keys keyl) + +++ print-relay-stats + |= rm=(map @t relay-stats:nsur) + =/ l ~(tap by rm) + |- ?~ l ~ + =/ [url=@t rs=relay-stats:nsur] i.l + ~& relay=url + ~& connected=connected.rs + ~& sub-count=~(wyt by reqs.rs) + =/ total-received + %+ roll ~(tap by reqs.rs) + |= [[* es=event-stats:nsur] acc=@ud] + %+ add acc received.es + ~& >> total=total-received + $(l t.l) + +:: +++ post-to-event |= [=keys:nsur eny=@ p=post:post] ^- event:nsur + =/ cl (latest-post-content:trill contents.p) + =/ string (crip (content-list-to-md:trill cl)) + =/ ts (to-unix-secs:jikan:sr id.p) + =/ raw=raw-event:nsur [pub.keys ts 1 ~ string] + =/ event-id (hash-event:nostr raw) + =/ signature (sign-event:nostr priv.keys event-id eny) + ~& hash-and-signed=[event-id signature] + =/ =event:nsur :* + event-id + pub.keys + created-at.raw + kind.raw + tags.raw + content.raw + signature + == + event +++ cards +|_ =bowl:gall + ++ shim-binding ^- card:agent:gall + [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] + -- +-- diff --git a/desk/lib/nostrill/mutations.hoon b/desk/lib/nostrill/mutations.hoon new file mode 100644 index 0000000..4dda095 --- /dev/null +++ b/desk/lib/nostrill/mutations.hoon @@ -0,0 +1,251 @@ +/- sur=nostrill, nsur=nostr, + post=trill-post, gate=trill-gate, feed=trill-feed + +/+ appjs=json-nostrill, + njs=json-nostr, + postlib=trill-post, + shim, + sr=sortug + +|_ [=state:sur =bowl:gall] ++$ card card:agent:gall +++ debug-own-feed + =/ postlist (tap:orm:feed feed.state) + =/ lol + |- ?~ postlist ~ + ~& >> poast=+.i.postlist + $(postlist t.postlist) + ~ +:: TODO not a mutation but fuck it +++ get-poast |= [host=@p id=@] ^- (unit post:post) + =/ poast ?: .=(host our.bowl) + (get:orm:feed feed.state id) + ~ + poast + +:: state +++ add-to-feed |= p=post:post + =. feed.state (put:orm:feed feed.state id.p p) + state +:: events +++ process-events ^- (quip card _state) + :: =/ l events.state + :: =| cards=(list card:agent:gall) + :: |- ?~ l [cards state] + :: =/ n (event-parsing i.l) + :: $(cards -.n, state +.n, l t.l) + :: TODO + `state + +:: ++ parse-events +:: |= evs=(list event:nsur) +:: ^- (quip card _state) +:: =| cards=(list card) +:: =^ cards state +:: |- ?~ evs [cards state] +:: =^ cards state (handle-event i.evs) +:: $(evs t.evs) +:: [cards state] + +++ populate-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ shimm ~(. shim [state bowl]) + =^ cards state (get-profiles-http:shimm pubkeys) + [cards state] + + + + +:: ++ handle-shim-msg |= msg=res:shim:nsur +:: ^- (quip card _state) +:: ?- -.msg +:: %ws (handle-ws +.msg) +:: %http (handle-http +.msg) +:: == + +++ handle-http + |= [sub-id=@t msgs=(list relay-msg:nsur)] + ~& handling-http=[sub-id (lent msgs)] + =| cards=(list card) + |- ?~ msgs [cards state] + =^ cards state (handle-msg i.msgs) + $(msgs t.msgs) + + +++ handle-msg |= msg=relay-msg:nsur + ^- (quip card _state) + ?+ -.msg `state + %event + (handle-event '' sub-id.msg event.msg) + %eose + `state + %closed + `state + %auth ~& >> auth=+.msg :: TODO handle auth challenges? + `state + %notice ~& >> notice=+.msg :: TODO pass to UI? + `state + %error ~& >>> relay-error=+.msg + `state + == + +++ handle-ws |= [relay=@t msg=relay-msg:nsur] + =/ rs (~(get by relays.state) relay) + ?~ rs `state + =^ cards state + ?- -.msg + %ok (handle-ok relay +.msg) + %event + =. relays.state (update-relay-stats relay sub-id.msg) + (handle-event relay sub-id.msg event.msg) + + %eose + :: TODO do unsub for replaceable/addressable events + :: =/ creq (~(get by reqs.u.rs) +.msg) + :: ?~ creq `state + :: =. reqs.u.rs (~(del by reqs.u.rs) +.msg) + :: =. relays.state (~(put by relays.state) relay u.rs) + `state + %closed =. reqs.u.rs (~(del by reqs.u.rs) sub-id.msg) + =. relays.state (~(put by relays.state) relay u.rs) + `state + %auth ~& >> auth=+.msg :: TODO handle auth challenges? + `state + %notice ~& >> notice=+.msg :: TODO pass to UI? + `state + %error ~& >>> relay-error=+.msg + =. relays.state (~(del by relays.state) relay) + `state + == + [cards state] + + + :: =^ cards state (handle-event:mutat url.u.msg sub-id.u.msg event.u.msg) + :: :: TODO not just stash events + :: =/ relay (~(get by relays) url.u.msg) + :: =/ nevents=(list event:nsur) ?~ relay [event.u.msg ~] [event.u.msg u.relay] + :: =/ nevents2 (scag 100 nevents) + + :: =. relays (~(put by relays) url.u.msg nevents2) + :: :: TODO respond better + :: =/ response (ebail:rout id.order) + :: =/ ncards (weld cards response) + + :: [ncards this] + :: `state + +++ update-relay-stats + |= [relay=@t sub-id=@t] ^+ relays.state + + =/ cur (~(get by relays.state) relay) + =/ curr ?~ cur *relay-stats:nsur u.cur + =? connected.curr ?=(%~ connected.curr) (some now.bowl) + =/ creq (~(get by reqs.curr) sub-id) + ?~ creq relays.state :: bail + =/ nreq u.creq(received +(received.u.creq)) + =. reqs.curr (~(put by reqs.curr) sub-id nreq) + (~(put by relays.state) relay curr) + +++ handle-ok |= [relay=@t event-id=@ux accepted=? msg=@t] + ^- (quip card _state) + :: TODO pass to UI + `state + + +++ handle-event + |= [relay=@t sub-id=@t =event:nsur] + ^- (quip card _state) + |^ + ~& parsing-nostr-event=kind.event +:: https://nostrdata.github.io/kinds/ + ?: .=(kind.event 666) :: one_off subs eose cf. 999 + parse-shim-oneose + ?: .=(kind.event 0) :: user metadata + parse-metadata + ?: .=(kind.event 1) :: apparently a poast + parse-poast + ?: .=(kind.event 3) :: follow list + parse-follow + :: ?: .=(kind.event 5) :: delete + ?: .=(kind.event 6) :: RT + parse-follow + ?: .=(kind.event 7) :: Reaction + parse-follow + + `state + + ++ parse-metadata + ^- (quip card _state) + =/ jstring content.event + =/ ujon (de:json:html jstring) + ?~ ujon ~& failed-parse-metadata=ujon `state + =/ umeta (user-meta:de:njs u.ujon) + ?~ umeta ~& >> failed-dejs-metadata=ujon `state + =. profiles.state (~(put by profiles.state) pubkey.event u.umeta) + `state + + + ++ parse-poast + ^- (quip card _state) + =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event) + :: =/ uprof (~(get by profiles.state) pubkey.event) + :: ?~ uprof + :: =/ shimm ~(. shim [state bowl]) + :: =^ cards state (get-profiles:shimm (silt ~[pubkey.event])) + :: [cards state] + + + :: =/ fid (~(get by following.state) pubkey.event) + :: ?~ fid `state :: don't save post if we don't follow the fucker + + :: =/ cl (tokenize:postlib content.event) + + :: =/ ts (from-unix:jikan:sr created-at.event) + :: :: TODO wtf + :: =/ cm=content-map:post (init-content-map:postlib cl ts) + + :: =/ p=post:post :* + :: id=ts + :: host=`@p`pubkey.event + :: author=`@p`pubkey.event + :: thread=ts + :: parent=~ + :: children=~ + :: contents=cm + :: read=*lock:gate + :: write=*lock:gate + :: *engagement:post + :: 0v0 + :: *signature:post + :: tags=~ + :: == + :: =/ nfid (put:orm:feed u.fid ts p) + :: =. following.state (~(put by following.state) pubkey.event nfid) + `state + ++ parse-follow + ^- (quip card _state) + =/ following (~(get by follow-graph.state) pubkey.event) + =/ follow-set ?~ following *(set follow:sur) u.following + |- ?~ tags.event `state + =/ t=tag:nsur i.tags.event + :: ?. .=('p' key.t) $(tags.event t.tags.event) + :: =/ pubkeys value.t + :: =/ pubkey (slaw:sr %ux pubkeys) + :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event) + :: =/ relay (snag 0 rest.t) + :: =/ rel ?: .=(relay '') ~ (some relay) + :: =/ nickname (snag 1 rest.t) + :: =/ meta=follow:sur [u.pubkey nickname rel] + :: =. follow-set (~(put in follow-set) meta) + :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set) + $(tags.event t.tags.event) + ++ parse-shim-oneose + ^- (quip card _state) + =/ rs (~(get by relays.state) relay) + ?~ rs `state + =. reqs.u.rs (~(del by reqs.u.rs) sub-id) + =. relays.state (~(put by relays.state) relay u.rs) + `state + -- +-- diff --git a/desk/lib/shim.hoon b/desk/lib/shim.hoon index be95b70..4afdf2b 100644 --- a/desk/lib/shim.hoon +++ b/desk/lib/shim.hoon @@ -1,23 +1,115 @@ -/- sur=nostr -/+ js=json-nostr +/- sur=nostrill, nsur=nostr +/+ js=json-nostr, sr=sortug, nlib=nostr, constants /= web /web/router -|% +|_ [=state:sur =bowl:gall] -++ handle ++$ card card:agent:gall +++ parse-msg |= [eyre-id=@ta req=inbound-request:eyre] - ^- (unit [url=@ event=event:sur]) + ^- (unit res:shim:nsur) ?~ body.request.req ~ =/ jstring q.u.body.request.req + (parse-body jstring) +++ parse-body |= jstring=@t =/ ures (de:json:html jstring) ?~ ures ~ - (msg:de:js u.ures) + (shim-res:de:js u.ures) +:: __ +++ get-req |= fs=(list filter:nsur) + ^- [bulk-req:shim:nsur _state] + =/ rls ~(tap by relays.state) + =| urls=(list @t) + =/ sub-id (gen-sub-id:nlib eny.bowl) + =/ =req:shim:nsur [%req sub-id fs] + |- ?~ rls [[urls req] state] + :: build http card + =/ [url=@t rs=relay-stats:nsur] i.rls + :: mutate relays stats + =/ es=event-stats:nsur [fs 0] + =/ nreqs (~(put by reqs.rs) sub-id es) + =/ nrs rs(reqs nreqs) + =. relays.state (~(put by relays.state) url nrs) + $(urls [url urls], rls t.rls) + +++ get-posts + ^- (quip card _state) + =/ kinds (silt ~[1]) + =/ last-week (sub now.bowl ~d7) + :: =/ since (to-unix-secs:jikan:sr last-week) + =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ kinds (silt ~[0]) + =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + =^ req=bulk-req:shim:nsur state (get-req ~[filter]) + :- :~((send req)) state + +++ get-engagement + |= post-ids=(set @ux) + ^- (quip card _state) + =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) + =/ =filter:nsur + =/ kinds (silt ~[6 7]) + =/ tags (malt :~([%e post-strings])) + [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + +++ get-quotes + |= post-id=@ux + ^- (quip card _state) + =/ post-string (crip (scow:sr %ux post-id)) + =/ kinds (silt ~[1]) + =/ tags (malt :~([%q (silt ~[post-string])])) + =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] + =^ req state (get-req ~[filter]) + :- :~((send req)) state + + ++ send - |= [desk=@tas =req:shim:sur] ^- card:agent:gall - =/ req-body (req:en:js req) + |= req=bulk-req:shim:nsur ^- card:agent:gall + =/ req-body (bulk-req:en:js req) + :: ~& shim-req-json=(en:json:html req-body) =/ headers :~ [key='content-type' value='application/json'] == - =/ =request:http [%'POST' url:shim:sur headers `(json-body:web req-body)] + =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] =/ pat /shim - [%pass (weld /ws pat) %arvo %k %fard desk %fetch %noun !>(request)] + [%pass (weld /ws pat) %arvo %k %fard dap.bowl %fetch %noun !>(request)] + +++ send-http + |= req=http-req:shim:nsur + ^- card:agent:gall + =/ req-body (http-req:en:js req) + :: ~& shim-req-json=(en:json:html req-body) + =/ headers :~ + [key='content-type' value='application/json'] + == + =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] + [%pass /http/[sub-id.req] %arvo %k %fard dap.bowl %fetch %noun !>(request)] +:: +:: HTTP +:: + +++ get-profiles-http + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ relays ~(key by relays.state) + :: TODO make a function to use most reliable + =/ relay (head ~(tap in relays)) + ~& http=relay + =/ sub-id (gen-sub-id:nlib eny.bowl) + =/ kinds (silt ~[0]) + =/ total=filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + =/ chunk (silt (scag 10 ~(tap in pubkeys))) + =/ =filter:nsur [~ `chunk `kinds ~ ~ ~ ~] + =. pending.state (~(put by pending.state) sub-id [total *filter:nsur]) + =/ req=http-req:shim:nsur [relay http-delay:constants sub-id ~[total]] + =/ =card (send-http req) + :- :~(card) state + -- diff --git a/desk/lib/sortug.hoon b/desk/lib/sortug.hoon index dad4203..eec99ae 120000..100644 --- a/desk/lib/sortug.hoon +++ b/desk/lib/sortug.hoon @@ -1 +1,146 @@ -/home/y/code/urbit/sortug/lib/sortug.hoon
\ No newline at end of file +:: Painstakingly built utility functions by Sortug Development Ltd. +:: There's more where it came from +|% +++ jikan +|% +++ from-unix |= ts=@ ^- @da + (from-unix:chrono:userlib ts) +++ to-unix-ms |= da=@da ^- @ud + (unm:chrono:userlib da) +++ to-unix-secs |= da=@da ^- @ud + (unt:chrono:userlib da) +-- +++ b64 (bass 64 (plus siw:ab)) +++ b16 (bass 16 (plus six:ab)) +++ scow +=| min-chars=@ud +|= [mod=@tas a=@] ^- tape + ?+ mod "" + %s (signed-scow a) + %ud (a-co:co a) + %ux ((x-co:co min-chars) a) + %uv ((v-co:co min-chars) a) + %uw ((w-co:co min-chars) a) + == +++ signed-scow |= a=@s ^- tape + =/ old (old:si a) + =/ num (scow %ud +.old) + =/ sign=tape ?: -.old "" "-" + "{sign}{num}" +++ slaw + |= [mod=@tas txt=@t] ^- (unit @) + ?+ mod ~ + %ud (rush txt dem) + %ux (rush txt b16) + %uv (rush txt vum:ag) + %uw (rush txt b64) + == +++ csplit |* =rule + (more rule (cook crip (star ;~(less rule next)))) +:: List utils +++ foldi + |* [a=(list) b=* c=_|=(^ +<+)] + =| i=@ud + |- ^+ b + ?~ a b + =/ nb (c i i.a b) + $(a t.a, b nb, i +(i)) +++ parsing + |% + ++ link auri:de-purl:html + ++ para + |% + ++ eof ;~(less next (easy ~)) + ++ white (mask "\09 ") + ++ blank ;~(plug (star white) (just '\0a')) + ++ hard-wrap (cold ' ' ;~(plug blank (star white))) + ++ one-space (cold ' ' (plus white)) + ++ empty + ;~ pose + ;~(plug blank (plus blank)) + ;~(plug (star white) eof) + ;~(plug blank (star white) eof) + == + ++ para + %+ ifix + [(star white) empty] + %- plus + ;~ less + empty + next + == + -- + ++ trim para:para :: from whom/lib/docu + ++ youtube + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'www.youtube.com/watch?v=') + (jest 'youtube.com/watch?v=') + (jest 'youtu.be/') + == + == + ;~ sfix + (star aln) + (star next) + == + == + ++ twatter + ;~ pfix + ;~ plug + (jest 'https://') + ;~ pose + (jest 'x.com/') + (jest 'twitter.com/') + == + (star ;~(less fas next)) + (jest '/status/') + == + ;~ sfix + (star nud) + (star next) + == + == + ++ img-set + %- silt + :~ ~.webp + ~.png + ~.jpeg + ~.jpg + ~.svg + == + ++ is-img + |= t=@ta + (~(has in img-set) t) + ++ is-image + |= url=@t ^- ? + =/ u=(unit purl:eyre) (de-purl:html url) + ?~ u .n + =/ ext p.q.u.u + ?~ ext .n + (~(has in img-set) u.ext) + -- +++ string +|% +++ replace + |= [bit=tape bot=tape =tape] + ^- ^tape + |- + =/ off (find bit tape) + ?~ off tape + =/ clr (oust [(need off) (lent bit)] tape) + $(tape :(weld (scag (need off) clr) bot (slag (need off) clr))) + :: +++ split + |= [str=tape delim=tape] + ^- (list tape) + (split-rule str (jest (crip delim))) + ++ split-rule + |* [str=tape delim=rule] + ^- (list tape) + %+ fall + (rust str (more delim (star ;~(less delim next)))) + [str ~] +-- +-- diff --git a/desk/sur/nostr.hoon b/desk/sur/nostr.hoon index 78c00ab..ff5ad6b 100644 --- a/desk/sur/nostr.hoon +++ b/desk/sur/nostr.hoon @@ -25,23 +25,81 @@ $: pubkey=@ux :: 32bytes $: name=@t about=@t picture=@t - other=(map @t @t) + other=(map @t json) +== ++$ relay-stats +$: connected=(unit @da) + reqs=(map sub-id event-stats) +== ++$ event-stats + [filters=(list filter) received=event-count] ++$ sub-id @t ++$ event-count @ud + ++$ relay-req +$: sub-id=@t + filters=(list filter) == :: Relay comms +$ filter -$: ids=(list @ux) - authors=(list @ux) - kinds=(list @ud) - tag=(unit [key=@ values=(list @t)]) - since=(unit @ud) - until=(unit @ud) - limit=(unit @ud) +$: ids=(unit (set @ux)) + authors=(unit (set @ux)) + kinds=(unit (set @ud)) + tags=(unit (map @t (set @t))) + since=(unit @da) + until=(unit @da) + limit=(unit @ud) +== +:: messages from relay +++ relay-msg +$% [%event sub-id=@t =event] + [%ok id=@ux accepted=? msg=@t] + [%eose sub-id=@t] + [%closed sub-id=@t msg=@t] + [%notice msg=@t] + [%auth challenge=@t] + :: from our shim + [%error msg=@t] == ++ shim |% ++ url 'http://localhost:8888/shim' - +$ get (list [relay=@t filters=(list filter)]) - +$ post [=event relays=(list @t)] - +$ req $%([%get get] [%post post]) + +$ req + $% [%req relay-req] + [%event =event] + [%auth =event] + [%close sub-id=@t] + == + +$ bulk-req [relays=(list @t) =req] + +$ http-req [relay=@t delay=@ud sub-id=@t filters=(list filter)] + +$ res $%([%http p=(list relay-msg)] [%ws relay=@t msg=relay-msg]) -- + +:: https://github.com/sesseor/nostr-relays-list/blob/main/relays.txt +++ public-relays ^- (list @t) + :~ 'wss://nos.lol' + :: 'wss://relay.damus.io' + :: 'wss://nostr.wine' + :: 'wss://offchain.pub' + == + :: 'wss://knostr.neutrine.com' -- +:: event: { +:: content: "😂", +:: created_at: 1758049319, +:: id: "36c8a0bb6a9a1ff3ca3e6868fdf2c055a09aea39b1c078b75c38f5a7b580da87", +:: kind: 7, +:: pubkey: "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1", +:: sig: "7b5a9c799776935f959eccfd311af6152db6a1360296c9790b35544d0b83a8d75f8937ad1ad6f5da3e0d3e2bdb1bfb92686adbde42c3ef53ca06771080d08153", +:: tags: [ +:: [ "e", "091d00811bb9a57088ab7c1d39697b0ed9bbbe05dae135b406f3560290fba311", +:: "wss://relay.nostr.band/", "root", "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1" +:: ], [ "e", "1cd926b58a1bac70adcedf38212d72ee1380e17dad1aef6bbc18782c5c540236", +:: "wss://relay.nostr.band/", "reply", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083" +:: ], [ "p", "26d6a946675e603f8de4bf6f9cef442037b70c7eee170ff06ed7673fc34c98f1", +:: "wss://nostr.bitcoiner.social/" +:: ], [ "p", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083", +:: "ws://relay.snort.social/" +:: ], [ "e", "b9a0c3b28a291d80bcb41ee730f2c48366fd2fefba0e68f9fb928bb9ca96f757" ], [ "p", "3252715543f6e43be086465129b030d47d76cf8cead4798e48864563c3375083" ] +:: ], +:: }, diff --git a/desk/sur/nostrill.hoon b/desk/sur/nostrill.hoon new file mode 100644 index 0000000..ad82661 --- /dev/null +++ b/desk/sur/nostrill.hoon @@ -0,0 +1,52 @@ +/- trill=trill-feed, nostr +|% ++$ state state-0 ++$ state-0 + $: %0 + :: nostr config + relays=(map @t relay-stats:nostr) + keys=(lest keys:nostr) :: cycled, i.keys is current one + :: own feed + feed=feed:trill + :: nostr feed from relays + =nostr-feed + :: profiles + profiles=(map @ux user-meta:nostr) + following=(map @ux =feed:trill) + follow-graph=(map @ux (set follow)) + :: for http requests + pending=(map @t [pending=filter:nostr done=filter:nostr]) + :: TODO global feed somehow? + + == ++$ nostr-feed ((mop @ud event:nostr) gth) +++ norm ((on @ud event:nostr) gth) ++$ follow [pubkey=@ux name=@t relay=(unit @t)] +++ ui + |% + +$ poke + $% [%fols fols-poke] + [%post post-poke] + :: [%reac reac-poke] + [%prof prof-poke] + [%keys ~] :: cycle-keys + [%rela relay-poke] + == + +$ post-poke + $% [%add pubkey=@ux content=@t] + [%rt id=@ux pubkey=@ux relay=@t] :: NIP-18 + [%del pubkey=@ux] + == + +$ fols-poke + $% [%add pubkey=@ux] + [%del pubkey=@ux] + == + +$ prof-poke + $% [%add pubkey=@ux meta=user-meta:nostr] + [%del pubkey=@ux] + == + +$ relay-poke + $% [%send host=@p id=@ relays=(list @t)] + == + -- +-- diff --git a/desk/ted/fetch.hoon b/desk/ted/fetch.hoon index 6444ca7..e876511 100644 --- a/desk/ted/fetch.hoon +++ b/desk/ted/fetch.hoon @@ -6,7 +6,6 @@ ^- thread:spider |= arg=vase =/ request ;;(request:http q.arg) - ~& req=request =/ m (strand ,vase) ^- form:m :: =/ m (strand ,json) ^- form:m ;< ~ bind:m (send-request:strandio request) @@ -19,6 +18,4 @@ :: ?~ full-file.res (strand-fail:strand %no-body ~) =/ body=@t q.data.u.full-file.res - :: ~& resbody=body - =/ json [%s body] - (pure:m !>(json)) + (pure:m !>(body)) diff --git a/desk/web/assets/favicon.ico b/desk/web/assets/favicon.ico Binary files differindex 0369d8a..110004a 100644 --- a/desk/web/assets/favicon.ico +++ b/desk/web/assets/favicon.ico diff --git a/desk/web/components/navbar.hoon b/desk/web/components/navbar.hoon index 46b93d4..0c87f80 100644 --- a/desk/web/components/navbar.hoon +++ b/desk/web/components/navbar.hoon @@ -1,4 +1,4 @@ -/- sur=nostril +/- sur=nostrill /= sig /web/components/sigil/sigil :: |_ [=state:sur =bowl:gall] diff --git a/desk/web/pages/index.hoon b/desk/web/pages/index.hoon index f385df7..99e49d0 100644 --- a/desk/web/pages/index.hoon +++ b/desk/web/pages/index.hoon @@ -1,4 +1,4 @@ -/- sur=nostril +/- sur=nostrill /= comps /web/components/components |_ [=state-0:sur =bowl:gall] ++ $ diff --git a/desk/web/router.hoon b/desk/web/router.hoon index 0782b7d..3cd5b5e 100644 --- a/desk/web/router.hoon +++ b/desk/web/router.hoon @@ -1,5 +1,5 @@ -/- sur=nostril -/+ lib=nostril, sr=sortug +/- sur=nostrill +/+ lib=nostrill, sr=sortug /+ server :: pages and components /= layout /web/layout diff --git a/shim/ws-shim/src/client.ts b/shim/ws-shim/src/client.ts index b7df3e9..c261f60 100644 --- a/shim/ws-shim/src/client.ts +++ b/shim/ws-shim/src/client.ts @@ -13,6 +13,8 @@ export class Relay { private messageQueue: ClientMessage[] = []; private reconnectTimer: Timer | null = null; private reconnectAttempts = 0; + private recentDisconnects = 0; + private disconnectTimer: Timer | null = null; private maxReconnectAttempts = 5; private reconnectDelay = 1000; @@ -21,14 +23,22 @@ export class Relay { public onconnect?: () => void; public ondisconnect?: () => void; + public onfailure?: () => void; public onerror?: (error: Error) => void; public onnotice?: (message: string) => void; + public onmsg: (message: RelayMessage) => void; - constructor(url: string) { + constructor(url: string, onmsg: (msg: RelayMessage) => void) { this.url = url; + this.onmsg = onmsg; } async connect(): Promise<void> { + // console.log("connecting to ws", { + // url: this.url, + // tries: this.reconnectAttempts, + // bad: this.recentDisconnects, + // }); return new Promise((resolve, reject) => { if (this.ws?.readyState === WebSocket.OPEN) { resolve(); @@ -82,11 +92,26 @@ export class Relay { } private attemptReconnect(): void { - if (this.reconnectAttempts >= this.maxReconnectAttempts) { + if ( + this.reconnectAttempts >= this.maxReconnectAttempts || + this.recentDisconnects >= this.maxReconnectAttempts + ) { this.status = "error"; + this.onfailure?.(); this.onerror?.(new Error("Max reconnection attempts reached")); return; } + if (this.disconnectTimer) { + clearTimeout(this.disconnectTimer); + this.disconnectTimer = null; + } + + this.recentDisconnects = this.recentDisconnects + 1; + const ddelay = 10_000; + this.disconnectTimer = setTimeout(() => { + console.log("resetting disconnect timer"); + this.recentDisconnects = 0; + }, ddelay); this.reconnectAttempts++; const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1); @@ -118,6 +143,7 @@ export class Relay { private handleMessage(data: string): void { try { const message = JSON.parse(data) as RelayMessage; + this.onmsg(message); switch (message[0]) { case "EVENT": { @@ -135,6 +161,7 @@ export class Relay { if (!success) { console.error(`Event ${eventId} rejected: ${messag}`); } + break; } @@ -147,6 +174,8 @@ export class Relay { case "CLOSED": { const [, subscriptionId, messag] = message; + const subscription = this.subscriptions.get(subscriptionId); + subscription?.onclose?.(messag); this.subscriptions.delete(subscriptionId); console.log(`Subscription ${subscriptionId} closed: ${messag}`); break; @@ -178,8 +207,13 @@ export class Relay { handlers: { onevent?: (event: NostrEvent) => void; oneose?: () => void; + onclose?: (message: string) => void; }, ): () => void { + // TODO mmm + const has = this.subscriptions.has(id); + if (has) return () => {}; + // const subscription: Subscription = { id, filters, diff --git a/shim/ws-shim/src/lib.ts b/shim/ws-shim/src/lib.ts new file mode 100644 index 0000000..ec61a90 --- /dev/null +++ b/shim/ws-shim/src/lib.ts @@ -0,0 +1,38 @@ +import type { RelayMessage, ShimRequest, ShimResponse } from "./types"; + +export function parseRelayMsg(message: RelayMessage): ShimResponse["msg"] { + switch (message[0]) { + case "EVENT": { + const [, subscription_id, event] = message; + return { event: { subscription_id, event } }; + } + + case "OK": { + const [, event_id, accepted, msg] = message; + return { ok: { event_id, accepted, message: msg } }; + } + + case "EOSE": { + const [, subscriptionId] = message; + return { eose: subscriptionId }; + } + + case "CLOSED": { + const [, subscription_id, msg] = message; + return { closed: { subscription_id, message: msg } }; + } + + case "NOTICE": { + const [, messag] = message; + return { notice: messag }; + } + + case "AUTH": { + const [, challenge] = message; + return { auth: challenge }; + } + } +} +export function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/shim/ws-shim/src/nostr.ts b/shim/ws-shim/src/nostr.ts index 0b084b6..b123bc8 100644 --- a/shim/ws-shim/src/nostr.ts +++ b/shim/ws-shim/src/nostr.ts @@ -1,4 +1,4 @@ -import { finalizeEvent, validateEvent, verifyEvent } from "nostr-tools"; +import { finalizeEvent, nip19, validateEvent, verifyEvent } from "nostr-tools"; import type { NostrEvent } from "./types"; import { hexToBytes } from "nostr-tools/utils"; @@ -22,3 +22,9 @@ export function validate(event: NostrEvent) { console.log("is verified?", ok2); return ok && ok2; } + +export function checkPubkey(pubkey: string): boolean { + const npub = nip19.npubEncode(pubkey); + console.log({ npub, hex: pubkey }); + return false; +} diff --git a/shim/ws-shim/src/server.ts b/shim/ws-shim/src/server.ts index 0b807aa..f375fc7 100644 --- a/shim/ws-shim/src/server.ts +++ b/shim/ws-shim/src/server.ts @@ -32,9 +32,9 @@ let sub: number; // headers: { "Content-Type": "text/event-stream" }, // }); // } -function emit(channel: string, url: string, event?: any): void { +function emit(res: ShimResponse): void { // emitter.emit(channel, event, data); - const body = JSON.stringify({ event, relay: url }); + const body = JSON.stringify({ ws: res }); fetch(SHIP_URL + "/nostr-shim", { method: "PUT", headers: { "Content-type": "application/json" }, @@ -42,36 +42,24 @@ function emit(channel: string, url: string, event?: any): void { }); } const sockets: Map<string, Relay> = new Map(); +const unreliable: Set<string> = new Set(); const server = Bun.serve({ //http routes: { "/shim": async (req: Request) => { const data = (await req.json()) as ShimRequest; - console.log("request data", data); - if ("get" in data) { - for (const req of data.get) { - startWSClient(req.relay, req.filters); + console.log({ data }); + if ("ws" in data) { + console.log("request from urbit"); + console.dir(data, { depth: null }); + for (const relay of data.ws.relays) { + handleShimRequest(relay, data.ws.req); } + return new Response("OK"); + } else { + return oneOffClient(data.http); } - if ("post" in data) { - const ok = validate(data.post.event); - if (!ok) return; - for (const relay of data.post.relays) { - const socket = sockets.get(relay); - if (socket) socket.publishEvent(data.post.event); - else { - await startWSClient(relay, []); - - const socket = sockets.get(relay); - if (socket) socket.publishEvent(data.post.event); - else console.error("wtf man"); - } - } - } - // server.publish("shim", data); - // return sse(req, "all"); - return new Response("OK"); }, }, fetch(req, server) { @@ -136,22 +124,142 @@ const server = Bun.serve({ port: 8888, }); +export async function handleShimRequest(url: string, req: ClientMessage) { + switch (req[0]) { + case "REQ": { + const [, subscription_id, ...filters] = req; + await startWSSub(url, filters, subscription_id); + break; + } + case "EVENT": { + const [, event] = req; + const ok = validate(event); + if (!ok) break; + const socket = await getClient(url); + socket.publishEvent(event); + // socket.publishEvent(data.post.event); + // socket.disconnect(); + // sockets.delete(relay); + break; + } + case "AUTH": { + const [, event] = req; + const socket = await getClient(url); + socket.publishEvent(event); + break; + } + case "CLOSE": { + const [, subscriptionId] = req; + const socket = await getClient(url); + socket.unsubscribe(subscriptionId); + break; + } + } +} + import { Relay } from "./client"; -import type { Filter, ShimRequest } from "./types"; +import type { + ClientMessage, + Filter, + RelayMessage, + ShimHttpRequest, + ShimRequest, + ShimResponse, +} from "./types"; import { validate } from "./nostr"; -async function startWSClient(url: string, filters: Filter[]) { - console.log("connecting to relay..."); - const relay = new Relay(url); +import { parseRelayMsg, wait } from "./lib"; + +async function oneOffClient(req: ShimHttpRequest) { + const { relay: url, delay, subscription_id: subid, filters } = req; + const msgs: ShimResponse["msg"][] = []; + const relay = new Relay(url, (raw) => { + const msg = parseRelayMsg(raw); + msgs.push(msg); + }); + relay.onerror = (error) => { + console.log(url); + console.error("ws error", error); + }; + relay.ondisconnect = () => { + console.error(url, "relay disconnected"); + }; + relay.onfailure = () => { + console.error(url, "relay failed"); + unreliable.add(url); + }; + relay.onnotice = (notice) => { + console.error("on notice", notice); + // emit({ relay: url, msg: { notice } }); + }; + relay.onconnect = () => { + console.log("relay connected", url); + }; await relay.connect(); - const id = crypto.randomUUID(); - relay.subscribe(id, filters, { + for (const f of filters) { + console.dir(f, { depth: null }); + } + relay.subscribe(subid, filters, { oneose: () => { console.log("oneose"); }, - onevent(event) { - console.log("relay event", { url, event }); - emit("all", url, event); + // onevent(event) { + // console.log("relay event", { url, event }); + // }, + }); + await wait(delay); + relay.disconnect(); + return Response.json({ http: msgs }); +} + +async function getClient(url: string): Promise<Relay> { + const socket = sockets.get(url); + if (socket) { + console.log("socket present", socket.status); + if (socket.status !== "connected") await socket.connect(); + return socket; + } else { + const relay = new Relay(url, (raw) => { + const msg = parseRelayMsg(raw); + // console.log("emitting msg", msg); + emit({ relay: url, msg }); + }); + relay.onerror = (error) => { + console.log(url); + console.error("ws error", error); + emit({ relay: url, msg: { error: `${error}` } }); + }; + relay.ondisconnect = () => { + console.error(url, "relay disconnected"); + }; + relay.onfailure = () => { + console.error(url, "relay failed"); + unreliable.add(url); + emit({ relay: url, msg: { error: "failed to connect" } }); + }; + relay.onnotice = (notice) => { + console.error("on notice", notice); + emit({ relay: url, msg: { notice } }); + }; + relay.onconnect = () => { + console.log("relay connected", url); + }; + await relay.connect(); + sockets.set(url, relay); + return relay; + } +} +async function startWSSub(url: string, filters: Filter[], subId?: string) { + if (unreliable.has(url)) return; // just ignore it + + const relay = await getClient(url); + console.log("subscribing", filters); + const subid = subId ? subId : crypto.randomUUID(); + relay.subscribe(subid, filters, { + oneose: () => { + console.log("oneose"); }, + // onevent(event) { + // console.log("relay event", { url, event }); + // }, }); - sockets.set(url, relay); } diff --git a/shim/ws-shim/src/test.ts b/shim/ws-shim/src/test.ts index fb87555..e0f7784 100644 --- a/shim/ws-shim/src/test.ts +++ b/shim/ws-shim/src/test.ts @@ -1,18 +1,194 @@ import { Relay } from "./client"; const ids = [ - "1a4f2d987384a33753e777138586b1f9b3b62eb0f6e54ca1cdb42859de5625bc", + // "1a4f2d987384a33753e777138586b1f9b3b62eb0f6e54ca1cdb42859de5625bc", + "9ef9530b9601d798fcd4e29f151b16bbe4f659408a80618cdf9f2f12a8bc39c6", + "db2815575eddeed24f122de70023c861ec63d0473c40b899d8883194edf122b3", + "1ada56a84ffc94a3cd8ad68432c3cc0ed3e66ac8633226e92cc1a1686efa15a8", + "1a4e12c3c8d2c560c068ee71f51afb84eefda4ec2593ab160312265d626aaa72", + "f0907001d0349d8216c54106d7d3ae400466da204f08a29a69bd0a3d3d1f5cff", + "6a9265f37d944d64d3db918b3b5f06cd2151b428412e1d15672f4cfe16cb17ac", + "9844d8b23a5a5e51b922b25dec8e574a40a68e964fb116e1c283f045ddeb32c", + "fd0724d5238656a3a760c2b56f2eb9d9da7217936d7c51c865584e354485f664", + "1389f670203855c01f575c49f0830aabd7ed01c0fe7cab8f6ee9184393f1f067", + "ac668dc63d8aa38770ef79c2d5a98300d40e9e6daf91f3cd26b942587c70c790", + "f032c4871f82213419dc834db7c469813b1bc75b0f9256a47de90a0f7d28fac5", + "316141d2349969fe1b1d708c4045c455d2608950d7d6d32fb7f99ca622138c34", + "5e9c557df1e9e184e31ce1a8507497dbc79714aedaf4bb386981f8be4eb1dcb5", + "784e0a3af7b11279c612a94726db0056860aabb4e53c614e80fd7e02d409150f", + "4fcc1a0d933afaea7f4fe094cab42b433d0ae0748bcb55e685d5ac3da4191197", + "cf58063ffba4a0f25db862faa9f88e07177fb87c2e4c56b23303b561f7a34376", + "cd750bb5f99a89181f59234c1e5824da72dce4a0fbc87d0f29ef3e62e1de0040", + "ffcc0ed56c747a858224f3d2c122b1430a1df8648dba57544d5a50d976b504bb", + "d08be10b0338b3ab9dc49a31c8d5482289438f4dfbdb9dd844bc1b4990f1536f", + "576cbbddd18301191cca632b464092412362afbf31853d987cd461864b1328ec", + "a0ec2197b96c0e34ba04b89ee37d8fa2202bc02e77ea6a27322e7388afbc470e", + "4d4de8378e1f7238a5b00cbac70547e49a12db82121cb949459478124a799f03", + "d1ab588433fc684540d55e311f1ea4790dfcd793a66b83c5e05e34e319dd421d", + "564811aab801279ae7a473afe37557cfba61816480a5791079a1ca3bb166b038", + "fa5b72846f95271fc83966194f4e7bb63cec91d8412ea00a64f1d8ca304f9d56", + "b4e9c5d587ce36e87105e257eb9042070e415511ef58e29d40fc15e9de3a310d", + "c6c64bd7034cabb1f4d9efd47e76c7d18c631a033442b22d46c3a96614398f10", + "d0fcb5fed102c8779c23d57b4e159402ccc6297f5f8076f72865aa782713f05f", + "20d2505d8a74f0aaad2c1a7766897e717fcc016836cf0469ac54e5ea5458e0c2", + "f345c73a5e44837f88935151d9e34d0340b7a7cd40649f8d446a4445ef99ee7d", + "3b7ef95b5ed5b676b98cef84ab6e4ec9690068b8573a4f524fc6e07a4a88346a", + "735743bd4b332c8786b4592de2fa8fc2155f995e51a8977c8a784c5361d62bc0", + "816bd14613d9c01260a278db8b209b7031a9f91592daee205a74c8f8e475c3d", + "ac13a127f7c140ce29da2547f5262a311f4a6ceef09e1a9cd7ce291f2e6e62cb", + "b8388f25ad94e4c5ef09d424d6d24f7cfa156b863ee82cca4d28f74db476c81f", + "798d46bcde8ac14f5dd196ceab38b0cc806cfd97814dc30213b2fab37deeb41a", + "5864e73def8a4c697e79275ad545ba595fae0c3edb44b5639c9f971433eb4a7e", + "c834c49b93a56dee7800d299ce77f694aef72e3e9b536af360515a9d8226d411", + "307eede13672e33004de6e5d66c6a1a40408a34b6b095399d94a6028f4fdf498", + "6d26e33e9b1ac3e2924879ec39a8f565aebdd004b28ca0377e52a4ef9f86302d", + "5cc263a10f2b0c008b4f3074ffa0ee057c40f1490d2e0717715958e7307aa558", + "192f9b30a0e1d5d4ef16031eaa257d9d84f19c75431cdb3159ee5494c81eeaa8", + "e5e823f3b827c1951d870ef1c402947f1aa6466f313499daab18f60b1519c4a6", + "9895c3aafb063434b7507ae771e6ec4ea1faa5bcbbd5fcc2932a44031eac3547", + "b15411553c1e86f2e851e67e3de767bb9f017da7fd73542f9cb13ca85a2b9cc5", + "2971206110b600d0b0f2120dc98404c2fa0086ea8ece6ed68b4320f585026b30", + "6506597b23bbdb6d0949c16a7d432b8286566895dfe2b9d7e0dc9333ead0d645", + "a6c3c5ad654dcdc9515260426a476d69d8ce3b73151f660adad29ff444047f9a", + "7aa5492fe997029882a68f733c15cc09393b7f69c0608715fcbad813ad1c1fcf", + "6f5ccf726c09f097c4dd0279bb017a211caf9f1416520284f58314dea662d83a", + "f54a6019b86623e2afba6cf405a78a47dbc248fb12f11032e453cd1bb2c4cade", + "2380bdff9700736e12cb6038b7f7897bced9915e102a7e1715cbc2a93e85de08", + "5f12edfb089ec7da0e2d75003531f7dc19e52a5e0bb99fa448415a763a9d0466", + "968a97769cdc23893c407171b3d83b63cca25b88e838d6f489ba8874fc378642", + "e52552ffc80c4947dd1477fe06690ecee3544a24a2ec99b320de8386226cd57", + "30e39614bf11a831fe8e5abd4ff34e0d0f19337e505ea16e7b55770208f1a65b", + "ea2f2b92e8fe184a6eed5f15f042b1ef96a29ccf60b69be8585e84355e97d9b", + "606ce93b81816ceeb5d1582551c83edbb2324ddc3ea6c355502fb008e949b4c5", + "942e798d00041f0d923bfb7f438556f069500b17e4e37ea7a2c524c021913043", + "fade41bedfd5889dd7f1ee65c4c6daf8128a1cbfaebde0074b67d4650ce70af7", + "6be71a0b8facbd5c877f84173f1a251f4980be03395583e4c2fd20c52e2a4394", + "25323e64eaa402475e0b0c5b29c17bf38fa393cd2af469107f3b7a6d7a87d5bd", + "fd1ffe1c90265a9c5e8660bc5be8b9b547a27fffefa34f9d2d7c3bc4184864e2", + "8f849302b357d36535a9107bfe6cd0299c3e4f9e5cb6d9dd6da91e014529d7e0", + "c179af3a8482b96549dab5552f951f4eb9ccd4b17160941c16c3bf6be49b9fd1", + "db240bc1dcbdccbd39d48628ee2f849d8ab610f589015f9cc847ead13f0ed965", + "6b2c895da7ec15f58bd820dc8b2c71451e300b10119abfd74a2f56c0b34f9691", + "f62dc1addae6efbebb9270a38040ee36d8ddfd9faa06c0965d129311a3603049", + "ab18e7c0831991736f037ad9b4485888c9613e2632b8868bc4fd103d42f8ab95", + "e8ecef3ce401b129abbb90a691dd58cfe412b3cc91096ab938687d6a31790f5b", + "c5b72ee7a99992d6d69f1fa88448fd6114e02047563a17ff4b06b60cf95f1bc1", + "c03eede09d30f728c072b9a51d4196928b75ad97464a58123de63e2fb88ce6db", + "815a357554af46d2409b050bf5b8576ea4433f93be0022d60111f9666810fec1", + "5a12e5bf51e06e08ed407440c638db83f01e50a5e7ef60b2b6a5c4c97c638d72", + "9a63d5370d55feab709b5a89057cc958dcc27f8dc97fc31d756e254fca3ab95d", + "295f6bf83dd3786be112649b876bd7fc85092a26e371c32de1610e83aa0b52e2", + "2c49e4b7539af2c04106100b1ef9fb4e78256f579eab536795d6643de0995af6", + "9603af83c7a7f6d6bbb29e077d547daa108f82a88266f5ffa352dc32fc8fc2ad", + "ae351496525d73aa86f4bc75eff3838d416da3b7b8560631f1997bcee197df43", + "13c9788b5acb21a796c91ee98d4ec59212a3dd298dd679b63eceddd846fffc4e", + "ee1aa84638e8f0f1d569b41a7b086d115de8a60df51fd9be7bab5bbb9148452c", + "7eab180ce19c973aec552d8d3fd929f8c9887b70524d31afed455557bb128de9", + "48c8f8c17c54d18b5ba8030302ec6c69a24298ec802f059f594c27221209ae77", + "33b4f14d5941c4831217ed5f1133fe236379cf51e43d34e21cfa5f3b550b1e5b", + "ea052981db488cb53b880fa44904def82ca6817fce6750f4b67ae75471e768d6", + "5c3db160634a6dcd482ee6fde99ac1f3e3bfa98ea7362461ba020b86c2220f20", + "cf3ee418d7b53b25cf6e5114f5f57585d9597c9352af4d55835d5820f55d58c3", + "55d512494d2fe01303b724452d2ec80cba26cf431cea0c91117ec091204d46c1", + "17a23ffd90f53ec2ba760c418b8663f896fb307018fa8b71a3ee6d0f2dff0e0e", + "2b860e2a76738c8e3af1ba7be4df56b7ca49e817d9abc8367a74c42660b50109", + "dcb46a25511e3ec3ced2329d894ccc3da4840d66aab85c073d48d99d2d766030", + "79771a7db2d8c8a8a611a814328e2d2e4fc6d6f2c146d93181ffbe5a6226cc8c", + "8d73454d355f2835f8e97c53ef5da56e6f2e17ed66aae0670f06ad99e13beca6", + "2a97bd64fe3229c2fdc98039239246a02bb6d223d93f40657affd68a3bef58dd", + "abb8de517e96599bd18e849aa722a2ce1b59f87a1e7fe188fda734f07b4962fb", +]; + +const authors = [ + // "84659c5e4dbff288ac294b22e2cff54b5af8e2d2071985859298160de5211dd8", + // "8b6050822e1b51fbc70d4fa05e158f0067d24d86e9c831dd86909d22b77f67f6", + // "e9a2a5f535cce1f1447b4219d5f7f30cefea50be5e0017cfd877efe881f589c5", + // "efe5d120df0cc290fa748727fb45ac487caad346d4f2293ab069e8f01fc51981", + // "5afa711a2e4f45294c9ca8033861a0e15a879e6fc1a4a6903640f7faeae0d7b8", + // "8aa70f4433129dadb71330ac89f62b534caa200a9f3ee349a0f4a5593073d1a6", + // "c7e300eb1e297c5331cf57ae1304b48e5adeeb56c492d9f450494b39e94ebe38", + // "675b84fe75e216ab947c7438ee519ca7775376ddf05dadfba6278bd012e1d728", + + // "efe5d120df0cc290fa748727fb45ac487caad346d4f2293ab069e8f01fc51981", + // "5afa711a2e4f45294c9ca8033861a0e15a879e6fc1a4a6903640f7faeae0d7b8", + // "8aa70f4433129dadb71330ac89f62b534caa200a9f3ee349a0f4a5593073d1a6", + // "c7e300eb1e297c5331cf57ae1304b48e5adeeb56c492d9f450494b39e94ebe38", + // "675b84fe75e216ab947c7438ee519ca7775376ddf05dadfba6278bd012e1d728", + // "99cefa645b00817373239aebb96d2d1990244994e5e565566c82c04b8dc65b54", + // "b7c7f5d30652fbe57aa4ffd373c5fa3912760842c71d260b0f5c498f020f5f03", + // "d60397e8a390b41dd17551b04be27ad26831beb6d55a98a1f14d94ec2fe3fde0", + // "9279276bffb83cee33946e564c3600a32840269a8206d01ddf40c6432baa0bcb", + // "41e368dbaade3de1f0099f58d4e05f8956ad360a9eb7ea210c4272da9ffa04e8", + // "e05cb33ce37bfadfc26a5406e082f84550f63f992df5256dfd08ac62082a99e", + // "16afe0531a7cd932b9a7c6cdceb9b6c19a43b364af4cce7eb6064de2f9bf18d0", + // "97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322", + // "e185c2ad0b87b3207ac2b96d6b8fb1ff10fbf25f93eef4d04fb6dbb9039f19fb", + // "99c31c5745565d627684dcf231378b77bb509606f550cfd77bc9ac8fe2bc26f6", + // "9ce71f1506ccf4b99f234af49bd6202be883a80f95a155c6e9a1c36fd7e780c7", + // "cbab7074a03bf89c7dd1623e42e65409e3918662af6c65fe2e38c92ff9f0bd61", + // "b6f856ffc06f6b1d3cc6fbee75adffaed247825b50b929f1bd3483a65b519e34", + // "18f54af1e10c5bb7a35468b0f62b295d12347903c9f95738d065c84bef1402ef", + // "7202985c7e34a7c1c48b93d882a953c5258cf226204ec95bececd8360c792969", + // "db333633799ef7f9dbb2967abcbed657b6c67578459f2bc2bd88d5842a60f954", + // + // + "6e1a6ad5b47e106d3f1be0f2d531580431533b2eb10fad59610594c5455cff7b", + "57dff5343897ca899797b0456d933b637f1051191fd2757889621d48e2f4d622", + "f40c016cf439fe9a1bd8deccf6e11bc3e00655147b5f69691a460972c5f5e7b3", + "9b01d92437819fd91c951ed09fd03036d1c036541f69e17ddfef2e7c7a3f31b7", + "30e39614bf11a831fe8e5abd4ff34e0d0f19337e505ea16e7b55770208f1a65b", + "d5f6d6db022fea369a2fec29541844567f12ad6991ed413c6b4be108a8468dcc", + // "41be274d7dd6cc2bf09bc9bc618cd4476ca1800bebd8888cabdc99f18ba", + "866285e35302b3f3688786bb5a118c8bffd98c255c8634f6a172e0abd63ddc73", + "7877d504a89e7464576d9c06ba2d06fb1de2b2e017ac107de2710216ef24df01", + "65eec5d230d6bb899db4d7d947f4fc82b0e8965b08fcd683a6478962337ebcdb", // ]; async function wsClient(url: string) { console.log("connecting to relae", url); - const relay = new Relay(url); + const relay = new Relay(url, (msg) => { + // console.log("msg", msg); + }); + + relay.onerror = (error) => { + console.log(url); + console.error("ws error", error); + }; + relay.ondisconnect = () => { + console.error(url, "relay disconnected"); + }; + relay.onfailure = () => { + console.error(url, "relay failed"); + }; + relay.onnotice = (notice) => { + console.error("on notice", notice); + }; + relay.onconnect = () => { + console.log("relay connected", url); + }; await relay.connect(); const id = crypto.randomUUID(); - relay.subscribe(id, [{ ids, limit: 50 }], { + const fids = ids.filter((i) => i.length === 64); + const filter = { ids: fids, limit: 500 }; + // const filter = { kinds: [1, 6], limit: 50 }; + // const filter = { + // kinds: [0], + // authors, + // }; + console.log("author count", authors.length); + let eventCount = 0; + const pubkeys: string[] = []; + relay.subscribe(id, [filter], { oneose: () => { console.log("oneose"); + console.log({ eventCount }); + console.log(pubkeys); }, onevent(event) { - console.log("relay event", { url, event }); + // console.log("relay event", { url, event }); + eventCount++; + pubkeys.push(event.pubkey); + }, + onclose: (msg) => { + console.log("sub closed wtf", msg); }, }); // const socket = new WebSocket(url); @@ -39,6 +215,8 @@ const relays = ["wss://nos.lol", "wss://relay.damus.io"]; async function run() { console.log("wth"); - await wsClient(relays[0]!); + for (const r of relays) { + await wsClient(r); + } } run(); diff --git a/shim/ws-shim/src/types.ts b/shim/ws-shim/src/types.ts index 4063772..feeb2f6 100644 --- a/shim/ws-shim/src/types.ts +++ b/shim/ws-shim/src/types.ts @@ -1,7 +1,29 @@ // Shim types -export type ShimRequest = { - get: Array<{ relay: string; filters: Filter[] }>; - post: { event: NostrEvent; relays: string[] }; +export type ShimRequest = + | { http: ShimHttpRequest } + | { + ws: { + relays: string[]; + req: ClientMessage; + }; + }; +export type ShimHttpRequest = { + relay: string; + delay: number; + subscription_id: string; + filters: Filter[]; +}; +export type ShimResponse = { + relay: string; + msg: + | { event: { subscription_id: string; event: NostrEvent } } + | { ok: { event_id: string; accepted: boolean; message: string } } + | { eose: string } + | { closed: { subscription_id: string; message: string } } + | { notice: string } + | { auth: string } + // this is ours + | { error: string }; }; // NOSTR official export interface NostrEvent { @@ -52,6 +74,7 @@ export interface Filter { export type ClientMessage = | ["EVENT", NostrEvent] + | ["AUTH", NostrEvent] | ["REQ", string, ...Filter[]] | ["CLOSE", string]; @@ -74,4 +97,5 @@ export interface Subscription { filters: Filter[]; oneose?: () => void; onevent?: (event: NostrEvent) => void; + onclose?: (message: string) => void; } diff --git a/desk/NOTES.md b/wtfdesk/NOTES.md index 730a478..e6d4743 100644 --- a/desk/NOTES.md +++ b/wtfdesk/NOTES.md @@ -37,3 +37,8 @@ https://nostr-nips.com/#standardized-tags - Default keypair that of groundwire comet? lol forget the frontend make it work for Primal + +# WTFs +- ~It appears relays ignore you if you pass more than 11 authors on a filter~ +- Turns out the pubkeys were wrong because we were not padding the hex strings to 64 chars. fixed now +- Relay send a notice if too many concurrent REQs |