From 0454b9b62b497e5adbb94c7b77954a0b699db6be Mon Sep 17 00:00:00 2001 From: James Mills Date: Sat, 30 Jan 2021 15:06:58 +1000 Subject: [PATCH] Replaced all other referenced to twt/twtxt --- .envrc | 2 + cmd/spyda/main.go | 122 ++------ go.mod | 3 + go.sum | 427 ---------------------------- internal/config.go | 95 ++----- internal/context.go | 63 +---- internal/models.go | 449 +----------------------------- internal/options.go | 129 ++------- internal/pages/abuse.md | 38 +++ internal/rice-box.go | 348 ----------------------- internal/robots.go | 9 +- internal/server.go | 175 +----------- internal/templates.go | 4 - internal/templates/_partials.html | 2 +- 14 files changed, 138 insertions(+), 1728 deletions(-) create mode 100644 .envrc delete mode 100644 go.sum create mode 100644 internal/pages/abuse.md delete mode 100644 internal/rice-box.go diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..7449610 --- /dev/null +++ b/.envrc @@ -0,0 +1,2 @@ +GOPRIVATE=git.mills.io/prologic/spyda +export GOPRIVATE diff --git a/cmd/spyda/main.go b/cmd/spyda/main.go index d134d1c..9de2e8e 100644 --- a/cmd/spyda/main.go +++ b/cmd/spyda/main.go @@ -16,7 +16,6 @@ import ( "git.mills.io/prologic/spyda" "git.mills.io/prologic/spyda/internal" - "git.mills.io/prologic/spyda/types/retwt" ) var ( @@ -34,22 +33,14 @@ var ( // Pod Oeprator adminUser string + adminPass string adminName string adminEmail string - // Pod Settings - openProfiles bool - openRegistrations bool + // Limits + resultsPerpage int - // Pod Limits - twtsPerPage int - maxTwtLength int - maxUploadSize int64 - maxFetchLimit int64 - maxCacheTTL time.Duration - maxCacheItems int - - // Pod Secrets + // Secrets apiSigningKey string cookieSecret string magiclinkSecret string @@ -61,19 +52,10 @@ var ( smtpPass string smtpFrom string - // Messaging Settings - smtpBind string - pop3Bind string - // Timeouts - sessionExpiry time.Duration - sessionCacheTTL time.Duration - apiSessionTime time.Duration - transcoderTimeout time.Duration - - // Whitelists, Sources - feedSources []string - whitelistedDomains []string + sessionExpiry time.Duration + sessionCacheTTL time.Duration + apiSessionTime time.Duration ) func init() { @@ -89,48 +71,19 @@ func init() { flag.StringVarP(&theme, "theme", "t", internal.DefaultTheme, "set the default theme") flag.StringVarP(&baseURL, "base-url", "u", internal.DefaultBaseURL, "base url to use") - // Pod Oeprator + // Administration flag.StringVarP(&adminName, "admin-name", "N", internal.DefaultAdminName, "default admin user name") flag.StringVarP(&adminEmail, "admin-email", "E", internal.DefaultAdminEmail, "default admin user email") flag.StringVarP(&adminUser, "admin-user", "A", internal.DefaultAdminUser, "default admin user to use") + flag.StringVarP(&adminPass, "admin-pass", "P", internal.DefaultAdminName, "default admin user name") - // Pod Settings - flag.BoolVarP( - &openRegistrations, "open-registrations", "R", internal.DefaultOpenRegistrations, - "whether or not to have open user registgration", - ) - flag.BoolVarP( - &openProfiles, "open-profiles", "O", internal.DefaultOpenProfiles, - "whether or not to have open user profiles", + // Limits + flag.IntVarP( + &resultsPerPage, "results-per-page", "T", internal.DefaultResultsPerPage, + "maximum results per page to display", ) - // Pod Limits - flag.IntVarP( - &twtsPerPage, "twts-per-page", "T", internal.DefaultTwtsPerPage, - "maximum twts per page to display", - ) - flag.IntVarP( - &maxTwtLength, "max-twt-length", "L", internal.DefaultMaxTwtLength, - "maximum length of posts", - ) - flag.Int64VarP( - &maxUploadSize, "max-upload-size", "U", internal.DefaultMaxUploadSize, - "maximum upload size of media", - ) - flag.Int64VarP( - &maxFetchLimit, "max-fetch-limit", "F", internal.DefaultMaxFetchLimit, - "maximum feed fetch limit in bytes", - ) - flag.DurationVarP( - &maxCacheTTL, "max-cache-ttl", "C", internal.DefaultMaxCacheTTL, - "maximum cache ttl (time-to-live) of cached twts in memory", - ) - flag.IntVarP( - &maxCacheItems, "max-cache-items", "I", internal.DefaultMaxCacheItems, - "maximum cache items (per feed source) of cached twts in memory", - ) - - // Pod Secrets + // Secrets flag.StringVar( &apiSigningKey, "api-signing-key", internal.DefaultAPISigningKey, "secret to use for signing api tokens", @@ -151,10 +104,6 @@ func init() { flag.StringVar(&smtpPass, "smtp-pass", internal.DefaultSMTPPass, "SMTP Pass to use for email sending") flag.StringVar(&smtpFrom, "smtp-from", internal.DefaultSMTPFrom, "SMTP From to use for email sending") - // Messaging Settings - flag.StringVar(&smtpBind, "smtp-bind", internal.DefaultSMTPBind, "SMTP interface and port to bind to") - flag.StringVar(&pop3Bind, "pop3-bind", internal.DefaultPOP3Bind, "POP3 interface and port to bind to") - // Timeouts flag.DurationVar( &sessionExpiry, "session-expiry", internal.DefaultSessionExpiry, @@ -168,20 +117,6 @@ func init() { &apiSessionTime, "api-session-time", internal.DefaultAPISessionTime, "timeout for api tokens to expire", ) - flag.DurationVar( - &transcoderTimeout, "transcoder-timeout", internal.DefaultTranscoderTimeout, - "timeout for the video transcoder", - ) - - // Whitelists, Sources - flag.StringSliceVar( - &feedSources, "feed-sources", internal.DefaultFeedSources, - "external feed sources for discovery of other feeds", - ) - flag.StringSliceVar( - &whitelistedDomains, "whitelist-domain", internal.DefaultWhitelistedDomains, - "whitelist of external domains to permit for display of inline images", - ) } func flagNameFromEnvironmentName(s string) string { @@ -232,8 +167,6 @@ func main() { log.SetLevel(log.InfoLevel) } - retwt.DefaultTwtManager() - svr, err := internal.NewServer(bind, // Debug mode internal.WithDebug(debug), @@ -246,24 +179,16 @@ func main() { internal.WithTheme(theme), internal.WithBaseURL(baseURL), - // Pod Oeprator + // Administration internal.WithAdminUser(adminUser), + internal.WithAdminPass(adminPass), internal.WithAdminName(adminName), internal.WithAdminEmail(adminEmail), - // Pod Settings - internal.WithOpenProfiles(openProfiles), - internal.WithOpenRegistrations(openRegistrations), + // Limits + internal.WithResultsPerPage(resultsPerPage), - // Pod Limits - internal.WithTwtsPerPage(twtsPerPage), - internal.WithMaxTwtLength(maxTwtLength), - internal.WithMaxUploadSize(maxUploadSize), - internal.WithMaxFetchLimit(maxFetchLimit), - internal.WithMaxCacheTTL(maxCacheTTL), - internal.WithMaxCacheItems(maxCacheItems), - - // Pod Secrets + // Secrets internal.WithAPISigningKey(apiSigningKey), internal.WithCookieSecret(cookieSecret), internal.WithMagicLinkSecret(magiclinkSecret), @@ -275,19 +200,10 @@ func main() { internal.WithSMTPPass(smtpPass), internal.WithSMTPFrom(smtpFrom), - // Messaging Settings - internal.WithSMTPBind(smtpBind), - internal.WithPOP3Bind(pop3Bind), - // Timeouts internal.WithSessionExpiry(sessionExpiry), internal.WithSessionCacheTTL(sessionCacheTTL), internal.WithAPISessionTime(apiSessionTime), - internal.WithTranscoderTimeout(transcoderTimeout), - - // Whitelists, Sources - internal.WithFeedSources(feedSources), - internal.WithWhitelistedDomains(whitelistedDomains), ) if err != nil { log.WithError(err).Fatal("error creating server") diff --git a/go.mod b/go.mod index bcc3613..dbabaed 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module veri-index go 1.13 require ( + git.mills.io/prologic/spyda v0.0.0-00010101000000-000000000000 github.com/GeertJohan/go.rice v1.0.2 github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible github.com/NYTimes/gziphandler v1.1.1 github.com/PuerkitoBio/goquery v1.6.1 + github.com/andreadipersio/securecookie v0.0.0-20131119095127-e3c3b33544ec // indirect github.com/andyleap/microformats v0.0.0-20150523144534-25ae286f528b github.com/audiolion/ipip v1.0.0 github.com/bakape/thumbnailer/v2 v2.6.6 @@ -20,6 +22,7 @@ require ( github.com/disintegration/gift v1.2.1 github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec github.com/dustin/go-humanize v1.0.0 + github.com/elithrar/simple-scrypt v1.3.0 // indirect github.com/gabstv/merger v1.0.1 github.com/goccy/go-yaml v1.8.6 github.com/gomarkdown/markdown v0.0.0-20201113031856-722100d81a8e diff --git a/go.sum b/go.sum deleted file mode 100644 index be4c137..0000000 --- a/go.sum +++ /dev/null @@ -1,427 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.2/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/andyleap/microformats v0.0.0-20150523144534-25ae286f528b/go.mod h1:I3yyaN+QdpdChOtQg3ApgY01JRmFsXJASweq6Ye5A3s= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/audiolion/ipip v1.0.0/go.mod h1:dQtLacQAC8IPK3CTQAwhm2B+I0403irUHgit3r2IylM= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/bakape/thumbnailer/v2 v2.6.6/go.mod h1:+yOYrfZmQ3VO7uqVHxTr3p5J74WRjP5MeQQXaU6GBjY= -github.com/bbalet/stopwords v1.0.0/go.mod h1:sAWrQoDMfqARGIn4s6dp7OW7ISrshUD8IP2q3KoqPjc= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chai2010/webp v1.1.0/go.mod h1:LP12PG5IFmLGHUU26tBiCBKnghxx3toZFwDjOYvd3Ow= -github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creasty/defaults v1.5.1/go.mod h1:FPZ+Y0WNrbqOVw+c6av63eyHUAl6pMHZwqLPvXUZGfY= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/disintegration/gift v1.1.2/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= -github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= -github.com/disintegration/imageorient v0.0.0-20180920195336-8147d86e83ec/go.mod h1:K0KBFIr1gWu/C1Gp10nFAcAE4hsB7JxE6OgLijrJ8Sk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gabstv/merger v1.0.1/go.mod h1:oQKCbAX4P6q0jk4s9Is144NojOE/HggFPb5qjPNZjq8= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-yaml v1.8.6/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/gomarkdown/markdown v0.0.0-20201113031856-722100d81a8e/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/goware/urlx v0.3.1/go.mod h1:h8uwbJy68o+tQXCGZNa9D73WN8n0r9OBae5bUnLcgjw= -github.com/grokify/html-strip-tags-go v0.0.0-20200322061010-ea0c1cf2f119/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/james4k/fmatter v0.0.0-20150827042251-377c8ea6259d/go.mod h1:lxdGBh4Mr76rBen37GEal03CF0eF1qF5DSk2qfrrdo0= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/gorm v1.9.2/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/justinas/nosurf v1.1.1/go.mod h1:ALpWdSbuNGy2lZWtyXdjkYv4edL23oSEgfBT1gPJ5BQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lithammer/shortuuid/v3 v3.0.5/go.mod h1:2QdoCtD4SBzugx2qs3gdR3LXY6McxZYCNEHwDmYvOAE= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= -github.com/nullrocks/identicon v0.0.0-20180626043057-7875f45b0022/go.mod h1:x4NsS+uc7ecH/Cbm9xKQ6XzmJM57rWTkjywjfB2yQ18= -github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prologic/bitcask v0.3.10/go.mod h1:8RKJdbHLE7HFGLYSGu9slnYXSV7DMIucwVkaIYOk9GY= -github.com/prologic/observe v0.0.0-20181231082615-747b185a0928/go.mod h1:tEdBKdkpsOZCgueJIZwZREodFg5oRhLkTWWNiQ5y84E= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q= -github.com/rickb777/accept v0.0.0-20170318132422-d5183c44530d/go.mod h1:sv64uV+hMk2K4qwURvESkYmF8QyMYF/9nJpxF8UPQb8= -github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securisec/go-keywords v0.0.0-20200619134240-769e7273f2ed/go.mod h1:ewJJMApUajQGvQOaQb/QyzTLoL619B5D02XOZlGnlNo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/steambap/captcha v1.3.1/go.mod h1:OPtfgZrvs/bolQ9JIZXsejxNzc98ETqaiMCVg8kqQGM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/theplant-retired/timezones v0.0.0-20150304063004-f9bd3c0ef9db/go.mod h1:vXWFQa6TAgTMbDqs8os5Wy6sTryvHNC39l0M3WHl8EQ= -github.com/tidwall/btree v0.2.2/go.mod h1:huei1BkDWJ3/sLXmO+bsCNELL+Bp2Kks9OLyQFkzvA8= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= -github.com/tidwall/redcon v1.4.0/go.mod h1:IGzxyoKE3Ea5AWIXo/ZHP+hzY8sWXaMKr7KlFgcWSZU= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/unrolled/logger v0.0.0-20201216141554-31a3694fe979/go.mod h1:X5DBNY1yIVkuLwJP3BXlCoQCa5mGg7hPJPIA0Blwc44= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/vcraescu/go-paginator v1.0.0/go.mod h1:caZCjjt2qcA1O2aDzW7lwAcK4Rxw3LNvdEVF/ONxZWw= -github.com/wblakecaldwell/profiler v0.0.0-20150908040756-6111ef1313a1/go.mod h1:3+0F8oLB1rQlbIcRAuqDgGdzNi9X69un/aPz4cUAFV4= -github.com/writeas/slug v1.2.0/go.mod h1:RE8shOqQP3YhsfsQe0L3RnuejfQ4Mk+JjY5YJQFubfQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20200228211341-fcea875c7e85/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.53.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/sqlite v1.1.3/go.mod h1:AKDgRWk8lcSQSw+9kxCJnX/yySj8G3rdwYlU57cB45c= -gorm.io/gorm v1.20.1/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.20.6/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/config.go b/internal/config.go index 9581dd1..3bfd901 100644 --- a/internal/config.go +++ b/internal/config.go @@ -7,13 +7,11 @@ import ( "math/rand" "net/url" "os" - "regexp" "strings" "time" "github.com/gabstv/merger" "github.com/goccy/go-yaml" - "git.mills.io/prologic/spyda/types" log "github.com/sirupsen/logrus" ) @@ -25,77 +23,50 @@ var ( type Settings struct { Name string `yaml:"pod_name"` Description string `yaml:"pod_description"` - - MaxTwtLength int `yaml:"max_twt_length"` - - OpenProfiles bool `yaml:"open_profiles"` - OpenRegistrations bool `yaml:"open_registrations"` } // Config contains the server configuration parameters type Config struct { Debug bool - Data string - Name string - Description string - Store string - Theme string - BaseURL string - AdminUser string - AdminName string - AdminEmail string - FeedSources []string - RegisterMessage string - CookieSecret string - TwtPrompts []string - TwtsPerPage int - MaxUploadSize int64 - MaxTwtLength int - MaxCacheTTL time.Duration - MaxCacheItems int - MsgsPerPage int - OpenProfiles bool - OpenRegistrations bool - SessionExpiry time.Duration - SessionCacheTTL time.Duration - TranscoderTimeout time.Duration + Data string + Name string + Description string + Store string + Theme string + BaseURL string + AdminUser string + AdminPass string + AdminName string + AdminEmail string + SearchPrompts []string + ResultsPerPage int + + APISessionTime time.Duration + SessionExpiry time.Duration + SessionCacheTTL time.Duration + + APISigningKey string + CookieSecret string MagicLinkSecret string - SMTPBind string - POP3Bind string - SMTPHost string SMTPPort int SMTPUser string SMTPPass string SMTPFrom string - MaxFetchLimit int64 - - APISessionTime time.Duration - APISigningKey string - baseURL *url.URL - - whitelistedDomains []*regexp.Regexp - WhitelistedDomains []string - - // path string } -var _ types.FmtOpts = (*Config)(nil) - func (c *Config) IsLocalURL(url string) bool { if NormalizeURL(url) == "" { return false } return strings.HasPrefix(NormalizeURL(url), NormalizeURL(c.BaseURL)) } -func (c *Config) LocalURL() *url.URL { return c.baseURL } -func (c *Config) ExternalURL(nick, uri string) string { return URLForExternalProfile(c, nick, uri) } -func (c *Config) UserURL(url string) string { return UserURL(url) } +func (c *Config) LocalURL() *url.URL { return c.baseURL } // Settings returns a `Settings` struct containing pod settings that can // then be persisted to disk to override some configuration options. @@ -109,28 +80,10 @@ func (c *Config) Settings() *Settings { return settings } -// WhitelistedDomain returns true if the domain provided is a whiltelisted -// domain as per the configuration -func (c *Config) WhitelistedDomain(domain string) (bool, bool) { - // Always per mit our own domain - ourDomain := strings.TrimPrefix(strings.ToLower(c.baseURL.Hostname()), "www.") - if domain == ourDomain { - return true, true - } - - // Check against list of whitelistedDomains (regexes) - for _, re := range c.whitelistedDomains { - if re.MatchString(domain) { - return true, false - } - } - return false, false -} - -// RandomTwtPrompt returns a random Twt Prompt for display by the UI -func (c *Config) RandomTwtPrompt() string { - n := rand.Int() % len(c.TwtPrompts) - return c.TwtPrompts[n] +// RandomSearchPrompt returns a random Search Prompt for display by the UI +func (c *Config) RandomSearchPrompt() string { + n := rand.Int() % len(c.SearchPrompts) + return c.SearchPrompts[n] } // Validate validates the configuration is valid which for the most part diff --git a/internal/context.go b/internal/context.go index 73b74ca..b459890 100644 --- a/internal/context.go +++ b/internal/context.go @@ -1,7 +1,6 @@ package internal import ( - "fmt" "html/template" "net/http" "strings" @@ -13,7 +12,6 @@ import ( "git.mills.io/prologic/spyda/internal/session" "git.mills.io/prologic/spyda/types" "github.com/justinas/nosurf" - "github.com/theplant-retired/timezones" ) type Meta struct { @@ -31,24 +29,15 @@ type Context struct { Debug bool - BaseURL string - InstanceName string - SoftwareVersion string - TwtsPerPage int - TwtPrompt string - MaxTwtLength int - RegisterDisabled bool - OpenProfiles bool - RegisterDisabledMessage string + BaseURL string + InstanceName string + SoftwareVersion string - Timezones []*timezones.Zoneinfo + SearchPrompt string - Reply string Username string User *User Tokens []*Token - LastTwt types.Twt - Profile types.Profile Authenticated bool IsAdmin bool @@ -65,20 +54,10 @@ type Context struct { Links types.Links Alternatives types.Alternatives - Messages Messages - NewMessages int - - Twter types.Twter - Twts types.Twts - BlogPost *BlogPost - BlogPosts BlogPosts - Feeds []*Feed - FeedSources FeedSourceMap - Pager *paginator.Paginator + Pager *paginator.Paginator // Report abuse - ReportNick string - ReportURL string + ReportURL string // Reset Password Token PasswordResetToken string @@ -91,21 +70,15 @@ func NewContext(conf *Config, db Store, req *http.Request) *Context { ctx := &Context{ Debug: conf.Debug, - BaseURL: conf.BaseURL, - InstanceName: conf.Name, - SoftwareVersion: spyda.FullVersion(), - TwtsPerPage: conf.TwtsPerPage, - TwtPrompt: conf.RandomTwtPrompt(), - MaxTwtLength: conf.MaxTwtLength, - RegisterDisabled: !conf.OpenRegistrations, - OpenProfiles: conf.OpenProfiles, - LastTwt: types.NilTwt, + BaseURL: conf.BaseURL, + InstanceName: conf.Name, + SoftwareVersion: spyda.FullVersion(), + + SearchPrompt: conf.RandomSearchPrompt(), Commit: spyda.Commit, Theme: conf.Theme, - Timezones: timezones.AllZones, - Title: "", Meta: Meta{ Title: DefaultMetaTitle, @@ -113,14 +86,6 @@ func NewContext(conf *Config, db Store, req *http.Request) *Context { Keywords: DefaultMetaKeywords, Description: conf.Description, }, - - Alternatives: types.Alternatives{ - types.Alternative{ - Type: "application/atom+xml", - Title: fmt.Sprintf("%s local feed", conf.Name), - URL: fmt.Sprintf("%s/atom.xml", conf.BaseURL), - }, - }, } ctx.CSRFToken = nosurf.Token(req) @@ -138,11 +103,6 @@ func NewContext(conf *Config, db Store, req *http.Request) *Context { log.WithError(err).Warnf("error loading user object for %s", ctx.Username) } - ctx.Twter = types.Twter{ - Nick: user.Username, - URL: URLForUser(conf, user.Username), - } - ctx.User = user tokens, err := db.GetUserTokens(user) @@ -153,7 +113,6 @@ func NewContext(conf *Config, db Store, req *http.Request) *Context { } else { ctx.User = &User{} - ctx.Twter = types.Twter{} } if ctx.Username == conf.AdminUser { diff --git a/internal/models.go b/internal/models.go index 02294c4..21b6189 100644 --- a/internal/models.go +++ b/internal/models.go @@ -2,72 +2,22 @@ package internal import ( "encoding/json" - "errors" "fmt" - "io/ioutil" "net/url" - "os" - "path/filepath" - "strings" "time" "github.com/creasty/defaults" - "git.mills.io/prologic/spyda/types" log "github.com/sirupsen/logrus" ) -const ( - maxUserFeeds = 5 // 5 is < 7 and humans can only really handle ~7 things -) - -var ( - ErrFeedAlreadyExists = errors.New("error: feed already exists by that name") - ErrAlreadyFollows = errors.New("error: you already follow this feed") - ErrTooManyFeeds = errors.New("error: you have too many feeds") -) - -// Feed ... -type Feed struct { - Name string - Description string - URL string - CreatedAt time.Time - - Followers map[string]string `default:"{}"` - - remotes map[string]string -} - // User ... type User struct { Username string Password string - Tagline string - Email string // DEPRECATED: In favor of storing a Hashed Email - URL string + Email string CreatedAt time.Time - Theme string `default:"auto"` - Recovery string `default:"auto"` - DisplayDatesInTimezone string `default:"UTC"` - IsFollowersPubliclyVisible bool `default:"true"` - IsFollowingPubliclyVisible bool `default:"true"` - IsBookmarksPubliclyVisible bool `default:"true"` - - Feeds []string `default:"[]"` Tokens []string `default:"[]"` - - SMTPToken string `default:""` - POP3Token string `default:""` - - Bookmarks map[string]string `default:"{}"` - Followers map[string]string `default:"{}"` - Following map[string]string `default:"{}"` - Muted map[string]string `default:"{}"` - - muted map[string]string - remotes map[string]string - sources map[string]string } // Token ... @@ -100,124 +50,6 @@ func (t *Token) Bytes() ([]byte, error) { return data, nil } -func CreateFeed(conf *Config, db Store, user *User, name string, force bool) error { - if user != nil { - if !force && len(user.Feeds) > maxUserFeeds { - return ErrTooManyFeeds - } - } - - fn := filepath.Join(conf.Data, feedsDir, name) - stat, err := os.Stat(fn) - - if err == nil && !force { - return ErrFeedAlreadyExists - } - - if stat == nil { - if err := ioutil.WriteFile(fn, []byte{}, 0644); err != nil { - return err - } - } - - if user != nil { - if !user.OwnsFeed(name) { - user.Feeds = append(user.Feeds, name) - } - } - - followers := make(map[string]string) - if user != nil { - followers[user.Username] = user.URL - } - - feed := NewFeed() - feed.Name = name - feed.URL = URLForUser(conf, name) - feed.Followers = followers - feed.CreatedAt = time.Now() - - if err := db.SetFeed(name, feed); err != nil { - return err - } - - if user != nil { - user.Follow(name, feed.URL) - } - - return nil -} - -func DetachFeedFromOwner(db Store, user *User, feed *Feed) (err error) { - delete(user.Following, feed.Name) - delete(user.sources, feed.URL) - - user.Feeds = RemoveString(user.Feeds, feed.Name) - if err = db.SetUser(user.Username, user); err != nil { - return - } - - delete(feed.Followers, user.Username) - if err = db.SetFeed(feed.Name, feed); err != nil { - return - } - - return nil -} - -func RemoveFeedOwnership(db Store, user *User, feed *Feed) (err error) { - user.Feeds = RemoveString(user.Feeds, feed.Name) - if err = db.SetUser(user.Username, user); err != nil { - return - } - - return nil -} - -func AddFeedOwnership(db Store, user *User, feed *Feed) (err error) { - user.Feeds = append(user.Feeds, feed.Name) - if err = db.SetUser(user.Username, user); err != nil { - return - } - - return nil -} - -// NewFeed ... -func NewFeed() *Feed { - feed := &Feed{} - if err := defaults.Set(feed); err != nil { - log.WithError(err).Error("error creating new feed object") - } - return feed -} - -// LoadFeed ... -func LoadFeed(data []byte) (feed *Feed, err error) { - feed = &Feed{} - if err := defaults.Set(feed); err != nil { - return nil, err - } - - if err = json.Unmarshal(data, &feed); err != nil { - return nil, err - } - - if feed.Followers == nil { - feed.Followers = make(map[string]string) - } - - feed.remotes = make(map[string]string) - for n, u := range feed.Followers { - if u = NormalizeURL(u); u == "" { - continue - } - feed.remotes[u] = n - } - - return -} - // NewUser ... func NewUser() *User { user := &User{} @@ -237,104 +69,9 @@ func LoadUser(data []byte) (user *User, err error) { return nil, err } - if user.SMTPToken == "" { - user.SMTPToken = GenerateRandomToken() - } - if user.POP3Token == "" { - user.POP3Token = GenerateRandomToken() - } - - if user.Bookmarks == nil { - user.Bookmarks = make(map[string]string) - } - if user.Followers == nil { - user.Followers = make(map[string]string) - } - if user.Following == nil { - user.Following = make(map[string]string) - } - - user.muted = make(map[string]string) - for n, u := range user.Muted { - if u = NormalizeURL(u); u == "" { - continue - } - user.muted[u] = n - } - - user.remotes = make(map[string]string) - for n, u := range user.Followers { - if u = NormalizeURL(u); u == "" { - continue - } - user.remotes[u] = n - } - - user.sources = make(map[string]string) - for n, u := range user.Following { - if u = NormalizeURL(u); u == "" { - continue - } - user.sources[u] = n - } - return } -func (f *Feed) AddFollower(nick, url string) { - url = NormalizeURL(url) - f.Followers[nick] = url - f.remotes[url] = nick -} - -func (f *Feed) FollowedBy(url string) bool { - _, ok := f.remotes[NormalizeURL(url)] - return ok -} - -func (f *Feed) Source() types.Feeds { - feeds := make(types.Feeds) - feeds[types.Feed{Nick: f.Name, URL: f.URL}] = true - return feeds -} - -func (f *Feed) Profile(baseURL string, viewer *User) types.Profile { - var ( - follows bool - followedBy bool - muted bool - ) - - if viewer != nil { - follows = viewer.Follows(f.URL) - followedBy = viewer.FollowedBy(f.URL) - muted = viewer.HasMuted(f.URL) - } - - return types.Profile{ - Type: "Feed", - - Username: f.Name, - Tagline: f.Description, - URL: f.URL, - BlogsURL: URLForBlogs(baseURL, f.Name), - - Follows: follows, - FollowedBy: followedBy, - Muted: muted, - - Followers: f.Followers, - } -} - -func (f *Feed) Bytes() ([]byte, error) { - data, err := json.Marshal(f) - if err != nil { - return nil, err - } - return data, nil -} - func (u *User) String() string { url, err := url.Parse(u.URL) if err != nil { @@ -361,190 +98,6 @@ func (u *User) HasToken(token string) bool { return false } -func (u *User) OwnsFeed(name string) bool { - name = NormalizeFeedName(name) - for _, feed := range u.Feeds { - if NormalizeFeedName(feed) == name { - return true - } - } - return false -} - -func (u *User) Is(url string) bool { - if NormalizeURL(url) == "" { - return false - } - return u.URL == NormalizeURL(url) -} - -func (u *User) Bookmark(hash string) { - if _, ok := u.Bookmarks[hash]; !ok { - u.Bookmarks[hash] = "" - } else { - delete(u.Bookmarks, hash) - } -} - -func (u *User) Bookmarked(hash string) bool { - _, ok := u.Bookmarks[hash] - return ok -} - -func (u *User) AddFollower(nick, url string) { - url = NormalizeURL(url) - u.Followers[nick] = url - u.remotes[url] = nick -} - -func (u *User) FollowedBy(url string) bool { - _, ok := u.remotes[NormalizeURL(url)] - return ok -} - -func (u *User) Mute(nick, url string) { - if !u.HasMuted(url) { - u.Muted[nick] = url - u.muted[url] = nick - } -} - -func (u *User) Unmute(nick string) { - url, ok := u.Muted[nick] - if ok { - delete(u.Muted, nick) - delete(u.muted, url) - } -} - -func (u *User) Follow(nick, url string) { - if !u.Follows(url) { - u.Following[nick] = url - u.sources[url] = nick - } -} - -func (u *User) FollowAndValidate(conf *Config, nick, url string) error { - if err := ValidateFeed(conf, nick, url); err != nil { - return err - } - - if u.Follows(url) { - return ErrAlreadyFollows - } - - u.Following[nick] = url - u.sources[url] = nick - - return nil -} - -func (u *User) Follows(url string) bool { - _, ok := u.sources[NormalizeURL(url)] - return ok -} - -func (u *User) HasMuted(url string) bool { - _, ok := u.muted[NormalizeURL(url)] - return ok -} - -func (u *User) Source() types.Feeds { - feeds := make(types.Feeds) - feeds[types.Feed{Nick: u.Username, URL: u.URL}] = true - return feeds -} - -func (u *User) Sources() types.Feeds { - // Ensure we fetch the user's own posts in the cache - feeds := u.Source() - for url, nick := range u.sources { - feeds[types.Feed{Nick: nick, URL: url}] = true - } - return feeds -} - -func (u *User) Profile(baseURL string, viewer *User) types.Profile { - var ( - follows bool - followedBy bool - muted bool - ) - - if viewer != nil { - if viewer.Is(u.URL) { - follows = true - followedBy = true - } else { - follows = viewer.Follows(u.URL) - followedBy = viewer.FollowedBy(u.URL) - } - - muted = viewer.HasMuted(u.URL) - } - - return types.Profile{ - Type: "User", - - Username: u.Username, - Tagline: u.Tagline, - URL: u.URL, - BlogsURL: URLForBlogs(baseURL, u.Username), - - Follows: follows, - FollowedBy: followedBy, - Muted: muted, - - Followers: u.Followers, - Following: u.Following, - Bookmarks: u.Bookmarks, - } -} - -func (u *User) Twter() types.Twter { - return types.Twter{Nick: u.Username, URL: u.URL} -} - -func (u *User) Filter(twts []types.Twt) (filtered []types.Twt) { - // fast-path - if len(u.muted) == 0 { - return twts - } - - for _, twt := range twts { - if u.HasMuted(twt.Twter().URL) { - continue - } - filtered = append(filtered, twt) - } - return -} - -func (u *User) Reply(twt types.Twt) string { - mentionsSet := make(map[string]bool) - for _, m := range twt.Mentions() { - twter := m.Twter() - if _, ok := mentionsSet[twter.Nick]; !ok && twter.Nick != u.Username { - mentionsSet[twter.Nick] = true - } - } - - mentions := []string{fmt.Sprintf("@%s", twt.Twter().Nick)} - for nick := range mentionsSet { - mentions = append(mentions, fmt.Sprintf("@%s", nick)) - } - - mentions = UniqStrings(mentions) - - subject := twt.Subject() - - if subject != "" { - subject = FormatMentionsAndTagsForSubject(subject) - return fmt.Sprintf("%s %s ", strings.Join(mentions, " "), subject) - } - return fmt.Sprintf("%s ", strings.Join(mentions, " ")) -} - func (u *User) Bytes() ([]byte, error) { data, err := json.Marshal(u) if err != nil { diff --git a/internal/options.go b/internal/options.go index 4d04ddf..4ee3598 100644 --- a/internal/options.go +++ b/internal/options.go @@ -26,8 +26,9 @@ const ( // DefaultAdminXXX is the default admin user / pod operator DefaultAdminUser = "admin" + DefaultAdminPass = "admiN" DefaultAdminName = "Administrator" - DefaultAdminEmail = "support@twt.social" + DefaultAdminEmail = "support@spyda.dev" // DefaultName is the default instance name DefaultName = "spyda.dev" @@ -41,36 +42,11 @@ const ( // DefaultTheme is the default theme to use ('light' or 'dark') DefaultTheme = "dark" - // DefaultOpenRegistrations is the default for open user registrations - DefaultOpenRegistrations = false - - // DefaultRegisterMessage is the default message displayed when registrations are disabled - DefaultRegisterMessage = "" - // DefaultCookieSecret is the server's default cookie secret DefaultCookieSecret = InvalidConfigValue - // DefaultTwtsPerPage is the server's default twts per page to display - DefaultTwtsPerPage = 50 - - // DefaultMaxTwtLength is the default maximum length of posts permitted - DefaultMaxTwtLength = 288 - - // DefaultMaxCacheTTL is the default maximum cache ttl of twts in memory - DefaultMaxCacheTTL = time.Hour * 24 * 10 // 10 days 28 days 28 days 28 days - - // DefaultMaxCacheItems is the default maximum cache items (per feed source) - // of twts in memory - DefaultMaxCacheItems = DefaultTwtsPerPage * 3 // We get bored after paging thorughh > 3 pages :D - - // DefaultMsgPerPage is the server's default msgs per page to display - DefaultMsgsPerPage = 20 - - // DefaultOpenProfiles is the default for whether or not to have open user profiles - DefaultOpenProfiles = false - - // DefaultMaxUploadSize is the default maximum upload size permitted - DefaultMaxUploadSize = 1 << 24 // ~16MB (enough for high-res photos) + // DefaultResultsPerPage is the server's default results per page to display + DefaultResultsPerPage = 10 // DefaultSessionCacheTTL is the server's default session cache ttl DefaultSessionCacheTTL = 1 * time.Hour @@ -78,16 +54,9 @@ const ( // DefaultSessionExpiry is the server's default session expiry time DefaultSessionExpiry = 240 * time.Hour // 10 days - // DefaultTranscoderTimeout is the default vodeo transcoding timeout - DefaultTranscoderTimeout = 10 * time.Minute // 10mins - // DefaultMagicLinkSecret is the jwt magic link secret DefaultMagicLinkSecret = InvalidConfigValue - // Default Messaging settings - DefaultSMTPBind = "0.0.0.0:8025" - DefaultPOP3Bind = "0.0.0.0:8110" - // Default SMTP configuration DefaultSMTPHost = "smtp.gmail.com" DefaultSMTPPort = 587 @@ -95,9 +64,6 @@ const ( DefaultSMTPPass = InvalidConfigValue DefaultSMTPFrom = InvalidConfigValue - // DefaultMaxFetchLimit is the maximum fetch fetch limit in bytes - DefaultMaxFetchLimit = 1 << 21 // ~2MB (or more than enough for a year) - // DefaultAPISessionTime is the server's default session time for API tokens DefaultAPISessionTime = 240 * time.Hour // 10 days @@ -121,27 +87,26 @@ func NewConfig() *Config { return &Config{ Debug: DefaultDebug, - Name: DefaultName, - Description: DefaultMetaDescription, - Store: DefaultStore, - Theme: DefaultTheme, - BaseURL: DefaultBaseURL, - AdminUser: DefaultAdminUser, - FeedSources: DefaultFeedSources, - RegisterMessage: DefaultRegisterMessage, - CookieSecret: DefaultCookieSecret, - TwtPrompts: DefaultTwtPrompts, - TwtsPerPage: DefaultTwtsPerPage, - MaxTwtLength: DefaultMaxTwtLength, - MsgsPerPage: DefaultMsgsPerPage, - OpenProfiles: DefaultOpenProfiles, - OpenRegistrations: DefaultOpenRegistrations, - SessionExpiry: DefaultSessionExpiry, - MagicLinkSecret: DefaultMagicLinkSecret, - SMTPHost: DefaultSMTPHost, - SMTPPort: DefaultSMTPPort, - SMTPUser: DefaultSMTPUser, - SMTPPass: DefaultSMTPPass, + Name: DefaultName, + Description: DefaultMetaDescription, + Store: DefaultStore, + Theme: DefaultTheme, + BaseURL: DefaultBaseURL, + AdminUser: DefaultAdminUser, + AdminPass: DefaultAdminPass, + + CookieSecret: DefaultCookieSecret, + MagicLinkSecret: DefaultMagicLinkSecret, + + SearchPrompts: DefaultSearchPrompts, + ResultsPerPage: DefaultResultsPerPage, + + SessionExpiry: DefaultSessionExpiry, + + SMTPHost: DefaultSMTPHost, + SMTPPort: DefaultSMTPPort, + SMTPUser: DefaultSMTPUser, + SMTPPass: DefaultSMTPPass, } } @@ -257,50 +222,10 @@ func WithCookieSecret(secret string) Option { } } -// WithTwtsPerPage sets the server's twts per page -func WithTwtsPerPage(twtsPerPage int) Option { +// WithResultsPerPage sets the server's results per page +func WithResultsPerPage(resultsPerPage int) Option { return func(cfg *Config) error { - cfg.TwtsPerPage = twtsPerPage - return nil - } -} - -// WithMaxTwtLength sets the maximum length of posts permitted on the server -func WithMaxTwtLength(maxTwtLength int) Option { - return func(cfg *Config) error { - cfg.MaxTwtLength = maxTwtLength - return nil - } -} - -// WithMaxCacheTTL sets the maximum cache ttl of twts in memory -func WithMaxCacheTTL(maxCacheTTL time.Duration) Option { - return func(cfg *Config) error { - cfg.MaxCacheTTL = maxCacheTTL - return nil - } -} - -// WithMaxCacheItems sets the maximum cache items (per feed source) of twts in memory -func WithMaxCacheItems(maxCacheItems int) Option { - return func(cfg *Config) error { - cfg.MaxCacheItems = maxCacheItems - return nil - } -} - -// WithOpenProfiles sets whether or not to have open user profiles -func WithOpenProfiles(openProfiles bool) Option { - return func(cfg *Config) error { - cfg.OpenProfiles = openProfiles - return nil - } -} - -// WithMaxUploadSize sets the maximum upload size permitted by the server -func WithMaxUploadSize(maxUploadSize int64) Option { - return func(cfg *Config) error { - cfg.MaxUploadSize = maxUploadSize + cfg.ResultsPerPage = resultsPerPage return nil } } diff --git a/internal/pages/abuse.md b/internal/pages/abuse.md new file mode 100644 index 0000000..7979ef2 --- /dev/null +++ b/internal/pages/abuse.md @@ -0,0 +1,38 @@ +--- +title: Spyda Abuse Policy +--- + +# Abuse Policy + +> Help us build and maintain a quality search experience. + +At Spyda.search, we believe that the Web should be freely searchable without +having to track you or collect data about your searches or behavior. Everyone +should be able to benefit from an open search experience without worrying about +privacy. + +That being said there are a basic set of guidelines that help ensure that +search is of the highest quality and safe to use and considered acceptable +by everyone from all backgrounds and walks of live. + +Therefore the following outlines the types of content that Spyda will not +permit and if found will be immediately deleted and potenaitlly blacklisted +from future indexing. + +**If you have a website or know of a website that has been crawled and indexed +that violates these guidelines, please contact us immediately at /support so +we can remove the offending data.** + +- **Hate speech:** Any website found to be hosting content that attacks other people on the basis of race, ethnicity, national origin, sexual orientation, gender, gender identity, religious affiliation, age, disability, or disease. We will not index websites whose primary purpose is inciting harm towards others on the basis of these categories. +- **Threats of violence:** Any websites found to be treating, planning or otherwise of a treating nature towards others to organize, promote, or incite acts of real-world violence or terrorism. +- **Illegal activities**: Any websites found to be hosting content for unlawful purposes or in furtherance of illegal activities. International webmasters agree to comply with all local laws regarding online conduct and acceptable content. + +## What Happens If a Website Violates These Guidelines + +- It will be immediately removed from our indexes. +- We _may_ attempt to reach the webmaster to correct the situation. +- We _may_ blacklist the website from future indexing. + +Thanks for helping us build and maintain a safe and quality search experience for all! + +We reserve the right to update these guidelines as needed. diff --git a/internal/rice-box.go b/internal/rice-box.go deleted file mode 100644 index b7ac2ac..0000000 --- a/internal/rice-box.go +++ /dev/null @@ -1,348 +0,0 @@ -// Code generated by rice embed-go; DO NOT EDIT. -package internal - -import ( - "time" - - "github.com/GeertJohan/go.rice/embedded" -) - -func init() { - - // define files - file2 := &embedded.EmbeddedFile{ - Filename: "about.md", - FileModTime: time.Unix(1611978560, 0), - - Content: string("---\ntitle: About Spyda, a privacy first search engine and web crawler.\n---\n\n# About {{ .InstanceName }}\n\n🕸 {{ .InstanceName }} is a privacy first search engine and web crawler.\n\n> ... TBD ...\n\nFor additional help on how to use this service please see the [/help](/help)\npage or contact [/support](/support) for help.\n\nPlease also see the [/privacy](/privacy) policy.\n"), - } - file3 := &embedded.EmbeddedFile{ - Filename: "help.md", - FileModTime: time.Unix(1611978395, 0), - - Content: string("---\ntitle: Help on using Spyda Search\n---\n\n# Help\n\n> ... TBD ...\n"), - } - file4 := &embedded.EmbeddedFile{ - Filename: "privacy.md", - FileModTime: time.Unix(1609727320, 0), - - Content: string("---\ntitle: Privacy Policy\n---\n\n# Privacy Policy\n\nThis is aimed to be the world's simplest privacy policy.\nThis document should explain to you why the app collects some\ninformation, what happens when your account is deleted and some other\nfrequently asked questions answered regarding your privacy.\n\nIf you have any more questions, please raise an issue regarding\nthe same on GitHub and I'll answer as honest and quickly as possible :)\n\n
\n What identifiable information is stored about me?\n

\n Your username/nickname and your email address is stored along with\n your user information, and of course. You won't even get any\n marketing emails, feature updates, newsletters, notification emails,\n nothing.\n

\n
\n\n
\n How is this all free? There must be a catch!\n

\n Absolutely no catch to this freebie. This project is just my way of\n giving back to the community that I've learned so much from. If you'd\n like to show your appreciation however, you can follow me on my social\n media and let me know how much it helped you, or donate to help pay\n the cloud bills, or if you are a fellow developer, you can head to\n GitHub and contribute to the code by raising a PR.\n

\n
\n"), - } - - // define dirs - dir1 := &embedded.EmbeddedDir{ - Filename: "", - DirModTime: time.Unix(1611978560, 0), - ChildFiles: []*embedded.EmbeddedFile{ - file2, // "about.md" - file3, // "help.md" - file4, // "privacy.md" - - }, - } - - // link ChildDirs - dir1.ChildDirs = []*embedded.EmbeddedDir{} - - // register embeddedBox - embedded.RegisterEmbeddedBox(`pages`, &embedded.EmbeddedBox{ - Name: `pages`, - Time: time.Unix(1611978560, 0), - Dirs: map[string]*embedded.EmbeddedDir{ - "": dir1, - }, - Files: map[string]*embedded.EmbeddedFile{ - "about.md": file2, - "help.md": file3, - "privacy.md": file4, - }, - }) -} - -func init() { - - // define files - file6 := &embedded.EmbeddedFile{ - Filename: "01-pico.css", - FileModTime: time.Unix(1610934954, 0), - - Content: string("/*!\n * Pico.css v1.0.3 (https://picocss.com)\n * Copyright 2020 - Licensed under MIT\n */\n/**\n * Theme: default\n */\n [data-theme=\"light\"],\n :root:not([data-theme=\"dark\"]) {\n --background: #FFF;\n --text: #415462;\n --h1: #1b2832;\n --h2: #2c3d49;\n --h3: #415462;\n --h4: #596b78;\n --h5: #73828c;\n --h6: #8a99a3;\n --primary: #1095c1;\n --primary-hover: #08769b;\n --primary-focus: rgba(16, 149, 193, 0.125);\n --primary-inverse: #FFF;\n --secondary: #73828c;\n --secondary-hover: #415462;\n --secondary-focus: rgba(115, 130, 140, 0.125);\n --secondary-inverse: #FFF;\n --contrast: #2c3d49;\n --contrast-hover: #0d1419;\n --contrast-focus: rgba(115, 130, 140, 0.125);\n --contrast-border: rgba(255, 223, 128, 0.5);\n --contrast-inverse: #FFF;\n --input-background: #FFF;\n --input-border: #c8d1d8;\n --valid: #288a6a;\n --invalid: #b94646;\n --mark: rgba(255, 223, 128, 0.5);\n --mark-text: #2c3d49;\n --muted-text: #7e8d98;\n --muted-background: #edf0f3;\n --muted-border: #edf0f3;\n --card-background: #FFF;\n --card-sections: #f3f5f7;\n --card-shadow: 0 0.125rem 1rem rgba(27, 40, 50, 0.04), 0 0.125rem 2rem rgba(27, 40, 50, 0.08), 0 0 0 0.0625rem rgba(27, 40, 50, 0.024);\n --code-background: #f3f5f7;\n --code-inlined: #edf0f3;\n --code-color-1: #73828c;\n --code-color-2: #b34d80;\n --code-color-3: #3d888f;\n --code-color-4: #998866;\n --code-color-5: #96a4ae;\n --table-border: rgba(237, 240, 243, 0.75);\n --table-stripping: rgba(115, 130, 140, 0.04); }\n\n @media only screen and (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n --background: #10181e;\n --text: #a2afb9;\n --h1: #edf0f3;\n --h2: #d5dce2;\n --h3: #bbc6ce;\n --h4: #a2afb9;\n --h5: #8a99a3;\n --h6: #73828c;\n --primary: #1095c1;\n --primary-hover: #1ab3e6;\n --primary-focus: rgba(16, 149, 193, 0.25);\n --primary-inverse: #FFF;\n --secondary: #596b78;\n --secondary-hover: #73828c;\n --secondary-focus: rgba(89, 107, 120, 0.25);\n --secondary-inverse: #FFF;\n --contrast: #d5dce2;\n --contrast-hover: #FFF;\n --contrast-focus: rgba(89, 107, 120, 0.25);\n --contrast-border: rgba(255, 223, 128, 0.33);\n --contrast-inverse: #10181e;\n --input-background: #10181e;\n --input-border: #374956;\n --valid: #1f7a5c;\n --invalid: #943838;\n --mark: rgba(255, 223, 128, 0.5);\n --mark-text: #FFF;\n --muted-text: #73828c;\n --muted-background: #10181e;\n --muted-border: #23333e;\n --card-background: #17232b;\n --card-sections: #141d24;\n --card-shadow: 0 0.125rem 1rem rgba(0, 0, 0, 0.08), 0 0.125rem 2rem rgba(0, 0, 0, 0.04), 0 0 0 0.0625rem rgba(0, 0, 0, 0.1);\n --code-background: #141d24;\n --code-inlined: rgba(65, 84, 98, 0.25);\n --code-color-1: #73828c;\n --code-color-2: #a65980;\n --code-color-3: #599fa6;\n --code-color-4: #8c8473;\n --code-color-5: #4d606d;\n --table-border: #10181e;\n --table-stripping: rgba(115, 130, 140, 0.02); } }\n\n [data-theme=\"dark\"] {\n --background: #10181e;\n --text: #a2afb9;\n --h1: #edf0f3;\n --h2: #d5dce2;\n --h3: #bbc6ce;\n --h4: #a2afb9;\n --h5: #8a99a3;\n --h6: #73828c;\n --primary: #1095c1;\n --primary-hover: #1ab3e6;\n --primary-focus: rgba(16, 149, 193, 0.25);\n --primary-inverse: #FFF;\n --secondary: #596b78;\n --secondary-hover: #73828c;\n --secondary-focus: rgba(89, 107, 120, 0.25);\n --secondary-inverse: #FFF;\n --contrast: #d5dce2;\n --contrast-hover: #FFF;\n --contrast-focus: rgba(89, 107, 120, 0.25);\n --contrast-border: rgba(255, 223, 128, 0.33);\n --contrast-inverse: #10181e;\n --input-background: #10181e;\n --input-border: #374956;\n --valid: #1f7a5c;\n --invalid: #943838;\n --mark: rgba(255, 223, 128, 0.5);\n --mark-text: #FFF;\n --muted-text: #73828c;\n --muted-background: #10181e;\n --muted-border: #23333e;\n --card-background: #17232b;\n --card-sections: #141d24;\n --card-shadow: 0 0.125rem 1rem rgba(0, 0, 0, 0.08), 0 0.125rem 2rem rgba(0, 0, 0, 0.04), 0 0 0 0.0625rem rgba(0, 0, 0, 0.1);\n --code-background: #141d24;\n --code-inlined: rgba(65, 84, 98, 0.25);\n --code-color-1: #73828c;\n --code-color-2: #a65980;\n --code-color-3: #599fa6;\n --code-color-4: #8c8473;\n --code-color-5: #4d606d;\n --table-border: #10181e;\n --table-stripping: rgba(115, 130, 140, 0.02); }\n\n /**\n * Document\n * Content-box & Responsive typography\n */\n *,\n *::before,\n *::after {\n box-sizing: border-box; }\n\n html {\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n background: var(--background);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 16px;\n font-weight: 400;\n line-height: 1.5;\n text-rendering: optimizeLegibility; }\n @media (min-width: 576px) {\n html {\n font-size: 17px; } }\n @media (min-width: 768px) {\n html {\n font-size: 18px; } }\n @media (min-width: 992px) {\n html {\n font-size: 19px; } }\n @media (min-width: 1200px) {\n html {\n font-size: 20px; } }\n\n /**\n * Sectioning\n * Container and responsive spacings for header, main, footer\n */\n main {\n display: block; }\n\n body {\n width: 100%;\n margin: 0; }\n body > header,\n body > main,\n body > footer {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding: 1rem 0; }\n\n /**\n * Container\n */\n .container,\n .container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 1rem;\n padding-left: 1rem; }\n\n @media (min-width: 576px) {\n .container {\n padding-right: 0;\n padding-left: 0;\n max-width: 510px; } }\n\n @media (min-width: 768px) {\n .container {\n max-width: 700px; } }\n\n @media (min-width: 992px) {\n .container {\n max-width: 920px; } }\n\n @media (min-width: 1200px) {\n .container {\n max-width: 1130px; } }\n\n /**\n * Section\n * Responsive spacings for section\n */\n section {\n margin-bottom: 2rem; }\n\n /**\n * Grid\n * Minimal grid system with auto-layout columns\n */\n .grid {\n grid-column-gap: 1rem;\n grid-row-gap: 1rem;\n display: grid;\n grid-template-columns: 1fr;\n margin: 0; }\n @media (min-width: 992px) {\n .grid {\n grid-template-columns: repeat(auto-fit, minmax(0%, 1fr)); } }\n .grid > * {\n min-width: 0; }\n\n /**\n * Horizontal scroller (
)\n */\n figure {\n display: block;\n margin: 0;\n padding: 0;\n overflow-x: auto; }\n figure figcaption {\n padding: 0.5rem 0;\n color: var(--muted-text); }\n\n /**\n * Typography\n */\n b,\n strong {\n font-weight: bolder; }\n\n sub,\n sup {\n position: relative;\n font-size: .75rem;\n line-height: 0;\n vertical-align: baseline; }\n\n sub {\n bottom: -0.25rem; }\n\n sup {\n top: -0.5rem; }\n\n img {\n max-width: 100%;\n height: auto;\n border-style: none; }\n\n svg,\n img {\n vertical-align: text-bottom; }\n\n address,\n blockquote,\n dl,\n figure,\n form,\n ol,\n p,\n pre,\n table,\n ul {\n margin-top: 0;\n margin-bottom: 1.5rem;\n color: var(--text);\n font-size: 1rem;\n font-style: normal; }\n\n a {\n background-color: transparent;\n color: var(--primary);\n text-decoration: none;\n transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, box-shadow 0.2s ease-in-out; }\n a:hover, a:active, a:focus {\n color: var(--primary-hover);\n text-decoration: underline; }\n a:focus {\n outline: none;\n background-color: var(--primary-focus); }\n\n a.secondary {\n color: var(--secondary); }\n a.secondary:hover, a.secondary:active, a.secondary:focus {\n color: var(--secondary-hover); }\n a.secondary:focus {\n background-color: var(--secondary-focus); }\n\n a.contrast:not([role=\"button\"]) {\n box-shadow: inset 0 -0.33rem 0 var(--contrast-border);\n color: var(--contrast); }\n a.contrast:not([role=\"button\"]):hover, a.contrast:not([role=\"button\"]):active, a.contrast:not([role=\"button\"]):focus {\n color: var(--contrast-hover); }\n a.contrast:not([role=\"button\"]):focus {\n background-color: var(--contrast-focus); }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n margin-bottom: 1.5rem;\n font-weight: 700; }\n\n h1 {\n margin-bottom: 3rem;\n color: var(--h1);\n font-size: 2rem; }\n\n h2 {\n margin-bottom: 2.625rem;\n color: var(--h2);\n font-size: 1.75rem; }\n\n h3 {\n margin-bottom: 2.25rem;\n color: var(--h3);\n font-size: 1.5rem; }\n\n h4 {\n margin-bottom: 1.875rem;\n color: var(--h4);\n font-size: 1.25rem; }\n\n h5 {\n margin-bottom: 1.6875rem;\n color: var(--h5);\n font-size: 1.125rem; }\n\n h6 {\n color: var(--h6);\n font-size: 1rem; }\n\n hgroup {\n margin-bottom: 1.5rem; }\n hgroup * {\n margin-bottom: 0; }\n hgroup > *:last-child {\n color: var(--muted-text);\n font-size: 1.125rem;\n font-weight: normal; }\n\n p {\n margin-bottom: 0.75rem; }\n\n small {\n font-size: 85%; }\n @media (min-width: 576px) {\n small {\n font-size: 83%; } }\n @media (min-width: 768px) {\n small {\n font-size: 81%; } }\n @media (min-width: 992px) {\n small {\n font-size: 79%; } }\n @media (min-width: 1200px) {\n small {\n font-size: 77%; } }\n\n ul,\n ol {\n padding-left: 1.5rem; }\n ul li,\n ol li {\n margin-bottom: 0.75rem; }\n\n ul li {\n list-style: square; }\n\n mark {\n padding: .125rem .25rem;\n background: var(--mark);\n color: var(--mark-text);\n vertical-align: middle; }\n\n blockquote {\n display: block;\n margin: 3rem 0;\n padding: 1rem;\n border-left: 0.25rem solid var(--muted-border); }\n blockquote footer {\n margin-top: 0.75rem;\n color: var(--muted-text); }\n\n abbr[title] {\n border-bottom: 1px dotted;\n text-decoration: none;\n cursor: help; }\n\n ins {\n color: var(--valid);\n text-decoration: none; }\n\n del {\n color: var(--invalid); }\n\n ::selection {\n background-color: var(--primary-focus); }\n\n /**\n * Form elements\n */\n input,\n optgroup,\n select,\n textarea {\n margin: 0;\n font-family: inherit;\n font-size: 1rem;\n line-height: 1.5; }\n\n input {\n overflow: visible; }\n\n select {\n text-transform: none; }\n\n legend {\n display: table;\n max-width: 100%;\n padding: 0;\n color: inherit;\n white-space: normal; }\n\n textarea {\n overflow: auto; }\n\n [type=\"checkbox\"],\n [type=\"radio\"] {\n padding: 0; }\n\n [type=\"number\"]::-webkit-inner-spin-button {\n height: auto; }\n\n [type=\"search\"] {\n -webkit-appearance: textfield;\n outline-offset: -2px; }\n\n [type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none; }\n\n ::-webkit-file-upload-button {\n -webkit-appearance: button;\n font: inherit; }\n\n fieldset {\n margin: 0;\n margin-bottom: 1.5rem;\n padding: 0;\n border: 0; }\n\n input:not([type=\"checkbox\"]):not([type=\"radio\"]),\n select,\n textarea,\n form small {\n display: block;\n width: 100%; }\n\n label,\n fieldset legend {\n display: block;\n margin-bottom: 0.125rem;\n vertical-align: middle; }\n\n input,\n select,\n textarea {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border: 1px solid var(--input-border);\n border-radius: 0.25rem;\n outline: none;\n background-color: var(--input-background);\n color: var(--text);\n font-weight: normal;\n vertical-align: middle;\n transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; }\n input::placeholder,\n select::placeholder,\n textarea::placeholder {\n color: var(--muted-text);\n opacity: 1; }\n input:active, input:focus,\n select:active,\n select:focus,\n textarea:active,\n textarea:focus {\n border-color: var(--primary); }\n input:focus,\n select:focus,\n textarea:focus {\n box-shadow: 0 0 0 0.2rem var(--primary-focus); }\n input[readonly], input[disabled],\n select[readonly],\n select[disabled],\n textarea[readonly],\n textarea[disabled] {\n border-color: var(--muted-border);\n box-shadow: none; }\n input[readonly] ~ label, input[disabled] ~ label,\n select[readonly] ~ label,\n select[disabled] ~ label,\n textarea[readonly] ~ label,\n textarea[disabled] ~ label {\n color: var(--muted-text); }\n input[disabled],\n select[disabled],\n textarea[disabled] {\n background-color: var(--muted-background);\n opacity: .5; }\n\n input:not([type=\"checkbox\"]):not([type=\"radio\"]),\n select,\n textarea {\n margin-bottom: 1.5rem;\n padding: 0.75rem 1rem; }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]).valid, input:not([type=\"checkbox\"]):not([type=\"radio\"]).invalid,\n select.valid,\n select.invalid,\n textarea.valid,\n textarea.invalid {\n padding-right: 2rem;\n background-position: center right .75rem;\n background-repeat: no-repeat;\n background-size: 1rem auto; }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]).valid,\n select.valid,\n textarea.valid {\n border-bottom: 1px solid var(--valid);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23288a6a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\"); }\n input:not([type=\"checkbox\"]):not([type=\"radio\"]).invalid,\n select.invalid,\n textarea.invalid {\n border-bottom: 1px solid var(--invalid);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23b94646' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\"); }\n\n input[type=\"color\"] {\n height: calc(3rem + 2px); }\n\n select::-ms-expand {\n border: 0;\n background-color: transparent; }\n\n select:not([multiple]) {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n background-position: center right .75rem;\n background-repeat: no-repeat;\n background-size: 1rem auto; }\n\n form small {\n color: var(--muted-text); }\n\n input + small {\n margin-top: -1rem;\n margin-bottom: 1.5rem; }\n\n label > input:not([type=\"checkbox\"]):not([type=\"radio\"]),\n label > select,\n label > textarea {\n margin-top: 0.125rem; }\n\n /**\n * Form elements\n */\n [type=\"checkbox\"],\n [type=\"radio\"] {\n display: inline-block;\n width: 1em;\n height: 1em;\n margin-right: .375rem;\n margin-bottom: 0.125rem;\n border-width: 2px;\n font-size: 1.125rem;\n vertical-align: middle;\n cursor: pointer;\n transition: none; }\n [type=\"checkbox\"]::-ms-check,\n [type=\"radio\"]::-ms-check {\n display: none; }\n [type=\"checkbox\"]:checked,\n [type=\"radio\"]:checked {\n border-color: var(--primary);\n background-color: var(--primary);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23FFF' stroke-width='5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n background-position: center;\n background-repeat: no-repeat;\n background-size: .66rem auto; }\n [type=\"checkbox\"] ~ label,\n [type=\"radio\"] ~ label {\n display: inline-block;\n margin-right: .375rem;\n margin-bottom: 0;\n cursor: pointer; }\n\n [type=\"radio\"] {\n border-radius: 50%; }\n [type=\"radio\"]:checked {\n border-width: .33rem;\n border-color: var(--primary);\n background-color: var(--primary-inverse);\n background-image: none; }\n\n [type=\"checkbox\"][role=\"switch\"] {\n width: 1.85em;\n height: 1em;\n border: 2px solid var(--input-border);\n border-radius: 1em;\n background-color: var(--input-border);\n line-height: 1em; }\n [type=\"checkbox\"][role=\"switch\"]:before {\n display: block;\n width: calc(1em - 4px);\n height: 100%;\n border-radius: 50%;\n background-color: var(--primary-inverse);\n content: '';\n transition: margin 0.1s ease-in-out; }\n [type=\"checkbox\"][role=\"switch\"]:checked {\n border-color: var(--primary);\n background-color: var(--primary);\n background-image: none; }\n [type=\"checkbox\"][role=\"switch\"]:checked::before {\n margin-right: 0;\n margin-left: calc(0.925em - 2px); }\n\n /**\n * Button\n */\n button {\n margin: 0;\n overflow: visible;\n font-family: inherit;\n text-transform: none; }\n\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n -webkit-appearance: button; }\n\n button::-moz-focus-inner,\n [type=\"button\"]::-moz-focus-inner,\n [type=\"reset\"]::-moz-focus-inner,\n [type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none; }\n\n button {\n display: block;\n width: 100%;\n margin-bottom: 1.5rem; }\n\n a[role=\"button\"] {\n display: inline-block;\n text-decoration: none; }\n\n button,\n input[type=\"submit\"],\n a[role=\"button\"] {\n border: 1px solid transparent;\n padding: 0.75rem 1rem;\n border-radius: 0.25rem;\n outline: none;\n background-color: var(--primary);\n color: var(--primary-inverse);\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n text-align: center;\n cursor: pointer;\n transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; }\n button:hover, button:active, button:focus,\n input[type=\"submit\"]:hover,\n input[type=\"submit\"]:active,\n input[type=\"submit\"]:focus,\n a[role=\"button\"]:hover,\n a[role=\"button\"]:active,\n a[role=\"button\"]:focus {\n background-color: var(--primary-hover); }\n button:focus,\n input[type=\"submit\"]:focus,\n a[role=\"button\"]:focus {\n box-shadow: 0 0 0 0.2rem var(--primary-focus); }\n\n input[type=\"reset\"] {\n cursor: pointer; }\n\n button[disabled],\n input[type=\"submit\"][disabled],\n input[type=\"reset\"][disabled],\n a[role=\"button\"][disabled] {\n opacity: .5;\n pointer-events: none; }\n\n /**\n * Button Styles\n */\n button.secondary,\n input.secondary[type=\"submit\"],\n input[type=\"reset\"],\n a.secondary[role=\"button\"] {\n background-color: var(--secondary);\n color: var(--secondary-inverse); }\n button.secondary:hover, button.secondary:active, button.secondary:focus,\n input.secondary[type=\"submit\"]:hover,\n input.secondary[type=\"submit\"]:active,\n input.secondary[type=\"submit\"]:focus,\n input[type=\"reset\"]:hover,\n input[type=\"reset\"]:active,\n input[type=\"reset\"]:focus,\n a.secondary[role=\"button\"]:hover,\n a.secondary[role=\"button\"]:active,\n a.secondary[role=\"button\"]:focus {\n background-color: var(--secondary-hover); }\n button.secondary:focus,\n input.secondary[type=\"submit\"]:focus,\n input[type=\"reset\"]:focus,\n a.secondary[role=\"button\"]:focus {\n box-shadow: 0 0 0 0.2rem var(--secondary-focus); }\n\n button.contrast,\n input.contrast[type=\"submit\"],\n input.contrast[type=\"reset\"],\n a.contrast[role=\"button\"] {\n background-color: var(--contrast);\n color: var(--contrast-inverse); }\n button.contrast:hover, button.contrast:active, button.contrast:focus,\n input.contrast[type=\"submit\"]:hover,\n input.contrast[type=\"submit\"]:active,\n input.contrast[type=\"submit\"]:focus,\n input.contrast[type=\"reset\"]:hover,\n input.contrast[type=\"reset\"]:active,\n input.contrast[type=\"reset\"]:focus,\n a.contrast[role=\"button\"]:hover,\n a.contrast[role=\"button\"]:active,\n a.contrast[role=\"button\"]:focus {\n background-color: var(--contrast-hover); }\n button.contrast:focus,\n input.contrast[type=\"submit\"]:focus,\n input.contrast[type=\"reset\"]:focus,\n a.contrast[role=\"button\"]:focus {\n box-shadow: 0 0 0 0.2rem var(--contrast-focus); }\n\n button.outline,\n input.outline[type=\"submit\"],\n a.outline[role=\"button\"] {\n border: 1px solid var(--primary);\n background-color: transparent;\n color: var(--primary); }\n button.outline:hover, button.outline:active, button.outline:focus,\n input.outline[type=\"submit\"]:hover,\n input.outline[type=\"submit\"]:active,\n input.outline[type=\"submit\"]:focus,\n a.outline[role=\"button\"]:hover,\n a.outline[role=\"button\"]:active,\n a.outline[role=\"button\"]:focus {\n border: 1px solid var(--primary-hover);\n color: var(--primary-hover); }\n\n button.outline.secondary,\n input.outline.secondary[type=\"submit\"],\n input.outline[type=\"reset\"],\n a.outline.secondary[role=\"button\"] {\n border: 1px solid var(--secondary);\n background-color: transparent;\n color: var(--secondary); }\n button.outline.secondary:hover, button.outline.secondary:active, button.outline.secondary:focus,\n input.outline.secondary[type=\"submit\"]:hover,\n input.outline.secondary[type=\"submit\"]:active,\n input.outline.secondary[type=\"submit\"]:focus,\n input.outline[type=\"reset\"]:hover,\n input.outline[type=\"reset\"]:active,\n input.outline[type=\"reset\"]:focus,\n a.outline.secondary[role=\"button\"]:hover,\n a.outline.secondary[role=\"button\"]:active,\n a.outline.secondary[role=\"button\"]:focus {\n border: 1px solid var(--secondary-hover);\n color: var(--secondary-hover); }\n button.outline.secondary:focus,\n input.outline.secondary[type=\"submit\"]:focus,\n input.outline[type=\"reset\"]:focus,\n a.outline.secondary[role=\"button\"]:focus {\n box-shadow: 0 0 0 0.2rem var(--secondary-focus); }\n\n button.outline.contrast,\n input.outline.contrast[type=\"submit\"],\n input.outline.contrast[type=\"reset\"],\n a.outline.contrast[role=\"button\"] {\n border: 1px solid var(--contrast);\n background-color: transparent;\n color: var(--contrast); }\n button.outline.contrast:hover, button.outline.contrast:active, button.outline.contrast:focus,\n input.outline.contrast[type=\"submit\"]:hover,\n input.outline.contrast[type=\"submit\"]:active,\n input.outline.contrast[type=\"submit\"]:focus,\n input.outline.contrast[type=\"reset\"]:hover,\n input.outline.contrast[type=\"reset\"]:active,\n input.outline.contrast[type=\"reset\"]:focus,\n a.outline.contrast[role=\"button\"]:hover,\n a.outline.contrast[role=\"button\"]:active,\n a.outline.contrast[role=\"button\"]:focus {\n border: 1px solid var(--contrast-hover);\n color: var(--contrast-hover); }\n button.outline.contrast:focus,\n input.outline.contrast[type=\"submit\"]:focus,\n input.outline.contrast[type=\"reset\"]:focus,\n a.outline.contrast[role=\"button\"]:focus {\n box-shadow: 0 0 0 0.2rem var(--contrast-focus); }\n\n /**\n * Table\n */\n table {\n width: 100%;\n border-spacing: 0; }\n\n th,\n td {\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--table-border);\n color: var(--muted-text);\n font-weight: 400;\n text-align: left;\n font-size: 0.875rem; }\n\n th,\n thead td {\n color: var(--text);\n font-size: 1rem; }\n\n thead th,\n thead td {\n border-bottom: 3px solid var(--table-border); }\n\n tbody tr:nth-child(odd) {\n background-color: var(--table-stripping); }\n\n /**\n * Code\n */\n pre,\n code,\n kbd,\n samp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1rem; }\n\n pre,\n code,\n kbd {\n background: var(--code-inlined);\n color: var(--code-color-1);\n font-size: 85%;\n font-weight: 400;\n line-height: 1; }\n @media (min-width: 576px) {\n pre,\n code,\n kbd {\n font-size: 83%; } }\n @media (min-width: 768px) {\n pre,\n code,\n kbd {\n font-size: 81%; } }\n @media (min-width: 992px) {\n pre,\n code,\n kbd {\n font-size: 79%; } }\n @media (min-width: 1200px) {\n pre,\n code,\n kbd {\n font-size: 77%; } }\n\n code,\n kbd {\n display: inline-block;\n padding: .375rem .5rem;\n border-radius: 0.25rem; }\n\n pre {\n display: block;\n margin-bottom: 1rem;\n padding: 1rem 1rem;\n overflow-x: auto;\n background: var(--code-background); }\n pre > code {\n display: block;\n padding: 0;\n background: transparent;\n font-size: 14px;\n line-height: 1.5; }\n\n code b {\n color: var(--code-color-2);\n font-weight: normal; }\n\n code i {\n color: var(--code-color-3);\n font-style: normal; }\n\n code u {\n color: var(--code-color-4);\n text-decoration: none; }\n\n code em {\n color: var(--code-color-5);\n font-style: normal; }\n\n kbd {\n background-color: var(--secondary);\n color: var(--secondary-inverse);\n font-weight: bolder; }\n\n /**\n * Miscs\n */\n hr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n border: none;\n border-top: 1px solid var(--muted-border); }\n\n progress {\n vertical-align: baseline; }\n\n [hidden],\n template {\n display: none; }\n\n /**\n * Accordion (
)\n * Inspiration: https://codepen.io/koca/pen/RyeLLV\n */\n details {\n display: block;\n margin-bottom: 1.5rem;\n padding-bottom: 0.75rem;\n border-bottom: 1px solid var(--muted-border); }\n details summary {\n list-style-type: none;\n cursor: pointer;\n line-height: 1rem; }\n details summary::-webkit-details-marker {\n display: none; }\n details summary::marker {\n display: none; }\n details summary::-moz-list-bullet {\n list-style-type: none; }\n details summary::after {\n display: inline-block;\n width: 1rem;\n height: 1rem;\n float: right;\n transform: rotate(-90deg);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");\n background-position: center;\n background-repeat: no-repeat;\n background-size: 1rem auto;\n content: ''; }\n details summary:focus {\n outline: none; }\n details summary ~ * {\n margin-top: 0.75rem; }\n details summary ~ * ~ * {\n margin-top: 0; }\n details[open] summary {\n margin-bottom: 0.375rem;\n color: var(--muted-text); }\n details[open] summary::after {\n transform: rotate(0); }\n\n /**\n * Card (
)\n */\n article {\n margin: 1rem 0;\n padding: 1rem 1rem;\n overflow: hidden;\n border-radius: 0.25rem;\n background: var(--card-background);\n box-shadow: var(--card-shadow); }\n @media (min-width: 576px) {\n article {\n margin: 1rem 0;\n padding: 1rem; } }\n article > *:not(header):not(footer):not(pre):last-child {\n margin-bottom: 0; }\n\n /**\n * Card sectionning (
> header, footer, pre)\n */\n article > header,\n article > footer {\n background-color: var(--card-sections); }\n\n article > header,\n article > footer {\n margin: -1rem;\n padding: 1rem 1rem; }\n\n article > header {\n margin-top: -2rem;\n margin-bottom: 1rem; }\n\n article > footer {\n margin-top: 1rem;\n margin-bottom: -2rem; }\n\n /**\n * Nav\n */\n nav,\n nav ul {\n display: flex; }\n\n nav {\n justify-content: space-between; }\n nav ul {\n align-items: center;\n margin-bottom: 0;\n padding: 0;\n list-style: none; }\n nav ul:first-of-type {\n margin-left: -0.5rem; }\n nav ul:last-of-type {\n margin-right: -0.5rem; }\n nav li {\n display: inline-block;\n margin: 0;\n padding: 1rem 0.5rem; }\n nav li > *,\n nav li > input:not([type=\"checkbox\"]):not([type=\"radio\"]) {\n margin-bottom: 0; }\n nav a {\n display: block;\n margin: -1rem -0.5rem;\n padding: 1rem 0.5rem;\n border-radius: 0.25rem; }\n nav a:hover, nav a:active, nav a:focus {\n text-decoration: none; }\n nav a.contrast:not([role=\"button\"]) {\n box-shadow: none; }\n\n aside nav,\n aside ul,\n aside li {\n display: block; }\n\n aside li {\n padding: 0.5rem; }\n aside li a {\n margin: -0.5rem;\n padding: 0.5rem; }\n\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) {\n display: none; }\n\n @media (max-width: 576px) {\n nav#mainNav {\n display: table;\n width: 100%; }\n nav#mainNav ul {\n display: table-row;\n margin: 0 !important;\n width: 100%; }\n nav#mainNav ul li {\n display: none; }\n nav#mainNav ul:nth-of-type(1) {\n /* Burger Menu & Home Link */\n /* Burger Menu */\n /* Home Link */\n /* Other Links */ }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(1), nav#mainNav ul:nth-of-type(1) li:nth-of-type(2) {\n display: table-column;\n float: right;\n position: relative;\n width: 50%; }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) {\n text-align: right; }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) a:focus {\n background: transparent; }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) a i.icss-bars {\n margin-top: 0.1em; }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(2) {\n text-align: left; }\n nav#mainNav ul:nth-of-type(1) li:nth-of-type(2) a i.icss-home {\n margin-bottom: 0.3em; }\n nav#mainNav ul:nth-of-type(1) li:not(:nth-of-type(1)):not(:nth-of-type(2)) {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem; }\n nav#mainNav ul:not(:nth-of-type(1)) li {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem; }\n .responsive {\n overflow: hidden; }\n .responsive li {\n display: block !important; } }\n\n /**\n * Tooltip ([data-tooltip])\n */\n [data-tooltip] {\n position: relative; }\n [data-tooltip]:not(a):not(button):not(input) {\n border-bottom: 1px dotted;\n text-decoration: none;\n cursor: help; }\n [data-tooltip]::before, [data-tooltip]::after {\n display: block;\n z-index: 99;\n position: absolute;\n bottom: 100%;\n left: 50%;\n padding: .25rem .5rem;\n overflow: hidden;\n transform: translate(-50%, -0.25rem);\n border-radius: 0.25rem;\n background: var(--contrast);\n color: var(--contrast-inverse);\n font-size: .85rem;\n font-style: normal;\n font-weight: normal;\n text-decoration: none;\n text-overflow: ellipsis;\n white-space: nowrap;\n content: attr(data-tooltip);\n opacity: 0;\n pointer-events: none; }\n [data-tooltip]::after {\n padding: 0;\n transform: translate(-50%, 0rem);\n border-top: .3rem solid;\n border-right: .3rem solid transparent;\n border-left: .3rem solid transparent;\n border-radius: 0;\n background-color: transparent;\n color: var(--contrast);\n content: ''; }\n [data-tooltip]:focus::before, [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after {\n opacity: 1; }\n\n"), - } - file7 := &embedded.EmbeddedFile{ - Filename: "02-icss.css", - FileModTime: time.Unix(1609727320, 0), - - Content: string("\ni[class*=\"icss-\"] {\n position: relative;\n display:inline-block;\n font-style: normal;\n background-color:currentColor;\n box-sizing: border-box;\n vertical-align: middle;\n}\ni[class*=\"icss-\"]:before, \ni[class*=\"icss-\"]:after {\n content: \"\";\n border-width: 0; \n position: absolute;\n box-sizing: border-box;\n}\n\n/* Size */\n[class*=\"icss-\"].xxsmall {\n font-size: .45em;\n}\n[class*=\"icss-\"].xsmall {\n font-size: .5em;\n}\n[class*=\"icss-\"].small {\n font-size: .65em;\n}\n[class*=\"icss-\"].x1_5 {\n font-size: 1.5em;\n}\n[class*=\"icss-\"].x2 {\n font-size: 2em;\n}\n[class*=\"icss-\"].x2_5 {\n font-size: 2.5em;\n}\n[class*=\"icss-\"].x3 {\n font-size: 3em;\n}\n[class*=\"icss-\"].x4 {\n font-size: 4em;\n}\n[class*=\"icss-\"].x5 {\n font-size: 5em;\n}\n\n/* Align text-bottom */\ni[class*=\"icss-\"].bottom {\n vertical-align:text-bottom;\n}\n\n/* flip */\n.flip {\n transform: scaleX(-1);\n}\n\n/* rotate */\ni[class*=\"icss-\"].rot10 {\n transform: rotate(10deg);\n}\ni[class*=\"icss-\"].rot-10 {\n transform: rotate(-10deg);\n}\ni[class*=\"icss-\"].rot20 {\n transform: rotate(20deg);\n}\ni[class*=\"icss-\"].rot-20 {\n transform: rotate(-20deg);\n}\ni[class*=\"icss-\"].rot45 {\n transform: rotate(45deg);\n}\ni[class*=\"icss-\"].rot-45 {\n transform: rotate(-45deg);\n}\ni[class*=\"icss-\"].rot90 {\n transform: rotate(90deg);\n}\ni[class*=\"icss-\"].rot-90 {\n transform: rotate(-90deg);\n}\ni[class*=\"icss-\"].rot180 {\n transform: rotate(180deg);\n}\ni[class*=\"icss-\"].rot-180 {\n transform: rotate(-180deg);\n}\n\n/* force animation */\ni.icss-anim,\ni.icss-anim:before,\ni.icss-anim:after { \n transition: all 1s;\n}\n\n/* Spin */\n.icss-spin {\n animation: spin 2s infinite linear;\n}\n.icss-pulse {\n animation: spin 1s infinite steps(8);\n}\n\n.icss-spin-hover:hover {\n animation: spin 2s infinite linear;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n}\n\n/* BELL */\n@keyframes ring {\n\t0%{transform:rotate(-15deg)}\n\t2%{transform:rotate(15deg)}\n\t4%{transform:rotate(-18deg)}\n\t6%{transform:rotate(18deg)}\n\t8%{transform:rotate(-22deg)}\n\t10%{transform:rotate(22deg)}\n\t12%{transform:rotate(-18deg)}\n\t14%{transform:rotate(18deg)}\n\t16%{transform:rotate(-12deg)}\n\t18%{transform:rotate(12deg)}\n\t20%,100%{transform:rotate(0deg)}\n}\n\n.icss-ring {\n animation: ring 2s infinite ease;\n}\n.icss-ring-hover:hover {\n animation: ring 2s infinite ease;\n}\n\n/* VERTICAL */\n@keyframes vertical {\n\t0%{transform:translate(0,-3px)}\n\t4%{transform:translate(0,3px)}\n\t8%{transform:translate(0,-3px)}\n\t12%{transform:translate(0,3px)}\n\t16%{transform:translate(0,-3px)}\n\t20%{transform:translate(0,3px)}\n\t22%,100%{transform:translate(0,0)}\n}\n.icss-vibes,\n.icss-vibes-hover:hover {\n\tanimation: vertical 2s ease infinite;\n}\n\n/* HORIZONTAL */\n@keyframes horizontal {\n\t0%{transform:translate(0,0)}\n\t6%{transform:translate(5px,0)}\n\t12%{transform:translate(0,0)}\n\t18%{transform:translate(5px,0)}\n\t24%{transform:translate(0,0)}\n\t30%{transform:translate(5px,0)}\n\t36%,100%{transform:translate(0,0)}\n}\n.icss-shake,\n.icss-shake-hover:hover {\n\tanimation: horizontal 2s ease infinite;\n}\n\n/* TADA */\n@keyframes tada {\n\t0% {transform: scale(1)}\n\t10%,20% {transform:scale(.9) rotate(-8deg);}\n\t30%,50%,70% {transform:scale(1.3) rotate(8deg)}\n\t40%,60% {transform:scale(1.3) rotate(-8deg)}\n\t80%,100% {transform:scale(1) rotate(0)}\n}\n\n.icss-tada,\n.icss-tada-hover:hover{\n\tanimation: tada 2s linear infinite;\n}\n\n/* Reverse animation */\n.icss-reverse {\n animation-direction: reverse;\n}\n[class*=\"-hover\"].icss-reverse:hover {\n animation-direction: reverse;\n}\n\n/* Stack icons */\n.icss-stack {\n position: relative;\n width: 1em;\n height: 1em;\n display: inline-block;\n}\n\n.icss-stack i[class*=\"icss-\"] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-.5em, -.5em);\n}\n\n.icss-stack i[class*=\"icss-\"].bottom {\n bottom: 0;\n top: auto;\n}\n\n/* shadow icon */\n.icss-shadow {\n position: relative;\n width: 1em;\n height: 1em;\n display: inline-block;\n}\n\n.icss-shadow i[class*=\"icss-\"] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-.5em, -.5em);\n}\n\n.icss-shadow i[class*=\"icss-\"]:first-child {\n top: 54%;\n left: 54%;\n}\n"), - } - file8 := &embedded.EmbeddedFile{ - Filename: "03-icons.css", - FileModTime: time.Unix(1611957264, 0), - - Content: string("i.icss-github-c {\n width: 1em;\n height: .8em;\n border-radius: 45% 45% 35% 35% / 50%;\n background-color: #f5f5f5;\n box-shadow: inset 0 0.1em 0 0.14em #333, inset 0 0.05em 0 0.12em #333;\n background-image:\n radial-gradient(ellipse 15% 25% at 34% 62%, #333 0%, #333 50%, transparent 50%),\n radial-gradient(ellipse 15% 25% at 66% 62%, #333 0%, #333 50%, transparent 50%);\n margin: .15em 0 .05em;\n}\n\ni.icss-github-c:before {\n border-width: .17em .17em;\n border-style: solid;\n border-radius: 0.02em 60% 100% 80%;\n border-color: #333;\n left: .1em;\n top: -.06em;\n transform: rotate(20deg);\n}\n\ni.icss-github-c:after {\n border-width: .17em .17em;\n border-style: solid;\n border-radius: 0.02em 80% 100% 60%;\n border-color: #333;\n left: .6em;\n top: -.06em;\n transform: rotate(65deg);\n}\n\ni.icss-home {\n width: .36em;\n height: .43em;\n margin: .57em .71em 0 .13em;\n border-width: 0;\n border-style: solid;\n border-radius: 0 0 .05em .05em;\n box-shadow: 0.575em 0, 0.285em -0.28em 0 -0.06em,\n 0.55em -0.62em 0 -0.14em,\n 0.6em -0.54em 0 -0.14em,\n 0.6em -0.62em 0 -0.14em;\n}\n\ni.icss-home:before {\n border-width: 0 .47em .45em;\n border-style: solid;\n bottom: .425em;\n left: 0em;\n border-left-color: transparent;\n border-right-color: transparent;\n}\n\ni.icss-home:after {\n width: .85em;\n height: .85em;\n border-width: 0.065em 0 0 0.065em;\n border-style: solid;\n transform: rotate(45deg);\n top: -0.43em;\n left: 0.045em;\n}\n\ni.icss-users {\n width: .8em;\n height: .5em;\n border-width: .065em;\n border-style: solid;\n border-radius: .8em .8em .2em .2em;\n margin-top: .4em;\n background-color: transparent;\n box-shadow: .45em .05em 0 -.05em;\n margin: .5em .35em 0 0;\n}\n\n.icss-stack i.icss-users {\n transform: translate(-.6em, -.5em);\n}\n\ni.icss-users:before {\n border-style: solid;\n border-width: .065em;\n border-radius: 100%;\n top: -.46em;\n left: 50%;\n transform: translateX(-50%);\n width: .45em;\n height: .45em;\n box-shadow: .45em .1em 0 -.05em;\n background-image:\n radial-gradient(circle at -.1em -.1em,\n currentcolor 0, currentcolor .28em, transparent .28em),\n radial-gradient(circle at .35em -.2em,\n currentcolor 0, currentcolor .35em, transparent .35em);\n}\n\ni.icss-users:after {\n border-style: solid;\n border-width: .15em .1em .3em;\n border-radius: 100%;\n width: .2em;\n height: .2em;\n border-left-color: transparent;\n border-right-color: transparent;\n left: .23em;\n top: -.05em\n}\n\ni.icss-smiley {\n width: 1em;\n height: 1em;\n background-color: transparent;\n box-shadow: inset 0 0 0 .07em;\n border-radius: 50%;\n}\n\ni.icss-smiley:before {\n width: .5em;\n height: .5em;\n border-radius: 100%;\n top: .3em;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: inset 0 -.1em 0 -0.02em, 0 .08em 0 -.05em;\n}\n\ni.icss-smiley:after {\n width: .16em;\n height: .16em;\n border-radius: 100%;\n box-shadow: inset .5em 0, .39em 0;\n top: 30%;\n left: .235em;\n}\n\ni.icss-rss {\n width: 1em;\n height: 1em;\n background-color: transparent;\n border: 0.065em solid currentColor;\n border-radius: 0.05em;\n background-image:\n radial-gradient(circle at 0.2em 0.685em,\n currentcolor 0, currentcolor 0.1em, transparent 0.1em);\n}\n\ni.icss-rss:before {\n width: 0.6em;\n height: 0.6em;\n background-color: transparent;\n top: 0.12em;\n left: 0.18em;\n background-image:\n radial-gradient(circle at 0 100%,\n transparent 0,\n transparent 28%, currentcolor 28%,\n currentcolor 42%, transparent 42%,\n transparent 55%, currentcolor 55%,\n currentcolor 70%, transparent 70%);\n}\n\ni.icss-plus {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-plus:before,\ni.icss-plus:after {\n width: 1em;\n height: .18em;\n top: 50%;\n left: 50%;\n border-radius: .06em;\n background-color: currentColor;\n}\n\ni.icss-plus:before {\n transform: translate(-50%, -50%) rotate(-180deg)\n}\n\ni.icss-plus:after {\n transform: translate(-50%, -50%) rotate(90deg)\n}\n\ni.icss-gear {\n width: .5em;\n height: .5em;\n position: relative;\n border-radius: 100%;\n background-color: transparent;\n border-width: .07em;\n border-style: solid;\n border-color: transparent;\n margin: .25em;\n box-shadow: 0 0 0 .1em, inset 0 0 0 .3em;\n}\n\ni.icss-gear:before {\n width: .18em;\n height: .18em;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n box-shadow: .41em 0, -.41em 0, 0 .41em, 0 -.41em;\n}\n\ni.icss-gear:after {\n width: .18em;\n height: .18em;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) rotate(45deg);\n box-shadow: .42em 0, -.42em 0, 0 .42em, 0 -.42em;\n}\n\ni.icss-exit {\n width: .6em;\n height: .8em;\n background-color: transparent;\n box-shadow: inset 0 0 0 .065em;\n border-radius: .05em;\n margin: .1em .3em .1em .1em;\n}\n\ni.icss-exit:before {\n width: .4em;\n height: .8em;\n transform: perspective(1em) rotateY(-30deg);\n transform-origin: 0 50%;\n box-shadow:\n inset -.06em .37em,\n inset .24em .37em,\n inset -.06em -.36em,\n inset .24em -.36em;\n border-radius: .03em;\n top: 0;\n left: 0;\n}\n\ni.icss-exit:after {\n width: .36em;\n height: .36em;\n border: .18em solid transparent;\n border-right-color: currentColor;\n transform: translateY(-50%);\n box-shadow: .16em 0 0 -.08em;\n top: 50%;\n left: .45em;\n}\n\ni.icss-text-bold {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-text-bold:before {\n top: 50%;\n left: 50%;\n content: \"B\";\n font-size: 1em;\n font-weight: bold;\n transform: translate(-50%, -50%);\n font-family: serif;\n}\n\ni.icss-text-italic {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-text-italic:before {\n top: 50%;\n left: 50%;\n content: \"I\";\n font-size: 1em;\n font-weight: bold;\n font-style: italic;\n transform: translate(-50%, -50%);\n font-family: serif;\n}\n\ni.icss-text-width {\n background-color: transparent;\n border: .15em solid currentColor;\n border-width: .15em .15em .15em 0;\n border-color: transparent currentColor transparent transparent;\n margin: .7em .75em 0 .1em;\n}\n\ni.icss-text-width:before {\n width: .7em;\n text-align: center;\n content: \"T\";\n font-size: .9em;\n font-family: serif;\n line-height: .85em;\n border-bottom: .07em solid currentColor;\n top: -.88em;\n left: .125em;\n}\n\ni.icss-text-width:after {\n border: .15em solid currentColor;\n border-color: transparent transparent transparent currentColor;\n left: .7em;\n top: -.15em\n}\n\ni.icss-x {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-x:before,\ni.icss-x:after {\n width: 1em;\n height: .18em;\n top: 50%;\n left: 50%;\n border-radius: .06em;\n background-color: currentColor;\n}\n\ni.icss-x:before {\n transform: translate(-50%, -50%) rotate(-225deg)\n}\n\ni.icss-x:after {\n transform: translate(-50%, -50%) rotate(225deg)\n}\n\ni.icss-user-circle {\n width: 1em;\n height: 1em;\n border-radius: 50%;\n background-color: transparent;\n border: 0.068em solid currentColor;\n overflow: hidden;\n margin: 0;\n}\n\ni.icss-user-circle:before {\n width: .55em;\n height: .55em;\n border-style: solid;\n border: .065em solid transparent;\n border-radius: 100%;\n top: 0.05em;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: inset 0 0 0 .5em, 0em .67em 0 .2em;\n}\n\ni.icss-user:after {}\n\ni.icss-link {\n width: .09em;\n height: .4em;\n border-radius: .1em;\n margin: .3em .455em .3em;\n}\n\n.icss-stack i.icss-link {\n transform: translate(-.5em, -.5em) rotate(30deg);\n}\n\ni.icss-link:before {\n width: .33em;\n height: .42em;\n background-color: transparent;\n border-radius: .16em .16em .1em .1em;\n border: .09em solid currentColor;\n border-bottom: 0 solid transparent;\n top: -.25em;\n left: -.12em;\n}\n\ni.icss-link:after {\n width: .33em;\n height: .42em;\n background-color: transparent;\n border-radius: .1em .1em .16em .16em;\n border: .09em solid currentColor;\n border-top: 0 solid transparent;\n top: .24em;\n left: -.12em;\n}\n\ni.icss-image {\n width: 1em;\n height: .75em;\n background-color: transparent;\n border-width: .065em;\n border-style: solid;\n overflow: hidden;\n border-radius: .05em;\n margin: .125em 0;\n}\n\ni.icss-image:before {\n border-style: solid;\n border-width: .3em;\n transform: rotate(45deg);\n box-shadow: .25em -.45em;\n top: .4em;\n left: -.1em;\n}\n\ni.icss-image:after {\n border-width: .08em;\n border-style: solid;\n left: .2em;\n top: .05em;\n border-radius: 100%;\n}\n\ni.icss-camera {\n width: .5em;\n height: .5em;\n border-radius: 100%;\n background-color: transparent;\n box-shadow:\n inset -.026em -.026em 0 0.08em,\n 0 -.03em 0 0.14em,\n -.03em -.17em 0 0.04em;\n border: 0.07em solid transparent;\n margin: .3em .25em .2em;\n}\n\ni.icss-camera:before {\n width: 1em;\n height: 0.7em;\n border-radius: .08em;\n box-shadow:\n inset .15em -.01em 0 .09em,\n inset 0 0 0 .05em;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\ni.icss-camera:after {\n width: .09em;\n height: .51em;\n box-shadow:\n inset 0 -.42em,\n -.02em 0 0 .08em,\n -.05em -.1em 0 .02em;\n border-radius: .04em;\n top: -.09em;\n left: .53em\n}\n\ni.icss-minus {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-minus:before,\ni.icss-minus:after {\n width: 1em;\n height: .18em;\n top: 50%;\n left: 50%;\n border-radius: .06em;\n background-color: currentColor;\n}\n\ni.icss-minus:before {\n transform: translate(-50%, -50%) rotate(-180deg)\n}\n\ni.icss-minus:after {\n transform: translate(-50%, -50%) rotate(0deg)\n}\n\ni.icss-bars {\n margin: .41em 0;\n}\n\ni.icss-bars,\ni.icss-bars:before,\ni.icss-bars:after {\n width: 1em;\n height: .18em;\n border-radius: .06em;\n background-color: currentColor;\n}\n\ni.icss-bars:before {\n top: -0.36em;\n left: 0;\n}\n\ni.icss-bars:after {\n top: 0.36em;\n left: 0;\n}\n\ni.icss-key {\n height: .55em;\n width: .5em;\n background: transparent;\n border-radius: 50% / 47%;\n box-shadow: inset -.05em 0 0 .18em;\n margin: .225em .45em .225em .05em;\n transform: rotate(45deg);\n transform-origin: .5em 50%;\n}\n\n.icss-stack i.icss-key {\n transform: translate(-.5em, -.5em) rotate(45deg);\n}\n\ni.icss-key:before {\n width: .14em;\n height: .14em;\n box-shadow: inset .5em .5em,\n -.09em .09em,\n -.18em .18em,\n -.27em .27em;\n top: 50%;\n left: .84em;\n transform: translateY(-50%) scaleX(.95) rotate(45deg);\n}\n\ni.icss-key:after {\n width: .61em;\n height: .2em;\n box-shadow: inset .27em -.13em;\n top: 50%;\n left: .3em;\n transform: translateY(-50%);\n}\n\ni.icss-spinner {\n width: .25em;\n height: .25em;\n background-color: transparent;\n border-radius: 50%;\n box-shadow:\n 0 -.4em,\n -.28em -.28em 0 -.01em,\n -.4em 0 0 -.02em,\n -.28em .28em 0 -.03em,\n 0 .4em 0 -.04em,\n .28em .28em 0 -.05em,\n .4em 0 0 -.06em,\n .28em -.28em 0 -.07em;\n margin: .375em;\n}\n\ni.icss-paper-plane {\n width: .25em;\n height: .25em;\n background-color: transparent;\n border-style: solid;\n border-color: currentColor transparent;\n border-width: .25em .23em 0 0;\n margin: .62em .37em .13em .38em;\n}\n\ni.icss-paper-plane:before {\n width: .2em;\n height: .67em;\n border-style: solid;\n border-color: currentColor transparent;\n border-width: 0 .38em .68em 0;\n transform: rotate(30deg) skewX(-25deg);\n transform-origin: 0 0;\n top: -.68em;\n left: .61em;\n}\n\ni.icss-paper-plane:after {\n width: .2em;\n height: .67em;\n border-style: solid;\n border-color: currentColor transparent;\n border-width: 0 0 .68em .25em;\n transform: rotate(30deg) skewX(-35deg);\n transform-origin: .25em 0;\n top: -.68em;\n left: .36em;\n}\n\ni.icss-magic-wand {\n width: .07em;\n height: .35em;\n background-color: transparent;\n border-radius: 50%;\n box-shadow: .4em .05em;\n margin: .325em .465em;\n}\n\ni.icss-magic-wand:before {\n width: .2em;\n height: 1em;\n background-color: transparent;\n border-radius: .05em;\n box-shadow: inset 0 0 0 .065em,\n inset 0 -.35em, inset 0 .2em, .5em 0 0 -.36em;\n transform: rotate(45deg);\n top: -.23em;\n left: -.15em;\n}\n\ni.icss-magic-wand:after {\n width: .35em;\n height: .35em;\n background-color: transparent;\n border: 0 solid transparent;\n border-width: .145em 0;\n box-shadow: inset .5em .5em,\n -.3em -.5em 0 -.11em,\n .05em -.45em 0 -.11em,\n -.55em -.35em 0 -.1em;\n border-radius: 50%;\n top: .05em;\n left: .25em;\n}\n\ni.icss-composite-darker {\n width: .7em;\n height: .7em;\n box-shadow: inset 0 0 0 .065em;\n background-color: transparent;\n margin: 0 .3em .3em 0;\n}\n\ni.icss-composite-darker:before {\n width: .7em;\n height: .7em;\n background-color: currentColor;\n border-radius: 50%;\n clip: rect(0 .4em .4em 0);\n top: .3em;\n left: .3em;\n}\n\ni.icss-composite-darker:after {\n width: .7em;\n height: .7em;\n background: currentColor;\n border-radius: 50%;\n opacity: .5;\n top: .3em;\n left: .3em;\n}\n\ni.icss-composite-lighter {\n width: .7em;\n height: .7em;\n box-shadow: inset 0 0 0 .065em;\n background-color: transparent;\n margin: 0 .3em .3em 0;\n}\n\ni.icss-composite-lighter:before {\n width: .7em;\n height: .7em;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 50%;\n top: .3em;\n left: .3em;\n}\n\ni.icss-composite-lighter:after {\n width: .7em;\n height: .7em;\n border-radius: 50%;\n background-image:\n linear-gradient(transparent 50%, currentColor 50%),\n linear-gradient(90deg, transparent 50%, currentColor 50%);\n top: .3em;\n left: .3em;\n}\n\ni.icss-quill-pen {\n width: 1em;\n height: 1em;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-quill-pen:before {\n width: .78em;\n height: .78em;\n border-radius: 85% 15% 100% 0 / 85% 15%;\n box-shadow:\n inset -.5em .12em 0 -.2em,\n inset .52em -.68em 0 -.2em;\n transform: rotate(-7deg) skewX(-15deg);\n top: .05em;\n left: .17em;\n}\n\ni.icss-quill-pen:after {\n width: .2em;\n height: .09em;\n background: currentColor;\n transform: skewY(-45deg);\n left: .05em;\n top: .8em;\n}\n\ni.icss-print {\n width: .68em;\n height: 1em;\n border-style: solid;\n border-color: currentcolor;\n background-color: transparent;\n border-width: .07em;\n border-radius: .05em;\n background-color: transparent;\n margin: 0 .16em;\n}\n\ni.icss-print:before {\n width: 1em;\n height: .4em;\n border-width: .07em .21em 0;\n border-style: solid;\n border-color: currentColor currentcolor transparent;\n border-radius: .05em .05em 0 0;\n top: .25em;\n left: 50%;\n transform: translateX(-50%);\n background-image: linear-gradient(transparent 20%, currentcolor 20%, currentcolor 60%, transparent 60%);\n}\n\ni.icss-print:after {\n width: .45em;\n height: 0.065em;\n background-color: currentColor;\n left: 50%;\n transform: translateX(-50%);\n top: .6em;\n box-shadow: 0 .12em, -.1em -.28em 0 .05em;\n}\n\n\ni.icss-edit {\n width: 1em;\n height: 1em;\n background-color: transparent;\n border-radius: 50% 45% 50% 35%;\n overflow: hidden;\n margin: 0;\n}\n\ni.icss-edit:before {\n width: .3em;\n height: .8em;\n border: .15em solid transparent;\n border-top: .24em solid currentColor;\n transform: rotate(45deg) translate(-50%);\n transform-origin: 0 0;\n box-shadow:\n 0 -.05em,\n .24em -.8em,\n -.24em -.8em,\n 0 -1.5em;\n clip: rect(-.9em .3em 1em 0);\n left: .25em;\n top: .75em;\n}\n\ni.icss-edit:after {\n width: .1em;\n height: 0;\n background-color: transparent;\n transform: translate(-50%, -50%);\n top: 50%;\n left: 50%;\n}\n\ni.icss-arrow-left {\n width: 1em;\n height: .18em;\n border-radius: .1em;\n background-color: currentColor;\n margin: .41em 0;\n}\n\ni.icss-arrow-left:before {\n width: .6em;\n height: .18em;\n border-radius: 1em;\n background-color: currentColor;\n top: -.15em;\n left: -.06em;\n transform: rotate(-45deg);\n}\n\ni.icss-arrow-left:after {\n width: .6em;\n height: .18em;\n border-radius: .1em;\n background-color: currentColor;\n top: .15em;\n left: -0.06em;\n transform: rotate(45deg);\n}\n\ni.icss-comment {\n width: .9em;\n height: .65em;\n border-radius: 50%;\n margin: .1em .05em .2em;\n}\n\ni.icss-comment:before {\n width: .3em;\n height: .22em;\n border-radius: 0 0 100% 0;\n border: 0 solid transparent;\n border-right: .15em solid currentColor;\n transform: rotate(15deg);\n top: 0.55em;\n left: .08em;\n}\n\ni.icss-comment:after {}\n\ni.icss-chat {\n width: .7em;\n height: .55em;\n border-radius: 50%;\n border: .065em solid transparent;\n background: transparent;\n box-shadow: inset 1em 0, -.35em -.23em;\n margin: .35em -.05em .05em .35em;\n}\n\ni.icss-chat:before {\n width: .25em;\n height: .2em;\n border-radius: 0 0 100% 0;\n border: 0 solid transparent;\n border-right: .13em solid currentColor;\n transform: rotate(18deg);\n top: 0.15em;\n left: -.38em;\n}\n\ni.icss-chat:after {\n width: .2em;\n height: .15em;\n border-radius: 0 0 0 100%;\n border: 0 solid transparent;\n border-left: .12em solid currentColor;\n transform: rotate(-10deg);\n top: 0.37em;\n left: .3em;\n}\n\ni.icss-video-camera {\n width: .7em;\n height: .5em;\n border-radius: .1em;\n margin: .4em .23em .1em .07em;\n}\n\ni.icss-video-camera:before {\n height: 0.4em;\n border: .2em solid currentColor;\n border-width: .1em .18em .1em 0;\n border-color: transparent currentColor;\n border-radius: .03em;\n top: .05em;\n left: .7em;\n}\n\ni.icss-video-camera:after {\n width: .28em;\n height: .28em;\n border: .08em solid currentColor;\n box-shadow: -.3em -.03em 0 .04em;\n border-radius: 50%;\n top: -.26em;\n left: .37em\n}\n\ni.icss-sound-0 {\n width: .45em;\n height: .7em;\n background-color: transparent;\n border: .2em solid transparent;\n border-right: .24em solid currentColor;\n border-left: 0;\n box-shadow: inset .15em 0;\n margin: .15em .5em .15em .05em;\n}\n\ni.icss-sound-0:before {\n width: .4em;\n height: .1em;\n background-color: currentColor;\n top: 50%;\n left: .5em;\n transform: translateY(-50%) rotate(45deg);\n}\n\ni.icss-sound-0:after {\n width: .4em;\n height: .1em;\n background-color: currentColor;\n top: 50%;\n left: .5em;\n transform: translateY(-50%) rotate(-45deg);\n}\n\ni.icss-sound-3 {\n width: .45em;\n height: .7em;\n background-color: transparent;\n border: .2em solid transparent;\n border-right: .24em solid currentColor;\n border-left: 0;\n box-shadow: inset .15em 0;\n margin: .15em .5em .15em .05em;\n}\n\ni.icss-sound-3:before {\n width: .7em;\n height: .7em;\n border: .1em solid transparent;\n box-shadow: inset 0 0 0 .1em, 0 0 0 .09em;\n border-radius: 50%;\n clip: rect(-.4em .8em .35em .35em);\n top: 50%;\n left: .1em;\n transform: scaleX(.8) translateY(-50%) rotate(45deg);\n}\n\ni.icss-sound-3:after {\n width: .9em;\n height: .9em;\n border: .1em solid transparent;\n box-shadow: 0 0 0 .09em;\n border-radius: 50%;\n clip: rect(-.5em 1em .52em .38em);\n top: 50%;\n left: .1em;\n transform: scaleX(.8) translateY(-50%) rotate(45deg);\n}\n\ni.icss-exclamation-circle {\n width: 1em;\n height: 1em;\n border-radius: 50%;\n border: .1em solid currentColor;\n background-color: transparent;\n margin: 0;\n}\n\ni.icss-exclamation-circle:before {\n width: .15em;\n border: .015em solid transparent;\n border-top: .38em solid currentColor;\n border-bottom: .09em solid transparent;\n box-shadow: 0 .13em 0 -.012em;\n top: .1em;\n left: 50%;\n transform: translateX(-50%);\n}\n\ni.icss-microphone {\n width: .5em;\n height: .3em;\n border-radius: 0 0 .25em .25em / 0 0 .25em .25em;\n background-color: transparent;\n border: .065em solid currentColor;\n border-top: 0;\n margin: .5em .25em .2em;\n}\n\ni.icss-microphone:before {\n width: .3em;\n height: .6em;\n border-radius: .2em;\n background-color: transparent;\n top: -.4em;\n left: 50%;\n transform: translateX(-50%);\n box-shadow: inset 0 -.25em 0 .063em,\n inset 0 0em 0 .063em,\n 0 .55em 0 -.11em,\n 0 .91em 0 .1em;\n clip: rect(0 .3em .9em 0);\n}\n\ni.icss-microphone:after {}\n\ni.icss-exchange {\n background-color: transparent;\n border: 0.2em solid transparent;\n border-left-color: currentColor;\n border-right-width: 0.8em;\n box-shadow: -0.7em 0 0 -0.13em;\n margin: .5em -.8em .05em 0.8em;\n}\n\ni.icss-exchange:before {\n border: 0.2em solid transparent;\n border-right-color: currentColor;\n border-left-width: 0.8em;\n box-shadow: 0.7em 0 0 -0.13em;\n top: -.5em;\n left: -1.8em\n}\n\ni.icss-mail-box {\n width: .1em;\n height: .2em;\n background-color: currentColor;\n margin: .8em .4em 0 .5em;\n}\n\ni.icss-mail-box:before {\n width: .45em;\n height: .6em;\n border-radius: .3em .3em 0 0 / .4em .4em 0 0;\n border: .05em solid transparent;\n box-shadow:\n inset 0 0 0 .1em,\n inset 0 1.32em 0 -1em,\n .3em 0 0 .05em,\n .5em 0 0 -.05em;\n clip: rect(.05em 1em .55em 0);\n top: -.55em;\n left: -.45em;\n}\n\ni.icss-mail-box:after {\n border: .15em solid transparent;\n border-top: .25em solid currentColor;\n border-bottom: 0;\n box-shadow: 0 -.05em;\n transform: rotate(-0deg);\n transform-origin: -.06em 0;\n top: -.43em;\n left: 0;\n}\n\ni.icss-mail-box-in {\n width: .1em;\n height: .2em;\n background-color: currentColor;\n margin: .8em .4em 0 .5em;\n}\n\ni.icss-mail-box-in:before {\n width: .45em;\n height: .6em;\n border-radius: .3em .3em 0 0 / .4em .4em 0 0;\n border: .05em solid transparent;\n box-shadow:\n inset 0 0 0 .1em,\n inset 0 1.32em 0 -1em,\n .3em 0 0 .05em,\n .5em 0 0 -.05em;\n clip: rect(.05em 1em .55em 0);\n top: -.55em;\n left: -.45em;\n}\n\ni.icss-mail-box-in:after {\n border: .15em solid transparent;\n border-top: .25em solid currentColor;\n border-bottom: 0;\n box-shadow: 0 -.05em;\n transform: rotate(-90deg);\n transform-origin: -.06em 0;\n top: -.43em;\n left: 0;\n}\n\ni.icss-floppy {\n width: .9em;\n height: .6em;\n background-color: transparent;\n border-radius: .05em;\n box-shadow:\n inset .1em .1em,\n inset .1em -.1em,\n inset -.1em .1em,\n inset -.1em -.1em;\n margin: .4em .05em 0;\n}\n\ni.icss-floppy:before {\n width: 0;\n height: 0;\n background-color: transparent;\n border: .1em solid transparent;\n border-bottom: .1em solid currentColor;\n border-width: .1em .2em .2em 0;\n box-shadow: 0 .25em;\n top: -.5em;\n left: .7em\n}\n\ni.icss-floppy:after {\n width: .5em;\n height: .3em;\n border-radius: 0 0 .03em .03em;\n border: 0 solid transparent;\n border-width: .05em .1em .1em;\n box-shadow: inset .12em 0,\n -.15em .05em 0 .05em,\n -.2em .2em,\n .2em .2em,\n .1em .5em 0 -.12em,\n .1em .65em 0 -.12em,\n -.1em .5em 0 -.12em,\n -.1em .65em 0 -.12em;\n top: -.4em;\n left: .2em;\n}\n\ni.icss-heart {\n width: .5em;\n height: .5em;\n background: currentColor;\n border: .065em solid currentColor;\n border-top: 0;\n border-right: 0;\n transform: rotate(-45deg);\n margin: .3em .25em .2em;\n}\n\n.icss-stack i.icss-heart {\n transform: translate(-.5em, -.5em) rotate(-45deg);\n}\n\ni.icss-heart:before {\n width: .5em;\n height: .28em;\n top: -.22em;\n left: -.063em;\n background: currentColor;\n border-radius: .5em .5em 0 0;\n}\n\ni.icss-heart:after {\n width: .28em;\n height: .5em;\n top: 0em;\n left: .37em;\n border-radius: 0 .5em .5em 0;\n background: currentColor;\n}\n\ni.icss-heart-o {\n width: .5em;\n height: .5em;\n background: transparent;\n border-left: solid .065em currentColor;\n border-bottom: solid .065em currentColor;\n transform: rotate(-45deg);\n margin: .3em .25em .2em;\n}\n\n.icss-stack i.icss-heart-o {\n transform: translate(-.5em, -.5em) rotate(-45deg);\n}\n\ni.icss-heart-o:before {\n width: .5em;\n height: .28em;\n top: -.22em;\n left: -.063em;\n border-radius: .5em .5em 0 0;\n border: .065em solid currentColor;\n border-bottom: 0;\n}\n\ni.icss-heart-o:after {\n width: .28em;\n height: .5em;\n top: 0em;\n left: .37em;\n border-radius: 0 .5em .5em 0;\n border: .065em solid currentColor;\n border-left: 0;\n}\n\ni.icss-circle {\n width: 1em;\n height: 1em;\n border-radius: 50%;\n margin: 0;\n}\n\n\ni.icss-circle-o {\n width: 1em;\n height: 1em;\n border-radius: 50%;\n background-color: transparent;\n border: .1em solid currentColor;\n margin: 0;\n}\n"), - } - file9 := &embedded.EmbeddedFile{ - Filename: "99-spyda.css", - FileModTime: time.Unix(1611979349, 0), - - Content: string("body, html {\n overflow-x: hidden;\n}\n\narticle p img {\n display: block;\n margin-top: 0.5rem;\n}\n\narticle hgroup h3 {\n margin-left: 60px;\n}\n\narticle hgroup footer {\n margin-left: 60px;\n}\n\n.invisible {\n visibility:hidden;\n width:0;\n height:0;\n}\n.invisible.width-none{\n width: 0px !important;\n}\n\n.nav {\n z-index: 1050;\n}\n\n.captchaInput {\n width: 50% !important;\n}\n\n/* Fix spacing for Search/Go button and icons */\n.icss-search {\n margin-right:20px !important;\n}\n\n#cookie-law{\n background-color: rgb(50, 50, 50) !important;\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 20px;\n}\n#cookie-law p{\n color: #ffffff;\n font-size: 13px;\n text-align: center;\n background-color: rgb(50, 50, 50) !important;\n margin-bottom: 0px;\n}\n#cookie-law p a[role=button]{\n margin: 10px 0px 0px 10px;\n padding: 5px 15px;\n font-size: 13px;\n color: #dcdcdc !important;\n border-color: 1px solid var(--primary) !important;\n border-radius: 0.25rem !important;\n}\n\n/* Footer Style */\nfooter{\n border-top: 1px solid var(--primary);\n background-color: rgba(234, 232, 232, 0.1);\n font-size: 85%;\n}\n@media (min-width: 576px) {\n footer {\n font-size: 83%;\n }\n}\n@media (min-width: 768px) {\n footer {\n font-size: 81%;\n }\n}\n@media (min-width: 992px) {\n footer {\n font-size: 79%;\n }\n}\n@media (min-width: 1200px) {\n footer {\n font-size: 77%;\n }\n}\nbody > footer{\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-content: center;\n}\nfooter .footer-menu{\n display: flex;\n flex-direction: row;\n}\nfooter .footer-menu a{\n margin-right: 10px;\n padding-right: 10px;\n position: relative;\n}\nfooter .footer-menu a::after{\n content: '';\n height: 12px;\n width: 1px;\n background-color: #929292;\n position: absolute;\n right: 0px;\n bottom: 4px;\n}\nfooter .footer-menu a:last-child{\n border: none;\n padding-right: 0px;\n margin-right: 0px;\n}\nfooter .footer-menu a:last-child::after{\n content: none;\n}\n\n@media (max-width: 576px) {\n .toolbar-nav li {\n padding: 1rem .2rem;\n }\n nav{\n justify-content: unset;\n -webkit-justify-content: unset;\n -moz-justify-content: unset;\n -ms-justify-content: unset;\n }\n nav.toolbar-nav ul{\n margin-right: 0px;\n margin-left: 0px;\n display: flex;\n display: -moz-box;\n display: -webkit-flexbox;\n display: -ms-flexbox;\n display: -webkit-flex;\n display: -moz-flex;\n flex-direction: row;\n -webkit-flex-direction: row;\n -moz-flex-direction: row;\n -ms-flex-direction: row;\n justify-content: space-between;\n -webkit-justify-content: space-between;\n -moz-justify-content: space-between;\n -ms-justify-content: space-between;\n width: 100%;\n }\n nav.toolbar-nav ul li{\n padding: 0.5rem 0px;\n flex: 1;\n -webkit-flex: 0 1 100%;\n -moz-flex: 0 1 100%;\n -ms-flex: 0 1 100%;\n text-align: center;\n }\n [data-tooltip]:not(a):not(button):not(input){\n border-bottom: none;\n }\n #cookie-law p a[role=button]{\n display: block;\n width: 20%;\n margin: 10px auto 0px;\n padding: 5px;\n }\n\n nav.pagination-nav{\n justify-content: space-between;\n }\n}\n@media (max-width: 1200px) {\n /* Footer Style */\n body > footer{\n text-align: center;\n flex-direction: column-reverse;\n }\n footer .footer-copyright{\n margin-top: 10px;\n }\n footer .footer-menu{\n justify-content: center;\n }\n}\n"), - } - filea := &embedded.EmbeddedFile{ - Filename: "spyda.min.css", - FileModTime: time.Unix(1611979522, 0), - - Content: string("/*!* Pico.css v1.0.3 (https://picocss.com)\n* Copyright 2020 - Licensed under MIT*/[data-theme=light],:root:not([data-theme=dark]){--background:#FFF;--text:#415462;--h1:#1b2832;--h2:#2c3d49;--h3:#415462;--h4:#596b78;--h5:#73828c;--h6:#8a99a3;--primary:#1095c1;--primary-hover:#08769b;--primary-focus:rgba(16, 149, 193, 0.125);--primary-inverse:#FFF;--secondary:#73828c;--secondary-hover:#415462;--secondary-focus:rgba(115, 130, 140, 0.125);--secondary-inverse:#FFF;--contrast:#2c3d49;--contrast-hover:#0d1419;--contrast-focus:rgba(115, 130, 140, 0.125);--contrast-border:rgba(255, 223, 128, 0.5);--contrast-inverse:#FFF;--input-background:#FFF;--input-border:#c8d1d8;--valid:#288a6a;--invalid:#b94646;--mark:rgba(255, 223, 128, 0.5);--mark-text:#2c3d49;--muted-text:#7e8d98;--muted-background:#edf0f3;--muted-border:#edf0f3;--card-background:#FFF;--card-sections:#f3f5f7;--card-shadow:0 0.125rem 1rem rgba(27, 40, 50, 0.04), 0 0.125rem 2rem rgba(27, 40, 50, 0.08), 0 0 0 0.0625rem rgba(27, 40, 50, 0.024);--code-background:#f3f5f7;--code-inlined:#edf0f3;--code-color-1:#73828c;--code-color-2:#b34d80;--code-color-3:#3d888f;--code-color-4:#998866;--code-color-5:#96a4ae;--table-border:rgba(237, 240, 243, 0.75);--table-stripping:rgba(115, 130, 140, 0.04)}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme=light]){--background:#10181e;--text:#a2afb9;--h1:#edf0f3;--h2:#d5dce2;--h3:#bbc6ce;--h4:#a2afb9;--h5:#8a99a3;--h6:#73828c;--primary:#1095c1;--primary-hover:#1ab3e6;--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#FFF;--secondary:#596b78;--secondary-hover:#73828c;--secondary-focus:rgba(89, 107, 120, 0.25);--secondary-inverse:#FFF;--contrast:#d5dce2;--contrast-hover:#FFF;--contrast-focus:rgba(89, 107, 120, 0.25);--contrast-border:rgba(255, 223, 128, 0.33);--contrast-inverse:#10181e;--input-background:#10181e;--input-border:#374956;--valid:#1f7a5c;--invalid:#943838;--mark:rgba(255, 223, 128, 0.5);--mark-text:#FFF;--muted-text:#73828c;--muted-background:#10181e;--muted-border:#23333e;--card-background:#17232b;--card-sections:#141d24;--card-shadow:0 0.125rem 1rem rgba(0, 0, 0, 0.08), 0 0.125rem 2rem rgba(0, 0, 0, 0.04), 0 0 0 0.0625rem rgba(0, 0, 0, 0.1);--code-background:#141d24;--code-inlined:rgba(65, 84, 98, 0.25);--code-color-1:#73828c;--code-color-2:#a65980;--code-color-3:#599fa6;--code-color-4:#8c8473;--code-color-5:#4d606d;--table-border:#10181e;--table-stripping:rgba(115, 130, 140, 0.02)}}[data-theme=dark]{--background:#10181e;--text:#a2afb9;--h1:#edf0f3;--h2:#d5dce2;--h3:#bbc6ce;--h4:#a2afb9;--h5:#8a99a3;--h6:#73828c;--primary:#1095c1;--primary-hover:#1ab3e6;--primary-focus:rgba(16, 149, 193, 0.25);--primary-inverse:#FFF;--secondary:#596b78;--secondary-hover:#73828c;--secondary-focus:rgba(89, 107, 120, 0.25);--secondary-inverse:#FFF;--contrast:#d5dce2;--contrast-hover:#FFF;--contrast-focus:rgba(89, 107, 120, 0.25);--contrast-border:rgba(255, 223, 128, 0.33);--contrast-inverse:#10181e;--input-background:#10181e;--input-border:#374956;--valid:#1f7a5c;--invalid:#943838;--mark:rgba(255, 223, 128, 0.5);--mark-text:#FFF;--muted-text:#73828c;--muted-background:#10181e;--muted-border:#23333e;--card-background:#17232b;--card-sections:#141d24;--card-shadow:0 0.125rem 1rem rgba(0, 0, 0, 0.08), 0 0.125rem 2rem rgba(0, 0, 0, 0.04), 0 0 0 0.0625rem rgba(0, 0, 0, 0.1);--code-background:#141d24;--code-inlined:rgba(65, 84, 98, 0.25);--code-color-1:#73828c;--code-color-2:#a65980;--code-color-3:#599fa6;--code-color-4:#8c8473;--code-color-5:#4d606d;--table-border:#10181e;--table-stripping:rgba(115, 130, 140, 0.02)}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;background:var(--background);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol,noto color emoji;font-size:16px;font-weight:400;line-height:1.5;text-rendering:optimizeLegibility}@media(min-width:576px){html{font-size:17px}}@media(min-width:768px){html{font-size:18px}}@media(min-width:992px){html{font-size:19px}}@media(min-width:1200px){html{font-size:20px}}main{display:block}body{width:100%;margin:0}body>header,body>main,body>footer{width:100%;margin-right:auto;margin-left:auto;padding:1rem 0}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:1rem;padding-left:1rem}@media(min-width:576px){.container{padding-right:0;padding-left:0;max-width:510px}}@media(min-width:768px){.container{max-width:700px}}@media(min-width:992px){.container{max-width:920px}}@media(min-width:1200px){.container{max-width:1130px}}section{margin-bottom:2rem}.grid{grid-column-gap:1rem;grid-row-gap:1rem;display:grid;grid-template-columns:1fr;margin:0}@media(min-width:992px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}figure{display:block;margin:0;padding:0;overflow-x:auto}figure figcaption{padding:.5rem 0;color:var(--muted-text)}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75rem;line-height:0;vertical-align:baseline}sub{bottom:-.25rem}sup{top:-.5rem}img{max-width:100%;height:auto;border-style:none}svg,img{vertical-align:text-bottom}address,blockquote,dl,figure,form,ol,p,pre,table,ul{margin-top:0;margin-bottom:1.5rem;color:var(--text);font-size:1rem;font-style:normal}a{background-color:initial;color:var(--primary);text-decoration:none;transition:background-color .2s ease-in-out,color .2s ease-in-out,text-decoration .2s ease-in-out,box-shadow .2s ease-in-out}a:hover,a:active,a:focus{color:var(--primary-hover);text-decoration:underline}a:focus{outline:none;background-color:var(--primary-focus)}a.secondary{color:var(--secondary)}a.secondary:hover,a.secondary:active,a.secondary:focus{color:var(--secondary-hover)}a.secondary:focus{background-color:var(--secondary-focus)}a.contrast:not([role=button]){box-shadow:inset 0 -.33rem 0 var(--contrast-border);color:var(--contrast)}a.contrast:not([role=button]):hover,a.contrast:not([role=button]):active,a.contrast:not([role=button]):focus{color:var(--contrast-hover)}a.contrast:not([role=button]):focus{background-color:var(--contrast-focus)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:1.5rem;font-weight:700}h1{margin-bottom:3rem;color:var(--h1);font-size:2rem}h2{margin-bottom:2.625rem;color:var(--h2);font-size:1.75rem}h3{margin-bottom:2.25rem;color:var(--h3);font-size:1.5rem}h4{margin-bottom:1.875rem;color:var(--h4);font-size:1.25rem}h5{margin-bottom:1.6875rem;color:var(--h5);font-size:1.125rem}h6{color:var(--h6);font-size:1rem}hgroup{margin-bottom:1.5rem}hgroup *{margin-bottom:0}hgroup>*:last-child{color:var(--muted-text);font-size:1.125rem;font-weight:400}p{margin-bottom:.75rem}small{font-size:85%}@media(min-width:576px){small{font-size:83%}}@media(min-width:768px){small{font-size:81%}}@media(min-width:992px){small{font-size:79%}}@media(min-width:1200px){small{font-size:77%}}ul,ol{padding-left:1.5rem}ul li,ol li{margin-bottom:.75rem}ul li{list-style:square}mark{padding:.125rem .25rem;background:var(--mark);color:var(--mark-text);vertical-align:middle}blockquote{display:block;margin:3rem 0;padding:1rem;border-left:.25rem solid var(--muted-border)}blockquote footer{margin-top:.75rem;color:var(--muted-text)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--valid);text-decoration:none}del{color:var(--invalid)}::selection{background-color:var(--primary-focus)}input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:1rem;line-height:1.5}input{overflow:visible}select{text-transform:none}legend{display:table;max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}[type=number]::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}fieldset{margin:0;margin-bottom:1.5rem;padding:0;border:0}input:not([type=checkbox]):not([type=radio]),select,textarea,form small{display:block;width:100%}label,fieldset legend{display:block;margin-bottom:.125rem;vertical-align:middle}input,select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--input-border);border-radius:.25rem;outline:none;background-color:var(--input-background);color:var(--text);font-weight:400;vertical-align:middle;transition:background-color .2s ease-in-out,border-color .2s ease-in-out,color .2s ease-in-out,border-color .2s ease-in-out,box-shadow .2s ease-in-out}input::placeholder,select::placeholder,textarea::placeholder{color:var(--muted-text);opacity:1}input:active,input:focus,select:active,select:focus,textarea:active,textarea:focus{border-color:var(--primary)}input:focus,select:focus,textarea:focus{box-shadow:0 0 0 .2rem var(--primary-focus)}input[readonly],input[disabled],select[readonly],select[disabled],textarea[readonly],textarea[disabled]{border-color:var(--muted-border);box-shadow:0 0}input[readonly]~label,input[disabled]~label,select[readonly]~label,select[disabled]~label,textarea[readonly]~label,textarea[disabled]~label{color:var(--muted-text)}input[disabled],select[disabled],textarea[disabled]{background-color:var(--muted-background);opacity:.5}input:not([type=checkbox]):not([type=radio]),select,textarea{margin-bottom:1.5rem;padding:.75rem 1rem}input:not([type=checkbox]):not([type=radio]).valid,input:not([type=checkbox]):not([type=radio]).invalid,select.valid,select.invalid,textarea.valid,textarea.invalid{padding-right:2rem;background-position:center right .75rem;background-repeat:no-repeat;background-size:1rem}input:not([type=checkbox]):not([type=radio]).valid,select.valid,textarea.valid{border-bottom:1px solid var(--valid);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23288a6a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\")}input:not([type=checkbox]):not([type=radio]).invalid,select.invalid,textarea.invalid{border-bottom:1px solid var(--invalid);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23b94646' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E\")}input[type=color]{height:calc(3rem + 2px)}select::-ms-expand{border:0;background-color:initial}select:not([multiple]){background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-position:center right .75rem;background-repeat:no-repeat;background-size:1rem}form small{color:var(--muted-text)}input+small{margin-top:-1rem;margin-bottom:1.5rem}label>input:not([type=checkbox]):not([type=radio]),label>select,label>textarea{margin-top:.125rem}[type=checkbox],[type=radio]{display:inline-block;width:1em;height:1em;margin-right:.375rem;margin-bottom:.125rem;border-width:2px;font-size:1.125rem;vertical-align:middle;cursor:pointer;transition:none}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=radio]:checked{border-color:var(--primary);background-color:var(--primary);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23FFF' stroke-width='5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");background-position:50%;background-repeat:no-repeat;background-size:.66rem}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-right:.375rem;margin-bottom:0;cursor:pointer}[type=radio]{border-radius:50%}[type=radio]:checked{border-width:.33rem;border-color:var(--primary);background-color:var(--primary-inverse);background-image:none}[type=checkbox][role=switch]{width:1.85em;height:1em;border:2px solid var(--input-border);border-radius:1em;background-color:var(--input-border);line-height:1em}[type=checkbox][role=switch]:before{display:block;width:calc(1em - 4px);height:100%;border-radius:50%;background-color:var(--primary-inverse);content:'';transition:margin .1s ease-in-out}[type=checkbox][role=switch]:checked{border-color:var(--primary);background-color:var(--primary);background-image:none}[type=checkbox][role=switch]:checked::before{margin-right:0;margin-left:calc(.925em - 2px)}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}button{display:block;width:100%;margin-bottom:1.5rem}a[role=button]{display:inline-block;text-decoration:none}button,input[type=submit],a[role=button]{border:1px solid transparent;padding:.75rem 1rem;border-radius:.25rem;outline:none;background-color:var(--primary);color:var(--primary-inverse);font-size:1rem;font-weight:400;line-height:1.5;text-align:center;cursor:pointer;transition:background-color .2s ease-in-out,color .2s ease-in-out,box-shadow .2s ease-in-out}button:hover,button:active,button:focus,input[type=submit]:hover,input[type=submit]:active,input[type=submit]:focus,a[role=button]:hover,a[role=button]:active,a[role=button]:focus{background-color:var(--primary-hover)}button:focus,input[type=submit]:focus,a[role=button]:focus{box-shadow:0 0 0 .2rem var(--primary-focus)}input[type=reset]{cursor:pointer}button[disabled],input[type=submit][disabled],input[type=reset][disabled],a[role=button][disabled]{opacity:.5;pointer-events:none}button.secondary,input.secondary[type=submit],input[type=reset],a.secondary[role=button]{background-color:var(--secondary);color:var(--secondary-inverse)}button.secondary:hover,button.secondary:active,button.secondary:focus,input.secondary[type=submit]:hover,input.secondary[type=submit]:active,input.secondary[type=submit]:focus,input[type=reset]:hover,input[type=reset]:active,input[type=reset]:focus,a.secondary[role=button]:hover,a.secondary[role=button]:active,a.secondary[role=button]:focus{background-color:var(--secondary-hover)}button.secondary:focus,input.secondary[type=submit]:focus,input[type=reset]:focus,a.secondary[role=button]:focus{box-shadow:0 0 0 .2rem var(--secondary-focus)}button.contrast,input.contrast[type=submit],input.contrast[type=reset],a.contrast[role=button]{background-color:var(--contrast);color:var(--contrast-inverse)}button.contrast:hover,button.contrast:active,button.contrast:focus,input.contrast[type=submit]:hover,input.contrast[type=submit]:active,input.contrast[type=submit]:focus,input.contrast[type=reset]:hover,input.contrast[type=reset]:active,input.contrast[type=reset]:focus,a.contrast[role=button]:hover,a.contrast[role=button]:active,a.contrast[role=button]:focus{background-color:var(--contrast-hover)}button.contrast:focus,input.contrast[type=submit]:focus,input.contrast[type=reset]:focus,a.contrast[role=button]:focus{box-shadow:0 0 0 .2rem var(--contrast-focus)}button.outline,input.outline[type=submit],a.outline[role=button]{border:1px solid var(--primary);background-color:initial;color:var(--primary)}button.outline:hover,button.outline:active,button.outline:focus,input.outline[type=submit]:hover,input.outline[type=submit]:active,input.outline[type=submit]:focus,a.outline[role=button]:hover,a.outline[role=button]:active,a.outline[role=button]:focus{border:1px solid var(--primary-hover);color:var(--primary-hover)}button.outline.secondary,input.outline.secondary[type=submit],input.outline[type=reset],a.outline.secondary[role=button]{border:1px solid var(--secondary);background-color:initial;color:var(--secondary)}button.outline.secondary:hover,button.outline.secondary:active,button.outline.secondary:focus,input.outline.secondary[type=submit]:hover,input.outline.secondary[type=submit]:active,input.outline.secondary[type=submit]:focus,input.outline[type=reset]:hover,input.outline[type=reset]:active,input.outline[type=reset]:focus,a.outline.secondary[role=button]:hover,a.outline.secondary[role=button]:active,a.outline.secondary[role=button]:focus{border:1px solid var(--secondary-hover);color:var(--secondary-hover)}button.outline.secondary:focus,input.outline.secondary[type=submit]:focus,input.outline[type=reset]:focus,a.outline.secondary[role=button]:focus{box-shadow:0 0 0 .2rem var(--secondary-focus)}button.outline.contrast,input.outline.contrast[type=submit],input.outline.contrast[type=reset],a.outline.contrast[role=button]{border:1px solid var(--contrast);background-color:initial;color:var(--contrast)}button.outline.contrast:hover,button.outline.contrast:active,button.outline.contrast:focus,input.outline.contrast[type=submit]:hover,input.outline.contrast[type=submit]:active,input.outline.contrast[type=submit]:focus,input.outline.contrast[type=reset]:hover,input.outline.contrast[type=reset]:active,input.outline.contrast[type=reset]:focus,a.outline.contrast[role=button]:hover,a.outline.contrast[role=button]:active,a.outline.contrast[role=button]:focus{border:1px solid var(--contrast-hover);color:var(--contrast-hover)}button.outline.contrast:focus,input.outline.contrast[type=submit]:focus,input.outline.contrast[type=reset]:focus,a.outline.contrast[role=button]:focus{box-shadow:0 0 0 .2rem var(--contrast-focus)}table{width:100%;border-spacing:0}th,td{padding:.5rem 1rem;border-bottom:1px solid var(--table-border);color:var(--muted-text);font-weight:400;text-align:left;font-size:.875rem}th,thead td{color:var(--text);font-size:1rem}thead th,thead td{border-bottom:3px solid var(--table-border)}tbody tr:nth-child(odd){background-color:var(--table-stripping)}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;font-size:1rem}pre,code,kbd{background:var(--code-inlined);color:var(--code-color-1);font-size:85%;font-weight:400;line-height:1}@media(min-width:576px){pre,code,kbd{font-size:83%}}@media(min-width:768px){pre,code,kbd{font-size:81%}}@media(min-width:992px){pre,code,kbd{font-size:79%}}@media(min-width:1200px){pre,code,kbd{font-size:77%}}code,kbd{display:inline-block;padding:.375rem .5rem;border-radius:.25rem}pre{display:block;margin-bottom:1rem;padding:1rem;overflow-x:auto;background:var(--code-background)}pre>code{display:block;padding:0;background:0 0;font-size:14px;line-height:1.5}code b{color:var(--code-color-2);font-weight:400}code i{color:var(--code-color-3);font-style:normal}code u{color:var(--code-color-4);text-decoration:none}code em{color:var(--code-color-5);font-style:normal}kbd{background-color:var(--secondary);color:var(--secondary-inverse);font-weight:bolder}hr{box-sizing:content-box;height:0;overflow:visible;border:none;border-top:1px solid var(--muted-border)}progress{vertical-align:baseline}[hidden],template{display:none}details{display:block;margin-bottom:1.5rem;padding-bottom:.75rem;border-bottom:1px solid var(--muted-border)}details summary{list-style-type:none;cursor:pointer;line-height:1rem}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:inline-block;width:1rem;height:1rem;float:right;transform:rotate(-90deg);background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23808080' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-position:50%;background-repeat:no-repeat;background-size:1rem;content:''}details summary:focus{outline:none}details summary~*{margin-top:.75rem}details summary~*~*{margin-top:0}details[open] summary{margin-bottom:.375rem;color:var(--muted-text)}details[open] summary::after{transform:rotate(0)}article{margin:1rem 0;padding:1rem;overflow:hidden;border-radius:.25rem;background:var(--card-background);box-shadow:var(--card-shadow)}@media(min-width:576px){article{margin:1rem 0;padding:1rem}}article>*:not(header):not(footer):not(pre):last-child{margin-bottom:0}article>header,article>footer{background-color:var(--card-sections)}article>header,article>footer{margin:-1rem;padding:1rem}article>header{margin-top:-2rem;margin-bottom:1rem}article>footer{margin-top:1rem;margin-bottom:-2rem}nav,nav ul{display:flex}nav{justify-content:space-between}nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ul:first-of-type{margin-left:-.5rem}nav ul:last-of-type{margin-right:-.5rem}nav li{display:inline-block;margin:0;padding:1rem .5rem}nav li>*,nav li>input:not([type=checkbox]):not([type=radio]){margin-bottom:0}nav a{display:block;margin:-1rem -.5rem;padding:1rem .5rem;border-radius:.25rem}nav a:hover,nav a:active,nav a:focus{text-decoration:none}nav a.contrast:not([role=button]){box-shadow:0 0}aside nav,aside ul,aside li{display:block}aside li{padding:.5rem}aside li a{margin:-.5rem;padding:.5rem}nav#mainNav ul:nth-of-type(1) li:nth-of-type(1){display:none}@media(max-width:576px){nav#mainNav{display:table;width:100%}nav#mainNav ul{display:table-row;margin:0!important;width:100%}nav#mainNav ul li{display:none}nav#mainNav ul:nth-of-type(1){}nav#mainNav ul:nth-of-type(1) li:nth-of-type(1),nav#mainNav ul:nth-of-type(1) li:nth-of-type(2){display:table-column;float:right;position:relative;width:50%}nav#mainNav ul:nth-of-type(1) li:nth-of-type(1){text-align:right}nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) a:focus{background:0 0}nav#mainNav ul:nth-of-type(1) li:nth-of-type(1) a i.icss-bars{margin-top:.1em}nav#mainNav ul:nth-of-type(1) li:nth-of-type(2){text-align:left}nav#mainNav ul:nth-of-type(1) li:nth-of-type(2) a i.icss-home{margin-bottom:.3em}nav#mainNav ul:nth-of-type(1) li:not(:nth-of-type(1)):not(:nth-of-type(2)){padding-top:.5rem;padding-bottom:.5rem}nav#mainNav ul:not(:nth-of-type(1)) li{padding-top:.5rem;padding-bottom:.5rem}.responsive{overflow:hidden}.responsive li{display:block!important}}[data-tooltip]{position:relative}[data-tooltip]:not(a):not(button):not(input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::before,[data-tooltip]::after{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:.25rem;background:var(--contrast);color:var(--contrast-inverse);font-size:.85rem;font-style:normal;font-weight:400;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;content:attr(data-tooltip);opacity:0;pointer-events:none}[data-tooltip]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:initial;color:var(--contrast);content:''}[data-tooltip]:focus::before,[data-tooltip]:focus::after,[data-tooltip]:hover::before,[data-tooltip]:hover::after{opacity:1}i[class*=icss-]{position:relative;display:inline-block;font-style:normal;background-color:currentColor;box-sizing:border-box;vertical-align:middle}i[class*=icss-]:before,i[class*=icss-]:after{content:\"\";border-width:0;position:absolute;box-sizing:border-box}[class*=icss-].xxsmall{font-size:.45em}[class*=icss-].xsmall{font-size:.5em}[class*=icss-].small{font-size:.65em}[class*=icss-].x1_5{font-size:1.5em}[class*=icss-].x2{font-size:2em}[class*=icss-].x2_5{font-size:2.5em}[class*=icss-].x3{font-size:3em}[class*=icss-].x4{font-size:4em}[class*=icss-].x5{font-size:5em}i[class*=icss-].bottom{vertical-align:text-bottom}.flip{transform:scaleX(-1)}i[class*=icss-].rot10{transform:rotate(10deg)}i[class*=icss-].rot-10{transform:rotate(-10deg)}i[class*=icss-].rot20{transform:rotate(20deg)}i[class*=icss-].rot-20{transform:rotate(-20deg)}i[class*=icss-].rot45{transform:rotate(45deg)}i[class*=icss-].rot-45{transform:rotate(-45deg)}i[class*=icss-].rot90{transform:rotate(90deg)}i[class*=icss-].rot-90{transform:rotate(-90deg)}i[class*=icss-].rot180{transform:rotate(180deg)}i[class*=icss-].rot-180{transform:rotate(-180deg)}i.icss-anim,i.icss-anim:before,i.icss-anim:after{transition:all 1s}.icss-spin{animation:spin 2s infinite linear}.icss-pulse{animation:spin 1s infinite steps(8)}.icss-spin-hover:hover{animation:spin 2s infinite linear}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}@keyframes ring{0%{transform:rotate(-15deg)}2%{transform:rotate(15deg)}4%{transform:rotate(-18deg)}6%{transform:rotate(18deg)}8%{transform:rotate(-22deg)}10%{transform:rotate(22deg)}12%{transform:rotate(-18deg)}14%{transform:rotate(18deg)}16%{transform:rotate(-12deg)}18%{transform:rotate(12deg)}20%,100%{transform:rotate(0)}}.icss-ring{animation:ring 2s infinite ease}.icss-ring-hover:hover{animation:ring 2s infinite ease}@keyframes vertical{0%{transform:translate(0,-3px)}4%{transform:translate(0,3px)}8%{transform:translate(0,-3px)}12%{transform:translate(0,3px)}16%{transform:translate(0,-3px)}20%{transform:translate(0,3px)}22%,100%{transform:translate(0,0)}}.icss-vibes,.icss-vibes-hover:hover{animation:vertical 2s ease infinite}@keyframes horizontal{0%{transform:translate(0,0)}6%{transform:translate(5px,0)}12%{transform:translate(0,0)}18%{transform:translate(5px,0)}24%{transform:translate(0,0)}30%{transform:translate(5px,0)}36%,100%{transform:translate(0,0)}}.icss-shake,.icss-shake-hover:hover{animation:horizontal 2s ease infinite}@keyframes tada{0%{transform:scale(1)}10%,20%{transform:scale(.9)rotate(-8deg)}30%,50%,70%{transform:scale(1.3)rotate(8deg)}40%,60%{transform:scale(1.3)rotate(-8deg)}80%,100%{transform:scale(1)rotate(0)}}.icss-tada,.icss-tada-hover:hover{animation:tada 2s linear infinite}.icss-reverse{animation-direction:reverse}[class*=-hover].icss-reverse:hover{animation-direction:reverse}.icss-stack{position:relative;width:1em;height:1em;display:inline-block}.icss-stack i[class*=icss-]{position:absolute;top:50%;left:50%;transform:translate(-.5em,-.5em)}.icss-stack i[class*=icss-].bottom{bottom:0;top:auto}.icss-shadow{position:relative;width:1em;height:1em;display:inline-block}.icss-shadow i[class*=icss-]{position:absolute;top:50%;left:50%;transform:translate(-.5em,-.5em)}.icss-shadow i[class*=icss-]:first-child{top:54%;left:54%}i.icss-github-c{width:1em;height:.8em;border-radius:45% 45% 35% 35%/50%;background-color:#f5f5f5;box-shadow:inset 0 .1em 0 .14em #333,inset 0 .05em 0 .12em #333;background-image:radial-gradient(ellipse 15% 25% at 34% 62%,#333 0%,#333 50%,transparent 50%),radial-gradient(ellipse 15% 25% at 66% 62%,#333 0%,#333 50%,transparent 50%);margin:.15em 0 .05em}i.icss-github-c:before{border-width:.17em;border-style:solid;border-radius:.02em 60% 100% 80%;border-color:#333;left:.1em;top:-.06em;transform:rotate(20deg)}i.icss-github-c:after{border-width:.17em;border-style:solid;border-radius:.02em 80% 100% 60%;border-color:#333;left:.6em;top:-.06em;transform:rotate(65deg)}i.icss-home{width:.36em;height:.43em;margin:.57em .71em 0 .13em;border-width:0;border-style:solid;border-radius:0 0 .05em .05em;box-shadow:.575em 0,.285em -.28em 0 -.06em,.55em -.62em 0 -.14em,.6em -.54em 0 -.14em,.6em -.62em 0 -.14em}i.icss-home:before{border-width:0 .47em .45em;border-style:solid;bottom:.425em;left:0;border-left-color:transparent;border-right-color:transparent}i.icss-home:after{width:.85em;height:.85em;border-width:.065em 0 0 .065em;border-style:solid;transform:rotate(45deg);top:-.43em;left:.045em}i.icss-users{width:.8em;height:.5em;border-width:.065em;border-style:solid;border-radius:.8em .8em .2em .2em;margin-top:.4em;background-color:initial;box-shadow:.45em .05em 0 -.05em;margin:.5em .35em 0 0}.icss-stack i.icss-users{transform:translate(-.6em,-.5em)}i.icss-users:before{border-style:solid;border-width:.065em;border-radius:100%;top:-.46em;left:50%;transform:translateX(-50%);width:.45em;height:.45em;box-shadow:.45em .1em 0 -.05em;background-image:radial-gradient(circle at -.1em -.1em,currentcolor 0,currentcolor .28em,transparent .28em),radial-gradient(circle at .35em -.2em,currentcolor 0,currentcolor .35em,transparent .35em)}i.icss-users:after{border-style:solid;border-width:.15em .1em .3em;border-radius:100%;width:.2em;height:.2em;border-left-color:transparent;border-right-color:transparent;left:.23em;top:-.05em}i.icss-smiley{width:1em;height:1em;background-color:initial;box-shadow:inset 0 0 0 .07em;border-radius:50%}i.icss-smiley:before{width:.5em;height:.5em;border-radius:100%;top:.3em;left:50%;transform:translateX(-50%);box-shadow:inset 0 -.1em 0 -.02em,0 .08em 0 -.05em}i.icss-smiley:after{width:.16em;height:.16em;border-radius:100%;box-shadow:inset .5em 0,.39em 0;top:30%;left:.235em}i.icss-rss{width:1em;height:1em;background-color:initial;border:.065em solid;border-radius:.05em;background-image:radial-gradient(circle at .2em .685em,currentcolor 0,currentcolor .1em,transparent .1em)}i.icss-rss:before{width:.6em;height:.6em;background-color:initial;top:.12em;left:.18em;background-image:radial-gradient(circle at 0 100%,transparent 0,transparent 28%,currentcolor 28%,currentcolor 42%,transparent 42%,transparent 55%,currentcolor 55%,currentcolor 70%,transparent 70%)}i.icss-plus{width:1em;height:1em;background-color:initial;margin:0}i.icss-plus:before,i.icss-plus:after{width:1em;height:.18em;top:50%;left:50%;border-radius:.06em;background-color:currentColor}i.icss-plus:before{transform:translate(-50%,-50%)rotate(-180deg)}i.icss-plus:after{transform:translate(-50%,-50%)rotate(90deg)}i.icss-gear{width:.5em;height:.5em;position:relative;border-radius:100%;background-color:initial;border-width:.07em;border-style:solid;border-color:transparent;margin:.25em;box-shadow:0 0 0 .1em,inset 0 0 0 .3em}i.icss-gear:before{width:.18em;height:.18em;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:.41em 0,-.41em 0,0 .41em,0 -.41em}i.icss-gear:after{width:.18em;height:.18em;top:50%;left:50%;transform:translate(-50%,-50%)rotate(45deg);box-shadow:.42em 0,-.42em 0,0 .42em,0 -.42em}i.icss-exit{width:.6em;height:.8em;background-color:initial;box-shadow:inset 0 0 0 .065em;border-radius:.05em;margin:.1em .3em .1em .1em}i.icss-exit:before{width:.4em;height:.8em;transform:perspective(1em)rotateY(-30deg);transform-origin:0 50%;box-shadow:inset -.06em .37em,inset .24em .37em,inset -.06em -.36em,inset .24em -.36em;border-radius:.03em;top:0;left:0}i.icss-exit:after{width:.36em;height:.36em;border:.18em solid transparent;border-right-color:initial;transform:translateY(-50%);box-shadow:.16em 0 0 -.08em;top:50%;left:.45em}i.icss-text-bold{width:1em;height:1em;background-color:initial;margin:0}i.icss-text-bold:before{top:50%;left:50%;content:\"B\";font-size:1em;font-weight:700;transform:translate(-50%,-50%);font-family:serif}i.icss-text-italic{width:1em;height:1em;background-color:initial;margin:0}i.icss-text-italic:before{top:50%;left:50%;content:\"I\";font-size:1em;font-weight:700;font-style:italic;transform:translate(-50%,-50%);font-family:serif}i.icss-text-width{background-color:initial;border:.15em solid;border-width:.15em .15em .15em 0;border-color:transparent initial transparent transparent;margin:.7em .75em 0 .1em}i.icss-text-width:before{width:.7em;text-align:center;content:\"T\";font-size:.9em;font-family:serif;line-height:.85em;border-bottom:.07em solid;top:-.88em;left:.125em}i.icss-text-width:after{border:.15em solid;border-color:transparent transparent transparent initial;left:.7em;top:-.15em}i.icss-x{width:1em;height:1em;background-color:initial;margin:0}i.icss-x:before,i.icss-x:after{width:1em;height:.18em;top:50%;left:50%;border-radius:.06em;background-color:currentColor}i.icss-x:before{transform:translate(-50%,-50%)rotate(-225deg)}i.icss-x:after{transform:translate(-50%,-50%)rotate(225deg)}i.icss-user-circle{width:1em;height:1em;border-radius:50%;background-color:initial;border:.068em solid;overflow:hidden;margin:0}i.icss-user-circle:before{width:.55em;height:.55em;border-style:solid;border:.065em solid transparent;border-radius:100%;top:.05em;left:50%;transform:translateX(-50%);box-shadow:inset 0 0 0 .5em,0 .67em 0 .2em}i.icss-user:after{}i.icss-link{width:.09em;height:.4em;border-radius:.1em;margin:.3em .455em}.icss-stack i.icss-link{transform:translate(-.5em,-.5em)rotate(30deg)}i.icss-link:before{width:.33em;height:.42em;background-color:initial;border-radius:.16em .16em .1em .1em;border:.09em solid;border-bottom:0 solid transparent;top:-.25em;left:-.12em}i.icss-link:after{width:.33em;height:.42em;background-color:initial;border-radius:.1em .1em .16em .16em;border:.09em solid;border-top:0 solid transparent;top:.24em;left:-.12em}i.icss-image{width:1em;height:.75em;background-color:initial;border-width:.065em;border-style:solid;overflow:hidden;border-radius:.05em;margin:.125em 0}i.icss-image:before{border-style:solid;border-width:.3em;transform:rotate(45deg);box-shadow:.25em -.45em;top:.4em;left:-.1em}i.icss-image:after{border-width:.08em;border-style:solid;left:.2em;top:.05em;border-radius:100%}i.icss-camera{width:.5em;height:.5em;border-radius:100%;background-color:initial;box-shadow:inset -.026em -.026em 0 .08em,0 -.03em 0 .14em,-.03em -.17em 0 .04em;border:.07em solid transparent;margin:.3em .25em .2em}i.icss-camera:before{width:1em;height:.7em;border-radius:.08em;box-shadow:inset .15em -.01em 0 .09em,inset 0 0 0 .05em;top:50%;left:50%;transform:translate(-50%,-50%)}i.icss-camera:after{width:.09em;height:.51em;box-shadow:inset 0 -.42em,-.02em 0 0 .08em,-.05em -.1em 0 .02em;border-radius:.04em;top:-.09em;left:.53em}i.icss-minus{width:1em;height:1em;background-color:initial;margin:0}i.icss-minus:before,i.icss-minus:after{width:1em;height:.18em;top:50%;left:50%;border-radius:.06em;background-color:currentColor}i.icss-minus:before{transform:translate(-50%,-50%)rotate(-180deg)}i.icss-minus:after{transform:translate(-50%,-50%)rotate(0)}i.icss-bars{margin:.41em 0}i.icss-bars,i.icss-bars:before,i.icss-bars:after{width:1em;height:.18em;border-radius:.06em;background-color:currentColor}i.icss-bars:before{top:-.36em;left:0}i.icss-bars:after{top:.36em;left:0}i.icss-key{height:.55em;width:.5em;background:0 0;border-radius:50%/47%;box-shadow:inset -.05em 0 0 .18em;margin:.225em .45em .225em .05em;transform:rotate(45deg);transform-origin:.5em 50%}.icss-stack i.icss-key{transform:translate(-.5em,-.5em)rotate(45deg)}i.icss-key:before{width:.14em;height:.14em;box-shadow:inset .5em .5em,-.09em .09em,-.18em .18em,-.27em .27em;top:50%;left:.84em;transform:translateY(-50%)scaleX(.95)rotate(45deg)}i.icss-key:after{width:.61em;height:.2em;box-shadow:inset .27em -.13em;top:50%;left:.3em;transform:translateY(-50%)}i.icss-spinner{width:.25em;height:.25em;background-color:initial;border-radius:50%;box-shadow:0 -.4em,-.28em -.28em 0 -.01em,-.4em 0 0 -.02em,-.28em .28em 0 -.03em,0 .4em 0 -.04em,.28em .28em 0 -.05em,.4em 0 0 -.06em,.28em -.28em 0 -.07em;margin:.375em}i.icss-paper-plane{width:.25em;height:.25em;background-color:initial;border-style:solid;border-color:initial transparent;border-width:.25em .23em 0 0;margin:.62em .37em .13em .38em}i.icss-paper-plane:before{width:.2em;height:.67em;border-style:solid;border-color:initial transparent;border-width:0 .38em .68em 0;transform:rotate(30deg)skewX(-25deg);transform-origin:0 0;top:-.68em;left:.61em}i.icss-paper-plane:after{width:.2em;height:.67em;border-style:solid;border-color:initial transparent;border-width:0 0 .68em .25em;transform:rotate(30deg)skewX(-35deg);transform-origin:.25em 0;top:-.68em;left:.36em}i.icss-magic-wand{width:.07em;height:.35em;background-color:initial;border-radius:50%;box-shadow:.4em .05em;margin:.325em .465em}i.icss-magic-wand:before{width:.2em;height:1em;background-color:initial;border-radius:.05em;box-shadow:inset 0 0 0 .065em,inset 0 -.35em,inset 0 .2em,.5em 0 0 -.36em;transform:rotate(45deg);top:-.23em;left:-.15em}i.icss-magic-wand:after{width:.35em;height:.35em;background-color:initial;border:0 solid transparent;border-width:.145em 0;box-shadow:inset .5em .5em,-.3em -.5em 0 -.11em,.05em -.45em 0 -.11em,-.55em -.35em 0 -.1em;border-radius:50%;top:.05em;left:.25em}i.icss-composite-darker{width:.7em;height:.7em;box-shadow:inset 0 0 0 .065em;background-color:initial;margin:0 .3em .3em 0}i.icss-composite-darker:before{width:.7em;height:.7em;background-color:currentColor;border-radius:50%;clip:rect(0 .4em .4em 0);top:.3em;left:.3em}i.icss-composite-darker:after{width:.7em;height:.7em;background:currentColor;border-radius:50%;opacity:.5;top:.3em;left:.3em}i.icss-composite-lighter{width:.7em;height:.7em;box-shadow:inset 0 0 0 .065em;background-color:initial;margin:0 .3em .3em 0}i.icss-composite-lighter:before{width:.7em;height:.7em;background-color:currentColor;border-radius:50%;opacity:50%;top:.3em;left:.3em}i.icss-composite-lighter:after{width:.7em;height:.7em;border-radius:50%;background-image:linear-gradient(transparent 50%,currentColor 50%),linear-gradient(90deg,transparent 50%,currentColor 50%);top:.3em;left:.3em}i.icss-quill-pen{width:1em;height:1em;background-color:initial;margin:0}i.icss-quill-pen:before{width:.78em;height:.78em;border-radius:85% 15% 100% 0/85% 15%;box-shadow:inset -.5em .12em 0 -.2em,inset .52em -.68em 0 -.2em;transform:rotate(-7deg)skewX(-15deg);top:.05em;left:.17em}i.icss-quill-pen:after{width:.2em;height:.09em;background:currentColor;transform:skewY(-45deg);left:.05em;top:.8em}i.icss-print{width:.68em;height:1em;border-style:solid;border-color:initial;background-color:initial;border-width:.07em;border-radius:.05em;background-color:initial;margin:0 .16em}i.icss-print:before{width:1em;height:.4em;border-width:.07em .21em 0;border-style:solid;border-color:initial initial transparent;border-radius:.05em .05em 0 0;top:.25em;left:50%;transform:translateX(-50%);background-image:linear-gradient(transparent 20%,currentcolor 20%,currentcolor 60%,transparent 60%)}i.icss-print:after{width:.45em;height:.065em;background-color:currentColor;left:50%;transform:translateX(-50%);top:.6em;box-shadow:0 .12em,-.1em -.28em 0 .05em}i.icss-edit{width:1em;height:1em;background-color:initial;border-radius:50% 45% 50% 35%;overflow:hidden;margin:0}i.icss-edit:before{width:.3em;height:.8em;border:.15em solid transparent;border-top:.24em solid;transform:rotate(45deg)translate(-50%);transform-origin:0 0;box-shadow:0 -.05em,.24em -.8em,-.24em -.8em,0 -1.5em;clip:rect(-.9em .3em 1em 0);left:.25em;top:.75em}i.icss-edit:after{width:.1em;height:0;background-color:initial;transform:translate(-50%,-50%);top:50%;left:50%}i.icss-arrow-left{width:1em;height:.18em;border-radius:.1em;background-color:currentColor;margin:.41em 0}i.icss-arrow-left:before{width:.6em;height:.18em;border-radius:1em;background-color:currentColor;top:-.15em;left:-.06em;transform:rotate(-45deg)}i.icss-arrow-left:after{width:.6em;height:.18em;border-radius:.1em;background-color:currentColor;top:.15em;left:-.06em;transform:rotate(45deg)}i.icss-comment{width:.9em;height:.65em;border-radius:50%;margin:.1em .05em .2em}i.icss-comment:before{width:.3em;height:.22em;border-radius:0 0 100% 0;border:0 solid transparent;border-right:.15em solid;transform:rotate(15deg);top:.55em;left:.08em}i.icss-comment:after{}i.icss-chat{width:.7em;height:.55em;border-radius:50%;border:.065em solid transparent;background:0 0;box-shadow:inset 1em 0,-.35em -.23em;margin:.35em -.05em .05em .35em}i.icss-chat:before{width:.25em;height:.2em;border-radius:0 0 100% 0;border:0 solid transparent;border-right:.13em solid;transform:rotate(18deg);top:.15em;left:-.38em}i.icss-chat:after{width:.2em;height:.15em;border-radius:0 0 0 100%;border:0 solid transparent;border-left:.12em solid;transform:rotate(-10deg);top:.37em;left:.3em}i.icss-video-camera{width:.7em;height:.5em;border-radius:.1em;margin:.4em .23em .1em .07em}i.icss-video-camera:before{height:.4em;border:.2em solid;border-width:.1em .18em .1em 0;border-color:transparent initial;border-radius:.03em;top:.05em;left:.7em}i.icss-video-camera:after{width:.28em;height:.28em;border:.08em solid;box-shadow:-.3em -.03em 0 .04em;border-radius:50%;top:-.26em;left:.37em}i.icss-sound-0{width:.45em;height:.7em;background-color:initial;border:.2em solid transparent;border-right:.24em solid;border-left:0;box-shadow:inset .15em 0;margin:.15em .5em .15em .05em}i.icss-sound-0:before{width:.4em;height:.1em;background-color:currentColor;top:50%;left:.5em;transform:translateY(-50%)rotate(45deg)}i.icss-sound-0:after{width:.4em;height:.1em;background-color:currentColor;top:50%;left:.5em;transform:translateY(-50%)rotate(-45deg)}i.icss-sound-3{width:.45em;height:.7em;background-color:initial;border:.2em solid transparent;border-right:.24em solid;border-left:0;box-shadow:inset .15em 0;margin:.15em .5em .15em .05em}i.icss-sound-3:before{width:.7em;height:.7em;border:.1em solid transparent;box-shadow:inset 0 0 0 .1em,0 0 0 .09em;border-radius:50%;clip:rect(-.4em .8em .35em .35em);top:50%;left:.1em;transform:scaleX(.8)translateY(-50%)rotate(45deg)}i.icss-sound-3:after{width:.9em;height:.9em;border:.1em solid transparent;box-shadow:0 0 0 .09em;border-radius:50%;clip:rect(-.5em 1em .52em .38em);top:50%;left:.1em;transform:scaleX(.8)translateY(-50%)rotate(45deg)}i.icss-exclamation-circle{width:1em;height:1em;border-radius:50%;border:.1em solid;background-color:initial;margin:0}i.icss-exclamation-circle:before{width:.15em;border:.015em solid transparent;border-top:.38em solid;border-bottom:.09em solid transparent;box-shadow:0 .13em 0 -.012em;top:.1em;left:50%;transform:translateX(-50%)}i.icss-microphone{width:.5em;height:.3em;border-radius:0 0 .25em .25em/0 0 .25em .25em;background-color:initial;border:.065em solid;border-top:0;margin:.5em .25em .2em}i.icss-microphone:before{width:.3em;height:.6em;border-radius:.2em;background-color:initial;top:-.4em;left:50%;transform:translateX(-50%);box-shadow:inset 0 -.25em 0 .063em,inset 0 0 0 .063em,0 .55em 0 -.11em,0 .91em 0 .1em;clip:rect(0 .3em .9em 0)}i.icss-microphone:after{}i.icss-exchange{background-color:initial;border:.2em solid transparent;border-left-color:initial;border-right-width:.8em;box-shadow:-.7em 0 0 -.13em;margin:.5em -.8em .05em .8em}i.icss-exchange:before{border:.2em solid transparent;border-right-color:initial;border-left-width:.8em;box-shadow:.7em 0 0 -.13em;top:-.5em;left:-1.8em}i.icss-mail-box{width:.1em;height:.2em;background-color:currentColor;margin:.8em .4em 0 .5em}i.icss-mail-box:before{width:.45em;height:.6em;border-radius:.3em .3em 0 0/.4em .4em 0 0;border:.05em solid transparent;box-shadow:inset 0 0 0 .1em,inset 0 1.32em 0 -1em,.3em 0 0 .05em,.5em 0 0 -.05em;clip:rect(.05em 1em .55em 0);top:-.55em;left:-.45em}i.icss-mail-box:after{border:.15em solid transparent;border-top:.25em solid;border-bottom:0;box-shadow:0 -.05em;transform:rotate(0);transform-origin:-.06em 0;top:-.43em;left:0}i.icss-mail-box-in{width:.1em;height:.2em;background-color:currentColor;margin:.8em .4em 0 .5em}i.icss-mail-box-in:before{width:.45em;height:.6em;border-radius:.3em .3em 0 0/.4em .4em 0 0;border:.05em solid transparent;box-shadow:inset 0 0 0 .1em,inset 0 1.32em 0 -1em,.3em 0 0 .05em,.5em 0 0 -.05em;clip:rect(.05em 1em .55em 0);top:-.55em;left:-.45em}i.icss-mail-box-in:after{border:.15em solid transparent;border-top:.25em solid;border-bottom:0;box-shadow:0 -.05em;transform:rotate(-90deg);transform-origin:-.06em 0;top:-.43em;left:0}i.icss-floppy{width:.9em;height:.6em;background-color:initial;border-radius:.05em;box-shadow:inset .1em .1em,inset .1em -.1em,inset -.1em .1em,inset -.1em -.1em;margin:.4em .05em 0}i.icss-floppy:before{width:0;height:0;background-color:initial;border:.1em solid transparent;border-bottom:.1em solid;border-width:.1em .2em .2em 0;box-shadow:0 .25em;top:-.5em;left:.7em}i.icss-floppy:after{width:.5em;height:.3em;border-radius:0 0 .03em .03em;border:0 solid transparent;border-width:.05em .1em .1em;box-shadow:inset .12em 0,-.15em .05em 0 .05em,-.2em .2em,.2em .2em,.1em .5em 0 -.12em,.1em .65em 0 -.12em,-.1em .5em 0 -.12em,-.1em .65em 0 -.12em;top:-.4em;left:.2em}i.icss-heart{width:.5em;height:.5em;background:currentColor;border:.065em solid;border-top:0;border-right:0;transform:rotate(-45deg);margin:.3em .25em .2em}.icss-stack i.icss-heart{transform:translate(-.5em,-.5em)rotate(-45deg)}i.icss-heart:before{width:.5em;height:.28em;top:-.22em;left:-.063em;background:currentColor;border-radius:.5em .5em 0 0}i.icss-heart:after{width:.28em;height:.5em;top:0;left:.37em;border-radius:0 .5em .5em 0;background:currentColor}i.icss-heart-o{width:.5em;height:.5em;background:0 0;border-left:solid .065em;border-bottom:solid .065em;transform:rotate(-45deg);margin:.3em .25em .2em}.icss-stack i.icss-heart-o{transform:translate(-.5em,-.5em)rotate(-45deg)}i.icss-heart-o:before{width:.5em;height:.28em;top:-.22em;left:-.063em;border-radius:.5em .5em 0 0;border:.065em solid;border-bottom:0}i.icss-heart-o:after{width:.28em;height:.5em;top:0;left:.37em;border-radius:0 .5em .5em 0;border:.065em solid;border-left:0}i.icss-circle{width:1em;height:1em;border-radius:50%;margin:0}i.icss-circle-o{width:1em;height:1em;border-radius:50%;background-color:initial;border:.1em solid;margin:0}body,html{overflow-x:hidden}article p img{display:block;margin-top:.5rem}article hgroup h3{margin-left:60px}article hgroup footer{margin-left:60px}.invisible{visibility:hidden;width:0;height:0}.invisible.width-none{width:0!important}.nav{z-index:1050}.captchaInput{width:50%!important}.icss-search{margin-right:20px!important}#cookie-law{background-color:#323232!important;padding-top:10px;padding-bottom:10px;margin-bottom:20px}#cookie-law p{color:#fff;font-size:13px;text-align:center;background-color:#323232!important;margin-bottom:0}#cookie-law p a[role=button]{margin:10px 0 0 10px;padding:5px 15px;font-size:13px;color:#dcdcdc!important;border-color:1px solid var(--primary)!important;border-radius:.25rem!important}footer{border-top:1px solid var(--primary);background-color:rgba(234,232,232,.1);font-size:85%}@media(min-width:576px){footer{font-size:83%}}@media(min-width:768px){footer{font-size:81%}}@media(min-width:992px){footer{font-size:79%}}@media(min-width:1200px){footer{font-size:77%}}body>footer{display:flex;flex-direction:row;justify-content:space-between;align-content:center}footer .footer-menu{display:flex;flex-direction:row}footer .footer-menu a{margin-right:10px;padding-right:10px;position:relative}footer .footer-menu a::after{content:'';height:12px;width:1px;background-color:#929292;position:absolute;right:0;bottom:4px}footer .footer-menu a:last-child{border:none;padding-right:0;margin-right:0}footer .footer-menu a:last-child::after{content:none}@media(max-width:576px){.toolbar-nav li{padding:1rem .2rem}nav{justify-content:unset;-webkit-justify-content:unset;-moz-justify-content:unset;-ms-justify-content:unset}nav.toolbar-nav ul{margin-right:0;margin-left:0;display:flex;display:-moz-box;display:-webkit-flexbox;display:-ms-flexbox;display:-webkit-flex;display:-moz-flex;flex-direction:row;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;justify-content:space-between;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;width:100%}nav.toolbar-nav ul li{padding:.5rem 0;flex:1;-webkit-flex:0 1 100%;-moz-flex:0 1 100%;-ms-flex:0 1 100%;text-align:center}[data-tooltip]:not(a):not(button):not(input){border-bottom:none}#cookie-law p a[role=button]{display:block;width:20%;margin:10px auto 0;padding:5px}nav.pagination-nav{justify-content:space-between}}@media(max-width:1200px){body>footer{text-align:center;flex-direction:column-reverse}footer .footer-copyright{margin-top:10px}footer .footer-menu{justify-content:center}}"), - } - - // define dirs - dir5 := &embedded.EmbeddedDir{ - Filename: "", - DirModTime: time.Unix(1611979522, 0), - ChildFiles: []*embedded.EmbeddedFile{ - file6, // "01-pico.css" - file7, // "02-icss.css" - file8, // "03-icons.css" - file9, // "99-spyda.css" - filea, // "spyda.min.css" - - }, - } - - // link ChildDirs - dir5.ChildDirs = []*embedded.EmbeddedDir{} - - // register embeddedBox - embedded.RegisterEmbeddedBox(`static/css`, &embedded.EmbeddedBox{ - Name: `static/css`, - Time: time.Unix(1611979522, 0), - Dirs: map[string]*embedded.EmbeddedDir{ - "": dir5, - }, - Files: map[string]*embedded.EmbeddedFile{ - "01-pico.css": file6, - "02-icss.css": file7, - "03-icons.css": file8, - "99-spyda.css": file9, - "spyda.min.css": filea, - }, - }) -} - -func init() { - - // define files - filec := &embedded.EmbeddedFile{ - Filename: ".gitkeep", - FileModTime: time.Unix(1609727320, 0), - - Content: string(""), - } - filed := &embedded.EmbeddedFile{ - Filename: "favicon.png", - FileModTime: time.Unix(1609727320, 0), - - Content: string("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x06\x05\x00\x00\x06\x06\b\x02\x00\x00\x00\x0f\xfc\x8et\x81G\xf2\xfd\xbcx\xf7\x87\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\xe1/J\x00\x00\x00@/\xb2,\xab\xaaJ\x1d\xc2\xdd\xde\xde*\x02\x83\x92\a\x01\x00\x00Џ\xa2(>}\xfa\xa4\x0e=\xec\xd5\xffb\xb7ΰ\xfeC\t\x00\x00\x00\x00\xa2\"\x0f\x02\x00\x00\x00\x88\x8b<\b\x00\x00\x00 .\xf2 \x00\x00\x00\x80\xb8ȃ\x00\x00\x00\x00\xe2\"\x0f\x02\x00\x00\x00\x88\x8b<\b\x00\x00\x00 .?*\xc1\xa5\x92$\xd9l6\xea\x00\xc0W\xc7/\xd4\x01\x00\x80\xb9\x90\a]l\xb3\xd9|\xfa\xf4I\x1d\x00\xf8\xea\xe7\x9f\u007f\xbe\xbd\xbdU\a\x00\x00\xe6\xc2\xf3b\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\\xe4A\x00\x00\x00\x00q\x91\a\x01\x00\x00\x00\xc4E\x1e\x04\x00\x00\x00\x10\x17y\x10\x00\x00\x00@\\~T\x02\x00\x80\x91\x15E\xf1\xfa\x87\xcdf\x93$\xc9\x1b\u007f\xf3\xf8E\xfb\x87\xd3\xe9\xf4\xf8\xf8\xa8t\x00@/\xe4A\x00\x00CI\x92d\xf3E\x96e\xaf\xff\x99\xa6i\xe0\xbf\xf9\xf4\xf4t:\x9d\x9a\xa6y\x8d\x8a\xda?\xa83\x00p)y\x10\x00@\x9f\xb2,+\xbe\xd8l6\xeb\xf5\xba\xf7\u007f\xff\xf5\xdf\xcc\xf3\xfc\xeb\u007f\xf3\xf4\xf4\xd4\xfc\xaf\xd3\xe9\xe4\x12\x00\x00\xdf%\x0f\x02\x00\xe8\xc1f\xb3\xa9\xaa\xaa(\x8a!2\xa0\xb7\xad\xbfx\xf7\xee\xdd\x0f_\xb2\xa1\xba\xae\x0f\x87\xc3\xebSf\x00\x00\u007f\xc8y\xd2\x00\x00\xddeY\xb6\xdb\xed\x8e\xc7\xe3\xe7ϟ߽{7~\x18\xf4\x8d\xf6\a\xf8\xf0\xe1ï\xbf\xfe\xfa\xf8\xf8\xd8\xfe`o\x1fN\x04\x00\x00LK\xd34\xffI\x1f\xbe\x1e\xda\nЯ\xcdfS\xd7\xf5\xf4_\x06\xdb\x1f2\xcb2\xd7\v\x18G\xfb\xd1\xcb\xe7\xcf^\xb8\x97\x18\x9a\xfe \x00\x80\xcbl6\x9b\xa6i>\u007f\xfe\xbc\xddn\xa7\xffӶ?䯿\xfe\xda\xfe\xc0\xf2q\x00\xe0+y\x10\x00\xc0\xb9\x92$\xa9\xeb\xfa\xf3\xe7Ͽ?\xcey\x16\xda\x1f\xf8ӧOz\x85\x00\x80W\xf2 \x00\x80\xb3\x94ey<\x1eg\xd1\x13\xf4g\xda\x1f\xfe\xf5\\!W\x13\x00\"'\x0f\x02\x00\xf8\x8e$I\x0e\x87\xc3/\xbf\xfc\xb2Z\xad\xe6\xfe\xbb\xb4\xbf\u0087\x0f\x1f\x9a\xa6\xd1(\x04\x001\x93\a\x01\x00\xbce\xb3\xd9<>>\xde\xdc\xdc,\xe9\x97\xca\xf3\xbc\xfd\xa5ʲt}\x01 N?*\x01\x00\xc0\x9f\xa9\xaaj\xbf\xdf/\xa0-\xe8ߵ\xbf\xd4/\xbf\xfc\xf2\xf3\xcf?\xdf\xde\u07ba\xd0,\xcckO\xdf\"\u007f\xb5\xf5z=\xc2\xff˿\xfe\xf5\xaf\xdf~\xfb\xads\xf1݁\xbdh\x9aF\x11F\x13\xe7\xc3\xd4\xf2 \x00\x80?VU\xd5Ǐ\x1f\x97\xfd;\xbe\u007f\xff>˲\xf6C\xf0\xe9tr\xc5Y\x8c\xf6\x96\x9eݡ\uf4d2$\xc9O?\xfd\xa4\x0e\xd7\xe5\x1efh\x9e\x17\x03\x00\xf8\x03\xfb\xfd~\xf1aЫ\xedv\xdb4\x8d\xaf\xf4Y\x92\xaa\xaa\x14\x01\xe0m\xf2 \x00\x80o\xd5u\xfd\xeeݻx~\xdf\xf5z-\x12b1\xaa\xaaJ\xd3T\x1d\x00\xde&\x0f\x02\x00\xf8\u007f꺞\xf5P\xf9nDB,F\x84\x87\x80\x00t \x0f\x02\x00\xf8?q\x86A\xafDB,@Q\x14㜸\f0w\xf2 \x00\x80\xffQUU\xb4aЫv#]\u05f5;\x81\xf92/\x0f\xe0L\xf2 \x00\x80\xff\x16\xc34\xb1s\xdc\xdc܈\x84\x98\xa9,ˌd\x028\x93<\b\x00\xe0\x87\xcdf#\f\xfaj\xbb\xdd\x1a\xcf\xc4\x1ci\x0e\x028\x9f<\b\x00\x88\xddf\xb3i\x9aF\x1d~\xef\xe3ǏEQ\xa8\x033\x92$I\xe4\xcf{\x02\\D\x1e\x04\x00ľ\x87\xac\xebz\xb5Z)\xc57\x0e\x87\x83\xb3\xa5\x99\x11c\xc5\x00.\"\x0f\x02\x00\xa2V\u05f5iD\u007fh\xb5Z\x1d\x0e\au`.\xe4A\x00\x17\x91\a\x01\x00Qo onn\xd4\xe1\xcf\xe4y\xee@\x16f\xa1\xaa*]~\x00\x17\x91\a\x01\x00\x91\xdal6\x1f>|P\x87\xb7\xbd\u007f\xff\xbe-\x94:0q\x82K\x80KɃ\x00\x80\x18%I\xe2a\xa83\x19?\xcfĕe\x99\xa6\xa9:\x00\\D\x1e\x04\x00Ĩ\xaek\x1b\xc83\xad\xd7k\xcd\x17L\x99\x93\x83\x00:\x90\a\x01\x00\xd1)\xcbұA\x17y\xff\xfe}\x96e\xea\xc0\x04m6\x9b<\xcf\xd5\x01\xe0R\xf2 \x00 .\xaf\x03\xe6\xd5\xe1R\x8a\xc64i\x0e\x02\xe8F\x1e\x04\x00ĥ\xaeks\x88:\xc8\xf3\xbc,Ku`R\xb2,\xdbn\xb7\xea\x00Ё<\b\x00\x88\x88'\xc5B\xec\xf7\xfb$Iԁ\xe9\xd0\x1c\x04Й<\b\x00\x88E\x92$\xfb\xfd^\x1d:K\xd3\xd4\xf6\x9bI\xad說\xd4\x01\xa0\x1by\x10\x00\x10\x8b\xdb\xdb[3\xc5\x02\xedv;-BLDUU\x9e\xfd\x04\xe8L\x1e\x04\x00Da\xb3ټ{\xf7N\x1d\x02\xb5\xdbo=VL\x84n5\x80\x10\xf2 \x00 \nR\x8c\xbel\xb7[\xb3繺\xaa\xaa\xb4\xfb\x01\x84\x90\a\x01\x00Ql\x1d\xf3\xf9E\xbf\xb4\bq]EQ\xac\xd7ku\x00\b!\x0f\x02\x00\x16\xce1\xd2\x03UU\x11\xb8\x16\xcdA\x00\xe1\xe4A\x00\xc0\x92%Ib\xeb8\x04-B\\K{\xe3\xdd\xdcܨ\x03@ y\x10\x00\xb0d\xbb\xdd\xceD\xea\xe1j\xab\b\x8cOo\x1a@/\xe4A\x00\xc0beY\xf6\xfe\xfd{u\x18HUUI\x92\xa8\x03cjo\xb9\xb2,\xd5\x01 \x9c<\b\x00X,\r,\x83Z\xadV*\xcc\xf8\x8bZ\xc7\x1f@/\xe4A\x00\xc02%IRU\x95:\fJ\x85\x19\x99\b\x12\xa0/\xf2 \x00`\xb1\xfbF}\x04CK\xd3T$\xc4hڛ͢\x06\xe8\x8b<\b\x00X c\xc5F\xe3p_\xdcl\x00s$\x0f\x02\x00\x16Hs\xd0h\xd24-\x8aB\x1d\x18Z{\x9b\xb57\x9b:\x00\xf4E\x1e\x04\x00,\x8d树\xe9\xda\xc0m\x060;\xf2 \x00`iʲ\xd4\x1c4\xa6<ϳ,S\a\x86\xb3\xd9l\xda\xdbL\x1d\x00z\xf4\xa3\x12\x00\\\xfa\x914I\x12u\b\xd44\x8d\"0\x1c}\x04W\xa9\xb9\x83\xa5\x19\x8e\x8e?\x80\xdeɃ\x00.\xb3\xd9l>~\xfc\xa8\x0e\x81\xfe\xfa\u05ff\x1e\x8fGu`\bUU9dd|\xdb\xed\xf6\xf6\xf6ֺf\bY\x96\xb57\x98:\x00\xf4\xcb\xf3b\x00\x979\x1c\x0e///\xea\x10H\xfb\x06\xee\xae\xe5\xd1\x1f\x84[\v`F\xe4A\x00\x979\x9dNu]\xabC\xa0\xb2,=v\xc7@\xfbF\xcdAײ\xdb\xed\xackz\xe7xx\x80\x81ȃ\x00.\xb6\xdf\xef\x15!\xd0j\xb5\xf2}/C\xd0\x1cd]\xb30\xedM\xe5xx\x80!ȃ\x00.v<\x1e\xef\xef\xef\xd5!\x90\xef{\xe9]Q\x14\x9a\x83\xack\xdcT\x00\x9cC\x1e\x04Ѕ\x16\xa1p\xed\xbe\xbd,Ku\xa0G\x9a\x83\xa6\xb0\xae\xb5\b\xd1#O\x80\x02\fG\x1e\x04\xd0E\xd34\xcf\xcf\xcf\xea\x10ȷ\xbe\xf4\xa8(\x8a<\xcf\xd5\xc1\xbafIċ\x00Ñ\a\x01t\xa4\x13!\\\xbb{ϲL\x1d\xb0$\x97d\xbd^\x17E\xa1\x0e\x84\x13\xf2\x02\fJ\x1e\x04Б\xc1\xf3\xf6\xf0\xd87b]3\x1c\xcdA\x00\x83\x92\a\x01td\xf0|/\f\x9e\xa7\x17\x9eQ\x9a\x14\xad\u007f\x84ko\xa1\xedv\xab\x0e\x00Ñ\a\x01t\xe7T\xe9p\x06T\xd3˾\xf1\xe6\xe6F\x1d&E\x8b\x10n!\x80\x89\x93\a\x01tg\xf0|/tv`߸<\xdb\xedV\x8b\x10\x9d%Ib\x00%\xc0\xd0\xe4A\x00A\xb4\b\x853x\x9e\x10\x1e*\x99,\xad\u007ft\xb6\xdb\xedV\xab\x95:\x00\fJ\x1e\x04\x10\xa4i\x9a\xa7\xa7'u\b\xff\xe8\xaf\bt\xa39h\xca\xeb\xda\xe9`t#L\x04\x18\x81<\b \x94\x16\xa1pN\x9f\xa5\x1b\xcdAS\xe6t0\xbaio\x9b4M\xd5\x01`h\xf2 \x80Pu]\x1b<\x1fN\x97\a\x1d\xe8,s\x81\xf0v\x00@7\xf2 \x80\x1eh\x11\ng\xf0<\x97jo\x18\xed'\x13\x97\xa6\xa9k\xc4E\x8a\xa2\xd0\x1c\x040\x0ey\x10@\x0f\xea\xbaV\x84@\x1e-\xe1RN\x9c\x9d\xcbeR\x04Χ9\b`4\xf2 \x80\x1e\x1c\x8fǻ\xbb;u\xb0od4I\x92\xb8afa\xbd^\x17E\xa1\x0e\x9c#˲<\xcf\xd5\x01`\x1c\xf2 \x80~h\x11\ng\xf0<\xe7\xd3\x1c4#:>p\xab\x00L\x90<\b\xa0\x1f\x06\xcf\xf7\xb5\xc9W\x04\xbeKsм\x18 \xc89\x8c\v\x04\x18\x99<\b\xa07N\x95\xb6od\x1ceYj\x0e\x9a\x17}\x1f|\x97#\xe4\x00F&\x0f\x02\xe8\x8d\xc1\xf3\xf6\x8d\xb8I\xf8C\xdb\xedV\xd4\xcb\x1b4\xfd\x01\x8cO\x1e\x04\xd0'-B\xe1\f\x9e\xe7mUU\x19G=\xd3\v\xa7\b\xbc\xf1ʯ\xe9\x0f`d\xf2 \x80>9U:\x9c\xc1\xf3\xbcMs\xd0L\xedv;Q/\xd65\xc0tȃ\x00\xfad\xf0|_\xfbFE\xe0\x0fi\x0e\x9a\xaf\xd5je\x80 \xd65\xc0tȃ\x00z摱p\x06\xcf\xf3g4\x11\xb8|,\x8f\x9eP\x80\xab\x90\a\x01\xf4\xec\xf1\xf1\xf1\xe1\xe1A\x1dl\x0f\xe8]Q\x14\x9a\bf\xad\xbd|\x966\xff\xbe\xae\xf3\xf3\xcd\xdbz\xbd6x~\xa6t\x10\xf06i\xaf\v\x17\xa1\xe7\xe7g\xdf\x15\x01\xe3\x90\a\x01\\\xd3\xf1x\xbc\xbb\xbbS\x87@\x1e\x19\x9b\xa3$It\u007f\xf0\xb6<ϥ\xbds$\x0f\n!\f\x02F#\x0f\x02\xf0\xc9o\xf6\xb6ۭ\xc1\xf3s\xdc1\xaeV+u\xe0m\xd2\xde9^2K\xbb\xb3\x97\x97\x17\x8d\xc3\xc0h\xe4A\x00W\xd64\xcd\xd3ӓ:\xd84F%I\x12\x1d\x04\x9cC\xda;;\x9e\x03\rQ\xd7\xf5\xe9tR\a`\x1c\xf2 \x80\xeb\xf3e`8\xe1\xc2쮗\x0e\x02\xce$_\x98\x91\xa2(\xd24U\a\x9f\a\x80Y\x90\a\x01\\_]\xd7\x06\xcf\a2x~F4\aq\x91\xb2,\xdb{F\x1dfAx\x17\xe2\xee\xee\xeex<\xaa\x030\x1ay\x10\xc0$\xf8J0\x9c\x88a.\x1c/\xc2Eڻ\xc5ꞅ\xcdf\x93\xe7\xb9:t\xe6y\x10\xc0Th\x11\ng\x14\xd1\xf49^\x04w\xce\"\t\xecB\xc4\xcbˋ\x06a\xe0*\xe4A\x00\x13b\xf0|8\xe7\x8cLVY\x96\x9a\x83\b\x91\xe7\xb93\xe3\xa7IT\x17\xc2WA\xc0\xb5ȃ\x00|.\xb43\xc1ua\x1e\xa4\xbdӼ(\xa2^\xef\xfb\xc0\x1cɃ\x00|.\\\x1a\x83\xe7'\xa8\xbd\"y\x9e\xab\x03\x81\x9c\x19?AB\xba\x10www\xa7\xd3I\x1d\x80\xab\x90\a\x01LK\xfb\xb9\xd0\xe0y\xfb\x93\xe5qr\x10\xee\xa5E\x12\xf5\xba\x9f\x81\xf9\x92\a\x01L\x8e\x16\xa1p\x9a\b\xec\x18Y\xaa\xb2,\x93$Q\x87\x89\xf0\x1ch\x88\xfb\xfb\xfb\xe3\xf1\xa8\x0e\xc0\xb5ȃ\x00&\xe7\xf1\xf1\xf1\xe1\xe1A\x1d\x02i\x11\x9a\x0e_\x80ӣ\xd5j%\x83\x98\x88,\xcbnnnԡ3_\xff\x00\xd7%\x0f\x02\x98\"\xa3g\xc3\xd91NgǨ9\b\xab{\x91D\xbd!\x1e\x1e\x1e\x9a\xa6Q\a\xe0\x8a\xe4A\x00ST\xd7\xf5\xf3\xf3\xb3:\x840xގ\x11\xab\x9b\xe1$IR\x96\xa5:\x84\xbc\xd1+\x02p]\xf2 \x00\x9f\x14\x17K\x13\xc1\xd5eY\xb6\xddnՁ\xde\xc9\x19\xa7\xf0\x02\xbbZ\xadԡ\x9b\xe7\xe7g\xef\xf2\xc0\xd5Ƀ\x00&ʱ\x02\xe1\f\x9e\xb7ig\xa9\xd24\xb5\xba\xafK\x8b\x96\xb7x`\xee\xe4A\x00\x13e\xf0\xbc\x1d\xcb\xdci\x0ebP\xd2\xc6뾴\xa6i\xaa\x0eݼ\xbc\xbch\x0e\x02\xa6@\x1e\x040]\xbe?\fg\xf0\xbc\xed\xfa\\\xc8\u007f/\x95\xe7\xf9f\xb3Q\a\xab{\x8eo\xee\xa7\xd3I\x1d\x80\xab\x93\a\x01L\x97\xc1\xf3\xbd\xd0\"t\x15Κ\xbd\xc8\xcb\xcb\xcbn\xb7\xbb\xbf\xbfW\x8a\x8b8#\xec*\x8a\xa2\xd0\x1c\x14Bs\x100\x11\xf2 \x00\x9f\x1a\xed\x18\x19\xa4\xecΚ=\xdfk\xbf\x80\x96\xc0Ki\x00\xbc\n\xcdA!\xee\xee\xee\x8eǣ:\x00S \x0f\x02\x984\x83\xe7\xc3\x19M=\xbe$I\xc4p\xe7{yyyM\x82\x9a\xa6\xd1\x12x)w\xdaȲ,\xcb\xf3\\\x1d:\x93\xa6\x01\xd3!\x0f\x02\x98:-\x03\xe1\xe4A\xe3o\xd15\a]\xb4ƿ\x1e&b\xbdwX\xddI\x92\xa8\xc3h\xc4\x19!\x1e\x1e\x1e4\a\x01\xd3!\x0f\x02\x98\xba\xba\xae_^^\xd4!\x84sgǤ9\xe8\"_\x9b\x83^\x1d\x0e\a-\x81\x17Y\xadV\xee\xb7\xd1\x18\x1a\x18H\x9a\x06L\x8a<\b`\xeaN\xa7S\xbbET\x87@v\x8c\xa3\xa9\xaaJs\xd0\xf9\xda\xd5\xfdͤ!;\xc6\x0e\xb7\x9c\"(\xf5\xf4=??7M\xa3\x0e\xc0tȃ\x00f\xc0\xfe0\xdcv\xbb\xf5P\xc98Do\x81\xab[K\xe0\xa5\xd24\x95S\x8c@럷r`a\xe4A\x003p<\x1e\x9d2\x1b\xceNf\x04\xed\xb6\xdc \xea\xf3\xfd٤!\xa7\b\xd9iOPY\x96Z\xff:{~~60\x14\x98\x1ay\x10\xc0<\xd8\x1f\x86\xd3A`[>\x97r\xb5\xeb]\x8b\xd0E\xd24-\x8aB\x1d\xac\xee\xc9\x12\x06\x01\x13$\x0f\x02\x98\a\xa7\xcc\xf6\xb2c\x14\t\rJs\xd0E\xfe\xac9\xe8\x87/\xa7\x86\xd9=^JZauO\xd67\xc7\xc6\x03L\x84<\b`6|\x9a\xeceK\xa3\b6\xe4\xb3(\x97\xf5~)c\x04\xbdxNֿ\x1f\x1b\x0f0\x05\xf2 \x80\xd9pʬ\x1d㔕e\xa9}\xe0|o4\a\xbdj\xff\xd7\xf6\xef(\xd4E\x9c\x116\x90\xa2(\xda\x17Ou\xe8LV\x0eL\x93<\b`6\f\x9e\xb7cT\xd8\xc58\xe7q0-B\x97\xdan\xb7Y\x96\xa9C\xef4\a\x85\xf8n\xf8\vp-\xf2 \x809\xf1\x1dc/;F\x83\xe7{\xa7}\xe0\"\x0f\x0f\x0fM\xd3|\xf7\xaf=>>\x1a,x)\xb9d\xef\xb2,k_6ա3g\x81\x01\x93%\x0f\x02\x98\x13\x83\xe7\xed\x18\xa7IR9P\xb9\x14\xf6RUU\t|\xad\xee\xe983\xfc\x05\xb8\ny\x10\x80\x8f\xe61\xee\x18\x15\xa1G\x9a\x83\x86\xdb\x1f\xb6\u007f\xf3\xe9\xe9I\xd1ηZ\xad\x04\xbe=J\x92\xa4,Ku\xe8\xccS\x9f\xc0\x94Ƀ\x00f\xa6\xdd\x1f\x1a<\x1f\xc8\xe0\xf9~\xc9(\a-\x97\xfd䥬\xee\x1e\xedv\xbb\xd5j\xa5\x0eݴo\xd6N\xfd\x03\xa6L\x1e\x04`\xfbm\xc7HwY\x96i\x0e:_\x87\x87G\xea\xba\x16\x01_D\xe0\xeb\xa5қ5\xc09\xe4A\x00\xf3s8\x1c\f\x9e\x0fd\xf0\xbc\r\xcfUtk\xf6\xd1\"\u4dbc\x8a\xaa\xaa\xd24U\x87nڷi\xcdA\xc0\xc4Ƀ\x00\xe6\xe7t:\x99W\x12\xce!#\xe1\f\x1e\xbaH\xe7\x87G\xda\xf5.\x02\xbeH\x9a\xa6EQ\xa8\x83\x17\xc9+\xda\xef\xf7훵:\x00S&\x0f\x02\x98\xeb\aME\bd\xf0|8]\x18㔫\xddUZ\xf2nΑ\x15E\xb1^\xaf\xd5\xc1\xdb4\xb0`\xf2 \x80Y:\x1e\x8f\xf7\xf7\xf7\xea\x10ȷ\xdf!4\a]\xe4\xf9\xf99\xa4\xad\xcf\xde\xf2R\x9e\t\r$P\vqww\xa79\b\x98>y\x10\xc0\\\xd9\x1f\x86sT\xaa\xed\xe2\\\xca\xd5\xee-\xdb\x1d\xa62^D\xe0ۙs\xe2\xbd<\x021\x90\a\x01̕\xc1\xf3\xe1\xcc!\xea,I\x92\xb2,\xd5\xe1L\x81\xcdAv\x98\xddl\xb7\xdb,\xcb\xd4\xc1\xcd6\xb2\xfb\xfb\xfb\xe3\xf1\xa8\x0e\xc0\xf4Ƀ\x00|d\x8f\x9a<\xa8\x9b\xddn\xb7Z\xad\xd4ḁ\xea)Q\v|\x1cI\x92x\x144\x84\xee]`.\xe4A\x003f\xf0|8\x87\x8ct\xdb.z\x12\xe7|\xbd4\a\xd9gv\xd3ި\x8e\x8d\xefP4E\xe8\xec\xe9\xe9\xa9i\x1au\x00fA\x1e\x040c\x06\xcf\xdb\xfc\\\xabb\x9a\x83\xce\xd7\xe3\"m\xf7\x99\x0f\x0f\x0fJz\xbe\xf6F\xd5\"t\x11io \xa1-0#\xf2 \x00\x1f=cg\xf0\xbc\xed\xe2p^^^\xfa]\xa4\x96\xfc\xa5ܮ\x17)\xcbR\xda\xdbY\x8f̀\x00#\x90\a\x01\xcc\xdb\xf1x4uȎqLUU\xd9.\x9eo\xbf\xdf\xf7;v\xfap88H\xfe\"\x8e\x8d\xbf\x88c\xe9\x02\u05fb\"\x003\"\x0f\x02\x98=\xdfF\x86\xb3]<\x9f\xec\xec|\xbd7\aٱ\xbbi\aU\x96e\x9a\xa6\xea\xd0y\xbd{;\x06\xe6E\x1e\x040{M\xd3<==\xa9C\b\x1d\x04gj\xabd\xbbx\xbeޛ\x83^\xb5{N\a\xc9_d\xbd^\x17E\xa1\x0e\xdf%8\v\\\x98C\xacw\x80\xe1ȃ\x00\x16\xb2\xedT\x84@\xf2\xa0s\xe8L9\xdf@\xcdA\x96\xbc[w EQ\xe4y\xae\x0eV%\x10\x0fy\x10\xc0\x12\xe8\x17\bg\xf0\xfcwi\x0e\xbatU\x0e\xd7,\xd0\xee<-\xf9K\x17x\x96e\xea\xf0\xf6\x02W\x84\xce\xee\xee\xee\x8eǣ:\x00\xf3\"\x0f\x02\xf8/\xf6\xee\xf0\xbaq\xebL\x03\xf0\xf8\x9c\xfdO\xa6\x022\x15H\x1d\x88\xae`\x98\n\xc8T\x10u\x90Q\aJ\x05\x01;\x00+0\xd0\x01Y\x81\x81\x0e\x80\nv\x11\xcb;;;\xd6\xc8\x00.\b\x02\xb8\xcf\xf3\xc3g\x8e\xe3\xd8\xd2\a\\H\xdf\xcb\x0f\xf7.\x84O&\xc3yW\xe2c&,\xa6\xb3$\xab\xaa\xb2S\x89\x1bx@\xdb\xed\xf6p8\xa8\x83\x1f\xc1@T\xe4A\x00\v\xa19\f\xb7\xdf\xef\x1d<\xffAq\f\a\xb57°\x80\xfe\xb3\xab\xc3\xe1`D\xe8G\xa4\xe1!\xf2<\xbf\\.\xea\x00̎<\b`!\x1c<\x1fn\xb5ZycB\xbb8\x88\x11FQ,\xf9\x1e,\xf0w\xad\xd7k\x95\x99\xf8z\a\xb8\x05y\x10\xc0r\x18\x11\n'\xf5x\x97\x8df;\x19m'\x11#B=\x16\xb8\x19\xc0?:\x1e\x8f\xab\xd5J\x1d\xfa)\xcb2\xcb2u\x00\xe6H\x1e\x04\xb0\x1c\x0e\x9e\x0f\xb7\xd9l\xf6\xfb\xbd:|ǧ\xdf\xd3,\xd7\xe5r\xc9\xf3\\\xc1\xdb3\x03\xf8.9\xb8\xc7#\x10'y\x10\xc0\xa2\x98\x17\xd0\x1a\r\xcepP'#\x1f3\xa4\x17\xb5\xc0\x03970D]\xd7&s\x81\xf9\x92\a\x01,\x8a\x83\xe7\xc39\x97\xfa;\x12\x87)\x97+˲\xb2,\x95\xbd\xbd\xcdfcD\xe8[\x02\xb2\x10>\x83\x01fM\x1e\x04\xe0\xd7S\xee\xdc\xd2O\xd9v\xbb5\x1c\xd4^\x9e\xe7c\x0e\a\xb9]\xfb\x91\x80|\xb5\xdb\xed\x1e\x1e\x1eԡ\x9f\xba\xae\xfd\xc0\x05fM\x1e\x04\xb04~=\r\xe7\xe0\xf9\xafd\r\xd3/W\x92$F\x84:yxx\xd8\xedv\xea\xf0I4\x16&MӪ\xaa\xd4\x01\x98/y\x10\xc0\xd24\xbf\x9e:\x85:\x90Mg\xdfl\xb7\xdb\xc3\xe1\xa0\x0e-\xe5y~\xafc\x86\xa4\xc0]\t:\xdf\x16\xf8\xe7ϟ\xd5\xc1]\x04DK\x1e\x04\xb0@\x9a\xc3p>6\xd7\xed̨\\6\x0e\xeb\xca6a\x16x\xa0\x91w\x8e\a\xb8\x05y\x10\xc0\x029\x85:\x9c\x83\xe7\r\aur\xc7\xe1\xa0O\xbfM\x05J\x81\xbb\x8a<\rY\xaf\xd7\x16x\bNJ\x01\v \x0f\x02\xf0\xab*\xef\x8b|D\xc8\xec\xc0\xbc\xcae\xc9wu8\x1cb\x1e\x112\x02\x19\xe2\xbe\xf9/\xc0P\xe4A\x00\xcbd\x8b\xd9p1\xbfQ\xb2^\xaf#\x1f\x8f\xea\xe4z\xbd\u07bd9,\x8a\xc2\xc6a]żM\x98<(\xf0'\xac\"\x00\v \x0f\x02\xf0\v+?\x14\xed\x8cL\xd3+\xaeV+7@K\x13yW\xcbHW\x8f\xfb<Γ\x04\x8fǣ\x05\xde[Y\x96~\xbc\x02\xcb \x0f\x02У\xf2Cq\x1e<\xdf|\xcbf\a\xe6\xd8\x1c\x16Eq>\x9f]\x91\xf6\xa2=IPt\xa8z\x00\x9f\xe4A\x00\v\xe6\xe0y\xedb?\x86\x83\xe6\xdb\x1cJ\x81{\xdc\xed\xb1}\xcb\xfb\xfd~\xb3ٸ\xf4\xfd\xd4u\x9d\xa6\xa9:\x00\xcb \x0f\x02X2͡v\xb1+\xc3A\x9dL\xed͑,˜-\xd8\xc9f\xb3\x89-\xf3\xb5\xc0\x03\u007f\xaaVU\xa5\x0e\xc02ȃ\x00\x96\xcc\xc1\U000c3d0bQ\xed\xacl8\xa8\x93\t\xbe9bg\x93\xae\xa2ʃ\x1e\x1f\x1f\x9f\x9e\x9e\\t\xeb\v\xe0\x93<\b\xc0/\xaf\xfc\xa9\xa8>N\x8f\xf9ĥ\xae\xa6\xb9\xad\xac\xb3\x05\xbbzzz\xda\xedv\x9ef\xfc\xa9\xd3\xe9T\x14\x85:\x00\x8b!\x0f\x02X8\xcd\xe1 \xedb$\a\xcf\x1f\x8fG\x1b\x8b\xb47\xd9\xf71\xedw\xdbU$)I\xf3\x1c;\x1c\x0e.\xb7\x95\x05\xf0F\x1e\x04\xa0kE\x1b\xa0\xdb鬮\xeb\xc9\x0e\xdf5_X\xf3\xe5\xb9F\xed}\xfe\xfc9\x86\xcc\xd7\xf4_\x88<\xcf\r\a\x01\v#\x0f\x02X>\xcda\xb8\x18\x0e\x9e7\x1c\xd4\xc9ķ\x95\x95\x02w\xb5\xf80\xd4V\xf1\xee\x10\x80\xefȃ\x00\x96\xaf\xe9Z\x9d\x8f\x1b(\x86\x83\xe7u;\xed\xd5u=\xf1\xc0\xa5\xf9\xf2\xa4\xc0\x9d\x1c\x0e\x87eg\xbe\xcd\x13\xccV\xf1\xbd]\xaf\xd7,\xcb\xd4\x01X\x18y\x10@\x14\xb4\xfa\xe1\x96\xfdѺ\xe1\xa0N\xa6\u007f\xe6\xb4\x14\xd8\x1a\x8f\xea\xbb\x1ba\xc9+\x02\xb0<\xf2 \x80(\x14E\xe1\xe0\xf9@\xcb>x\xde\xc6\"\xedM\u007f8\xe8\x8d\x14\xb8\xab\xe7\xe7祎\b\t|CL\xf3$A\x80p\xf2 \x80X\xf8xs\x90vq\x91\xdf\xd7n\xb7{zzr}\xdb/\xa5\x89\x0f\a\xbd)\x8a\xe2t:\xb9^\xed\xadV\xab\xa5f\xbe\x02\xdf\x10\xc2 `\xa9\xe4A\x00\xb1H\xd3\xd4\xc1\xf3\x81\x96z\xf0\xbcA\x92Nf\x14\xadJ\x81\xad\x85O\x02\xdf0s\x99\a\x04\xe8A\x1e\x04\xa0\x8f%\xeavQ\xaf\xd8\xc9\xe9t\x9a\xc5pЛ\xcb\xe5\xe2E\xd1N6\x9b\xcd\xf2Fi\xec\x1c\x14\"I\x92\x19-y\x80N\xe4A\x00q\xfd^\xebȡ@\xcb;x\xdepв\xcb\xe5\xfav\xb5\xb0\xb0\xddn\x0f\x87\x83\v\xda\xd2|'\x05\x92$1\"\xd4\xc9\xe7ϟ\x97\xb1s\xfc\xf3\xf3\xf3j\xb5rA\xfb\xc9\xf3\xfcr\xb9\xa8\x03\xb0`\xf2 \x80\xe8\xf8\xc0s\x90.k\x01߅\xb1\x91x\xcae\xd5ǹ:\f\x00Z5\x00\x1f\x90\a\x01D\xc7~\"\xe1\x160>`8\xa8\x93\xf3\xf9<\xebmD\xec%\xdfU\xb3:\xe6\xbes\xfc\xf1x4\x1c\xd4[\xf3S\xd2v{\xc0\xe2Ƀ\x00bd0$\xdc\xdc?xw\x0ft2\xf7I\x81\xaa\xaa\f;X\xe3\xa8\x1e\xc0\xb7\xe4A\x001J\xd3\u0530@\xa0\xe3\xf18\xdf\xf1\x81\xe6+7\x1c\xd4^\x9e\xe7Y\x96\xcd\xfd\xbbH\x92ĥ\xec\xe4\xf9\xf9y\xbek|\xb7\xdbm6\x1b\x17\xb1\x9f\xe6\xe7\xa3\xf5\x02\xc4@\x1e\x04\x10\xa3\xaa\xaa\xfc\xb2\x1bh\xb5Z\xcd\xf7\xe0\x1e\xbb\x8at\xb2\x8cI\x81\xa2(N\xa7\x93\xab\x19\xc9\x1a7\xde\x12\xc20\x1d\x10\x89\x9f\x94\x00\xa6)˲\xa7\xa7'u\b\xf7\xf3\xcf?/\xe0\x83\xfd[\xd8n\xb7\xbf\xfe\xfa\xab:\x84(\xcbr\x8e\xbb\b\xad\xd7\xeb\xa2(l,\xd2R\x9e\xe7\xcb8NΪ\x8fg\x8d\xbb\xd0!\xea\xban\nXU\x95R\xf4\xd6<3\u007f\xf9\xe5\x17u\x18\xa0W\xffI\xb7\xcem\x99\x0f\x02\x88\x94\x83\xe7\xc3\xcd\xf4\xe0yGPw\xb2\xa49\v\xab\xbe\xc7\x1a?\x1e\x8fnڨ\xa4i*\f\x02\"!\x0f\x02\x88\x97\x91\xf8p\xb3{\xf1j\xbd^{Y\xac\xbde\xec\x1cdՇ\x98]\x1e\xe4\xe8\xc0@\xd24 \x1e\xf2 \x80x9x>\xdc\xec\x0e\x9e7\x1c\xd4\xc9\xf2ғf\xd5\xe7y\xeeʶ\xf7\xf4\xf44\xaf1\xc09\x0e4M\xc7\xf9|.\x8aB\x1d\x80Hȃ\x00\xa2\xe6\x83\xd0p\xf3\x1a\xb7\xd1+\xb6W\x96e\x9a\xa6\xcb\xfb\xbe\xec%\xbf\xe05n\x000\x90\x01: *\xf2 \x80\xa89x>܌\x0e\x9eo\xbeTGP\xb7\xb7Դ4I\x12\x83\x81\x9d\xcch\fp\xbf\xdf\x1b\x00\xecmy\xef\x87\x02|L\x1e\x04\x10\xb5\xaa\xaa|\x1c\x1ahF\x87R\x1b\ak\xaf,\xcb\x05\xcfѸ\x13\x96Z1W6\x84\xd19 6\xf2 \x00\xbf\x01\xfb\r8\x8a\x1e\xccp\x90\xbe\xfa+\x83\x81]\xed\xf7\xfb\xe9\x8f\x01Z\xe3!\x96\x1d\x01\x03\xbcK\x1e\x04\x10\xbb\xa2(N\xa7\x93:\x84\x98\xc5\xc1\xf3\x06\at\x86_\x19\f\xecj\xb5ZM\u007f_\x1e\xbb\x83\x85\xb0\"\x80\bɃ\x000\"4\x80\x89\xf7\x8a\x06\a:\x89!;k\xba_#BKZ\xe3\xbb\xdd\xee\xe9\xe9\xc9e\xea\xa7Y\v~\x0e\x02\x11\x92\a\x01\xf0\x9f#\xa8\xaf\u05eb:\x84\x98\xf8\x8e\xb3\x06\at\x86ߩ\xaaj\x91\xa7\xa7\xdd\xcej\xb5\x9a\xf2:\xb2\xc6C\xbc\xbe\xbe6+B\x1d\x80\xd8ȃ\x00\xf8\xfd\xb7aE\b4\xd9\xf1\x01\x83\x03\xd6»\xbcB\xb8\x98\x8am\xb7\xdb\xc3\xe1\xe0\x02\xf5f8\b\x88\x93<\b\x80\xdf\u007f\x1b\xf6\xf2H\xa0\xc9\x1e<\xaf\xedo\xafY\x05\xf1\xe4A\xf6\x0e\xebj\xb3\xd9L\xf30Ak\xe0]Ѯ\xf6\xfb\xfdz\xbd\x1e\xe1?\xd4\b\x80?aD(ܭ?\xd57\x1cԉ\xe1\x97?մ\xcd\x16~'#l\x1eo\xe7\xa0\x10\xa7\xd3I\x18\x04\xf0\x1d\x89#L\x94\x89\x8c\xa1\x98\x0f\x1a\x84ٓ@\xb7\x9e\x1d\xf0\xc4h\xcfpPKF\x84&uk\xb9\x1c\x81F\x18\xd2\xe4+\xf3A\x83\xf5\xea惸1\xf3A\x00\xfc9\x93\x02\x81n:;`\x8b\xd9N\f\a\xb5TU\x95\xcdw;\xd9l6\xfb\xfd\xfeF\xff\xf2\xe7\xe7gaPo\xe7\xf3Y\x18\x04\xf0G\xf2 \x00\xfe\\\x92$u]\xabC`;w\xa3\u007f\xb3\x80\xa3\xbd\xb2,\x1d\xa6\xee֚\xe32\xb7\x93t\b\x1fi\x00\xbcK\x1e\x04\xc0\x9f3)\x10\xeeF\a\xcf\x1b\x0e\xeaD\xc0\xd1IQ\x14\xa7\xd3I\x1d\xdak\x16\xe3\xe3\xe3\xe3\xe0\xffZ\x1b\x84\x85\xb8^\xaf^\x1b\ax\x97<\b\x00\x8d\xf4Hn\xf1\t\xbf\xebҞ\xe1\xa0\x1eT\xac\xab[\x8c\b\xd9I:\x84\xe1 \x80\x1f\x91\a\x01\xd0JQ\x14y\x9e\xabC\x88\xc3\xe10\xecv\xb3\x8f\x8f\x8f\x86\x83\xb4\x857\x95e\x99\x85\u007f\xdfe\xbe\xdb\xed\x1e\x1e\x1e\x14\xb6\x1f)0\xc0\a\xe4A\x00h\xa7\xc73숐\xa9\x81\xf6\xea\xba\xd6\x16\xf6c\x06\xed\xbe\v\xd32\xf7c\v\xe0F\xe4A\x00\xb4\x95\xa6iY\x96\xea0\x91\xd6n\xbb\xdd\x1e\x0e\a%m\xdf\x16VU\xa5\x0e=dYf\xe1wr<\x1e\xd7\xeb\xf5P\xcb\xfc\xf3\xe7\xcfJڏ\x14\x18\xe0c\xf2 \x00\xba5Պ\x10b\xc0\x83\xe7Mmtj\vݺn\xb61\x97\xf9Pɯ\xca\a\xfe\xc0\x92\x02\x03|@\x1e\x04@\a\x0e\x9e\x0f7H\xa3h8H[8\xf2\xc27\"\xd4\xc9 \xb1\xefz\xbd\xb6\xcc\x03\xef[E\x00\xf8\x80<\b\x80\x0e\x1c<\x1fn\x90\x83\xe7M\r\xb4g8Hk=\xbe\xcdf\x13\x1e\t\xd99(\xc4\xe9t*\x8aB\x1d\x00> \x0f\x02\xa0\x1bID\xb8\xc0F\xd1\xd4@'\x86\x83\x86*\xa3\xd9\xc0\x91\x1f\x95\xf2\xa0\xc0;V\x11\x00>&\x0f\x02\xa0\x9b\xa2(\xce\xe7\xb3:\x84\b<\x91Z\x97؉\xc1\x96ATU\xa5\x92\x9dl6\x9b\x90I\xc0\xe3\xf1\xb8Z\xad\x94\xb1\x9f<\xcf/\x97\x8b:\x00|L\x1e\x04@g>w\r\xd7{Dh\xbd^˃\xda\xf3Έ\x85\u007fG!#B&1\xefUy\x80xȃ\x00\xe8\xcc\xf9\xd3\xe1zg:\xcd\xff\xd1Ԁ\xb6\xf0.\x8a\xa28\x9dN\xea\xd0\xde\xd3\xd3\xd3\xe3\xe3c\x8f\xff\xe3~\xbf\xdfl6\n\xd8O\xf3\xe3\xa9\xf9!\xa5\x0e\x00\u007fJ\x1e\x04\x806\xfb\x0e\xfa\x1dl.\x1b\xae\xc7\xc1\xf3\xe1'X\xc7\xc3pЍHٺ\xea\x9a\xfc\x1a\x0e\n\xe1\a\x13@{\xf2 \x00z\xb2\xb9l\xb8N\xf9N\xf3\x0f\xdbR\xa4=\xb1ōdYv\xbd^ա\xd3\xca]\xaf\xd7-\xff\xe1\xedv{8\x1c\x14\xad\x9f\xba\xae\xfd`\x02hO\x1e\x04@O\x0e\x9e\x0f\xd7\xe9]\x12\x01G{͝i8\xe8v\xb4ܝ\xacV\xab\xf6#?\x86\x83B\xa4iZU\x95:\x00\xb4$\x0f\x02@[xO-G\x84\f\a\xb93\xa7#I\x12'\f\xdeb\x99\xaf\xd7k\uf106\x10\x9a\x03t\"\x0f\x02\xa0?\aϏ\xd6(\xeas\xda\xcb\xf3\xdci\xd3\x1a\xefI\xd9l6mVz\xf3\xcf\xd80\xbe7[\x86\x01t%\x0f\x02@[8\xf5F\xd1p\x90{rj\x9c0x\x8b\xdb\xd2\xcbb!\xec$\rЕ<\b\x00m\u1775ɃT\xa9%\xc3A㨪\xcaKy\x9dl6\x9b\x8f\xcf\x13\x14\xfbZ\xf8\x00#\x93\a\x01\xa0-\xbc\xb3\xa7\xa7\xa7\xc7\xc7\xc7\x1f\xfd\xafM\x0f\xd9\xfc\x03\xaaԒ\xe1\xa0\xd1X\xf8\xc3ޜb\xdf\x10\x86\x83\x00z\x90\a\x01\xe0\x17\xf1\xfb\xfb\xe0=\x11\x01G{f\x04\xc6TU\xd5\xe9tR\x87\xf6>H~ž!ʲ\xf4c\b\xa0\ay\x10\x00\xa1\x8a\xa2\xd0\x16\x06:\x1c\x0e\xeb\xf5Z\x97\x18HO82aeW?J~\xed\x1c\xe4>\x04\x18\x9f<\b\x00}\xf8t\x1bE}N{f\x04\xc6'\v\xee\xeap8l\xb7\xdb\xef\xfef\xf3w>\u007f\xfe\xac8\xfd\xd4u\x9d\xa6\xa9:\x00\xf4 \x0f\x02`\x00Y\x96]\xafWu\b\xf1\xc7\xddC\x1e\x1f\x1f\r\a\xb5';\xbb\v\x19\\W\u007fL~ݺ!^__\xab\xaaR\a\x80\x1e\xe4A\x00\f\xf6K\xb9\"\x84\xf8\xe3\xc1\xf3^!i\xcfpнdY\x96\xe7\xb9:\xb4\xd7,\xf3o_\x0em\xfe\xbc\xdf\xef\x95ŏ\x1e\x80\xf1Ƀ\x00\x18FӍ;x>\xbcQ\xfc\xfa\xe7\xedv{8\x1cԤ%\x13\x16\x1a\xf2\xb9X\xadV߮\xf4\xe7\xe7\xe7\xe6\xef(K?\xa7\xd3\xc9p\x10@o\xf2 \x00\xb4\x85S\xf1\xed\xf1C\x02\x8e\xf6\f\a\xddW\x9a\xa6\xcd%P\x87\xf6\xbe\x1d\xfd3\x06\x18\xc2s\x12 \x84<\b\x80\xc1\xe8ɇj\x14\r\a\xe9\t]\x82\x05\xfb\xfarh\xf3W\xc3A\xbd\xe5y^\x14\x85:\x00\xf4&\x0f\x02`0\x0e\x1b\n\xf7v\xf0\xbc\xee\xba=\xa7\vMA\x92$F\x84:yK~\xad\xf4\x10\xaa\a\x10H\x1e\x04\xc0\xc0m\xa1\"\x8479\x86\x83\xdas\xba\x90\xb5?G\x0f\x0f\x0f\xcdJ\xdfl6J\xd1\xcf\xf5zͲL\x1d\x00Bȃ\x00\x18\x92\x83\xe7\xc3\xfd\xe3\x1f\xffP\x84\x96꺶k\xd5D4\x17\u008e\xf2\x9d\xfc\xf3\x9f\xffT\x84\x90\xfbM\x11\x00\x02Ƀ\x00\xf0k:3\xbe\xd9\f\aMDs!\x8c\b1\x0e[\xc8\x03\fB\x1e\x04\xc0\xc0\xec$\xc28\f\aM\x8dˁ;\r`F\xe4A\x00\f\xcf'\xb7\x8c\xd3\x13\x1a\x0e\x9a\x14;\xca3\x82\xba\xae\xfd\x88\x01\x18\x84<\b\x80\x9b4\xea\x8a\xc0\xad{B\xb7\xd9\x049\xf2\x89[K\x92D\x10\f0\by\x10\x00\xc3k~Y7&\xc0M\xa5i\xaa'\x9c\xa0\xa2(\xf2\x00w!\x0f\x02`*\x1c<\x1f\x9b\xeb\xf5j8\b\xcb?N\xa7ө\xaa*u\x00\xb8#y\x10\x00\x13\xe2\xe3b\x97\x1b\xf7\x0310\x11\x06pw\xf2 \x00&\xc4ޢ\xf1(\xcb\xd2\xe5\xe6[\xaf\xaf\xafF\x84\"q>\x9f\x8b\xa2P\a\x80\xfb\x92\a\x010!\x0e\x9e\x8f\x87\xe9\x00\xbeSU\x95\x880\x12f\xc1\x00\xa6@\x1e\x04\xc0\xb4h\bc`8\x88w\x89\tb\xe0TA\x80\x89\x90\a\x010-M\x9f\xd0t\v\xea\xb0l\x86\x83x\x97\t\xc1\x18Ȃ\x01&B\x1e\x04\x80n\x81Q\x19\x0e\xe2\x03F\x84,\u007f\x00\xc6!\x0f\x02`r\x9an\xa1\xe9\x19\xd4a\xa9\f\a\xf1\x81\xcb\xe5bBp\xc1\xe4}\x00\xd3!\x0f\x02`\x8a|\x80\xbcTu]\xa7i\xaa\x0e|@b\xb8\xe0\xe5\xef\xd9\x0e0\x1d\xf2 \x00\xa6\xc8g\xc8\v\xbe\xb2UU\xa9\x03\x1fȲ̄\xa0\xe5\x0f\xc0\xadɃ\x00\x98\xa2\xa6g\xb0\xad\xec\xf2\xd4u-\xe9\xa3\r#B\x8bd8\b`R\xe4A\x00L\x94\xe0`\x91\xd7\xd4t\x00m\xd8DlyN\xa7SQ\x14\xea\x000\x1d\xf2 \x00&ʶ\xb2\vc8\x88N\xdc-.(\x007%\x0f\x02`\xba\xbc\\\xb0\xb0n\xd0p\x10\x9d\x96\u007f]\xd7\xea\xb0\fy\x9e_.\x17u\x00\x98\x14y\x10\x00\x93n\b\xbd3\xb2\x18\xa6\x03褪*\xf7\xccb\xd8\x10\n`\x82\xe4A\x00L\x9a\x11\xa1e8\x9dN\x86\x83\xb0\xfc\xe3T\x96e\x96e\xea\x0005\xf2 \x00&̀\xc02\x98\x0e\xa0\x87\xa2(\x9c3h\xf9\x03p#\xf2 \x00&\xcd\xc1\xf3\v\xe0\\!z\x13%\xcc]Y\x96\xe6\xbc\x00\xa6I\x1e\x04\x80\x86\x10W\x90\x89*\x8a\xe2|>\xab\xc3|\t\x83\x00&K\x1e\x04\xc0\f\x1aB\a\xcfϗ\xe1 \x02yit\xbe\xea\xbav\xf9\x00&K\x1e\x04\x80\x86\x90\x1b2\x1cD\xa0,\xcb$\xc23\x95\xa6\xa9\x8d\xe4\x01&K\x1e\x04\xc0<\x9a\n\a\xcf\xcf\xd1\xf9|6\x1cD8\xef\x1c͔8\x18`\xca\xe4A\x00̃\x11!W\x8dh%I\"\x11\x9e\x1d\xef\x8a\x02L\x9c<\b\x80\xd94\x84u]\xabÌ\xe4y\x9ee\x99:0\b\x93&s|h+\x02\xc0\x94Ƀ\x00\x98\x87\xaa\xaa\xd24U\a\ry\x10\x003㘡\x893\xc1\xc1MI\x84] \x00\x06!\x0f\x02`f\xaa\xaaJ\x92D\x1d\xa6\xa9,KW\x87\x9b\xba\\.\xf6\x95\x9f\xac\xd3\xe9d8\b`.\xe4A\x00̏ϟ'\xcbp\x10n3\x97\x06\x80Y\x90\a\x010?EQ\x9c\xcfgu\x98\x1a\xc3A\x8c#\xcb2\xfb\xcaOP\xf3Xn\x1e\xce\xea\x000\x17\xf2 \x00fɈ\xd0\x04\x19\r\xc0\xcd\xe6\xb1\f\xc0\\ȃ\x00\x98%\x03\x02SS\u05f5\xe1 F\xd3\xdcl\x9e\x00\x93r\xbd^\x9bDz:\x00̈<\b\x80\xb92 0)F\x03p˹\x1c\x00̈<\b\x80\xb9J\xd3\xd4\xc1\xf3\x13\xd1\\\b\xdd #K\x92\xc4\x13`\"\xec\x1d\x060G\xf2 \x00\xe6\xca\xc1\xf3\xd3\xf1\xfa\xfa\xea\x90i\xc6\u007f\x02H!\xa7\xf3\x04P\x04\x80ّ\a\x01\xa0\t!\x88\xe1 \xeeE\"<\x91'\x80\v\x010G\xf2 \x00f\xcc\xc1\xf3S`8\x88;>\x01N\xa7\x93:\xdcW\x92$\x9e\x00\x00s$\x0f\x02`\xdeL\xa6ܗ\xe1 \xee˾\xf2\x1e\xc2\x00\xf4#\x0f\x02`\xde\x1c<\u007f_F\x03\xb8/C\x82\xf7u:\x9d\x9aK\xa0\x0e\x00s$\x0f\x02`\xf6\f\bܑ\xd1\x00܄\x8a\x0f\xc0\x1cɃ\x00\x98=\xc7Nߋ\xd1\x00\xa6 ˲<\xcf\xd5a|M\xd9/\x97\x8b:\x00̔<\b\x80%\xf0\x19\xf5]\x98\xccb\"\x9co\xe5\t\x00@W\xf2 \x00t\x83\xf4a8\x88I=\x01\xec#6\xb2\xa6\xe0Y\x96\xa9\x03\xc0|Ƀ\x00X\x02\xc7N\x8f\xcfh\x00nH\x05\a`\xbe\xe4A\x00,\x84\x11\xa11\x19\x0ebj\xd24\xb5\x8f\xd8h\x9aR{\xe4\x02̝<\b\x80\x85Ȳ\xecz\xbd\xaa\xc38l\xd8\xc4\xd4TU\xe5\xb6\xf4\x04\x00\xa0=y\x10\x00Z\x14\xbaq\xa8\x10\x93}\x02\x18\x11\x1aASd\x0f[\x80\x05\x90\a\x01\xb0\x1c\x0e\x9e\x1f\x87}C\x98\xa6\xaa\xaa\xd24U\x87[k\x8aܔZ\x1d\x00\xe6N\x1e\x04\xc0\xa2\xf8\xd4\xfa\xd6\xf2K\x84\x01\x16C\x1e\x04\xc0\x02\xbb\xc1<\xcf\xd5ap\x86\x83\x98\v\xc1\xe5\x8d\xbf(\nu\xa0\x8d\xb76i\xc1\xa3\x01///\xde\x11\x83?\xb5^\xaf___\x0f\x87\xc3¾\xaf\xd3\xe9\xf4\xfc\xfcl\xf7hn\xad\xf9\r\xd6ۈ\x83\xf0#\x1b\x00`\xd4>\xf0r\xb9\xfc\xf7\xe2\x14E\xf1\xf8\xf8\xe8\xfaB{\xfb\xfd\xbe\xaa\xaae<\x01\x9ao\xa4\xf9v\\S\x00\x00\x80\x8f\xbc\xbe\xbe.)\f\xfa\xf2\xe5\xcbz\xbdvY\xa1\xabf\xe1\xa4i:\xf7'@\xf3-x\x02\x00\x00\x00\xb4\xf2\xb6\xe3\xf2\xdc\xfb\xc0,˼y\n\xe1O\x83\xa2(f:\x18\xd8|\xf1\xae \x00\x00@7_\xbe|\x99\xe9\v#Y\x96\xe9\x03a@o;\xef\xcc\xe8\x05\xb1\xe6\vv\xd5\x00\x00\x00zZ\xaf\xd7\xf3J\x85$A\x10\xf3Ӡ\xf9\xf2\xbc\"\n\x00\x000X\x1f\xf8\xfc\xfc<\xf1wF\x92$\x91\x04\xc1\bO\x83\xe3\xf18\xc1\xa7\xc1\xe5rq\xa8\x13\x00\x00\xc0M\xec\xf7\xfb$I&5 \xd04\x81\xcf\xcf\xcf\xc6\x01`d\xbb\xddn\nO\x83\xe6\vh\xbe\f\a\b\x02\x00\x00\x8c\xe1-\x18\xba\xe3\x8c@\x9a\xa6\xcf\xcf϶\x8b\x86\x89<\rF\x0e\x86\x9a\x87O\xf3\x1fu\x8a<\x00\xbd\xfd\xa4\x04\x00\x10\xe2\xf17\xbbݮ\xf9\xeb\xc3\xc3\xc3\xed\xfeCu]_.\x97\xec\u007f\xa9"), - } - - // define dirs - dirb := &embedded.EmbeddedDir{ - Filename: "", - DirModTime: time.Unix(1611536125, 0), - ChildFiles: []*embedded.EmbeddedFile{ - filec, // ".gitkeep" - filed, // "favicon.png" - filee, // "logo.svg" - - }, - } - - // link ChildDirs - dirb.ChildDirs = []*embedded.EmbeddedDir{} - - // register embeddedBox - embedded.RegisterEmbeddedBox(`static/img`, &embedded.EmbeddedBox{ - Name: `static/img`, - Time: time.Unix(1611536125, 0), - Dirs: map[string]*embedded.EmbeddedDir{ - "": dirb, - }, - Files: map[string]*embedded.EmbeddedFile{ - ".gitkeep": filec, - "favicon.png": filed, - "logo.svg": filee, - }, - }) -} - -func init() { - - // define files - fileg := &embedded.EmbeddedFile{ - Filename: ".gitkeep", - FileModTime: time.Unix(1609727320, 0), - - Content: string(""), - } - fileh := &embedded.EmbeddedFile{ - Filename: "01-umbrella.js", - FileModTime: time.Unix(1611561370, 0), - - Content: string("// Umbrella JS http://umbrellajs.com/\n// -----------\n// Small, lightweight jQuery alternative\n// @author Francisco Presencia Fandos https://francisco.io/\n// @inspiration http://youmightnotneedjquery.com/\n\n// Initialize the library\nvar u = function(parameter, context) {\n // Make it an instance of u() to avoid needing 'new' as in 'new u()' and just\n // use 'u().bla();'.\n // @reference http://stackoverflow.com/q/24019863\n // @reference http://stackoverflow.com/q/8875878\n if (!(this instanceof u)) {\n return new u(parameter, context);\n }\n\n // No need to further processing it if it's already an instance\n if (parameter instanceof u) {\n return parameter;\n }\n\n // Parse it as a CSS selector if it's a string\n if (typeof parameter === 'string') {\n parameter = this.select(parameter, context);\n }\n\n // If we're referring a specific node as in on('click', function(){ u(this) })\n // or the select() function returned a single node such as in '#id'\n if (parameter && parameter.nodeName) {\n parameter = [parameter];\n }\n\n // Convert to an array, since there are many 'array-like' stuff in js-land\n this.nodes = this.slice(parameter);\n};\n\n// Map u(...).length to u(...).nodes.length\nu.prototype = {\n get length() {\n return this.nodes.length;\n }\n};\n\n// This made the code faster, read \"Initializing instance variables\" in\n// https://developers.google.com/speed/articles/optimizing-javascript\nu.prototype.nodes = [];\n\n// Add class(es) to the matched nodes\nu.prototype.addClass = function() {\n return this.eacharg(arguments, function(el, name) {\n el.classList.add(name);\n });\n};\n\n\n// [INTERNAL USE ONLY]\n// Add text in the specified position. It is used by other functions\nu.prototype.adjacent = function(html, data, callback) {\n if (typeof data === 'number') {\n if (data === 0) {\n data = [];\n } else {\n data = new Array(data).join().split(',').map(Number.call, Number);\n }\n }\n\n // Loop through all the nodes. It cannot reuse the eacharg() since the data\n // we want to do it once even if there's no \"data\" and we accept a selector\n return this.each(function(node, j) {\n var fragment = document.createDocumentFragment();\n\n // Allow for data to be falsy and still loop once\n u(data || {}).map(function(el, i) {\n // Allow for callbacks that accept some data\n var part = (typeof html === 'function') ? html.call(this, el, i, node, j) : html;\n\n if (typeof part === 'string') {\n return this.generate(part);\n }\n\n return u(part);\n }).each(function(n) {\n this.isInPage(n) ?\n fragment.appendChild(u(n).clone().first()) :\n fragment.appendChild(n);\n });\n\n callback.call(this, node, fragment);\n });\n};\n\n// Add some html as a sibling after each of the matched elements.\nu.prototype.after = function(html, data) {\n return this.adjacent(html, data, function(node, fragment) {\n node.parentNode.insertBefore(fragment, node.nextSibling);\n });\n};\n\n\n// Add some html as a child at the end of each of the matched elements.\nu.prototype.append = function(html, data) {\n return this.adjacent(html, data, function(node, fragment) {\n node.appendChild(fragment);\n });\n};\n\n\n// [INTERNAL USE ONLY]\n\n// Normalize the arguments to an array of strings\n// Allow for several class names like \"a b, c\" and several parameters\nu.prototype.args = function(args, node, i) {\n if (typeof args === 'function') {\n args = args(node, i);\n }\n\n // First flatten it all to a string http://stackoverflow.com/q/22920305\n // If we try to slice a string bad things happen: ['n', 'a', 'm', 'e']\n if (typeof args !== 'string') {\n args = this.slice(args).map(this.str(node, i));\n }\n\n // Then convert that string to an array of not-null strings\n return args.toString().split(/[\\s,]+/).filter(function(e) {\n return e.length;\n });\n};\n\n\n// Merge all of the nodes that the callback return into a simple array\nu.prototype.array = function(callback) {\n callback = callback;\n var self = this;\n return this.nodes.reduce(function(list, node, i) {\n var val;\n if (callback) {\n val = callback.call(self, node, i);\n if (!val) val = false;\n if (typeof val === 'string') val = u(val);\n if (val instanceof u) val = val.nodes;\n } else {\n val = node.innerHTML;\n }\n return list.concat(val !== false ? val : []);\n }, []);\n};\n\n\n// [INTERNAL USE ONLY]\n\n// Handle attributes for the matched elements\nu.prototype.attr = function(name, value, data) {\n data = data ? 'data-' : '';\n\n // This will handle those elements that can accept a pair with these footprints:\n // .attr('a'), .attr('a', 'b'), .attr({ a: 'b' })\n return this.pairs(name, value, function(node, name) {\n return node.getAttribute(data + name);\n }, function(node, name, value) {\n node.setAttribute(data + name, value);\n });\n};\n\n\n// Add some html before each of the matched elements.\nu.prototype.before = function(html, data) {\n return this.adjacent(html, data, function(node, fragment) {\n node.parentNode.insertBefore(fragment, node);\n });\n};\n\n\n// Get the direct children of all of the nodes with an optional filter\nu.prototype.children = function(selector) {\n return this.map(function(node) {\n return this.slice(node.children);\n }).filter(selector);\n};\n\n\n/**\n * Deep clone a DOM node and its descendants.\n * @return {[Object]} Returns an Umbrella.js instance.\n */\nu.prototype.clone = function() {\n return this.map(function(node, i) {\n var clone = node.cloneNode(true);\n var dest = this.getAll(clone);\n\n this.getAll(node).each(function(src, i) {\n for (var key in this.mirror) {\n if (this.mirror[key]) {\n this.mirror[key](src, dest.nodes[i]);\n }\n }\n });\n\n return clone;\n });\n};\n\n/**\n * Return an array of DOM nodes of a source node and its children.\n * @param {[Object]} context DOM node.\n * @param {[String]} tag DOM node tagName.\n * @return {[Array]} Array containing queried DOM nodes.\n */\nu.prototype.getAll = function getAll(context) {\n return u([context].concat(u('*', context).nodes));\n};\n\n// Store all of the operations to perform when cloning elements\nu.prototype.mirror = {};\n\n/**\n * Copy all JavaScript events of source node to destination node.\n * @param {[Object]} source DOM node\n * @param {[Object]} destination DOM node\n * @return {[undefined]]}\n */\nu.prototype.mirror.events = function(src, dest) {\n if (!src._e) return;\n\n for (var type in src._e) {\n src._e[type].forEach(function(ref) {\n u(dest).on(type, ref.callback);\n });\n }\n};\n\n/**\n * Copy select input value to its clone.\n * @param {[Object]} src DOM node\n * @param {[Object]} dest DOM node\n * @return {[undefined]}\n */\nu.prototype.mirror.select = function(src, dest) {\n if (u(src).is('select')) {\n dest.value = src.value;\n }\n};\n\n/**\n * Copy textarea input value to its clone\n * @param {[Object]} src DOM node\n * @param {[Object]} dest DOM node\n * @return {[undefined]}\n */\nu.prototype.mirror.textarea = function(src, dest) {\n if (u(src).is('textarea')) {\n dest.value = src.value;\n }\n};\n\n\n// Find the first ancestor that matches the selector for each node\nu.prototype.closest = function(selector) {\n return this.map(function(node) {\n // Keep going up and up on the tree. First element is also checked\n do {\n if (u(node).is(selector)) {\n return node;\n }\n } while ((node = node.parentNode) && node !== document);\n });\n};\n\n\n// Handle data-* attributes for the matched elements\nu.prototype.data = function(name, value) {\n return this.attr(name, value, true);\n};\n\n\n// Loops through every node from the current call\nu.prototype.each = function(callback) {\n // By doing callback.call we allow \"this\" to be the context for\n // the callback (see http://stackoverflow.com/q/4065353 precisely)\n this.nodes.forEach(callback.bind(this));\n\n return this;\n};\n\n\n// [INTERNAL USE ONLY]\n// Loop through the combination of every node and every argument passed\nu.prototype.eacharg = function(args, callback) {\n return this.each(function(node, i) {\n this.args(args, node, i).forEach(function(arg) {\n // Perform the callback for this node\n // By doing callback.call we allow \"this\" to be the context for\n // the callback (see http://stackoverflow.com/q/4065353 precisely)\n callback.call(this, node, arg);\n }, this);\n });\n};\n\n\n// Remove all children of the matched nodes from the DOM.\nu.prototype.empty = function() {\n return this.each(function(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n });\n};\n\n\n// .filter(selector)\n// Delete all of the nodes that don't pass the selector\nu.prototype.filter = function(selector) {\n // The default function if it's a CSS selector\n // Cannot change name to 'selector' since it'd mess with it inside this fn\n var callback = function(node) {\n // Make it compatible with some other browsers\n node.matches = node.matches || node.msMatchesSelector || node.webkitMatchesSelector;\n\n // Check if it's the same element (or any element if no selector was passed)\n return node.matches(selector || '*');\n };\n\n // filter() receives a function as in .filter(e => u(e).children().length)\n if (typeof selector === 'function') callback = selector;\n\n // filter() receives an instance of Umbrella as in .filter(u('a'))\n if (selector instanceof u) {\n callback = function(node) {\n return (selector.nodes).indexOf(node) !== -1;\n };\n }\n\n // Just a native filtering function for ultra-speed\n return u(this.nodes.filter(callback));\n};\n\n\n// Find all the nodes children of the current ones matched by a selector\nu.prototype.find = function(selector) {\n return this.map(function(node) {\n return u(selector || '*', node);\n });\n};\n\n\n// Get the first of the nodes\nu.prototype.first = function() {\n return this.nodes[0] || false;\n};\n\n\n// [INTERNAL USE ONLY]\n// Generate a fragment of HTML. This irons out the inconsistences\nu.prototype.generate = function(html) {\n // Table elements need to be child of for some f***ed up reason\n if (/^\\s* ]/.test(html)) {\n return u(document.createElement('table')).html(html).children().children().nodes;\n } else if (/^\\s* ]/.test(html)) {\n return u(document.createElement('table')).html(html).children().children().children().nodes;\n } else if (/^\\s* 0;\n};\n\n\n/**\n * Internal use only. This function checks to see if an element is in the page's body. As contains is inclusive and determining if the body contains itself isn't the intention of isInPage this case explicitly returns false.\nhttps://developer.mozilla.org/en-US/docs/Web/API/Node/contains\n * @param {[Object]} node DOM node\n * @return {Boolean} The Node.contains() method returns a Boolean value indicating whether a node is a descendant of a given node or not.\n */\nu.prototype.isInPage = function isInPage(node) {\n return (node === document.body) ? false : document.body.contains(node);\n};\n\n// Get the last of the nodes\nu.prototype.last = function() {\n return this.nodes[this.length - 1] || false;\n};\n\n\n// Merge all of the nodes that the callback returns\nu.prototype.map = function(callback) {\n return callback ? u(this.array(callback)).unique() : this;\n};\n\n\n// Delete all of the nodes that equals the filter\nu.prototype.not = function(filter) {\n return this.filter(function(node) {\n return !u(node).is(filter || true);\n });\n};\n\n\n// Removes the callback to the event listener for each node\nu.prototype.off = function(events, cb, cb2) {\n var cb_filter_off = (cb == null && cb2 == null);\n var sel = null;\n var cb_to_be_removed = cb;\n if (typeof cb === 'string') {\n sel = cb;\n cb_to_be_removed = cb2;\n }\n\n return this.eacharg(events, function(node, event) {\n u(node._e ? node._e[event] : []).each(function(ref) {\n if (cb_filter_off || (ref.orig_callback === cb_to_be_removed && ref.selector === sel)) {\n node.removeEventListener(event, ref.callback);\n }\n });\n });\n};\n\n\n// Attach a callback to the specified events\nu.prototype.on = function(events, cb, cb2) {\n var sel = null;\n var orig_callback = cb;\n if (typeof cb === 'string') {\n sel = cb;\n orig_callback = cb2;\n cb = function(e) {\n var args = arguments;\n var targetFound = false;\n u(e.currentTarget)\n .find(sel)\n .each(function(target) {\n if (target === e.target || target.contains(e.target)) {\n targetFound = true;\n try {\n Object.defineProperty(e, 'currentTarget', {\n get: function() {\n return target;\n }\n });\n } catch (err) {}\n cb2.apply(target, args);\n }\n });\n // due to e.currentEvent reassigning a second (or subsequent) handler may\n // not be fired for a single event, so chekc and apply if needed.\n if (!targetFound && e.currentTarget === e.target) {\n cb2.apply(e.target, args);\n }\n };\n }\n\n // Add the custom data as arguments to the callback\n var callback = function(e) {\n return cb.apply(this, [e].concat(e.detail || []));\n };\n\n return this.eacharg(events, function(node, event) {\n node.addEventListener(event, callback);\n\n // Store it so we can dereference it with `.off()` later on\n node._e = node._e || {};\n node._e[event] = node._e[event] || [];\n node._e[event].push({\n callback: callback,\n orig_callback: orig_callback,\n selector: sel\n });\n });\n};\n\n\n// [INTERNAL USE ONLY]\n\n// Take the arguments and a couple of callback to handle the getter/setter pairs\n// such as: .css('a'), .css('a', 'b'), .css({ a: 'b' })\nu.prototype.pairs = function(name, value, get, set) {\n // Convert it into a plain object if it is not\n if (typeof value !== 'undefined') {\n var nm = name;\n name = {};\n name[nm] = value;\n }\n\n if (typeof name === 'object') {\n // Set the value of each one, for each of the { prop: value } pairs\n return this.each(function(node) {\n for (var key in name) {\n set(node, key, name[key]);\n }\n });\n }\n\n // Return the style of the first one\n return this.length ? get(this.first(), name) : '';\n};\n\n// [INTERNAL USE ONLY]\n\n// Parametize an object: { a: 'b', c: 'd' } => 'a=b&c=d'\nu.prototype.param = function(obj) {\n return Object.keys(obj).map(function(key) {\n return this.uri(key) + '=' + this.uri(obj[key]);\n }.bind(this)).join('&');\n};\n\n// Travel the matched elements one node up\nu.prototype.parent = function(selector) {\n return this.map(function(node) {\n return node.parentNode;\n }).filter(selector);\n};\n\n\n// Add nodes at the beginning of each node\nu.prototype.prepend = function(html, data) {\n return this.adjacent(html, data, function(node, fragment) {\n node.insertBefore(fragment, node.firstChild);\n });\n};\n\n\n// Delete the matched nodes from the DOM\nu.prototype.remove = function() {\n // Loop through all the nodes\n return this.each(function(node) {\n // Perform the removal only if the node has a parent\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n};\n\n\n// Removes a class from all of the matched nodes\nu.prototype.removeClass = function() {\n // Loop the combination of each node with each argument\n return this.eacharg(arguments, function(el, name) {\n // Remove the class using the native method\n el.classList.remove(name);\n });\n};\n\n\n// Replace the matched elements with the passed argument.\nu.prototype.replace = function(html, data) {\n var nodes = [];\n this.adjacent(html, data, function(node, fragment) {\n nodes = nodes.concat(this.slice(fragment.children));\n node.parentNode.replaceChild(fragment, node);\n });\n return u(nodes);\n};\n\n\n// Scroll to the first matched element\nu.prototype.scroll = function() {\n this.first().scrollIntoView({\n behavior: 'smooth'\n });\n return this;\n};\n\n\n// [INTERNAL USE ONLY]\n// Select the adequate part from the context\nu.prototype.select = function(parameter, context) {\n // Allow for spaces before or after\n parameter = parameter.replace(/^\\s*/, '').replace(/\\s*$/, '');\n\n if (/^'),\n // 2) clone the currently matched node\n // 3) append cloned dom node to constructed node based on selector\n return this.map(function(node) {\n return u(selector).each(function(n) {\n findDeepestNode(n)\n .append(node.cloneNode(true));\n\n node\n .parentNode\n .replaceChild(n, node);\n });\n });\n};\n\n// Export it for webpack\nif (typeof module === 'object' && module.exports) {\n // Avoid breaking it for `import { u } from ...`. Add `import u from ...`\n module.exports = u;\n module.exports.u = u;\n}\n"), - } - filei := &embedded.EmbeddedFile{ - Filename: "02-polyfill.js", - FileModTime: time.Unix(1609727320, 0), - - Content: string("(function () {\n\nif (typeof window.Element === \"undefined\" || \"classList\" in document.documentElement) return;\n\nvar prototype = Array.prototype,\n push = prototype.push,\n splice = prototype.splice,\n join = prototype.join;\n\nfunction DOMTokenList(el) {\n this.el = el;\n // The className needs to be trimmed and split on whitespace\n // to retrieve a list of classes.\n var classes = el.className.replace(/^\\s+|\\s+$/g,'').split(/\\s+/);\n for (var i = 0; i < classes.length; i++) {\n push.call(this, classes[i]);\n }\n};\n\nDOMTokenList.prototype = {\n add: function(token) {\n if(this.contains(token)) return;\n push.call(this, token);\n this.el.className = this.toString();\n },\n contains: function(token) {\n return this.el.className.indexOf(token) != -1;\n },\n item: function(index) {\n return this[index] || null;\n },\n remove: function(token) {\n if (!this.contains(token)) return;\n for (var i = 0; i < this.length; i++) {\n if (this[i] == token) break;\n }\n splice.call(this, i, 1);\n this.el.className = this.toString();\n },\n toString: function() {\n return join.call(this, ' ');\n },\n toggle: function(token) {\n if (!this.contains(token)) {\n this.add(token);\n } else {\n this.remove(token);\n }\n\n return this.contains(token);\n }\n};\n\nwindow.DOMTokenList = DOMTokenList;\n\nfunction defineElementGetter (obj, prop, getter) {\n if (Object.defineProperty) {\n Object.defineProperty(obj, prop,{\n get : getter\n });\n } else {\n obj.__defineGetter__(prop, getter);\n }\n}\n\ndefineElementGetter(Element.prototype, 'classList', function () {\n return new DOMTokenList(this);\n});\n\n})();\n"), - } - filej := &embedded.EmbeddedFile{ - Filename: "03-twix.js", - FileModTime: time.Unix(1609727320, 0), - - Content: string("/*\n * Twix v1.0 - a lightweight library for making AJAX requests.\n * Author: Neil Cowburn (neilco@gmail.com)\n * \n * Copyright (c) 2013 Neil Cowburn (http://github.com/neilco/)\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nvar Twix = (function () {\n function Twix() { }\n \n Twix.ajax = function(options) {\n options = options || {url:\"\"};\n options.type = options.type.toUpperCase() || 'GET';\n options.headers = options.headers || {};\n options.timeout = parseInt(options.timeout) || 0;\n options.success = options.success || function() {};\n options.error = options.error || function() {};\n options.async = typeof options.async === 'undefined' ? true : options.async;\n\n var client = new XMLHttpRequest();\n if (options.timeout > 0) {\n client.timeout = options.timeout;\n client.ontimeout = function () { \n options.error('timeout', 'timeout', client); \n };\n }\n client.open(options.type, options.url, options.async);\n\n for (var i in options.headers) {\n if (options.headers.hasOwnProperty(i)) {\n client.setRequestHeader(i, options.headers[i]);\n }\n }\n \n client.send(options.data);\n client.onreadystatechange = function() {\n if (this.readyState == 4 && ((this.status >= 200 && this.status < 300) || this.status == 304)) {\n var data = this.responseText;\n var contentType = this.getResponseHeader('Content-Type');\n if (contentType && contentType.match(/json/)) {\n data = JSON.parse(this.responseText);\n }\n options.success(data, this.statusText, this);\n } else if (this.readyState == 4) {\n options.error(this.status, this.statusText, this);\n }\n };\n\n if (options.async == false) {\n if (client.readyState == 4 && ((client.status >= 200 && client.status < 300) || client.status == 304)) {\n options.success(client.responseText, client);\n } else if (client.readyState == 4) {\n options.error(client.status, client.statusText, client);\n }\n } \n\n return client;\n };\n\n var _ajax = function(type, url, data, callback) {\n if (typeof data === \"function\") {\n callback = data;\n data = undefined;\n }\n return Twix.ajax({\n url: url,\n data: data, \n type: type,\n success: callback\n });\n };\n\n Twix.get = function(url, data, callback) {\n return _ajax(\"GET\", url, data, callback);\n };\n\n Twix.head = function(url, data, callback) {\n return _ajax(\"HEAD\", url, data, callback);\n };\n\n Twix.post = function(url, data, callback) {\n return _ajax(\"POST\", url, data, callback);\n };\n\n Twix.patch = function(url, data, callback) {\n return _ajax(\"PATCH\", url, data, callback);\n };\n\n Twix.put = function(url, data, callback) {\n return _ajax(\"PUT\", url, data, callback);\n };\n\n Twix.delete = function(url, data, callback) {\n return _ajax(\"DELETE\", url, data, callback);\n };\n\n Twix.options = function(url, data, callback) {\n return _ajax(\"OPTIONS\", url, data, callback);\n };\n \n \n return Twix;\n})();\n\n__ = Twix;\n"), - } - filek := &embedded.EmbeddedFile{ - Filename: "99-spyda.js", - FileModTime: time.Unix(1611979072, 0), - - Content: string("// Creare's 'Implied Consent' EU Cookie Law Banner v:2.4\n// Conceived by Robert Kent, James Bavington & Tom Foyster\n\nvar dropCookie = true; // false disables the Cookie, allowing you to style the banner\nvar cookieDuration = 14; // Number of days before the cookie expires, and the banner reappears\nvar cookieName = \"complianceCookie\"; // Name of our cookie\nvar cookieValue = \"on\"; // Value of cookie\n\nfunction createDiv() {\n u(\"body\").prepend(\n '

This website uses cookies. By continuing we assume your permission to deploy cookies, as detailed in our privacy policy. Close

'\n );\n createCookie(window.cookieName, window.cookieValue, window.cookieDuration); // Create the cookie\n}\n\nfunction createCookie(name, value, days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n var expires = \"; expires=\" + date.toGMTString();\n } else var expires = \"\";\n if (window.dropCookie) {\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\n }\n}\n\nfunction checkCookie(name) {\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(\";\");\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) == \" \") c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\n\nfunction eraseCookie(name) {\n createCookie(name, \"\", -1);\n}\n\nwindow.onload = function() {\n if (checkCookie(window.cookieName) != window.cookieValue) {\n createDiv();\n }\n};\n\nfunction removeMe() {\n var element = document.getElementById(\"cookie-law\");\n element.parentNode.removeChild(element);\n}\n\nu(\"#burgerMenu\").on(\"click\", function(e) {\n e.preventDefault();\n\n if (u(\"#mainNav\").hasClass(\"responsive\")) {\n u(\"#mainNav\").removeClass(\"responsive\");\n } else {\n u(\"#mainNav\").addClass(\"responsive\");\n }\n});\n"), - } - filel := &embedded.EmbeddedFile{ - Filename: "spyda.min.js", - FileModTime: time.Unix(1611979522, 0), - - Content: string("var u=function(a,b){if(!(this instanceof u))return new u(a,b);if(a instanceof u)return a;typeof a=='string'&&(a=this.select(a,b)),a&&a.nodeName&&(a=[a]),this.nodes=this.slice(a)},Twix,dropCookie,cookieDuration,cookieName,cookieValue;u.prototype={get length(){return this.nodes.length}},u.prototype.nodes=[],u.prototype.addClass=function(){return this.eacharg(arguments,function(a,b){a.classList.add(b)})},u.prototype.adjacent=function(b,a,c){return typeof a=='number'&&(a===0?a=[]:a=new Array(a).join().split(',').map(Number.call,Number)),this.each(function(e,f){var d=document.createDocumentFragment();u(a||{}).map(function(c,d){var a=typeof b=='function'?b.call(this,c,d,e,f):b;return typeof a=='string'?this.generate(a):u(a)}).each(function(a){this.isInPage(a)?d.appendChild(u(a).clone().first()):d.appendChild(a)}),c.call(this,e,d)})},u.prototype.after=function(a,b){return this.adjacent(a,b,function(a,b){a.parentNode.insertBefore(b,a.nextSibling)})},u.prototype.append=function(a,b){return this.adjacent(a,b,function(a,b){a.appendChild(b)})},u.prototype.args=function(a,b,c){return typeof a=='function'&&(a=a(b,c)),typeof a!='string'&&(a=this.slice(a).map(this.str(b,c))),a.toString().split(/[\\s,]+/).filter(function(a){return a.length})},u.prototype.array=function(a){a=a;var b=this;return this.nodes.reduce(function(e,d,f){var c;return a?(c=a.call(b,d,f),c||(c=!1),typeof c=='string'&&(c=u(c)),c instanceof u&&(c=c.nodes)):c=d.innerHTML,e.concat(c!==!1?c:[])},[])},u.prototype.attr=function(b,c,a){return a=a?'data-':'',this.pairs(b,c,function(b,c){return b.getAttribute(a+c)},function(b,c,d){b.setAttribute(a+c,d)})},u.prototype.before=function(a,b){return this.adjacent(a,b,function(a,b){a.parentNode.insertBefore(b,a)})},u.prototype.children=function(a){return this.map(function(a){return this.slice(a.children)}).filter(a)},u.prototype.clone=function(){return this.map(function(a,d){var b=a.cloneNode(!0),c=this.getAll(b);return this.getAll(a).each(function(b,d){for(var a in this.mirror)this.mirror[a]&&this.mirror[a](b,c.nodes[d])}),b})},u.prototype.getAll=function(a){return u([a].concat(u('*',a).nodes))},u.prototype.mirror={},u.prototype.mirror.events=function(a,c){if(!a._e)return;for(var b in a._e)a._e[b].forEach(function(a){u(c).on(b,a.callback)})},u.prototype.mirror.select=function(a,b){u(a).is('select')&&(b.value=a.value)},u.prototype.mirror.textarea=function(a,b){u(a).is('textarea')&&(b.value=a.value)},u.prototype.closest=function(a){return this.map(function(b){do if(u(b).is(a))return b;while((b=b.parentNode)&&b!==document)})},u.prototype.data=function(a,b){return this.attr(a,b,!0)},u.prototype.each=function(a){return this.nodes.forEach(a.bind(this)),this},u.prototype.eacharg=function(a,b){return this.each(function(c,d){this.args(a,c,d).forEach(function(a){b.call(this,c,a)},this)})},u.prototype.empty=function(){return this.each(function(a){while(a.firstChild)a.removeChild(a.firstChild)})},u.prototype.filter=function(a){var b=function(b){return b.matches=b.matches||b.msMatchesSelector||b.webkitMatchesSelector,b.matches(a||'*')};return typeof a=='function'&&(b=a),a instanceof u&&(b=function(b){return a.nodes.indexOf(b)!==-1}),u(this.nodes.filter(b))},u.prototype.find=function(a){return this.map(function(b){return u(a||'*',b)})},u.prototype.first=function(){return this.nodes[0]||!1},u.prototype.generate=function(a){return/^\\s* ]/.test(a)?u(document.createElement('table')).html(a).children().children().nodes:/^\\s* ]/.test(a)?u(document.createElement('table')).html(a).children().children().children().nodes:/^\\s*0},u.prototype.isInPage=function(a){return!(a===document.body)&&document.body.contains(a)},u.prototype.last=function(){return this.nodes[this.length-1]||!1},u.prototype.map=function(a){return a?u(this.array(a)).unique():this},u.prototype.not=function(a){return this.filter(function(b){return!u(b).is(a||!0)})},u.prototype.off=function(e,a,d){var f=a==null&&d==null,b=null,c=a;return typeof a=='string'&&(b=a,c=d),this.eacharg(e,function(a,d){u(a._e?a._e[d]:[]).each(function(e){(f||e.orig_callback===c&&e.selector===b)&&a.removeEventListener(d,e.callback)})})},u.prototype.on=function(f,a,b){var c=null,d=a,e;return typeof a=='string'&&(c=a,d=b,a=function(a){var e=arguments,d=!1;u(a.currentTarget).find(c).each(function(c){if(c===a.target||c.contains(a.target)){d=!0;try{Object.defineProperty(a,'currentTarget',{get:function(){return c}})}catch(a){}b.apply(c,e)}}),!d&&a.currentTarget===a.target&&b.apply(a.target,e)}),e=function(b){return a.apply(this,[b].concat(b.detail||[]))},this.eacharg(f,function(a,b){a.addEventListener(b,e),a._e=a._e||{},a._e[b]=a._e[b]||[],a._e[b].push({callback:e,orig_callback:d,selector:c})})},u.prototype.pairs=function(a,b,c,d){if(typeof b!='undefined'){var e=a;a={},a[e]=b}return typeof a=='object'?this.each(function(c){for(var b in a)d(c,b,a[b])}):this.length?c(this.first(),a):''},u.prototype.param=function(a){return Object.keys(a).map(function(b){return this.uri(b)+'='+this.uri(a[b])}.bind(this)).join('&')},u.prototype.parent=function(a){return this.map(function(a){return a.parentNode}).filter(a)},u.prototype.prepend=function(a,b){return this.adjacent(a,b,function(a,b){a.insertBefore(b,a.firstChild)})},u.prototype.remove=function(){return this.each(function(a){a.parentNode&&a.parentNode.removeChild(a)})},u.prototype.removeClass=function(){return this.eacharg(arguments,function(a,b){a.classList.remove(b)})},u.prototype.replace=function(b,c){var a=[];return this.adjacent(b,c,function(b,c){a=a.concat(this.slice(c.children)),b.parentNode.replaceChild(c,b)}),u(a)},u.prototype.scroll=function(){return this.first().scrollIntoView({behavior:'smooth'}),this},u.prototype.select=function(a,b){return(a=a.replace(/^\\s*/,'').replace(/\\s*$/,''),/^0&&(b.timeout=a.timeout,b.ontimeout=function(){a.error('timeout','timeout',b)}),b.open(a.type,a.url,a.async);for(c in a.headers)a.headers.hasOwnProperty(c)&&b.setRequestHeader(c,a.headers[c]);return b.send(a.data),b.onreadystatechange=function(){var b,c;this.readyState==4&&(this.status>=200&&this.status<300||this.status==304)?(b=this.responseText,c=this.getResponseHeader('Content-Type'),c&&c.match(/json/)&&(b=JSON.parse(this.responseText)),a.success(b,this.statusText,this)):this.readyState==4&&a.error(this.status,this.statusText,this)},a.async==!1&&(b.readyState==4&&(b.status>=200&&b.status<300||b.status==304)?a.success(b.responseText,b):b.readyState==4&&a.error(b.status,b.statusText,b)),b};var b=function(d,e,b,c){return typeof b==\"function\"&&(c=b,b=void 0),a.ajax({url:e,data:b,type:d,success:c})};return a.get=function(a,c,d){return b(\"GET\",a,c,d)},a.head=function(a,c,d){return b(\"HEAD\",a,c,d)},a.post=function(a,c,d){return b(\"POST\",a,c,d)},a.patch=function(a,c,d){return b(\"PATCH\",a,c,d)},a.put=function(a,c,d){return b(\"PUT\",a,c,d)},a.delete=function(a,c,d){return b(\"DELETE\",a,c,d)},a.options=function(a,c,d){return b(\"OPTIONS\",a,c,d)},a}(),__=Twix,dropCookie=!0,cookieDuration=14,cookieName=\"complianceCookie\",cookieValue=\"on\";function createDiv(){u(\"body\").prepend('

This website uses cookies. By continuing we assume your permission to deploy cookies, as detailed in our privacy policy. Close

'),createCookie(window.cookieName,window.cookieValue,window.cookieDuration)}function createCookie(d,e,c){var a,b;c?(a=new Date,a.setTime(a.getTime()+c*24*60*60*1e3),b=\"; expires=\"+a.toGMTString()):(b=\"\"),window.dropCookie&&(document.cookie=d+\"=\"+e+b+\"; path=/\")}function checkCookie(e){for(var d=e+\"=\",c=document.cookie.split(\";\"),b=0,a;b\n
\n
\n

404 Not Found

\n

Ooops! The resource you are looking for is not here!

\n
\n \n{{end}}\n"), - } - fileo := &embedded.EmbeddedFile{ - Filename: "_partials.html", - FileModTime: time.Unix(1611978335, 0), - - Content: string("{{ define \"pager\" }}\n{{ if .HasPages }}\n\n{{ end }}\n{{ end }}\n"), - } - filep := &embedded.EmbeddedFile{ - Filename: "base.html", - FileModTime: time.Unix(1611979490, 0), - - Content: string("{{define \"base\"}}\n\n\n \n {{ if $.Debug }}\n \n \n \n \n \n {{ else }}\n \n \n {{ end }}\n\n {{ range .Alternatives }}\n \n {{ end }}\n\n {{ range .Links }}\n \n {{ end }}\n\n \n \n\n {{ .InstanceName }} {{ .Title }}\n {{ with .Meta.Title }}{{ end }}\n {{ with .Meta.Author }}{{ end }}\n {{ with .Meta.Keywords }}{{ end }}\n {{ with .Meta.Description }}{{ end }}\n\n \n {{ with .Meta.Title }}{{ end }}\n {{ with .Meta.Description }}{{ end }}\n {{ with .Meta.UpdatedAt }}{{ end }}\n {{ with .Meta.Image }}{{ end }}\n {{ with .Meta.URL }}{{ end }}\n \n \n\n \n
\n {{template \"content\" . }}\n
\n \n {{ if $.Debug }}\n \n \n \n \n {{ else }}\n \n {{ end }}\n\n\n{{end}}\n"), - } - fileq := &embedded.EmbeddedFile{ - Filename: "cache.html", - FileModTime: time.Unix(1611066114, 0), - - Content: string("\n\nveri\n\n\n\n\n

veri

\n

This is a rudimentary cached copy of {{ .URL }}, go there to get the latest copy. No ownership of this content is implied.

\n{{ if not . }}

No cache

{{ end }}\n

{{ .Title }}

\n
\n{{ .Content }}\n
\n

If your page appears here and you do not want it to, please contact ~ols/indexing@lists.sr.ht. Contact the same email if you want your page considered for indexing. Be aware this is a public mailing list.

\n

about

\n\n\n"), - } - filer := &embedded.EmbeddedFile{ - Filename: "error.html", - FileModTime: time.Unix(1609727320, 0), - - Content: string("{{define \"content\"}}\n
\n
\n
\n

{{ if .Error }}Error{{ else }}Success {{ end }}

\n

{{ .Message }}

\n
\n
\n{{end}}\n"), - } - files := &embedded.EmbeddedFile{ - Filename: "index.html", - FileModTime: time.Unix(1611068566, 0), - - Content: string("\n\n\nveri\n\n\n\n\n
\n

veri

\n
\n
\n
\n

\n \n \n
\n\n\n\n"), - } - filet := &embedded.EmbeddedFile{ - Filename: "search.html", - FileModTime: time.Unix(1611068736, 0), - - Content: string("\n\n\nveri\n\n\n\n\n
\n

veri

\n
\n
\n
\n

\n \n \n

These results are not ranked, they are just in alphabetical order of URL (this will change)

\n
    \n {{ if not . }}

    No search results

    {{ end }}\n {{ range . }}\n
  1. {{ .Title }}

    {{ .Summary }}{{ else }} class=\"placeholder\">No summary available{{ end }}

    {{ .URL }} {{ .Length }} View cached

    \n {{ end }}\n
\n

If your page appears here and you do not want it to, please contact ~ols/indexing@lists.sr.ht. Contact the same email if you want your page considered for indexing. Be aware this is a public mailing list.

\n\n\n\n"), - } - fileu := &embedded.EmbeddedFile{ - Filename: "support.html", - FileModTime: time.Unix(1609727320, 0), - - Content: string("{{define \"content\"}}\n
\n
\n
\n

Contact us

\n

How can we help you?

\n
\n
\n \n \n \n \n \n\n Please solve this simple math problem below so we know you're a human!\n \"captcha\"\n \n\n \n \n
\n
\n
\n{{end}}\n"), - } - - // define dirs - dirm := &embedded.EmbeddedDir{ - Filename: "", - DirModTime: time.Unix(1611979490, 0), - ChildFiles: []*embedded.EmbeddedFile{ - filen, // "404.html" - fileo, // "_partials.html" - filep, // "base.html" - fileq, // "cache.html" - filer, // "error.html" - files, // "index.html" - filet, // "search.html" - fileu, // "support.html" - - }, - } - - // link ChildDirs - dirm.ChildDirs = []*embedded.EmbeddedDir{} - - // register embeddedBox - embedded.RegisterEmbeddedBox(`templates`, &embedded.EmbeddedBox{ - Name: `templates`, - Time: time.Unix(1611979490, 0), - Dirs: map[string]*embedded.EmbeddedDir{ - "": dirm, - }, - Files: map[string]*embedded.EmbeddedFile{ - "404.html": filen, - "_partials.html": fileo, - "base.html": filep, - "cache.html": fileq, - "error.html": filer, - "index.html": files, - "search.html": filet, - "support.html": fileu, - }, - }) -} diff --git a/internal/robots.go b/internal/robots.go index 60a2ff2..b14cd7e 100644 --- a/internal/robots.go +++ b/internal/robots.go @@ -11,18 +11,11 @@ import ( const robotsTpl = `User-Agent: * Disallow: / Allow: / -Allow: /twt -Allow: /user -Allow: /feed Allow: /about +Allow: /abuse Allow: /help -Allow: /blogs Allow: /privacy Allow: /support -Allow: /search -Allow: /external -Allow: /atom.xml -Allow: /media ` // RobotsHandler ... diff --git a/internal/server.go b/internal/server.go index 5f928e7..386ab7e 100644 --- a/internal/server.go +++ b/internal/server.go @@ -12,7 +12,6 @@ import ( rice "github.com/GeertJohan/go.rice" "github.com/NYTimes/gziphandler" - humanize "github.com/dustin/go-humanize" "github.com/gabstv/merger" "github.com/justinas/nosurf" "github.com/prologic/observe" @@ -33,7 +32,7 @@ var ( ) func init() { - metrics = observe.NewMetrics("twtd") + metrics = observe.NewMetrics("spyda") } // Server ... @@ -234,45 +233,6 @@ func (s *Server) setupMetrics() { "Number of unique feeds in the global feed cache", ) - // feed cache size - metrics.NewGauge( - "cache", "twts", - "Number of active twts in the global feed cache", - ) - - // blogs cache size - metrics.NewGaugeFunc( - "cache", "blogs", - "Number of blogs in the blogs cache", - func() float64 { - return float64(s.blogs.Count()) - }, - ) - - // feed cache processing time - metrics.NewGauge( - "cache", "last_processed_seconds", - "Number of seconds for a feed cache cycle", - ) - - // feed cache limited fetch (feed exceeded MaxFetchLImit or unknown size) - metrics.NewCounter( - "cache", "limited", - "Number of feed cache fetches affected by MaxFetchLimit", - ) - - // archive size - metrics.NewCounter( - "archive", "size", - "Number of items inserted into the global feed archive", - ) - - // archive errors - metrics.NewCounter( - "archive", "error", - "Number of items errored inserting into the global feed archive", - ) - // server info metrics.NewGaugeVec( "server", "info", @@ -353,140 +313,40 @@ func (s *Server) initRoutes() { s.router.GET("/privacy", s.PageHandler("privacy")) s.router.GET("/abuse", s.PageHandler("abuse")) - s.router.GET("/", s.TimelineHandler()) - s.router.HEAD("/", s.TimelineHandler()) + s.router.GET("/", s.IndexHandler()) + s.router.HEAD("/", s.IndexHandler()) s.router.GET("/robots.txt", s.RobotsHandler()) s.router.HEAD("/robots.txt", s.RobotsHandler()) - s.router.GET("/discover", s.am.MustAuth(s.DiscoverHandler())) - s.router.GET("/mentions", s.am.MustAuth(s.MentionsHandler())) s.router.GET("/search", s.SearchHandler()) - s.router.HEAD("/twt/:hash", s.PermalinkHandler()) - s.router.GET("/twt/:hash", s.PermalinkHandler()) - - s.router.GET("/bookmark/:hash", s.BookmarkHandler()) - s.router.POST("/bookmark/:hash", s.BookmarkHandler()) - - s.router.HEAD("/conv/:hash", s.ConversationHandler()) - s.router.GET("/conv/:hash", s.ConversationHandler()) - - s.router.GET("/feeds", s.am.MustAuth(s.FeedsHandler())) - s.router.POST("/feed", s.am.MustAuth(s.FeedHandler())) - - s.router.POST("/post", s.am.MustAuth(s.PostHandler())) - s.router.PATCH("/post", s.am.MustAuth(s.PostHandler())) - s.router.DELETE("/post", s.am.MustAuth(s.PostHandler())) - - // Private Messages - s.router.GET("/messages", s.am.MustAuth(s.ListMessagesHandler())) - s.router.GET("/messages/:msgid", s.am.MustAuth(s.ViewMessageHandler())) - s.router.POST("/messages/send", s.am.MustAuth(s.SendMessageHandler())) - s.router.POST("/messages/delete", s.am.MustAuth(s.DeleteMessagesHandler())) - - s.router.POST("/blog", s.am.MustAuth(s.CreateOrUpdateBlogHandler())) - s.router.GET("/blogs/:author", s.ListBlogsHandler()) - s.router.GET("/blog/:author/:year/:month/:date/:slug", s.ViewBlogHandler()) - s.router.HEAD("/blog/:author/:year/:month/:date/:slug", s.ViewBlogHandler()) - s.router.GET("/blog/:author/:year/:month/:date/:slug/edit", s.EditBlogHandler()) - s.router.GET("/blog/:author/:year/:month/:date/:slug/delete", s.DeleteBlogHandler()) - s.router.GET("/blog/:author/:year/:month/:date/:slug/publish", s.PublishBlogHandler()) - - if s.config.OpenProfiles { - s.router.GET("/user/:nick/", s.ProfileHandler()) - s.router.GET("/user/:nick/config.yaml", s.UserConfigHandler()) - } else { - s.router.GET("/user/:nick/", s.am.MustAuth(s.ProfileHandler())) - s.router.GET("/user/:nick/config.yaml", s.am.MustAuth(s.UserConfigHandler())) - } - s.router.GET("/user/:nick/avatar", s.AvatarHandler()) - s.router.HEAD("/user/:nick/avatar", s.AvatarHandler()) - s.router.GET("/user/:nick/followers", s.FollowersHandler()) - s.router.GET("/user/:nick/following", s.FollowingHandler()) - s.router.GET("/user/:nick/bookmarks", s.BookmarksHandler()) - - s.router.GET("/pod/avatar", s.PodAvatarHandler()) - - // WebMentions - s.router.POST("/user/:nick/webmention", s.WebMentionHandler()) - - // External Feeds - s.router.GET("/external", s.ExternalHandler()) - s.router.GET("/externalAvatar", s.ExternalAvatarHandler()) - s.router.HEAD("/externalAvatar", s.ExternalAvatarHandler()) - - // External Queries (protected by a short-lived token) - s.router.GET("/whoFollows", s.WhoFollowsHandler()) - - // Syndication Formats (RSS, Atom, JSON Feed) - s.router.HEAD("/atom.xml", s.SyndicationHandler()) - s.router.HEAD("/user/:nick/atom.xml", s.SyndicationHandler()) - s.router.GET("/atom.xml", s.SyndicationHandler()) - s.router.GET("/user/:nick/atom.xml", s.SyndicationHandler()) - - s.router.GET("/feed/:name/manage", s.am.MustAuth(s.ManageFeedHandler())) - s.router.POST("/feed/:name/manage", s.am.MustAuth(s.ManageFeedHandler())) - s.router.POST("/feed/:name/archive", s.am.MustAuth(s.ArchiveFeedHandler())) - s.router.GET("/login", s.am.HasAuth(s.LoginHandler())) s.router.POST("/login", s.LoginHandler()) s.router.GET("/logout", s.LogoutHandler()) s.router.POST("/logout", s.LogoutHandler()) - s.router.GET("/register", s.am.HasAuth(s.RegisterHandler())) - s.router.POST("/register", s.RegisterHandler()) - // Reset Password - s.router.GET("/resetPassword", s.ResetPasswordHandler()) - s.router.POST("/resetPassword", s.ResetPasswordHandler()) - s.router.GET("/newPassword", s.ResetPasswordMagicLinkHandler()) - s.router.POST("/newPassword", s.NewPasswordHandler()) + s.router.GET("/pwreset", s.ResetPasswordHandler()) + s.router.POST("/pwreset", s.ResetPasswordHandler()) + s.router.GET("/chpasswd", s.ResetPasswordMagicLinkHandler()) + s.router.POST("/chpasswd", s.NewPasswordHandler()) - // Media Handling - s.router.GET("/media/:name", s.MediaHandler()) - s.router.HEAD("/media/:name", s.MediaHandler()) - s.router.POST("/upload", s.am.MustAuth(s.UploadMediaHandler())) - - // Task State - s.router.GET("/task/:uuid", s.TaskHandler()) - - // User/Feed Lookups - s.router.GET("/lookup", s.am.MustAuth(s.LookupHandler())) - - s.router.GET("/follow", s.am.MustAuth(s.FollowHandler())) - s.router.POST("/follow", s.am.MustAuth(s.FollowHandler())) - - s.router.GET("/import", s.am.MustAuth(s.ImportHandler())) - s.router.POST("/import", s.am.MustAuth(s.ImportHandler())) - - s.router.GET("/unfollow", s.am.MustAuth(s.UnfollowHandler())) - s.router.POST("/unfollow", s.am.MustAuth(s.UnfollowHandler())) - - s.router.GET("/mute", s.am.MustAuth(s.MuteHandler())) - s.router.POST("/mute", s.am.MustAuth(s.MuteHandler())) - s.router.GET("/unmute", s.am.MustAuth(s.UnmuteHandler())) - s.router.POST("/unmute", s.am.MustAuth(s.UnmuteHandler())) - - s.router.GET("/transferFeed/:name", s.TransferFeedHandler()) - s.router.GET("/transferFeed/:name/:transferTo", s.TransferFeedHandler()) + s.router.GET("/add", s.AddHandler()) + s.router.POST("/add", s.AddHandler()) s.router.GET("/settings", s.am.MustAuth(s.SettingsHandler())) s.router.POST("/settings", s.am.MustAuth(s.SettingsHandler())) s.router.POST("/token/delete/:signature", s.am.MustAuth(s.DeleteTokenHandler())) - s.router.GET("/config", s.am.MustAuth(s.PodConfigHandler())) - s.router.GET("/manage/pod", s.ManagePodHandler()) - s.router.POST("/manage/pod", s.ManagePodHandler()) + s.router.GET("/manage", s.ManageHandler()) + s.router.POST("/manage", s.ManageHandler()) s.router.GET("/manage/users", s.ManageUsersHandler()) s.router.POST("/manage/adduser", s.AddUserHandler()) s.router.POST("/manage/deluser", s.DelUserHandler()) - s.router.GET("/deleteFeeds", s.DeleteAccountHandler()) - s.router.POST("/delete", s.am.MustAuth(s.DeleteAllHandler())) - // Support / Report Abuse handlers s.router.GET("/support", s.SupportHandler()) @@ -687,25 +547,12 @@ func NewServer(bind string, options ...Option) (*Server, error) { log.Infof("Admin User: %s", server.config.AdminUser) log.Infof("Admin Name: %s", server.config.AdminName) log.Infof("Admin Email: %s", server.config.AdminEmail) - log.Infof("Max Twts per Page: %d", server.config.TwtsPerPage) - log.Infof("Max Cache TTL: %s", server.config.MaxCacheTTL) - log.Infof("Max Cache Items: %d", server.config.MaxCacheItems) - log.Infof("Maximum length of Posts: %d", server.config.MaxTwtLength) - log.Infof("Open User Profiles: %t", server.config.OpenProfiles) - log.Infof("Open Registrations: %t", server.config.OpenRegistrations) log.Infof("SMTP Host: %s", server.config.SMTPHost) log.Infof("SMTP Port: %d", server.config.SMTPPort) log.Infof("SMTP User: %s", server.config.SMTPUser) log.Infof("SMTP From: %s", server.config.SMTPFrom) - log.Infof("Max Fetch Limit: %s", humanize.Bytes(uint64(server.config.MaxFetchLimit))) - log.Infof("Max Upload Size: %s", humanize.Bytes(uint64(server.config.MaxUploadSize))) log.Infof("API Session Time: %s", server.config.APISessionTime) - // Warn about user registration being disabled. - if !server.config.OpenRegistrations { - log.Warn("Open Registrations are disabled as per configuration (no -R/--open-registrations)") - } - server.initRoutes() api.initRoutes() diff --git a/internal/templates.go b/internal/templates.go index 373ba05..9399081 100644 --- a/internal/templates.go +++ b/internal/templates.go @@ -40,11 +40,7 @@ func NewTemplateManager(conf *Config, blogs *BlogsCache, cache *Cache) (*Templat funcMap["hostnameFromURL"] = HostnameFromURL funcMap["prettyURL"] = PrettyURL funcMap["isLocalURL"] = IsLocalURLFactory(conf) - funcMap["formatTwt"] = FormatTwtFactory(conf) - funcMap["unparseTwt"] = UnparseTwtFactory(conf) funcMap["formatForDateTime"] = FormatForDateTime - funcMap["urlForBlog"] = URLForBlogFactory(conf, blogs) - funcMap["urlForConv"] = URLForConvFactory(conf, cache) funcMap["isAdminUser"] = IsAdminUserFactory(conf) m := &TemplateManager{debug: conf.Debug, templates: templates, funcMap: funcMap} diff --git a/internal/templates/_partials.html b/internal/templates/_partials.html index 6f84957..965a5cd 100644 --- a/internal/templates/_partials.html +++ b/internal/templates/_partials.html @@ -11,7 +11,7 @@
    -
  • Page {{ .Page }}/{{ .PageNums }} of {{ .Nums }} Twts
  • +
  • Page {{ .Page }}/{{ .PageNums }} of {{ .Nums }} Results