From d88dbbc90f28af884b7d0d989bb0fe34118c9a4e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 2 Apr 2023 13:59:26 -0400 Subject: [PATCH 001/182] WIP --- go.mod | 3 + go.sum | 6 ++ server/smtp_server.go | 77 +++++++++++++++++++---- server/smtp_server_test.go | 125 +++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index d5a9025e..10d32350 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require github.com/pkg/errors v0.9.1 // indirect require ( firebase.google.com/go/v4 v4.10.0 + github.com/microcosm-cc/bluemonday v1.0.23 github.com/prometheus/client_golang v1.14.0 github.com/stripe/stripe-go/v74 v74.14.0 ) @@ -39,6 +40,7 @@ require ( cloud.google.com/go/longrunning v0.4.1 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -50,6 +52,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.8.0 // indirect + github.com/gorilla/css v1.0.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index 8c166afd..27679caa 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -85,6 +87,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9 github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -95,6 +99,8 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= github.com/olebedev/when v0.0.0-20221205223600-4d190b02b8d8 h1:0uFGkScHef2Xd8g74BMHU1jFcnKEm0PzrPn4CluQ9FI= github.com/olebedev/when v0.0.0-20221205223600-4d190b02b8d8/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/server/smtp_server.go b/server/smtp_server.go index 16d97328..fe7e3298 100644 --- a/server/smtp_server.go +++ b/server/smtp_server.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "github.com/emersion/go-smtp" + "github.com/microcosm-cc/bluemonday" "io" "mime" "mime/multipart" @@ -13,6 +14,7 @@ import ( "net/http" "net/http/httptest" "net/mail" + "regexp" "strings" "sync" ) @@ -231,37 +233,66 @@ func readMailBody(body io.Reader, header mail.Header) (string, error) { if err != nil { return "", err } - if strings.ToLower(contentType) == "text/plain" { - return readPlainTextMailBody(body, header.Get("Content-Transfer-Encoding")) - } else if strings.HasPrefix(strings.ToLower(contentType), "multipart/") { - return readMultipartMailBody(body, params, 0) + canonicalContentType := strings.ToLower(contentType) + if canonicalContentType == "text/plain" || canonicalContentType == "text/html" { + return readTextMailBody(body, canonicalContentType, header.Get("Content-Transfer-Encoding")) + } else if strings.HasPrefix(canonicalContentType, "multipart/") { + return readMultipartMailBody(body, params) } return "", errUnsupportedContentType } -func readMultipartMailBody(body io.Reader, params map[string]string, depth int) (string, error) { +func readMultipartMailBody(body io.Reader, params map[string]string) (string, error) { + parts := make(map[string]string) + if err := readMultipartMailBodyParts(body, params, 0, parts); err != nil && err != io.EOF { + return "", err + } else if s, ok := parts["text/plain"]; ok { + return s, nil + } else if s, ok := parts["text/html"]; ok { + return s, nil + } + return "", io.EOF +} + +func readMultipartMailBodyParts(body io.Reader, params map[string]string, depth int, parts map[string]string) error { if depth >= maxMultipartDepth { - return "", errMultipartNestedTooDeep + return errMultipartNestedTooDeep } mr := multipart.NewReader(body, params["boundary"]) for { part, err := mr.NextPart() if err != nil { // may be io.EOF - return "", err + return err } partContentType, partParams, err := mime.ParseMediaType(part.Header.Get("Content-Type")) if err != nil { - return "", err + return err } - if strings.ToLower(partContentType) == "text/plain" { - return readPlainTextMailBody(part, part.Header.Get("Content-Transfer-Encoding")) + canonicalPartContentType := strings.ToLower(partContentType) + if canonicalPartContentType == "text/plain" || canonicalPartContentType == "text/html" { + s, err := readTextMailBody(part, canonicalPartContentType, part.Header.Get("Content-Transfer-Encoding")) + if err != nil { + return err + } + parts[canonicalPartContentType] = s } else if strings.HasPrefix(strings.ToLower(partContentType), "multipart/") { - return readMultipartMailBody(part, partParams, depth+1) + if err := readMultipartMailBodyParts(part, partParams, depth+1, parts); err != nil { + return err + } } // Continue with next part } } +func readTextMailBody(reader io.Reader, contentType, transferEncoding string) (string, error) { + if contentType == "text/plain" { + return readPlainTextMailBody(reader, transferEncoding) + } else if contentType == "text/html" { + return readHTMLMailBody(reader, transferEncoding) + } + return "", fmt.Errorf("unsupported content type: %s", contentType) +} + func readPlainTextMailBody(reader io.Reader, transferEncoding string) (string, error) { if strings.ToLower(transferEncoding) == "base64" { reader = base64.NewDecoder(base64.StdEncoding, reader) @@ -272,3 +303,27 @@ func readPlainTextMailBody(reader io.Reader, transferEncoding string) (string, e } return string(body), nil } + +func readHTMLMailBody(reader io.Reader, transferEncoding string) (string, error) { + body, err := readPlainTextMailBody(reader, transferEncoding) + if err != nil { + return "", err + } + stripped := bluemonday. + StrictPolicy(). + AddSpaceWhenStrippingTag(true). + Sanitize(body) + return removeExtraEmptyLines(stripped), nil +} + +func removeExtraEmptyLines(str string) string { + // Replace lines that contain only spaces with empty lines + re := regexp.MustCompile(`(?m)^\s+$`) + str = re.ReplaceAllString(str, "") + + // Remove more than 2 consecutive empty lines + re = regexp.MustCompile(`\n{3,}`) + str = re.ReplaceAllString(str, "\n\n") + + return str +} diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index 49085d79..1e504521 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -492,6 +492,131 @@ L0VOIj4KClRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZnJvbSBUcnVlTkFTIENPUkUuCg== writeAndReadUntilLine(t, email, c, scanner, "554 5.0.0 Error: transaction failed, blame it on the weather: multipart message nested too deep") } +func TestSmtpBackend_HTMLEmail(t *testing.T) { + email := `EHLO example.com +MAIL FROM: test@mydomain.me +RCPT TO: ntfy-mytopic@ntfy.sh +DATA +Message-Id: <51610934ss4.mmailer@fritz.box> +From: +To: , + +Date: Thu, 30 Mar 2023 02:56:53 +0000 +Subject: A HTML email +Mime-Version: 1.0 +Content-Type: text/html; + charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +<=21DOCTYPE html> + + +Alerttitle + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +headertext of table + +
+
+ + + + +
+" Very important information about a change in your +home automation setup + +Now the light is on +
+
+ + + + +
+
+If you don't want to recieve this message anymore, stop the push + services in your FRITZ=21Box=2E
+Here you can see the active push services: "System > Push Service"=2E +
+
+ + + + +
+This mail has ben sent by your FRITZ=21Box automatically=2E +
+
+
+ + +. +` + + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "A HTML email", r.Header.Get("Title")) + require.Equal(t, "what's up", readAll(t, r.Body)) + }) + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + func TestSmtpBackend_PlaintextWithToken(t *testing.T) { email := `EHLO example.com MAIL FROM: phil@example.com From 76667ffcf9937cb4dd0428b5858710c218ee9f71 Mon Sep 17 00:00:00 2001 From: nisbet-hubbard <87453615+nisbet-hubbard@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:18:48 +0800 Subject: [PATCH 002/182] Use mod_proxy_http for websocket upgrade mod_proxy_wstunnel is deprecated as of httpd 2.4.47. It also uses more resources since it relies on mod_rewrite. See https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#protoupgrade. --- docs/config.md | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/docs/config.md b/docs/config.md index 9af79992..3577bb48 100644 --- a/docs/config.md +++ b/docs/config.md @@ -649,8 +649,8 @@ or the root domain: ServerName ntfy.sh - # Proxy connections to ntfy (requires "a2enmod proxy") - ProxyPass / http://127.0.0.1:2586/ + # Proxy connections to ntfy (requires "a2enmod proxy proxy_http") + ProxyPass / http://127.0.0.1:2586/ upgrade=websocket ProxyPassReverse / http://127.0.0.1:2586/ SetEnv proxy-nokeepalive 1 @@ -661,11 +661,6 @@ or the root domain: # Enable mod_rewrite (requires "a2enmod rewrite") RewriteEngine on - - # WebSockets support (requires "a2enmod rewrite proxy_wstunnel") - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "ws://127.0.0.1:2586/$1" [P,L] # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want # it to work with curl without the annoying https:// prefix @@ -681,8 +676,8 @@ or the root domain: SSLCertificateKeyFile /etc/letsencrypt/live/ntfy.sh/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf - # Proxy connections to ntfy (requires "a2enmod proxy") - ProxyPass / http://127.0.0.1:2586/ + # Proxy connections to ntfy (requires "a2enmod proxy proxy_http") + ProxyPass / http://127.0.0.1:2586/ upgrade=websocket ProxyPassReverse / http://127.0.0.1:2586/ SetEnv proxy-nokeepalive 1 @@ -693,11 +688,7 @@ or the root domain: # Enable mod_rewrite (requires "a2enmod rewrite") RewriteEngine on - - # WebSockets support (requires "a2enmod rewrite proxy_wstunnel") - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteCond %{HTTP:Connection} upgrade [NC] - RewriteRule ^/?(.*) "ws://127.0.0.1:2586/$1" [P,L] + ``` From e52132c85b1297a53911f97302546aab227097eb Mon Sep 17 00:00:00 2001 From: nisbet-hubbard <87453615+nisbet-hubbard@users.noreply.github.com> Date: Wed, 12 Jul 2023 19:48:51 +0800 Subject: [PATCH 003/182] Use mod_alias for redirection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s a less resource-intensive alternative to mod_rewrite. --- docs/config.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/config.md b/docs/config.md index 3577bb48..af84dae9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -658,14 +658,13 @@ or the root domain: # Higher than the max message size of 4096 bytes LimitRequestBody 102400 - - # Enable mod_rewrite (requires "a2enmod rewrite") - RewriteEngine on # Redirect HTTP to HTTPS, but only for GET topic addresses, since we want - # it to work with curl without the annoying https:// prefix - RewriteCond %{REQUEST_METHOD} GET - RewriteRule ^/([-_A-Za-z0-9]{0,64})$ https://%{SERVER_NAME}/$1 [R,L] + # it to work with curl without the annoying https:// prefix (requires "a2enmod alias") + + RedirectMatch permanent "^/([-_A-Za-z0-9]{0,64})$" "https://%{SERVER_NAME}/$1" + + @@ -685,9 +684,6 @@ or the root domain: # Higher than the max message size of 4096 bytes LimitRequestBody 102400 - - # Enable mod_rewrite (requires "a2enmod rewrite") - RewriteEngine on ``` From a534cc9ecacb5985c1de4b503ae435fe9973c768 Mon Sep 17 00:00:00 2001 From: nisbet-hubbard <87453615+nisbet-hubbard@users.noreply.github.com> Date: Wed, 12 Jul 2023 20:00:48 +0800 Subject: [PATCH 004/182] Add server.yml ex. when using proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This would help inexperienced sysadmins who may not realise that since TLS terminates at proxy, ntfy is actually listening on a TCP socket that’s using http rather than https. --- docs/config.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/config.md b/docs/config.md index af84dae9..bb7f7e1b 100644 --- a/docs/config.md +++ b/docs/config.md @@ -44,6 +44,14 @@ Here are a few working sample configs: attachment-cache-dir: "/var/cache/ntfy/attachments" ``` +=== "server.yml (behind proxy, with cache + attachments)" + ``` yaml + base-url: "http://ntfy.example.com" + listen-http: ":2586" + cache-file: "/var/cache/ntfy/cache.db" + attachment-cache-dir: "/var/cache/ntfy/attachments" + ``` + === "server.yml (ntfy.sh config)" ``` yaml # All the things: Behind a proxy, Firebase, cache, attachments, From 4e9eeb1fa168e0d27d6df013242aefc6e172fe5a Mon Sep 17 00:00:00 2001 From: nisbet-hubbard <87453615+nisbet-hubbard@users.noreply.github.com> Date: Wed, 12 Jul 2023 20:24:57 +0800 Subject: [PATCH 005/182] Add missing note on log file permissions --- server/server.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/server.yml b/server/server.yml index 6b2fc989..b044a914 100644 --- a/server/server.yml +++ b/server/server.yml @@ -342,6 +342,10 @@ # - "field -> level" to match any value, e.g. "time_taken_ms -> debug" # Warning: Using log-level-overrides has a performance penalty. Only use it for temporary debugging. # +# Check your permissions: +# If you are running ntfy with systemd, make sure this log file is owned by the +# ntfy user and group by running: chown ntfy.ntfy . +# # Example (good for production): # log-level: info # log-format: json From 2e08c48742aa07934ada49a49d7e567341b755b5 Mon Sep 17 00:00:00 2001 From: Christian Meis Date: Thu, 3 Aug 2023 14:56:43 +0000 Subject: [PATCH 006/182] Translated using Weblate (German) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 6343deec..d29760f1 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -310,7 +310,7 @@ "prefs_reservations_delete_button": "Zugriff auf Thema zurücksetzen", "prefs_reservations_table": "Übersicht reservierter Themen", "prefs_reservations_table_topic_header": "Thema", - "prefs_reservations_table_everyone_deny_all": "Nur kann veröffentlichen und lesen", + "prefs_reservations_table_everyone_deny_all": "Nur ich kann veröffentlichen und lesen", "prefs_reservations_table_everyone_write_only": "Ich kann veröffentlichen und lesen, jeder kann veröffentlichen", "prefs_reservations_table_not_subscribed": "Nicht abonniert", "prefs_reservations_table_click_to_subscribe": "Klicken um zu abonnieren", From 8544733048d6f1bc001ea1e12793cab57a8b1416 Mon Sep 17 00:00:00 2001 From: Nguyen Loc Date: Mon, 7 Aug 2023 03:58:56 +0200 Subject: [PATCH 007/182] Added translation using Weblate (Vietnamese) --- web/public/static/langs/vi.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/vi.json diff --git a/web/public/static/langs/vi.json b/web/public/static/langs/vi.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/vi.json @@ -0,0 +1 @@ +{} From 17e634c56311ca093df09f103a9e1e63841569a7 Mon Sep 17 00:00:00 2001 From: Shjosan Date: Mon, 7 Aug 2023 09:14:48 +0000 Subject: [PATCH 008/182] Translated using Weblate (Swedish) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sv/ --- web/public/static/langs/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/sv.json b/web/public/static/langs/sv.json index bc4a5405..90647542 100644 --- a/web/public/static/langs/sv.json +++ b/web/public/static/langs/sv.json @@ -277,7 +277,7 @@ "publish_dialog_priority_low": "Låg prioritet", "publish_dialog_priority_default": "Standard prioritet", "publish_dialog_priority_high": "Hög prioritet", - "publish_dialog_priority_max": "Högsta prioritet", + "publish_dialog_priority_max": "Max. prioritet", "publish_dialog_base_url_label": "Service-URL", "publish_dialog_email_label": "E-post", "publish_dialog_attach_reset": "Ta bort URL för bifogade filer", From ea9f2c6e3549e5f5fb6f88c0a224d8664c4e3242 Mon Sep 17 00:00:00 2001 From: CaptB Date: Thu, 10 Aug 2023 10:00:55 +0000 Subject: [PATCH 009/182] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/zh_Hans/ --- web/public/static/langs/zh_Hans.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/zh_Hans.json b/web/public/static/langs/zh_Hans.json index 52e0a1b8..f6858715 100644 --- a/web/public/static/langs/zh_Hans.json +++ b/web/public/static/langs/zh_Hans.json @@ -359,5 +359,26 @@ "publish_dialog_chip_call_no_verified_numbers_tooltip": "未验证的手机号", "account_basics_phone_numbers_title": "电话号码", "account_basics_phone_numbers_description": "电话通知", - "account_basics_phone_numbers_dialog_description": "要使用来电通知功能,您需要添加并验证至少一个电话号码。可以通过短信或电话进行验证。" + "account_basics_phone_numbers_dialog_description": "要使用来电通知功能,您需要添加并验证至少一个电话号码。可以通过短信或电话进行验证。", + "account_basics_phone_numbers_dialog_code_label": "验证码", + "account_basics_phone_numbers_dialog_code_placeholder": "例如:123456", + "account_basics_phone_numbers_dialog_check_verification_button": "确认码", + "account_basics_phone_numbers_dialog_channel_sms": "短信", + "account_basics_phone_numbers_dialog_channel_call": "拨打", + "publish_dialog_call_reset": "清空拨号", + "account_basics_phone_numbers_no_phone_numbers_yet": "无可执行的电话号码", + "account_basics_phone_numbers_dialog_title": "添加电话号码", + "account_basics_phone_numbers_copied_to_clipboard": "电话号码已复制到剪贴板", + "account_basics_phone_numbers_dialog_number_label": "电话号码", + "account_basics_phone_numbers_dialog_number_placeholder": "例如:+1222333444", + "account_usage_calls_title": "已拨打电话", + "account_usage_calls_none": "此帐号无法拨打电话", + "account_upgrade_dialog_tier_features_reservations_one": "一条保留主题", + "account_upgrade_dialog_tier_features_emails_one": "一封每日邮件", + "account_upgrade_dialog_tier_features_calls_one": "一通每日电话", + "account_basics_phone_numbers_dialog_verify_button_sms": "发送信息", + "account_basics_phone_numbers_dialog_verify_button_call": "拨打电话", + "account_upgrade_dialog_tier_features_messages_one": "一条每日消息", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} 通每日电话", + "account_upgrade_dialog_tier_features_no_calls": "无电话呼叫" } From f77958fc358dcd59122ad02318ada336d71bed7c Mon Sep 17 00:00:00 2001 From: Erik S Date: Tue, 15 Aug 2023 04:02:23 +0000 Subject: [PATCH 010/182] Translated using Weblate (Russian) Currently translated at 95.5% (365 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ru/ --- web/public/static/langs/ru.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ru.json b/web/public/static/langs/ru.json index 9633d97d..d2c8d7fc 100644 --- a/web/public/static/langs/ru.json +++ b/web/public/static/langs/ru.json @@ -352,5 +352,16 @@ "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} в год. Оплата помесячно.", "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} ежегодно. Сэкономьте {{save}}.", "account_upgrade_dialog_billing_contact_email": "По вопросам оплаты, пожалуйста свяжитесь с нами.", - "account_upgrade_dialog_billing_contact_website": "По вопросам оплаты, пожалуйста обратитесь к нашему сайту." + "account_upgrade_dialog_billing_contact_website": "По вопросам оплаты, пожалуйста обратитесь к нашему сайту.", + "publish_dialog_call_reset": "Удалить вызов", + "account_basics_phone_numbers_dialog_description": "Для использования уведомлений необходимо добавить и подтвердить хотя бы один номер телефона. Проверить можно используя SMS или звонок.", + "account_basics_phone_numbers_dialog_title": "Добавить номер телефона", + "account_basics_phone_numbers_dialog_number_placeholder": "например +1222333444", + "account_basics_phone_numbers_dialog_code_placeholder": "например 123456", + "account_basics_phone_numbers_dialog_verify_button_sms": "Отправить SMS", + "account_usage_calls_title": "Совершённые вызовы", + "account_usage_calls_none": "Невозможно совершать вызовы с этим аккаунтом", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Нет проверенных номеров", + "account_basics_phone_numbers_copied_to_clipboard": "Номер телефона скопирован в буфер обмена", + "account_upgrade_dialog_tier_features_no_calls": "Нет вызовов" } From 3e3b556108209eeab3410188e6f6cc14d425a4d8 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 21:42:40 +0200 Subject: [PATCH 011/182] Fix excess token deletion bug --- docs/releases.md | 3 +- go.mod | 30 +- go.sum | 30 ++ user/manager.go | 5 +- user/manager_test.go | 66 +++- web/package-lock.json | 837 +++++++++++++++++++++++++----------------- 6 files changed, 591 insertions(+), 380 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 4cdbb312..9cee59af 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1260,9 +1260,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** -* Fix issues with date/time with different locales ([#700](https://github.com/binwiederhier/ntfy/issues/700), thanks to [@nimbleghost](https://github.com/nimbleghost)) +* Fix issues with date/time with different locales ([#700](https://github.com/binwiederhier/ntfy/issues/700), thanks to [@nimbleghost](https://github.com/nimbleghost)) * Re-init i18n on each service worker message to avoid missing translations ([#817](https://github.com/binwiederhier/ntfy/pull/817), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * You can now unset the default user:pass/token in `client.yml` for an individual subscription to remove the Authorization header ([#829](https://github.com/binwiederhier/ntfy/issues/829), thanks to [@tomeon](https://github.com/tomeon) for reporting and to [@wunter8](https://github.com/wunter8) for fixing) +* Fixes issue with tokens getting deleted in certain cases ([#838](https://github.com/binwiederhier/ntfy/issues/838)) ### ntfy Android app v1.16.1 (UNRELEASED) diff --git a/go.mod b/go.mod index 1f17fcac..d46c3deb 100644 --- a/go.mod +++ b/go.mod @@ -4,22 +4,22 @@ go 1.18 require ( cloud.google.com/go/firestore v1.12.0 // indirect - cloud.google.com/go/storage v1.31.0 // indirect + cloud.google.com/go/storage v1.32.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/emersion/go-smtp v0.17.0 + github.com/emersion/go-smtp v0.18.0 github.com/gabriel-vasile/mimetype v1.4.2 github.com/gorilla/websocket v1.5.0 github.com/mattn/go-sqlite3 v1.14.17 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 - golang.org/x/crypto v0.11.0 - golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/crypto v0.12.0 + golang.org/x/oauth2 v0.11.0 // indirect golang.org/x/sync v0.3.0 - golang.org/x/term v0.10.0 + golang.org/x/term v0.11.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.134.0 + google.golang.org/api v0.137.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -29,14 +29,14 @@ require ( firebase.google.com/go/v4 v4.12.0 github.com/SherClockHolmes/webpush-go v1.2.0 github.com/prometheus/client_golang v1.16.0 - github.com/stripe/stripe-go/v74 v74.28.0 + github.com/stripe/stripe-go/v74 v74.30.0 ) require ( cloud.google.com/go v0.110.7 // indirect cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/iam v1.1.2 // indirect cloud.google.com/go/longrunning v0.5.1 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect @@ -49,7 +49,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.4 // indirect + github.com/google/s2a-go v0.1.5 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect @@ -63,15 +63,15 @@ require ( github.com/stretchr/objx v0.5.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.13.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine/v2 v2.0.4 // indirect - google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf // indirect + google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect google.golang.org/grpc v1.57.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 6775fa86..3c804522 100644 --- a/go.sum +++ b/go.sum @@ -18,10 +18,14 @@ cloud.google.com/go/firestore v1.12.0 h1:aeEA/N7DW7+l2u5jtkO8I0qv0D95YwjggD8kUHr cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= +cloud.google.com/go/storage v1.32.0 h1:5w6DxEGOnktmJHarxAOUywxVW9lbNWIzlzzUltG/3+o= +cloud.google.com/go/storage v1.32.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.11.0 h1:szjBoiF33A2FavRLIDZjW1mw+OsW/XAtHoYNIqWOjRk= firebase.google.com/go/v4 v4.11.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= @@ -62,6 +66,8 @@ github.com/emersion/go-smtp v0.16.0 h1:eB9CY9527WdEZSs5sWisTmilDX7gG+Q/2IdRcmubp github.com/emersion/go-smtp v0.16.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/emersion/go-smtp v0.17.0 h1:tq90evlrcyqRfE6DSXaWVH54oX6OuZOQECEmhWBMEtI= github.com/emersion/go-smtp v0.17.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= +github.com/emersion/go-smtp v0.18.0 h1:lrVQqB0JdxYjC8CsBt55pSwB756bRRN6vK0DSr0pXfM= +github.com/emersion/go-smtp v0.18.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -109,6 +115,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= +github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -165,6 +173,8 @@ github.com/stripe/stripe-go/v74 v74.25.0 h1:mGJp9L1ymxjFvq5MlmG6ynv/fAGX6LLU8MyM github.com/stripe/stripe-go/v74 v74.25.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/stripe/stripe-go/v74 v74.28.0 h1:ItzPPy+cjMKbR3Oihknt/8dv6PANp3hTThUGZjhF9lc= github.com/stripe/stripe-go/v74 v74.28.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= +github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= +github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= @@ -182,6 +192,8 @@ golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -207,12 +219,16 @@ golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= 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= @@ -232,12 +248,16 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -246,6 +266,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -266,6 +288,8 @@ google.golang.org/api v0.130.0 h1:A50ujooa1h9iizvfzA4rrJr2B7uRmWexwbekQ2+5FPQ= google.golang.org/api v0.130.0/go.mod h1:J/LCJMYSDFvAVREGCbrESb53n4++NMBDetSHGL5I5RY= google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= +google.golang.org/api v0.137.0 h1:QrKX6uNvzJLr0Fd3vWVqcyrcmFoYi036VUAsZbiF4+s= +google.golang.org/api v0.137.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= 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.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= @@ -284,18 +308,24 @@ google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIY google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf h1:v5Cf4E9+6tawYrs/grq1q1hFpGtzlGFzgWHqwt6NFiU= google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJgEqUQYGDGgbwmhjoAOz8kO/ajxefY= +google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 h1:s5YSX+ZH5b5vS9rnpGymvIyMpLRJizowqDlOuyjXnTk= google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf h1:xkVZ5FdZJF4U82Q/JS+DcZA83s/GRVL+QrFMlexk9Yo= google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 h1:WGq4lvB/mlicysM/dUT3SBvijH4D3sm/Ny1A4wmt2CI= +google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529 h1:DEH99RbiLZhMxrpEJCZ0A+wdTe0EOgou/poSLx9vWf4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf h1:guOdSPaeFgN+jEJwTo1dQ71hdBm+yKSCCKuTRkJzcVo= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff --git a/user/manager.go b/user/manager.go index 87b385e6..7f3b8b1d 100644 --- a/user/manager.go +++ b/user/manager.go @@ -262,7 +262,8 @@ const ( deleteExpiredTokensQuery = `DELETE FROM user_token WHERE expires > 0 AND expires < ?` deleteExcessTokensQuery = ` DELETE FROM user_token - WHERE (user_id, token) NOT IN ( + WHERE user_id = ? + AND (user_id, token) NOT IN ( SELECT user_id, token FROM user_token WHERE user_id = ? @@ -534,7 +535,7 @@ func (a *Manager) CreateToken(userID, label string, expires time.Time, origin ne if tokenCount >= tokenMaxCount { // This pruning logic is done in two queries for efficiency. The SELECT above is a lookup // on two indices, whereas the query below is a full table scan. - if _, err := tx.Exec(deleteExcessTokensQuery, userID, tokenMaxCount); err != nil { + if _, err := tx.Exec(deleteExcessTokensQuery, userID, userID, tokenMaxCount); err != nil { return nil, err } } diff --git a/user/manager_test.go b/user/manager_test.go index 85e3c428..3c30a716 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -580,46 +580,80 @@ func TestManager_Token_Extend(t *testing.T) { } func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { + // Tests that tokens are automatically deleted when the maximum number of tokens is reached + a := newTestManager(t, PermissionDenyAll) require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser)) - // Try to extend token for user without token - u, err := a.User("ben") + ben, err := a.User("ben") require.Nil(t, err) - // Tokens + phil, err := a.User("phil") + require.Nil(t, err) + + // Create 2 tokens for phil + philTokens := make([]string, 0) + token, err := a.CreateToken(phil.ID, "", time.Now().Add(72*time.Hour), netip.IPv4Unspecified()) + require.Nil(t, err) + require.NotEmpty(t, token.Value) + philTokens = append(philTokens, token.Value) + + token, err = a.CreateToken(phil.ID, "", time.Unix(0, 0), netip.IPv4Unspecified()) + require.Nil(t, err) + require.NotEmpty(t, token.Value) + philTokens = append(philTokens, token.Value) + + // Create 22 tokens for ben (only 20 allowed!) baseTime := time.Now().Add(24 * time.Hour) - tokens := make([]string, 0) - for i := 0; i < 22; i++ { - token, err := a.CreateToken(u.ID, "", time.Now().Add(72*time.Hour), netip.IPv4Unspecified()) + benTokens := make([]string, 0) + for i := 0; i < 22; i++ { // + token, err := a.CreateToken(ben.ID, "", time.Now().Add(72*time.Hour), netip.IPv4Unspecified()) require.Nil(t, err) require.NotEmpty(t, token.Value) - tokens = append(tokens, token.Value) + benTokens = append(benTokens, token.Value) // Manually modify expiry date to avoid sorting issues (this is a hack) _, err = a.db.Exec(`UPDATE user_token SET expires=? WHERE token=?`, baseTime.Add(time.Duration(i)*time.Minute).Unix(), token.Value) require.Nil(t, err) } - _, err = a.AuthenticateToken(tokens[0]) + // Ben: The first 2 tokens should have been wiped and should not work anymore! + _, err = a.AuthenticateToken(benTokens[0]) require.Equal(t, ErrUnauthenticated, err) - _, err = a.AuthenticateToken(tokens[1]) + _, err = a.AuthenticateToken(benTokens[1]) require.Equal(t, ErrUnauthenticated, err) + // Ben: The other tokens should still work for i := 2; i < 22; i++ { - userWithToken, err := a.AuthenticateToken(tokens[i]) - require.Nil(t, err, "token[%d]=%s failed", i, tokens[i]) + userWithToken, err := a.AuthenticateToken(benTokens[i]) + require.Nil(t, err, "token[%d]=%s failed", i, benTokens[i]) require.Equal(t, "ben", userWithToken.Name) - require.Equal(t, tokens[i], userWithToken.Token) + require.Equal(t, benTokens[i], userWithToken.Token) } - var count int - rows, err := a.db.Query(`SELECT COUNT(*) FROM user_token`) + // Phil: All tokens should still work + for i := 0; i < 2; i++ { + userWithToken, err := a.AuthenticateToken(philTokens[i]) + require.Nil(t, err, "token[%d]=%s failed", i, philTokens[i]) + require.Equal(t, "phil", userWithToken.Name) + require.Equal(t, philTokens[i], userWithToken.Token) + } + + var benCount int + rows, err := a.db.Query(`SELECT COUNT(*) FROM user_token WHERE user_id=?`, ben.ID) require.Nil(t, err) require.True(t, rows.Next()) - require.Nil(t, rows.Scan(&count)) - require.Equal(t, 20, count) + require.Nil(t, rows.Scan(&benCount)) + require.Equal(t, 20, benCount) + + var philCount int + rows, err = a.db.Query(`SELECT COUNT(*) FROM user_token WHERE user_id=?`, phil.ID) + require.Nil(t, err) + require.True(t, rows.Next()) + require.Nil(t, rows.Scan(&philCount)) + require.Equal(t, 2, philCount) } func TestManager_EnqueueStats_ResetStats(t *testing.T) { diff --git a/web/package-lock.json b/web/package-lock.json index f9ab3153..735fc42b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -68,11 +68,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -88,21 +89,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -118,12 +119,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -145,21 +146,21 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", + "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", @@ -170,15 +171,12 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -424,40 +422,40 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", - "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -465,9 +463,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -520,22 +518,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -787,14 +769,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", - "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", + "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -837,9 +819,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", + "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -924,9 +906,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", + "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1293,9 +1275,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", - "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", + "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1404,13 +1386,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1511,9 +1493,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1574,13 +1556,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", + "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", @@ -1605,15 +1587,15 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.5", "@babel/plugin-transform-classes": "^7.22.6", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.5", @@ -1636,27 +1618,27 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.5", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-optional-chaining": "^7.22.10", "@babel/plugin-transform-parameters": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.5", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1668,14 +1650,12 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, @@ -1690,11 +1670,11 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -1715,19 +1695,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1736,9 +1716,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -1892,9 +1872,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", "cpu": [ "arm" ], @@ -1908,9 +1888,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", "cpu": [ "arm64" ], @@ -1924,9 +1904,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", "cpu": [ "x64" ], @@ -1940,9 +1920,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], @@ -1956,9 +1936,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", "cpu": [ "x64" ], @@ -1972,9 +1952,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", "cpu": [ "arm64" ], @@ -1988,9 +1968,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", "cpu": [ "x64" ], @@ -2004,9 +1984,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", "cpu": [ "arm" ], @@ -2020,9 +2000,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ "arm64" ], @@ -2036,9 +2016,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", "cpu": [ "ia32" ], @@ -2052,9 +2032,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", "cpu": [ "loong64" ], @@ -2068,9 +2048,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", "cpu": [ "mips64el" ], @@ -2084,9 +2064,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", "cpu": [ "ppc64" ], @@ -2100,9 +2080,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", "cpu": [ "riscv64" ], @@ -2116,9 +2096,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", "cpu": [ "s390x" ], @@ -2132,9 +2112,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", "cpu": [ "x64" ], @@ -2148,9 +2128,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", "cpu": [ "x64" ], @@ -2164,9 +2144,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", "cpu": [ "x64" ], @@ -2180,9 +2160,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "cpu": [ "x64" ], @@ -2196,9 +2176,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "cpu": [ "arm64" ], @@ -2212,9 +2192,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "cpu": [ "ia32" ], @@ -2228,9 +2208,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], @@ -2268,9 +2248,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2291,9 +2271,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2318,9 +2298,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2374,9 +2354,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2408,21 +2388,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@mapbox/hast-util-table-cell-style": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", @@ -2435,14 +2409,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.9", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.9.tgz", - "integrity": "sha512-gm6gnPnc/lS5Z3neH0iuOrK7IbS02+oh6KsMtXYLhI6bJpHs+PNWFsBmISx7x4FSPVJZvZkb8Bw6pEXpIMFt7Q==", + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", + "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", "dependencies": { "@babel/runtime": "^7.22.6", "@emotion/is-prop-valid": "^1.2.1", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.3", + "@mui/utils": "^5.14.5", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1", @@ -2467,9 +2441,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.3.tgz", - "integrity": "sha512-QxvrcDqphZoXRjsAmCaQylmWjC/8/qKWwIde1MJMna5YIst3R9O0qhKRPu36/OE2d8AeTbCVjRcRvNqhhW8jyg==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", + "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" @@ -2501,16 +2475,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.3.tgz", - "integrity": "sha512-dlu4SOcCp9Cy+wkcfZ/ns9ZkP40nr/WPgqxX0HmrE0o+dkE1ropY9BbHsLrTlYJCko8yzcC8bLghrD4xqZG1og==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", + "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", "dependencies": { "@babel/runtime": "^7.22.6", - "@mui/base": "5.0.0-beta.9", - "@mui/core-downloads-tracker": "^5.14.3", - "@mui/system": "^5.14.3", + "@mui/base": "5.0.0-beta.11", + "@mui/core-downloads-tracker": "^5.14.5", + "@mui/system": "^5.14.5", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.3", + "@mui/utils": "^5.14.5", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2545,12 +2519,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.13.7", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz", - "integrity": "sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", + "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", "dependencies": { - "@babel/runtime": "^7.22.5", - "@mui/utils": "^5.13.7", + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.5", "prop-types": "^15.8.1" }, "engines": { @@ -2602,15 +2576,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.3.tgz", - "integrity": "sha512-b+C+j9+75+/iIYSa+1S4eCMc9MDNrj9hzWfExJqS2GffuNocRagjBZFyjtMqsLWLxMxQIX8Cg6j0hAioiw+WfQ==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", + "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", "dependencies": { "@babel/runtime": "^7.22.6", - "@mui/private-theming": "^5.13.7", + "@mui/private-theming": "^5.14.5", "@mui/styled-engine": "^5.13.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.3", + "@mui/utils": "^5.14.5", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,9 +2628,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.3.tgz", - "integrity": "sha512-gZ6Etw+ppO43GYc1HFZSLjwd4DoZoa+RrYTD25wQLfzcSoPjVoC/zZqA2Lkq0zjgwGBQOSxKZI6jfp9uXR+kgw==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", + "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", "dependencies": { "@babel/runtime": "^7.22.6", "@types/prop-types": "^15.7.5", @@ -2720,11 +2694,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", - "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { @@ -2760,9 +2734,9 @@ } }, "node_modules/@types/node": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.6.tgz", - "integrity": "sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", "dev": true }, "node_modules/@types/parse-json": { @@ -2776,9 +2750,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", - "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3048,6 +3022,15 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -3249,9 +3232,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001519", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", - "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", "dev": true, "funding": [ { @@ -3567,9 +3550,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.482", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.482.tgz", - "integrity": "sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==", + "version": "1.4.495", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", + "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==", "dev": true }, "node_modules/emoji-regex": { @@ -3647,6 +3630,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", + "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -3688,9 +3693,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -3700,28 +3705,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/escalade": { @@ -3745,15 +3750,15 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3764,7 +3769,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -3851,14 +3856,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -3949,23 +3954,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", @@ -3997,15 +3985,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", - "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -4083,9 +4072,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4144,9 +4133,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4888,6 +4877,21 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4951,9 +4955,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dependencies": { "has": "^1.0.3" }, @@ -4994,6 +4998,33 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5015,6 +5046,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -5108,6 +5148,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -5177,6 +5226,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5189,6 +5247,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -5201,6 +5272,19 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -6053,9 +6137,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", "dev": true, "funding": [ { @@ -6272,29 +6356,29 @@ } }, "node_modules/react-router": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", - "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", "dependencies": { - "@remix-run/router": "1.7.2" + "@remix-run/router": "1.8.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", - "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", "dependencies": { - "@remix-run/router": "1.7.2", - "react-router": "6.14.2" + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -6316,6 +6400,26 @@ "react-dom": ">=16.6.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -6335,14 +6439,14 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -6450,11 +6554,11 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6499,9 +6603,9 @@ } }, "node_modules/rollup": { - "version": "3.27.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.1.tgz", - "integrity": "sha512-tXNDFwOkN6C2w5Blj1g6ForKeFw6c1mDu5jxoeDO3/pmYjgt+8yvIFjKzH5FQUq70OKZBkOt0zzv0THXL7vwzQ==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -7354,14 +7458,14 @@ } }, "node_modules/vite": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.8.tgz", - "integrity": "sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", - "postcss": "^8.4.26", - "rollup": "^3.25.2" + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -7491,6 +7595,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", From 67459650d4a8a187f6ccd42eb17732365e1900e0 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 21:59:24 +0200 Subject: [PATCH 012/182] Release notes --- docs/releases.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index 9cee59af..160c5d5d 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1265,6 +1265,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * You can now unset the default user:pass/token in `client.yml` for an individual subscription to remove the Authorization header ([#829](https://github.com/binwiederhier/ntfy/issues/829), thanks to [@tomeon](https://github.com/tomeon) for reporting and to [@wunter8](https://github.com/wunter8) for fixing) * Fixes issue with tokens getting deleted in certain cases ([#838](https://github.com/binwiederhier/ntfy/issues/838)) +**Documentation:** + +* Update docs for Apache config ([#819](https://github.com/binwiederhier/ntfy/pull/819), thanks to [@nisbet-hubbard](https://github.com/nisbet-hubbard)) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From bc4d4f424a7b4f7d30e7c2fd4159e51dc2c1b290 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 22:05:51 +0200 Subject: [PATCH 013/182] Pin go-smtp v0.17.0 --- go.mod | 4 ++- go.sum | 86 ++-------------------------------------------------------- 2 files changed, 5 insertions(+), 85 deletions(-) diff --git a/go.mod b/go.mod index d46c3deb..1560c61d 100644 --- a/go.mod +++ b/go.mod @@ -19,10 +19,12 @@ require ( golang.org/x/sync v0.3.0 golang.org/x/term v0.11.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.137.0 + google.golang.org/api v0.138.0 gopkg.in/yaml.v2 v2.4.0 ) +replace github.com/emersion/go-smtp => github.com/emersion/go-smtp v0.17.0 // Pin version due to breaking changes, see #839 + require github.com/pkg/errors v0.9.1 // indirect require ( diff --git a/go.sum b/go.sum index 3c804522..c6761a56 100644 --- a/go.sum +++ b/go.sum @@ -1,33 +1,19 @@ 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.110.3 h1:wwearW+L7sAPSomPIgJ3bVn6Ck00HGQnn5HMLwf0azo= -cloud.google.com/go v0.110.3/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.11.0 h1:PPgtwcYUOXV2jFe1bV3nda3RCrOa8cvBjTOn2MQVfW8= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/firestore v1.12.0 h1:aeEA/N7DW7+l2u5jtkO8I0qv0D95YwjggD8kUHrTHO4= cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/storage v1.31.0 h1:+S3LjjEN2zZ+L5hOwj4+1OkGCsLVe0NzpXKQ1pSdTCI= -cloud.google.com/go/storage v1.31.0/go.mod h1:81ams1PrhW16L4kF7qg+4mTq7SRs5HsbDTM0bWvrwJ0= cloud.google.com/go/storage v1.32.0 h1:5w6DxEGOnktmJHarxAOUywxVW9lbNWIzlzzUltG/3+o= cloud.google.com/go/storage v1.32.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= -firebase.google.com/go/v4 v4.11.0 h1:szjBoiF33A2FavRLIDZjW1mw+OsW/XAtHoYNIqWOjRk= -firebase.google.com/go/v4 v4.11.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= firebase.google.com/go/v4 v4.12.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= @@ -62,12 +48,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead h1:fI1Jck0vUrXT8bnphprS1EoVRe2Q5CKCX8iDlpqjQ/Y= github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= -github.com/emersion/go-smtp v0.16.0 h1:eB9CY9527WdEZSs5sWisTmilDX7gG+Q/2IdRcmubpa8= -github.com/emersion/go-smtp v0.16.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/emersion/go-smtp v0.17.0 h1:tq90evlrcyqRfE6DSXaWVH54oX6OuZOQECEmhWBMEtI= github.com/emersion/go-smtp v0.17.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= -github.com/emersion/go-smtp v0.18.0 h1:lrVQqB0JdxYjC8CsBt55pSwB756bRRN6vK0DSr0pXfM= -github.com/emersion/go-smtp v0.18.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -113,8 +95,6 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -122,8 +102,6 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -149,8 +127,6 @@ github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUo github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -167,12 +143,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stripe/stripe-go/v74 v74.24.0 h1:h+hXEI5avC5moAh2YLtphMFTBnp11TfXTcP4suuWDLk= -github.com/stripe/stripe-go/v74 v74.24.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= -github.com/stripe/stripe-go/v74 v74.25.0 h1:mGJp9L1ymxjFvq5MlmG6ynv/fAGX6LLU8MyMVsiRAMY= -github.com/stripe/stripe-go/v74 v74.25.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= -github.com/stripe/stripe-go/v74 v74.28.0 h1:ItzPPy+cjMKbR3Oihknt/8dv6PANp3hTThUGZjhF9lc= -github.com/stripe/stripe-go/v74 v74.28.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= @@ -188,10 +158,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -213,20 +179,10 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= -golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -246,16 +202,10 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -264,8 +214,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -282,48 +230,22 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.129.0 h1:2XbdjjNfFPXQyufzQVwPf1RRnHH8Den2pfNE2jw7L8w= -google.golang.org/api v0.129.0/go.mod h1:dFjiXlanKwWE3612X97llhsoI36FAoIiRj3aTl5b/zE= -google.golang.org/api v0.130.0 h1:A50ujooa1h9iizvfzA4rrJr2B7uRmWexwbekQ2+5FPQ= -google.golang.org/api v0.130.0/go.mod h1:J/LCJMYSDFvAVREGCbrESb53n4++NMBDetSHGL5I5RY= -google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= -google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= -google.golang.org/api v0.137.0 h1:QrKX6uNvzJLr0Fd3vWVqcyrcmFoYi036VUAsZbiF4+s= -google.golang.org/api v0.137.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= +google.golang.org/api v0.138.0 h1:K/tVp05MxNVbHShRw9m7e9VJGdagNeTdMzqPH7AUqr0= +google.golang.org/api v0.138.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= 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.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine/v2 v2.0.3 h1:AyY/mipuqiyCIAqOevfmu5fMDc5/9P/QggWfCQYdkSA= -google.golang.org/appengine/v2 v2.0.3/go.mod h1:2Z0TTdcXxnHdXzmp8drrmOExUDM2WQgyT33c6JDUlJM= google.golang.org/appengine/v2 v2.0.4 h1:aAAPYixP9EfTJjNO6F46afaxp+jfzb0VgwVjMeLBtF4= google.golang.org/appengine/v2 v2.0.4/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529 h1:9JucMWR7sPvCxUFd6UsOUNmA5kCcWOfORaT3tpAsKQs= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf h1:v5Cf4E9+6tawYrs/grq1q1hFpGtzlGFzgWHqwt6NFiU= -google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJgEqUQYGDGgbwmhjoAOz8kO/ajxefY= google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 h1:s5YSX+ZH5b5vS9rnpGymvIyMpLRJizowqDlOuyjXnTk= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf h1:xkVZ5FdZJF4U82Q/JS+DcZA83s/GRVL+QrFMlexk9Yo= -google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 h1:WGq4lvB/mlicysM/dUT3SBvijH4D3sm/Ny1A4wmt2CI= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529 h1:DEH99RbiLZhMxrpEJCZ0A+wdTe0EOgou/poSLx9vWf4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf h1:guOdSPaeFgN+jEJwTo1dQ71hdBm+yKSCCKuTRkJzcVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -334,10 +256,6 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From 2f0ec88f40418660e5b99a7ad589d661d8c4ff6f Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 22:17:07 +0200 Subject: [PATCH 014/182] Release bump --- docs/install.md | 60 ++++++++++++++++++++++++------------------------ docs/releases.md | 37 ++++++++++++++--------------- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/docs/install.md b/docs/install.md index c7febac1..bc5b7a0d 100644 --- a/docs/install.md +++ b/docs/install.md @@ -29,37 +29,37 @@ deb/rpm packages. === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_amd64.tar.gz - tar zxvf ntfy_2.6.2_linux_amd64.tar.gz - sudo cp -a ntfy_2.6.2_linux_amd64/ntfy /usr/local/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.6.2_linux_amd64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.tar.gz + tar zxvf ntfy_2.7.0_linux_amd64.tar.gz + sudo cp -a ntfy_2.7.0_linux_amd64/ntfy /usr/local/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_amd64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv6.tar.gz - tar zxvf ntfy_2.6.2_linux_armv6.tar.gz - sudo cp -a ntfy_2.6.2_linux_armv6/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.6.2_linux_armv6/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.tar.gz + tar zxvf ntfy_2.7.0_linux_armv6.tar.gz + sudo cp -a ntfy_2.7.0_linux_armv6/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_armv6/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv7.tar.gz - tar zxvf ntfy_2.6.2_linux_armv7.tar.gz - sudo cp -a ntfy_2.6.2_linux_armv7/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.6.2_linux_armv7/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.tar.gz + tar zxvf ntfy_2.7.0_linux_armv7.tar.gz + sudo cp -a ntfy_2.7.0_linux_armv7/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_armv7/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_arm64.tar.gz - tar zxvf ntfy_2.6.2_linux_arm64.tar.gz - sudo cp -a ntfy_2.6.2_linux_arm64/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.6.2_linux_arm64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.tar.gz + tar zxvf ntfy_2.7.0_linux_arm64.tar.gz + sudo cp -a ntfy_2.7.0_linux_arm64/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_arm64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` @@ -109,7 +109,7 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_amd64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -117,7 +117,7 @@ Manually installing the .deb file: === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv6.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -125,7 +125,7 @@ Manually installing the .deb file: === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv7.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -133,7 +133,7 @@ Manually installing the .deb file: === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_arm64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -143,28 +143,28 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_amd64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv6" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv6.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv7/armhf" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_armv7.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "arm64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_linux_arm64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` @@ -194,18 +194,18 @@ NixOS also supports [declarative setup of the ntfy server](https://search.nixos. ## macOS The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. -To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_darwin_all.tar.gz), +To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_darwin_all.tar.gz), extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`). If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at `~/Library/Application Support/ntfy/client.yml` (sample included in the tarball). ```bash -curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_darwin_all.tar.gz > ntfy_2.6.2_darwin_all.tar.gz -tar zxvf ntfy_2.6.2_darwin_all.tar.gz -sudo cp -a ntfy_2.6.2_darwin_all/ntfy /usr/local/bin/ntfy +curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_darwin_all.tar.gz > ntfy_2.7.0_darwin_all.tar.gz +tar zxvf ntfy_2.7.0_darwin_all.tar.gz +sudo cp -a ntfy_2.7.0_darwin_all/ntfy /usr/local/bin/ntfy mkdir ~/Library/Application\ Support/ntfy -cp ntfy_2.6.2_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml +cp ntfy_2.7.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml ntfy --help ``` @@ -223,7 +223,7 @@ brew install ntfy ## Windows The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on Windows as well. -To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.6.2/ntfy_2.6.2_windows_amd64.zip), +To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_windows_amd64.zip), extract it and place the `ntfy.exe` binary somewhere in your `%Path%`. The default path for the client config file is at `%AppData%\ntfy\client.yml` (not created automatically, sample in the ZIP file). diff --git a/docs/releases.md b/docs/releases.md index 160c5d5d..c907b43d 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,25 @@ Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases) and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases). +### ntfy server v2.7.0 +Released August 17, 2023 + +**Features:** + +* Add support for [Markdown formatting](publish.md#markdown-formatting) in web app ([#310](https://github.com/binwiederhier/ntfy/issues/310), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) +* Add support for right-to-left languages (RTL) in the web app ([#663](https://github.com/binwiederhier/ntfy/issues/663), thanks to [@nimbleghost](https://github.com/nimbleghost)) + +**Bug fixes + maintenance:** + +* Fix issues with date/time with different locales ([#700](https://github.com/binwiederhier/ntfy/issues/700), thanks to [@nimbleghost](https://github.com/nimbleghost)) +* Re-init i18n on each service worker message to avoid missing translations ([#817](https://github.com/binwiederhier/ntfy/pull/817), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) +* You can now unset the default user:pass/token in `client.yml` for an individual subscription to remove the Authorization header ([#829](https://github.com/binwiederhier/ntfy/issues/829), thanks to [@tomeon](https://github.com/tomeon) for reporting and to [@wunter8](https://github.com/wunter8) for fixing) +* Fixes issue with tokens getting deleted in certain cases ([#838](https://github.com/binwiederhier/ntfy/issues/838)) + +**Documentation:** + +* Update docs for Apache config ([#819](https://github.com/binwiederhier/ntfy/pull/819), thanks to [@nisbet-hubbard](https://github.com/nisbet-hubbard)) + ## ntfy server v2.6.2 Released June 30, 2023 @@ -1251,24 +1270,6 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet -### ntfy server v2.7.0 (UNRELEASED) - -**Features:** - -* Add support for [Markdown formatting](publish.md#markdown-formatting) in web app ([#310](https://github.com/binwiederhier/ntfy/issues/310), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) -* Add support for right-to-left languages (RTL) in the web app ([#663](https://github.com/binwiederhier/ntfy/issues/663), thanks to [@nimbleghost](https://github.com/nimbleghost)) - -**Bug fixes + maintenance:** - -* Fix issues with date/time with different locales ([#700](https://github.com/binwiederhier/ntfy/issues/700), thanks to [@nimbleghost](https://github.com/nimbleghost)) -* Re-init i18n on each service worker message to avoid missing translations ([#817](https://github.com/binwiederhier/ntfy/pull/817), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) -* You can now unset the default user:pass/token in `client.yml` for an individual subscription to remove the Authorization header ([#829](https://github.com/binwiederhier/ntfy/issues/829), thanks to [@tomeon](https://github.com/tomeon) for reporting and to [@wunter8](https://github.com/wunter8) for fixing) -* Fixes issue with tokens getting deleted in certain cases ([#838](https://github.com/binwiederhier/ntfy/issues/838)) - -**Documentation:** - -* Update docs for Apache config ([#819](https://github.com/binwiederhier/ntfy/pull/819), thanks to [@nisbet-hubbard](https://github.com/nisbet-hubbard)) - ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From 5cf1da974accc3f7ef2f0f814a7b9832a6d968a7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 22:20:29 +0200 Subject: [PATCH 015/182] Thank you @skorokithakis for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1081f4f2..99989a46 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 0d395249ff2968595624190d47fd5c8772bd3b27 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 22:21:06 +0200 Subject: [PATCH 016/182] Thank you @eenturk for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 99989a46..abaddf42 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 99eef493d246cea4797a1e6ad4b9b334b4696274 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 22:23:06 +0200 Subject: [PATCH 017/182] Thank you @spirossi for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index abaddf42..6cc1adbe 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From d7db3950161881928d8de6ccd2b048c9d685e5c5 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 17 Aug 2023 23:06:52 +0200 Subject: [PATCH 018/182] Release note details --- docs/releases.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index c907b43d..4cc9b0b0 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -5,17 +5,30 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ### ntfy server v2.7.0 Released August 17, 2023 +This release ships Markdown support for the web app (not in the Android app yet), and adds support for +right-to-left languages (RTL) in the web app. It also fixes a few issues around date/time formatting, +internationalization support, a CLI auth bug. + +Furthermore, it fixes a security issue around access tokens getting erroneously deleted for other users +in a specific scenario. This was a denial-of-service-type security issue, since it **effectively allowed a +single user to deny access to all other users of a ntfy instance**. Please note that while tokens were +erroneously deleted, **nobody but the token owner ever had access to it.** Please refer to [the ticket](https://github.com/binwiederhier/ntfy/issues/838) +for details. **Please upgrade your ntfy instance if you run a multi-user system.** + **Features:** * Add support for [Markdown formatting](publish.md#markdown-formatting) in web app ([#310](https://github.com/binwiederhier/ntfy/issues/310), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * Add support for right-to-left languages (RTL) in the web app ([#663](https://github.com/binwiederhier/ntfy/issues/663), thanks to [@nimbleghost](https://github.com/nimbleghost)) +**Security:** ⚠️ + +* Fixes issue with access tokens getting deleted ([#838](https://github.com/binwiederhier/ntfy/issues/838)) + **Bug fixes + maintenance:** * Fix issues with date/time with different locales ([#700](https://github.com/binwiederhier/ntfy/issues/700), thanks to [@nimbleghost](https://github.com/nimbleghost)) * Re-init i18n on each service worker message to avoid missing translations ([#817](https://github.com/binwiederhier/ntfy/pull/817), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * You can now unset the default user:pass/token in `client.yml` for an individual subscription to remove the Authorization header ([#829](https://github.com/binwiederhier/ntfy/issues/829), thanks to [@tomeon](https://github.com/tomeon) for reporting and to [@wunter8](https://github.com/wunter8) for fixing) -* Fixes issue with tokens getting deleted in certain cases ([#838](https://github.com/binwiederhier/ntfy/issues/838)) **Documentation:** From a5f0670f7fd1bec255f1f784f14114f2f38cc29b Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Fri, 18 Aug 2023 22:44:52 +0200 Subject: [PATCH 019/182] ACLs and underscores, resolves #840 --- user/manager.go | 60 ++++++++++--- user/manager_test.go | 205 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 248 insertions(+), 17 deletions(-) diff --git a/user/manager.go b/user/manager.go index 7f3b8b1d..324b7684 100644 --- a/user/manager.go +++ b/user/manager.go @@ -160,7 +160,7 @@ const ( SELECT read, write FROM user_access a JOIN user u ON u.id = a.user_id - WHERE (u.user = ? OR u.user = ?) AND ? LIKE a.topic + WHERE (u.user = ? OR u.user = ?) AND ? LIKE a.topic ESCAPE '\' ORDER BY u.user DESC ` @@ -235,7 +235,7 @@ const ( selectOtherAccessCountQuery = ` SELECT COUNT(*) FROM user_access - WHERE (topic = ? OR ? LIKE topic) + WHERE (topic = ? OR ? LIKE topic ESCAPE '\') AND (owner_user_id IS NULL OR owner_user_id != (SELECT id FROM user WHERE user = ?)) ` deleteAllAccessQuery = `DELETE FROM user_access` @@ -312,7 +312,7 @@ const ( // Schema management queries const ( - currentSchemaVersion = 4 + currentSchemaVersion = 5 insertSchemaVersion = `INSERT INTO schemaVersion VALUES (1, ?)` updateSchemaVersion = `UPDATE schemaVersion SET version = ? WHERE id = 1` selectSchemaVersionQuery = `SELECT version FROM schemaVersion WHERE id = 1` @@ -422,6 +422,11 @@ const ( FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE ); ` + + // 4 -> 5 + migrate4To5UpdateQueries = ` + UPDATE user_access SET topic = REPLACE(topic, '_', '\_'); + ` ) var ( @@ -429,6 +434,7 @@ var ( 1: migrateFrom1, 2: migrateFrom2, 3: migrateFrom3, + 4: migrateFrom4, } ) @@ -1123,7 +1129,7 @@ func (a *Manager) Reservations(username string) ([]Reservation, error) { return nil, err } reservations = append(reservations, Reservation{ - Topic: topic, + Topic: unescapeUnderscore(topic), Owner: NewPermission(ownerRead, ownerWrite), Everyone: NewPermission(everyoneRead.Bool, everyoneWrite.Bool), // false if null }) @@ -1133,7 +1139,7 @@ func (a *Manager) Reservations(username string) ([]Reservation, error) { // HasReservation returns true if the given topic access is owned by the user func (a *Manager) HasReservation(username, topic string) (bool, error) { - rows, err := a.db.Query(selectUserHasReservationQuery, username, topic) + rows, err := a.db.Query(selectUserHasReservationQuery, username, escapeUnderscore(topic)) if err != nil { return false, err } @@ -1168,7 +1174,7 @@ func (a *Manager) ReservationsCount(username string) (int64, error) { // ReservationOwner returns user ID of the user that owns this topic, or an // empty string if it's not owned by anyone func (a *Manager) ReservationOwner(topic string) (string, error) { - rows, err := a.db.Query(selectUserReservationsOwnerQuery, topic) + rows, err := a.db.Query(selectUserReservationsOwnerQuery, escapeUnderscore(topic)) if err != nil { return "", err } @@ -1263,7 +1269,7 @@ func (a *Manager) AllowReservation(username string, topic string) error { if (!AllowedUsername(username) && username != Everyone) || !AllowedTopic(topic) { return ErrInvalidArgument } - rows, err := a.db.Query(selectOtherAccessCountQuery, topic, topic, username) + rows, err := a.db.Query(selectOtherAccessCountQuery, escapeUnderscore(topic), escapeUnderscore(topic), username) if err != nil { return err } @@ -1328,10 +1334,10 @@ func (a *Manager) AddReservation(username string, topic string, everyone Permiss return err } defer tx.Rollback() - if _, err := tx.Exec(upsertUserAccessQuery, username, topic, true, true, username, username); err != nil { + if _, err := tx.Exec(upsertUserAccessQuery, username, escapeUnderscore(topic), true, true, username, username); err != nil { return err } - if _, err := tx.Exec(upsertUserAccessQuery, Everyone, topic, everyone.IsRead(), everyone.IsWrite(), username, username); err != nil { + if _, err := tx.Exec(upsertUserAccessQuery, Everyone, escapeUnderscore(topic), everyone.IsRead(), everyone.IsWrite(), username, username); err != nil { return err } return tx.Commit() @@ -1354,10 +1360,10 @@ func (a *Manager) RemoveReservations(username string, topics ...string) error { } defer tx.Rollback() for _, topic := range topics { - if _, err := tx.Exec(deleteTopicAccessQuery, username, username, topic); err != nil { + if _, err := tx.Exec(deleteTopicAccessQuery, username, username, escapeUnderscore(topic)); err != nil { return err } - if _, err := tx.Exec(deleteTopicAccessQuery, Everyone, Everyone, topic); err != nil { + if _, err := tx.Exec(deleteTopicAccessQuery, Everyone, Everyone, escapeUnderscore(topic)); err != nil { return err } } @@ -1484,12 +1490,24 @@ func (a *Manager) Close() error { return a.db.Close() } +// toSQLWildcard converts a wildcard string to a SQL wildcard string. It only allows '*' as wildcards, +// and escapes '_', assuming '\' as escape character. func toSQLWildcard(s string) string { - return strings.ReplaceAll(s, "*", "%") + return escapeUnderscore(strings.ReplaceAll(s, "*", "%")) } +// fromSQLWildcard converts a SQL wildcard string to a wildcard string. It converts '%' to '*', +// and removes the '\_' escape character. func fromSQLWildcard(s string) string { - return strings.ReplaceAll(s, "%", "*") + return strings.ReplaceAll(unescapeUnderscore(s), "%", "*") +} + +func escapeUnderscore(s string) string { + return strings.ReplaceAll(s, "_", "\\_") +} + +func unescapeUnderscore(s string) string { + return strings.ReplaceAll(s, "\\_", "_") } func runStartupQueries(db *sql.DB, startupQueries string) error { @@ -1627,6 +1645,22 @@ func migrateFrom3(db *sql.DB) error { return tx.Commit() } +func migrateFrom4(db *sql.DB) error { + log.Tag(tag).Info("Migrating user database schema: from 4 to 5") + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + if _, err := tx.Exec(migrate4To5UpdateQueries); err != nil { + return err + } + if _, err := tx.Exec(updateSchemaVersion, 5); err != nil { + return err + } + return tx.Commit() +} + func nullString(s string) sql.NullString { if s == "" { return sql.NullString{} diff --git a/user/manager_test.go b/user/manager_test.go index 3c30a716..468dc36a 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -330,7 +330,7 @@ func TestManager_Reservations(t *testing.T) { a := newTestManager(t, PermissionDenyAll) require.Nil(t, a.AddUser("phil", "phil", RoleUser)) require.Nil(t, a.AddUser("ben", "ben", RoleUser)) - require.Nil(t, a.AddReservation("ben", "ztopic", PermissionDenyAll)) + require.Nil(t, a.AddReservation("ben", "ztopic_", PermissionDenyAll)) require.Nil(t, a.AddReservation("ben", "readme", PermissionRead)) require.Nil(t, a.AllowAccess("ben", "something-else", PermissionRead)) @@ -343,7 +343,7 @@ func TestManager_Reservations(t *testing.T) { Everyone: PermissionRead, }, reservations[0]) require.Equal(t, Reservation{ - Topic: "ztopic", + Topic: "ztopic_", Owner: PermissionReadWrite, Everyone: PermissionDenyAll, }, reservations[1]) @@ -352,6 +352,14 @@ func TestManager_Reservations(t *testing.T) { require.Nil(t, err) require.True(t, b) + b, err = a.HasReservation("ben", "ztopic_") + require.Nil(t, err) + require.True(t, b) + + b, err = a.HasReservation("ben", "ztopicX") // _ != X (used to be a SQL wildcard issue) + require.Nil(t, err) + require.False(t, b) + b, err = a.HasReservation("notben", "readme") require.Nil(t, err) require.False(t, b) @@ -371,11 +379,17 @@ func TestManager_Reservations(t *testing.T) { err = a.AllowReservation("phil", "readme") require.Equal(t, errTopicOwnedByOthers, err) + err = a.AllowReservation("phil", "ztopic_") + require.Equal(t, errTopicOwnedByOthers, err) + + err = a.AllowReservation("phil", "ztopicX") + require.Nil(t, err) + err = a.AllowReservation("phil", "not-reserved") require.Nil(t, err) // Now remove them again - require.Nil(t, a.RemoveReservations("ben", "ztopic", "readme")) + require.Nil(t, a.RemoveReservations("ben", "ztopic_", "readme")) count, err = a.ReservationsCount("ben") require.Nil(t, err) @@ -978,7 +992,44 @@ func TestUser_PhoneNumberAdd_Multiple_Users_Same_Number(t *testing.T) { require.Nil(t, a.AddPhoneNumber(ben.ID, "+1234567890")) } -func TestSqliteCache_Migration_From1(t *testing.T) { +func TestManager_Topic_Wildcard_With_Asterisk_Underscore(t *testing.T) { + f := filepath.Join(t.TempDir(), "user.db") + a := newTestManagerFromFile(t, f, "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) + require.Nil(t, a.AllowAccess(Everyone, "*_", PermissionRead)) + require.Nil(t, a.AllowAccess(Everyone, "__*_", PermissionRead)) + require.Nil(t, a.Authorize(nil, "allowed_", PermissionRead)) + require.Nil(t, a.Authorize(nil, "__allowed_", PermissionRead)) + require.Nil(t, a.Authorize(nil, "_allowed_", PermissionRead)) // The "%" in "%\_" matches the first "_" + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "notallowed", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "_notallowed", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "__notallowed", PermissionRead)) +} + +func TestManager_Topic_Wildcard_With_Underscore(t *testing.T) { + f := filepath.Join(t.TempDir(), "user.db") + a := newTestManagerFromFile(t, f, "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) + require.Nil(t, a.AllowAccess(Everyone, "mytopic_", PermissionReadWrite)) + require.Nil(t, a.Authorize(nil, "mytopic_", PermissionRead)) + require.Nil(t, a.Authorize(nil, "mytopic_", PermissionWrite)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "mytopicX", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "mytopicX", PermissionWrite)) +} + +func TestToFromSQLWildcard(t *testing.T) { + require.Equal(t, "up%", toSQLWildcard("up*")) + require.Equal(t, "up\\_%", toSQLWildcard("up_*")) + require.Equal(t, "foo", toSQLWildcard("foo")) + + require.Equal(t, "up*", fromSQLWildcard("up%")) + require.Equal(t, "up_*", fromSQLWildcard("up\\_%")) + require.Equal(t, "foo", fromSQLWildcard("foo")) + + require.Equal(t, "up*", fromSQLWildcard(toSQLWildcard("up*"))) + require.Equal(t, "up_*", fromSQLWildcard(toSQLWildcard("up_*"))) + require.Equal(t, "foo", fromSQLWildcard(toSQLWildcard("foo"))) +} + +func TestMigrationFrom1(t *testing.T) { filename := filepath.Join(t.TempDir(), "user.db") db, err := sql.Open("sqlite3", filename) require.Nil(t, err) @@ -1063,6 +1114,152 @@ func TestSqliteCache_Migration_From1(t *testing.T) { require.Equal(t, PermissionRead, everyoneGrants[0].Allow) } +func TestMigrationFrom4(t *testing.T) { + filename := filepath.Join(t.TempDir(), "user.db") + db, err := sql.Open("sqlite3", filename) + require.Nil(t, err) + + // Create "version 4" schema + _, err = db.Exec(` + BEGIN; + CREATE TABLE IF NOT EXISTS tier ( + id TEXT PRIMARY KEY, + code TEXT NOT NULL, + name TEXT NOT NULL, + messages_limit INT NOT NULL, + messages_expiry_duration INT NOT NULL, + emails_limit INT NOT NULL, + calls_limit INT NOT NULL, + reservations_limit INT NOT NULL, + attachment_file_size_limit INT NOT NULL, + attachment_total_size_limit INT NOT NULL, + attachment_expiry_duration INT NOT NULL, + attachment_bandwidth_limit INT NOT NULL, + stripe_monthly_price_id TEXT, + stripe_yearly_price_id TEXT + ); + CREATE UNIQUE INDEX idx_tier_code ON tier (code); + CREATE UNIQUE INDEX idx_tier_stripe_monthly_price_id ON tier (stripe_monthly_price_id); + CREATE UNIQUE INDEX idx_tier_stripe_yearly_price_id ON tier (stripe_yearly_price_id); + CREATE TABLE IF NOT EXISTS user ( + id TEXT PRIMARY KEY, + tier_id TEXT, + user TEXT NOT NULL, + pass TEXT NOT NULL, + role TEXT CHECK (role IN ('anonymous', 'admin', 'user')) NOT NULL, + prefs JSON NOT NULL DEFAULT '{}', + sync_topic TEXT NOT NULL, + stats_messages INT NOT NULL DEFAULT (0), + stats_emails INT NOT NULL DEFAULT (0), + stats_calls INT NOT NULL DEFAULT (0), + stripe_customer_id TEXT, + stripe_subscription_id TEXT, + stripe_subscription_status TEXT, + stripe_subscription_interval TEXT, + stripe_subscription_paid_until INT, + stripe_subscription_cancel_at INT, + created INT NOT NULL, + deleted INT, + FOREIGN KEY (tier_id) REFERENCES tier (id) + ); + CREATE UNIQUE INDEX idx_user ON user (user); + CREATE UNIQUE INDEX idx_user_stripe_customer_id ON user (stripe_customer_id); + CREATE UNIQUE INDEX idx_user_stripe_subscription_id ON user (stripe_subscription_id); + CREATE TABLE IF NOT EXISTS user_access ( + user_id TEXT NOT NULL, + topic TEXT NOT NULL, + read INT NOT NULL, + write INT NOT NULL, + owner_user_id INT, + PRIMARY KEY (user_id, topic), + FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE, + FOREIGN KEY (owner_user_id) REFERENCES user (id) ON DELETE CASCADE + ); + CREATE TABLE IF NOT EXISTS user_token ( + user_id TEXT NOT NULL, + token TEXT NOT NULL, + label TEXT NOT NULL, + last_access INT NOT NULL, + last_origin TEXT NOT NULL, + expires INT NOT NULL, + PRIMARY KEY (user_id, token), + FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE + ); + CREATE TABLE IF NOT EXISTS user_phone ( + user_id TEXT NOT NULL, + phone_number TEXT NOT NULL, + PRIMARY KEY (user_id, phone_number), + FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE + ); + CREATE TABLE IF NOT EXISTS schemaVersion ( + id INT PRIMARY KEY, + version INT NOT NULL + ); + INSERT INTO user (id, user, pass, role, sync_topic, created) + VALUES ('u_everyone', '*', '', 'anonymous', '', UNIXEPOCH()) + ON CONFLICT (id) DO NOTHING; + INSERT INTO schemaVersion (id, version) VALUES (1, 4); + COMMIT; + `) + require.Nil(t, err) + + // Insert a few ACL entries + _, err = db.Exec(` + BEGIN; + INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'mytopic_', 1, 1); + INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'up%', 1, 1); + INSERT INTO user_access (user_id, topic, read, write) values ('u_everyone', 'down_%', 1, 1); + COMMIT; + `) + require.Nil(t, err) + + // Create manager to trigger migration + a := newTestManagerFromFile(t, filename, "", PermissionDenyAll, bcrypt.MinCost, DefaultUserStatsQueueWriterInterval) + checkSchemaVersion(t, a.db) + + // Add another + require.Nil(t, a.AllowAccess(Everyone, "left_*", PermissionReadWrite)) + + // Check "external view" of grants + everyoneGrants, err := a.Grants(Everyone) + require.Nil(t, err) + + require.Equal(t, 4, len(everyoneGrants)) + require.Equal(t, "down_*", everyoneGrants[0].TopicPattern) + require.Equal(t, "left_*", everyoneGrants[1].TopicPattern) + require.Equal(t, "mytopic_", everyoneGrants[2].TopicPattern) + require.Equal(t, "up*", everyoneGrants[3].TopicPattern) + + // Check they are stored correctly in the database + rows, err := db.Query(`SELECT topic FROM user_access WHERE user_id = 'u_everyone' ORDER BY topic`) + require.Nil(t, err) + topicPatterns := make([]string, 0) + for rows.Next() { + var topicPattern string + require.Nil(t, rows.Scan(&topicPattern)) + topicPatterns = append(topicPatterns, topicPattern) + } + require.Nil(t, rows.Close()) + require.Equal(t, 4, len(topicPatterns)) + require.Equal(t, "down\\_%", topicPatterns[0]) + require.Equal(t, "left\\_%", topicPatterns[1]) + require.Equal(t, "mytopic\\_", topicPatterns[2]) + require.Equal(t, "up%", topicPatterns[3]) + + // Check that ACL works as excepted + require.Nil(t, a.Authorize(nil, "down_123", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "downX123", PermissionRead)) + + require.Nil(t, a.Authorize(nil, "left_abc", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "leftX123", PermissionRead)) + + require.Nil(t, a.Authorize(nil, "mytopic_", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(nil, "mytopicX", PermissionRead)) + + require.Nil(t, a.Authorize(nil, "up123", PermissionRead)) + require.Nil(t, a.Authorize(nil, "up", PermissionRead)) // % matches 0 or more characters +} + func checkSchemaVersion(t *testing.T, db *sql.DB) { rows, err := db.Query(`SELECT version FROM schemaVersion`) require.Nil(t, err) From 9015b278036a69b09d2ff5ccbf938be07c9cc4bd Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Fri, 18 Aug 2023 22:47:36 +0200 Subject: [PATCH 020/182] Release notes --- docs/releases.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 4cc9b0b0..70682131 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,7 +2,7 @@ Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases) and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases). -### ntfy server v2.7.0 +## ntfy server v2.7.0 Released August 17, 2023 This release ships Markdown support for the web app (not in the Android app yet), and adds support for @@ -1283,6 +1283,12 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet +### ntfy server v2.8.0 (UNRELEASED) + +**Bug fixes + maintenance:** + +* Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From 02dd72ba5760d99c1e628e2c5442922ec70aebf3 Mon Sep 17 00:00:00 2001 From: Nguyen Loc Date: Fri, 18 Aug 2023 03:16:37 +0000 Subject: [PATCH 021/182] Translated using Weblate (Vietnamese) Currently translated at 4.9% (19 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/vi/ --- web/public/static/langs/vi.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/vi.json b/web/public/static/langs/vi.json index 0967ef42..b2f94441 100644 --- a/web/public/static/langs/vi.json +++ b/web/public/static/langs/vi.json @@ -1 +1,21 @@ -{} +{ + "common_add": "Thêm", + "common_back": "Quay lại", + "signup_title": "Tạo tài khoản ntfy", + "signup_form_toggle_password_visibility": "Hiện mật khẩu", + "login_form_button_submit": "Đăng nhập", + "common_copy_to_clipboard": "Lưu vào clipboard", + "signup_form_username": "Tên user", + "signup_already_have_account": "Đã có tài khoản? Đăng nhập!", + "signup_disabled": "Đăng kí bị đóng", + "signup_error_username_taken": "Tên {{username}} đã được sử dụng", + "signup_error_creation_limit_reached": "Đã bị giới hạn tạo tài khoản", + "login_title": "Đăng nhập vào tài khoản ntfy", + "login_link_signup": "Đăng kí", + "login_disabled": "Đăng nhập bị đóng", + "action_bar_show_menu": "Hiện menu", + "signup_form_password": "Mật khẩu", + "action_bar_settings": "Cài đặt", + "signup_form_confirm_password": "Xác nhận mật khẩu", + "signup_form_button_submit": "Đăng kí" +} From 6f68c8cd1f67a51cf5df15ae9bfa4bc6cd54cf09 Mon Sep 17 00:00:00 2001 From: falkheiland Date: Tue, 22 Aug 2023 11:24:35 +0200 Subject: [PATCH 022/182] Update publish.md fixed PowerShell examples --- docs/publish.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/publish.md b/docs/publish.md index 2de0ff73..c03cc4a4 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -457,6 +457,7 @@ You can set the priority with the header `X-Priority` (or any of its aliases: `P === "PowerShell" ``` powershell $Request = @{ + Method = 'POST' URI = "https://ntfy.sh/phil_alerts" Headers = @{ Priority = "5" @@ -1033,7 +1034,7 @@ is the only required one: $Request = @{ Method = "POST" URI = "https://ntfy.sh" - Body = @{ + Body = ConvertTo-JSON @{ Topic = "mytopic" Title = "Low disk space alert" Message = "Disk space is low at 5.1 GB" @@ -1042,7 +1043,7 @@ is the only required one: FileName = "diskspace.jpg" Tags = @("warning", "cd") Click = "https://homecamera.lan/xasds1h2xsSsa/" - Actions = ConvertTo-JSON @( + Actions = @( @{ Action = "view" Label = "Admin panel" @@ -1919,10 +1920,10 @@ And the same example using [JSON publishing](#publish-as-json): $Request = @{ Method = "POST" URI = "https://ntfy.sh" - Body = @{ + Body = ConvertTo-Json -Depth 3 @{ Topic = "wifey" Message = "Your wife requested you send a picture of yourself." - Actions = ConvertTo-Json -Depth 3 @( + Actions = @( @{ Action = "broadcast" Label = "Take picture" @@ -2072,7 +2073,7 @@ Here's an example using the [`X-Actions` header](#using-a-header): 'method' => 'POST', 'header' => "Content-Type: text/plain\r\n" . - "Actions: http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}", + 'Actions: http, Close door, https://api.mygarage.lan/, method=PUT, headers.Authorization=Bearer zAzsx1sk.., body={\"action\": \"close\"}', 'content' => 'Garage door has been open for 15 minutes. Close it?' ] ])); @@ -2199,10 +2200,10 @@ And the same example using [JSON publishing](#publish-as-json): $Request = @{ Method = "POST" URI = "https://ntfy.sh" - Body = @{ + Body = ConvertTo-Json -Depth 3 @{ Topic = "myhome" Message = "Garage door has been open for 15 minutes. Close it?" - Actions = ConvertTo-Json -Depth 3 @( + Actions = @( @{ Action = "http" Label = "Close door" From 115e6e9cf8483ee53560d20dde6cf989aab313f6 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 24 Aug 2023 18:15:48 +0000 Subject: [PATCH 023/182] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 51.5% (197 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/nb_NO/ --- web/public/static/langs/nb_NO.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/nb_NO.json b/web/public/static/langs/nb_NO.json index 0dd9571b..bc7d387c 100644 --- a/web/public/static/langs/nb_NO.json +++ b/web/public/static/langs/nb_NO.json @@ -190,5 +190,10 @@ "error_boundary_unsupported_indexeddb_title": "Privat surfing støttes ikke", "action_bar_account": "Konto", "action_bar_profile_settings": "Innstillinger", - "nav_button_account": "Konto" + "nav_button_account": "Konto", + "signup_title": "Opprett en ntfy konto", + "signup_form_username": "Brukernavn", + "signup_form_password": "Passord", + "signup_form_button_submit": "Meld deg på", + "signup_form_confirm_password": "Bekreft passord" } From 45ca20dec9d10f862025f3d9efc105c7b011cc5a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 26 Aug 2023 09:26:54 +0200 Subject: [PATCH 024/182] Docs --- docs/integrations.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 57ae2c10..740d8c40 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -23,6 +23,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Platypush](https://docs.platypush.tech/platypush/plugins/ntfy.html) - Automation platform aimed to run on any device that can run Python - [diun](https://crazymax.dev/diun/) - Docker Image Update Notifier - [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server +- [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring ## Integration via HTTP/SMTP/etc. @@ -130,7 +131,8 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Blog + forum posts -- [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 9/2021 +- [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023 +- [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 7/2023 - [Basic website monitoring using cronjobs and ntfy.sh](https://burkhardt.dev/2023/website-monitoring-cron-ntfy/) - burkhardt.dev - 6/2023 - [Pingdom alternative in one line of curl through ntfy.sh](https://piqoni.bearblog.dev/uptime-monitoring-in-one-line-of-curl/) - bearblog.dev - 6/2023 - [#OpenSourceDiscovery 78: ntfy.sh](https://opensourcedisc.substack.com/p/opensourcediscovery-78-ntfysh) - opensourcedisc.substack.com - 6/2023 From 62c2ec0614f04a0f5256186fc296871326c27acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Sat, 26 Aug 2023 12:37:53 +0000 Subject: [PATCH 025/182] Translated using Weblate (Galician) Currently translated at 33.2% (127 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 130 +++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index 0967ef42..9c4efb18 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -1 +1,129 @@ -{} +{ + "common_cancel": "Cancelar", + "common_save": "Gardar", + "common_add": "Engadir", + "signup_disabled": "O rexistro está desactivado", + "signup_error_username_taken": "O identificador {{username}} xa está collido", + "login_title": "Accede á túa conta ntfy", + "action_bar_send_test_notification": "Enviar notificación de proba", + "action_bar_clear_notifications": "Limpar todas as notificacións", + "action_bar_unsubscribe": "Retirar subscrición", + "action_bar_profile_settings": "Axustes", + "message_bar_type_message": "Escribe aquí a mensaxe", + "notifications_copied_to_clipboard": "Copiada ao portapapeis", + "notifications_attachment_image": "Imaxe anexa", + "notifications_attachment_copy_url_title": "Copiar URL do anexo ao portapapeis", + "notifications_attachment_copy_url_button": "Copiar URL", + "notifications_attachment_open_title": "Ir a {{url}}", + "notifications_attachment_file_audio": "ficheiro de audio", + "notifications_attachment_file_app": "ficheiro de app Android", + "notifications_attachment_file_document": "outro documento", + "notifications_click_copy_url_title": "Copiar URL da ligazón ao portapapeis", + "notifications_click_copy_url_button": "Copiar ligazón", + "notifications_actions_open_url_title": "Ir a {{url}}", + "notifications_none_for_topic_description": "Para enviar notificacións a este tema, simplemente usa PUT ou POST co URL do tema.", + "notifications_no_subscriptions_description": "Preme en \"{{linktext}} para crear ou subscribirte a un tema. Após, podes enviar mensaxes vía PUT ou POST e recibirás aquí as notificacións.", + "display_name_dialog_description": "Establecer un nome alternativo para o tema que será mostrado na lista de subscrición. Isto axudará a identificar os temas que teñan nomes complicados.", + "publish_dialog_tags_label": "Etiquetas", + "publish_dialog_tags_placeholder": "Lista de etiquetas separadas por vírgulas, ex. aviso, tarefa1", + "publish_dialog_priority_label": "Prioridade", + "publish_dialog_click_label": "URL a premer", + "publish_dialog_click_placeholder": "URL que se abre ao premer na notificación", + "publish_dialog_click_reset": "Desbotar o URL a premer", + "common_back": "Atrás", + "common_copy_to_clipboard": "Copiar ao portapapeis", + "signup_title": "Crear unha conta ntfy", + "signup_form_username": "Identificador", + "signup_form_password": "Contrasinal", + "signup_form_confirm_password": "Confirmar contrasinal", + "signup_form_button_submit": "Crear conta", + "login_form_button_submit": "Acceder", + "login_link_signup": "Crear conta", + "login_disabled": "O acceso está desactivado", + "action_bar_show_menu": "Mostrar menú", + "action_bar_toggle_mute": "Acalar/Reactivar as notificacións", + "message_bar_error_publishing": "Erro ao publicar a notificación", + "message_bar_publish": "Publicar mensaxe", + "nav_topics_title": "Temas subscritos", + "nav_button_documentation": "Documentación", + "nav_button_publish_message": "Publicar notificación", + "nav_button_subscribe": "Subscribirse ao tema", + "nav_button_muted": "Notificacións acaladas", + "nav_button_connecting": "conectando", + "nav_upgrade_banner_label": "Mellorar a ntfy Pro", + "alert_not_supported_description": "O teu navegador non ten soporte para notificacións.", + "notifications_priority_x": "Prioridade {{priority}}", + "notifications_attachment_link_expires": "a ligazón caduca o {{date}}", + "notifications_attachment_link_expired": "a ligazón de descarga caducou", + "notifications_attachment_file_image": "ficheiro de imaxe", + "notifications_attachment_file_video": "ficheiro de vídeo", + "notifications_actions_not_supported": "Acción non soportada na aplicación web", + "notifications_actions_http_request_title": "Enviar HTTP {{method}} a {{url}}", + "notifications_none_for_topic_title": "Aínda non recibiches ningunha notificación para este tema.", + "reserve_dialog_checkbox_label": "Reservar tema e configurar acceso", + "notifications_loading": "Cargando notificacións…", + "publish_dialog_base_url_placeholder": "URL de servizo, ex. https://exemplo.com", + "publish_dialog_topic_label": "Nome do tema", + "publish_dialog_topic_placeholder": "Nome do tema, ex. alertas_equipo", + "publish_dialog_topic_reset": "Restablecer tema", + "publish_dialog_title_label": "Título", + "publish_dialog_title_placeholder": "Título das notificacións, ex. Alerta de reunión", + "publish_dialog_message_label": "Mensaxe", + "publish_dialog_message_placeholder": "Escribe aquí a mensaxe", + "publish_dialog_email_label": "Correo electrónico", + "signup_form_toggle_password_visibility": "Cambiar visibilidade do contrasinal", + "signup_already_have_account": "Xa tes unha conta? Accede!", + "signup_error_creation_limit_reached": "Acadouse o límite de creación de contas", + "action_bar_logo_alt": "logo ntfy", + "action_bar_settings": "Axustes", + "action_bar_account": "Conta", + "action_bar_change_display_name": "Cambiar nome público", + "action_bar_reservation_add": "Reservar tema", + "action_bar_reservation_edit": "Cambiar a reserva", + "action_bar_reservation_delete": "Desbotar a reserva", + "action_bar_reservation_limit_reached": "Acadouse o límite", + "action_bar_toggle_action_menu": "Abrir/Pechar menú de accións", + "action_bar_profile_title": "Perfil", + "action_bar_profile_logout": "Pechar sesión", + "action_bar_sign_in": "Acceder", + "action_bar_sign_up": "Crear conta", + "message_bar_show_dialog": "Mostrar diálogo para publicar", + "nav_button_all_notifications": "Todas as notificacións", + "nav_button_account": "Conta", + "nav_button_settings": "Axustes", + "nav_upgrade_banner_description": "Reserva temas, máis mensaxes e correos electrónicos así como anexos máis grandes", + "alert_grant_title": "As notificacións están desactivadas", + "alert_grant_description": "Concede permiso no navegador para mostrar notificacións de escritorio.", + "alert_grant_button": "Conceder agora", + "alert_not_supported_title": "Non hai soporte para notificacións", + "alert_not_supported_context_description": "Só hai soporte para notificacións ao usar HTTPS. Esta é unha limitación da API de Notificacións.", + "notifications_list": "Lista de notificacións", + "notifications_list_item": "Notificación", + "notifications_mark_read": "Marcar como lida", + "notifications_delete": "Eliminar", + "notifications_tags": "Etiquetas", + "notifications_new_indicator": "Nova notificación", + "notifications_attachment_open_button": "Abrir anexo", + "notifications_click_open_button": "Abrir ligazón", + "notifications_none_for_any_title": "Non recibiches ningunha notificación.", + "notifications_none_for_any_description": "Para enviar notificacións ao tema, simplemente usa PUT ou POST ao URL do tema. Aquí tes un exemplo usando un dos teus temas.", + "notifications_no_subscriptions_title": "Semella que aínda non tes subscricións.", + "notifications_example": "Exemplo", + "display_name_dialog_title": "Cambiar nonme público", + "display_name_dialog_placeholder": "Nome público", + "publish_dialog_title_topic": "Publicar en {{topic}}", + "publish_dialog_title_no_topic": "Publicar notificación", + "publish_dialog_progress_uploading": "Enviando…", + "publish_dialog_progress_uploading_detail": "Enviando {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Notificación publicada", + "publish_dialog_attachment_limits_file_and_quota_reached": "supera o límite de ficheiros e cota {{fileSizeLimit}}, quedan {{remainingBytes}}", + "publish_dialog_attachment_limits_file_reached": "supera o límite para ficheiros {{fileSizeLimit}}", + "publish_dialog_attachment_limits_quota_reached": "supera a cota, quedan {{remainingBytes}}", + "publish_dialog_emoji_picker_show": "Elixe emoji", + "publish_dialog_priority_min": "Prioridade Mínima", + "publish_dialog_priority_low": "Prioridade baixa", + "publish_dialog_priority_default": "Prioridade por defecto", + "publish_dialog_priority_high": "Prioridade alta", + "publish_dialog_priority_max": "Prioridade Máxima", + "publish_dialog_base_url_label": "URL de servizo" +} From 1d02933481bf1bd8d0b8d066aca1c5cae67a73ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Mon, 28 Aug 2023 04:08:45 +0000 Subject: [PATCH 026/182] Translated using Weblate (Galician) Currently translated at 42.4% (162 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 37 ++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index 9c4efb18..efc418ff 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -125,5 +125,40 @@ "publish_dialog_priority_default": "Prioridade por defecto", "publish_dialog_priority_high": "Prioridade alta", "publish_dialog_priority_max": "Prioridade Máxima", - "publish_dialog_base_url_label": "URL de servizo" + "publish_dialog_base_url_label": "URL de servizo", + "notifications_more_details": "Para máis información, visita o sitio web ou le a documentación.", + "publish_dialog_call_label": "Chamada de teléfono", + "publish_dialog_call_reset": "Retirar chamada de teléfono", + "publish_dialog_delay_placeholder": "Adiar a entrega, ex. {{unixTimestamp}}, {{relativeTime}}, ou \"{{naturalLanguage}}\" (Só en inglés)", + "publish_dialog_other_features": "Outras características:", + "publish_dialog_chip_click_label": "Premer en URL", + "publish_dialog_chip_email_label": "Reenvío por correo", + "publish_dialog_chip_call_label": "Chamada de teléfono", + "publish_dialog_chip_attach_url_label": "Anexar ficheiro por URL", + "publish_dialog_button_cancel_sending": "Cancelar o envío", + "publish_dialog_button_cancel": "Cancelar", + "publish_dialog_button_send": "Enviar", + "publish_dialog_attached_file_title": "Ficheiro anexo:", + "publish_dialog_attached_file_filename_placeholder": "Nome do ficheiro anexo", + "publish_dialog_drop_file_here": "Soltar aquí o ficheiro", + "emoji_picker_search_placeholder": "Buscar emoji", + "subscribe_dialog_subscribe_title": "Subscribirse a un tema", + "publish_dialog_call_item": "Número de teléfono {{number}}", + "publish_dialog_email_placeholder": "Enderezo ao que reenviar a notificación, ex. xoana@exemplo.com", + "publish_dialog_email_reset": "Retirar reenvío ao correo", + "publish_dialog_attach_label": "URL do anexo", + "publish_dialog_attach_placeholder": "Anexa un ficheiro por URL, ex. https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "Retirar URL do anexo", + "publish_dialog_filename_placeholder": "Nome do ficheiro anexo", + "publish_dialog_filename_label": "Nome do ficheiro", + "publish_dialog_delay_label": "Adiar", + "publish_dialog_delay_reset": "Retirar o adiadamento da entrega", + "publish_dialog_chip_attach_file_label": "Anexar ficheiro local", + "publish_dialog_chip_delay_label": "Entrega adiada", + "publish_dialog_chip_topic_label": "Cambiar tema", + "publish_dialog_details_examples_description": "Para ver exemplos e unha descrición polo miúdo das ferramentas de envío, le a documentación.", + "publish_dialog_checkbox_publish_another": "Publicar outra", + "emoji_picker_search_clear": "Limpar busca", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Números de teléfono non verificados", + "publish_dialog_attached_file_remove": "Retirar ficheiro anexo" } From 30a913c05c3d704bd71a9658f13f3e493542f2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20de=20Le=C3=B3n?= Date: Mon, 28 Aug 2023 23:20:04 -0600 Subject: [PATCH 027/182] Ignore Cloudflare Priority header With these changes, If the web request contains the new Priority header (RFC 9218), The server will ignore it and continue searching for other headers or query parameters. --- server/util.go | 23 +++++++++++++++++++++-- util/util.go | 5 ----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/server/util.go b/server/util.go index 03eb8661..ee87f2ed 100644 --- a/server/util.go +++ b/server/util.go @@ -9,6 +9,7 @@ import ( "net/http" "net/netip" "strings" + /*"regexp"*/ ) var mimeDecoder mime.WordDecoder @@ -129,7 +130,25 @@ func fromContext[T any](r *http.Request, key contextKey) (T, error) { func maybeDecodeHeader(header string) string { decoded, err := mimeDecoder.DecodeHeader(header) if err != nil { - return header + return cloudflarePriorityIgnore(header) } - return decoded + return cloudflarePriorityIgnore(decoded) +} + +// Ignore new HTTP Priority header (see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority) +// Cloudflare adds this to requests when forwarding to the backend (ntfy), so we just ignore it. +// If the Priority header is set to "u=*, i" or "u=*" (by cloudflare), the header will be ignored. +// And continue searching for another header (x-priority, prio, p) or in the Query parameters. +func cloudflarePriorityIgnore(value string) string { + if strings.HasPrefix(value, "u=") { + return "" + } + + // The same but with regex + /* pattern := `^u=\d+\s*,\s*i|u=\d+$` + regex := regexp.MustCompile(pattern) + if regex.MatchString(value) { + return "" + } */ + return value } diff --git a/util/util.go b/util/util.go index 4a63e22f..d48487df 100644 --- a/util/util.go +++ b/util/util.go @@ -161,11 +161,6 @@ func ParsePriority(priority string) (int, error) { case "5", "max", "urgent": return 5, nil default: - // Ignore new HTTP Priority header (see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority) - // Cloudflare adds this to requests when forwarding to the backend (ntfy), so we just ignore it. - if strings.HasPrefix(p, "u=") { - return 3, nil - } return 0, errInvalidPriority } } From a1625c7f156a443e5d1d3ebb1ea1d9f9da7af97c Mon Sep 17 00:00:00 2001 From: Mazurky Date: Thu, 31 Aug 2023 22:13:26 +0200 Subject: [PATCH 028/182] Added translation using Weblate (Slovak) --- web/public/static/langs/sk.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/sk.json diff --git a/web/public/static/langs/sk.json b/web/public/static/langs/sk.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/sk.json @@ -0,0 +1 @@ +{} From c6964502c417c0683ee8c9fcd40952ac04ec746d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Fri, 1 Sep 2023 15:31:52 -0400 Subject: [PATCH 029/182] Thank you @teomarcdhio and @MarcMichalsky for your donation/sponsorship --- README.md | 2 + go.mod | 10 +- go.sum | 10 + web/package-lock.json | 564 +++++++++++++++++++++++------------------- 4 files changed, 324 insertions(+), 262 deletions(-) diff --git a/README.md b/README.md index 6cc1adbe..95944639 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,8 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: diff --git a/go.mod b/go.mod index 1560c61d..8e493e3b 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/s2a-go v0.1.5 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect @@ -70,10 +70,10 @@ require ( golang.org/x/text v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/appengine/v2 v2.0.4 // indirect - google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect + google.golang.org/appengine/v2 v2.0.5 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/grpc v1.57.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index c6761a56..173e8e9c 100644 --- a/go.sum +++ b/go.sum @@ -100,6 +100,8 @@ github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkj github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= @@ -238,16 +240,24 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine/v2 v2.0.4 h1:aAAPYixP9EfTJjNO6F46afaxp+jfzb0VgwVjMeLBtF4= google.golang.org/appengine/v2 v2.0.4/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= +google.golang.org/appengine/v2 v2.0.5 h1:4C+F3Cd3L2nWEfSmFEZDPjQvDwL8T0YCeZBysZifP3k= +google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJgEqUQYGDGgbwmhjoAOz8kO/ajxefY= google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 h1:WGq4lvB/mlicysM/dUT3SBvijH4D3sm/Ny1A4wmt2CI= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= diff --git a/web/package-lock.json b/web/package-lock.json index 735fc42b..cb15d61f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -68,11 +68,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -89,9 +89,9 @@ } }, "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -99,15 +99,15 @@ "@babel/generator": "^7.22.10", "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -174,9 +174,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", + "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -436,23 +436,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.4.2", @@ -463,9 +463,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.14", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", + "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -510,6 +510,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, "engines": { "node": ">=6.9.0" @@ -769,9 +770,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", + "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -850,12 +851,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -952,9 +953,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -984,9 +985,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1032,9 +1033,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1063,9 +1064,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1110,12 +1111,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", + "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1127,13 +1128,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5" }, @@ -1192,9 +1193,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1208,9 +1209,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1224,13 +1225,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", + "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.22.5" @@ -1259,9 +1260,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1275,9 +1276,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.22.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", + "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1323,13 +1324,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1556,9 +1557,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", - "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "version": "7.22.14", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.14.tgz", + "integrity": "sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", @@ -1587,41 +1588,41 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-generator-functions": "^7.22.11", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", "@babel/plugin-transform-block-scoping": "^7.22.10", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", "@babel/plugin-transform-classes": "^7.22.6", "@babel/plugin-transform-computed-properties": "^7.22.5", "@babel/plugin-transform-destructuring": "^7.22.10", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", "@babel/plugin-transform-for-of": "^7.22.5", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.11", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.11", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.12", "@babel/plugin-transform-parameters": "^7.22.5", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", @@ -1635,7 +1636,7 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.11", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-regenerator": "^0.5.2", @@ -1670,9 +1671,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1695,9 +1696,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.10", @@ -1706,8 +1707,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1716,9 +1717,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -2239,9 +2240,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2298,18 +2299,52 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2409,14 +2444,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", - "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "version": "5.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.13.tgz", + "integrity": "sha512-uC0l97pBspfDAp+iz2cJq8YZ8Sd9i73V77+WzUiOAckIVEyCm5dyVDZCCO2/phmzckVEeZCGcytybkjMQuhPQw==", "dependencies": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@emotion/is-prop-valid": "^1.2.1", + "@floating-ui/react-dom": "^2.0.1", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.7", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1", @@ -2441,20 +2477,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", - "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.7.tgz", + "integrity": "sha512-sCWTUNElBPgB30iLvWe3PU7SIlTKZNf6/E/sko85iHVeHCM6WPkDw+y89CrZYjhFNmPqt2fIQM/pZu+rP2lFLA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", - "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.7.tgz", + "integrity": "sha512-mWp4DwMa8c1Gx9yOEtPgxM4b+e6hAbtZyzfSubdBwrnEE6G5D2rbAJ5MB+If6kfI48JaYaJ5j8+zAdmZLuZc0A==", "dependencies": { - "@babel/runtime": "^7.22.6" + "@babel/runtime": "^7.22.10" }, "engines": { "node": ">=12.0.0" @@ -2475,16 +2511,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", - "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.7.tgz", + "integrity": "sha512-jIZj9F7zMv6IlyaYDVv5M2Kp20jIX8c0kzuwteySHS/A0IvPVyomQEPtWc51MCbpDNCqzwoZUp3rQtA2lI8k7A==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/base": "5.0.0-beta.11", - "@mui/core-downloads-tracker": "^5.14.5", - "@mui/system": "^5.14.5", + "@babel/runtime": "^7.22.10", + "@mui/base": "5.0.0-beta.13", + "@mui/core-downloads-tracker": "^5.14.7", + "@mui/system": "^5.14.7", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.7", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2519,12 +2555,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", - "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.7.tgz", + "integrity": "sha512-Y86+hmDnJab2Ka42PgxKpK3oL7EiacbeeX3X/lG9LGO0wSc45wZjHeTfIlVSkkUCkexiMKEJp5NlSjZhr27NRQ==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/utils": "^5.14.5", + "@babel/runtime": "^7.22.10", + "@mui/utils": "^5.14.7", "prop-types": "^15.8.1" }, "engines": { @@ -2545,11 +2581,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", - "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.7.tgz", + "integrity": "sha512-hKBETEDsIAkL8/mBwPiQj/vw28OeIhMXC3Tvj4J2bb9snxAKpiZioR1PwqP+6P41twsC/GKBd0Vr9oaWYaHuMg==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.10", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2576,15 +2612,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", - "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.7.tgz", + "integrity": "sha512-jeZtHglc+Pi6qjGoopT6O4RqYXVBMqHVOsjMGP0hxGSSPm1T4gsAu7jU8eqGx9YwwjvvJ0eotTjFqw7iJ6qE2Q==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/private-theming": "^5.14.5", - "@mui/styled-engine": "^5.13.2", + "@babel/runtime": "^7.22.10", + "@mui/private-theming": "^5.14.7", + "@mui/styled-engine": "^5.14.7", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.7", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2628,11 +2664,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", - "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.7.tgz", + "integrity": "sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw==", "dependencies": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@types/prop-types": "^15.7.5", "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", @@ -2734,9 +2770,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true }, "node_modules/@types/parse-json": { @@ -2750,9 +2786,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", - "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2796,9 +2832,9 @@ "dev": true }, "node_modules/@types/unist": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", - "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", + "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" }, "node_modules/@vitejs/plugin-react": { "version": "4.0.4", @@ -2923,16 +2959,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -3232,9 +3268,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001521", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", - "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "version": "1.0.30001525", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", + "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", "dev": true, "funding": [ { @@ -3362,12 +3398,12 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -3550,9 +3586,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.495", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", - "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==", + "version": "1.4.508", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", + "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", "dev": true }, "node_modules/emoji-regex": { @@ -3631,15 +3667,15 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.13.tgz", - "integrity": "sha512-LK3VGwzvaPWobO8xzXXGRUOGw8Dcjyfk62CsY/wfHN75CwsJPbuypOYJxK6g5RyEL8YDjIWcl6jgd8foO6mmrA==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.3", + "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.2.1", @@ -3750,15 +3786,15 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", + "@eslint/js": "8.48.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3902,9 +3938,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", - "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", @@ -3916,13 +3952,12 @@ "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.12.1", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.6", "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.3", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -4381,16 +4416,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -4430,9 +4466,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4449,15 +4485,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5273,15 +5309,14 @@ "dev": true }, "node_modules/iterator.prototype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", - "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", + "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "has-tostringtag": "^1.0.0", "reflect.getprototypeof": "^1.0.3" } }, @@ -5442,6 +5477,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5513,6 +5554,15 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -5905,28 +5955,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -5936,39 +5986,39 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -6137,9 +6187,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -6401,15 +6451,15 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", - "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -6603,9 +6653,9 @@ } }, "node_modules/rollup": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", - "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -6847,18 +6897,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", + "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", "side-channel": "^1.0.4" }, "funding": { @@ -7040,9 +7090,9 @@ } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", From 60d5e66e34f51823cb89230a10ea62343a1ca0e7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Fri, 1 Sep 2023 15:36:12 -0400 Subject: [PATCH 030/182] Integration links --- docs/integrations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/integrations.md b/docs/integrations.md index 740d8c40..68bc4c46 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -128,9 +128,11 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [msgdrop](https://github.com/jbrubake/msgdrop) - Send and receive encrypted messages (Bash) - [vigilant](https://github.com/VerifiedJoseph/vigilant) - Monitor RSS/ATOM and JSON feeds, and send push notifications on new entries (PHP) - [ansible-role-ntfy-alertmanager](https://github.com/bleetube/ansible-role-ntfy-alertmanager) - Ansible role to install xenrox/ntfy-alertmanager +- [NtfyMe-Blender](https://github.com/NotNanook/NtfyMe-Blender) - Blender addon to send notifications to NtfyMe (Python) ## Blog + forum posts +- [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023 - [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023 - [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 7/2023 - [Basic website monitoring using cronjobs and ntfy.sh](https://burkhardt.dev/2023/website-monitoring-cron-ntfy/) - burkhardt.dev - 6/2023 From d999dbe0a0d09b8da4d8cd3b9f9a1794d68dc8dc Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Sat, 2 Sep 2023 22:29:45 +0900 Subject: [PATCH 031/182] Update releases.md suport -> support --- docs/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 70682131..1e518c76 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -110,7 +110,7 @@ if you use promo code `MYTOPIC`). ntfy will always remain open source. ## ntfy server v2.4.0 Released Apr 26, 2023 -This release adds a tiny `v1/stats` endpoint to expose how many messages have been published, and adds suport to encode the `X-Title`, +This release adds a tiny `v1/stats` endpoint to expose how many messages have been published, and adds support to encode the `X-Title`, `X-Message` and `X-Tags` header as RFC 2047. It's a pretty small release, and mainly enables the release of the new ntfy.sh website. ❤️ If you like ntfy, **please consider sponsoring me** via [GitHub Sponsors](https://github.com/sponsors/binwiederhier) From e2d7f2cf296c1078b14e399533ac85a8fed634b4 Mon Sep 17 00:00:00 2001 From: masterujjval Date: Sat, 2 Sep 2023 23:09:53 +0530 Subject: [PATCH 032/182] readme modified --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 95944639..a6e0e8da 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ notification service. With ntfy, you can **send notifications to your phone or d **without having to sign up or pay any fees**. If you'd like to run your own instance of the service, you can easily do so since ntfy is open source. -You can access the free version of ntfy at **[ntfy.sh](https://ntfy.sh)**. There is also an [open source Android app](https://github.com/binwiederhier/ntfy-android) +You can access the free version of ntfy at **[ntfy.sh](https://ntfy.sh)**. There is also an [open-source Android app](https://github.com/binwiederhier/ntfy-android) available on [Google Play](https://play.google.com/store/apps/details?id=io.heckel.ntfy) or [F-Droid](https://f-droid.org/en/packages/io.heckel.ntfy/), as well as an [open source iOS app](https://github.com/binwiederhier/ntfy-ios) available on the [App Store](https://apps.apple.com/us/app/ntfy/id1625396347). @@ -41,7 +41,7 @@ I now offer paid plans for [ntfy.sh](https://ntfy.sh/) if you don't want to self [Install / Self-hosting](https://ntfy.sh/docs/install/) | [Building](https://ntfy.sh/docs/develop/) -## Chat / forum +## Chat/forum There are a few ways to get in touch with me and/or the rest of the community. Feel free to use any of these methods. Whatever works best for you: @@ -50,13 +50,13 @@ works best for you: * [Lemmy discussion board](https://discuss.ntfy.sh/c/ntfy) - asynchronous forum (_new as of June 2023_) * [GitHub issues](https://github.com/binwiederhier/ntfy/issues) - questions, features, bugs -## Announcements / beta testers +## Announcements/beta testers For announcements of new releases and cutting-edge beta versions, please subscribe to the [ntfy.sh/announcements](https://ntfy.sh/announcements) topic. If you'd like to test the iOS app, join [TestFlight](https://testflight.apple.com/join/P1fFnAm9). For Android betas, join Discord/Matrix (I'll eventually make a testing channel in Google Play). ## Contributing -I welcome any and all contributions. Just create a PR or an issue. For larger features/ideas, please reach out +I welcome any contributions. Just create a PR or an issue. For larger features/ideas, please reach out on Discord/Matrix first to see if I'd accept them. To contribute code, check out the [build instructions](https://ntfy.sh/docs/develop/) for the server and the Android app. Or, if you'd like to help translate 🇩🇪 🇺🇸 🇧🇬, you can start immediately in [Hosted Weblate](https://hosted.weblate.org/projects/ntfy/). @@ -165,7 +165,7 @@ _Please be sure to read the complete [Code of Conduct](CODE_OF_CONDUCT.md)._ Made with ❤️ by [Philipp C. Heckel](https://heckel.io). The project is dual licensed under the [Apache License 2.0](LICENSE) and the [GPLv2 License](LICENSE.GPLv2). -Third party libraries and resources: +Third-party libraries and resources: * [github.com/urfave/cli](https://github.com/urfave/cli) (MIT) is used to drive the CLI * [Mixkit sounds](https://mixkit.co/free-sound-effects/notification/) (Mixkit Free License) are used as notification sounds * [Sounds from notificationsounds.com](https://notificationsounds.com) (Creative Commons Attribution) are used as notification sounds From 15fa3b7d9ffb7d1c53c973b5de320e99d3849e88 Mon Sep 17 00:00:00 2001 From: "vardy.ng" Date: Sat, 2 Sep 2023 15:54:29 -0400 Subject: [PATCH 033/182] =?UTF-8?q?break=20=E4=B8=AD=E6=96=87(Chinese)=20i?= =?UTF-8?q?nto=20=E7=B9=81=E9=AB=94=E4=B8=AD=E6=96=87(Traditional=20Chines?= =?UTF-8?q?e,=20zh=5FHant)=20and=20=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87(Si?= =?UTF-8?q?mplified=20Chinese,=20zh=5FHans)=20in=20language=20drop=20down?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/Preferences.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/components/Preferences.jsx b/web/src/components/Preferences.jsx index a93032ce..546ecbe3 100644 --- a/web/src/components/Preferences.jsx +++ b/web/src/components/Preferences.jsx @@ -571,7 +571,8 @@ const Language = () => { Bahasa Indonesia Български Čeština - 中文 + 繁體中文 + 简体中文 Dansk Deutsch Español From c80f71bd9b6044037b935312e2d33b8ceaaa505b Mon Sep 17 00:00:00 2001 From: "vardy.ng" Date: Sat, 2 Sep 2023 17:30:34 -0400 Subject: [PATCH 034/182] update Simplified Chinese Translation, align with English translation by adding missing keys --- web/public/static/langs/zh_Hans.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/zh_Hans.json b/web/public/static/langs/zh_Hans.json index e2904e9e..f9a9fbcd 100644 --- a/web/public/static/langs/zh_Hans.json +++ b/web/public/static/langs/zh_Hans.json @@ -1,11 +1,13 @@ { "action_bar_show_menu": "显示菜单", "action_bar_logo_alt": "ntfy图标", + "action_bar_mute_notifications": "静音", "action_bar_settings": "设置", "action_bar_send_test_notification": "发送测试通知", "action_bar_clear_notifications": "清除所有通知", "action_bar_unsubscribe": "取消订阅", "action_bar_toggle_action_menu": "开启或关闭操作菜单", + "action_bar_unmute_notifications": "取消静音", "message_bar_type_message": "在此处输入消息", "message_bar_show_dialog": "显示发布对话框", "message_bar_publish": "发布消息", @@ -20,6 +22,10 @@ "alert_notification_permission_required_button": "现在授予", "alert_not_supported_title": "不支持通知", "alert_not_supported_description": "您的浏览器不支持通知。", + "alert_notification_ios_install_required_description": "要接收通知,请在iOS上点击分享图标,然后添加到主屏幕。", + "alert_notification_ios_install_required_title": "需要安装iOS应用程序", + "alert_notification_permission_denied_description": "你已禁用通知。要重新启用通知,请在浏览器设置中启用通知。", + "alert_notification_permission_denied_title": "已禁用通知", "notifications_list": "通知列表", "notifications_list_item": "通知", "notifications_mark_read": "标记为已读", @@ -129,6 +135,11 @@ "prefs_notifications_delete_after_one_day_description": "一天后自动删除通知", "prefs_notifications_delete_after_one_week_description": "一周后自动删除通知", "prefs_notifications_delete_after_one_month_description": "一月后后自动删除通知", + "prefs_notifications_web_push_disabled": "已暂用", + "prefs_notifications_web_push_disabled_description": "当网页程序在运行时将会收到通知 (透过 WebSocket)", + "prefs_notifications_web_push_enabled": "已为 {{server}} 启用", + "prefs_notifications_web_push_enabled_description": "即使网页程序未有运行亦会收到通知 (via Web Push)", + "prefs_notifications_web_push_title": "背景通知", "prefs_users_title": "管理用户", "prefs_users_description": "在此处添加/删除受保护主题的用户。请注意,用户名和密码存储在浏览器的本地存储中。", "prefs_users_add_button": "添加用户", @@ -140,6 +151,10 @@ "common_save": "保存", "prefs_appearance_title": "外观", "prefs_appearance_language_title": "语言", + "prefs_appearance_theme_title": "主題", + "prefs_appearance_theme_system": "系統 (預設)", + "prefs_appearance_theme_dark": "黑暗模式", + "prefs_appearance_theme_light": "光亮模式", "priority_min": "最低", "priority_low": "低", "priority_default": "默认", @@ -149,6 +164,7 @@ "prefs_users_table_base_url_header": "服务链接地址", "prefs_users_dialog_base_url_label": "服务链接地址,例如 https://ntfy.sh", "error_boundary_button_copy_stack_trace": "复制堆栈跟踪", + "error_boundary_button_reload_ntfy": "重新加载 ntfy", "error_boundary_stack_trace": "堆栈跟踪", "error_boundary_gathering_info": "收集更多信息……", "error_boundary_unsupported_indexeddb_title": "不支持隐私浏览", @@ -160,6 +176,7 @@ "notifications_attachment_copy_url_button": "复制链接地址", "notifications_attachment_open_title": "转到 {{url}}", "notifications_actions_http_request_title": "发送 HTTP {{method}} 到 {{url}}", + "notifications_actions_failed_notification": "通知失败", "notifications_actions_open_url_title": "转到 {{url}}", "notifications_none_for_topic_description": "要向此主题发送通知,只需使用 PUT 或 POST 到主题链接即可。", "subscribe_dialog_subscribe_topic_placeholder": "主题名,例如 phil_alerts", @@ -168,12 +185,14 @@ "publish_dialog_title_placeholder": "主题标题,例如 磁盘空间告警", "publish_dialog_email_label": "电子邮件", "publish_dialog_button_send": "发送", + "publish_dialog_checkbox_markdown": "格式化为 Markdown", "publish_dialog_attachment_limits_quota_reached": "超过配额,剩余 {{remainingBytes}}", "publish_dialog_attach_label": "附件链接地址", "publish_dialog_click_reset": "移除点击连接地址", "publish_dialog_button_cancel": "取消", "subscribe_dialog_subscribe_button_cancel": "取消", "subscribe_dialog_subscribe_base_url_label": "服务地址地址", + "subscribe_dialog_subscribe_use_another_background_info": "当网页程序未开启, 将不会收到来自其他服务器的通知", "prefs_notifications_min_priority_description_any": "显示所有通知,无论优先级如何", "prefs_notifications_delete_after_title": "删除通知", "prefs_notifications_delete_after_three_hours": "三小时后", @@ -380,5 +399,9 @@ "account_basics_phone_numbers_dialog_verify_button_call": "拨打电话", "account_upgrade_dialog_tier_features_messages_one": "一条每日消息", "account_upgrade_dialog_tier_features_calls_other": "{{calls}} 通每日电话", - "account_upgrade_dialog_tier_features_no_calls": "无电话呼叫" + "account_upgrade_dialog_tier_features_no_calls": "无电话呼叫", + "web_push_subscription_expiring_title": "通知将被暂停", + "web_push_subscription_expiring_body": "打开ntfy以继续接收通知", + "web_push_unknown_notification_title": "接收到未知通知", + "web_push_unknown_notification_body": "你可能需要打开网页来更新ntfy" } From d0b7336da7331e7a4a752abbf27dd2603e530dee Mon Sep 17 00:00:00 2001 From: "vardy.ng" Date: Sat, 2 Sep 2023 17:31:07 -0400 Subject: [PATCH 035/182] completed Traditional Chinese Translation, aligned with Simplified Chinese and English translation --- web/public/static/langs/zh_Hant.json | 588 ++++++++++++++++++--------- 1 file changed, 388 insertions(+), 200 deletions(-) diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index 9b0dd372..ae32e765 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -1,220 +1,408 @@ { + "action_bar_show_menu": "顯示選單", "action_bar_logo_alt": "ntfy 標識", - "action_bar_unsubscribe": "取消訂閱", - "action_bar_toggle_mute": "通知靜音/解除通知靜音", - "action_bar_toggle_action_menu": "開啟/關閉操作選單", - "message_bar_type_message": "在這輸入訊息", - "alert_notification_permission_required_description": "允許瀏覽器權限以顯示桌面通知。", - "alert_notification_permission_required_button": "允許", - "notifications_list": "通知清單", - "notifications_list_item": "通知", - "notifications_mark_read": "標示已讀", - "notifications_attachment_image": "附加圖片", - "notifications_attachment_copy_url_title": "複製附件 URL 到剪貼簿", - "notifications_attachment_copy_url_button": "複製 URL", - "notifications_attachment_open_title": "前往 {{url}}", - "notifications_attachment_open_button": "開啟附件", - "notifications_attachment_link_expired": "下載連結已過期", - "notifications_attachment_file_video": "影片檔案", - "notifications_attachment_file_app": "Android 應用程式檔案", - "notifications_attachment_file_document": "其他文件", - "notifications_click_copy_url_title": "複製連結 URL 到剪貼板", - "notifications_click_copy_url_button": "複製連結", - "notifications_click_open_button": "開啟連結", - "notifications_actions_not_supported": "網頁程式無法支援該動作", - "notifications_actions_http_request_title": "傳送 HTTP {{method}} 到 {{url}}", - "notifications_none_for_topic_title": "尚未收到任何此主題的通知。", - "notifications_none_for_topic_description": "如要寄送通知到此主題,請使用 PUT 或 POST 到此主題URL。", - "notifications_none_for_any_title": "尚未收到任何通知。", + "action_bar_mute_notifications": "靜音", "action_bar_settings": "設定", "action_bar_send_test_notification": "發送測試通知", "action_bar_clear_notifications": "清除所有通知", - "action_bar_show_menu": "顯示選單", - "nav_button_documentation": "文件", - "nav_button_publish_message": "發佈通知", - "nav_button_muted": "通知已靜音", - "notifications_copied_to_clipboard": "已複製到剪貼簿", - "message_bar_publish": "發佈訊息", - "message_bar_show_dialog": "顯示發佈對話框", - "message_bar_error_publishing": "發佈通知時發生錯誤", + "action_bar_unsubscribe": "取消訂閱", + "action_bar_toggle_action_menu": "開啟或關閉操作選單", + "action_bar_unmute_notifications": "取消靜音", + "message_bar_type_message": "在此處輸入訊息", + "message_bar_show_dialog": "顯示發布對話框", + "message_bar_publish": "發布訊息", "nav_topics_title": "訂閱主題", - "nav_button_all_notifications": "所有通知", - "nav_button_settings": "設定", + "nav_button_all_notifications": "全部通知", + "nav_button_documentation": "文檔", + "nav_button_publish_message": "發布通知", "nav_button_subscribe": "訂閱主題", - "nav_button_connecting": "連線中", - "alert_notification_permission_required_title": "通知已關閉", - "alert_not_supported_title": "不支援通知", - "alert_not_supported_description": "瀏覽器不支援通知。", - "notifications_tags": "標籤", - "notifications_priority_x": "優先度 {{priority}}", + "nav_button_connecting": "正在連接", + "alert_notification_permission_required_title": "已禁用通知", + "alert_notification_permission_required_description": "授予瀏覽器顯示桌面通知的權限。", + "alert_notification_permission_required_button": "現在授予", + "alert_not_supported_title": "不支援通知", + "alert_not_supported_description": "你的瀏覽器不支援通知。", + "alert_notification_ios_install_required_description": "要接收通知,請在 iOS 上點擊共享,然後添加到主屏幕", + "alert_notification_ios_install_required_title": "需要安裝 iOS 應用程式", + "alert_notification_permission_denied_description": "你已禁用通知。要重新啟用通知,請在瀏覽器設置中啟用通知。", + "alert_notification_permission_denied_title": "已禁用通知", + "notifications_list": "通知列表", + "notifications_list_item": "通知", + "notifications_mark_read": "標記為已讀", + "notifications_copied_to_clipboard": "複製到剪貼板", + "notifications_tags": "標記", + "notifications_priority_x": "優先級 {{priority}}", "notifications_new_indicator": "新通知", - "notifications_attachment_file_audio": "聲音檔案", - "notifications_delete": "刪除", + "notifications_attachment_open_button": "打開附件", "notifications_attachment_link_expires": "連結在 {{date}} 過期", - "notifications_attachment_file_image": "圖片檔案", - "notifications_actions_open_url_title": "前往 {{url}}", - "notifications_no_subscriptions_title": "你尚未有任何訂閱。", - "notifications_example": "範例", - "notifications_more_details": "你可以在 ntfy 網站或者技術文件中查看更多資訊。", - "notifications_loading": "載入中…", - "publish_dialog_title_topic": "發佈到 {{topic}}", - "publish_dialog_title_no_topic": "發佈通知", - "publish_dialog_progress_uploading": "上傳中…", - "publish_dialog_priority_label": "優先度", - "publish_dialog_email_label": "電郵地址", - "publish_dialog_filename_label": "檔案名稱", - "publish_dialog_button_cancel": "取消", - "publish_dialog_button_send": "傳送", - "publish_dialog_button_cancel_sending": "取消傳送", - "subscribe_dialog_subscribe_button_cancel": "取消", - "subscribe_dialog_subscribe_button_subscribe": "訂閱", - "emoji_picker_search_clear": "清除", - "subscribe_dialog_login_password_label": "密碼", - "common_back": "返回", - "subscribe_dialog_login_button_login": "登入", - "prefs_notifications_delete_after_never": "從不", - "prefs_users_add_button": "新增使用者", - "prefs_users_dialog_password_label": "密碼", - "prefs_users_dialog_title_add": "新增使用者", - "common_save": "儲存", - "common_cancel": "取消", - "error_boundary_title": "歐買尬,ntfy 壞掉了", - "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST,例如:", - "notifications_no_subscriptions_description": "點選 「{{linktext}}」 連結以建立或訂閱主題。完成後,你就可以使用 HTTP PUT 或者 POST 發送通知到這裡了!", - "error_boundary_description": "很抱歉 ntfy 發生錯誤了。
如果你有時間,煩請到 Github 回報錯誤,或者到 Discord 或者 Matrix 聊天室裡面告訴我們。", - "publish_dialog_tags_placeholder": "逗號分隔的標籤,例如 e.g. warning, srv1-backup", - "publish_dialog_click_label": "點擊網址", - "publish_dialog_attach_placeholder": "從網址新增附件,例如 https://f-droid.org/F-Droid.apk", - "publish_dialog_attach_reset": "移除附件網址", - "publish_dialog_attach_label": "附件網址", - "publish_dialog_delay_reset": "移除延遲傳送", - "publish_dialog_delay_label": "延遲", - "publish_dialog_other_features": "其他功能:", - "publish_dialog_filename_placeholder": "附件檔案名稱", - "publish_dialog_delay_placeholder": "延遲傳送,例如 {{unixTimestamp}}, {{relativeTime}} 或 \"{{naturalLanguage}}\" (僅限英文)", - "publish_dialog_chip_click_label": "點擊網址", - "publish_dialog_chip_email_label": "轉發到電郵", - "publish_dialog_chip_attach_url_label": "從網址新增附件", - "emoji_picker_search_placeholder": "搜尋 emoji", - "subscribe_dialog_subscribe_title": "訂閱主題", - "subscribe_dialog_error_user_not_authorized": "用戶 {{username}} 沒有權限", - "subscribe_dialog_error_user_anonymous": "匿名", - "login_title": "登入 ntfy 帳戶", - "action_bar_reservation_add": "保留主題", - "action_bar_profile_logout": "登出", - "alert_not_supported_context_description": "訊息只支援 HTTPS. 這是受 Notifications API 的限制", - "publish_dialog_base_url_placeholder": "服務網址,例如 https://example.com", - "signup_title": "創建 ntfy 賬戶", - "signup_form_username": "用戶名稱", - "signup_form_password": "密碼", - "signup_form_button_submit": "註冊", - "signup_form_toggle_password_visibility": "顯示/隱藏密碼", - "signup_disabled": "註冊已停止", - "signup_error_username_taken": "用戶名稱 {{username}} 已被取用", - "signup_error_creation_limit_reached": "註冊賬戶限制", - "login_form_button_submit": "登入", - "login_link_signup": "註冊", - "signup_already_have_account": "已有帳戶? 立即登入!", - "login_disabled": "登入已停止", - "action_bar_account": "帳戶", - "action_bar_change_display_name": "改變顯示名稱", - "action_bar_reservation_edit": "改變已保留", - "action_bar_reservation_delete": "移除保留", - "action_bar_reservation_limit_reached": "達到限制", - "action_bar_profile_title": "簡介", - "action_bar_profile_settings": "設置", - "action_bar_sign_in": "登入", - "action_bar_sign_up": "註冊", - "nav_button_account": "帳戶", - "nav_upgrade_banner_label": "升級到 ntfy 專業版", - "nav_upgrade_banner_description": "保留主題,更多信息電郵及附件", - "display_name_dialog_title": "改變顯示名稱", - "display_name_dialog_description": "為主題新增在訂閱清單顯示的第二名稱, 這會令尋找複雜主題時更方便。", - "display_name_dialog_placeholder": "顯示名稱", - "reserve_dialog_checkbox_label": "保留主題及設置權限", - "publish_dialog_progress_uploading_detail": "上載中 {{loaded}}/{{total}} ({{percent}}%) …", - "publish_dialog_message_published": "已公佈通訊", - "publish_dialog_attachment_limits_file_reached": "超出檔案限制 {fileSizeLimit}}", - "publish_dialog_attachment_limits_quota_reached": "超出限制, 尚餘 {{remainingBytes}}", - "publish_dialog_emoji_picker_show": "選擇 emoji", - "publish_dialog_priority_min": "最低優先", - "publish_dialog_priority_low": "較低優先", - "publish_dialog_priority_default": "正常優先", - "publish_dialog_priority_high": "高度優先", - "publish_dialog_priority_max": "最高優先", - "publish_dialog_base_url_label": "服務網址", + "notifications_attachment_link_expired": "下載連結已過期", + "notifications_attachment_file_image": "圖片文件", + "notifications_attachment_image": "附件圖片", + "notifications_attachment_file_video": "影片文件", + "notifications_attachment_file_audio": "聲音文件", + "notifications_attachment_file_app": "安卓應用程式", + "notifications_attachment_file_document": "其他文件", + "notifications_click_copy_url_title": "複製鏈結地址到剪貼板", + "notifications_click_copy_url_button": "複製鏈結", + "notifications_click_open_button": "打開鏈結", + "action_bar_toggle_mute": "通知靜音/解除通知靜音", + "nav_button_muted": "已暫停通知", + "notifications_actions_not_supported": "網頁應用程序不支援此操作", + "notifications_none_for_topic_title": "你尚未收到有關此主題的任何通知。", + "notifications_none_for_any_title": "你尚未收到任何通知。", + "notifications_none_for_any_description": "要向此主題發送通知,只需使用 PUT 或 POST 到主題鏈結即可。以下是使用你的主題的示例。", + "notifications_no_subscriptions_title": "看起來你還未有任何訂閱", + "notifications_example": "示例", + "notifications_more_details": "有關更多資訊,請查看網站文檔。", + "notifications_loading": "正在加載通知……", + "publish_dialog_title_topic": "發布到 {{topic}}", + "publish_dialog_title_no_topic": "發布通知", + "publish_dialog_progress_uploading": "正在上傳……", + "publish_dialog_progress_uploading_detail": "正在上傳 {{loaded}}/{{total}} ({{percent}}%) ……", + "publish_dialog_message_published": "已發布通知", + "publish_dialog_attachment_limits_file_and_quota_reached": "超過 {{fileSizeLimit}} 文件限制和配額,剩餘 {{remainingBytes}}", + "publish_dialog_emoji_picker_show": "選擇表情符號", + "publish_dialog_priority_min": "最低優先級", + "publish_dialog_priority_low": "低優先級", + "publish_dialog_priority_default": "默認優先級", + "publish_dialog_priority_high": "高優先級", + "publish_dialog_priority_max": "最高優先級", "publish_dialog_topic_label": "主題名稱", "publish_dialog_topic_placeholder": "主題名稱,例如 phil_alerts", "publish_dialog_topic_reset": "重置主題", - "publish_dialog_title_label": "標題", - "publish_dialog_title_placeholder": "通訊標題,例如 Disk space alert", + "publish_dialog_title_label": "主題", "publish_dialog_message_label": "訊息", - "publish_dialog_message_placeholder": "這裏輸入訊息", - "publish_dialog_tags_label": "標籤", - "publish_dialog_click_placeholder": "通訊被點擊時到訪的網址", - "publish_dialog_click_reset": "移除點擊網址", - "publish_dialog_email_reset": "移除電郵轉發", - "publish_dialog_chip_attach_file_label": "上載檔案", - "publish_dialog_chip_delay_label": "延遲傳送", - "publish_dialog_chip_topic_label": "更變主題", - "publish_dialog_details_examples_description": "可以在 documentation 找到詳細的功能說明及例子。", - "publish_dialog_checkbox_publish_another": "公佈更多", - "publish_dialog_attached_file_title": "附件:", - "publish_dialog_attached_file_filename_placeholder": "附件名稱", - "subscribe_dialog_subscribe_use_another_label": "使用另一個伺服器", - "subscribe_dialog_subscribe_base_url_label": "服務網址", + "publish_dialog_message_placeholder": "在此輸入訊息", + "publish_dialog_tags_label": "標記", + "publish_dialog_priority_label": "優先級", + "publish_dialog_base_url_label": "服務鏈結地址", + "publish_dialog_base_url_placeholder": "服務鏈結地址,例如 https://example.com", + "publish_dialog_click_label": "點擊鏈結地址", + "publish_dialog_click_placeholder": "點擊通知時打開鏈結地址", + "publish_dialog_email_placeholder": "將通知轉發到的地址,例如 phil@example.com", + "publish_dialog_email_reset": "移除電子郵件轉發", + "publish_dialog_filename_label": "文件名", + "publish_dialog_filename_placeholder": "附件文件名", + "publish_dialog_delay_label": "延期", + "publish_dialog_other_features": "其它功能:", + "publish_dialog_attach_placeholder": "使用鏈結地址附加文件,例如 https://f-droid.org/F-Droid.apk", + "publish_dialog_delay_reset": "刪除延期投遞", + "publish_dialog_attach_reset": "移除附件鏈結地址", + "publish_dialog_chip_click_label": "點擊鏈結地址", + "publish_dialog_chip_email_label": "轉發郵件", + "publish_dialog_chip_attach_file_label": "本地文件附件", + "publish_dialog_chip_topic_label": "變更主題", + "publish_dialog_button_cancel_sending": "取消發送", + "publish_dialog_checkbox_publish_another": "發布另一個", + "publish_dialog_attached_file_title": "附件文件:", + "publish_dialog_attached_file_filename_placeholder": "附件文件名", + "publish_dialog_attached_file_remove": "刪除附件文件", + "publish_dialog_drop_file_here": "將文件拖拽至此", + "emoji_picker_search_placeholder": "查找表情符號", + "emoji_picker_search_clear": "清除搜索", + "subscribe_dialog_subscribe_title": "訂閱主題", + "publish_dialog_chip_delay_label": "延期投遞", + "publish_dialog_chip_attach_url_label": "鏈結附件地址", + "subscribe_dialog_subscribe_use_another_label": "使用其他伺服器", + "subscribe_dialog_subscribe_button_subscribe": "訂閱", + "subscribe_dialog_login_title": "請登錄", + "subscribe_dialog_login_description": "本主題受密碼保護,請輸入用戶名和密碼以訂閱。", + "subscribe_dialog_login_username_label": "用戶名,例如 phil", + "subscribe_dialog_login_password_label": "密碼", + "common_back": "返回", + "subscribe_dialog_login_button_login": "登入", + "subscribe_dialog_error_user_not_authorized": "未授權 {{username}} 使用者", + "subscribe_dialog_error_user_anonymous": "匿名", + "prefs_notifications_title": "通知", + "prefs_notifications_sound_title": "通知提示音", + "prefs_notifications_sound_description_none": "收到通知時不播放任何聲音", + "prefs_notifications_sound_description_some": "收到通知時播放 {{sound}} 聲音", + "prefs_notifications_sound_no_sound": "靜音", + "prefs_notifications_sound_play": "播放選中聲音", + "prefs_notifications_min_priority_title": "最低優先級", + "prefs_notifications_min_priority_description_x_or_higher": "僅顯示優先級為{{number}}({{name}})或以上的通知", + "prefs_notifications_min_priority_description_max": "僅顯示最高優先級的通知", + "prefs_notifications_min_priority_any": "任意優先級", + "prefs_notifications_min_priority_low_and_higher": "低優先級和更高優先級", + "prefs_notifications_min_priority_default_and_higher": "默認優先級和更高優先級", + "prefs_notifications_min_priority_high_and_higher": "高優先級和更高優先級", + "prefs_notifications_min_priority_max_only": "僅最高優先級", + "prefs_notifications_delete_after_never": "從不", + "prefs_notifications_delete_after_one_month": "一個月後", + "prefs_notifications_delete_after_one_week": "一周後", + "prefs_notifications_delete_after_never_description": "永不自動刪除通知", + "prefs_notifications_delete_after_three_hours_description": "三小時後自動刪除通知", + "prefs_notifications_delete_after_one_day_description": "一天後自動刪除通知", + "prefs_notifications_delete_after_one_week_description": "一周後自動刪除通知", + "prefs_notifications_delete_after_one_month_description": "一個月後自動刪除通知", + "prefs_notifications_web_push_enabled_description": "即使網頁程式未有運街亦會收到通知 (via Web Push)", + "prefs_notifications_web_push_disabled_description": "當網頁程式在運行時將會收到通知 (透過 WebSocket)", + "prefs_notifications_web_push_enabled": "己為 {{server}} 啟用", + "prefs_notifications_web_push_disabled": "己暫用", + "prefs_notifications_web_push_title": "背景通知", + "prefs_users_title": "管理使用者", + "prefs_users_description": "在此處新增/刪除受保護主題的使用者。請注意,使用者名和密碼將存儲在瀏覽器的本地存儲中。", + "prefs_users_add_button": "新增使用者", + "prefs_users_dialog_title_add": "新增使用者", + "prefs_users_dialog_title_edit": "編輯使用者", + "prefs_users_dialog_username_label": "使用者名,例如 phil", + "prefs_users_dialog_password_label": "密碼", + "common_cancel": "取消", + "common_save": "保存", + "prefs_appearance_title": "外觀", + "prefs_appearance_language_title": "語言", + "prefs_appearance_theme_title": "主題", + "prefs_appearance_theme_system": "系統 (預設)", + "prefs_appearance_theme_dark": "黑暗模式", + "prefs_appearance_theme_light": "光亮模式", + "priority_min": "最低", + "priority_low": "低", + "priority_default": "預設", + "priority_high": "高", + "priority_max": "最高", + "error_boundary_title": "天啊,ntfy 崩潰了", + "prefs_users_table_base_url_header": "服務連結地址", + "prefs_users_dialog_base_url_label": "服務連結地址,例如 https://ntfy.sh", + "error_boundary_button_copy_stack_trace": "複製堆疊追踪", + "error_boundary_button_reload_ntfy": "重新加載 ntfy", + "error_boundary_stack_trace": "堆疊追踪", + "error_boundary_gathering_info": "收集更多資訊……", + "error_boundary_unsupported_indexeddb_title": "不支援隱私瀏覽", + "error_boundary_unsupported_indexeddb_description": "Ntfy Web應用程式需要IndexedDB才能運行,且你的瀏覽器在隱私瀏覽模式下不支援IndexedDB。

儘管這很不幸,但在隱私瀏覽模式下使用ntfy Web應用程式也沒有多大意義,因為所有東西都存儲在瀏覽器存儲中。你可以在本GitHub問題中閱讀有關它的更多資訊,或者在DiscordMatrix上與我們交談。", + "message_bar_error_publishing": "發佈通知時出錯", + "nav_button_settings": "設定", + "notifications_delete": "刪除", + "notifications_attachment_copy_url_title": "將附件中連結地址複製到剪貼板", + "notifications_attachment_copy_url_button": "複製連結地址", + "notifications_attachment_open_title": "轉到 {{url}}", + "notifications_actions_http_request_title": "發送 HTTP {{method}} 到 {{url}}", + "notifications_actions_failed_notification": "通知失敗", + "notifications_actions_open_url_title": "轉到 {{url}}", + "notifications_none_for_topic_description": "要向此主題發送通知,只需使用 PUT 或 POST 到主題連結即可。", + "subscribe_dialog_subscribe_topic_placeholder": "主題名,例如 phil_alerts", + "notifications_no_subscriptions_description": "點擊 \"{{linktext}}\" 連結以建立或訂閱主題。之後,你可以使用 PUT 或 POST 發送訊息,你將在這裡收到通知。", + "publish_dialog_attachment_limits_file_reached": "超過 {{fileSizeLimit}} 文件限制", + "publish_dialog_title_placeholder": "主題標題,例如 磁碟空間警告", + "publish_dialog_email_label": "電子郵件", + "publish_dialog_button_send": "發送", + "publish_dialog_checkbox_markdown": "格式化為 Markdown", + "publish_dialog_attachment_limits_quota_reached": "超過配額,剩餘 {{remainingBytes}}", + "publish_dialog_attach_label": "附件連結地址", + "publish_dialog_click_reset": "移除點擊連結地址", + "publish_dialog_button_cancel": "取消", + "subscribe_dialog_subscribe_button_cancel": "取消", + "subscribe_dialog_subscribe_base_url_label": "服務地址地址", + "subscribe_dialog_subscribe_use_another_background_info": "當網頁程式未開啟, 將不會收到來自其他伺服器的通知", + "prefs_notifications_min_priority_description_any": "顯示所有通知,無論優先級如何", + "prefs_notifications_delete_after_title": "刪除通知", + "prefs_notifications_delete_after_three_hours": "三小時後", + "prefs_users_delete_button": "刪除用戶", + "prefs_users_table_user_header": "用戶", + "common_add": "新增", + "prefs_notifications_delete_after_one_day": "一天後", + "error_boundary_description": "這顯然不應該發生。對此非常抱歉。
如果你有時間,請在GitHub上報告,或通過DiscordMatrix告訴我們。", + "prefs_users_table": "用戶表", + "prefs_users_edit_button": "編輯用戶", + "publish_dialog_tags_placeholder": "英文逗號分隔標記列表,例如 warning, srv1-backup", + "publish_dialog_details_examples_description": "有關所有發送功能的範例和詳細說明,請參閱文檔。", + "subscribe_dialog_subscribe_description": "主題可能不受密碼保護,因此請選擇一個不容易被猜中的名字。訂閱後,你可以使用 PUT/POST 通知。", + "publish_dialog_delay_placeholder": "延期投遞,例如 {{unixTimestamp}}、{{relativeTime}}或「{{naturalLanguage}}」(僅限英語)", + "account_usage_basis_ip_description": "此帳戶的使用統計資訊和限制基於你的 IP 地址,因此可能會與其他用戶共享。上面顯示的限制是基於現有速率限制的近似值。", + "account_usage_cannot_create_portal_session": "無法打開計費門戶", + "account_delete_title": "刪除帳戶", + "account_delete_description": "永久刪除你的帳戶", + "signup_error_username_taken": "用戶名 {{username}} 已被取用", + "signup_error_creation_limit_reached": "已達到帳戶創建限制", + "login_title": "請登錄你的 ntfy 帳戶", + "action_bar_change_display_name": "更改顯示名稱", + "action_bar_reservation_add": "保留主題", + "action_bar_reservation_delete": "移除保留", + "action_bar_reservation_limit_reached": "達到限制", + "action_bar_profile_title": "個人資料", + "action_bar_profile_settings": "設定", + "action_bar_profile_logout": "登出", + "action_bar_mute_notifications": "靜音", + "action_bar_sign_in": "登錄", + "action_bar_sign_up": "註冊", + "nav_button_account": "帳戶", + "nav_upgrade_banner_label": "升級到 ntfy Pro", + "nav_upgrade_banner_description": "保留主題,更多訊息和郵件,以及更大的附件", + "alert_not_supported_context_description": "通知僅支援 HTTPS。這是 Notifications API 的限制。", + "display_name_dialog_title": "更改顯示名稱", + "display_name_dialog_description": "為訂閱列表中顯示的主題設置一個替代名稱。這有助於更輕鬆地識別名稱複雜的主題。", + "display_name_dialog_placeholder": "顯示名稱", + "reserve_dialog_checkbox_label": "保留主題並配置訪問", "subscribe_dialog_subscribe_button_generate_topic_name": "生成名稱", - "subscribe_dialog_login_title": "需要登入", - "subscribe_dialog_login_username_label": "用戶名稱,例如 phil", - "subscribe_dialog_error_topic_already_reserved": "主題已被保留", + "account_basics_username_description": "嘿,那是你 ❤", + "account_basics_password_description": "更改你的帳戶密碼", + "account_basics_password_dialog_title": "更改密碼", + "account_basics_password_dialog_current_password_label": "當前密碼", + "account_basics_password_dialog_new_password_label": "新密碼", + "account_basics_password_dialog_confirm_password_label": "確認密碼", + "account_basics_password_dialog_button_submit": "更改密碼", + "account_basics_password_dialog_current_password_incorrect": "密碼錯誤", + "account_usage_title": "使用量", + "account_usage_of_limit": "{{limit}} 的", + "account_usage_unlimited": "無限", + "account_usage_limits_reset_daily": "使用限制每天午夜 (UTC) 重置", + "account_basics_tier_title": "帳戶類型", + "account_basics_tier_description": "你帳戶的權限級別", + "account_basics_tier_admin": "管理員", + "account_basics_tier_admin_suffix_with_tier": "(有 {{tier}} 等級)", + "account_basics_tier_admin_suffix_no_tier": "(無等級)", + "account_basics_tier_basic": "基礎版", + "account_basics_tier_free": "免費", + "account_basics_tier_upgrade_button": "升級到專業版", + "account_basics_tier_change_button": "改變", + "account_basics_tier_paid_until": "訂閱已支付至 {{date}},並將自動續訂", + "account_basics_tier_manage_billing_button": "管理計費", + "account_usage_messages_title": "已發布訊息", + "account_usage_emails_title": "已發送電子郵件", + "account_usage_reservations_title": "保留主題", + "account_usage_reservations_none": "此帳戶沒有保留主題", + "account_usage_attachment_storage_title": "附件存儲", + "account_usage_attachment_storage_description": "每個文件 {{filesize}},在 {{expiry}} 後刪除", + "account_upgrade_dialog_button_pay_now": "立即付款並訂閱", + "account_upgrade_dialog_button_cancel_subscription": "取消訂閱", + "account_upgrade_dialog_button_update_subscription": "更新訂閱", + "account_tokens_dialog_title_create": "創建訪問令牌", + "account_tokens_dialog_title_edit": "編輯訪問令牌", + "account_tokens_dialog_title_delete": "刪除訪問令牌", + "account_tokens_dialog_button_cancel": "取消", + "account_tokens_dialog_expires_label": "訪問令牌過期於", + "account_tokens_dialog_expires_unchanged": "保持過期日期不變", + "account_tokens_dialog_expires_x_hours": "令牌在 {{hours}} 小時後過期", + "account_tokens_dialog_expires_x_days": "令牌在 {{days}} 天後過期", + "account_tokens_dialog_expires_never": "令牌永不過期", + "account_tokens_delete_dialog_title": "刪除訪問令牌", + "account_tokens_delete_dialog_description": "在刪除訪問令牌之前,請確保沒有應用程序或腳本正在活躍使用它。 此操作無法撤銷。", + "account_tokens_delete_dialog_submit_button": "永久删除令牌", + "prefs_users_description_no_sync": "用戶和密碼不會同步到你的賬戶。", + "prefs_users_table_cannot_delete_or_edit": "無法刪除或編輯已登錄用戶", + "prefs_reservations_title": "保留主題", + "prefs_reservations_description": "你可以在此處保留主題名稱供個人使用。保留主題使你擁有該主題的所有權,並允許你為其他用戶定義對該主題的訪問權限。", + "prefs_reservations_limit_reached": "你已達到保留主題限制。", + "prefs_reservations_add_button": "新增保留主題", + "prefs_reservations_edit_button": "編輯主題訪問", + "prefs_reservations_delete_button": "重置主題訪問", + "prefs_reservations_table": "保留主題表格", + "prefs_reservations_table_topic_header": "主題", + "prefs_reservations_table_access_header": "訪問", + "prefs_reservations_table_everyone_deny_all": "只有我可以發佈和訂閱", + "prefs_reservations_table_everyone_read_only": "我可以發佈和訂閱,每個人都可以訂閱", + "prefs_reservations_table_everyone_write_only": "我可以發佈和訂閱,每個人都可以發佈", + "prefs_reservations_table_everyone_read_write": "每個人都可以發佈和訂閱", + "prefs_reservations_table_not_subscribed": "未訂閱", + "prefs_reservations_table_click_to_subscribe": "點擊以訂閱", + "prefs_reservations_dialog_title_add": "保留主題", + "prefs_reservations_dialog_title_edit": "編輯保留主題", + "prefs_reservations_dialog_title_delete": "刪除主題保留", + "prefs_reservations_dialog_description": "保留主題使你擁有該主題的所有權,並允許你為其他用戶定義對該主題的訪問權限。", + "prefs_reservations_dialog_topic_label": "主題", + "prefs_reservations_dialog_access_label": "訪問", + "reservation_delete_dialog_description": "刪除保留會放棄對該主題的所有權,並允許其他人保留它。你可以保留或刪除現有郵件和附件。", + "reservation_delete_dialog_action_keep_title": "保留緩存的郵件和附件", + "reservation_delete_dialog_action_keep_description": "緩存在伺服器上的訊息和附件將對知道主題名稱的人公開可見。", + "reservation_delete_dialog_action_delete_title": "刪除緩存的郵件和附件", + "reservation_delete_dialog_action_delete_description": "緩存的郵件和附件將被永久刪除。此操作無法撤銷。", + "reservation_delete_dialog_submit_button": "刪除保留", + "account_delete_dialog_description": "這將永久刪除你的帳戶,包括存儲在伺服器上的所有數據。刪除後,你的用戶名將在 7 天內不可用。如果你真的想繼續,請在下面的框中使用你的密碼作確認。", + "account_delete_dialog_label": "密碼", + "account_delete_dialog_button_cancel": "取消", + "account_delete_dialog_button_submit": "永久刪除帳戶", + "account_delete_dialog_billing_warning": "刪除你的帳戶也會立即取消你的計費訂閱。你將無法再訪問計費儀錶板。", + "account_upgrade_dialog_title": "更改帳戶等級", + "account_upgrade_dialog_cancel_warning": "這將取消你的訂閱,並在 {{date}} 降級你的帳戶。在那一天,主題保留以及緩存在伺服器上的訊息將被刪除。", + "account_upgrade_dialog_proration_info": "按比例分配:在付費計劃之間升級時,差價將被立刻收取。在降級到較低級別時,餘額將被用於支付未來的賬單周期。", + "account_upgrade_dialog_reservations_warning_one": "所選等級允許的保留主題少於當前等級。在更改你的等級之前,請至少刪除 1 項保留。你可以在設置中刪除保留。", + "account_upgrade_dialog_reservations_warning_other": "所選等級允許的保留主題少於當前等級。在更改你的等級之前,請至少刪除 {{count}} 項保留。你可以在設置中刪除保留。", + "account_upgrade_dialog_tier_features_reservations_other": "保留 {{reservations}} 條主題", + "account_upgrade_dialog_tier_features_messages_other": "每日 {{messages}} 條訊息", + "account_upgrade_dialog_tier_features_emails_other": "每日 {{emails}} 條郵件", + "account_upgrade_dialog_tier_features_attachment_file_size": "每個文件 {{filesize}} ", + "signup_form_confirm_password": "確認密碼", + "signup_form_button_submit": "註冊", + "signup_form_toggle_password_visibility": "切換密碼可見性", + "signup_title": "創建一個 ntfy 帳戶", + "signup_form_username": "用戶名", + "signup_form_password": "密碼", + "signup_already_have_account": "已有帳戶?登錄!", + "signup_disabled": "註冊已禁用", + "login_form_button_submit": "登錄", + "login_link_signup": "註冊", + "login_disabled": "登錄已禁用", + "action_bar_account": "帳戶", + "action_bar_reservation_edit": "更改保留", + "subscribe_dialog_error_topic_already_reserved": "主題已保留", "account_basics_title": "帳戶", - "account_basics_username_title": "用戶名稱", - "account_basics_username_description": "這就是你了❤", + "account_basics_username_title": "用戶名", "account_basics_username_admin_tooltip": "你是管理員", "account_basics_password_title": "密碼", - "account_basics_password_description": "更變你的密碼", - "account_basics_password_dialog_title": "更變密碼", - "account_basics_password_dialog_new_password_label": "新的密碼", - "account_basics_password_dialog_confirm_password_label": "確認密碼", - "account_basics_password_dialog_button_submit": "更變密碼", - "account_usage_unlimited": "無限制", - "account_usage_title": "已經使用", - "account_usage_limits_reset_daily": "使用限制每天午夜重置", - "account_basics_tier_title": "帳戶類型", - "account_basics_tier_description": "你的能量值", - "account_basics_tier_admin": "管理員", - "account_basics_tier_admin_suffix_with_tier": "(擁有 {{tier}})", - "account_basics_tier_admin_suffix_no_tier": "(無層)", - "account_basics_tier_basic": "基礎", - "account_basics_tier_free": "免費", - "account_basics_tier_upgrade_button": "升級至專業版", - "publish_dialog_email_placeholder": "轉發到電郵,例如 phil@example.com", - "subscribe_dialog_subscribe_topic_placeholder": "主題名稱,例如 phil_alerts", - "publish_dialog_attached_file_remove": "移除附件", - "subscribe_dialog_subscribe_description": "主題可能不受到密碼保護, 所以盡量選擇一個不會容易被猜中的主題名稱。 一旦已訂閱,你能夠 PUT/POST 通訊。", - "subscribe_dialog_login_description": "這個主題受密碼保護,請輸入用戶名稱及密碼以訂閱主題。", - "account_basics_password_dialog_current_password_label": "現在的密碼", - "account_basics_password_dialog_current_password_incorrect": "密碼不正確", - "account_basics_tier_change_button": "更變", - "common_add": "新增", - "signup_form_confirm_password": "確認密碼", - "publish_dialog_drop_file_here": "拖曳檔案到此", + "account_basics_tier_payment_overdue": "你的付款已逾期。請更新你的付款方式,否則你的帳戶將很快被降級。", + "account_basics_tier_canceled_subscription": "你的訂閱已取消,並將在 {{date}} 降級為免費帳戶。", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} 總存儲空間", + "account_upgrade_dialog_tier_selected_label": "已選", + "account_upgrade_dialog_tier_current_label": "當前", + "account_upgrade_dialog_button_cancel": "取消", + "account_upgrade_dialog_button_redirect_signup": "立即註冊", + "account_tokens_title": "訪問令牌", + "account_tokens_description": "通過 ntfy API 發布和訂閱時使用訪問令牌,因此你不必發送你的帳戶憑證。查看文檔以了解更多資訊。", + "account_tokens_table_token_header": "令牌", + "account_tokens_table_label_header": "標籤", + "account_tokens_table_last_access_header": "最後訪問", + "account_tokens_table_expires_header": "過期", + "account_tokens_table_never_expires": "永不過期", + "account_tokens_table_current_session": "當前瀏覽器會話", + "common_copy_to_clipboard": "複製到剪貼板", + "account_tokens_table_copied_to_clipboard": "已複製訪問令牌", + "account_tokens_table_cannot_delete_or_edit": "無法編輯或刪除當前會話令牌", + "account_tokens_table_create_token_button": "創建訪問令牌", + "account_tokens_table_last_origin_tooltip": "於IP地址 {{ip}},點擊查找", + "account_tokens_dialog_label": "標籤,例如:Radarr 通知", + "account_tokens_dialog_button_create": "創建令牌", + "account_tokens_dialog_button_update": "更新令牌", "account_basics_tier_interval_monthly": "每月", - "common_copy_to_clipboard": "複製到剪貼簿", - "publish_dialog_call_label": "電話", - "publish_dialog_call_reset": "移除電話", - "publish_dialog_chip_call_label": "電話", - "account_usage_reservations_none": "此帳戶沒有預留主題", - "account_usage_attachment_storage_title": "附件容量", - "account_basics_tier_canceled_subscription": "你的付費訂閱已取消,並於 {{date}} 下調為免費帳戶。", - "account_usage_messages_title": "已發佈的信息", - "publish_dialog_chip_call_no_verified_numbers_tooltip": "沒有已驗證的電話號碼", "account_basics_tier_interval_yearly": "每年", - "account_usage_emails_title": "已發送電郵", - "account_usage_attachment_storage_description": "每個檔案約 {{filesize}},將於 {{expiry}} 後刪除", - "publish_dialog_attachment_limits_file_and_quota_reached": "已超過 {{fileSizeLimit}} 檔案上限,尚餘 {{remainingBytes}}", - "account_basics_tier_paid_until": "已付費訂閱至 {{date}} 並自動續期", - "account_basics_tier_payment_overdue": "你的費用已逾期。請更新付款方法,否則你的戶口等級將會下調。", - "publish_dialog_call_item": "致電 {{number}}", - "account_basics_tier_manage_billing_button": "管理付款方式" + "account_upgrade_dialog_interval_monthly": "每月", + "account_upgrade_dialog_interval_yearly": "每年", + "account_upgrade_dialog_interval_yearly_discount_save": "節省 {{discount}}%", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "節省高達 {{discount}}%", + "account_upgrade_dialog_tier_features_no_reservations": "無保留主題", + "account_upgrade_dialog_tier_price_per_month": "月", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} 每年。按月計費。", + "account_upgrade_dialog_tier_price_billed_yearly": "{{價格}} 按年計費。節省 {{save}}。", + "account_upgrade_dialog_billing_contact_email": "有關賬單問題,請直接聯繫我們 。", + "account_upgrade_dialog_billing_contact_website": "有關賬單問題,請參考我們的網站 。", + "publish_dialog_call_item": "撥打電話 {{number}}", + "publish_dialog_call_label": "撥號", + "publish_dialog_chip_call_label": "撥號", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "未驗證的電話號碼", + "account_basics_phone_numbers_title": "電話號碼", + "account_basics_phone_numbers_description": "電話通知", + "account_basics_phone_numbers_dialog_description": "要使用來電通知功能,你需要新增並驗證至少一個電話號碼。可以通過短信或電話驗證。", + "account_basics_phone_numbers_dialog_code_label": "驗證碼", + "account_basics_phone_numbers_dialog_code_placeholder": "例如:123456", + "account_basics_phone_numbers_dialog_check_verification_button": "確認碼", + "account_basics_phone_numbers_dialog_channel_sms": "短信", + "account_basics_phone_numbers_dialog_channel_call": "撥打", + "publish_dialog_call_reset": "清空撥號", + "account_basics_phone_numbers_no_phone_numbers_yet": "無可執行的電話號碼", + "account_basics_phone_numbers_dialog_title": "新增電話號碼", + "account_basics_phone_numbers_copied_to_clipboard": "電話號碼已複製到剪貼板", + "account_basics_phone_numbers_dialog_number_label": "電話號碼", + "account_basics_phone_numbers_dialog_number_placeholder": "例如:+1222333444", + "account_usage_calls_title": "已撥打電話", + "account_usage_calls_none": "此帳號無法撥打電話", + "account_upgrade_dialog_tier_features_reservations_one": "保留一條主題", + "account_upgrade_dialog_tier_features_emails_one": "每日一封郵件", + "account_upgrade_dialog_tier_features_calls_one": "每日一通電話", + "account_basics_phone_numbers_dialog_verify_button_sms": "發送資訊", + "account_basics_phone_numbers_dialog_verify_button_call": "撥打電話", + "account_upgrade_dialog_tier_features_messages_one": "每日一條訊息", + "account_upgrade_dialog_tier_features_calls_other": "每日{{calls}} 通電話", + "account_upgrade_dialog_tier_features_no_calls": "沒有電話", + "web_push_subscription_expiring_title": "通知會被暫停", + "web_push_subscription_expiring_body": "開啟ntfy以繼續接收通知", + "web_push_unknown_notification_title": "接收到不明通知", + "web_push_unknown_notification_body": "你可能需要開啟網頁來更新ntfy" } From 1bd77a83bddf9fbc7aa4aa13559eb54cc573af63 Mon Sep 17 00:00:00 2001 From: "vardy.ng" Date: Sat, 2 Sep 2023 17:34:44 -0400 Subject: [PATCH 036/182] Updated translation for Traditional and Simplified Chinese, simplified translation for "higher" --- web/public/static/langs/zh_Hans.json | 6 +++--- web/public/static/langs/zh_Hant.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/public/static/langs/zh_Hans.json b/web/public/static/langs/zh_Hans.json index f9a9fbcd..e26e7f14 100644 --- a/web/public/static/langs/zh_Hans.json +++ b/web/public/static/langs/zh_Hans.json @@ -123,9 +123,9 @@ "prefs_notifications_min_priority_description_x_or_higher": "仅显示优先级为{{number}}({{name}})或以上的通知", "prefs_notifications_min_priority_description_max": "仅显示最高优先级的通知", "prefs_notifications_min_priority_any": "任意优先级", - "prefs_notifications_min_priority_low_and_higher": "低优先级和更高优先级", - "prefs_notifications_min_priority_default_and_higher": "默认优先级和更高优先级", - "prefs_notifications_min_priority_high_and_higher": "高优先级和更高优先级", + "prefs_notifications_min_priority_low_and_higher": "低优先级或更高", + "prefs_notifications_min_priority_default_and_higher": "默认优先级或更高", + "prefs_notifications_min_priority_high_and_higher": "高优先级或更高", "prefs_notifications_min_priority_max_only": "仅最高优先级", "prefs_notifications_delete_after_never": "从不", "prefs_notifications_delete_after_one_month": "一月后", diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index ae32e765..a42b0292 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -123,9 +123,9 @@ "prefs_notifications_min_priority_description_x_or_higher": "僅顯示優先級為{{number}}({{name}})或以上的通知", "prefs_notifications_min_priority_description_max": "僅顯示最高優先級的通知", "prefs_notifications_min_priority_any": "任意優先級", - "prefs_notifications_min_priority_low_and_higher": "低優先級和更高優先級", - "prefs_notifications_min_priority_default_and_higher": "默認優先級和更高優先級", - "prefs_notifications_min_priority_high_and_higher": "高優先級和更高優先級", + "prefs_notifications_min_priority_low_and_higher": "低優先級或更高", + "prefs_notifications_min_priority_default_and_higher": "默認優先級或更高", + "prefs_notifications_min_priority_high_and_higher": "高優先級或更高", "prefs_notifications_min_priority_max_only": "僅最高優先級", "prefs_notifications_delete_after_never": "從不", "prefs_notifications_delete_after_one_month": "一個月後", From 59bf3885341ab0da090ecab4cc9852ee817cc055 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 3 Sep 2023 07:13:04 -0400 Subject: [PATCH 037/182] FAQ --- docs/faq.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/faq.md b/docs/faq.md index 8844566f..6ff97cfe 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -76,6 +76,18 @@ However, if you still want to disable it, you can do so with the `web-root: disa Think of the ntfy web app like an Android/iOS app. It is freely available and accessible to anyone, yet useless without a proper backend. So as long as you secure your backend with ACLs, exposing the ntfy web app to the Internet is harmless. +## If topic names are public, could I not just brute force them? +If you don't have [ACLs set up](config.md#access-control), the topic name is your password, it says so everywhere. If you +choose a easy-to-guess/dumb topic name, people will be able to guess it. If you choose a randomly generated topic name, +the topic is as good as a good password. + +As for brute forcing: It's not possible to brute force a ntfy server for very long, as you'll get quickly rate limited. +In the default configuration, you'll be able to do 60 requests as a burst, and then 1 request per 10 seconds. Assuming you +choose a random 10 digit topic name using only A-Z, a-z, 0-9, _ and -, there are 64^10 possible topic names. Even if you +could do hundreds of requests per seconds (which you cannot), it would take many years to brute force a topic name. + +For ntfy.sh, there's even a fail2ban in place which will ban your IP pretty quickly. + ## Where can I donate? I have just very recently started accepting donations via [GitHub Sponsors](https://github.com/sponsors/binwiederhier). I would be humbled if you helped me carry the server and developer account costs. Even small donations are very much From 2305ebca244fb60aa784a3b79270ae6f33b8ee48 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 3 Sep 2023 09:33:54 -0400 Subject: [PATCH 038/182] Add known issues --- docs/known-issues.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/known-issues.md b/docs/known-issues.md index 401d82a1..190e2bce 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -27,6 +27,13 @@ Be sure that in your selfhosted server: * Set `upstream-base-url: "https://ntfy.sh"` (**not your own hostname!**) * Ensure that the URL you set in `base-url` **matches exactly** what you set the Default Server in iOS to +## iOS app seeing "New message", but not real message content +If you see `New message` notifications on iOS, your iPhone can likely not talk to your self-hosted server. Be sure that +your iOS device and your ntfy server are either on the same network, or that your phone can actually reach the server. + +Turn on tracing/debugging on the server (via `log-level: trace` or `log-level: debug`, see [troubleshooting](troubleshooting.md)), +and read docs on [iOS instant notifications](https://docs.ntfy.sh/config/#ios-instant-notifications). + ## Firefox on Android not automatically subscribing to web push (see [#789](https://github.com/binwiederhier/ntfy/issues/789)) ntfy defaults to web-push based subscriptions when installed as a [progressive web app](./subscribe/pwa.md). Firefox Android has an [open bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1796434) where it reports the PWA mode incorrectly. From 85740d810bf0f6c2e243ce70967c3a7a7981ed0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20de=20Le=C3=B3n?= Date: Sun, 3 Sep 2023 18:55:57 -0600 Subject: [PATCH 039/182] Fix cloudflarePriorityIgnore - Now, only if the header being processed is the "priority" header, the cloudflarePriorityIgnore function is called, solving problems with that header injected by CF - we make the check with regex now. --- server/util.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/server/util.go b/server/util.go index ee87f2ed..9cbae2e4 100644 --- a/server/util.go +++ b/server/util.go @@ -9,7 +9,7 @@ import ( "net/http" "net/netip" "strings" - /*"regexp"*/ + "regexp" ) var mimeDecoder mime.WordDecoder @@ -51,7 +51,7 @@ func readParam(r *http.Request, names ...string) string { func readHeaderParam(r *http.Request, names ...string) string { for _, name := range names { - value := maybeDecodeHeader(r.Header.Get(name)) + value := maybeDecodeHeader(r.Header.Get(name), name) if value != "" { return strings.TrimSpace(value) } @@ -127,12 +127,19 @@ func fromContext[T any](r *http.Request, key contextKey) (T, error) { return t, nil } -func maybeDecodeHeader(header string) string { +func maybeDecodeHeader(header string, name string) string { decoded, err := mimeDecoder.DecodeHeader(header) if err != nil { - return cloudflarePriorityIgnore(header) + if name == "priority"{ + return cloudflarePriorityIgnore(header) + } + return header } - return cloudflarePriorityIgnore(decoded) + + if name == "priority"{ + return cloudflarePriorityIgnore(decoded) + } + return decoded } // Ignore new HTTP Priority header (see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority) @@ -140,15 +147,10 @@ func maybeDecodeHeader(header string) string { // If the Priority header is set to "u=*, i" or "u=*" (by cloudflare), the header will be ignored. // And continue searching for another header (x-priority, prio, p) or in the Query parameters. func cloudflarePriorityIgnore(value string) string { - if strings.HasPrefix(value, "u=") { - return "" - } - - // The same but with regex - /* pattern := `^u=\d+\s*,\s*i|u=\d+$` + pattern := `^u=\d,\s(i|\d)$|^u=\d$` regex := regexp.MustCompile(pattern) if regex.MatchString(value) { return "" - } */ + } return value } From 4c4d772a5f1b3a6d6c90b1a3654bee4220d1f92d Mon Sep 17 00:00:00 2001 From: Bastien S Date: Thu, 31 Aug 2023 13:59:14 +0000 Subject: [PATCH 040/182] Translated using Weblate (French) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fr/ --- web/public/static/langs/fr.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/fr.json b/web/public/static/langs/fr.json index cf4bb721..91f1b65a 100644 --- a/web/public/static/langs/fr.json +++ b/web/public/static/langs/fr.json @@ -272,7 +272,7 @@ "account_delete_dialog_button_submit": "Supprimer définitivement le compte", "account_delete_dialog_billing_warning": "Supprimer votre compte annule aussi immédiatement votre facturation. Vous n'aurez plus accès à votre tableau de bord de facturation.", "account_upgrade_dialog_title": "Changer le tarif du compte", - "account_upgrade_dialog_proration_info": "Facturation : Lors d'un changement entre un plan payant et un autre, la différence de prix sera créditée ou remboursée sur la prochaine facture. Vous ne recevrez pas d'autre facture avant la fin de la prochaine période de facturation.", + "account_upgrade_dialog_proration_info": "Facturation : Lors d'un changement vers un tiers payant, la différence de prix sera débitée immédiatement. En passant d'un tiers payant a gratuit, votre solde sera utilisé pour payer de futur factures.", "account_upgrade_dialog_reservations_warning_other": "Le tarif sélectionné autorise moins de sujets réservés que votre tarif actuel. Avant de changer de tarif, veuillez supprimer au moins {{count}} sujets réservés. Vous pouvez supprimer des sujets réservés dans les Paramètres.", "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} sujets réservés", "account_upgrade_dialog_tier_features_messages_other": "{{messages}} messages journaliers", @@ -368,8 +368,17 @@ "account_basics_phone_numbers_dialog_code_placeholder": "Ex : 123456", "account_basics_phone_numbers_dialog_check_verification_button": "Code de confirmarion", "account_basics_phone_numbers_dialog_channel_sms": "SMS", - "account_basics_phone_numbers_dialog_channel_call": "Appel", + "account_basics_phone_numbers_dialog_channel_call": "Appeler", "account_usage_calls_none": "Aucun appels téléphoniques ne peut être fait avec ce compte", "publish_dialog_call_reset": "Supprimer les appels téléphoniques", - "publish_dialog_chip_call_label": "Appel téléphonique" + "publish_dialog_chip_call_label": "Appel téléphonique", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} message journalier", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} mail journalier", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} appels journaliers", + "account_upgrade_dialog_tier_features_no_calls": "Aucun appel", + "publish_dialog_call_item": "Appeler le numéro {{number}}", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Aucun numéro de téléphone vérifié", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} sujet réservé", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} appels journaliers", + "account_usage_calls_title": "Appels téléphoniques passés" } From 6748a2f2f30d73b546a8d2bd174c1ef0bd223509 Mon Sep 17 00:00:00 2001 From: Max Oliver Date: Sat, 2 Sep 2023 19:43:47 +0000 Subject: [PATCH 041/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 57.5% (220 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 35 +++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 16ba3a14..1bb0cd92 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -191,10 +191,33 @@ "error_boundary_unsupported_indexeddb_description": "O ntfy web app precisa do IndexedDB para funcionar, e seu navegador não suporta IndexedDB no modo de navegação privada.

Embora isso seja lamentável, também não faz muito sentido usar o ntfy web app no modo de navegação privada de qualquer maneira, porque tudo é armazenado no armazenamento do navegador. Você pode ler mais sobre isso nesta edição do GitHub, ou falar conosco em Discord ou Matrix.", "action_bar_reservation_add": "Reserve topic", "action_bar_reservation_edit": "Change reservation", - "signup_disabled": "Signup is disabled", - "signup_error_username_taken": "Username {{username}} is already taken", - "signup_error_creation_limit_reached": "Account creation limit reached", - "action_bar_reservation_delete": "N", - "action_bar_account": "Account", - "action_bar_change_display_name": "Change display name" + "signup_disabled": "Registrar está desativado", + "signup_error_username_taken": "Usuário {{username}} já existe", + "signup_error_creation_limit_reached": "Limite de criação de contas atingido", + "action_bar_reservation_delete": "Remover reserva", + "action_bar_account": "Conta", + "action_bar_change_display_name": "Change display name", + "common_copy_to_clipboard": "Copiar para área de transferência", + "login_link_signup": "Registrar", + "login_title": "Entrar na sua conta ntfy", + "login_form_button_submit": "Entrar", + "login_disabled": "Login está desabilitado", + "action_bar_reservation_limit_reached": "Limite atingido", + "action_bar_profile_title": "Perfil", + "action_bar_profile_settings": "Configurações", + "action_bar_profile_logout": "Sair", + "action_bar_sign_in": "Entrar", + "action_bar_sign_up": "Registrar", + "nav_button_account": "Conta", + "signup_title": "Criar uma conta ntfy", + "signup_form_username": "Usuário", + "signup_form_password": "Senha", + "signup_form_confirm_password": "Confirmar senha", + "signup_form_button_submit": "Registrar", + "account_basics_phone_numbers_title": "Telefones", + "signup_form_toggle_password_visibility": "Ativar visibilidade de senha", + "signup_already_have_account": "Já possui uma conta? Entrar!", + "nav_upgrade_banner_label": "Atualizar para ntfy Pro", + "account_basics_phone_numbers_dialog_description": "Para usar o recurso de notificação de chamada, é necessários adicionar e verificar pelo menos um número de telefone. A verificação pode ser feita por SMS ou chamada telefônica.", + "account_basics_phone_numbers_description": "Para notificações de chamada telefônica" } From 4b0d1e448dbaf45222d63cd2e828f5f2c93c2cea Mon Sep 17 00:00:00 2001 From: Mattia Date: Fri, 1 Sep 2023 09:37:08 +0000 Subject: [PATCH 042/182] Translated using Weblate (Italian) Currently translated at 70.6% (270 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index a895e1a6..72cee7d6 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -267,5 +267,6 @@ "publish_dialog_chip_call_label": "Chiamata telefonica", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Nessun numero verificato", "account_basics_phone_numbers_title": "Numeri di telefono", - "account_basics_phone_numbers_dialog_description": "Per usare la funzionalità di notifica tramite chiamata telefonica, devi aggiungere e verificare almeno un numero di telefono. La verifica può essere fatta tramite SMS o chiamata telefonica." + "account_basics_phone_numbers_dialog_description": "Per usare la funzionalità di notifica tramite chiamata telefonica, devi aggiungere e verificare almeno un numero di telefono. La verifica può essere fatta tramite SMS o chiamata telefonica.", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} topic riservato" } From 8a8023fcf8a0bfd60c0c31bef744140a86142511 Mon Sep 17 00:00:00 2001 From: Ron Date: Sun, 3 Sep 2023 14:47:34 +0000 Subject: [PATCH 043/182] Translated using Weblate (Chinese (Traditional)) Currently translated at 64.1% (245 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/zh_Hant/ --- web/public/static/langs/zh_Hant.json | 35 ++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index b3d506d1..0d7f3f48 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -79,7 +79,7 @@ "common_save": "儲存", "common_cancel": "取消", "error_boundary_title": "歐買尬,ntfy 壞掉了", - "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST,例如:", + "notifications_none_for_any_description": "要開始發送通知到一個主題,只需要對主題 URL 發送 HTTP PUT 或者 POST。例如:", "notifications_no_subscriptions_description": "點選 「{{linktext}}」 連結以建立或訂閱主題。完成後,你就可以使用 HTTP PUT 或者 POST 發送通知到這裡了!", "error_boundary_description": "很抱歉 ntfy 發生錯誤了。
如果你有時間,煩請到 Github 回報錯誤,或者到 Discord 或者 Matrix 聊天室裡面告訴我們。", "publish_dialog_tags_placeholder": "逗號分隔的標籤,例如 e.g. warning, srv1-backup", @@ -102,7 +102,7 @@ "login_title": "登入 ntfy 帳戶", "action_bar_reservation_add": "保留主題", "action_bar_profile_logout": "登出", - "alert_not_supported_context_description": "訊息只支援 HTTPS. 這是受 Notifications API 的限制", + "alert_not_supported_context_description": "訊息只支援 HTTPS。這是受 Notifications API 的限制。", "publish_dialog_base_url_placeholder": "服務網址,例如 https://example.com", "signup_title": "創建 ntfy 賬戶", "signup_form_username": "用戶名稱", @@ -212,9 +212,36 @@ "account_basics_tier_interval_yearly": "每年", "account_usage_emails_title": "已發送電郵", "account_usage_attachment_storage_description": "每個檔案約 {{filesize}},將於 {{expiry}} 後刪除", - "publish_dialog_attachment_limits_file_and_quota_reached": "已超過 {{fileSizeLimit}} 檔案上限,尚餘 {{remainingBytes}}", + "publish_dialog_attachment_limits_file_and_quota_reached": "已超過 {{fileSizeLimit}} 檔案上限,尚餘 {{remainingBytes}}。", "account_basics_tier_paid_until": "已付費訂閱至 {{date}} 並自動續期", "account_basics_tier_payment_overdue": "你的費用已逾期。請更新付款方法,否則你的戶口等級將會下調。", "publish_dialog_call_item": "致電 {{number}}", - "account_basics_tier_manage_billing_button": "管理付款方式" + "account_basics_tier_manage_billing_button": "管理付款方式", + "prefs_notifications_title": "通知", + "prefs_notifications_sound_title": "通知提示聲", + "prefs_notifications_sound_description_none": "收到通知時不使用任何提示音", + "prefs_notifications_sound_description_some": "收到通知時播放 {{sound}}", + "prefs_notifications_sound_play": "播放選擇的聲音", + "account_basics_phone_numbers_dialog_description": "若要啟用來電通知功能,您需要增加至少一組電話號碼,並透過簡訊或是語音完成驗證。", + "account_basics_phone_numbers_description": "來電通知", + "account_basics_phone_numbers_dialog_verify_button_call": "播號", + "account_basics_phone_numbers_dialog_number_placeholder": "範例:+1222333444", + "account_basics_phone_numbers_dialog_verify_button_sms": "傳送簡訊", + "account_basics_phone_numbers_dialog_code_label": "驗證碼", + "account_basics_phone_numbers_dialog_code_placeholder": "範例:123456", + "account_basics_phone_numbers_dialog_check_verification_button": "確認碼", + "account_basics_phone_numbers_dialog_channel_sms": "簡訊", + "account_usage_calls_none": "您無法使用此帳戶進行通話", + "account_usage_reservations_title": "保留的標題", + "account_usage_of_limit": "{{limit}} 的", + "account_basics_phone_numbers_no_phone_numbers_yet": "尚未擁有任何電話號碼", + "account_basics_phone_numbers_dialog_title": "增加電話號碼", + "prefs_notifications_sound_no_sound": "靜音", + "prefs_notifications_min_priority_title": "最小優先度", + "prefs_notifications_min_priority_description_any": "忽略優先度,顯示所有通知", + "account_basics_phone_numbers_title": "電話號碼", + "account_basics_phone_numbers_copied_to_clipboard": "電話號碼已複製到剪貼簿", + "account_basics_phone_numbers_dialog_number_label": "電話號碼", + "account_basics_phone_numbers_dialog_channel_call": "通話", + "account_usage_calls_title": "已播出電話" } From 76146c4e74b2b48c42cd84aa24bc434633ce47c1 Mon Sep 17 00:00:00 2001 From: Mazurky Date: Thu, 31 Aug 2023 20:15:20 +0000 Subject: [PATCH 044/182] Translated using Weblate (Slovak) Currently translated at 45.8% (175 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sk/ --- web/public/static/langs/sk.json | 178 +++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/sk.json b/web/public/static/langs/sk.json index 0967ef42..e2a54dba 100644 --- a/web/public/static/langs/sk.json +++ b/web/public/static/langs/sk.json @@ -1 +1,177 @@ -{} +{ + "common_save": "Uložiť", + "common_back": "Späť", + "common_copy_to_clipboard": "Kopírovať do schránky", + "signup_title": "Vytvoriť ntfy účet", + "signup_form_username": "Používateľské meno", + "signup_form_confirm_password": "Potvrdenie hesla", + "signup_form_button_submit": "Zaregistrovať sa", + "signup_form_toggle_password_visibility": "Prepnúť viditeľnosť hesla", + "signup_error_username_taken": "Používateľské meno {{username}} je už obsadené", + "login_form_button_submit": "Prihlásiť sa", + "login_disabled": "Prihlásenie je zakázané", + "action_bar_logo_alt": "ntfy logo", + "action_bar_settings": "Nastavenia", + "action_bar_account": "Účet", + "action_bar_sign_in": "Prihlásiť sa", + "action_bar_profile_settings": "Nastavenia", + "action_bar_reservation_edit": "Zmeniť rezerváciu", + "action_bar_unsubscribe": "Odhlásiť odber", + "action_bar_toggle_mute": "Stlmiť/zrušiť stlmenie upozornení", + "action_bar_toggle_action_menu": "Otvoriť/zavrieť akčné menu", + "action_bar_profile_title": "Profil", + "nav_button_settings": "Nastavenia", + "nav_button_account": "Účet", + "message_bar_show_dialog": "Zobraziť okno pre odosielanie oznámení", + "message_bar_publish": "Zverejniť správu", + "nav_topics_title": "Odoberané témy", + "nav_button_all_notifications": "Všetky oznámenia", + "alert_grant_description": "Udeliť prehliadaču povolenie na zobrazovanie oznámení na ploche.", + "alert_not_supported_context_description": "Oznámenia sú podporované len cez HTTPS. Ide o obmedzenie rozhrania Notifications API.", + "notifications_list": "Zoznam oznámení", + "notifications_list_item": "Oznámenie", + "notifications_mark_read": "Označiť ako prečítané", + "notifications_delete": "Zmazať", + "notifications_copied_to_clipboard": "Skopírované do schránky", + "notifications_tags": "Štítky", + "notifications_priority_x": "Priorita {{priority}}", + "notifications_new_indicator": "Nové oznámenie", + "notifications_attachment_image": "Obrázok prílohy", + "notifications_attachment_link_expired": "odkaz na stiahnutie vypršal", + "notifications_attachment_file_image": "súbor s obrázkom", + "notifications_attachment_file_video": "video súbor", + "notifications_attachment_file_audio": "zvukový súbor", + "notifications_attachment_file_app": "Súbor aplikácie pre Android", + "notifications_attachment_file_document": "iný dokument", + "notifications_click_copy_url_title": "Skopírovať URL adresu odkazu do schránky", + "notifications_click_copy_url_button": "Kopírovať odkaz", + "notifications_click_open_button": "Otvoriť odkaz", + "notifications_actions_not_supported": "Akcia nie je podporovaná vo webovej aplikácii", + "notifications_none_for_topic_title": "K tejto téme ste zatiaľ nedostali žiadne upozornenia.", + "notifications_none_for_any_title": "Nedostali ste žiadne upozornenia.", + "notifications_none_for_any_description": "Ak chcete posielať oznámenia do témy, jednoducho zadajte adresu PUT alebo POST na adresu URL témy. Tu je príklad s použitím jednej z vašich tém.", + "notifications_no_subscriptions_title": "Zdá sa, že zatiaľ nemáte žiadne prihlásenia na odber.", + "display_name_dialog_title": "Zmeniť zobrazovaný názov", + "notifications_no_subscriptions_description": "Kliknutím na odkaz \"{{text odkazu}}\" vytvoríte tému alebo sa na ňu prihlásite. Potom môžete posielať správy prostredníctvom PUT alebo POST a budete tu dostávať oznámenia.", + "notifications_example": "Príklad", + "notifications_more_details": "Ďalšie informácie nájdete na webovej stránke alebo v dokumentácií.", + "display_name_dialog_placeholder": "Zobrazený názov", + "reserve_dialog_checkbox_label": "Rezervovať tému a nakonfigurovať prístup", + "notifications_loading": "Načítavanie oznámení …", + "publish_dialog_title_no_topic": "Zverejniť oznámenie", + "publish_dialog_title_topic": "Zverejniť v {{topic}}", + "publish_dialog_progress_uploading": "Nahrávanie…", + "publish_dialog_progress_uploading_detail": "Nahrávanie {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_message_published": "Oznámenie zverejnené", + "publish_dialog_attachment_limits_file_and_quota_reached": "prekročí {{fileSizeLimit}} limit súboru a kvótu, {{remainingBytes}} zostáva", + "publish_dialog_attachment_limits_file_reached": "prekračuje {{fileSizeLimit}} limit súboru", + "publish_dialog_attachment_limits_quota_reached": "prekračuje kvótu, {{remainingBytes}} zostáva", + "publish_dialog_emoji_picker_show": "Vyberte emoji", + "publish_dialog_priority_min": "Min. priorita", + "publish_dialog_priority_low": "Nízka priorita", + "publish_dialog_priority_default": "Predvolená priorita", + "publish_dialog_priority_high": "Vysoká priorita", + "publish_dialog_priority_max": "Max. priorita", + "publish_dialog_base_url_label": "URL Adresa služby", + "publish_dialog_base_url_placeholder": "URL adresa služby, napr. https://example.com", + "publish_dialog_topic_label": "Názov témy", + "publish_dialog_topic_placeholder": "Názov témy, napr. phil_alerts", + "publish_dialog_topic_reset": "Resetovať tému", + "publish_dialog_title_label": "Názov", + "publish_dialog_title_placeholder": "Názov oznámenia, napr. Upozornenie na miesto na disku", + "publish_dialog_tags_label": "Štítky", + "publish_dialog_message_label": "Správa", + "publish_dialog_priority_label": "Priorita", + "publish_dialog_click_label": "Kliknite na URL", + "publish_dialog_click_placeholder": "URL adresa sa otvorí po kliknutí na oznámenie", + "publish_dialog_email_label": "Email", + "publish_dialog_email_placeholder": "Emailová adresa, na ktorú sa má oznámenie zaslať, napr. phil@example.com", + "publish_dialog_call_label": "Telefonovať", + "publish_dialog_call_item": "Zavolať na telefónne číslo {{number}}", + "publish_dialog_call_reset": "Odstrániť telefón", + "publish_dialog_attach_label": "URL prílohy", + "publish_dialog_attach_reset": "Odstrániť URL prílohy", + "publish_dialog_filename_label": "Názov súboru", + "publish_dialog_filename_placeholder": "Názov súboru prílohy", + "publish_dialog_delay_label": "Oneskorenie", + "publish_dialog_delay_placeholder": "Oneskorenie doručenia, napr. {{unixTimestamp}}, {{relativeTime}} alebo \"{{naturalLanguage}}\" (len v angličtine)", + "publish_dialog_delay_reset": "Odstrániť oneskorené doručenie", + "publish_dialog_chip_call_label": "Telefonovať", + "publish_dialog_other_features": "Ďalšie funkcie:", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Žiadne overené telefónne čísla", + "publish_dialog_chip_attach_url_label": "Pripojiť súbor pomocou adresy URL", + "publish_dialog_chip_delay_label": "Oneskoriť doručenie", + "publish_dialog_chip_topic_label": "Zmeniť tému", + "publish_dialog_button_cancel_sending": "Zrušiť odosielanie", + "publish_dialog_button_send": "Odoslať", + "publish_dialog_checkbox_publish_another": "Zverejniť ďalšie", + "publish_dialog_attached_file_title": "Priložený súbor:", + "subscribe_dialog_subscribe_button_cancel": "Zrušiť", + "subscribe_dialog_subscribe_title": "Odoberať tému", + "subscribe_dialog_subscribe_base_url_label": "URL Adresa služby", + "subscribe_dialog_subscribe_topic_placeholder": "Názov témy, napr. phil_alerts", + "publish_dialog_attached_file_filename_placeholder": "Názov súboru prílohy", + "publish_dialog_attached_file_remove": "Odstrániť priložený súbor", + "publish_dialog_drop_file_here": "Vložiť súbor", + "subscribe_dialog_login_password_label": "Heslo", + "account_basics_password_dialog_confirm_password_label": "Potvrdenie hesla", + "account_basics_title": "Účet", + "account_delete_dialog_button_cancel": "Zrušiť", + "account_delete_dialog_label": "Heslo", + "prefs_reservations_dialog_title_add": "Rezervovať tému", + "publish_dialog_button_cancel": "Zrušiť", + "account_upgrade_dialog_button_cancel": "Zrušiť", + "account_tokens_dialog_button_cancel": "Zrušiť", + "common_cancel": "Zrušiť", + "common_add": "Pridať", + "account_basics_username_title": "Používateľské meno", + "signup_form_password": "Heslo", + "signup_error_creation_limit_reached": "Dosiahnutý limit na vytvorenie konta", + "account_basics_password_title": "Heslo", + "action_bar_change_display_name": "Zmeniť zobrazovaný názov", + "prefs_users_dialog_password_label": "Heslo", + "action_bar_sign_up": "Zaregistrovať sa", + "login_link_signup": "Zaregistrovať sa", + "signup_already_have_account": "Už máte účet? Prihláste sa!", + "signup_disabled": "Registrácia je vypnutá", + "login_title": "Prihláste sa do svojho konta ntfy", + "action_bar_show_menu": "Zobraziť menu", + "action_bar_reservation_add": "Rezervovať tému", + "action_bar_reservation_delete": "Odstrániť rezerváciu", + "action_bar_reservation_limit_reached": "Dosiahnutý limit", + "action_bar_send_test_notification": "Odoslať testovacie oznámenie", + "action_bar_clear_notifications": "Vymazať všetky oznámenia", + "publish_dialog_message_placeholder": "Sem napíšte správu", + "action_bar_profile_logout": "Odhlásiť sa", + "message_bar_type_message": "Sem napíšte správu", + "message_bar_error_publishing": "Chyba pri zverejňovaní oznámenia", + "nav_button_documentation": "Dokumentácia", + "nav_button_publish_message": "Zverejniť oznámenie", + "nav_button_subscribe": "Odoberať tému", + "nav_button_muted": "Oznámenia stlmené", + "nav_button_connecting": "pripájanie", + "nav_upgrade_banner_description": "Rezervovať témy, viac správ a e-mailov a väčšie prílohy", + "nav_upgrade_banner_label": "Vylepšiť na ntfy Pro", + "alert_grant_title": "Oznámenia sú vypnuté", + "alert_grant_button": "Prideliť teraz", + "alert_not_supported_title": "Oznámenia nie sú podporované", + "alert_not_supported_description": "Oznámenia nie sú vo vašom prehliadači podporované.", + "notifications_attachment_copy_url_title": "Kopírovať URL adresu prílohy do schránky", + "notifications_attachment_copy_url_button": "Kopírovať adresu URL", + "notifications_attachment_open_title": "Prejsť na {{url}}", + "notifications_actions_open_url_title": "Prejsť na {{url}}", + "notifications_attachment_open_button": "Otvoriť prílohu", + "notifications_attachment_link_expires": "platnosť odkazu vyprší {{date}}", + "notifications_none_for_topic_description": "Ak chcete posielať oznámenia do tejto témy, jednoducho zadajte adresu PUT alebo POST na URL adresu témy.", + "notifications_actions_http_request_title": "Odoslať HTTP {{method}} na {{url}}", + "display_name_dialog_description": "Nastavenie alternatívneho názvu témy, ktorá sa zobrazuje v zozname odberov. Pomáha to ľahšie identifikovať témy so zložitými názvami.", + "prefs_users_table_base_url_header": "URL Adresa služby", + "publish_dialog_tags_placeholder": "Zoznam štítkov oddelených čiarkou, napr. varovanie, srv1-backup", + "publish_dialog_chip_click_label": "Kliknite na URL", + "publish_dialog_email_reset": "Odstrániť email na preposielanie", + "publish_dialog_click_reset": "Odobrať URL kliknutím", + "publish_dialog_attach_placeholder": "Pripojiť súbor pomocou URL adresy, napr. https://f-droid.org/F-Droid.apk", + "publish_dialog_chip_email_label": "Preposlanie na email", + "publish_dialog_chip_attach_file_label": "Pripojiť miestny súbor", + "publish_dialog_details_examples_description": "Príklady a podrobný opis všetkých funkcií odosielania nájdete v dokumentácii." +} From 9959d1aa4375393ee1b72f53836ac9394dcda536 Mon Sep 17 00:00:00 2001 From: jonnysemon Date: Tue, 5 Sep 2023 17:53:34 +0000 Subject: [PATCH 045/182] Translated using Weblate (Arabic) Currently translated at 85.6% (327 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ar/ --- web/public/static/langs/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/ar.json b/web/public/static/langs/ar.json index 0c9fcc7d..301ae5eb 100644 --- a/web/public/static/langs/ar.json +++ b/web/public/static/langs/ar.json @@ -152,7 +152,7 @@ "publish_dialog_chip_delay_label": "تأخير التسليم", "subscribe_dialog_login_description": "هذا الموضوع محمي بكلمة مرور. الرجاء إدخال اسم المستخدم وكلمة المرور للاشتراك.", "subscribe_dialog_subscribe_button_cancel": "إلغاء", - "common_back": "العودة", + "common_back": "الرجوع", "prefs_notifications_sound_play": "تشغيل الصوت المحدد", "prefs_notifications_min_priority_title": "أولوية دنيا", "prefs_notifications_min_priority_max_only": "الأولوية القصوى فقط", From dee16f543d234fbb7f67991b730e4c766ad5adc6 Mon Sep 17 00:00:00 2001 From: Helly <73737531+InvitedToHell@users.noreply.github.com> Date: Wed, 6 Sep 2023 00:52:46 +0200 Subject: [PATCH 046/182] Add ios shortcut to the integrations docs --- docs/integrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 68bc4c46..e689427e 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -129,7 +129,8 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [vigilant](https://github.com/VerifiedJoseph/vigilant) - Monitor RSS/ATOM and JSON feeds, and send push notifications on new entries (PHP) - [ansible-role-ntfy-alertmanager](https://github.com/bleetube/ansible-role-ntfy-alertmanager) - Ansible role to install xenrox/ntfy-alertmanager - [NtfyMe-Blender](https://github.com/NotNanook/NtfyMe-Blender) - Blender addon to send notifications to NtfyMe (Python) - +- [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that let's you share files from your share feed to a topic of your choice. + ## Blog + forum posts - [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023 From 528a67722b6b27f0772acdabb88da502e9ddfd93 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 10 Sep 2023 11:23:18 -0400 Subject: [PATCH 047/182] Thank you @LuckVintage for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a6e0e8da..6379c7d2 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 25a60969fb73a7899993c2edea78e02cfa56154e Mon Sep 17 00:00:00 2001 From: Christian Meis Date: Thu, 7 Sep 2023 12:20:49 +0000 Subject: [PATCH 048/182] Translated using Weblate (German) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index d29760f1..4af63501 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -25,7 +25,7 @@ "notifications_click_copy_url_title": "Link-URL in Zwischenablage kopieren", "publish_dialog_priority_low": "Niedrige Priorität", "publish_dialog_message_label": "Nachricht", - "action_bar_unsubscribe": "Von Thema abmelden", + "action_bar_unsubscribe": "Abmelden", "notifications_copied_to_clipboard": "In Zwischenablage kopiert", "notifications_loading": "Benachrichtigungen werden geladen …", "notifications_attachment_open_title": "Gehe zu {{url}}", @@ -154,7 +154,7 @@ "notifications_actions_not_supported": "Diese Aktion wird in der Web-App nicht unterstützt", "notifications_actions_http_request_title": "Sende HTTP {{method}} an {{url}}", "action_bar_show_menu": "Menü anzeigen", - "action_bar_toggle_mute": "Stummschaltung der Benachrichtigungen an/aus", + "action_bar_toggle_mute": "Stummschaltung an/aus", "message_bar_show_dialog": "Dialog zur Veröffentlichung anzeigen", "message_bar_publish": "Benachrichtigung veröffentlichen", "nav_button_connecting": "verbinde", From bae30d79c9609bc3eace0199b9a8c0a270405f7b Mon Sep 17 00:00:00 2001 From: SinecKers Date: Wed, 6 Sep 2023 22:00:45 +0000 Subject: [PATCH 049/182] Translated using Weblate (Turkish) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/tr/ --- web/public/static/langs/tr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/tr.json b/web/public/static/langs/tr.json index 07fba528..4e73cfb7 100644 --- a/web/public/static/langs/tr.json +++ b/web/public/static/langs/tr.json @@ -77,7 +77,7 @@ "notifications_example": "Örnek", "notifications_more_details": "Daha fazla bilgi için web sitesine veya belgelendirmeye bakın.", "publish_dialog_chip_attach_url_label": "URL ile dosya ekle", - "prefs_notifications_min_priority_default_and_higher": "Öntanımlı öncelik ve üstü", + "prefs_notifications_min_priority_default_and_higher": "Varsayılan öncelik ve üstü", "prefs_notifications_delete_after_three_hours": "Üç saat sonra", "notifications_none_for_any_description": "Bir konuya bildirim göndermek için konu URL'sine PUT veya POST göndermeniz yeterlidir. İşte konularınızdan birini kullanan bir örnek.", "notifications_no_subscriptions_title": "Henüz aboneliğiniz yok gibi görünüyor.", From 044f4182d028f79777762374ccc9bedef45bd913 Mon Sep 17 00:00:00 2001 From: Jag_k Date: Thu, 7 Sep 2023 00:17:25 +0000 Subject: [PATCH 050/182] Translated using Weblate (Russian) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ru/ --- web/public/static/langs/ru.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/web/public/static/langs/ru.json b/web/public/static/langs/ru.json index d2c8d7fc..16ddfe74 100644 --- a/web/public/static/langs/ru.json +++ b/web/public/static/langs/ru.json @@ -354,7 +354,7 @@ "account_upgrade_dialog_billing_contact_email": "По вопросам оплаты, пожалуйста свяжитесь с нами.", "account_upgrade_dialog_billing_contact_website": "По вопросам оплаты, пожалуйста обратитесь к нашему сайту.", "publish_dialog_call_reset": "Удалить вызов", - "account_basics_phone_numbers_dialog_description": "Для использования уведомлений необходимо добавить и подтвердить хотя бы один номер телефона. Проверить можно используя SMS или звонок.", + "account_basics_phone_numbers_dialog_description": "Для того что бы использовать возможность уведомлений о вызовах, нужно добавить и проверить хотя бы один номер телефона. Проверить можно используя SMS или звонок.", "account_basics_phone_numbers_dialog_title": "Добавить номер телефона", "account_basics_phone_numbers_dialog_number_placeholder": "например +1222333444", "account_basics_phone_numbers_dialog_code_placeholder": "например 123456", @@ -363,5 +363,22 @@ "account_usage_calls_none": "Невозможно совершать вызовы с этим аккаунтом", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Нет проверенных номеров", "account_basics_phone_numbers_copied_to_clipboard": "Номер телефона скопирован в буфер обмена", - "account_upgrade_dialog_tier_features_no_calls": "Нет вызовов" + "account_upgrade_dialog_tier_features_no_calls": "Нет вызовов", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} ежедневный звонок", + "account_basics_phone_numbers_dialog_number_label": "Номер телефона", + "account_basics_phone_numbers_dialog_check_verification_button": "Подтвердить код", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} ежедневных звонков", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} зарезервированная тема", + "account_basics_phone_numbers_no_phone_numbers_yet": "Телефонных номеров пока нет", + "publish_dialog_chip_call_label": "Звонок", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} ежедневное письмо", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} ежедневное сообщения", + "account_basics_phone_numbers_description": "Для уведомлений о телефонных звонках", + "publish_dialog_call_label": "Звонок", + "account_basics_phone_numbers_dialog_channel_call": "Позвонить", + "account_basics_phone_numbers_title": "Номера телефонов", + "account_basics_phone_numbers_dialog_code_label": "Проверочный код", + "account_basics_phone_numbers_dialog_verify_button_call": "Позвонить мне", + "publish_dialog_call_item": "Вызов телефонного номера {{number}}", + "account_basics_phone_numbers_dialog_channel_sms": "SMS" } From 6ec1ccf7a3d9052cb3d9e67c1ac86cd7c97149b4 Mon Sep 17 00:00:00 2001 From: jonnysemon Date: Tue, 5 Sep 2023 18:08:50 +0000 Subject: [PATCH 051/182] Translated using Weblate (Arabic) Currently translated at 85.8% (328 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ar/ --- web/public/static/langs/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ar.json b/web/public/static/langs/ar.json index 301ae5eb..d9d44a98 100644 --- a/web/public/static/langs/ar.json +++ b/web/public/static/langs/ar.json @@ -329,5 +329,6 @@ "publish_dialog_attachment_limits_quota_reached": "يتجاوز الحصة، {{remainingBytes}} متبقية", "account_basics_tier_paid_until": "تم دفع مبلغ الاشتراك إلى غاية {{date}}، وسيتم تجديده تِلْقائيًا", "account_basics_tier_canceled_subscription": "تم إلغاء اشتراكك وسيتم إعادته إلى مستوى حساب مجاني بداية مِن {{date}}.", - "account_delete_dialog_billing_warning": "إلغاء حسابك أيضاً يلغي اشتراكك في الفوترة فوراً ولن تتمكن من الوصول إلى لوح الفوترة بعد الآن." + "account_delete_dialog_billing_warning": "إلغاء حسابك أيضاً يلغي اشتراكك في الفوترة فوراً ولن تتمكن من الوصول إلى لوح الفوترة بعد الآن.", + "nav_upgrade_banner_description": "حجز المواضيع والمزيد من الرسائل ورسائل البريد الإلكتروني والمرفقات الأكبر حجمًا" } From a407a2e0f8fc5655a42005f1bf41c0640d69ebd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Fri, 8 Sep 2023 04:01:07 +0000 Subject: [PATCH 052/182] Translated using Weblate (Galician) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 151 +++++++++++++++++++++++++++++++- 1 file changed, 150 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index efc418ff..1f816cf4 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -160,5 +160,154 @@ "publish_dialog_checkbox_publish_another": "Publicar outra", "emoji_picker_search_clear": "Limpar busca", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Números de teléfono non verificados", - "publish_dialog_attached_file_remove": "Retirar ficheiro anexo" + "publish_dialog_attached_file_remove": "Retirar ficheiro anexo", + "account_upgrade_dialog_tier_features_no_calls": "Sen chamadas", + "account_upgrade_dialog_billing_contact_email": "Para preguntas sobre pagamentos, contacta con nós directamente.", + "account_tokens_dialog_title_create": "Crear token de acceso", + "prefs_reservations_dialog_title_edit": "Editar tema reservado", + "priority_default": "por defecto", + "prefs_notifications_min_priority_title": "Prioridade mínima", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} chamadas de teléfono diarias", + "account_upgrade_dialog_tier_current_label": "Actual", + "account_tokens_table_token_header": "Token", + "prefs_notifications_delete_after_never": "Nunca", + "prefs_users_description": "Engadir/eliminar usuarias dos temas protexidos. Ten en conta que as credenciais gárdanse na almacenaxe local do navegador.", + "subscribe_dialog_subscribe_description": "Os temas poderían non estar proxetidos con contrasinal, así que elixe un nome complicado de adiviñar. Unha vez subscrita, podes PUT/POST notificacións.", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "aforro ata un {{discount}}%", + "account_tokens_dialog_label": "Etiqueta, ex. notificación de Radarr", + "account_tokens_table_expires_header": "Caducidade", + "account_upgrade_dialog_proration_info": "Axuste: ao mellorar a un plan de pagamento superior, a diferencia vaise cobrar inmediatamente. Se degradas a conta a un plan inferior a diferencia usarase para pagar futuros períodos de pagamento.", + "prefs_reservations_dialog_access_label": "Acceso", + "account_usage_attachment_storage_title": "Almacenaxe dos anexos", + "prefs_users_dialog_username_label": "Identificador, ex. xoana", + "prefs_reservations_table_not_subscribed": "Non subscrita", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} correos diarios", + "prefs_notifications_min_priority_max_only": "Só prioridade máxima", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} chamadas de teléfono diarias", + "prefs_notifications_sound_description_some": "As notificacións sonan co ton {{sound}} ao chegar", + "prefs_reservations_edit_button": "Editar acceso ao tema", + "account_tokens_dialog_expires_never": "O token non caduca", + "subscribe_dialog_login_title": "Require inciar sesión", + "account_tokens_dialog_expires_x_days": "O token caduca en {{days}} días", + "prefs_reservations_table_everyone_read_only": "Podo publicar e subscribirme, calquera pode subscribirse", + "prefs_reservations_table_everyone_deny_all": "Só eu podo publicar e subscribirme", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} tema reservado", + "subscribe_dialog_login_button_login": "Acceder", + "account_upgrade_dialog_tier_features_no_reservations": "Sen temas reservados", + "prefs_users_table_cannot_delete_or_edit": "Non se pode eliminar ou editar unha usuaria coa sesión iniciada", + "prefs_notifications_delete_after_three_hours_description": "As notificacións autoelimínanse após tres horas", + "prefs_notifications_delete_after_three_hours": "Após tres horas", + "prefs_notifications_min_priority_description_x_or_higher": "Mostrar as notificacións se a prioridade é {{number}} {{name}} ou superior", + "reservation_delete_dialog_description": "Ao eliminar a reserva cedes a propiedade do tema, e permites que outras persoas poidan reservalo. Podes manter ou eliminar as mensaxes e anexos existentes.", + "prefs_reservations_table_everyone_read_write": "Calquera pode publicar e subscribirse", + "prefs_reservations_dialog_title_delete": "Eliminar a reserva do tema", + "prefs_users_table": "Táboa de usuarias", + "prefs_reservations_table_topic_header": "Tema", + "reservation_delete_dialog_submit_button": "Eliminar a reserva", + "prefs_reservations_limit_reached": "Acadaches o límite de temas que podes reservar.", + "account_upgrade_dialog_interval_monthly": "Mensual", + "prefs_users_add_button": "Engadir usuaria", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} mensaxes diarias", + "prefs_appearance_language_title": "Idioma", + "prefs_notifications_delete_after_one_day_description": "As notificacións autoelimínanse após un día", + "account_tokens_table_never_expires": "Non caduca", + "account_tokens_delete_dialog_title": "Desbotar token de acceso", + "prefs_notifications_delete_after_one_month": "Após un mes", + "account_tokens_delete_dialog_description": "Antes de borrar o token de acceso mira que ningunha aplicación ou programa o está usando. Esta acción non pode desfacerse.", + "account_upgrade_dialog_button_cancel": "Cancelar", + "account_tokens_table_label_header": "Etiqueta", + "account_upgrade_dialog_billing_contact_website": "Para preguntas sobre pagamentos, vai ao noso sitiio web.", + "prefs_notifications_delete_after_never_description": "As notificacións non se eliminarán nunca automáticamente", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} temas reservados", + "prefs_notifications_sound_description_none": "As notificacións non reproducen un ton ao chegar", + "account_tokens_description": "Usar tokens de acceso ao publicar e subscribirte a través da API de ntfy, así non tes que enviar as credenciais. Le a documentación para saber máis.", + "prefs_reservations_table": "Táboa cos temas reservados", + "account_upgrade_dialog_button_cancel_subscription": "Cancelar subscrición", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} correo diario", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} por ficheiro", + "prefs_reservations_description": "Podes reservar nomes de temas para uso personal. Ao reservar un tema tes a propiedade sobre del, e permíteche definir os permisos de acceso para outras usuarias sobre o tema.", + "prefs_users_description_no_sync": "Usuarias e contrasinais non están sincronizados coa túa conta.", + "account_tokens_dialog_title_edit": "Editar token de acceso", + "prefs_users_table_base_url_header": "URL do servizo", + "account_upgrade_dialog_tier_features_messages_one": "{{mensaxes}} mensaxe diaria", + "account_upgrade_dialog_reservations_warning_one": "O nivel seleccionado permite reservar menos temas que o nivel actual. Antes de cambiar de nivel, elimina unha reserva polo menos. Podes eliminar as reservas nos Axustes.", + "prefs_users_table_user_header": "Usuaria", + "error_boundary_stack_trace": "Trazas do problema", + "prefs_users_dialog_password_label": "Contrasinal", + "prefs_notifications_delete_after_one_week": "Após unha semana", + "prefs_reservations_delete_button": "Restablecer acceso ao tema", + "prefs_notifications_delete_after_one_week_description": "As notificacións autoelimínanse após unha semana", + "error_boundary_unsupported_indexeddb_description": "A app ntfy web precisa a función IndexedDB, e o teu navegador non ten soporte para IndexedDB no modo privado.

Aínda que é unha mágoa, tampouco ten moito senso usar a app ntfy web en modo privado, porque todo se garda na almacenaxe do navegador. Podes aprender máis sobre isto neste tema de GitHub, ou comentarnos o que che parece en Discord ou Matrix.", + "subscribe_dialog_subscribe_button_cancel": "Cancelar", + "account_basics_tier_description": "O nivel da túa conta", + "prefs_reservations_dialog_title_add": "Reservar tema", + "account_upgrade_dialog_cancel_warning": "Isto vai cancelar a túa subscrición, e degradar a túa conta o {{date}}. Nesa data, as reservas de temas así como as mensaxes na caché do servidor van ser eliminadas.", + "prefs_notifications_sound_title": "Ton da notificación", + "prefs_notifications_min_priority_default_and_higher": "Prioridade por defecto e superior", + "prefs_reservations_table_access_header": "Acceso", + "account_tokens_table_copied_to_clipboard": "Copiouse o token de acceso", + "account_tokens_dialog_expires_x_hours": "O token caduca en {{hours}} horas", + "prefs_users_edit_button": "Editar usuaria", + "account_upgrade_dialog_title": "Cambiar facturación da conta", + "priority_low": "baixa", + "prefs_reservations_table_click_to_subscribe": "Preme para subscribirte", + "error_boundary_description": "Isto non debería pasar. Lamentámolo.
Se tes un minuto, informa en GitHub, ou fáinolo saber en Discord ou Matrix.", + "priority_min": "min", + "prefs_notifications_min_priority_description_any": "Mostrar todas as notificacións, obviando a prioridade", + "error_boundary_gathering_info": "Obter máis info…", + "error_boundary_unsupported_indexeddb_title": "Non hai soporte para a navegación privada", + "prefs_notifications_delete_after_one_day": "Após un día", + "error_boundary_title": "vaite!, ntfy fallou", + "reservation_delete_dialog_action_keep_description": "As mensaxes e anexos que están no servidor serán visibles públicamente para quen saiba o nome do tema.", + "prefs_reservations_add_button": "Engadir tema reservado", + "prefs_reservations_title": "Temas reservados", + "prefs_reservations_dialog_description": "Ao reservar un tema tes a propiedade sobre el, e permíteche definir os permisos de acceso para outras usuarias.", + "account_tokens_delete_dialog_submit_button": "Eliminar definitivamente o token", + "prefs_notifications_title": "Notificacións", + "account_tokens_title": "Tokens de acceso", + "prefs_reservations_dialog_topic_label": "Tema", + "prefs_users_title": "Xestionar usuarias", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} anual. Pagamento mensual.", + "account_tokens_dialog_expires_unchanged": "Deixar a data de caducidade sen cambiar", + "error_boundary_button_copy_stack_trace": "Copiar trazas do problema", + "account_tokens_dialog_title_delete": "Eliminar token de acceso", + "reservation_delete_dialog_action_keep_title": "Manter as mensaxes e anexos gardados", + "prefs_notifications_sound_no_sound": "Sen ton", + "account_upgrade_dialog_interval_yearly": "Anual", + "account_upgrade_dialog_button_redirect_signup": "Crea unha conta", + "account_tokens_dialog_button_cancel": "Cancelar", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} cobrado anualmente. Aforro {{save}}.", + "prefs_notifications_min_priority_high_and_higher": "Prioridade alta e superior", + "priority_max": "máx", + "prefs_users_delete_button": "Eliminar usuaria", + "prefs_notifications_min_priority_any": "Calquera prioridade", + "account_tokens_dialog_expires_label": "O token caduca o", + "prefs_notifications_delete_after_title": "Desbotar notificacións", + "account_upgrade_dialog_interval_yearly_discount_save": "aforro {{discount}}%", + "prefs_users_dialog_title_edit": "Editar usuaria", + "prefs_notifications_min_priority_low_and_higher": "Prioridade baixa e superior", + "account_tokens_dialog_button_update": "Actualizar token", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} almacenaxe total", + "prefs_reservations_table_everyone_write_only": "Podo publicar e subscribirme, calquera pode publicar", + "prefs_appearance_title": "Aparencia", + "account_tokens_table_cannot_delete_or_edit": "Non se pode editar ou desbotar o token da sesión actual", + "prefs_notifications_sound_play": "Reproducir ton seleccionado", + "account_tokens_table_last_access_header": "Último acceso", + "account_tokens_table_last_origin_tooltip": "Desde o enderezo IP {{ip}}, preme para detalles", + "account_upgrade_dialog_tier_price_per_month": "mes", + "account_tokens_table_current_session": "Sesión do navegador actual", + "account_upgrade_dialog_button_pay_now": "Paga e subscríbete", + "reservation_delete_dialog_action_delete_title": "Eliminar mensaxes e anexos gardados", + "reservation_delete_dialog_action_delete_description": "As mensaxes e anexos vanse borrar definitivamente. Esta acción non ten volta.", + "prefs_notifications_delete_after_one_month_description": "As notificacións autoelimínanse após un mes", + "prefs_users_dialog_base_url_label": "URL do servizo, ex. https://ntfy.sh", + "account_upgrade_dialog_tier_selected_label": "Seleccionado", + "account_upgrade_dialog_button_update_subscription": "Actualizar subscrición", + "priority_high": "alta", + "account_delete_dialog_billing_warning": "Ao eliminar a conta tamén cancelas o pagamento das subscricións. Non poderás volver acceder ao taboleiro de pagamentos.", + "prefs_notifications_min_priority_description_max": "Mostrar notificacións se a prioridade é 5 (máx)", + "account_upgrade_dialog_reservations_warning_other": "O nivel seleccionado permite reservar menos temas que o nivel actual. Antes de cambiar de nivel, elimina {{count}} reservas polo menos. Podes eliminar as reservas nos Axustes.", + "prefs_users_dialog_title_add": "Engadir usuaria", + "account_tokens_dialog_button_create": "Crear token", + "account_tokens_table_create_token_button": "Crear token de acceso" } From 42063cbd5c2f254e28270cfb2a609e092cc1eabd Mon Sep 17 00:00:00 2001 From: Jose Boullosa Date: Tue, 5 Sep 2023 23:54:30 +0000 Subject: [PATCH 053/182] Translated using Weblate (Galician) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 77 +++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index 1f816cf4..92d35610 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -114,7 +114,7 @@ "publish_dialog_title_topic": "Publicar en {{topic}}", "publish_dialog_title_no_topic": "Publicar notificación", "publish_dialog_progress_uploading": "Enviando…", - "publish_dialog_progress_uploading_detail": "Enviando {{loaded}}/{{total}} ({{percent}}%) …", + "publish_dialog_progress_uploading_detail": "Enviando {{loaded}}/{{total}} ({{percent}}%) …", "publish_dialog_message_published": "Notificación publicada", "publish_dialog_attachment_limits_file_and_quota_reached": "supera o límite de ficheiros e cota {{fileSizeLimit}}, quedan {{remainingBytes}}", "publish_dialog_attachment_limits_file_reached": "supera o límite para ficheiros {{fileSizeLimit}}", @@ -125,7 +125,7 @@ "publish_dialog_priority_default": "Prioridade por defecto", "publish_dialog_priority_high": "Prioridade alta", "publish_dialog_priority_max": "Prioridade Máxima", - "publish_dialog_base_url_label": "URL de servizo", + "publish_dialog_base_url_label": "URL do servizo", "notifications_more_details": "Para máis información, visita o sitio web ou le a documentación.", "publish_dialog_call_label": "Chamada de teléfono", "publish_dialog_call_reset": "Retirar chamada de teléfono", @@ -309,5 +309,76 @@ "account_upgrade_dialog_reservations_warning_other": "O nivel seleccionado permite reservar menos temas que o nivel actual. Antes de cambiar de nivel, elimina {{count}} reservas polo menos. Podes eliminar as reservas nos Axustes.", "prefs_users_dialog_title_add": "Engadir usuaria", "account_tokens_dialog_button_create": "Crear token", - "account_tokens_table_create_token_button": "Crear token de acceso" + "account_tokens_table_create_token_button": "Crear token de acceso", + "account_basics_tier_interval_monthly": "mensual", + "account_basics_tier_canceled_subscription": "A sua suscripción foi cancelada e vostede será degradado a unha conta gratuita o {{date}}.", + "account_basics_password_dialog_current_password_incorrect": "Contrasinal incorrecto", + "account_basics_phone_numbers_dialog_number_label": "Número de teléfono", + "account_basics_password_dialog_button_submit": "Modificar contrasinal", + "account_basics_username_title": "Usuario", + "account_basics_phone_numbers_dialog_check_verification_button": "Código de confirmación", + "account_usage_messages_title": "Mesaxes publicados", + "account_basics_phone_numbers_dialog_verify_button_sms": "Enviar SMS", + "account_basics_tier_change_button": "Cambiar", + "account_basics_phone_numbers_dialog_description": "Para usar a característica de chamadas de teléfono, vostede debe engadir e verificar ao menos un número de teléfono. A verificación pode ser realizada vía SMS ou a través de chamada.", + "account_delete_title": "Borrar conta", + "account_delete_dialog_label": "Contrasinal", + "account_basics_tier_admin_suffix_with_tier": "(con tier {{tier}})", + "subscribe_dialog_login_username_label": "Nome de usuario, ex. phil", + "subscribe_dialog_error_user_not_authorized": "Usuario {{username}} non autorizado", + "account_basics_title": "Conta", + "account_basics_phone_numbers_no_phone_numbers_yet": "Aínda non hay números de teléfono", + "subscribe_dialog_subscribe_button_generate_topic_name": "Xerar nome", + "subscribe_dialog_login_password_label": "Contrasinal", + "subscribe_dialog_subscribe_button_subscribe": "Subscribirse", + "account_basics_phone_numbers_dialog_title": "Engadir número de teléfono", + "account_basics_username_admin_tooltip": "É vostede Admin", + "account_delete_dialog_description": "Isto borrará permanentemente a túa conta, incluido todos os datos almacenados no servidor. Despois do borrado, o teu nome de usuario non estará dispoñible durante 7 días. Se realmente queres proceder, por favor confirme co seu contrasinal na caixa inferior.", + "account_usage_reservations_none": "Non hai temas reservados para esta conta", + "subscribe_dialog_subscribe_topic_placeholder": "Nome do tema, ex. phil_alertas", + "account_usage_title": "Uso", + "account_basics_tier_upgrade_button": "Mexorar a Pro", + "subscribe_dialog_error_topic_already_reserved": "Tema xa reservado", + "account_basics_tier_admin_suffix_no_tier": "(sen tier)", + "account_basics_tier_payment_overdue": "O pago está retrasado. Por favor, revise o seu método de pago o a súa conta será degradada pronto.", + "account_basics_phone_numbers_description": "Para notificacións telefónicas", + "account_basics_tier_free": "De balde", + "account_basics_tier_admin": "Admin", + "account_delete_dialog_button_cancel": "Cancelar", + "account_basics_password_description": "Modificar o contrasinal da conta", + "account_usage_calls_title": "Chamadas realizadas", + "account_basics_tier_basic": "Básico", + "account_basics_phone_numbers_copied_to_clipboard": "Número de teléfono copiado no portapapeis", + "account_basics_tier_title": "Tipo de conta", + "account_usage_cannot_create_portal_session": "Non foi posible abrir o portal de pagos", + "account_delete_description": "Borrar permanentemente a túa conta", + "account_basics_phone_numbers_dialog_number_placeholder": "ex. +1222333444", + "account_basics_phone_numbers_dialog_code_placeholder": "ex. 123456", + "account_basics_tier_manage_billing_button": "Xestionar pagos", + "account_basics_username_description": "Ei, ese eres ti ❤", + "account_basics_password_dialog_confirm_password_label": "Confirmar contrasinal", + "account_basics_tier_interval_yearly": "anual", + "account_delete_dialog_button_submit": "Borrar permanentemente a conta", + "account_basics_phone_numbers_dialog_channel_call": "Chamada", + "account_basics_password_title": "Contrasinal", + "account_basics_password_dialog_new_password_label": "Novo contrasinal", + "account_usage_of_limit": "de {{limit}}", + "subscribe_dialog_error_user_anonymous": "anónimo", + "account_usage_basis_ip_description": "Estadísticas de uso e límites para esta conta están basados na sua IP, polo que poden estar compartidos con outros usuarios. Os limites mostrados son aproximados, basados nos ratios de limite existentes.", + "account_basics_password_dialog_title": "Modificar contrasinal", + "account_usage_limits_reset_daily": "Límite de uso é reiniciado diariamente a medianoite (UTC(", + "account_usage_unlimited": "Sen límites", + "account_basics_phone_numbers_title": "Números de teléfono", + "account_basics_password_dialog_current_password_label": "Contrasinal actual", + "subscribe_dialog_subscribe_base_url_label": "URL do servizo", + "account_usage_reservations_title": "Temas reservados", + "account_usage_calls_none": "Non se poden realizar chamadas con esta conta", + "subscribe_dialog_subscribe_use_another_label": "Usar outro servidor", + "account_basics_phone_numbers_dialog_code_label": "Código de verificación", + "account_basics_tier_paid_until": "Suscripción pagada ata {{date}}, e vaise auto-renovar", + "account_usage_attachment_storage_description": "{{filesize}} por arquivo, borrado despois de {{expiry}}", + "account_basics_phone_numbers_dialog_verify_button_call": "Chámame", + "account_usage_emails_title": "Emails enviados", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "subscribe_dialog_login_description": "Este tema está protexido por contrasinal. Por favor, introduza o usuario e contrasinal para subscribirse." } From 68a7756621946c366ebfb99c614f7255e0494183 Mon Sep 17 00:00:00 2001 From: Mazurky Date: Sat, 9 Sep 2023 15:29:57 +0000 Subject: [PATCH 054/182] Translated using Weblate (Slovak) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sk/ --- web/public/static/langs/sk.json | 209 +++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/sk.json b/web/public/static/langs/sk.json index e2a54dba..8ea1b45f 100644 --- a/web/public/static/langs/sk.json +++ b/web/public/static/langs/sk.json @@ -173,5 +173,212 @@ "publish_dialog_attach_placeholder": "Pripojiť súbor pomocou URL adresy, napr. https://f-droid.org/F-Droid.apk", "publish_dialog_chip_email_label": "Preposlanie na email", "publish_dialog_chip_attach_file_label": "Pripojiť miestny súbor", - "publish_dialog_details_examples_description": "Príklady a podrobný opis všetkých funkcií odosielania nájdete v dokumentácii." + "publish_dialog_details_examples_description": "Príklady a podrobný opis všetkých funkcií odosielania nájdete v dokumentácii.", + "account_upgrade_dialog_tier_features_no_calls": "Žiadne telefonáty", + "account_upgrade_dialog_billing_contact_email": "V prípade otázok týkajúcich sa fakturácie nás prosím kontaktujte tu.", + "account_tokens_dialog_title_create": "Vytvoriť prístupový token", + "prefs_reservations_dialog_title_edit": "Upraviť rezervovanú tému", + "account_basics_tier_interval_monthly": "mesačne", + "account_basics_tier_canceled_subscription": "Vaše predplatné bolo zrušené a bude preradené na bezplatné konto k dátumu {{date}}.", + "priority_default": "predvolená", + "prefs_notifications_min_priority_title": "Najnižšia priorita", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} denný telefonát", + "account_upgrade_dialog_tier_current_label": "Aktuálne", + "account_basics_password_dialog_current_password_incorrect": "Nesprávne heslo", + "account_tokens_table_token_header": "Token", + "prefs_notifications_delete_after_never": "Nikdy", + "prefs_users_description": "Tu môžete pridávať/odstraňovať používateľov pre svoje chránené témy. Upozorňujeme, že používateľské meno a heslo sú uložené v lokálnom úložisku prehliadača.", + "account_basics_phone_numbers_dialog_number_label": "Telefónne číslo", + "subscribe_dialog_subscribe_description": "Témy nemusia byť chránené heslom, preto vyberte názov, ktorý nie je ľahké uhádnuť. Po prihlásení sa na odber môžete PUT/POST oznámenia.", + "account_basics_password_dialog_button_submit": "Zmeniť heslo", + "account_basics_phone_numbers_dialog_check_verification_button": "Potvrdiť kód", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "ušetrite až {{discount}}%", + "account_tokens_dialog_label": "Označenie, napr. Radarr notifications", + "account_tokens_table_expires_header": "Vyprší", + "account_upgrade_dialog_proration_info": "Vyhlásenie: Pri prechode medzi platenými plánmi sa rozdiel v cene účtuje okamžite. Pri prechode na nižšiu úroveň sa zostatok použije na platbu za budúce fakturačné obdobia.", + "prefs_reservations_dialog_access_label": "Prístup", + "account_usage_attachment_storage_title": "Ukladanie príloh", + "prefs_users_dialog_username_label": "Používateľské meno, napr. phil", + "account_usage_messages_title": "Zverejnené správy", + "emoji_picker_search_clear": "Vymazať vyhľadávanie", + "prefs_reservations_table_not_subscribed": "Odber nie je prihlásený", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} denné emaily", + "prefs_notifications_min_priority_max_only": "Iba najvyššia priorita", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} denné telefonáty", + "prefs_notifications_sound_description_some": "Oznámenia pri príchode prehrávajú zvuk {{sound}}", + "prefs_reservations_edit_button": "Upraviť prístup k téme", + "account_basics_phone_numbers_dialog_verify_button_sms": "Poslať SMS", + "account_basics_tier_change_button": "Zmeniť", + "account_tokens_dialog_expires_never": "Platnosť tokenu nikdy nevyprší", + "subscribe_dialog_login_title": "Vyžaduje sa prihlásenie", + "account_tokens_dialog_expires_x_days": "Token vyprší za {{days}} dní", + "prefs_reservations_table_everyone_read_only": "Môžem publikovať a odoberať, každý môže odoberať", + "prefs_reservations_table_everyone_deny_all": "Iba ja môžem publikovať a odoberať", + "account_basics_phone_numbers_dialog_description": "Ak chcete používať funkciu oznamovanie hovorom, musíte pridať a overiť aspoň jedno telefónne číslo. Overenie je možné vykonať prostredníctvom SMS alebo telefonického hovoru.", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} rezervovaná téma", + "account_delete_title": "Odstrániť účet", + "subscribe_dialog_login_button_login": "Prihlásenie", + "account_upgrade_dialog_tier_features_no_reservations": "Žiadne rezervované témy", + "prefs_users_table_cannot_delete_or_edit": "Nie je možné odstrániť alebo upraviť prihláseného používateľa", + "account_basics_tier_admin_suffix_with_tier": "(s úrovňou {{tier}})", + "prefs_notifications_delete_after_three_hours_description": "Oznámenia sa automaticky odstránia po troch hodinách", + "prefs_notifications_delete_after_three_hours": "Po troch hodinách", + "prefs_notifications_min_priority_description_x_or_higher": "Zobraziť oznámenia, ak je priorita {{number}} ({{name}}) alebo vyššia", + "reservation_delete_dialog_description": "Odstránením rezervácie sa vzdáte vlastníctva témy a umožníte ostatným, aby si ju rezervovali. Existujúce správy a prílohy si môžete ponechať alebo odstrániť.", + "subscribe_dialog_login_username_label": "Používateľské meno, napr. phil", + "subscribe_dialog_error_user_not_authorized": "Používateľ {{username}} nie je autorizovaný", + "prefs_reservations_table_everyone_read_write": "Každý môže publikovať a odoberať", + "prefs_reservations_dialog_title_delete": "Odstrániť rezervovanú tému", + "prefs_users_table": "Tabuľka používateľov", + "prefs_reservations_table_topic_header": "Téma", + "reservation_delete_dialog_submit_button": "Odstrániť rezerváciu", + "prefs_reservations_limit_reached": "Dosiahli ste limit rezervovaných tém.", + "account_upgrade_dialog_interval_monthly": "Mesačne", + "prefs_users_add_button": "Pridať používateľa", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} denné správy", + "account_basics_phone_numbers_no_phone_numbers_yet": "Zatiaľ žiadne telefónne čísla", + "subscribe_dialog_subscribe_button_generate_topic_name": "Vygenerovať názov", + "prefs_appearance_language_title": "Jazyk", + "prefs_notifications_delete_after_one_day_description": "Oznámenia sa automaticky odstránia po jednom dni", + "subscribe_dialog_subscribe_button_subscribe": "Odoberať", + "account_tokens_table_never_expires": "Nikdy nevyprší", + "account_tokens_delete_dialog_title": "Odstrániť prístupový token", + "prefs_notifications_delete_after_one_month": "Po jednom mesiaci", + "account_basics_phone_numbers_dialog_title": "Pridať telefónne číslo", + "account_tokens_delete_dialog_description": "Pred odstránením prístupového tokenu sa uistite, že ho aktívne nepoužívajú žiadne aplikácie ani skripty. Túto akciu nie je možné vrátiť späť.", + "account_tokens_table_label_header": "Označenie", + "account_upgrade_dialog_billing_contact_website": "Otázky týkajúce sa fakturácie nájdete na našej webovej stránke.", + "account_basics_username_admin_tooltip": "Ste Admin", + "prefs_notifications_delete_after_never_description": "Oznámenia sa nikdy automaticky neodstránia", + "account_delete_dialog_description": "Tým sa vaše konto natrvalo odstráni vrátane všetkých údajov uložených na serveri. Po vymazaní bude vaše používateľské meno 7 dní nedostupné. Ak naozaj chcete pokračovať, potvrďte svoje heslo v poli nižšie.", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} rezervované témy", + "account_usage_reservations_none": "Žiadne rezervované témy pre toto konto", + "prefs_notifications_sound_description_none": "Pri príchode oznámení sa neprehráva žiadny zvuk", + "account_tokens_description": "Pri publikovaní a prihlasovaní prostredníctvom rozhrania ntfy API používajte prístupové tokeny, aby ste nemuseli posielať prihlasovacie údaje k účtu. Viacej informácií nájdete v dokumentácií.", + "prefs_reservations_table": "Tabuľka rezervovaných tém", + "emoji_picker_search_placeholder": "Vyhľadať emoji", + "account_upgrade_dialog_button_cancel_subscription": "Zrušiť predplatné", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} denný email", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} na jeden súbor", + "prefs_reservations_description": "Tu si môžete rezervovať názvy tém na osobné použitie. Rezervovaním témy získate vlastníctvo nad témou a môžete definovať prístupové práva pre ostatných používateľov k téme.", + "account_usage_title": "Používanie", + "account_basics_tier_upgrade_button": "Vylepšiť na PRO verziu", + "prefs_users_description_no_sync": "Používatelia a heslá nie sú synchronizované s vaším účtom.", + "account_tokens_dialog_title_edit": "Upraviť prístupový token", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} denná správa", + "account_upgrade_dialog_reservations_warning_one": "Vybraná úroveň umožňuje menej rezervovaných tém ako vaša aktuálna úroveň. Pred zmenou úrovne vymažte aspoň jednu rezerváciu. Rezervácie môžete odstrániť v Nastaveniach.", + "subscribe_dialog_error_topic_already_reserved": "Téma je už rezervovaná", + "prefs_users_table_user_header": "Používateľ", + "error_boundary_stack_trace": "Výpis zásobníka", + "prefs_notifications_delete_after_one_week": "Po jednom týždni", + "prefs_reservations_delete_button": "Resetovať prístup k téme", + "account_basics_tier_admin_suffix_no_tier": "(bez úrovne)", + "prefs_notifications_delete_after_one_week_description": "Oznámenia sa automaticky odstránia po jednom týždni", + "error_boundary_unsupported_indexeddb_description": "Webová aplikácia ntfy potrebuje na fungovanie IndexedDB a váš prehliadač nepodporuje IndexedDB v režime súkromného prehliadania.

Je to síce nešťastné, ale aj tak nemá veľký zmysel používať webovú aplikáciu ntfy v režime súkromného prehliadania, pretože všetko je uložené v úložisku prehliadača. Viac informácií si môžete prečítať v tomto probléme GitHubu alebo sa s nami porozprávať na Discord alebo Matrix.", + "account_basics_tier_payment_overdue": "Vaša platba je po termíne splatnosti. Aktualizujte prosím svoj spôsob platby, inak bude váš účet preradený do nižšej kategórie.", + "account_basics_tier_description": "Úroveň výkonu vášho účtu", + "account_basics_phone_numbers_description": "Pre oznamovanie hovorom", + "account_basics_tier_free": "Zadarmo", + "account_upgrade_dialog_cancel_warning": "Týmto zrušíte svoje predplatné a {{date}} prejdete na nižšiu úroveň svojho účtu. V tento deň budú odstránené rezervácie tém, ako aj správy uložené vo vyrovnávacej pamäti servera.", + "account_basics_tier_admin": "Admin", + "prefs_notifications_sound_title": "Zvuk oznámenia", + "prefs_notifications_min_priority_default_and_higher": "Predvolená priorita a vyššia", + "prefs_reservations_table_access_header": "Prístup", + "account_tokens_table_copied_to_clipboard": "Prístupový token skopírovaný", + "account_tokens_dialog_expires_x_hours": "Token vyprší za {{hours}} hodín", + "prefs_users_edit_button": "Upraviť používateľa", + "account_upgrade_dialog_title": "Zmeniť úroveň účtu", + "priority_low": "nízka", + "prefs_reservations_table_click_to_subscribe": "Kliknutím sa prihlásite na odber", + "account_basics_password_description": "Zmeniť heslo účtu", + "account_usage_calls_title": "Uskutočnené telefonické hovory", + "error_boundary_description": "Toto samozrejme nemalo nastať. Je mi to veľmi ľúto.
Ak máte chvíľu, nahláste to na GitHub alebo nám dajte vedieť cez Discord alebo Matrix.", + "priority_min": "najnižšia", + "account_basics_tier_basic": "Základný", + "prefs_notifications_min_priority_description_any": "Zobraziť všetky oznámenia bez ohľadu na prioritu", + "error_boundary_gathering_info": "Získajte viac informácií…", + "error_boundary_unsupported_indexeddb_title": "Súkromné prehliadanie nie je podporované", + "prefs_notifications_delete_after_one_day": "Po jednom dni", + "error_boundary_title": "Ale nie, ntfy prestalo fungovať", + "reservation_delete_dialog_action_keep_description": "Správy a prílohy, ktoré sú uložené v medzipamäti na serveri, budú verejne viditeľné pre ľudí, ktorí poznajú názov témy.", + "prefs_reservations_add_button": "Pridať rezervovanú tému", + "prefs_reservations_title": "Rezervované témy", + "account_basics_phone_numbers_copied_to_clipboard": "Telefónne číslo skopírované do schránky", + "prefs_reservations_dialog_description": "Rezervovaním témy získate vlastníctvo nad témou a môžete definovať prístupové práva pre ostatných používateľov k téme.", + "account_basics_tier_title": "Typ účtu", + "account_usage_cannot_create_portal_session": "Nemožnosť otvoriť fakturačný portál", + "account_tokens_delete_dialog_submit_button": "Trvalo odstrániť token", + "account_delete_description": "Natrvalo odstrániť vaše konto", + "account_basics_phone_numbers_dialog_number_placeholder": "napr. +1222333444", + "account_basics_phone_numbers_dialog_code_placeholder": "napr. 123456", + "prefs_notifications_title": "Oznámenia", + "account_basics_tier_manage_billing_button": "Spravovať fakturáciu", + "account_tokens_title": "Prístupové tokeny", + "account_basics_username_description": "Hej, to si ty ❤", + "prefs_reservations_dialog_topic_label": "Téma", + "prefs_users_title": "Správa používateľov", + "account_basics_tier_interval_yearly": "ročne", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} za rok. Účtuje sa mesačne.", + "account_delete_dialog_button_submit": "Natrvalo odstrániť konto", + "account_basics_phone_numbers_dialog_channel_call": "Hovor", + "account_basics_password_dialog_new_password_label": "Nové heslo", + "account_tokens_dialog_expires_unchanged": "Ponechať dátum skončenia platnosti nezmenený", + "error_boundary_button_copy_stack_trace": "Kopírovať výpis zásobníka", + "account_tokens_dialog_title_delete": "Odstrániť prístupový token", + "account_usage_of_limit": "z {{limit}}", + "reservation_delete_dialog_action_keep_title": "Ponechať správy a prílohy uložené v medzipamäti", + "prefs_notifications_sound_no_sound": "Bez zvuku", + "account_upgrade_dialog_interval_yearly": "Ročne", + "account_upgrade_dialog_button_redirect_signup": "Zaregistrujte sa teraz", + "subscribe_dialog_error_user_anonymous": "anonymný", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} účtovaná ročne. Uložiť {{save}}.", + "prefs_notifications_min_priority_high_and_higher": "Vysoká priorita a vyššia", + "account_usage_basis_ip_description": "Štatistiky a limity používania tohto účtu sú založené na vašej IP adrese, takže môžu byť zdieľané s ostatnými používateľmi. Vyššie uvedené limity sú približné hodnoty založené na existujúcich rýchlostných limitoch.", + "account_basics_password_dialog_title": "Zmeniť heslo", + "priority_max": "najvyššia", + "account_usage_limits_reset_daily": "Limity používania sa obnovujú denne o polnoci (UTC)", + "account_usage_unlimited": "Nekonečné", + "prefs_users_delete_button": "Odstrániť používateľa", + "prefs_notifications_min_priority_any": "Akákoľvek priorita", + "account_tokens_dialog_expires_label": "Platnosť prístupového tokenu vyprší za", + "account_basics_phone_numbers_title": "Telefónne čísla", + "prefs_notifications_delete_after_title": "Odstrániť oznámenia", + "account_upgrade_dialog_interval_yearly_discount_save": "ušetríte {{discount}}%", + "prefs_users_dialog_title_edit": "Upraviť používateľa", + "account_basics_password_dialog_current_password_label": "Aktuálne heslo", + "prefs_notifications_min_priority_low_and_higher": "Nízka priorita a vyššia", + "account_tokens_dialog_button_update": "Aktualizovať token", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} celkový úložný priestor", + "prefs_reservations_table_everyone_write_only": "Môžem publikovať a odoberať, každý môže publikovať", + "prefs_appearance_title": "Vzhlad", + "account_tokens_table_cannot_delete_or_edit": "Nie je možné upraviť alebo odstrániť aktuálny token relácie", + "prefs_notifications_sound_play": "Prehrať vybraný zvuk", + "account_tokens_table_last_access_header": "Posledný prístup", + "account_tokens_table_last_origin_tooltip": "Z IP adresy {{ip}}, kliknite na vyhľadávanie", + "account_usage_reservations_title": "Rezervované témy", + "account_upgrade_dialog_tier_price_per_month": "mesiac", + "account_usage_calls_none": "S týmto účtom nie je možné uskutočňovať žiadne telefonické hovory", + "account_tokens_table_current_session": "Aktuálna relácia prehliadača", + "account_upgrade_dialog_button_pay_now": "Zaplatiť a predplatiť si", + "subscribe_dialog_subscribe_use_another_label": "Použiť iný server", + "reservation_delete_dialog_action_delete_title": "Odstrániť správy a prílohy uložené v medzipamäti", + "account_basics_phone_numbers_dialog_code_label": "Overovací kód", + "reservation_delete_dialog_action_delete_description": "Správy a prílohy uložené v medzipamäti sa natrvalo vymažú. Túto akciu nemožno vrátiť späť.", + "account_basics_tier_paid_until": "Predplatné zaplatené do {{date}} s automatickou obnovou", + "account_usage_attachment_storage_description": "{{filesize}} na súbor, vymazaný po {{expiry}}", + "prefs_notifications_delete_after_one_month_description": "Oznámenia sa automaticky odstránia po jednom mesiaci", + "account_basics_phone_numbers_dialog_verify_button_call": "Zavolajte mi", + "prefs_users_dialog_base_url_label": "URL adresa služby, napr. https://ntfy.sh", + "account_usage_emails_title": "Odoslané emaily", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_upgrade_dialog_tier_selected_label": "Vybrané", + "account_upgrade_dialog_button_update_subscription": "Aktualizovať predplatné", + "priority_high": "vysoká", + "account_delete_dialog_billing_warning": "Odstránením konta sa okamžite zruší aj vaše fakturačné predplatné. Už nebudete mať prístup k fakturačnému panelu.", + "prefs_notifications_min_priority_description_max": "Zobraziť oznámenia, ak je priorita 5 (max)", + "subscribe_dialog_login_description": "Táto téma je chránená heslom. Ak sa chcete prihlásiť na odber témy, zadajte používateľské meno a heslo.", + "account_upgrade_dialog_reservations_warning_other": "Vybraná úroveň umožňuje menej rezervovaných tém ako vaša aktuálna úroveň. Pred zmenou úrovne vymažte aspoň {{count}} rezervácií. Rezervácie môžete odstrániť v Nastaveniach.", + "prefs_users_dialog_title_add": "Pridať používateľa", + "account_tokens_dialog_button_create": "Vytvoriť token", + "account_tokens_table_create_token_button": "Vytvoriť prístupový token" } From d2e2791729bc70062da1b415def907a65a35b9a6 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Sun, 17 Sep 2023 10:39:59 -0600 Subject: [PATCH 055/182] Add instructions for local-only email publishing --- docs/config.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/config.md b/docs/config.md index bb7f7e1b..03a624e8 100644 --- a/docs/config.md +++ b/docs/config.md @@ -466,6 +466,31 @@ $ dig A mx1.ntfy.sh +short 3.139.215.220 ``` +### Local-only email +If you want to send emails from an internal service on the same network as your ntfy instance, you do not need to +worry about DNS records at all. Define a port for the SMTP server and pick an SMTP server domain (can be +anything). + +=== "/etc/ntfy/server.yml" + ``` yaml + smtp-server-listen: ":25" + smtp-server-domain: "example.com" + smtp-server-addr-prefix: "ntfy-" # optional + ``` + +Then, in the email settings of your internal service, set the SMTP server address to the IP address of your +ntfy instance. Set the port to the value you defined in `smtp-server-listen`. Leave any username and password +fields empty. In the "From" address, pick anything (e.g., "alerts@ntfy.sh"); the value doesn't matter. +In the "To" address, put in an email address that follows this pattern: `[topic]@[smtp-server-domain]` (or +`[smtp-server-addr-prefix][topic]@[smtp-server-domain]` if you set `smtp-server-addr-prefix`). + +So if you used `example.com` as the SMTP server domain, and you want to send a message to the `email-alerts` +topic, set the "To" address to `email-alerts@example.com`. If the topic has access restrictions, you will need +to include an access token in the "To" address, such as `email-alerts+tk_AbC123dEf456@example.com`. + +If the internal service lets you use define an email "Subject", it will become the title of the notification. +The body of the email will become the message of the notification. + ## Behind a proxy (TLS, etc.) !!! warning If you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise, all visitors are From b05d27ce459dce8f30b8143187b661fd7dabd2c4 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Sun, 17 Sep 2023 19:03:10 +0000 Subject: [PATCH 056/182] Translated using Weblate (Bulgarian) Currently translated at 87.6% (335 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index 1d1066f6..d3b73449 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -318,5 +318,20 @@ "account_upgrade_dialog_tier_features_emails_one": "{{emails}} ел. писмо на ден", "account_upgrade_dialog_tier_features_emails_other": "{{emails}} ел. писма на ден", "account_upgrade_dialog_tier_features_calls_one": "{{calls}} телефонни обаждания на ден", - "account_usage_attachment_storage_description": "{{filesize}} на файл, изтриване след {{expiry}}" + "account_usage_attachment_storage_description": "{{filesize}} на файл, изтриване след {{expiry}}", + "account_upgrade_dialog_billing_contact_email": "За въпроси относно плащанията се свържете с нас.", + "account_upgrade_dialog_tier_current_label": "Текущо", + "account_upgrade_dialog_billing_contact_website": "За въпроси относно плащанията се обърнете към страницата.", + "account_upgrade_dialog_button_cancel_subscription": "Прекратяване на абонамент", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} на файл", + "account_upgrade_dialog_reservations_warning_one": "Избраното ниво разрешава по-малко резервирани теми, от колкото текущото. Преди промяна на нивото изтрийте най-малко една резервирана тема. Можете да премахвате теми в Настройки.", + "account_tokens_title": "Кодове за достъп", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} на година. Плаща се всеки месец.", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} плащане на година. Спестявате {{save}}.", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} общ обем", + "account_upgrade_dialog_tier_price_per_month": "на месец", + "account_upgrade_dialog_button_pay_now": "Плащане и абониране", + "account_upgrade_dialog_tier_selected_label": "Избрано", + "account_upgrade_dialog_button_update_subscription": "Премяна на абонамент", + "account_upgrade_dialog_reservations_warning_other": "Избраното ниво разрешава по-малко резервирани теми, от колкото текущото. Преди промяна на нивото изтрийте най-малко {{count}} резервирани теми. Можете да премахвате теми в Настройки." } From d10a5df3dff623661a6f30a326fe42809d69f8d9 Mon Sep 17 00:00:00 2001 From: Federico Nellen Date: Mon, 18 Sep 2023 13:50:55 +0000 Subject: [PATCH 057/182] Translated using Weblate (Italian) Currently translated at 77.4% (296 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 72cee7d6..9d030c14 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -268,5 +268,31 @@ "publish_dialog_chip_call_no_verified_numbers_tooltip": "Nessun numero verificato", "account_basics_phone_numbers_title": "Numeri di telefono", "account_basics_phone_numbers_dialog_description": "Per usare la funzionalità di notifica tramite chiamata telefonica, devi aggiungere e verificare almeno un numero di telefono. La verifica può essere fatta tramite SMS o chiamata telefonica.", - "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} topic riservato" + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} topic riservato", + "account_upgrade_dialog_billing_contact_email": "Per domande di fatturazione, contattaci direttamente.", + "account_upgrade_dialog_tier_current_label": "Attuale", + "account_basics_phone_numbers_dialog_number_label": "Numero di telefono", + "account_basics_phone_numbers_dialog_check_verification_button": "Conferma codice", + "account_basics_phone_numbers_dialog_verify_button_sms": "Invia SMS", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ancora nessun numero di telefono", + "account_basics_phone_numbers_dialog_title": "Aggiungi un numero di telefono", + "account_upgrade_dialog_button_cancel": "Cancella", + "account_upgrade_dialog_billing_contact_website": "Per domande di fatturazione, visita per favore in nostro sito.", + "account_upgrade_dialog_button_cancel_subscription": "Cancella iscrizione", + "account_basics_phone_numbers_description": "Per notifiche via chiamata", + "account_basics_phone_numbers_copied_to_clipboard": "Numero di telefono copiato negli appunti", + "account_basics_phone_numbers_dialog_number_placeholder": "p. e. +391234567890", + "account_basics_phone_numbers_dialog_code_placeholder": "p. e. 123456", + "account_tokens_title": "Token d'accesso", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} all'anno. Addebitato annualmente.", + "account_basics_phone_numbers_dialog_channel_call": "Chiama", + "account_upgrade_dialog_button_redirect_signup": "Iscriviti ora", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} addebitato annualmente. Risparmia {{save}}.", + "account_upgrade_dialog_tier_price_per_month": "mese", + "account_upgrade_dialog_button_pay_now": "Paga ora e isciviti", + "account_basics_phone_numbers_dialog_code_label": "Codice di verifica", + "account_basics_phone_numbers_dialog_verify_button_call": "Chiamami", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_upgrade_dialog_tier_selected_label": "Selezionato", + "account_upgrade_dialog_button_update_subscription": "Aggiorna iscrizione" } From bc802bfc77bddd4c13bf3a191c90c2e70ff4f64f Mon Sep 17 00:00:00 2001 From: Andrea Guarnaccia Date: Wed, 20 Sep 2023 14:37:30 +0000 Subject: [PATCH 058/182] Translated using Weblate (Italian) Currently translated at 80.1% (306 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 9d030c14..afca0797 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -294,5 +294,14 @@ "account_basics_phone_numbers_dialog_verify_button_call": "Chiamami", "account_basics_phone_numbers_dialog_channel_sms": "SMS", "account_upgrade_dialog_tier_selected_label": "Selezionato", - "account_upgrade_dialog_button_update_subscription": "Aggiorna iscrizione" + "account_upgrade_dialog_button_update_subscription": "Aggiorna iscrizione", + "account_usage_attachment_storage_title": "Archivio allegati", + "account_delete_dialog_description": "Il tuo account sarà permanentemente cancellato assieme a tutti i tuoi dati presenti sul server. Dopo la cancellazione, la tua username non sarà disponibile per 7 giorni. Se desideri davvero procedere, inserisci la tua password nella seguente casella.", + "account_delete_dialog_button_cancel": "Annulla", + "account_usage_calls_title": "Chiamate effettuate", + "account_delete_description": "Elimina permanentemente il tuo account", + "account_delete_dialog_button_submit": "Elimina il tuo account permanentemente", + "account_usage_basis_ip_description": "Le statistiche di utilizzo e i limiti per questo account sono basati sul tuo indirizzo IP, quindi potrebbero essere in condivisione con altri utenti. I limiti mostrati sopra sono approssimazioni basate sui limiti esistenti.", + "account_usage_calls_none": "Questo account non può effettuare chiamate", + "account_delete_dialog_billing_warning": "Eliminando il tuo account perderai immediatamente il tuo abbonamento. Non potrai più accedere alla dashboard di fatturazione." } From ef15b44a1bb66346b8522060e4309a8554a614dc Mon Sep 17 00:00:00 2001 From: Jakob Malchow Date: Wed, 20 Sep 2023 14:40:13 +0000 Subject: [PATCH 059/182] Translated using Weblate (Italian) Currently translated at 80.1% (306 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index afca0797..99d2cfff 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -303,5 +303,6 @@ "account_delete_dialog_button_submit": "Elimina il tuo account permanentemente", "account_usage_basis_ip_description": "Le statistiche di utilizzo e i limiti per questo account sono basati sul tuo indirizzo IP, quindi potrebbero essere in condivisione con altri utenti. I limiti mostrati sopra sono approssimazioni basate sui limiti esistenti.", "account_usage_calls_none": "Questo account non può effettuare chiamate", - "account_delete_dialog_billing_warning": "Eliminando il tuo account perderai immediatamente il tuo abbonamento. Non potrai più accedere alla dashboard di fatturazione." + "account_delete_dialog_billing_warning": "Eliminando il tuo account perderai immediatamente il tuo abbonamento. Non potrai più accedere alla dashboard di fatturazione.", + "account_delete_dialog_label": "Password" } From beffe4a1f243dd4bccd442e0012aabd9949a61f0 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 11:02:59 -0400 Subject: [PATCH 060/182] Thank you @spartan for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6379c7d2..f94594be 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 418fc98d1a2f32aacb4ecf823d8943117b3d4cd4 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 11:05:21 -0400 Subject: [PATCH 061/182] Bump deps --- go.mod | 36 +- go.sum | 36 ++ web/package-lock.json | 814 ++++++++++++++++++++++-------------------- 3 files changed, 474 insertions(+), 412 deletions(-) diff --git a/go.mod b/go.mod index 8e493e3b..05fb154b 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module heckel.io/ntfy go 1.18 require ( - cloud.google.com/go/firestore v1.12.0 // indirect - cloud.google.com/go/storage v1.32.0 // indirect + cloud.google.com/go/firestore v1.13.0 // indirect + cloud.google.com/go/storage v1.33.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/emersion/go-smtp v0.18.0 @@ -14,12 +14,12 @@ require ( github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 - golang.org/x/crypto v0.12.0 - golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/crypto v0.13.0 + golang.org/x/oauth2 v0.12.0 // indirect golang.org/x/sync v0.3.0 - golang.org/x/term v0.11.0 + golang.org/x/term v0.12.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.138.0 + google.golang.org/api v0.142.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -35,7 +35,7 @@ require ( ) require ( - cloud.google.com/go v0.110.7 // indirect + cloud.google.com/go v0.110.8 // indirect cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.2 // indirect @@ -51,30 +51,30 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/s2a-go v0.1.5 // indirect + github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.57.0 // indirect + google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/grpc v1.58.2 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 173e8e9c..046695e1 100644 --- a/go.sum +++ b/go.sum @@ -2,18 +2,24 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/firestore v1.12.0 h1:aeEA/N7DW7+l2u5jtkO8I0qv0D95YwjggD8kUHrTHO4= cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= +cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/storage v1.32.0 h1:5w6DxEGOnktmJHarxAOUywxVW9lbNWIzlzzUltG/3+o= cloud.google.com/go/storage v1.32.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= +cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= +cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= firebase.google.com/go/v4 v4.12.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= @@ -97,6 +103,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -104,6 +112,8 @@ github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= +github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -131,6 +141,8 @@ github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdO github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -162,6 +174,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -183,10 +197,14 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= 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= @@ -206,10 +224,14 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -218,6 +240,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -234,10 +258,14 @@ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3j golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.138.0 h1:K/tVp05MxNVbHShRw9m7e9VJGdagNeTdMzqPH7AUqr0= google.golang.org/api v0.138.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= +google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= +google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= 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.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/appengine/v2 v2.0.4 h1:aAAPYixP9EfTJjNO6F46afaxp+jfzb0VgwVjMeLBtF4= google.golang.org/appengine/v2 v2.0.4/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/appengine/v2 v2.0.5 h1:4C+F3Cd3L2nWEfSmFEZDPjQvDwL8T0YCeZBysZifP3k= @@ -250,14 +278,20 @@ google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJg google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 h1:WGq4lvB/mlicysM/dUT3SBvijH4D3sm/Ny1A4wmt2CI= google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= +google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -268,6 +302,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/web/package-lock.json b/web/package-lock.json index cb15d61f..d4ba68bf 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -80,30 +80,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", - "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -119,12 +119,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -146,25 +146,25 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -174,15 +174,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", - "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -197,9 +197,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -230,9 +230,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -264,39 +264,39 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", + "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -327,14 +327,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -344,13 +344,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -405,56 +405,56 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", - "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -463,9 +463,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz", - "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -475,9 +475,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -490,14 +490,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -510,7 +510,6 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, "engines": { "node": ">=6.9.0" @@ -770,9 +769,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", - "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -820,9 +819,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", + "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -868,18 +867,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -907,9 +906,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", + "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1001,9 +1000,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1111,12 +1110,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", - "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", + "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1225,16 +1224,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", - "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1276,9 +1275,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", - "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", + "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1293,9 +1292,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1557,17 +1556,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.14", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.14.tgz", - "integrity": "sha512-daodMIoVo+ol/g+//c/AH+szBkFj4STQUikvBijRGL72Ph+w+AMTSh55DUETe8KJlPlDT1k/mp7NBfOuiWmoig==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", + "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", + "@babel/compat-data": "^7.22.20", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1588,39 +1587,39 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.11", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-block-scoping": "^7.22.15", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-destructuring": "^7.22.15", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.11", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", "@babel/plugin-transform-modules-systemjs": "^7.22.11", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.12", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", @@ -1636,7 +1635,7 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.11", + "@babel/types": "^7.22.19", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-regenerator": "^0.5.2", @@ -1671,9 +1670,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", - "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1682,33 +1681,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1717,12 +1716,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2240,9 +2239,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2272,9 +2271,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2299,29 +2298,29 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { @@ -2337,9 +2336,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", @@ -2444,19 +2443,17 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.13", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.13.tgz", - "integrity": "sha512-uC0l97pBspfDAp+iz2cJq8YZ8Sd9i73V77+WzUiOAckIVEyCm5dyVDZCCO2/phmzckVEeZCGcytybkjMQuhPQw==", + "version": "5.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz", + "integrity": "sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@emotion/is-prop-valid": "^1.2.1", - "@floating-ui/react-dom": "^2.0.1", + "@babel/runtime": "^7.22.15", + "@floating-ui/react-dom": "^2.0.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.7", + "@mui/utils": "^5.14.10", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -2477,20 +2474,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.7.tgz", - "integrity": "sha512-sCWTUNElBPgB30iLvWe3PU7SIlTKZNf6/E/sko85iHVeHCM6WPkDw+y89CrZYjhFNmPqt2fIQM/pZu+rP2lFLA==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz", + "integrity": "sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.7.tgz", - "integrity": "sha512-mWp4DwMa8c1Gx9yOEtPgxM4b+e6hAbtZyzfSubdBwrnEE6G5D2rbAJ5MB+If6kfI48JaYaJ5j8+zAdmZLuZc0A==", + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.9.tgz", + "integrity": "sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw==", "dependencies": { - "@babel/runtime": "^7.22.10" + "@babel/runtime": "^7.22.15" }, "engines": { "node": ">=12.0.0" @@ -2511,16 +2508,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.7.tgz", - "integrity": "sha512-jIZj9F7zMv6IlyaYDVv5M2Kp20jIX8c0kzuwteySHS/A0IvPVyomQEPtWc51MCbpDNCqzwoZUp3rQtA2lI8k7A==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.10.tgz", + "integrity": "sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/base": "5.0.0-beta.13", - "@mui/core-downloads-tracker": "^5.14.7", - "@mui/system": "^5.14.7", + "@babel/runtime": "^7.22.15", + "@mui/base": "5.0.0-beta.16", + "@mui/core-downloads-tracker": "^5.14.10", + "@mui/system": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.7", + "@mui/utils": "^5.14.10", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2555,12 +2552,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.7.tgz", - "integrity": "sha512-Y86+hmDnJab2Ka42PgxKpK3oL7EiacbeeX3X/lG9LGO0wSc45wZjHeTfIlVSkkUCkexiMKEJp5NlSjZhr27NRQ==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.10.tgz", + "integrity": "sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/utils": "^5.14.7", + "@babel/runtime": "^7.22.15", + "@mui/utils": "^5.14.10", "prop-types": "^15.8.1" }, "engines": { @@ -2581,11 +2578,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.7.tgz", - "integrity": "sha512-hKBETEDsIAkL8/mBwPiQj/vw28OeIhMXC3Tvj4J2bb9snxAKpiZioR1PwqP+6P41twsC/GKBd0Vr9oaWYaHuMg==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.10.tgz", + "integrity": "sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg==", "dependencies": { - "@babel/runtime": "^7.22.10", + "@babel/runtime": "^7.22.15", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2612,15 +2609,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.7.tgz", - "integrity": "sha512-jeZtHglc+Pi6qjGoopT6O4RqYXVBMqHVOsjMGP0hxGSSPm1T4gsAu7jU8eqGx9YwwjvvJ0eotTjFqw7iJ6qE2Q==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.10.tgz", + "integrity": "sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA==", "dependencies": { - "@babel/runtime": "^7.22.10", - "@mui/private-theming": "^5.14.7", - "@mui/styled-engine": "^5.14.7", + "@babel/runtime": "^7.22.15", + "@mui/private-theming": "^5.14.10", + "@mui/styled-engine": "^5.14.10", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.7", + "@mui/utils": "^5.14.10", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2664,13 +2661,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.7", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.7.tgz", - "integrity": "sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw==", + "version": "5.14.10", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.10.tgz", + "integrity": "sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q==", "dependencies": { - "@babel/runtime": "^7.22.10", + "@babel/runtime": "^7.22.15", "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2682,7 +2678,13 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@nodelib/fs.scandir": { @@ -2730,9 +2732,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", - "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", + "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", "engines": { "node": ">=14.0.0" } @@ -2770,9 +2772,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", + "version": "20.6.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.4.tgz", + "integrity": "sha512-nU6d9MPY0NBUMiE/nXd2IIoC4OLvsLpwAjheoAeuzgvDZA1Cb10QYg+91AF6zQiKWRN5i1m07x6sMe0niBznoQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -2781,28 +2783,20 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==" }, "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-is": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", - "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { "version": "4.4.6", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", @@ -2826,9 +2820,9 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", "dev": true }, "node_modules/@types/unist": { @@ -2940,15 +2934,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2978,14 +2972,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2996,14 +2990,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3014,27 +3008,28 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -3089,9 +3084,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", + "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", "dev": true, "engines": { "node": ">=4" @@ -3135,13 +3130,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3197,9 +3192,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", "dev": true, "funding": [ { @@ -3216,10 +3211,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -3268,9 +3263,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001525", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz", - "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==", + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", "dev": true, "funding": [ { @@ -3398,9 +3393,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { "browserslist": "^4.21.10" @@ -3506,12 +3501,27 @@ "node": ">=0.10.0" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", "dev": true, "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3586,9 +3596,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.528", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", + "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", "dev": true }, "node_modules/emoji-regex": { @@ -3614,18 +3624,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -3641,23 +3651,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -3667,14 +3677,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", - "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", @@ -3684,8 +3694,8 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" } }, "node_modules/es-set-tostringtag": { @@ -3786,16 +3796,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -4168,9 +4178,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4430,9 +4440,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/for-each": { @@ -4756,9 +4766,9 @@ } }, "node_modules/humanize-duration": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.29.0.tgz", - "integrity": "sha512-G5wZGwYTLaQAmYqhfK91aw3xt6wNbJW1RnWDh4qP1PvF4T/jnkjx2RVhG5kzB2PGsYGTn+oSDBQp+dMdILLxcg==" + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.30.0.tgz", + "integrity": "sha512-NxpT0fhQTFuMTLnuu1Xp+ozNpYirQnbV3NlOjEKBYlE3uvMRu3LDuq8EPc3gVXxVYnchQfqVM4/+T9iwHPLLeA==" }, "node_modules/i18next": { "version": "21.10.0", @@ -5309,15 +5319,16 @@ "dev": true }, "node_modules/iterator.prototype": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", - "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", + "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.3" + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, "node_modules/jake": { @@ -6187,9 +6198,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "dev": true, "funding": [ { @@ -6406,11 +6417,11 @@ } }, "node_modules/react-router": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", - "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", + "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", "dependencies": { - "@remix-run/router": "1.8.0" + "@remix-run/router": "1.9.0" }, "engines": { "node": ">=14.0.0" @@ -6420,12 +6431,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", - "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", + "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", "dependencies": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" + "@remix-run/router": "1.9.0", + "react-router": "6.16.0" }, "engines": { "node": ">=14.0.0" @@ -6477,9 +6488,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -6503,14 +6514,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6604,9 +6615,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6653,9 +6664,9 @@ } }, "node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -6692,13 +6703,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -6769,6 +6780,20 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6897,9 +6922,9 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -6909,6 +6934,7 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -6916,14 +6942,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -6933,28 +6959,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7090,9 +7116,9 @@ } }, "node_modules/terser": { - "version": "5.19.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", - "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz", + "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7441,9 +7467,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { From 8adb9ee633c5cca607892b9ab42b2685fa7fec73 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 11:45:35 -0400 Subject: [PATCH 062/182] Re-add tzdata to amd64 --- .goreleaser.yml | 6 ++-- Dockerfile | 1 + Dockerfile-arm | 18 +++++++++++ go.sum | 79 ------------------------------------------------- 4 files changed, 22 insertions(+), 82 deletions(-) create mode 100644 Dockerfile-arm diff --git a/.goreleaser.yml b/.goreleaser.yml index d3e71df2..062cce1f 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -164,14 +164,14 @@ dockers: - image_templates: - &arm64v8_image "binwiederhier/ntfy:{{ .Tag }}-arm64v8" use: buildx - dockerfile: Dockerfile + dockerfile: Dockerfile-arm goarch: arm64 build_flag_templates: - "--platform=linux/arm64/v8" - image_templates: - &armv7_image "binwiederhier/ntfy:{{ .Tag }}-armv7" use: buildx - dockerfile: Dockerfile + dockerfile: Dockerfile-arm goarch: arm goarm: 7 build_flag_templates: @@ -179,7 +179,7 @@ dockers: - image_templates: - &armv6_image "binwiederhier/ntfy:{{ .Tag }}-armv6" use: buildx - dockerfile: Dockerfile + dockerfile: Dockerfile-arm goarch: arm goarm: 6 build_flag_templates: diff --git a/Dockerfile b/Dockerfile index 7c2052ef..45dad05d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" +RUN apk add --no-cache tzdata COPY ntfy /usr/bin EXPOSE 80/tcp diff --git a/Dockerfile-arm b/Dockerfile-arm new file mode 100644 index 00000000..755092fd --- /dev/null +++ b/Dockerfile-arm @@ -0,0 +1,18 @@ +FROM alpine + +LABEL org.opencontainers.image.authors="philipp.heckel@gmail.com" +LABEL org.opencontainers.image.url="https://ntfy.sh/" +LABEL org.opencontainers.image.documentation="https://docs.ntfy.sh/" +LABEL org.opencontainers.image.source="https://github.com/binwiederhier/ntfy" +LABEL org.opencontainers.image.vendor="Philipp C. Heckel" +LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" +LABEL org.opencontainers.image.title="ntfy" +LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" + +# Alpine does not support adding "tzdata" on ARM anymore, see +# https://github.com/binwiederhier/ntfy/issues/894 + +COPY ntfy /usr/bin + +EXPOSE 80/tcp +ENTRYPOINT ["ntfy"] diff --git a/go.sum b/go.sum index 046695e1..97512a78 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,16 @@ 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.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.12.0 h1:aeEA/N7DW7+l2u5jtkO8I0qv0D95YwjggD8kUHrTHO4= -cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/storage v1.32.0 h1:5w6DxEGOnktmJHarxAOUywxVW9lbNWIzlzzUltG/3+o= -cloud.google.com/go/storage v1.32.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= @@ -31,20 +24,13 @@ github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA= github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -59,12 +45,9 @@ github.com/emersion/go-smtp v0.17.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVR github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -76,16 +59,13 @@ github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -101,24 +81,17 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= -github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -139,11 +112,8 @@ github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUo github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -151,7 +121,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -166,14 +135,10 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsr github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -183,26 +148,17 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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-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-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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -215,31 +171,23 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -253,55 +201,30 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.138.0 h1:K/tVp05MxNVbHShRw9m7e9VJGdagNeTdMzqPH7AUqr0= -google.golang.org/api v0.138.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= 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.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/appengine/v2 v2.0.4 h1:aAAPYixP9EfTJjNO6F46afaxp+jfzb0VgwVjMeLBtF4= -google.golang.org/appengine/v2 v2.0.4/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/appengine/v2 v2.0.5 h1:4C+F3Cd3L2nWEfSmFEZDPjQvDwL8T0YCeZBysZifP3k= google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 h1:Iveh6tGCJkHAjJgEqUQYGDGgbwmhjoAOz8kO/ajxefY= -google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 h1:WGq4lvB/mlicysM/dUT3SBvijH4D3sm/Ny1A4wmt2CI= -google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -320,8 +243,6 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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= From addb5efebb15d7f66c551a43a5b5c35d9600d9d0 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 11:48:26 -0400 Subject: [PATCH 063/182] Release notes --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 1e518c76..222433c3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1288,6 +1288,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) +* Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) ### ntfy Android app v1.16.1 (UNRELEASED) From d9387dac994e9c68867337154f96e8c16d692022 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 17:59:23 -0400 Subject: [PATCH 064/182] Refine logic --- server/server_test.go | 21 ++++++++++++++++++++ server/util.go | 45 +++++++++++++++++++++---------------------- server/util_test.go | 15 ++++++++++++++- util/util_test.go | 9 --------- 4 files changed, 57 insertions(+), 33 deletions(-) diff --git a/server/server_test.go b/server/server_test.go index 647268fb..d78533e9 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -329,6 +329,27 @@ func TestServer_PublishPriority(t *testing.T) { require.Equal(t, 40007, toHTTPError(t, response.Body.String()).Code) } +func TestServer_PublishPriority_SpecialHTTPHeader(t *testing.T) { + s := newTestServer(t, newTestConfig(t)) + + response := request(t, s, "POST", "/mytopic", "test", map[string]string{ + "Priority": "u=4", + "X-Priority": "5", + }) + require.Equal(t, 5, toMessage(t, response.Body.String()).Priority) + + response = request(t, s, "POST", "/mytopic?priority=4", "test", map[string]string{ + "Priority": "u=9", + }) + require.Equal(t, 4, toMessage(t, response.Body.String()).Priority) + + response = request(t, s, "POST", "/mytopic", "test", map[string]string{ + "p": "2", + "priority": "u=9, i", + }) + require.Equal(t, 2, toMessage(t, response.Body.String()).Priority) +} + func TestServer_PublishGETOnlyOneTopic(t *testing.T) { // This tests a bug that allowed publishing topics with a comma in the name (no ticket) diff --git a/server/util.go b/server/util.go index 9cbae2e4..09536765 100644 --- a/server/util.go +++ b/server/util.go @@ -8,11 +8,14 @@ import ( "mime" "net/http" "net/netip" - "strings" "regexp" + "strings" ) -var mimeDecoder mime.WordDecoder +var ( + mimeDecoder mime.WordDecoder + priorityHeaderIgnoreRegex = regexp.MustCompile(`^u=\d,\s*(i|\d)$|^u=\d$`) +) func readBoolParam(r *http.Request, defaultValue bool, names ...string) bool { value := strings.ToLower(readParam(r, names...)) @@ -51,9 +54,9 @@ func readParam(r *http.Request, names ...string) string { func readHeaderParam(r *http.Request, names ...string) string { for _, name := range names { - value := maybeDecodeHeader(r.Header.Get(name), name) + value := strings.TrimSpace(maybeDecodeHeader(name, r.Header.Get(name))) if value != "" { - return strings.TrimSpace(value) + return value } } return "" @@ -127,29 +130,25 @@ func fromContext[T any](r *http.Request, key contextKey) (T, error) { return t, nil } -func maybeDecodeHeader(header string, name string) string { - decoded, err := mimeDecoder.DecodeHeader(header) +// maybeDecodeHeader decodes the given header value if it is MIME encoded, e.g. "=?utf-8?q?Hello_World?=", +// or returns the original header value if it is not MIME encoded. It also calls maybeIgnoreSpecialHeader +// to ignore new HTTP "Priority" header. +func maybeDecodeHeader(name, value string) string { + decoded, err := mimeDecoder.DecodeHeader(value) if err != nil { - if name == "priority"{ - return cloudflarePriorityIgnore(header) - } - return header + return maybeIgnoreSpecialHeader(name, value) } - - if name == "priority"{ - return cloudflarePriorityIgnore(decoded) - } - return decoded + return maybeIgnoreSpecialHeader(name, decoded) } -// Ignore new HTTP Priority header (see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority) -// Cloudflare adds this to requests when forwarding to the backend (ntfy), so we just ignore it. -// If the Priority header is set to "u=*, i" or "u=*" (by cloudflare), the header will be ignored. -// And continue searching for another header (x-priority, prio, p) or in the Query parameters. -func cloudflarePriorityIgnore(value string) string { - pattern := `^u=\d,\s(i|\d)$|^u=\d$` - regex := regexp.MustCompile(pattern) - if regex.MatchString(value) { +// maybeIgnoreSpecialHeader ignores new HTTP "Priority" header (see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority) +// +// Cloudflare (and potentially other providers) add this to requests when forwarding to the backend (ntfy), +// so we just ignore it. If the "Priority" header is set to "u=*, i" or "u=*" (by Cloudflare), the header will be ignored. +// Returning an empty string will allow the rest of the logic to continue searching for another header (x-priority, prio, p), +// or in the Query parameters. +func maybeIgnoreSpecialHeader(name, value string) string { + if strings.ToLower(name) == "priority" && priorityHeaderIgnoreRegex.MatchString(strings.TrimSpace(value)) { return "" } return value diff --git a/server/util_test.go b/server/util_test.go index 3d062b4d..6555a81b 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -2,9 +2,9 @@ package server import ( "bytes" + "crypto/rand" "fmt" "github.com/stretchr/testify/require" - "math/rand" "net/http" "strings" "testing" @@ -75,3 +75,16 @@ Accept: */* (peeked bytes not UTF-8, peek limit of 4096 bytes reached, hex: ` + fmt.Sprintf("%x", body[:4096]) + ` ...)` require.Equal(t, expected, renderHTTPRequest(r)) } + +func TestMaybeIgnoreSpecialHeader(t *testing.T) { + require.Empty(t, maybeIgnoreSpecialHeader("priority", "u=1")) + require.Empty(t, maybeIgnoreSpecialHeader("Priority", "u=1")) + require.Empty(t, maybeIgnoreSpecialHeader("Priority", "u=1, i")) +} + +func TestMaybeDecodeHeaders(t *testing.T) { + r, _ := http.NewRequest("GET", "http://ntfy.sh/mytopic/json?since=all", nil) + r.Header.Set("Priority", "u=1") // Cloudflare priority header + r.Header.Set("X-Priority", "5") // ntfy priority header + require.Equal(t, "5", readHeaderParam(r, "x-priority", "priority", "p")) +} diff --git a/util/util_test.go b/util/util_test.go index 49a24126..f0f45c28 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -87,15 +87,6 @@ func TestParsePriority_Invalid(t *testing.T) { } } -func TestParsePriority_HTTPSpecPriority(t *testing.T) { - priorities := []string{"u=1", "u=3", "u=7, i"} // see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority - for _, priority := range priorities { - actual, err := ParsePriority(priority) - require.Nil(t, err) - require.Equal(t, 3, actual) // Always expect 3! - } -} - func TestPriorityString(t *testing.T) { priorities := []int{0, 1, 2, 3, 4, 5} expected := []string{"default", "min", "low", "default", "high", "max"} From bfc1fa51811812f627805552c50b5f29ce60559d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 18:03:09 -0400 Subject: [PATCH 065/182] Changelog --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 222433c3..bc7ed406 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1289,6 +1289,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) +* Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) ### ntfy Android app v1.16.1 (UNRELEASED) From d556a675e9df3478de81c7195c7b19eec5e3f569 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 18:04:13 -0400 Subject: [PATCH 066/182] Changelog --- docs/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index bc7ed406..4d125a97 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1289,7 +1289,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) -* Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) +* Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) ### ntfy Android app v1.16.1 (UNRELEASED) From b5851dd6d44806690cb03a264fc7da1f15fd50a9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 18:32:03 -0400 Subject: [PATCH 067/182] Links and blog posts --- docs/integrations.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/integrations.md b/docs/integrations.md index e689427e..cf3d7880 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -133,6 +133,12 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Blog + forum posts +- [Why NTFY is the Ultimate Push Notification Tool for Your Needs](https://osintph.medium.com/why-ntfy-is-the-ultimate-push-notification-tool-for-your-needs-e767421c84c5) - osintph.medium.com - 9/2023 +- [Supercharge Your Alerts: Ntfy — The Ultimate Push Notification Solution](https://medium.com/spring-boot/supercharge-your-alerts-ntfy-the-ultimate-push-notification-solution-a3dda79651fe) - spring-boot.medium.com - 9/2023 +- [Deploy Ntfy using Docker](https://www.linkedin.com/pulse/deploy-ntfy-mohamed-sharfy/) - linkedin.com - 9/2023 +- [Send Notifications With Ntfy for New WordPress Posts](https://www.activepieces.com/blog/ntfy-notifications-for-wordpress-new-posts) - activepieces.com - 9/2023 +- [Get Ntfy Notifications About New Zendesk Ticket](https://www.activepieces.com/blog/ntfy-notifications-about-new-zendesk-tickets) - activepieces.com - 9/2023 +- [Podman Update Notifications via Ntfy](https://rair.dev/podman-upadte-notifications-ntfy/) - rair.dev - 9/2023 - [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023 - [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023 - [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 7/2023 From 50bed826d0e6cc4c3e1fec641f1f2303cf430547 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 20:36:34 -0400 Subject: [PATCH 068/182] Links links links --- README.md | 5 ++++- docs/integrations.md | 12 ++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f94594be..670ffd7c 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,10 @@ as well as an [open source iOS app](https://github.com/binwiederhier/ntfy-ios) a

## [ntfy Pro](https://ntfy.sh/app) 💸 🎉 -I now offer paid plans for [ntfy.sh](https://ntfy.sh/) if you don't want to self-host, or you want to support the development of ntfy (→ [Purchase via web app](https://ntfy.sh/app)). You can **buy a plan for as low as $3.33/month** (if you use promo code `MYTOPIC`, limited time only). You can also donate via [GitHub Sponsors](https://github.com/sponsors/binwiederhier), and [Liberapay](https://liberapay.com/ntfy). I would be very humbled by your sponsorship. ❤️ +I now offer paid plans for [ntfy.sh](https://ntfy.sh/) if you don't want to self-host, or you want to support the development of +ntfy (→ [Purchase via web app](https://ntfy.sh/app)). You can **buy a plan for as low as $5/month**. +You can also donate via [GitHub Sponsors](https://github.com/sponsors/binwiederhier), and [Liberapay](https://liberapay.com/ntfy). +I would be very humbled by your sponsorship. ❤️ ## **[Documentation](https://ntfy.sh/docs/)** diff --git a/docs/integrations.md b/docs/integrations.md index cf3d7880..6da0f63f 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -129,17 +129,25 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [vigilant](https://github.com/VerifiedJoseph/vigilant) - Monitor RSS/ATOM and JSON feeds, and send push notifications on new entries (PHP) - [ansible-role-ntfy-alertmanager](https://github.com/bleetube/ansible-role-ntfy-alertmanager) - Ansible role to install xenrox/ntfy-alertmanager - [NtfyMe-Blender](https://github.com/NotNanook/NtfyMe-Blender) - Blender addon to send notifications to NtfyMe (Python) -- [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that let's you share files from your share feed to a topic of your choice. - +- [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. +- [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes + ## Blog + forum posts +- [Installing Self Host NTFY On Linux Using Docker Container](https://www.pinoylinux.org/topicsplus/containers/installing-self-host-ntfy-on-linux-using-docker-container/) - pinoylinux.org - 9/2023 +- [Homelab Notifications with ntfy](https://blog.alexsguardian.net/posts/2023/09/12/selfhosting-ntfy/) ⭐ - alexsguardian.net - 9/2023 - [Why NTFY is the Ultimate Push Notification Tool for Your Needs](https://osintph.medium.com/why-ntfy-is-the-ultimate-push-notification-tool-for-your-needs-e767421c84c5) - osintph.medium.com - 9/2023 - [Supercharge Your Alerts: Ntfy — The Ultimate Push Notification Solution](https://medium.com/spring-boot/supercharge-your-alerts-ntfy-the-ultimate-push-notification-solution-a3dda79651fe) - spring-boot.medium.com - 9/2023 - [Deploy Ntfy using Docker](https://www.linkedin.com/pulse/deploy-ntfy-mohamed-sharfy/) - linkedin.com - 9/2023 - [Send Notifications With Ntfy for New WordPress Posts](https://www.activepieces.com/blog/ntfy-notifications-for-wordpress-new-posts) - activepieces.com - 9/2023 - [Get Ntfy Notifications About New Zendesk Ticket](https://www.activepieces.com/blog/ntfy-notifications-about-new-zendesk-tickets) - activepieces.com - 9/2023 +- [Set reminder for recurring events using ntfy & Cron](https://www.youtube.com/watch?v=J3O4aQ-EcYk) - youtube.com - 9/2023 +- [ntfy - Installation and full configuration setup](https://www.youtube.com/watch?v=QMy14rGmpFI) - youtube.com - 9/2023 +- [How to install Ntfy.sh on Portainer / Docker Compose](https://www.youtube.com/watch?v=utD9GNbAwyg) - youtube.com - 9/2023 +- [ntfy - Push-Benachrichtigungen // Push Notifications](https://www.youtube.com/watch?v=LE3vRPPqZOU) - youtube.com - 9/2023 - [Podman Update Notifications via Ntfy](https://rair.dev/podman-upadte-notifications-ntfy/) - rair.dev - 9/2023 - [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023 +- [NTFY - Command-Line Notifications](https://academy.networkchuck.com/blog/ntfy/) - academy.networkchuck.com - 8/2023 - [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023 - [How to install and self host an Ntfy server on Linux](https://linuxconfig.org/how-to-install-and-self-host-an-ntfy-server-on-linux) - linuxconfig.org - 7/2023 - [Basic website monitoring using cronjobs and ntfy.sh](https://burkhardt.dev/2023/website-monitoring-cron-ntfy/) - burkhardt.dev - 6/2023 From 19c30fc41157b6793e1199b5c97ff32962825f27 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 24 Sep 2023 20:44:57 -0400 Subject: [PATCH 069/182] Add Alex's post in the install guide --- docs/install.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/install.md b/docs/install.md index bc5b7a0d..ed101554 100644 --- a/docs/install.md +++ b/docs/install.md @@ -20,8 +20,9 @@ To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` wh To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI](subscribe/cli.md) for details). -If you like video tutorials, check out :simple-youtube: [Kris Occhipinti's ntfy install guide](https://www.youtube.com/watch?v=bZzqrX05mNU). -It's short and to the point. _I am not affiliated with Kris, I just liked the video._ +If you like tutorials, check out :simple-youtube: [Kris Occhipinti's ntfy install guide](https://www.youtube.com/watch?v=bZzqrX05mNU) on YouTube, or +[Alex's Docker-based setup guide](https://blog.alexsguardian.net/posts/2023/09/12/selfhosting-ntfy/). Both are great +resources to get started. _I am not affiliated with Kris or Alex, I just liked their video/post._ ## Linux binaries Please check out the [releases page](https://github.com/binwiederhier/ntfy/releases) for binaries and From 66ef28c2e299b8736e2a749c512abdd2f9001be8 Mon Sep 17 00:00:00 2001 From: Nihal Gonsalves Date: Wed, 27 Sep 2023 23:16:05 +0200 Subject: [PATCH 070/182] fix(pwa): hide install prompt on macos 14 safari --- .../pwa-install-macos-safari-add-to-dock.png | Bin 0 -> 166445 bytes docs/subscribe/pwa.md | 7 +++++++ web/src/app/Notifier.js | 12 ++++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 docs/static/img/pwa-install-macos-safari-add-to-dock.png diff --git a/docs/static/img/pwa-install-macos-safari-add-to-dock.png b/docs/static/img/pwa-install-macos-safari-add-to-dock.png new file mode 100644 index 0000000000000000000000000000000000000000..8a780605f1db305cd95418bf502a82aeb7f10def GIT binary patch literal 166445 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�gx;->+Ue?7lO5@aQi(Di&1x@`k_=tK{%!$^q@% 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

$qO^-DjP;UvCXC_Nb@@*l$(vWkJ}+vz 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�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 B3(Noj literal 0 HcmV?d00001 diff --git a/docs/subscribe/pwa.md b/docs/subscribe/pwa.md index 582cb5ae..5dcaa257 100644 --- a/docs/subscribe/pwa.md +++ b/docs/subscribe/pwa.md @@ -26,6 +26,13 @@ app drawer: +### Safari on macOS +To install and register the web app via Safari, click on the Share menu and click Add to Dock. You need to be on macOS Sonoma (14) or higher. + +

+ +
+ ### Chrome/Firefox on Android For Chrome on Android, either click the "Add to Home Screen" banner at the bottom of the screen, or select "Install app" in the menu, and then click "Install" in the popup menu. After installation, you can find the app in your app drawer, diff --git a/web/src/app/Notifier.js b/web/src/app/Notifier.js index 4089746a..77bbdb1e 100644 --- a/web/src/app/Notifier.js +++ b/web/src/app/Notifier.js @@ -124,9 +124,17 @@ class Notifier { return window.location.protocol === "https:" || window.location.hostname.match("^127.") || window.location.hostname === "localhost"; } + // no PushManager when not installed, but it _is_ supported. iosSupportedButInstallRequired() { - // no PushManager when not installed, but it _is_ supported. - return config.enable_web_push && "serviceWorker" in navigator && window.navigator.standalone === false; + return ( + config.enable_web_push && + // a service worker exists + "serviceWorker" in navigator && + // but the pushmanager API is missing, which implies we're on an iOS device without installing + !("PushManager" in window) && + // check that this is the case by checking for `standalone`, which only exists on Safari + window.navigator.standalone === false + ); } } From 5913142389d8b6718b8f4f12277afa36a18aa751 Mon Sep 17 00:00:00 2001 From: Nihal Gonsalves Date: Wed, 27 Sep 2023 23:29:39 +0200 Subject: [PATCH 071/182] fix: remove deprecated nodesource script --- Dockerfile-build | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Dockerfile-build b/Dockerfile-build index 62a60bd8..6e96c7d4 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -2,13 +2,17 @@ FROM golang:1.20-bullseye as builder ARG VERSION=dev ARG COMMIT=unknown +ARG NODE_MAJOR=18 -RUN apt-get update -RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -RUN apt-get install -y \ - build-essential \ - nodejs \ - python3-pip +RUN apt-get update && apt-get install -y \ + build-essential ca-certificates curl gnupg \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" >> /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y \ + python3-pip nodejs \ + && rm -rf /var/lib/apt/lists/* WORKDIR /app ADD Makefile . From d33eded060a55d0956fb043c78045da668d0fce9 Mon Sep 17 00:00:00 2001 From: Nihal Gonsalves Date: Wed, 27 Sep 2023 23:42:42 +0200 Subject: [PATCH 072/182] docs: remove Safari sound warning iOS 17 does indeed play sounds. --- docs/known-issues.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/known-issues.md b/docs/known-issues.md index 190e2bce..6b5567e6 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -40,10 +40,6 @@ Android has an [open bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1796434) This causes ntfy to not automatically subscribe to web push, and requires you to go to the ntfy Settings page to enable it manually. -## Safari does not play sounds for web push notifications -Safari does not support playing sounds for web push notifications, and treats them all as silent. This will be fixed with -iOS 17 / Safari 17, which will be released later in 2023. - ## PWA on iOS sometimes crashes with an IndexedDB error (see [#787](https://github.com/binwiederhier/ntfy/issues/787)) When resuming the installed PWA from the background, it sometimes crashes with an error from IndexedDB/Dexie, due to a [WebKit bug]( https://bugs.webkit.org/show_bug.cgi?id=197050). A reload will fix it until a permanent fix is found. From 4dc0183901e6a12350cb4a76956576f21ecc6039 Mon Sep 17 00:00:00 2001 From: Nihal Gonsalves Date: Wed, 27 Sep 2023 23:42:05 +0200 Subject: [PATCH 073/182] docs: remove firefox-android known issue Closes #789 Firefox released a bug fix with v116. --- docs/known-issues.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/known-issues.md b/docs/known-issues.md index 190e2bce..cdb95bb6 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -34,12 +34,6 @@ your iOS device and your ntfy server are either on the same network, or that you Turn on tracing/debugging on the server (via `log-level: trace` or `log-level: debug`, see [troubleshooting](troubleshooting.md)), and read docs on [iOS instant notifications](https://docs.ntfy.sh/config/#ios-instant-notifications). -## Firefox on Android not automatically subscribing to web push (see [#789](https://github.com/binwiederhier/ntfy/issues/789)) -ntfy defaults to web-push based subscriptions when installed as a [progressive web app](./subscribe/pwa.md). Firefox -Android has an [open bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1796434) where it reports the PWA mode incorrectly. -This causes ntfy to not automatically subscribe to web push, and requires you to go to the ntfy Settings page to enable -it manually. - ## Safari does not play sounds for web push notifications Safari does not support playing sounds for web push notifications, and treats them all as silent. This will be fixed with iOS 17 / Safari 17, which will be released later in 2023. From 66e96244ef2cf87051a56ba05a9f488cde4380e0 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 27 Sep 2023 23:16:24 -0400 Subject: [PATCH 074/182] Thank you @alexandzors for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 670ffd7c..220f82cb 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 26b31acbaefe609c338f97048b3a9703ffeefff4 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 27 Sep 2023 23:19:31 -0400 Subject: [PATCH 075/182] Thank you @dkramer95 for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 220f82cb..0fae8469 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 2e58f0db1094a22990d95e3734b020485daf6103 Mon Sep 17 00:00:00 2001 From: James Fitzgerald Date: Thu, 28 Sep 2023 07:01:28 -0400 Subject: [PATCH 076/182] Fix typo "aliase" -> "alias" --- docs/publish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publish.md b/docs/publish.md index c03cc4a4..6df859cf 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -2288,7 +2288,7 @@ You can define which URL to open when a notification is clicked. This may be use to a Zabbix alert or a transaction that you'd like to provide the deep-link for. Tapping the notification will open the web browser (or the app) and open the website. -To define a click action for the notification, pass a URL as the value of the `X-Click` header (or its aliase `Click`). +To define a click action for the notification, pass a URL as the value of the `X-Click` header (or its alias `Click`). If you pass a website URL (`http://` or `https://`) the web browser will open. If you pass another URI that can be handled by another app, the responsible app may open. From 5dafd7e4a7799dbb00925890c13f0965eff83a07 Mon Sep 17 00:00:00 2001 From: Mazurky Date: Thu, 28 Sep 2023 12:10:35 +0000 Subject: [PATCH 077/182] Translated using Weblate (Slovak) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sk/ --- web/public/static/langs/sk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/sk.json b/web/public/static/langs/sk.json index 8ea1b45f..0e3f57a7 100644 --- a/web/public/static/langs/sk.json +++ b/web/public/static/langs/sk.json @@ -231,7 +231,7 @@ "prefs_reservations_dialog_title_delete": "Odstrániť rezervovanú tému", "prefs_users_table": "Tabuľka používateľov", "prefs_reservations_table_topic_header": "Téma", - "reservation_delete_dialog_submit_button": "Odstrániť rezerváciu", + "reservation_delete_dialog_submit_button": "Vymazať rezerváciu", "prefs_reservations_limit_reached": "Dosiahli ste limit rezervovaných tém.", "account_upgrade_dialog_interval_monthly": "Mesačne", "prefs_users_add_button": "Pridať používateľa", From af037b9d7079f90c715ddd7afa6ac0ac607b4c1e Mon Sep 17 00:00:00 2001 From: Octelly Date: Fri, 29 Sep 2023 17:50:27 +0200 Subject: [PATCH 078/182] Update config.md Field is "healthy", not "health" --- docs/config.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/config.md b/docs/config.md index 03a624e8..2662a537 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1180,10 +1180,10 @@ and [here](https://easyengine.io/tutorials/nginx/block-wp-login-php-bruteforce-a ## Health checks A preliminary health check API endpoint is exposed at `/v1/health`. The endpoint returns a `json` response in the format shown below. -If a non-200 HTTP status code is returned or if the returned `health` field is `false` the ntfy service should be considered as unhealthy. +If a non-200 HTTP status code is returned or if the returned `healthy` field is `false` the ntfy service should be considered as unhealthy. ```json -{"health":true} +{"healthy":true} ``` See [Installation for Docker](install.md#docker) for an example of how this could be used in a `docker-compose` environment. From aaf01b98d289e658b78d2bc2f48c54f05fc0fcb3 Mon Sep 17 00:00:00 2001 From: Jordan Munch O'Hare Date: Sat, 30 Sep 2023 16:10:01 +0000 Subject: [PATCH 079/182] docs: ios shortcut --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index 6da0f63f..c5e1fad1 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -129,6 +129,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [vigilant](https://github.com/VerifiedJoseph/vigilant) - Monitor RSS/ATOM and JSON feeds, and send push notifications on new entries (PHP) - [ansible-role-ntfy-alertmanager](https://github.com/bleetube/ansible-role-ntfy-alertmanager) - Ansible role to install xenrox/ntfy-alertmanager - [NtfyMe-Blender](https://github.com/NotNanook/NtfyMe-Blender) - Blender addon to send notifications to NtfyMe (Python) +- [ntfy-ios-url-share](https://www.icloud.com/shortcuts/be8a7f49530c45f79733cfe3e41887e6) - An iOS shortcut that lets you share URLs easily and quickly. - [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes From a3efbb3466ac78801e9fc029e4b7e62cb4d25344 Mon Sep 17 00:00:00 2001 From: Mahesh Babu <43287976+MaheshBabu11@users.noreply.github.com> Date: Mon, 2 Oct 2023 11:27:42 +0530 Subject: [PATCH 080/182] Adding ntfy-java package to libraries built around ntfy --- docs/integrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 6da0f63f..f88de42e 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -57,7 +57,8 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy](https://github.com/ffflorian/ntfy) - Send notifications over ntfy (JS) - [ntfy_dart](https://github.com/jr1221/ntfy_dart) - Dart wrapper around the ntfy API (Dart) - [gotfy](https://github.com/AnthonyHewins/gotfy) - A Go wrapper for the ntfy API (Go) -- [symfony/ntfy-notifier](https://symfony.com/components/NtfyNotifier) ⭐ - Symfony Notifier integration for ntfy (PHP) +- [symfony/ntfy-notifier](https://symfony.com/components/NtfyNotifier) ⭐ - Symfony Notifier integration for ntfy (PHP) +- [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) ## CLIs + GUIs From b7f37138f863dc12aa7f928ddd6d7ed736383b1a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 2 Oct 2023 11:49:27 -0400 Subject: [PATCH 081/182] Release notes --- docs/releases.md | 1 + go.mod | 8 +- go.sum | 8 + web/package-lock.json | 352 ++++++++++++++++++++++++------------------ 4 files changed, 213 insertions(+), 156 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 4d125a97..15fdd114 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1290,6 +1290,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) +* PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) ### ntfy Android app v1.16.1 (UNRELEASED) diff --git a/go.mod b/go.mod index 05fb154b..6a2cffea 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( golang.org/x/sync v0.3.0 golang.org/x/term v0.12.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.142.0 + google.golang.org/api v0.143.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -28,9 +28,9 @@ replace github.com/emersion/go-smtp => github.com/emersion/go-smtp v0.17.0 // Pi require github.com/pkg/errors v0.9.1 // indirect require ( - firebase.google.com/go/v4 v4.12.0 + firebase.google.com/go/v4 v4.12.1 github.com/SherClockHolmes/webpush-go v1.2.0 - github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/client_golang v1.17.0 github.com/stripe/stripe-go/v74 v74.30.0 ) @@ -58,7 +58,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect diff --git a/go.sum b/go.sum index 97512a78..bf112048 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,8 @@ cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= firebase.google.com/go/v4 v4.12.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= +firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= +firebase.google.com/go/v4 v4.12.1/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -107,9 +109,13 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= @@ -205,6 +211,8 @@ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3j golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= +google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= +google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= diff --git a/web/package-lock.json b/web/package-lock.json index d4ba68bf..3ce24105 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -89,22 +89,22 @@ } }, "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -118,13 +118,19 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -239,13 +245,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -264,12 +270,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -287,9 +293,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -436,14 +442,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -463,9 +469,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -819,9 +825,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -906,9 +912,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1094,12 +1100,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1110,12 +1116,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1127,15 +1133,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1275,9 +1281,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1670,9 +1676,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1695,19 +1701,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1716,12 +1722,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2239,9 +2245,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2336,9 +2342,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", @@ -2443,14 +2449,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.16", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.16.tgz", - "integrity": "sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q==", + "version": "5.0.0-beta.17", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", + "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", "dependencies": { "@babel/runtime": "^7.22.15", "@floating-ui/react-dom": "^2.0.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.10", + "@mui/utils": "^5.14.11", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2474,18 +2480,18 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz", - "integrity": "sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz", + "integrity": "sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.9.tgz", - "integrity": "sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.11.tgz", + "integrity": "sha512-aHReLasBuS/+hhPzbZCgZ0eTcZ2QRnoC2WNK7XvdAf3l+LjC1flzjh6GWw1tZJ5NHnZ+bivdwtLFQ8XTR96JkA==", "dependencies": { "@babel/runtime": "^7.22.15" }, @@ -2508,16 +2514,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.10.tgz", - "integrity": "sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz", + "integrity": "sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==", "dependencies": { "@babel/runtime": "^7.22.15", - "@mui/base": "5.0.0-beta.16", - "@mui/core-downloads-tracker": "^5.14.10", - "@mui/system": "^5.14.10", + "@mui/base": "5.0.0-beta.17", + "@mui/core-downloads-tracker": "^5.14.11", + "@mui/system": "^5.14.11", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.10", + "@mui/utils": "^5.14.11", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2552,12 +2558,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.10.tgz", - "integrity": "sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz", + "integrity": "sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==", "dependencies": { "@babel/runtime": "^7.22.15", - "@mui/utils": "^5.14.10", + "@mui/utils": "^5.14.11", "prop-types": "^15.8.1" }, "engines": { @@ -2578,9 +2584,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.10.tgz", - "integrity": "sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz", + "integrity": "sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==", "dependencies": { "@babel/runtime": "^7.22.15", "@emotion/cache": "^11.11.0", @@ -2609,15 +2615,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.10.tgz", - "integrity": "sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz", + "integrity": "sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==", "dependencies": { "@babel/runtime": "^7.22.15", - "@mui/private-theming": "^5.14.10", - "@mui/styled-engine": "^5.14.10", + "@mui/private-theming": "^5.14.11", + "@mui/styled-engine": "^5.14.11", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.10", + "@mui/utils": "^5.14.11", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2661,9 +2667,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.10", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.10.tgz", - "integrity": "sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q==", + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", "dependencies": { "@babel/runtime": "^7.22.15", "@types/prop-types": "^15.7.5", @@ -2751,6 +2757,47 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -2764,17 +2811,17 @@ "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz", + "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/node": { - "version": "20.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.4.tgz", - "integrity": "sha512-nU6d9MPY0NBUMiE/nXd2IIoC4OLvsLpwAjheoAeuzgvDZA1Cb10QYg+91AF6zQiKWRN5i1m07x6sMe0niBznoQ==", + "version": "20.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.0.tgz", + "integrity": "sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -2783,14 +2830,14 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { - "version": "15.7.7", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", - "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==" + "version": "15.7.8", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", + "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" }, "node_modules/@types/react": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", - "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "version": "18.2.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", + "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2798,9 +2845,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", + "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", "dependencies": { "@types/react": "*" } @@ -2815,9 +2862,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" }, "node_modules/@types/trusted-types": { "version": "2.0.4", @@ -2831,14 +2878,15 @@ "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" }, "node_modules/@vitejs/plugin-react": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", - "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", + "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", "dev": true, "dependencies": { - "@babel/core": "^7.22.9", + "@babel/core": "^7.22.20", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.2", "react-refresh": "^0.14.0" }, "engines": { @@ -3192,9 +3240,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -3211,8 +3259,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.13" }, @@ -3263,9 +3311,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001542", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz", + "integrity": "sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==", "dev": true, "funding": [ { @@ -3393,12 +3441,12 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", "dev": true, "dependencies": { - "browserslist": "^4.21.10" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -3596,9 +3644,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "version": "1.4.537", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz", + "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==", "dev": true }, "node_modules/emoji-regex": { @@ -6198,9 +6246,9 @@ } }, "node_modules/postcss": { - "version": "8.4.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", - "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -6664,9 +6712,9 @@ } }, "node_modules/rollup": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", - "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" From ba0cc7fbf97b6ee8a9b1d8d16ce79bf9f8c5b94e Mon Sep 17 00:00:00 2001 From: noman <27938023+noman-land@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:58:29 -0400 Subject: [PATCH 082/182] fix: Remove errant word from Action buttons docs --- docs/publish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publish.md b/docs/publish.md index 6df859cf..41370778 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -1131,7 +1131,7 @@ As of today, the following actions are supported: when the action button is tapped (only supported on Android) * [`http`](#send-http-request): Sends HTTP POST/GET/PUT request when the action button is tapped -Here's an example of what that a notification with actions can look like: +Here's an example of what a notification with actions can look like:
![notification with actions](static/img/android-screenshot-notification-actions.png){ width=500 } From 5c9cebf0597749c9c1b869b631cd3a31b18b79d9 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Fri, 13 Oct 2023 15:41:17 +0300 Subject: [PATCH 083/182] user.Manager: fix ACL write, read order This should fix "read-only access to topic *" being applied before "read-write access to topic _PREFIX_*" Before this if we have: ntfy access user "mytopic*" rw ntfy access user "*" ro read-only access rule was applied first and user couldn't write to mytopic* --- user/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/manager.go b/user/manager.go index 324b7684..bf69d35b 100644 --- a/user/manager.go +++ b/user/manager.go @@ -161,7 +161,7 @@ const ( FROM user_access a JOIN user u ON u.id = a.user_id WHERE (u.user = ? OR u.user = ?) AND ? LIKE a.topic ESCAPE '\' - ORDER BY u.user DESC + ORDER BY u.user DESC, a.write DESC ` insertUserQuery = ` From 73d2b3363ba78e7598b9bdf96557919020bae449 Mon Sep 17 00:00:00 2001 From: "Carlos M. Silva" Date: Fri, 13 Oct 2023 20:57:06 +0000 Subject: [PATCH 084/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 57.5% (220 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 1bb0cd92..89a01d89 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -192,7 +192,7 @@ "action_bar_reservation_add": "Reserve topic", "action_bar_reservation_edit": "Change reservation", "signup_disabled": "Registrar está desativado", - "signup_error_username_taken": "Usuário {{username}} já existe", + "signup_error_username_taken": "Usuário {{username}} já existe", "signup_error_creation_limit_reached": "Limite de criação de contas atingido", "action_bar_reservation_delete": "Remover reserva", "action_bar_account": "Conta", From 7a5572ad7cfa62a412b11e30f51c4a2004082b0a Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Mon, 16 Oct 2023 09:41:49 +0300 Subject: [PATCH 085/182] user.Manager: further improve ACL write/read order For each user, we should test in order `THE_LONGEST_RULE`->`WRITE_PERMISSION` --- user/manager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/manager.go b/user/manager.go index bf69d35b..123edf84 100644 --- a/user/manager.go +++ b/user/manager.go @@ -161,7 +161,7 @@ const ( FROM user_access a JOIN user u ON u.id = a.user_id WHERE (u.user = ? OR u.user = ?) AND ? LIKE a.topic ESCAPE '\' - ORDER BY u.user DESC, a.write DESC + ORDER BY u.user DESC, LENGTH(a.topic) DESC, a.write DESC ` insertUserQuery = ` @@ -197,13 +197,13 @@ const ( selectUserAllAccessQuery = ` SELECT user_id, topic, read, write FROM user_access - ORDER BY write DESC, read DESC, topic + ORDER BY LENGTH(topic) DESC, write DESC, read DESC, topic ` selectUserAccessQuery = ` SELECT topic, read, write FROM user_access WHERE user_id = (SELECT id FROM user WHERE user = ?) - ORDER BY write DESC, read DESC, topic + ORDER BY LENGTH(topic) DESC, write DESC, read DESC, topic ` selectUserReservationsQuery = ` SELECT a_user.topic, a_user.read, a_user.write, a_everyone.read AS everyone_read, a_everyone.write AS everyone_write From 2f2918bd3b9c6549a5274878791cc806831dd81c Mon Sep 17 00:00:00 2001 From: PW Date: Mon, 16 Oct 2023 02:51:18 +0000 Subject: [PATCH 086/182] Translated using Weblate (Chinese (Traditional)) Currently translated at 73.0% (279 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/zh_Hant/ --- web/public/static/langs/zh_Hant.json | 36 +++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/zh_Hant.json b/web/public/static/langs/zh_Hant.json index 0d7f3f48..6d351930 100644 --- a/web/public/static/langs/zh_Hant.json +++ b/web/public/static/langs/zh_Hant.json @@ -243,5 +243,39 @@ "account_basics_phone_numbers_copied_to_clipboard": "電話號碼已複製到剪貼簿", "account_basics_phone_numbers_dialog_number_label": "電話號碼", "account_basics_phone_numbers_dialog_channel_call": "通話", - "account_usage_calls_title": "已播出電話" + "account_usage_calls_title": "已播出電話", + "account_tokens_dialog_title_create": "建立存取權杖", + "account_upgrade_dialog_tier_current_label": "目前", + "account_tokens_table_token_header": "權杖", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "節省高達{{discount}}%", + "account_tokens_dialog_expires_never": "權杖永遠不會過期", + "account_delete_title": "刪除帳戶", + "account_delete_dialog_label": "密碼", + "account_upgrade_dialog_interval_monthly": "每月", + "account_tokens_table_never_expires": "永不過期", + "account_tokens_delete_dialog_title": "删除存取權杖", + "account_upgrade_dialog_button_cancel": "取消", + "account_tokens_table_label_header": "標籤", + "account_upgrade_dialog_button_cancel_subscription": "取消訂閱", + "account_tokens_dialog_title_edit": "編輯存取權杖", + "account_delete_dialog_button_cancel": "取消", + "account_tokens_table_copied_to_clipboard": "已複製存取權杖", + "account_upgrade_dialog_title": "更改帳戶方案", + "account_tokens_delete_dialog_submit_button": "永久删除權杖", + "account_delete_description": "永久刪除你的帳戶", + "account_tokens_title": "存取權杖", + "account_delete_dialog_button_submit": "永久刪除帳戶", + "account_tokens_dialog_title_delete": "删除存取權杖", + "account_upgrade_dialog_interval_yearly": "每年", + "account_upgrade_dialog_button_redirect_signup": "立即註冊", + "account_tokens_dialog_button_cancel": "取消", + "account_tokens_dialog_button_update": "更新權杖", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} 總儲存空間", + "account_tokens_table_cannot_delete_or_edit": "無法編輯或刪除當前階段權杖", + "account_tokens_table_current_session": "目前瀏覽器階段", + "account_upgrade_dialog_button_pay_now": "立即付款及訂閱", + "account_upgrade_dialog_tier_selected_label": "已選擇", + "account_upgrade_dialog_button_update_subscription": "更改訂閱", + "account_tokens_dialog_button_create": "建立權杖", + "account_tokens_table_create_token_button": "建立存取權杖" } From 7516d25bc6fdc34179a5eb4fed189ae8da506c0e Mon Sep 17 00:00:00 2001 From: Rhodri Date: Sun, 15 Oct 2023 21:03:05 +0000 Subject: [PATCH 087/182] Translated using Weblate (Welsh) Currently translated at 12.0% (46 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/cy/ --- web/public/static/langs/cy.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/cy.json b/web/public/static/langs/cy.json index 68846b8f..da6c9b41 100644 --- a/web/public/static/langs/cy.json +++ b/web/public/static/langs/cy.json @@ -39,5 +39,10 @@ "publish_dialog_attach_placeholder": "Atodi ffeil drwy URL, e.e. https://f-droid.org/F-Droid.apk", "notifications_click_copy_url_button": "Copio linc", "notifications_actions_open_url_title": "Ewch i {{url}}", - "publish_dialog_email_label": "Ebost" + "publish_dialog_email_label": "Ebost", + "signup_form_confirm_password": "Cadarnhau cyfrinair", + "signup_form_button_submit": "Cofrestru", + "common_back": "Yn ôl", + "common_copy_to_clipboard": "Copio i'r clipfwrdd", + "signup_already_have_account": "Gyda chyfrif yn barod? Mewngofnodi!" } From 483edb70bfc6c0e6b06777258597d02078c06495 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 18 Oct 2023 09:52:18 +0200 Subject: [PATCH 088/182] doc/integrations: link RouterOS Scripts ... which has a module to send notifications to Ntfy. --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index fcc51248..5375314a 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -133,6 +133,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-ios-url-share](https://www.icloud.com/shortcuts/be8a7f49530c45f79733cfe3e41887e6) - An iOS shortcut that lets you share URLs easily and quickly. - [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes +- [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS ## Blog + forum posts From ef45ea5a50ffd010685e4dfb116f355783fc7daa Mon Sep 17 00:00:00 2001 From: imkero Date: Thu, 19 Oct 2023 07:48:06 +0000 Subject: [PATCH 089/182] fix(i18n): correct usage of language str having underline --- web/src/app/utils.js | 10 ++++++++-- web/src/components/App.jsx | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/web/src/app/utils.js b/web/src/app/utils.js index d0ae15ce..6b3849f5 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -130,14 +130,20 @@ export const hashCode = (s) => { return hash; }; +/** + * convert `i18n.language` style str (e.g.: `en_US`) to kebab-case (e.g.: `en-US`), + * which is expected by `` and `Intl.DateTimeFormat` + */ +export const getKebabCaseLangStr = (language) => language.replace(/_/g, '-'); + export const formatShortDateTime = (timestamp, language) => - new Intl.DateTimeFormat(language, { + new Intl.DateTimeFormat(getKebabCaseLangStr(language), { dateStyle: "short", timeStyle: "short", }).format(new Date(timestamp * 1000)); export const formatShortDate = (timestamp, language) => - new Intl.DateTimeFormat(language, { dateStyle: "short" }).format(new Date(timestamp * 1000)); + new Intl.DateTimeFormat(getKebabCaseLangStr(language), { dateStyle: "short" }).format(new Date(timestamp * 1000)); export const formatBytes = (bytes, decimals = 2) => { if (bytes === 0) return "0 bytes"; diff --git a/web/src/components/App.jsx b/web/src/components/App.jsx index d22ec66f..7f84b7de 100644 --- a/web/src/components/App.jsx +++ b/web/src/components/App.jsx @@ -11,7 +11,7 @@ import ActionBar from "./ActionBar"; import Preferences from "./Preferences"; import subscriptionManager from "../app/SubscriptionManager"; import userManager from "../app/UserManager"; -import { expandUrl } from "../app/utils"; +import { expandUrl, getKebabCaseLangStr } from "../app/utils"; import ErrorBoundary from "./ErrorBoundary"; import routes from "./routes"; import { useAccountListener, useBackgroundProcesses, useConnectionListeners, useWebPushTopics } from "./hooks"; @@ -56,7 +56,7 @@ const App = () => { ); useEffect(() => { - document.documentElement.setAttribute("lang", i18n.language); + document.documentElement.setAttribute("lang", getKebabCaseLangStr(i18n.language)); document.dir = languageDir; }, [i18n.language, languageDir]); From e7c03650798cc54f74797f7c357d2ecce24454b9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:15:42 -0400 Subject: [PATCH 090/182] Changelog --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 15fdd114..cac34a3c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1291,6 +1291,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) +* Correct usage of language str having underline ([#922](https://github.com/binwiederhier/ntfy/pull/922), thanks to [@imkero](https://github.com/imkero)) ### ntfy Android app v1.16.1 (UNRELEASED) From 70b084457ae1ca7aff9aaeb82bdaef2aee4ff148 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:18:03 -0400 Subject: [PATCH 091/182] Bump deps --- go.mod | 43 +++-- go.sum | 56 ++++++ web/package-lock.json | 432 +++++++++++++++++++++--------------------- 3 files changed, 299 insertions(+), 232 deletions(-) diff --git a/go.mod b/go.mod index 6a2cffea..27ee4332 100644 --- a/go.mod +++ b/go.mod @@ -6,20 +6,20 @@ require ( cloud.google.com/go/firestore v1.13.0 // indirect cloud.google.com/go/storage v1.33.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 - github.com/gabriel-vasile/mimetype v1.4.2 + github.com/gabriel-vasile/mimetype v1.4.3 github.com/gorilla/websocket v1.5.0 github.com/mattn/go-sqlite3 v1.14.17 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 - golang.org/x/crypto v0.13.0 - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sync v0.3.0 - golang.org/x/term v0.12.0 + golang.org/x/crypto v0.14.0 + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 + golang.org/x/term v0.13.0 golang.org/x/time v0.3.0 - google.golang.org/api v0.143.0 + google.golang.org/api v0.147.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -29,17 +29,17 @@ require github.com/pkg/errors v0.9.1 // indirect require ( firebase.google.com/go/v4 v4.12.1 - github.com/SherClockHolmes/webpush-go v1.2.0 + github.com/SherClockHolmes/webpush-go v1.3.0 github.com/prometheus/client_golang v1.17.0 github.com/stripe/stripe-go/v74 v74.30.0 ) require ( cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - cloud.google.com/go/longrunning v0.5.1 // indirect + cloud.google.com/go/iam v1.1.3 // indirect + cloud.google.com/go/longrunning v0.5.2 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -50,31 +50,32 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect - github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.15.0 // indirect - golang.org/x/sys v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect - google.golang.org/grpc v1.58.2 // indirect + google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index bf112048..083a5423 100644 --- a/go.sum +++ b/go.sum @@ -3,14 +3,20 @@ cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.2 h1:u+oFqfEwwU7F9dIELigxbe0XVnBAo9wqMuQLA50CZ5k= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= @@ -26,6 +32,8 @@ github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA= github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w= +github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k= +github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -35,6 +43,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -50,6 +60,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -82,6 +94,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -101,6 +115,8 @@ github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6 github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= github.com/olebedev/when v1.0.0/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -116,8 +132,12 @@ github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUo github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -145,13 +165,17 @@ golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -162,18 +186,27 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= 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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -183,17 +216,27 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -205,14 +248,19 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= +google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc= +google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -224,10 +272,16 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -235,6 +289,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/web/package-lock.json b/web/package-lock.json index 3ce24105..13d2357d 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -80,18 +80,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -99,10 +99,10 @@ "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", + "@babel/helpers": "^7.23.2", "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -220,9 +220,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -442,13 +442,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -775,14 +775,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1562,12 +1562,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.20", + "@babel/compat-data": "^7.23.2", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -1593,15 +1593,15 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", "@babel/plugin-transform-class-static-block": "^7.22.11", "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", "@babel/plugin-transform-dynamic-import": "^7.22.11", @@ -1613,9 +1613,9 @@ "@babel/plugin-transform-literals": "^7.22.5", "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", @@ -1624,7 +1624,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-optional-chaining": "^7.23.0", "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", "@babel/plugin-transform-private-property-in-object": "^7.22.11", @@ -1641,10 +1641,10 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1676,9 +1676,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1701,9 +1701,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -2277,9 +2277,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2304,9 +2304,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2428,9 +2428,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2449,14 +2449,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", - "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", + "version": "5.0.0-beta.20", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", + "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", "dependencies": { - "@babel/runtime": "^7.22.15", + "@babel/runtime": "^7.23.1", "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2480,20 +2480,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz", - "integrity": "sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", + "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.11.tgz", - "integrity": "sha512-aHReLasBuS/+hhPzbZCgZ0eTcZ2QRnoC2WNK7XvdAf3l+LjC1flzjh6GWw1tZJ5NHnZ+bivdwtLFQ8XTR96JkA==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.14.tgz", + "integrity": "sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==", "dependencies": { - "@babel/runtime": "^7.22.15" + "@babel/runtime": "^7.23.1" }, "engines": { "node": ">=12.0.0" @@ -2514,17 +2514,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz", - "integrity": "sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz", + "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/base": "5.0.0-beta.17", - "@mui/core-downloads-tracker": "^5.14.11", - "@mui/system": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@types/react-transition-group": "^4.4.6", + "@babel/runtime": "^7.23.1", + "@mui/base": "5.0.0-beta.20", + "@mui/core-downloads-tracker": "^5.14.14", + "@mui/system": "^5.14.14", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", + "@types/react-transition-group": "^4.4.7", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -2558,12 +2558,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz", - "integrity": "sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", + "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/utils": "^5.14.11", + "@babel/runtime": "^7.23.1", + "@mui/utils": "^5.14.13", "prop-types": "^15.8.1" }, "engines": { @@ -2584,11 +2584,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz", - "integrity": "sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", + "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", "dependencies": { - "@babel/runtime": "^7.22.15", + "@babel/runtime": "^7.23.1", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2615,15 +2615,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz", - "integrity": "sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", + "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@mui/private-theming": "^5.14.11", - "@mui/styled-engine": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", + "@babel/runtime": "^7.23.1", + "@mui/private-theming": "^5.14.14", + "@mui/styled-engine": "^5.14.13", + "@mui/types": "^7.2.6", + "@mui/utils": "^5.14.13", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,11 +2654,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", - "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", + "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2667,12 +2667,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", - "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "version": "5.14.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz", + "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==", "dependencies": { - "@babel/runtime": "^7.22.15", - "@types/prop-types": "^15.7.5", + "@babel/runtime": "^7.23.1", + "@types/prop-types": "^15.7.7", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2738,9 +2738,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", - "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", + "integrity": "sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==", "engines": { "node": ">=14.0.0" } @@ -2758,9 +2758,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2771,18 +2771,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2790,9 +2790,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -2811,33 +2811,36 @@ "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz", - "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.14.tgz", + "integrity": "sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/node": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.0.tgz", - "integrity": "sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==", - "dev": true + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", + "version": "18.2.29", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.29.tgz", + "integrity": "sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2845,9 +2848,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", - "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", "dependencies": { "@types/react": "*" } @@ -2862,20 +2865,20 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", + "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", "dev": true }, "node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.9.tgz", + "integrity": "sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==" }, "node_modules/@vitejs/plugin-react": { "version": "4.1.0", @@ -3164,13 +3167,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -3178,12 +3181,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", - "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.4.3", "core-js-compat": "^3.32.2" }, "peerDependencies": { @@ -3191,12 +3194,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3311,9 +3314,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001542", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz", - "integrity": "sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==", + "version": "1.0.30001551", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", + "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", "dev": true, "funding": [ { @@ -3550,9 +3553,9 @@ } }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", @@ -3644,9 +3647,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.537", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.537.tgz", - "integrity": "sha512-W1+g9qs9hviII0HAwOdehGYkr+zt7KKdmCcJcjH0mYg6oL8+ioT3Skjmt7BLoAQqXhjf40AXd+HlR4oAWMlXjA==", + "version": "1.4.559", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", + "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", "dev": true }, "node_modules/emoji-regex": { @@ -3844,15 +3847,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4132,12 +4135,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4226,9 +4229,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4474,12 +4477,12 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, @@ -4538,9 +4541,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -4696,12 +4703,9 @@ "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { "node": ">= 0.4.0" } @@ -5614,9 +5618,9 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -5978,9 +5982,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6465,11 +6469,11 @@ } }, "node_modules/react-router": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", - "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.17.0.tgz", + "integrity": "sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==", "dependencies": { - "@remix-run/router": "1.9.0" + "@remix-run/router": "1.10.0" }, "engines": { "node": ">=14.0.0" @@ -6479,12 +6483,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", - "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.17.0.tgz", + "integrity": "sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==", "dependencies": { - "@remix-run/router": "1.9.0", - "react-router": "6.16.0" + "@remix-run/router": "1.10.0", + "react-router": "6.17.0" }, "engines": { "node": ">=14.0.0" @@ -6663,9 +6667,9 @@ } }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7164,9 +7168,9 @@ } }, "node_modules/terser": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz", - "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==", + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7357,6 +7361,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -7582,9 +7592,9 @@ } }, "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { "esbuild": "^0.18.10", From c6b8ea90b79841259b36e43670274612b85e813c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:32:39 -0400 Subject: [PATCH 092/182] Thank you @YezGotIt for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0fae8469..6e69d27d 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 7c3fd42a867d52a2d447144bfa9a2cbfb4022045 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:33:40 -0400 Subject: [PATCH 093/182] Thank you @thomasskou for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6e69d27d..049b6910 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From ca6bc1dcb02602d4f1fb3609a528a794f5cedab9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 19 Oct 2023 07:38:12 -0400 Subject: [PATCH 094/182] Thank you @surfernv for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 049b6910..c20c9971 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From b811da6b830efe52b5d83e8a6f37d0997f956aef Mon Sep 17 00:00:00 2001 From: FOSSMan <137928236+0xFOSSMan@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:42:44 +0000 Subject: [PATCH 095/182] Added ntfy.fossman.de to docs/integrations.md/Alternative ntfy Servers --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index 5375314a..2bd2344d 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -236,6 +236,7 @@ ntfy community. Thanks to everyone running a public server. **You guys rock!** | [ntfy.envs.net](https://ntfy.envs.net) | 🇩🇪 Germany | | [ntfy.mzte.de](https://ntfy.mzte.de/) | 🇩🇪 Germany | | [ntfy.hostux.net](https://ntfy.hostux.net/) | 🇫🇷 France | +| [ntfy.fossman.de](https://ntfy.fossman.de/) | 🇩🇪 Germany | Please be aware that **server operators can log your messages**. The project also cannot guarantee the reliability and uptime of third party servers, so use of each server is **at your own discretion**. From 554547b431f462ea0df72d79e3680c7570f65080 Mon Sep 17 00:00:00 2001 From: Dan Lousqui Date: Mon, 23 Oct 2023 21:22:21 +0200 Subject: [PATCH 096/182] doc/integrations: link to ntfy-android-builder --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index 5375314a..48d33abe 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -72,6 +72,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Projects + scripts +- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) - [Grafana-ntfy-webhook-integration](https://github.com/academo/grafana-alerting-ntfy-webhook-integration) - Integrates Grafana alerts webhooks (Go) - [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js) From 6dbdabf9fd325a1010e6144a60b9bf7bdc9dc673 Mon Sep 17 00:00:00 2001 From: Dan Lousqui Date: Mon, 23 Oct 2023 22:15:01 +0200 Subject: [PATCH 097/182] doc/integrations: link to ntfy-android-builder --- docs/integrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 48d33abe..6a9766b9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -72,7 +72,6 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Projects + scripts -- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) - [Grafana-to-ntfy](https://github.com/kittyandrew/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Rust) - [Grafana-ntfy-webhook-integration](https://github.com/academo/grafana-alerting-ntfy-webhook-integration) - Integrates Grafana alerts webhooks (Go) - [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js) @@ -135,6 +134,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-ios-filesharing](https://www.icloud.com/shortcuts/fe948d151b2e4ae08fb2f9d6b27d680b) - An iOS shortcut that lets you share files from your share feed to a topic of your choice. - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes - [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS +- [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) ## Blog + forum posts From afd6d2e0ee17e785688036861413c56aec412a08 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Tue, 24 Oct 2023 13:57:46 +0300 Subject: [PATCH 098/182] Default_DenyAll: move the longest rule on top --- user/manager_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/manager_test.go b/user/manager_test.go index 468dc36a..97baadc3 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -47,10 +47,10 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { benGrants, err := a.Grants("ben") require.Nil(t, err) require.Equal(t, []Grant{ + {"everyonewrite", PermissionDenyAll}, {"mytopic", PermissionReadWrite}, {"writeme", PermissionWrite}, {"readme", PermissionRead}, - {"everyonewrite", PermissionDenyAll}, }, benGrants) notben, err := a.Authenticate("ben", "this is wrong") From 543709336cc10168f52f5765f2d88b45537bfc8b Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Tue, 24 Oct 2023 13:59:39 +0300 Subject: [PATCH 099/182] TestManager_UserManagement: move the longest rule on top --- user/manager_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/manager_test.go b/user/manager_test.go index 97baadc3..b0143b97 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -227,10 +227,10 @@ func TestManager_UserManagement(t *testing.T) { benGrants, err := a.Grants("ben") require.Nil(t, err) require.Equal(t, []Grant{ + {"everyonewrite", PermissionDenyAll}, {"mytopic", PermissionReadWrite}, {"writeme", PermissionWrite}, {"readme", PermissionRead}, - {"everyonewrite", PermissionDenyAll}, }, benGrants) everyone, err := a.User(Everyone) From ff2a3543337456a8866169264ba8be21147cb915 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Tue, 24 Oct 2023 14:00:46 +0300 Subject: [PATCH 100/182] TestMigrationFrom1: move the longest rule on top --- user/manager_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/manager_test.go b/user/manager_test.go index b0143b97..76bddc57 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -1101,10 +1101,10 @@ func TestMigrationFrom1(t *testing.T) { require.Equal(t, syncTopicLength, len(ben.SyncTopic)) require.NotEqual(t, ben.SyncTopic, phil.SyncTopic) require.Equal(t, 2, len(benGrants)) - require.Equal(t, "stats", benGrants[0].TopicPattern) - require.Equal(t, PermissionReadWrite, benGrants[0].Allow) - require.Equal(t, "secret", benGrants[1].TopicPattern) - require.Equal(t, PermissionRead, benGrants[1].Allow) + require.Equal(t, "secret", benGrants[0].TopicPattern) + require.Equal(t, PermissionRead, benGrants[0].Allow) + require.Equal(t, "stats", benGrants[1].TopicPattern) + require.Equal(t, PermissionReadWrite, benGrants[1].Allow) require.Equal(t, "u_everyone", everyone.ID) require.Equal(t, Everyone, everyone.Name) From 0ff1f6520a14b57ecbe7b46588531482d4583721 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Tue, 24 Oct 2023 14:02:04 +0300 Subject: [PATCH 101/182] TestMigrationFrom4: move the longest rule on top --- user/manager_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/manager_test.go b/user/manager_test.go index 76bddc57..af2bb3b1 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -1225,9 +1225,9 @@ func TestMigrationFrom4(t *testing.T) { require.Nil(t, err) require.Equal(t, 4, len(everyoneGrants)) - require.Equal(t, "down_*", everyoneGrants[0].TopicPattern) - require.Equal(t, "left_*", everyoneGrants[1].TopicPattern) - require.Equal(t, "mytopic_", everyoneGrants[2].TopicPattern) + require.Equal(t, "mytopic_", everyoneGrants[0].TopicPattern) + require.Equal(t, "down_*", everyoneGrants[1].TopicPattern) + require.Equal(t, "left_*", everyoneGrants[2].TopicPattern) require.Equal(t, "up*", everyoneGrants[3].TopicPattern) // Check they are stored correctly in the database From 1aa82ff06a71d27630262bf099f171d57f7e2306 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Tue, 24 Oct 2023 14:02:52 +0300 Subject: [PATCH 102/182] FullScenario_Default_DenyAll: add user "john" test case Add new test for user john The user should have: "deny" to mytopic_deny*, "ro" to mytopic_ro*, "rw" to mytopic*, "ro" to the rest --- user/manager_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/user/manager_test.go b/user/manager_test.go index af2bb3b1..9e645bff 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -20,10 +20,15 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) require.Nil(t, a.AddUser("phil", "phil", RoleAdmin)) require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("john", "john", RoleUser)) require.Nil(t, a.AllowAccess("ben", "mytopic", PermissionReadWrite)) require.Nil(t, a.AllowAccess("ben", "readme", PermissionRead)) require.Nil(t, a.AllowAccess("ben", "writeme", PermissionWrite)) require.Nil(t, a.AllowAccess("ben", "everyonewrite", PermissionDenyAll)) // How unfair! + require.Nil(t, a.AllowAccess("john", "*", PermissionRead)) + require.Nil(t, a.AllowAccess("john", "mytopic*", PermissionReadWrite)) + require.Nil(t, a.AllowAccess("john", "mytopic_ro*", PermissionRead)) + require.Nil(t, a.AllowAccess("john", "mytopic_deny*", PermissionDenyAll)) require.Nil(t, a.AllowAccess(Everyone, "announcements", PermissionRead)) require.Nil(t, a.AllowAccess(Everyone, "everyonewrite", PermissionReadWrite)) require.Nil(t, a.AllowAccess(Everyone, "up*", PermissionWrite)) // Everyone can write to /up* @@ -53,6 +58,21 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { {"readme", PermissionRead}, }, benGrants) + john, err := a.Authenticate("john", "john") + require.Nil(t, err) + require.Equal(t, "john", john.Name) + require.True(t, strings.HasPrefix(john.Hash, "$2a$10$")) + require.Equal(t, RoleUser, john.Role) + + johnGrants, err := a.Grants("john") + require.Nil(t, err) + require.Equal(t, []Grant{ + {"mytopic_deny*", PermissionDenyAll}, + {"mytopic_ro*", PermissionRead}, + {"mytopic*", PermissionReadWrite}, + {"*", PermissionRead}, + }, johnGrants) + notben, err := a.Authenticate("ben", "this is wrong") require.Nil(t, notben) require.Equal(t, ErrUnauthenticated, err) @@ -78,6 +98,20 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { require.Nil(t, a.Authorize(ben, "announcements", PermissionRead)) require.Equal(t, ErrUnauthorized, a.Authorize(ben, "announcements", PermissionWrite)) + // user john should have + // "deny" to mytopic_deny*, + // "ro" to mytopic_ro*, + // "rw" to mytopic*, + // "ro" to the rest + require.Equal(t, ErrUnauthorized, a.Authorize(john, "mytopic_deny_case", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(john, "mytopic_deny_case", PermissionWrite)) + require.Nil(t, a.Authorize(john, "mytopic_ro_test_case", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(john, "mytopic_ro_test_case", PermissionWrite)) + require.Nil(t, a.Authorize(john, "mytopic_case1", PermissionRead)) + require.Nil(t, a.Authorize(john, "mytopic_case1", PermissionWrite)) + require.Nil(t, a.Authorize(john, "readme", PermissionRead)) + require.Equal(t, ErrUnauthorized, a.Authorize(john, "writeme", PermissionWrite)) + // Everyone else can do barely anything require.Equal(t, ErrUnauthorized, a.Authorize(nil, "sometopicnotinthelist", PermissionRead)) require.Equal(t, ErrUnauthorized, a.Authorize(nil, "sometopicnotinthelist", PermissionWrite)) From 27f8cc0e5282c2861f0e2f48041becaa914ebd8d Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sat, 28 Oct 2023 19:04:56 +0200 Subject: [PATCH 103/182] Adding changedetection.io integration guide --- docs/examples.md | 16 ++++++++++++++++ docs/integrations.md | 1 + docs/static/img/cdio-setup.jpg | Bin 0 -> 158553 bytes 3 files changed, 17 insertions(+) create mode 100644 docs/static/img/cdio-setup.jpg diff --git a/docs/examples.md b/docs/examples.md index 8164e2bf..a0e121fe 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -135,6 +135,22 @@ You can send a message during a workflow run with curl. Here is an example sendi ${{ secrets.NTFY_URL }} ``` +## Changedetection.io +NTFY is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), +[changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) +uses [apprise](https://github.com/caronc/apprise) library for notification integrations. + +To add any NTFY(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +to the notification list. + +For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` + +In your changedetection.io installation, click `Edit` > `Notifications` on a single watch then add the special NTFY URL +to the Notification List. + +![ntfy alerts on website change](static/img/cdio-setup.jpg) + + ## Watchtower (shoutrrr) You can use [shoutrrr](https://containrrr.dev/shoutrrr/latest/services/ntfy/) to send [Watchtower](https://github.com/containrrr/watchtower/) notifications to your ntfy topic. diff --git a/docs/integrations.md b/docs/integrations.md index f5c5fe83..a8ffa6a9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -24,6 +24,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [diun](https://crazymax.dev/diun/) - Docker Image Update Notifier - [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server - [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring +- [changedetection.io](https://changedetection.io) ⭐ - Website change detection and notification ## Integration via HTTP/SMTP/etc. diff --git a/docs/static/img/cdio-setup.jpg b/docs/static/img/cdio-setup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f9e44cb2ff668da992555e9171229b7d8849836 GIT binary patch literal 158553 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%0DsB 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 I{k`&k0NcX>(f|Me literal 0 HcmV?d00001 From 03e7a3ea65030423df4f1a2b811c5ee92fb1544c Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sat, 28 Oct 2023 19:08:14 +0200 Subject: [PATCH 104/182] lower case --- docs/examples.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/examples.md b/docs/examples.md index a0e121fe..9f951422 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -136,21 +136,20 @@ You can send a message during a workflow run with curl. Here is an example sendi ``` ## Changedetection.io -NTFY is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), +ntfy is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), [changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) uses [apprise](https://github.com/caronc/apprise) library for notification integrations. -To add any NTFY(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +To add any ntfy(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) to the notification list. For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` -In your changedetection.io installation, click `Edit` > `Notifications` on a single watch then add the special NTFY URL -to the Notification List. +In your changedetection.io installation, click `Edit` > `Notifications` on a single website watch (or group) then add +the special ntfy Apprise Notification URL to the Notification List. ![ntfy alerts on website change](static/img/cdio-setup.jpg) - ## Watchtower (shoutrrr) You can use [shoutrrr](https://containrrr.dev/shoutrrr/latest/services/ntfy/) to send [Watchtower](https://github.com/containrrr/watchtower/) notifications to your ntfy topic. From e2097e856ea7f523c6ac8320b4ec978a7469b750 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Sat, 28 Oct 2023 13:33:39 -0400 Subject: [PATCH 105/182] Update install.md Add macOS client.yml location to the list of locations given --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index ed101554..c1a621d7 100644 --- a/docs/install.md +++ b/docs/install.md @@ -14,7 +14,7 @@ We support amd64, armv7 and arm64. 1. Install ntfy using one of the methods described below 2. Then (optionally) edit `/etc/ntfy/server.yml` for the server (Linux only, see [configuration](config.md) or [sample server.yml](https://github.com/binwiederhier/ntfy/blob/main/server/server.yml)) -3. Or (optionally) create/edit `~/.config/ntfy/client.yml` (for the non-root user) or `/etc/ntfy/client.yml` (for the root user), see [sample client.yml](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml)) +3. Or (optionally) create/edit `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user), see [sample client.yml](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml)) To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm). To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI](subscribe/cli.md) From 2afe1fbeedea74065f3ba1d1b8aa8679e76cc742 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Sat, 28 Oct 2023 13:35:52 -0400 Subject: [PATCH 106/182] Update cli.md Add macOS client location to the options listed --- docs/subscribe/cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md index 59cfc8e7..7f589d3c 100644 --- a/docs/subscribe/cli.md +++ b/docs/subscribe/cli.md @@ -10,7 +10,7 @@ to topics via the ntfy CLI. The CLI is included in the same `ntfy` binary that c ## Install + configure To install the ntfy CLI, simply **follow the steps outlined on the [install page](../install.md)**. The ntfy server and client are the same binary, so it's all very convenient. After installing, you can (optionally) configure the client -by creating `~/.config/ntfy/client.yml` (for the non-root user), or `/etc/ntfy/client.yml` (for the root user). You +by creating `~/.config/ntfy/client.yml` (for the non-root user), `~/Library/Application Support/ntfy/client.yml` (for the macOS non-root user), or `/etc/ntfy/client.yml` (for the root user). You can find a [skeleton config](https://github.com/binwiederhier/ntfy/blob/main/client/client.yml) on GitHub. If you just want to use [ntfy.sh](https://ntfy.sh), you don't have to change anything. If you **self-host your own server**, From 7791901b2d32fa5a167de13c5b69c04980d31b54 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:10:35 -0400 Subject: [PATCH 107/182] Thank you @bear for your sponsorship. Awesome user name too! --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c20c9971..8c633163 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 6d451785f08147b06b847887cb1306b82a1b2de6 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:13:26 -0400 Subject: [PATCH 108/182] Thank you @richardleach for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8c633163..3b98ddf5 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), From a3663e43e4162e6aa3fc6f185fed48a5742a6555 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:14:07 -0400 Subject: [PATCH 109/182] Thank you for your donation @cminter --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3b98ddf5..1754ea5d 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From cad38573d76f8236c6eba53c1388135650564f26 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:15:20 -0400 Subject: [PATCH 110/182] Thank you for your donation @bahur142 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1754ea5d..bb8879af 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 8e0491220158aa86078f384391914f67894fa700 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 12:32:08 -0400 Subject: [PATCH 111/182] Fixing docs links --- docs/develop.md | 2 +- docs/emojis.md | 4 ++-- docs/examples.md | 4 ++-- docs/releases.md | 2 +- scripts/emoji-convert.sh | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/develop.md b/docs/develop.md index 05b55773..b090c8c5 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -429,7 +429,7 @@ steps: ### XCode setup -1. Follow step 4 of [https://firebase.google.com/docs/ios/setup](Add Firebase to your Apple project) to install the +1. Follow step 4 of [Add Firebase to your Apple project](https://firebase.google.com/docs/ios/setup) to install the `firebase-ios-sdk` in XCode, if it's not already present - you can select any packages in addition to Firebase Core / Firebase Messaging 1. Similarly, install the SQLite.swift package dependency in XCode 1. When running the debug build, ensure XCode is pointed to the connected iOS device - registering for push notifications does not work in the iOS simulators diff --git a/docs/emojis.md b/docs/emojis.md index fa01bb47..d801ae09 100644 --- a/docs/emojis.md +++ b/docs/emojis.md @@ -2,9 +2,9 @@ -You can [tag messages](../publish/#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically +You can [tag messages](publish.md#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically converted to emojis. This is a reference of all supported emojis. To learn more about the feature, please refer to the -[tagging and emojis page](../publish/#tags-emojis). +[tagging and emojis page](publish.md#tags-emojis). diff --git a/docs/examples.md b/docs/examples.md index 9f951422..4e936d91 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -137,10 +137,10 @@ You can send a message during a workflow run with curl. Here is an example sendi ## Changedetection.io ntfy is an excellent choice for getting notifications when a website has a change sent to your mobile (or desktop), -[changedetection.io](https://changedetection.io) or [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) +[changedetection.io](https://changedetection.io) or on GitHub ([dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io)) uses [apprise](https://github.com/caronc/apprise) library for notification integrations. -To add any ntfy(s) notification to a website change simply add the [NTFY style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) +To add any ntfy(s) notification to a website change simply add the [ntfy style URL](https://github.com/caronc/apprise/wiki/Notify_ntfy) to the notification list. For example `ntfy://{topic}` or `ntfy://{user}:{password}@{host}:{port}/{topics}` diff --git a/docs/releases.md b/docs/releases.md index cac34a3c..0cac2dea 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1273,7 +1273,7 @@ Released Dec 28, 2021 **Features & bug fixes:** -* [Publish messages via e-mail](ntfy.sh/docs/publish/#e-mail-publishing) #66 +* [Publish messages via e-mail](publish.md#e-mail-publishing) #66 * Server-side work to support [unifiedpush.org](https://unifiedpush.org) #64 * Fixing the Santa bug #65 diff --git a/scripts/emoji-convert.sh b/scripts/emoji-convert.sh index 61ad5f79..8cbe397b 100755 --- a/scripts/emoji-convert.sh +++ b/scripts/emoji-convert.sh @@ -25,9 +25,9 @@ elif [[ "$1" == *.md ]]; then -You can [tag messages](../publish/#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically +You can [tag messages](publish.md#tags-emojis) with emojis 🥳 🎉 and other relevant strings. Matching tags are automatically converted to emojis. This is a reference of all supported emojis. To learn more about the feature, please refer to the -[tagging and emojis page](../publish/#tags-emojis). +[tagging and emojis page](publish.md#tags-emojis).
" > "$1" From b3534aecda1a557ce4149dd958c615ae89de1aa2 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 19:57:06 -0400 Subject: [PATCH 112/182] Format fixes --- Makefile | 12 ++++++------ web/src/app/utils.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 8cb75238..10624ed5 100644 --- a/Makefile +++ b/Makefile @@ -39,8 +39,8 @@ help: @echo " make web-deps - Install web app dependencies (npm install the universe)" @echo " make web-build - Actually build the web app" @echo " make web-lint - Run eslint on the web app" - @echo " make web-format - Run prettier on the web app" - @echo " make web-format-check - Run prettier on the web app, but don't change anything" + @echo " make web-fmt - Run prettier on the web app" + @echo " make web-fmt-check - Run prettier on the web app, but don't change anything" @echo @echo "Build documentation:" @echo " make docs - Build the documentation" @@ -151,10 +151,10 @@ web-deps: web-deps-update: cd web && npm update -web-format: +web-fmt: cd web && npm run format -web-format-check: +web-fmt-check: cd web && npm run format:check web-lint: @@ -248,7 +248,7 @@ cli-build-results: # Test/check targets -check: test web-format-check fmt-check vet web-lint lint staticcheck +check: test web-fmt-check fmt-check vet web-lint lint staticcheck test: .PHONY go test $(shell go list ./... | grep -vE 'ntfy/(test|examples|tools)') @@ -275,7 +275,7 @@ coverage-upload: # Lint/formatting targets -fmt: +fmt: web-fmt gofmt -s -w . fmt-check: diff --git a/web/src/app/utils.js b/web/src/app/utils.js index 6b3849f5..08710c1f 100644 --- a/web/src/app/utils.js +++ b/web/src/app/utils.js @@ -134,7 +134,7 @@ export const hashCode = (s) => { * convert `i18n.language` style str (e.g.: `en_US`) to kebab-case (e.g.: `en-US`), * which is expected by `` and `Intl.DateTimeFormat` */ -export const getKebabCaseLangStr = (language) => language.replace(/_/g, '-'); +export const getKebabCaseLangStr = (language) => language.replace(/_/g, "-"); export const formatShortDateTime = (timestamp, language) => new Intl.DateTimeFormat(getKebabCaseLangStr(language), { From c332c132faf8c0ec2798ba89fdd8c17bca55fb7f Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 29 Oct 2023 20:04:37 -0400 Subject: [PATCH 113/182] Fix CI --- server/server_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/server_test.go b/server/server_test.go index d78533e9..d60c775a 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -512,6 +512,8 @@ func TestServer_PublishAtAndPrune(t *testing.T) { messages := toMessages(t, response.Body.String()) require.Equal(t, 1, len(messages)) // Not affected by pruning require.Equal(t, "a message", messages[0].Message) + + time.Sleep(time.Second) // FIXME CI failing not sure why } func TestServer_PublishAndMultiPoll(t *testing.T) { From d3565c9b87440931992874aebf55e7d8db9e96d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sat, 4 Nov 2023 19:39:29 +0100 Subject: [PATCH 114/182] Added translation using Weblate (Finnish) --- web/public/static/langs/fi.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/fi.json diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/fi.json @@ -0,0 +1 @@ +{} From 8dd4c3e3c0fffb4516bb313a54a979ea0174c77d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:48:47 -0500 Subject: [PATCH 115/182] Bump deps --- docs/releases.md | 2 +- go.mod | 38 ++-- go.sum | 127 ++++------- web/package-lock.json | 490 ++++++++++++++++++++++-------------------- 4 files changed, 314 insertions(+), 343 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 0cac2dea..73e5eb20 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1291,7 +1291,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) -* Correct usage of language str having underline ([#922](https://github.com/binwiederhier/ntfy/pull/922), thanks to [@imkero](https://github.com/imkero)) +* Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) ### ntfy Android app v1.16.1 (UNRELEASED) diff --git a/go.mod b/go.mod index 27ee4332..95365372 100644 --- a/go.mod +++ b/go.mod @@ -3,23 +3,23 @@ module heckel.io/ntfy go 1.18 require ( - cloud.google.com/go/firestore v1.13.0 // indirect - cloud.google.com/go/storage v1.33.0 // indirect + cloud.google.com/go/firestore v1.14.0 // indirect + cloud.google.com/go/storage v1.34.1 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 github.com/gabriel-vasile/mimetype v1.4.3 - github.com/gorilla/websocket v1.5.0 - github.com/mattn/go-sqlite3 v1.14.17 + github.com/gorilla/websocket v1.5.1 + github.com/mattn/go-sqlite3 v1.14.18 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.7 golang.org/x/crypto v0.14.0 golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.4.0 + golang.org/x/sync v0.5.0 golang.org/x/term v0.13.0 - golang.org/x/time v0.3.0 - google.golang.org/api v0.147.0 + golang.org/x/time v0.4.0 + google.golang.org/api v0.149.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -35,11 +35,11 @@ require ( ) require ( - cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.1 // indirect + cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.3 // indirect - cloud.google.com/go/longrunning v0.5.2 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/longrunning v0.5.4 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -50,13 +50,11 @@ require ( github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/kr/text v0.2.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -67,14 +65,14 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 083a5423..d93f52d2 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.13.0 h1:/3S4RssUV4GO/kvgJZB+tayjhOfyAHs+KcpJgRVu/Qk= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2 h1:u+oFqfEwwU7F9dIELigxbe0XVnBAo9wqMuQLA50CZ5k= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M= -cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8= -firebase.google.com/go/v4 v4.12.0 h1:I6dCkcWUMFNkFdWgzlf8SLWecQnKdFgJhMv5fT9l1qI= -firebase.google.com/go/v4 v4.12.0/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/storage v1.34.1 h1:H2Af2dU5J0PF7A5B+ECFIce+RqxVnrVilO+cu0TS3MI= +cloud.google.com/go/storage v1.34.1/go.mod h1:VN1ElqqvR9adg1k9xlkUJ55cMOP1/QjnNNuT5xQL6dY= firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= firebase.google.com/go/v4 v4.12.1/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= @@ -30,8 +22,6 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA= -github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w= github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k= github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -41,8 +31,6 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -58,8 +46,6 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -92,29 +78,24 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= @@ -123,19 +104,11 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= @@ -161,13 +134,10 @@ github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsr github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -188,25 +158,18 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= 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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -218,16 +181,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -237,10 +196,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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= @@ -251,16 +210,10 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.142.0 h1:mf+7EJ94fi5ZcnpPy+m0Yv2dkz8bKm+UL0snTCuwXlY= -google.golang.org/api v0.142.0/go.mod h1:zJAN5o6HRqR7O+9qJUFOWrZkYE66RH+efPBdTLA4xBA= -google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= -google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= -google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc= -google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -270,25 +223,17 @@ google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= -google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/web/package-lock.json b/web/package-lock.json index 13d2357d..7e3fcfdb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -2245,18 +2245,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2304,9 +2304,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2347,12 +2347,12 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -2374,9 +2374,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -2438,9 +2438,9 @@ } }, "node_modules/@mapbox/hast-util-table-cell-style": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz", - "integrity": "sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", + "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", "dependencies": { "unist-util-visit": "^1.4.1" }, @@ -2449,14 +2449,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", - "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", + "version": "5.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", + "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2480,20 +2480,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", - "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", + "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.14.tgz", - "integrity": "sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.16.tgz", + "integrity": "sha512-wmOgslMEGvbHZjFLru8uH5E+pif/ciXAvKNw16q6joK6EWVWU5rDYWFknDaZhCvz8ZE/K8ZnJQ+lMG6GgHzXbg==", "dependencies": { - "@babel/runtime": "^7.23.1" + "@babel/runtime": "^7.23.2" }, "engines": { "node": ">=12.0.0" @@ -2514,17 +2514,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz", - "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", + "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/core-downloads-tracker": "^5.14.14", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@types/react-transition-group": "^4.4.7", + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/core-downloads-tracker": "^5.14.16", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -2558,12 +2558,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", - "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", + "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.16", "prop-types": "^15.8.1" }, "engines": { @@ -2584,11 +2584,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", - "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", + "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2615,15 +2615,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", - "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", + "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.14", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.16", + "@mui/styled-engine": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,9 +2654,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", - "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -2667,12 +2667,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz", - "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", + "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@types/prop-types": "^15.7.7", + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2738,9 +2738,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", - "integrity": "sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", "engines": { "node": ">=14.0.0" } @@ -2819,12 +2819,12 @@ } }, "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "dev": true, "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/parse-json": { @@ -2838,9 +2838,9 @@ "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/react": { - "version": "18.2.29", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.29.tgz", - "integrity": "sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q==", + "version": "18.2.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", + "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2880,16 +2880,22 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.9.tgz", "integrity": "sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==" }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", - "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", "dev": true, "dependencies": { - "@babel/core": "^7.22.20", + "@babel/core": "^7.23.2", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.2", + "@types/babel__core": "^7.20.3", "react-refresh": "^0.14.0" }, "engines": { @@ -2900,9 +2906,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3093,15 +3099,15 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -3135,9 +3141,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -3181,13 +3187,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" + "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3293,13 +3299,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3314,9 +3321,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -3444,9 +3451,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -3601,9 +3608,9 @@ } }, "node_modules/dexie-react-hooks": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/dexie-react-hooks/-/dexie-react-hooks-1.1.6.tgz", - "integrity": "sha512-xSblWtmPwhafWNWMECsW7zMMmBu8goH3QqTxEfwBNoNG1mgsM0oFclippev7ss9HhKICqBwTjgqpscci5Ed4mA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz", + "integrity": "sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw==", "peerDependencies": { "@types/react": ">=16", "dexie": "^3.2 || ^4.0.1-alpha", @@ -3647,9 +3654,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.559", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", - "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", "dev": true }, "node_modules/emoji-regex": { @@ -3675,26 +3682,26 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -3704,7 +3711,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -3718,7 +3725,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3750,26 +3757,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -3847,18 +3854,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3999,26 +4007,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -4051,27 +4059,27 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -4544,7 +4552,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4586,15 +4593,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4702,14 +4709,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -4728,12 +4727,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4778,6 +4777,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -4921,13 +4931,13 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -5053,11 +5063,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5633,12 +5643,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/leven": { @@ -5925,9 +5938,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -5982,9 +5995,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6341,9 +6354,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -6469,11 +6482,11 @@ } }, "node_modules/react-router": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.17.0.tgz", - "integrity": "sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", "dependencies": { - "@remix-run/router": "1.10.0" + "@remix-run/router": "1.11.0" }, "engines": { "node": ">=14.0.0" @@ -6483,12 +6496,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.17.0.tgz", - "integrity": "sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", "dependencies": { - "@remix-run/router": "1.10.0", - "react-router": "6.17.0" + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" }, "engines": { "node": ">=14.0.0" @@ -6832,6 +6845,21 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -7168,9 +7196,9 @@ } }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7362,9 +7390,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -7506,9 +7534,9 @@ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -7771,13 +7799,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" From d4af2be7a00ea07260d8aaf51cfdc2a54f58ac51 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:49:36 -0500 Subject: [PATCH 116/182] Thank you @pgwiebes for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bb8879af..339506dd 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From abe7275f0cfceecb7e3027f02c47f3823291cd50 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 6 Nov 2023 05:55:04 -0500 Subject: [PATCH 117/182] Remove Python version check --- Makefile | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 10624ed5..88c22033 100644 --- a/Makefile +++ b/Makefile @@ -111,18 +111,7 @@ build-deps-ubuntu: docs: docs-deps docs-build docs-build: .PHONY - @if ! /bin/echo -e "import sys\nif sys.version_info < (3,8):\n exit(1)" | python3; then \ - if which python3.8; then \ - echo "python3.8 $(shell which mkdocs) build"; \ - python3.8 $(shell which mkdocs) build; \ - else \ - echo "ERROR: Python version too low. mkdocs-material needs >= 3.8"; \ - exit 1; \ - fi; \ - else \ - echo "mkdocs build"; \ - mkdocs build; \ - fi + mkdocs build docs-deps: .PHONY pip3 install -r requirements.txt From 28c653043e05fbb35ffd6ec6ecaa7c8f654300c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sun, 5 Nov 2023 07:41:29 +0000 Subject: [PATCH 118/182] Translated using Weblate (Finnish) Currently translated at 93.7% (358 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 361 +++++++++++++++++++++++++++++++- 1 file changed, 360 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index 0967ef42..7275a72f 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -1 +1,360 @@ -{} +{ + "publish_dialog_message_placeholder": "Kirjoita viesti tähän", + "account_upgrade_dialog_tier_features_no_calls": "Ei puheluita", + "account_upgrade_dialog_billing_contact_email": "Laskutukseen liittyvissä kysymyksissä contact us suoraan.", + "account_tokens_dialog_title_create": "Luo käyttöoikeustunnus", + "prefs_reservations_dialog_title_edit": "Muokkaa varattua topikkia", + "account_basics_tier_interval_monthly": "Kuukausittain", + "publish_dialog_checkbox_publish_another": "Julkaise toinen", + "publish_dialog_details_examples_description": "Katso esimerkkejä ja yksityiskohtaisen kuvauksen kaikista lähetysominaisuuksista dokumentaatiosta.", + "account_basics_tier_canceled_subscription": "Tilauksesi peruutettiin ja se muutetaan maksuttomaksi tiliksi {{date}}.", + "priority_default": "oletus", + "prefs_notifications_min_priority_title": "Vähimmäisprioriteetti", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} päivittäisiä puheluja", + "account_upgrade_dialog_tier_current_label": "Nykyinen", + "action_bar_account": "Kirjautuminen", + "publish_dialog_filename_placeholder": "Liitetiedoston nimi", + "account_basics_password_dialog_current_password_incorrect": "Salasana virheellinen", + "account_tokens_table_token_header": "Token", + "prefs_notifications_delete_after_never": "Ei koskaan", + "prefs_users_description": "Lisää/poista käyttäjiä suojatuista topikeista täällä. Huomaa, että käyttäjätunnus ja salasana on tallennettu selaimen paikalliseen tallennustilaan.", + "account_basics_phone_numbers_dialog_number_label": "Puhelinnumero", + "subscribe_dialog_subscribe_description": "Aiheet eivät välttämättä ole salasanasuojattuja, joten valitse nimi, jota ei ole helposti arvatavissa. Kun olet tilannut, voit käyttää PUT/POST ilmoituksia.", + "action_bar_logo_alt": "ntfy logo", + "account_basics_password_dialog_button_submit": "Vaihda salasana", + "publish_dialog_emoji_picker_show": "Valitse emoji", + "account_basics_username_title": "Käyttäjätunnus", + "login_disabled": "Kirjautuminen poissa käytöstä", + "account_basics_phone_numbers_dialog_check_verification_button": "Vahvista koodi", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "säästä jopa {{discount}}%", + "account_tokens_dialog_label": "Etiketti, esim. Tutka-ilmoitukset", + "common_add": "Lisää", + "account_tokens_table_expires_header": "Vanhenee", + "account_upgrade_dialog_proration_info": "Osuus suhde: Kun päivität maksullisten pakettien välillä, hintaero veloitetaan välittömästi. Kun siirryt alemmalle tasolle, saldoa käytetään tulevien laskutuskausien maksamiseen.", + "prefs_reservations_dialog_access_label": "Oikeudet", + "account_usage_attachment_storage_title": "Liiteiden säilytys", + "prefs_users_dialog_username_label": "Username, esim pena", + "message_bar_error_publishing": "Virhe ilmoituksen julkaisemisessa", + "publish_dialog_chip_delay_label": "Viivästytä toimitusta", + "account_usage_messages_title": "Julkaistut viestit", + "notifications_attachment_open_button": "Avaa liite", + "emoji_picker_search_clear": "Tyhjennä haku", + "prefs_reservations_table_not_subscribed": "Ei tilattu", + "publish_dialog_topic_placeholder": "Topikin nimi, esim. erkin_hälyt", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} päivittäisiä emaileja", + "prefs_notifications_min_priority_max_only": "Vain maksimi prioriteetti", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} päivittäisiä puheluja", + "prefs_notifications_sound_description_some": "Ilmoitukset soittavat {{sound}} äänen saapuessaan", + "prefs_reservations_edit_button": "Muokkaa topikin oikeuksia", + "account_basics_phone_numbers_dialog_verify_button_sms": "Lähetä SMS", + "account_basics_tier_change_button": "Vaihda", + "account_tokens_dialog_expires_never": "Käyttöoikeus ei vanhene koskaan", + "subscribe_dialog_login_title": "Kirjautuminen vaaditaan", + "account_tokens_dialog_expires_x_days": "Tunnus vanhenee {{days}} päivän kuluttua", + "notifications_new_indicator": "Uusi ilmoitus", + "prefs_reservations_table_everyone_read_only": "Minä voin julkaista ja tilata, kaikki voivat tilata", + "prefs_reservations_table_everyone_deny_all": "Vain minä voin julkaista ja tilata", + "publish_dialog_chip_topic_label": "Vaihda topikkia", + "account_basics_phone_numbers_dialog_description": "Jotta voit käyttää puheluilmoitusominaisuutta, sinun on lisättävä ja vahvistettava vähintään yksi puhelinnumero. Vahvistus voidaan tehdä tekstiviestillä tai puhelimitse.", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} varatut topikit", + "publish_dialog_tags_placeholder": "Pilkuilla eroteltu luettelo tunnisteista, esim. varoitus, srv1-varmuuskopio", + "account_delete_title": "Poista tili", + "publish_dialog_attached_file_remove": "Poista liitetiedosto", + "nav_button_connecting": "yhdistää", + "account_delete_dialog_label": "Salasana", + "subscribe_dialog_login_button_login": "Kirjaudu", + "account_upgrade_dialog_tier_features_no_reservations": "Ei varattuja topikkeja", + "message_bar_type_message": "Kirjoita viesti tähän", + "publish_dialog_base_url_label": "Palvelun URL", + "signup_form_confirm_password": "Vahvista salasana", + "prefs_users_table_cannot_delete_or_edit": "Kirjautunutta käyttäjää ei voi poistaa tai muokata", + "account_basics_tier_admin_suffix_with_tier": "(mukana {{tier}} tier)", + "prefs_notifications_delete_after_three_hours_description": "Ilmoitukset poistetaan automaattisesti kolmen tunnin kuluttua", + "publish_dialog_chip_email_label": "Lähetä sähköpostiin", + "publish_dialog_attach_label": "Liitteen URL-osoite", + "signup_form_username": "Käyttäjätunnus", + "prefs_notifications_delete_after_three_hours": "Kolmen tunnin jälkeen", + "nav_button_muted": "Ilmoitukset mykistetty", + "action_bar_profile_settings": "Asetukset", + "signup_error_creation_limit_reached": "Tilin lisäämisraja saavutettu", + "notifications_attachment_open_title": "Siirry osoitteeseen {{url}}", + "prefs_notifications_min_priority_description_x_or_higher": "Näytä ilmoitukset, jos prioriteetti on {{number}} ({{name}}) tai suurempi", + "reservation_delete_dialog_description": "Varauksen poistaminen luopuu topikin omistajuudesta ja antaa muiden varata sen. Voit säilyttää tai poistaa olemassa olevia viestejä ja liitteitä.", + "subscribe_dialog_login_username_label": "Käyttäjätunnus, esim. pentti", + "subscribe_dialog_error_user_not_authorized": "Käyttäjää {{username}} ei ole valtuutettu", + "prefs_reservations_table_everyone_read_write": "Jokainen voi julkaista ja tilata", + "prefs_reservations_dialog_title_delete": "Poista topikin varaus", + "prefs_users_table": "Käyttäjä taulukko", + "prefs_reservations_table_topic_header": "Topikki", + "action_bar_toggle_mute": "Hiljennä/poista hiljennys", + "reservation_delete_dialog_submit_button": "Poista varaus", + "account_basics_title": "Tili", + "nav_button_documentation": "Käyttäjä oppaat", + "prefs_reservations_limit_reached": "Olet saavuttanut varattujen topikkien rajan.", + "account_upgrade_dialog_interval_monthly": "Kuukausittain", + "prefs_users_add_button": "Lisää käyttäjä", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} päivittäisiä viestejä", + "publish_dialog_delay_reset": "Poista viivästetty toimitus", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ei puhelinnumeroita vielä", + "action_bar_toggle_action_menu": "Avaa/sulje toiminto valikko", + "subscribe_dialog_subscribe_button_generate_topic_name": "Luo nimi", + "notifications_list_item": "Ilmoitus", + "prefs_appearance_language_title": "Kieli", + "notifications_attachment_link_expired": "latauslinkki vanhentunut", + "subscribe_dialog_login_password_label": "Salasana", + "prefs_notifications_delete_after_one_day_description": "Ilmoitukset poistetaan automaattisesti yhden päivän kuluttua", + "subscribe_dialog_subscribe_button_subscribe": "Tilaa", + "account_tokens_table_never_expires": "Ei vanhene koskaan", + "account_tokens_delete_dialog_title": "Poista käyttöoikeustunnus", + "prefs_notifications_delete_after_one_month": "Kuukauden kuluttua", + "publish_dialog_chip_call_label": "Puhelu", + "account_basics_phone_numbers_dialog_title": "Lisää puhelinnumero", + "account_tokens_delete_dialog_description": "Ennen kuin poistat käyttöoikeustunnuksen, varmista, että mikään sovellus tai komentosarja ei käytä sitä aktiivisesti. Tätä toimintoa ei voi kumota.", + "nav_button_all_notifications": "Kaikki ilmoitukset", + "account_upgrade_dialog_button_cancel": "Peruuta", + "notifications_attachment_image": "Liitekuva", + "account_tokens_table_label_header": "Merkki", + "notifications_attachment_file_document": "muu asiakirja", + "publish_dialog_button_cancel": "Peruuta", + "account_upgrade_dialog_billing_contact_website": "Laskutukseen liittyvissä kysymyksissä käy website.", + "signup_form_button_submit": "Kirjaudu linkki", + "account_basics_username_admin_tooltip": "Olet pääkäyttäjä", + "prefs_notifications_delete_after_never_description": "Ilmoituksia eivät koskaan poisteta automaattisesti", + "account_delete_dialog_description": "Tämä poistaa pysyvästi tilisi, mukaan lukien kaikki palvelimelle tallennetut tiedot. Poistamisen jälkeen käyttäjätunnuksesi on poissa käytöstä 7 päivään. Jos todella haluat jatkaa, vahvista salasanasi alla olevaan kenttään.", + "publish_dialog_email_reset": "Poista sähköpostin edelleenlähetys", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} varatut topikit", + "account_usage_reservations_none": "Tälle tilille ei ole varattu topikkeja", + "prefs_notifications_sound_description_none": "Ilmoitukset eivät toista ääntä saapuessaan", + "account_tokens_description": "Käytä käyttjätunnuksia, kun julkaiset ja tilaat ntfy API:n kautta, jotta sinun ei tarvitse lähettää tilisi tunnistetietoja. Katso lisätietoja documentation.", + "common_back": "Takaisin", + "prefs_reservations_table": "Varattujen topikkien taulukko", + "emoji_picker_search_placeholder": "Etsi emoji", + "subscribe_dialog_subscribe_topic_placeholder": "Topikin nimi, esim. pentin_hälyt", + "account_upgrade_dialog_button_cancel_subscription": "Peruuta tilaus", + "notifications_attachment_file_audio": "äänitiedosto", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} päivittäisiä emaileja", + "action_bar_sign_up": "Kirjautuminen", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} tiedostokoko", + "notifications_mark_read": "Merkitse luetuksi", + "prefs_reservations_description": "Voit varata topikien nimiä henkilökohtaiseen käyttöön täältä. Aiheen varaaminen antaa sinulle topikin omistajuuden ja voit määrittää topikkiin liittyviä käyttöoikeuksia muille käyttäjille.", + "notifications_attachment_copy_url_title": "Kopioi liitteen URL-osoite leikepöydälle", + "account_usage_title": "Käytössä", + "account_basics_tier_upgrade_button": "Päivitä Pro versioon", + "prefs_users_description_no_sync": "Käyttäjiä ja salasanoja ei ole synkronoitu tiliisi.", + "account_tokens_dialog_title_edit": "Muokkaa käyttöoikeustunnusta", + "nav_button_publish_message": "Julkaisutiedot", + "prefs_users_table_base_url_header": "Palvelin URL", + "notifications_click_copy_url_title": "Kopioi linkin URL-osoite leikepöydälle", + "publish_dialog_attach_reset": "Poista liitteen URL-osoite", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} päivittäisiä viestejä", + "account_upgrade_dialog_reservations_warning_one": "Valittu taso sallii vähemmän varattuja topikeita kuin nykyinen tasosi. Ennen kuin muutat tasosi, poista vähintään yksi varaus. Voit poistaa varauksia Asetuksista.", + "common_copy_to_clipboard": "Kopioi leikkelepöydälle", + "alert_not_supported_description": "Selaimesi ei tue ilmoituksia.", + "subscribe_dialog_error_topic_already_reserved": "Topikki on jo varattu", + "message_bar_publish": "Julkaise viesti", + "alert_grant_description": "Myönnä selaimelle lupa näyttää työpöytäilmoituksia.", + "prefs_users_table_user_header": "Käyttäjä", + "error_boundary_stack_trace": "Pinon jälki", + "prefs_users_dialog_password_label": "Salasana", + "prefs_notifications_delete_after_one_week": "Viikon kuluttua", + "publish_dialog_priority_low": "Matala tärkeys", + "publish_dialog_priority_label": "Prioriteetti", + "prefs_reservations_delete_button": "Poista topikin oikeudet", + "account_basics_tier_admin_suffix_no_tier": "(no tier)", + "prefs_notifications_delete_after_one_week_description": "Ilmoitukset poistetaan automaattisesti viikon kuluttua", + "error_boundary_unsupported_indexeddb_description": "Ntfy-verkkosovellus tarvitsee IndexedDB:n toimiakseen, eikä selaimesi tue IndexedDB:tä yksityisessä selaustilassa.

Vaikka tämä on valitettavaa, ntfy-verkon käyttäminen ei myöskään ole kovin järkevää yksityisessä selaustilassa, koska kaikki on tallennettu selaimen tallennustilaan. Voit lukea siitä lisää tästä GitHub-numerosta tai puhua meille Discordissa tai Matrixissa.", + "subscribe_dialog_subscribe_button_cancel": "Peruuta", + "notifications_attachment_copy_url_button": "Kopioi URL", + "account_basics_tier_payment_overdue": "Maksusi on myöhässä. Päivitä maksutapasi, tai tilisi poistetaan pian.", + "publish_dialog_title_placeholder": "Ilmoituksen otsikko, esim. Levytilan hälytys", + "account_basics_tier_description": "Tilisi taso", + "account_basics_phone_numbers_description": "Puheluilmoituksia varten", + "prefs_reservations_dialog_title_add": "Varaa topikki", + "account_basics_tier_free": "Vapaa", + "account_upgrade_dialog_cancel_warning": "Tämä peruuttaa tilauksesi ja alentaa tilisi {{date}}. Tuona päivänä topikit sekä palvelimen välimuistissa olevat viestit poistetaan.", + "notifications_click_copy_url_button": "Kopioi linkki", + "account_basics_tier_admin": "Admin", + "subscribe_dialog_subscribe_title": "Tilaa topikki", + "nav_topics_title": "Tilatut topikit", + "prefs_notifications_sound_title": "Ilmoitusääni", + "prefs_notifications_min_priority_default_and_higher": "Oletusprioriteetti ja korkeammat", + "prefs_reservations_table_access_header": "Oikeudet", + "action_bar_show_menu": "Näytä menu", + "action_bar_settings": "Asetukset", + "notifications_copied_to_clipboard": "Kopioitu leikepöydälle", + "account_delete_dialog_button_cancel": "Peruuta", + "publish_dialog_delay_placeholder": "Toimituksen viivästyminen, esim. {{unixTimestamp}}, {{relativeTime}} tai \"{{naturalLanguage}}\" (vain englanti)", + "account_tokens_table_copied_to_clipboard": "Käyttöoikeustunnus kopioitu", + "alert_grant_title": "Ilmoitukset on poistettu käytöstä", + "account_tokens_dialog_expires_x_hours": "Tunnus vanhenee {{hours}} tunnin kuluttua", + "prefs_users_edit_button": "Muokkaa käyttäjää", + "account_upgrade_dialog_title": "Muuta tilitasoa", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Ei vahvistettuja puhelinnumeroita", + "priority_low": "matala", + "prefs_reservations_table_click_to_subscribe": "Tilaa napsauttamalla", + "account_basics_password_description": "Vaihda tilisi salasana", + "publish_dialog_call_label": "Puhelu", + "account_usage_calls_title": "Soitetut puhelut", + "error_boundary_description": "Näin ei selvästikään pitäisi tapahtua. Pahoittelut tästä.
Jos sinulla on hetki aikaa, ilmoita tästä GitHubissa tai ilmoita meille Discordin tai Matrix kautta.", + "signup_form_toggle_password_visibility": "Vaihda salasanan näkyvyys", + "login_link_signup": "Kirjaudu linkki", + "publish_dialog_message_label": "Viesti", + "publish_dialog_attached_file_title": "Liitetiedosto:", + "priority_min": "min", + "action_bar_sign_in": "Kirjaudu sisään", + "action_bar_unsubscribe": "Peruuta tilaus", + "account_basics_tier_basic": "Perus", + "signup_title": "Lisää ntfy tili", + "prefs_notifications_min_priority_description_any": "Näytetään kaikki ilmoitukset tärkeydestä riippumatta", + "error_boundary_gathering_info": "Kerää lisätietoja…", + "publish_dialog_priority_max": "Max. prioriteetti", + "error_boundary_unsupported_indexeddb_title": "Yksityistä selaamista ei tueta", + "prefs_notifications_delete_after_one_day": "Yhden päivän jälkeen", + "error_boundary_title": "Voi ei, ntfy kaatui", + "action_bar_change_display_name": "Näyttönimen vaihtaminen", + "notifications_attachment_file_app": "Android-sovellustiedosto", + "alert_not_supported_context_description": "Ilmoituksia tuetaan vain HTTPS:n kautta. Tämä on Ilmoitussovellusliittymän rajoitus.", + "reservation_delete_dialog_action_keep_description": "Palvelimelle välimuistiin tallennetut viestit ja liitteet tulevat julkiseksi topikin nimen tietävälle henkilölle.", + "prefs_reservations_add_button": "Lisää varattu topik", + "prefs_reservations_title": "Varatut topikit", + "account_basics_phone_numbers_copied_to_clipboard": "Puhelinnumero kopioitu leikepöydälle", + "prefs_reservations_dialog_description": "Topikin varaaminen antaa sinulle aiheen omistajuuden ja voit määrittää aiheeseen liittyviä käyttöoikeuksia muille käyttäjille.", + "account_basics_tier_title": "Tilin tyyppi", + "account_usage_cannot_create_portal_session": "Laskutusportaalin avaaminen epäonnistui", + "account_tokens_delete_dialog_submit_button": "Poista tunnus pysyvästi", + "account_delete_description": "Poista tilisi pysyvästi", + "account_basics_phone_numbers_dialog_number_placeholder": "esim. +35812345678", + "account_basics_phone_numbers_dialog_code_placeholder": "esim. 123456", + "prefs_notifications_title": "Ilmoitukset", + "account_basics_tier_manage_billing_button": "Hallinnoi laskutusta", + "account_tokens_title": "Käyttöoikeudet", + "publish_dialog_email_label": "Email", + "account_basics_username_description": "Hei, se olet sinä ❤", + "prefs_reservations_dialog_topic_label": "Topik", + "account_basics_password_dialog_confirm_password_label": "Vahvista salasana", + "action_bar_reservation_edit": "Muokkaa varatopikkia", + "publish_dialog_base_url_placeholder": "Palvelun URL-osoite, esim. https://example.com", + "prefs_users_title": "Hallinnoi käyttäjiä", + "account_basics_tier_interval_yearly": "vuosittain", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} Laskutetaan kuukausittain.", + "action_bar_clear_notifications": "Poista kaikki ilmoitukset", + "account_delete_dialog_button_submit": "Poista tili pysyvästi", + "account_basics_phone_numbers_dialog_channel_call": "Soitto", + "account_basics_password_title": "Salasana", + "account_basics_password_dialog_new_password_label": "Uusi salasana", + "nav_upgrade_banner_label": "Päivitä ntfy Prohon", + "account_tokens_dialog_expires_unchanged": "Jätä viimeinen käyttöpäivä ennalleen", + "publish_dialog_delay_label": "Viive", + "error_boundary_button_copy_stack_trace": "Kopioi pinon jälki", + "publish_dialog_button_send": "Lähetä", + "action_bar_reservation_delete": "Poista varatopikit", + "publish_dialog_button_cancel_sending": "Peruuta lähetys", + "account_tokens_dialog_title_delete": "Poista käyttöoikeustunnus", + "account_usage_of_limit": "limiitistä {{limit}}", + "publish_dialog_attach_placeholder": "Liitä tiedosto URL-osoitteen mukaan, esim. https://f-droid.org/F-Droid.apk", + "publish_dialog_email_placeholder": "Osoite, johon ilmoitus välitetään, esim. urpo@example.com", + "notifications_attachment_link_expires": "linkki vanhenee {{date}}", + "action_bar_send_test_notification": "Lähetä testi ilmoitus", + "reservation_delete_dialog_action_keep_title": "Säilytä välimuistissa olevat viestit ja liitteet", + "prefs_notifications_sound_no_sound": "Ei ääntä", + "account_upgrade_dialog_interval_yearly": "Vuosittain", + "publish_dialog_tags_label": "Tagit", + "signup_form_password": "Salasana", + "action_bar_reservation_limit_reached": "Varatopikien raja", + "account_upgrade_dialog_button_redirect_signup": "Kirjaudu nyt", + "publish_dialog_click_placeholder": "URL-osoite, joka avautuu, kun ilmoitusta napsautetaan", + "alert_not_supported_title": "Ilmoituksia ei tueta", + "account_tokens_dialog_button_cancel": "Peruuta", + "subscribe_dialog_error_user_anonymous": "Anonyymi", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} laskutetaan vuosittain. Tallenna {{save}}.", + "prefs_notifications_min_priority_high_and_higher": "Korkea prioriteetti ja korkeammat", + "account_usage_basis_ip_description": "Tämän tilin käyttötilastot ja rajoitukset perustuvat IP-osoitteeseesi, joten ne voidaan jakaa muiden käyttäjien kanssa. Yllä esitetyt rajat ovat likimääräisiä perustuen olemassa oleviin rajoituksiin.", + "publish_dialog_priority_high": "Korkea prioriteetti", + "login_form_button_submit": "Kirjaudu", + "account_basics_password_dialog_title": "Vaihda salasana", + "priority_max": "max", + "notifications_attachment_file_image": "kuvatiedosto", + "account_usage_limits_reset_daily": "Käyttörajat nollataan päivittäin keskiyöllä (UTC)", + "account_usage_unlimited": "Rajoittamaton", + "prefs_users_delete_button": "Poista käyttäjä", + "publish_dialog_click_label": "Napsauta URL-osoitetta", + "prefs_notifications_min_priority_any": "Kaikki prioriteetit", + "account_tokens_dialog_expires_label": "Käyttöoikeustunnus vanhenee", + "publish_dialog_filename_label": "Tiedostonimi", + "publish_dialog_chip_attach_file_label": "Liitä paikallinen tiedosto", + "account_basics_phone_numbers_title": "Puhelinnumerot", + "prefs_notifications_delete_after_title": "Poista ilmoitukset", + "account_upgrade_dialog_interval_yearly_discount_save": "säästä {{discount}}%", + "signup_disabled": "Kirjautuminen estetty", + "publish_dialog_drop_file_here": "Pudota tiedosto tähän", + "prefs_users_dialog_title_edit": "Muokkaa käyttäjää", + "account_basics_password_dialog_current_password_label": "Nykyinen salasana", + "prefs_notifications_min_priority_low_and_higher": "Matala prioriteetti ja korkeammat", + "action_bar_profile_title": "Profiili", + "account_tokens_dialog_button_update": "Päivitä tunnus", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} lopullinen tiedostokoko", + "publish_dialog_title_label": "Otsikko", + "prefs_reservations_table_everyone_write_only": "Minä voin julkaista ja tilata, kaikki voivat julkaista", + "prefs_appearance_title": "Näkymä", + "publish_dialog_topic_reset": "Resetoi topikki", + "account_tokens_table_cannot_delete_or_edit": "Nykyistä istuntotunnusta ei voi muokata tai poistaa", + "notifications_tags": "Tagit", + "prefs_notifications_sound_play": "Toista valittu ääni", + "account_tokens_table_last_access_header": "Viimeinen käyty", + "action_bar_profile_logout": "Kirjaudu ulos", + "publish_dialog_attached_file_filename_placeholder": "Liitetiedoston nimi", + "publish_dialog_priority_default": "Oletusprioriteetti", + "subscribe_dialog_subscribe_base_url_label": "Palvelimen URL", + "account_tokens_table_last_origin_tooltip": "Napsauta IP-osoitteesta {{ip}}, etsiäksesi", + "account_usage_reservations_title": "Varatut topikit", + "account_upgrade_dialog_tier_price_per_month": "Kuukausi", + "message_bar_show_dialog": "Näytä julkaisu dialogi", + "publish_dialog_chip_attach_url_label": "Liitä tiedosto URL-osoitteen mukaan", + "account_usage_calls_none": "Tällä tilillä ei voi soittaa puheluita", + "notifications_click_open_button": "Avaa linkki", + "account_tokens_table_current_session": "Nykyinen selainistunto", + "account_upgrade_dialog_button_pay_now": "Maksa nyt ja tilaa", + "nav_upgrade_banner_description": "Varaa aiheita, lisää viestejä ja sähköposteja sekä suurempia liitteitä", + "publish_dialog_call_reset": "Poista puhelu", + "publish_dialog_other_features": "Muut ominaisuudet:", + "subscribe_dialog_subscribe_use_another_label": "Käytä toista palvelinta", + "reservation_delete_dialog_action_delete_title": "Poista välimuistissa olevat viestit ja liitteet", + "signup_error_username_taken": "Käyttäjätunnus {{username}} on jo varattu", + "account_basics_phone_numbers_dialog_code_label": "Vahvistuskoodi", + "nav_button_subscribe": "Tilaa topik", + "publish_dialog_topic_label": "Topikin nimi", + "reservation_delete_dialog_action_delete_description": "Välimuistissa olevat viestit ja liitteet poistetaan pysyvästi. Tätä toimintoa ei voi kumota.", + "alert_grant_button": "Myönnä nyt", + "account_basics_tier_paid_until": "Tilaus maksettu {{date}} asti, ja se uusitaan automaattisesti", + "account_usage_attachment_storage_description": "{{tiedostokoko}} per tiedosto, poistettu {{expiry}} jälkeen", + "publish_dialog_chip_click_label": "Napsauta URL-osoitetta", + "prefs_notifications_delete_after_one_month_description": "Ilmoitukset poistetaan automaattisesti kuukauden kuluttua", + "common_cancel": "Peruuta", + "account_basics_phone_numbers_dialog_verify_button_call": "Soita minulle", + "signup_already_have_account": "Onko sinulla jo tili ? Kirjaudu sisään !", + "publish_dialog_call_item": "Soita puhelinnumeroon {{number}}", + "nav_button_account": "Tili", + "publish_dialog_click_reset": "Poista napsautettava URL-osoite", + "login_title": "Kirjaudu sisään ntfy-tilillesi", + "notifications_list": "Ilmoitusluettelo", + "common_save": "Tallenna", + "prefs_users_dialog_base_url_label": "Palvelin URL, esim. https://ntfy.sh", + "account_usage_emails_title": "Sähköpostit lähetetty", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "action_bar_reservation_add": "Varalla oleva topikki", + "account_upgrade_dialog_tier_selected_label": "Valittu", + "account_upgrade_dialog_button_update_subscription": "Päivitä tilaus", + "notifications_attachment_file_video": "videotiedosto", + "priority_high": "korkea", + "notifications_priority_x": "Prioriteetti {{priority}}", + "account_delete_dialog_billing_warning": "Tilin poistaminen peruuttaa myös laskutustilauksesi välittömästi. Et voi enää käyttää laskutuksen hallintapaneelia.", + "prefs_notifications_min_priority_description_max": "Näytä ilmoitukset, jos prioriteetti on 5 (max)", + "subscribe_dialog_login_description": "Tämä Topikki on suojattu salasanalla. Anna käyttäjätunnus ja salasana.", + "account_upgrade_dialog_reservations_warning_other": "Valittu taso sallii vähemmän varattuja topikkeja kuin nykyinen tasosi. Ennen kuin muutat tasosi, poista vähintään {{count}} varausta. Voit poistaa varauksia Asetuksista.", + "prefs_users_dialog_title_add": "Lisää käyttäjä", + "account_tokens_dialog_button_create": "Luo tunnus", + "nav_button_settings": "Asetukset", + "publish_dialog_priority_min": "Min. etusijalla", + "account_tokens_table_create_token_button": "Luo käyttöoikeustunnus", + "notifications_delete": "Poista" +} From 3f3af275e77d50891ace4a38f83df102923b92de Mon Sep 17 00:00:00 2001 From: artemislena Date: Tue, 7 Nov 2023 20:00:10 +0100 Subject: [PATCH 119/182] T.: Fixed broken links --- docs/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 27314f1a..462a0fee 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,9 +3,9 @@ ntfy lets you **send push notifications to your phone or desktop via scripts fro or POST requests. I use it to notify myself when scripts fail, or long-running commands complete. ## Step 1: Get the app - - - + + + To [receive notifications on your phone](subscribe/phone.md), install the app, either via Google Play or F-Droid. Once installed, open it and subscribe to a topic of your choosing. Topics don't have to explicitly be created, so just From 92cfa4040b5483290a2f0abadf0226518d9e1069 Mon Sep 17 00:00:00 2001 From: Jordan Hotmann Date: Wed, 8 Nov 2023 13:06:50 -0700 Subject: [PATCH 120/182] Append /v2 to module so version 2 can be used as a go package --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 95365372..8e1beb23 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module heckel.io/ntfy +module heckel.io/ntfy/v2 go 1.18 From c42f6289f6f21fcc605f78d2a94f19393c88a2c4 Mon Sep 17 00:00:00 2001 From: Samuele Radici Date: Thu, 9 Nov 2023 19:23:23 +0000 Subject: [PATCH 121/182] Translated using Weblate (Italian) Currently translated at 80.8% (309 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 99d2cfff..9e8ea53d 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -304,5 +304,8 @@ "account_usage_basis_ip_description": "Le statistiche di utilizzo e i limiti per questo account sono basati sul tuo indirizzo IP, quindi potrebbero essere in condivisione con altri utenti. I limiti mostrati sopra sono approssimazioni basate sui limiti esistenti.", "account_usage_calls_none": "Questo account non può effettuare chiamate", "account_delete_dialog_billing_warning": "Eliminando il tuo account perderai immediatamente il tuo abbonamento. Non potrai più accedere alla dashboard di fatturazione.", - "account_delete_dialog_label": "Password" + "account_delete_dialog_label": "Password", + "account_upgrade_dialog_tier_features_no_reservations": "Nessun argomento riservato", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} messaggi giornalieri", + "account_upgrade_dialog_reservations_warning_one": "Il livello selezionato consente meno argomenti riservati rispetto al livello corrente. Prima di cambiare il livello, si prega di eliminare almeno una prenotazione. È possibile rimuovere le prenotazioni nel Impostazioni." } From bd2088c480d4e03c7ad2da206acdd55064230857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Seppo=20Lehtim=C3=A4ki?= Date: Sun, 12 Nov 2023 10:07:45 +0000 Subject: [PATCH 122/182] Translated using Weblate (Finnish) Currently translated at 95.8% (366 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index 7275a72f..ec590ecd 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -356,5 +356,13 @@ "nav_button_settings": "Asetukset", "publish_dialog_priority_min": "Min. etusijalla", "account_tokens_table_create_token_button": "Luo käyttöoikeustunnus", - "notifications_delete": "Poista" + "notifications_delete": "Poista", + "notifications_actions_not_supported": "Toimintoa ei tueta verkkosovelluksessa", + "notifications_actions_open_url_title": "Siirry osoitteeseen {{url}}", + "notifications_none_for_any_title": "Et ole saanut ilmoituksia.", + "notifications_none_for_topic_description": "Jos haluat lähettää ilmoituksia tähän topikkiin, PUT tai POST topikin URL-osoitteeseen.", + "notifications_none_for_any_description": "Jos haluat lähettää ilmoituksia topikkiin, PUT tai POST topikin URL-osoitteeseen. Tässä on esimerkki yhden topikin käyttämisestä.", + "notifications_no_subscriptions_title": "Näyttää siltä, että sinulla ei ole vielä tilauksia.", + "notifications_none_for_topic_title": "Et ole vielä saanut ilmoituksia tästä topikista.", + "notifications_actions_http_request_title": "Lähetä HTTP {{method}} to {{url}}" } From 16d490474d4a84b870cc06218e5605bfbce40cc4 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Mon, 13 Nov 2023 11:19:19 -0700 Subject: [PATCH 123/182] remove broken link --- docs/integrations.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index a8ffa6a9..3488cfbe 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -83,7 +83,6 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [backup-projects](https://gist.github.com/anthonyaxenov/826ba65abbabd5b00196bc3e6af76002) - Stupidly simple backup script for own projects (Shell) - [grav-plugin-whistleblower](https://github.com/Himmlisch-Studios/grav-plugin-whistleblower) - Grav CMS plugin to get notifications via ntfy (PHP) - [ntfy-server-status](https://github.com/filip2cz/ntfy-server-status) - Checking if server is online and reporting through ntfy (C) -- [borg-based backup](https://github.com/davidhi7/backup) - Simple borg-based backup script with notifications based on ntfy.sh or Discord webhooks (Python/Shell) - [ntfy.sh *arr script](https://github.com/agent-squirrel/nfty-arr-script) - Quick and hacky script to get sonarr/radarr to notify the ntfy.sh service (Shell) - [website-watcher](https://github.com/muety/website-watcher) - A small tool to watch websites for changes (with XPath support) (Python) - [siteeagle](https://github.com/tpanum/siteeagle) - A small Python script to monitor websites and notify changes (Python) From 058de2d761f941345ef3ee229c8a33a4a13f442e Mon Sep 17 00:00:00 2001 From: Vincent Van Ouytsel Date: Mon, 13 Nov 2023 20:22:13 +0100 Subject: [PATCH 124/182] docs: add jetspotter integration --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a8ffa6a9..a514f1dc 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -136,6 +136,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes - [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS - [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) +- [jetspotter](https://github.com/vvanouytsel/jetspotter) - a tool to send notifications whenever specified types of aircraft are spotted near a specified location ## Blog + forum posts From 9f738e4a85d20a34540c348d4b3e23d72c1ad18e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:43:11 -0500 Subject: [PATCH 125/182] Thank you @ralhei for your donation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 339506dd..3066f72f 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 262bb723d97bf9f7cf9c7f8c8d17bfcab81f822d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:44:02 -0500 Subject: [PATCH 126/182] Thank you @TechMDW for your generous sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3066f72f..90d9285f 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From a533f352b2e03f6e71506d10eb41d91428cd728e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 15 Nov 2023 05:55:01 -0500 Subject: [PATCH 127/182] Bump pipelines --- .github/workflows/build.yaml | 4 ++-- .github/workflows/release.yaml | 4 ++-- .github/workflows/test.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index de22292a..cb310934 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,12 +11,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b61e3361..c630a2d3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -14,12 +14,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f76862a9..53eb1d67 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -11,12 +11,12 @@ jobs: name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.20.x' + go-version: '1.21.x' - name: Install node uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - From 5acc6ad0c48ba9a35628834e8defec0809b508d1 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Wed, 15 Nov 2023 09:28:35 -0700 Subject: [PATCH 128/182] Add JS websocket example --- .../web-example-websocket/example-ws.html | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/web-example-websocket/example-ws.html diff --git a/examples/web-example-websocket/example-ws.html b/examples/web-example-websocket/example-ws.html new file mode 100644 index 00000000..7025aa60 --- /dev/null +++ b/examples/web-example-websocket/example-ws.html @@ -0,0 +1,56 @@ + + + + + ntfy.sh: WebSocket Example + + + + +

ntfy.sh: WebSocket Example

+

+ This is an example showing how to use ntfy.sh with + WebSocket.
+ This example doesn't need a server. You can just save the HTML page and run it from anywhere. +

+ +

Log:

+
+ + + + + From c2d6e0e31632f3fc5a0d6fe5611140557f42b540 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Wed, 15 Nov 2023 09:31:34 -0700 Subject: [PATCH 129/182] Include link to websocket example in docs --- docs/subscribe/api.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index 58da9752..3f1c0e81 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -190,9 +190,10 @@ format. Keepalive messages are sent as empty lines. ## WebSockets You may also subscribe to topics via [WebSockets](https://en.wikipedia.org/wiki/WebSocket), which is also widely -supported in many languages. Most notably, WebSockets are natively supported in JavaScript. On the command line, -I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` or `curl`, but specifically -for WebSockets. +supported in many languages. Most notably, WebSockets are natively supported in JavaScript. You may also want to +check out the [full example on GitHub](https://github.com/binwiederhier/ntfy/tree/main/examples/web-example-websocket). +On the command line, I recommend [websocat](https://github.com/vi/websocat), a fantastic tool similar to `socat` +or `curl`, but specifically for WebSockets. The WebSockets endpoint is available at `/ws` and returns messages as JSON objects similar to the [JSON stream endpoint](#subscribe-as-json-stream). From df6d76084476d6d2cd0f67b8100326507e779897 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:22:56 -0500 Subject: [PATCH 130/182] Remove twemoji from docs --- Makefile | 2 +- mkdocs.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 88c22033..61f3a22c 100644 --- a/Makefile +++ b/Makefile @@ -111,7 +111,7 @@ build-deps-ubuntu: docs: docs-deps docs-build docs-build: .PHONY - mkdocs build + mkdocs build docs-deps: .PHONY pip3 install -r requirements.txt diff --git a/mkdocs.yml b/mkdocs.yml index 7b14ee0c..98a2d078 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -64,7 +64,6 @@ markdown_extensions: - attr_list - md_in_html - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji emoji_generator: !!python/name:materialx.emoji.to_svg plugins: From c0fab933a5a4e144654c01d30318d5a3d1ec71b7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:31:53 -0500 Subject: [PATCH 131/182] Build docs in venv --- .gitignore | 3 ++- Dockerfile-build | 6 ++++-- Makefile | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index b60c9b23..7cbb52ac 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ secrets/ node_modules/ .DS_Store __pycache__ -web/dev-dist/ \ No newline at end of file +web/dev-dist/ +venv/ diff --git a/Dockerfile-build b/Dockerfile-build index 6e96c7d4..a0608b12 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -11,7 +11,9 @@ RUN apt-get update && apt-get install -y \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" >> /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ && apt-get install -y \ - python3-pip nodejs \ + python3-pip \ + python3-venv \ + nodejs \ && rm -rf /var/lib/apt/lists/* WORKDIR /app @@ -23,7 +25,7 @@ RUN make docs-deps ADD ./mkdocs.yml . ADD ./docs ./docs RUN make docs-build - + # web ADD ./web/package.json ./web/package-lock.json ./web/ RUN make web-deps diff --git a/Makefile b/Makefile index 61f3a22c..a29fb4f5 100644 --- a/Makefile +++ b/Makefile @@ -95,6 +95,7 @@ docker-dev: --build-arg COMMIT=$(COMMIT) \ ./ + # Ubuntu-specific build-deps-ubuntu: @@ -103,21 +104,27 @@ build-deps-ubuntu: curl \ gcc-aarch64-linux-gnu \ gcc-arm-linux-gnueabi \ + python3 \ + python3-venv \ jq which pip3 || sudo apt-get install -y python3-pip + # Documentation docs: docs-deps docs-build -docs-build: .PHONY - mkdocs build +docs-venv: .PHONY + python3 -m venv ./venv -docs-deps: .PHONY - pip3 install -r requirements.txt +docs-build: docs-venv + (. venv/bin/activate && mkdocs build) + +docs-deps: docs-venv + (. venv/bin/activate && pip3 install -r requirements.txt) docs-deps-update: .PHONY - pip3 install -r requirements.txt --upgrade + (. venv/bin/activate && pip3 install -r requirements.txt --upgrade) # Web app From 73eaf7b8b6379f7ab81952d2052286669280ffb2 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 05:41:41 -0500 Subject: [PATCH 132/182] Finnish translation --- docs/releases.md | 4 ++++ web/src/components/Preferences.jsx | 2 ++ 2 files changed, 6 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index 73e5eb20..ef09c741 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1293,6 +1293,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) +**Additional languages:** + +* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** diff --git a/web/src/components/Preferences.jsx b/web/src/components/Preferences.jsx index 546ecbe3..6770f282 100644 --- a/web/src/components/Preferences.jsx +++ b/web/src/components/Preferences.jsx @@ -544,6 +544,7 @@ const Language = () => { "🇯🇵", "🇷🇺", "🇹🇷", + "🇫🇮", ]).slice(0, 3); const showFlags = !navigator.userAgent.includes("Windows"); let title = t("prefs_appearance_language_title"); @@ -588,6 +589,7 @@ const Language = () => { Português (Brasil) Polski Русский + Suomi Svenska Türkçe From 7f1855ad4dca4d2d75e8374cb02c6d2bf265d836 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:49:35 -0500 Subject: [PATCH 133/182] It's better than nothing --- docs/releases.md | 1 + server/smtp_server.go | 19 +- server/smtp_server_test.go | 647 ++++++++++++++++++++++++++++++++++++- 3 files changed, 654 insertions(+), 13 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index ef09c741..e56f8847 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1287,6 +1287,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** +* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) diff --git a/server/smtp_server.go b/server/smtp_server.go index 76f439e7..467b8ca4 100644 --- a/server/smtp_server.go +++ b/server/smtp_server.go @@ -29,6 +29,11 @@ var ( errUnsupportedContentType = errors.New("unsupported content type") ) +var ( + onlySpacesRegex = regexp.MustCompile(`(?m)^\s+$`) + consecutiveNewLinesRegex = regexp.MustCompile(`\n{3,}`) +) + const ( maxMultipartDepth = 2 ) @@ -319,14 +324,8 @@ func readHTMLMailBody(reader io.Reader, transferEncoding string) (string, error) return removeExtraEmptyLines(stripped), nil } -func removeExtraEmptyLines(str string) string { - // Replace lines that contain only spaces with empty lines - re := regexp.MustCompile(`(?m)^\s+$`) - str = re.ReplaceAllString(str, "") - - // Remove more than 2 consecutive empty lines - re = regexp.MustCompile(`\n{3,}`) - str = re.ReplaceAllString(str, "\n\n") - - return str +func removeExtraEmptyLines(s string) string { + s = onlySpacesRegex.ReplaceAllString(s, "") + s = consecutiveNewLinesRegex.ReplaceAllString(s, "\n\n") + return s } diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index bdee0785..93335905 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -651,7 +651,7 @@ Now the light is on

-If you don't want to recieve this message anymore, stop the push +If you don't want to receive this message anymore, stop the push services in your FRITZ=21Box=2E
Here you can see the active push services: "System > Push Service"=2E @@ -686,7 +686,649 @@ This mail has ben sent by your +Received: from ccm30.constantcontact.com (ccm30.constantcontact.com. [208.75.123.226]) + by mx.google.com with ESMTPS id h2-20020a05620a21c200b0076eeed38118si5450962qka.131.2023.10.30.06.23.07 + for + (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); + Mon, 30 Oct 2023 06:23:08 -0700 (PDT) +Received-SPF: pass (google.com: domain of aigxeklyirlg+dvwkrmsgua==_1133104752381_suqcukvbeeynm/owplvdba==@in.constantcontact.com designates 208.75.123.226 as permitted sender) client-ip=208.75.123.226; +Authentication-Results: mx.google.com; + dkim=pass header.i=@spamspam.com header.s=2020294246 header.b=G8y6xmtK; + dkim=pass header.i=@auth.ccsend.com header.s=1000073432 header.b=ht8IksVK; + spf=pass (google.com: domain of aigxeklyirlg+dvwkrmsgua==_1133104752381_suqcukvbeeynm/owplvdba==@in.constantcontact.com designates 208.75.123.226 as permitted sender) smtp.mailfrom="AigXeKlyIRLG+DvWkRMsGUA==_1133104752381_sUQcUKVBEeynm/oWPlvDBA==@in.constantcontact.com"; + dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=spamspam.com +Return-Path: +Received: from [10.252.0.3] ([10.252.0.3:53254] helo=p2-jbemailsyndicator12.ctct.net) by 10.249.225.20 (envelope-from ) (ecelerity 4.3.1.999 r(:)) with ESMTP id A4/82-60517-B3EAF356; Mon, 30 Oct 2023 09:23:07 -0400 +DKIM-Signature: v=1; q=dns/txt; a=rsa-sha256; c=relaxed/relaxed; s=2020294246; d=spamspam.com; h=date:mime-version:subject:X-Feedback-ID:X-250ok-CID:message-id:from:reply-to:list-unsubscribe:list-unsubscribe-post:to; bh=BERwBIp6fBgrZePFKQjyNMmgPkcnq1Zy1jPO8M0T4Ok=; b=G8y6xmtKv8asfEXA9o8dP+6foQjclo6j5sFREYVIJBbj5YJ5tqoiv5B04/qoRkoTBFDhmjt+BUua7AqDgPSnwbP2iPSA4fTJehnHhut1PyVUp/9vqSYlhxQehfdhma8tPg8ArKfYIKmfKJwKRaQBU0JHCaB1m+5LNQQX3UjkxAg= +DKIM-Signature: v=1; q=dns/txt; a=rsa-sha256; c=relaxed/relaxed; s=1000073432; d=auth.ccsend.com; h=date:mime-version:subject:X-Feedback-ID:X-250ok-CID:message-id:from:reply-to:list-unsubscribe:list-unsubscribe-post:to; bh=BERwBIp6fBgrZePFKQjyNMmgPkcnq1Zy1jPO8M0T4Ok=; b=ht8IksVKYY/Kb3dUERWoeW4eVdYjKL6F4PEoIZOhfFXor6XAIbPnd3A/CPmbmoqFZjnKh5OdcUy1N5qEoj8w1Q3TmN8/ySQkqrlrmSDSZIHZMY7Qp9/TJrqUe4RMFOO1KKIN6Y0vGP1+dWe98msMAHwvi2qMjG9aEKLfFr2JUTQ= +Message-ID: <1140728754828.1133104752381.1941549819.0.260913JL.2002@synd.ccsend.com> +Date: Mon, 30 Oct 2023 09:23:07 -0400 (EDT) +From: spamspam Loan Servicing +Reply-To: marklake@spamspam.com +To: somebody@gmail.com +Subject: Buying a home? You deserve the confidence of Pre-Approval +MIME-Version: 1.0 +Content-Type: multipart/alternative; boundary="----=_Part_75055660_144854819.1698672187348" +List-Unsubscribe: +List-Unsubscribe-Post: List-Unsubscribe=One-Click +X-Campaign-Activity-ID: 8a05de2a-5c88-44b1-be0e-f5a444cb0650 +X-250ok-CID: 8a05de2a-5c88-44b1-be0e-f5a444cb0650 +X-Channel-ID: b1441c50-a541-11ec-a79b-fa163e5bc304 +X-Return-Path-Hint: AbeefbeefbeefbeefbeefUA==_1133104752381_sUQcUKVBEeynm/oWPlvDBA==@in.constantcontact.com +X-Roving-Campaignid: 1140728754811 +X-Roving-Id: 1133104752381.1111111111 +X-Feedback-ID: b1441c50-a541-11ec-beef-beefbeefbeefbeef5de2a-5c88-44b1-be0e-f5a444cb0650:1133104752381:CTCT +X-CTCT-ID: b13a9586-a541-11ec-beef-beefbeefbeef + +------=_Part_75055660_144854819.1698672187348 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +When you're buying a home, Pre-Approval gives you confidence you're in the = +right price range and shows sellers you mean business. xxxxxxxxx SELLING or= + BUYING? Call: 844-590-2275 Get Your Homebuying PRE-APPROVAL IN 24-HOURS* G= +et Pre-Approved When you're buying a home, Pre-Approval gives you confidenc= +e you're in the right price range and shows sellers you mean business. xxx= +xxxxxxGet Pre-Approved today! Click or Call to Get Pre-Approved 844-590-227= +5 Get Pre-Approved nmlsconsumeraccess.org/ *The 24 hour timeframe is for mo= +st approvals, however if additional information is needed or a request is o= +n a holiday, the time for preapproval may be greater than 24 hours. This em= +ail is for informational purposes only and is not an offer, loan approval o= +r loan commitment. Mortgage rates are subject to change without notice. Som= +e terms and restrictions may apply to certain loan programs. Refinancing ex= +isting loans may result in total finance charges being higher over the life= + of the loan, reduction in payments may partially reflect a longer loan ter= +m. This information is provided as guidance and illustrative purposes only = +and does not constitute legal or financial advice. We are not liable or bou= +nd legally for any answers provided to any user for our process or position= + on an issue. This information may change from time to time and at any time= + without notification. The most current information will be updated periodi= +cally and posted in the online forum. spamspam Loan Servicing, LLC. NMLS#39= +1521. nmlsconsumeraccess.org. You are receiving this information as a curre= +nt loan customer with spamspam Loan Servicing, LLC. Not licensed for lendin= +g activities in any of the U.S. territories. Not authorized to originate lo= +ans in the State of New York. Licensed by the Dept. of Financial Protection= + and Innovation under the California Residential Mortgage .Lending Act #413= +1216. This email was sent to somebody@gmail.com Version 103023PCHPrAp= +9 xxxxxxxxx spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251, Coral = +Gables, FL 33146-1837 Unsubscribe somebody@gmail.com Update Profile |= + Our Privacy Policy | Constant Contact Data Notice Sent by marklake@spamspa= +m.com +------=_Part_75055660_144854819.1698672187348 +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + + + +
When you're buying a home, Pre-Approval = +gives you confidence you're in the right price range and shows sellers= + you mean business.
3D""
+
= +
3D""
= +
+
3D""
+
+

SELLING or BUYING?

+

Call: 844-590-2275

+
+
+

Get Your Homebuying

+

PRE-APPROVAL IN 24-HOURS*

+
= + 3D"" = +
Get Pre-Approved
= + +


+

When you're buying= + a home, Pre-Approval gives you confidence you're in the right price range = +and shows sellers you mean business.

+

Get Pre-Ap= +proved today!

+
+
+


+

Click or Call to Get Pre-Approved

+

844-590-2275= +

+
Get Pre-Approved
+
3D""
<= +tr>
+
+


+

nmlsconsumeraccess.org/

+

*The 24 hour timeframe is for= + most approvals, however if additional information is needed or a request i= +s on a holiday, the time for preapproval may be greater than 24 hours.

+

This email is for informational purposes only and is not an offer,= + loan approval or loan commitment. Mortgage rates are subject to change wit= +hout notice. Some terms and restrictions may apply to certain loan programs= +. Refinancing existing loans may result in total finance charges being high= +er over the life of the loan, reduction in payments may partially reflect a= + longer loan term. This information is provided as guidance and illustrativ= +e purposes only and does not constitute legal or financial advice. We are n= +ot liable or bound legally for any answers provided to any user for our pro= +cess or position on an issue. This information may change from time to time= + and at any time without notification. The most current information will be= + updated periodically and posted in the online forum.

+

spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org.= + You are receiving this information as a current loan customer with spamspa= +m Loan Servicing, LLC. Not licensed for lending activities in any of the U.= +S. territories. Not authorized to originate loans in the State of New York.= + Licensed by the Dept. of Financial Protection and Innovation under the Cal= +ifornia Residential Mortgage .Lending Act #4131216.

+


+

This email was sent to somebody@gmail.com

+

Version 103023PCHPrAp9

+



+
+
= +
3D""
= +
= +
+ + + +
+
+ + + + +
+ + + + + + + + + + +
+spamspam Loan Servicing | 4425 Ponce de= + Leon Blvd 5-251, Coral Gables, FL 33146-1837 +
+ + + + + + + + + + +
+Uns= +ubscribe somebody@gmail.com + +
+Upd= +ate Profile | +Our Privacy Policy | +Constant Contact Data Noti= +ce +
+Sent by +marklake@spamspam.com +
+
+
+
+
+
= +
+ +------=_Part_75055660_144854819.1698672187348-- +. +` + +func TestSmtpBackend_Spam_Text(t *testing.T) { + email := spamEmail + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "Buying a home? You deserve the confidence of Pre-Approval", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := "When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. xxxxxxxxx SELLING or BUYING? Call: 844-590-2275 Get Your Homebuying PRE-APPROVAL IN 24-HOURS* Get Pre-Approved When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. xxxxxxxxxGet Pre-Approved today! Click or Call to Get Pre-Approved 844-590-2275 Get Pre-Approved nmlsconsumeraccess.org/ *The 24 hour timeframe is for most approvals, however if additional information is needed or a request is on a holiday, the time for preapproval may be greater than 24 hours. This email is for informational purposes only and is not an offer, loan approval or loan commitment. Mortgage rates are subject to change without notice. Some terms and restrictions may apply to certain loan programs. Refinancing existing loans may result in total finance charges being higher over the life of the loan, reduction in payments may partially reflect a longer loan term. This information is provided as guidance and illustrative purposes only and does not constitute legal or financial advice. We are not liable or bound legally for any answers provided to any user for our process or position on an issue. This information may change from time to time and at any time without notification. The most current information will be updated periodically and posted in the online forum. spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org. You are receiving this information as a current loan customer with spamspam Loan Servicing, LLC. Not licensed for lending activities in any of the U.S. territories. Not authorized to originate loans in the State of New York. Licensed by the Dept. of Financial Protection and Innovation under the California Residential Mortgage .Lending Act #4131216. This email was sent to somebody@gmail.com Version 103023PCHPrAp9 xxxxxxxxx spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251, Coral Gables, FL 33146-1837 Unsubscribe somebody@gmail.com Update Profile | Our Privacy Policy | Constant Contact Data Notice Sent by marklake@spamspam.com" + require.Equal(t, expected, actual) + }) + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + +func TestSmtpBackend_Spam_HTML(t *testing.T) { + email := strings.ReplaceAll(spamEmail, "text/plain", "text/not-plain-anymore") // We artificially force HTML parsing here + s, c, _, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/mytopic", r.URL.Path) + require.Equal(t, "Buying a home? You deserve the confidence of Pre-Approval", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := `When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. + ` + "\u200a" + ` + + SELLING or BUYING? + Call: 844-590-2275 + + Get Your Homebuying + PRE-APPROVAL IN 24-HOURS * + Get Pre-Approved + + When you're buying a home, Pre-Approval gives you confidence you're in the right price range and shows sellers you mean business. + ` + "\ufeff" + `Get Pre-Approved today! + + Click or Call to Get Pre-Approved + 844-590-2275 + Get Pre-Approved + + nmlsconsumeraccess.org/ + *The 24 hour timeframe is for most approvals, however if additional information is needed or a request is on a holiday, the time for preapproval may be greater than 24 hours. + This email is for informational purposes only and is not an offer, loan approval or loan commitment. Mortgage rates are subject to change without notice. Some terms and restrictions may apply to certain loan programs Refinancing existing loans may result in total finance charges being higher over the life of the loan, reduction in payments may partially reflect a longer loan term. This information is provided as guidance and illustrative purposes only and does not constitute legal or financial advice. We are not liable or bound legally for any answers provided to any user for our process or position on an issue. This information may change from time to time and at any time without notification. The most current information will be updated periodically and posted in the online forum. + spamspam Loan Servicing, LLC. NMLS#391521. nmlsconsumeraccess.org. You are receiving this information as a current loan customer with spamspam Loan Servicing, LLC. Not licensed for lending activities in any of the U.S. territories. Not authorized to originate loans in the State of New York. Licensed by the Dept. of Financial Protection and Innovation under the California Residential Mortgage .Lending Act #4131216. + + This email was sent to somebody@gmail.com + Version 103023PCHPrAp9 + ` + "\ufeff" + ` + + spamspam Loan Servicing | 4425 Ponce de Leon Blvd 5-251 , Coral Gables, FL 33146-1837 + + Unsubscribe somebody@gmail.com + + Update Profile | + Our Privacy Policy | + Constant Contact Data Notice + +Sent by + marklake@spamspam.com` + require.Equal(t, expected, actual) }) defer s.Close() defer c.Close() @@ -764,7 +1406,6 @@ func readUntilLine(t *testing.T, conn net.Conn, scanner *bufio.Scanner, expected return } output += text + "\n" - //fmt.Println(text) } t.Fatalf("Expected line '%s' not found in output:\n%s", expectedLine, output) } From 37091f25a887778e40870fea72a33953a6ad981c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:51:23 -0500 Subject: [PATCH 134/182] Add PR link --- docs/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index e56f8847..372ff435 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1287,7 +1287,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** -* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) +* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690)/[#693](https://github.com/binwiederhier/ntfy/pull/693), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) * Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) From 859a4e4f79aafd258a24b90ebde56859242f6457 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 09:58:32 -0500 Subject: [PATCH 135/182] Added another test --- server/smtp_server_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/server/smtp_server_test.go b/server/smtp_server_test.go index 93335905..90374ea8 100644 --- a/server/smtp_server_test.go +++ b/server/smtp_server_test.go @@ -1335,6 +1335,36 @@ Sent by writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") } +func TestSmtpBackend_HTMLOnly_FromDiskStation(t *testing.T) { + email := `EHLO example.com +MAIL FROM: synology@mydomain.me +RCPT TO: synology@mydomain.me +DATA +From: "=?UTF-8?B?Um9iYmll?=" +To: +Message-Id: <640e6f562895d.6c9584bcfa491ac9c546b480b32ffc1d@mydomain.me> +MIME-Version: 1.0 +Subject: =?UTF-8?B?W1N5bm9sb2d5IE5BU10gVGVzdCBNZXNzYWdlIGZyb20gTGl0dHNfTkFT?= +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: 8bit + +Congratulations! You have successfully set up the email notification on Synology_NAS.
For further system configurations, please visit http://192.168.1.28:5000/, http://172.16.60.5:5000/.
(If you cannot connect to the server, please contact the administrator.)

From Synology_NAS


+. +` + s, c, conf, scanner := newTestSMTPServer(t, func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/synology", r.URL.Path) + require.Equal(t, "[Synology NAS] Test Message from Litts_NAS", r.Header.Get("Title")) + actual := readAll(t, r.Body) + expected := `Congratulations! You have successfully set up the email notification on Synology_NAS. For further system configurations, please visit http://192.168.1.28:5000/, http://172.16.60.5:5000/. (If you cannot connect to the server, please contact the administrator.) From Synology_NAS` + require.Equal(t, expected, actual) + }) + conf.SMTPServerDomain = "mydomain.me" + conf.SMTPServerAddrPrefix = "" + defer s.Close() + defer c.Close() + writeAndReadUntilLine(t, email, c, scanner, "250 2.0.0 OK: queued") +} + func TestSmtpBackend_PlaintextWithToken(t *testing.T) { email := `EHLO example.com MAIL FROM: phil@example.com From 22f48c5ad3ec77e9afa3b3865c581adbe315d39a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 20:54:58 -0500 Subject: [PATCH 136/182] Change mod path --- README.md | 2 +- client/client.go | 4 ++-- client/client_test.go | 6 +++--- client/config_test.go | 2 +- client/options.go | 2 +- cmd/access.go | 4 ++-- cmd/access_test.go | 4 ++-- cmd/app.go | 2 +- cmd/app_test.go | 4 ++-- cmd/config_loader.go | 2 +- cmd/publish.go | 6 +++--- cmd/publish_test.go | 4 ++-- cmd/serve.go | 8 ++++---- cmd/serve_test.go | 6 +++--- cmd/subscribe.go | 6 +++--- cmd/tier.go | 4 ++-- cmd/tier_test.go | 4 ++-- cmd/token.go | 4 ++-- cmd/token_test.go | 4 ++-- cmd/user.go | 4 ++-- cmd/user_test.go | 6 +++--- cmd/webpush_test.go | 2 +- go.mod | 2 +- go.sum | 33 +++++++-------------------------- log/event.go | 2 +- main.go | 2 +- server/actions.go | 2 +- server/config.go | 2 +- server/config_test.go | 2 +- server/errors.go | 2 +- server/file_cache.go | 4 ++-- server/file_cache_test.go | 2 +- server/log.go | 4 ++-- server/message_cache.go | 4 ++-- server/server.go | 6 +++--- server/server_account.go | 6 +++--- server/server_account_test.go | 6 +++--- server/server_admin.go | 2 +- server/server_admin_test.go | 4 ++-- server/server_firebase.go | 4 ++-- server/server_firebase_test.go | 2 +- server/server_manager.go | 4 ++-- server/server_matrix.go | 2 +- server/server_middleware.go | 2 +- server/server_payments.go | 6 +++--- server/server_payments_test.go | 4 ++-- server/server_test.go | 6 +++--- server/server_twilio.go | 6 +++--- server/server_twilio_test.go | 4 ++-- server/server_webpush.go | 4 ++-- server/server_webpush_test.go | 4 ++-- server/smtp_sender.go | 4 ++-- server/topic.go | 4 ++-- server/types.go | 6 +++--- server/util.go | 2 +- server/visitor.go | 6 +++--- server/webpush_store.go | 2 +- test/server.go | 2 +- user/manager.go | 4 ++-- user/manager_test.go | 2 +- user/types.go | 2 +- util/batching_queue_test.go | 2 +- 62 files changed, 120 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 90d9285f..d4c30ca0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # ntfy.sh | Send push notifications to your phone or desktop via PUT/POST [![Release](https://img.shields.io/github/release/binwiederhier/ntfy.svg?color=success&style=flat-square)](https://github.com/binwiederhier/ntfy/releases/latest) -[![Go Reference](https://pkg.go.dev/badge/heckel.io/ntfy.svg)](https://pkg.go.dev/heckel.io/ntfy) +[![Go Reference](https://pkg.go.dev/badge/heckel.io/ntfy.svg)](https://pkg.go.dev/heckel.io/ntfy/v2) [![Tests](https://github.com/binwiederhier/ntfy/workflows/test/badge.svg)](https://github.com/binwiederhier/ntfy/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/binwiederhier/ntfy)](https://goreportcard.com/report/github.com/binwiederhier/ntfy) [![codecov](https://codecov.io/gh/binwiederhier/ntfy/branch/main/graph/badge.svg?token=A597KQ463G)](https://codecov.io/gh/binwiederhier/ntfy) diff --git a/client/client.go b/client/client.go index 93cf7da5..c2260966 100644 --- a/client/client.go +++ b/client/client.go @@ -7,8 +7,8 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "net/http" "regexp" diff --git a/client/client_test.go b/client/client_test.go index f0b15a3f..a6784ff8 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -3,9 +3,9 @@ package client_test import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/test" "os" "testing" "time" diff --git a/client/config_test.go b/client/config_test.go index c85d3d49..5d9eeecc 100644 --- a/client/config_test.go +++ b/client/config_test.go @@ -2,7 +2,7 @@ package client_test import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" + "heckel.io/ntfy/v2/client" "os" "path/filepath" "testing" diff --git a/client/options.go b/client/options.go index 630f1554..027b7fb5 100644 --- a/client/options.go +++ b/client/options.go @@ -2,7 +2,7 @@ package client import ( "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/http" "strings" "time" diff --git a/cmd/access.go b/cmd/access.go index 87f01d11..c6be94b5 100644 --- a/cmd/access.go +++ b/cmd/access.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/access_test.go b/cmd/access_test.go index 359beb92..81c9f2b9 100644 --- a/cmd/access_test.go +++ b/cmd/access_test.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "testing" ) diff --git a/cmd/app.go b/cmd/app.go index edef5b47..d88a9d58 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "os" "regexp" ) diff --git a/cmd/app_test.go b/cmd/app_test.go index ec27a67d..f7d752f0 100644 --- a/cmd/app_test.go +++ b/cmd/app_test.go @@ -4,8 +4,8 @@ import ( "bytes" "encoding/json" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" "os" "strings" "testing" diff --git a/cmd/config_loader.go b/cmd/config_loader.go index 9f0a5769..e6180bed 100644 --- a/cmd/config_loader.go +++ b/cmd/config_loader.go @@ -5,7 +5,7 @@ import ( "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" "gopkg.in/yaml.v2" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "os" ) diff --git a/cmd/publish.go b/cmd/publish.go index 5ffe3adf..aaec35e9 100644 --- a/cmd/publish.go +++ b/cmd/publish.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "os" "os/exec" diff --git a/cmd/publish_test.go b/cmd/publish_test.go index a254f47d..31d01cb5 100644 --- a/cmd/publish_test.go +++ b/cmd/publish_test.go @@ -3,8 +3,8 @@ package cmd import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/test" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/util" "net/http" "net/http/httptest" "os" diff --git a/cmd/serve.go b/cmd/serve.go index 87b83dda..9fcf550c 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -6,7 +6,7 @@ import ( "errors" "fmt" "github.com/stripe/stripe-go/v74" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "io/fs" "math" "net" @@ -17,12 +17,12 @@ import ( "syscall" "time" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/server" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/serve_test.go b/cmd/serve_test.go index 774166c3..9e16540b 100644 --- a/cmd/serve_test.go +++ b/cmd/serve_test.go @@ -12,9 +12,9 @@ import ( "github.com/gorilla/websocket" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "heckel.io/ntfy/client" - "heckel.io/ntfy/test" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/subscribe.go b/cmd/subscribe.go index 77a1b5f1..1a0a7a6f 100644 --- a/cmd/subscribe.go +++ b/cmd/subscribe.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/client" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/client" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "os" "os/exec" "os/user" diff --git a/cmd/tier.go b/cmd/tier.go index f1c8ddcb..63b023f9 100644 --- a/cmd/tier.go +++ b/cmd/tier.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) func init() { diff --git a/cmd/tier_test.go b/cmd/tier_test.go index 1774aa27..145f273e 100644 --- a/cmd/tier_test.go +++ b/cmd/tier_test.go @@ -3,8 +3,8 @@ package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "testing" ) diff --git a/cmd/token.go b/cmd/token.go index ab9f4447..cb92a130 100644 --- a/cmd/token.go +++ b/cmd/token.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "net/netip" "time" ) diff --git a/cmd/token_test.go b/cmd/token_test.go index 40d7be7b..03295081 100644 --- a/cmd/token_test.go +++ b/cmd/token_test.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" "regexp" "testing" ) diff --git a/cmd/user.go b/cmd/user.go index a96c7089..9ab487dd 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -6,13 +6,13 @@ import ( "crypto/subtle" "errors" "fmt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "os" "strings" "github.com/urfave/cli/v2" "github.com/urfave/cli/v2/altsrc" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/cmd/user_test.go b/cmd/user_test.go index 1149285f..e1bdd3ab 100644 --- a/cmd/user_test.go +++ b/cmd/user_test.go @@ -3,9 +3,9 @@ package cmd import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" - "heckel.io/ntfy/test" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/server" + "heckel.io/ntfy/v2/test" + "heckel.io/ntfy/v2/user" "os" "path/filepath" "testing" diff --git a/cmd/webpush_test.go b/cmd/webpush_test.go index 1b364701..51926ca1 100644 --- a/cmd/webpush_test.go +++ b/cmd/webpush_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" ) func TestCLI_WebPush_GenerateKeys(t *testing.T) { diff --git a/go.mod b/go.mod index 567dc662..c4f4fdc9 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/sync v0.5.0 golang.org/x/term v0.14.0 golang.org/x/time v0.4.0 - google.golang.org/api v0.150.0 + google.golang.org/api v0.151.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index c672f742..2031b653 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,6 @@ cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/storage v1.34.1 h1:H2Af2dU5J0PF7A5B+ECFIce+RqxVnrVilO+cu0TS3MI= -cloud.google.com/go/storage v1.34.1/go.mod h1:VN1ElqqvR9adg1k9xlkUJ55cMOP1/QjnNNuT5xQL6dY= cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= @@ -42,8 +40,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead h1:fI1Jck0vUrXT8bnphprS1EoVRe2Q5CKCX8iDlpqjQ/Y= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY= github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-smtp v0.17.0 h1:tq90evlrcyqRfE6DSXaWVH54oX6OuZOQECEmhWBMEtI= @@ -85,7 +81,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -95,18 +93,16 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= @@ -127,6 +123,7 @@ github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGy github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -136,7 +133,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -153,8 +149,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -175,13 +169,9 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -208,8 +198,6 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -235,10 +223,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= +google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -248,16 +234,10 @@ google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -283,6 +263,7 @@ google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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= diff --git a/log/event.go b/log/event.go index b4b8f59f..f16eb180 100644 --- a/log/event.go +++ b/log/event.go @@ -3,7 +3,7 @@ package log import ( "encoding/json" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "log" "os" "sort" diff --git a/main.go b/main.go index 5b1428d1..d4600dc8 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" "github.com/urfave/cli/v2" - "heckel.io/ntfy/cmd" + "heckel.io/ntfy/v2/cmd" "os" "runtime" ) diff --git a/server/actions.go b/server/actions.go index 80065873..98b90558 100644 --- a/server/actions.go +++ b/server/actions.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "regexp" "strings" "unicode/utf8" diff --git a/server/config.go b/server/config.go index 9815aa88..a0cfdcd5 100644 --- a/server/config.go +++ b/server/config.go @@ -5,7 +5,7 @@ import ( "net/netip" "time" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" ) // Defines default config settings (excluding limits, see below) diff --git a/server/config_test.go b/server/config_test.go index 14f028f1..0dae5725 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -2,7 +2,7 @@ package server_test import ( "github.com/stretchr/testify/assert" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" "testing" ) diff --git a/server/errors.go b/server/errors.go index 27ba3df0..072bdc01 100644 --- a/server/errors.go +++ b/server/errors.go @@ -3,7 +3,7 @@ package server import ( "encoding/json" "fmt" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "net/http" ) diff --git a/server/file_cache.go b/server/file_cache.go index c097aefb..758d38ee 100644 --- a/server/file_cache.go +++ b/server/file_cache.go @@ -3,8 +3,8 @@ package server import ( "errors" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "io" "os" "path/filepath" diff --git a/server/file_cache_test.go b/server/file_cache_test.go index 8f267a73..e7dee3b3 100644 --- a/server/file_cache_test.go +++ b/server/file_cache_test.go @@ -4,7 +4,7 @@ import ( "bytes" "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "os" "strings" "testing" diff --git a/server/log.go b/server/log.go index 978d0593..3d11ac47 100644 --- a/server/log.go +++ b/server/log.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/emersion/go-smtp" "github.com/gorilla/websocket" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "net/http" "strings" "unicode/utf8" diff --git a/server/message_cache.go b/server/message_cache.go index 8a613ff1..f0744abb 100644 --- a/server/message_cache.go +++ b/server/message_cache.go @@ -10,8 +10,8 @@ import ( "time" _ "github.com/mattn/go-sqlite3" // SQLite driver - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) var ( diff --git a/server/server.go b/server/server.go index 0ab36524..c0f3b641 100644 --- a/server/server.go +++ b/server/server.go @@ -30,9 +30,9 @@ import ( "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus/promhttp" "golang.org/x/sync/errgroup" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" ) // Server is the main server, providing the UI and API for ntfy diff --git a/server/server_account.go b/server/server_account.go index f26cc2ff..cb841d07 100644 --- a/server/server_account.go +++ b/server/server_account.go @@ -2,9 +2,9 @@ package server import ( "encoding/json" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "net/http" "net/netip" "strings" diff --git a/server/server_account_test.go b/server/server_account_test.go index 119efb16..4c269c2f 100644 --- a/server/server_account_test.go +++ b/server/server_account_test.go @@ -3,9 +3,9 @@ package server import ( "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/netip" "path/filepath" diff --git a/server/server_admin.go b/server/server_admin.go index 9380a5ff..fc9dfed1 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -1,7 +1,7 @@ package server import ( - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "net/http" ) diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 1513ea40..c2f8f95a 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -2,8 +2,8 @@ package server import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "sync/atomic" "testing" "time" diff --git a/server/server_firebase.go b/server/server_firebase.go index b8158d2f..4a0cb7f9 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -8,8 +8,8 @@ import ( "firebase.google.com/go/v4/messaging" "fmt" "google.golang.org/api/option" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "strings" ) diff --git a/server/server_firebase_test.go b/server/server_firebase_test.go index fb27ea05..9b653a29 100644 --- a/server/server_firebase_test.go +++ b/server/server_firebase_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "net/netip" "strings" "sync" diff --git a/server/server_manager.go b/server/server_manager.go index 66d449de..9f5fe888 100644 --- a/server/server_manager.go +++ b/server/server_manager.go @@ -1,8 +1,8 @@ package server import ( - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "strings" ) diff --git a/server/server_matrix.go b/server/server_matrix.go index c25a1b59..f99bea8f 100644 --- a/server/server_matrix.go +++ b/server/server_matrix.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/json" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "io" "net/http" "strings" diff --git a/server/server_middleware.go b/server/server_middleware.go index b1428154..b2ce6f70 100644 --- a/server/server_middleware.go +++ b/server/server_middleware.go @@ -3,7 +3,7 @@ package server import ( "net/http" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) type contextKey int diff --git a/server/server_payments.go b/server/server_payments.go index 1e98d059..334301bb 100644 --- a/server/server_payments.go +++ b/server/server_payments.go @@ -11,9 +11,9 @@ import ( "github.com/stripe/stripe-go/v74/price" "github.com/stripe/stripe-go/v74/subscription" "github.com/stripe/stripe-go/v74/webhook" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/netip" diff --git a/server/server_payments_test.go b/server/server_payments_test.go index ebd559e7..8da47a65 100644 --- a/server/server_payments_test.go +++ b/server/server_payments_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/stripe/stripe-go/v74" "golang.org/x/time/rate" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/netip" "path/filepath" diff --git a/server/server_test.go b/server/server_test.go index d60c775a..d387c359 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -7,7 +7,7 @@ import ( "encoding/json" "fmt" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/user" "io" "math/rand" "net/http" @@ -24,8 +24,8 @@ import ( "github.com/SherClockHolmes/webpush-go" "github.com/stretchr/testify/require" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) func TestMain(m *testing.M) { diff --git a/server/server_twilio.go b/server/server_twilio.go index 093abe63..9a8ef8ad 100644 --- a/server/server_twilio.go +++ b/server/server_twilio.go @@ -4,9 +4,9 @@ import ( "bytes" "encoding/xml" "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/url" diff --git a/server/server_twilio_test.go b/server/server_twilio_test.go index af694a77..89a36051 100644 --- a/server/server_twilio_test.go +++ b/server/server_twilio_test.go @@ -2,8 +2,8 @@ package server import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/http/httptest" diff --git a/server/server_webpush.go b/server/server_webpush.go index bb0f5408..cd41759d 100644 --- a/server/server_webpush.go +++ b/server/server_webpush.go @@ -8,8 +8,8 @@ import ( "strings" "github.com/SherClockHolmes/webpush-go" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" ) const ( diff --git a/server/server_webpush_test.go b/server/server_webpush_test.go index c0db79c6..c32c7bf8 100644 --- a/server/server_webpush_test.go +++ b/server/server_webpush_test.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" "github.com/stretchr/testify/require" - "heckel.io/ntfy/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/user" + "heckel.io/ntfy/v2/util" "io" "net/http" "net/http/httptest" diff --git a/server/smtp_sender.go b/server/smtp_sender.go index 9093687e..21eaf682 100644 --- a/server/smtp_sender.go +++ b/server/smtp_sender.go @@ -11,8 +11,8 @@ import ( "sync" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) type mailer interface { diff --git a/server/topic.go b/server/topic.go index 5dfafbe3..49def94b 100644 --- a/server/topic.go +++ b/server/topic.go @@ -5,8 +5,8 @@ import ( "sync" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/server/types.go b/server/types.go index eeb566fc..fb08fb05 100644 --- a/server/types.go +++ b/server/types.go @@ -5,10 +5,10 @@ import ( "net/netip" "time" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) // List of possible events diff --git a/server/util.go b/server/util.go index 09536765..fe5b3ea3 100644 --- a/server/util.go +++ b/server/util.go @@ -3,7 +3,7 @@ package server import ( "context" "fmt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "io" "mime" "net/http" diff --git a/server/visitor.go b/server/visitor.go index e4c06f66..f8dc416a 100644 --- a/server/visitor.go +++ b/server/visitor.go @@ -2,14 +2,14 @@ package server import ( "fmt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/user" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/user" "net/netip" "sync" "time" "golang.org/x/time/rate" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" ) const ( diff --git a/server/webpush_store.go b/server/webpush_store.go index b2ab0d11..62a35f7d 100644 --- a/server/webpush_store.go +++ b/server/webpush_store.go @@ -3,7 +3,7 @@ package server import ( "database/sql" "errors" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/netip" "time" diff --git a/test/server.go b/test/server.go index 0b9200a6..18529359 100644 --- a/test/server.go +++ b/test/server.go @@ -2,7 +2,7 @@ package test import ( "fmt" - "heckel.io/ntfy/server" + "heckel.io/ntfy/v2/server" "math/rand" "net/http" "path/filepath" diff --git a/user/manager.go b/user/manager.go index 324b7684..33e0ac4b 100644 --- a/user/manager.go +++ b/user/manager.go @@ -9,8 +9,8 @@ import ( "github.com/mattn/go-sqlite3" "github.com/stripe/stripe-go/v74" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/log" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/log" + "heckel.io/ntfy/v2/util" "net/netip" "strings" "sync" diff --git a/user/manager_test.go b/user/manager_test.go index 468dc36a..cf797fca 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/stripe/stripe-go/v74" "golang.org/x/crypto/bcrypt" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "net/netip" "path/filepath" "strings" diff --git a/user/types.go b/user/types.go index 11895785..68ee02f3 100644 --- a/user/types.go +++ b/user/types.go @@ -3,7 +3,7 @@ package user import ( "errors" "github.com/stripe/stripe-go/v74" - "heckel.io/ntfy/log" + "heckel.io/ntfy/v2/log" "net/netip" "regexp" "strings" diff --git a/util/batching_queue_test.go b/util/batching_queue_test.go index b3c41a4c..728095ca 100644 --- a/util/batching_queue_test.go +++ b/util/batching_queue_test.go @@ -2,7 +2,7 @@ package util_test import ( "github.com/stretchr/testify/require" - "heckel.io/ntfy/util" + "heckel.io/ntfy/v2/util" "math/rand" "sync" "testing" From b65044712b42390b169116bb67f0aeb4b08b72c7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 16 Nov 2023 21:04:49 -0500 Subject: [PATCH 137/182] Fix linter --- cmd/serve_test.go | 4 ---- server/server_test.go | 2 +- server/topic_test.go | 4 ++-- test/server.go | 5 ----- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/cmd/serve_test.go b/cmd/serve_test.go index 9e16540b..748adbd8 100644 --- a/cmd/serve_test.go +++ b/cmd/serve_test.go @@ -17,10 +17,6 @@ import ( "heckel.io/ntfy/v2/util" ) -func init() { - rand.Seed(time.Now().UnixMilli()) -} - func TestCLI_Serve_Unix_Curl(t *testing.T) { sockFile := filepath.Join(t.TempDir(), "ntfy.sock") configFile := newEmptyFile(t) // Avoid issues with existing server.yml file on system diff --git a/server/server_test.go b/server/server_test.go index d387c359..5f2bac6a 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -3,13 +3,13 @@ package server import ( "bufio" "context" + "crypto/rand" "encoding/base64" "encoding/json" "fmt" "golang.org/x/crypto/bcrypt" "heckel.io/ntfy/v2/user" "io" - "math/rand" "net/http" "net/http/httptest" "net/netip" diff --git a/server/topic_test.go b/server/topic_test.go index 41a29cfd..8de16111 100644 --- a/server/topic_test.go +++ b/server/topic_test.go @@ -69,7 +69,7 @@ func TestTopic_Subscribe_DuplicateID(t *testing.T) { t.Parallel() to := newTopic("mytopic") - // Fix random seed to force same number generation + //lint:ignore SA1019 Fix random seed to force same number generation rand.Seed(1) a := rand.Int() to.subscribers[a] = &topicSubscriber{ @@ -82,7 +82,7 @@ func TestTopic_Subscribe_DuplicateID(t *testing.T) { return nil } - // Force rand.Int to generate the same id once more + //lint:ignore SA1019 Force rand.Int to generate the same id once more rand.Seed(1) id := to.Subscribe(subFn, "b", func() {}) res := to.subscribers[id] diff --git a/test/server.go b/test/server.go index 18529359..9d75a2c7 100644 --- a/test/server.go +++ b/test/server.go @@ -7,13 +7,8 @@ import ( "net/http" "path/filepath" "testing" - "time" ) -func init() { - rand.Seed(time.Now().UnixMilli()) -} - // StartServer starts a server.Server with a random port and waits for the server to be up func StartServer(t *testing.T) (*server.Server, int) { return StartServerWithConfig(t, server.NewConfig()) From e724aace4991b730d99828c1191950689ce32fd4 Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:03:23 +0800 Subject: [PATCH 138/182] Allow overriding `python3` & `pip3` binary in Makefile --- Makefile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index a29fb4f5..64a95e94 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ MAKEFLAGS := --jobs=1 +PYTHON := python3 +PIP := pip3 VERSION := $(shell git describe --tag) COMMIT := $(shell git rev-parse --short HEAD) @@ -115,16 +117,16 @@ build-deps-ubuntu: docs: docs-deps docs-build docs-venv: .PHONY - python3 -m venv ./venv + $(PYTHON) -m venv ./venv docs-build: docs-venv - (. venv/bin/activate && mkdocs build) + (. venv/bin/activate && $(PYTHON) mkdocs build) docs-deps: docs-venv - (. venv/bin/activate && pip3 install -r requirements.txt) + (. venv/bin/activate && $(PIP) install -r requirements.txt) docs-deps-update: .PHONY - (. venv/bin/activate && pip3 install -r requirements.txt --upgrade) + (. venv/bin/activate && $(PIP) install -r requirements.txt --upgrade) # Web app From 0928d99813a2e5ea59d1e992794fc1f934f16191 Mon Sep 17 00:00:00 2001 From: cyqsimon <28627918+cyqsimon@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:39:13 +0800 Subject: [PATCH 139/182] Fix mkdocs call --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 64a95e94..4355423e 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ docs-venv: .PHONY $(PYTHON) -m venv ./venv docs-build: docs-venv - (. venv/bin/activate && $(PYTHON) mkdocs build) + (. venv/bin/activate && $(PYTHON) -m mkdocs build) docs-deps: docs-venv (. venv/bin/activate && $(PIP) install -r requirements.txt) From 7d755ce604a7331afbbdb1ce9631458aae075db6 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 18 Nov 2023 21:50:01 -0500 Subject: [PATCH 140/182] Add comments and another test to ACL fix --- user/manager.go | 6 ++++-- user/manager_test.go | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/user/manager.go b/user/manager.go index 60d8c392..9f54625f 100644 --- a/user/manager.go +++ b/user/manager.go @@ -833,8 +833,10 @@ func (a *Manager) Authorize(user *User, topic string, perm Permission) error { if user != nil { username = user.Name } - // Select the read/write permissions for this user/topic combo. The query may return two - // rows (one for everyone, and one for the user), but prioritizes the user. + // Select the read/write permissions for this user/topic combo. + // - The query may return two rows (one for everyone, and one for the user), but prioritizes the user. + // - Furthermore, the query prioritizes more specific permissions (longer!) over more generic ones, e.g. "test*" > "*" + // - It also prioritizes write permissions over read permissions rows, err := a.db.Query(selectTopicPermsQuery, Everyone, username, topic) if err != nil { return err diff --git a/user/manager_test.go b/user/manager_test.go index f85d2b33..e9a95b0f 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -98,7 +98,7 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { require.Nil(t, a.Authorize(ben, "announcements", PermissionRead)) require.Equal(t, ErrUnauthorized, a.Authorize(ben, "announcements", PermissionWrite)) - // user john should have + // User john should have // "deny" to mytopic_deny*, // "ro" to mytopic_ro*, // "rw" to mytopic*, @@ -129,6 +129,22 @@ func TestManager_FullScenario_Default_DenyAll(t *testing.T) { require.Nil(t, a.Authorize(nil, "up5678", PermissionWrite)) } +func TestManager_Access_Order_LengthWriteRead(t *testing.T) { + // This test validates issue #914 / #917, i.e. that write permissions are prioritized over read permissions, + // and longer ACL rules are prioritized as well. + + a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) + require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AllowAccess("ben", "test*", PermissionReadWrite)) + require.Nil(t, a.AllowAccess("ben", "*", PermissionRead)) + + ben, err := a.Authenticate("ben", "ben") + require.Nil(t, err) + require.Nil(t, a.Authorize(ben, "any-topic-can-be-read", PermissionRead)) + require.Nil(t, a.Authorize(ben, "this-too", PermissionRead)) + require.Nil(t, a.Authorize(ben, "test123", PermissionWrite)) +} + func TestManager_AddUser_Invalid(t *testing.T) { a := newTestManager(t, PermissionDenyAll) require.Equal(t, ErrInvalidArgument, a.AddUser(" invalid ", "pass", RoleAdmin)) From f9a411c3072998082f74a7cd8165401e83248a1b Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 18 Nov 2023 21:54:26 -0500 Subject: [PATCH 141/182] Release notes --- docs/releases.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 372ff435..7a9c8a28 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1289,14 +1289,15 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690)/[#693](https://github.com/binwiederhier/ntfy/pull/693), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) * Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) +* Fix ACL issue with order of read/write rules ([#914](https://github.com/binwiederhier/ntfy/issues/914)/[#917](https://github.com/binwiederhier/ntfy/pull/917), thanks to [@sandman7920](https://github.com/sandman7920)) * Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) -* Add special logic to ignore `Priority` header if it resembled a RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) +* Add special logic to ignore `Priority` header if it resembles an RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) * PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) * Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) **Additional languages:** -* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/) +* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/)) ### ntfy Android app v1.16.1 (UNRELEASED) From 1c3ed3ea4014f651c415c8b3595fc8a059ff06c5 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 05:47:41 -0500 Subject: [PATCH 142/182] Do not allow empty passwords when creating users --- cmd/user.go | 3 ++- util/util.go | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/user.go b/cmd/user.go index 9ab487dd..af3afe54 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -198,7 +198,6 @@ func execUserAdd(c *cli.Context) error { if err != nil { return err } - password = p } if err := manager.AddUser(username, password, role); err != nil { @@ -343,6 +342,8 @@ func readPasswordAndConfirm(c *cli.Context) (string, error) { password, err := util.ReadPassword(c.App.Reader) if err != nil { return "", err + } else if len(password) == 0 { + return "", errors.New("password cannot be empty") } fmt.Fprintf(c.App.ErrWriter, "\r%s\rconfirm: ", strings.Repeat(" ", 25)) confirm, err := util.ReadPassword(c.App.Reader) diff --git a/util/util.go b/util/util.go index d48487df..df0c011c 100644 --- a/util/util.go +++ b/util/util.go @@ -253,6 +253,8 @@ func ReadPassword(in io.Reader) ([]byte, error) { password, err := term.ReadPassword(int(f.Fd())) // This is always going to be 0 if err != nil { return nil, err + } else if len(password) == 0 { + return nil, errors.New("password cannot be empty") } return password, nil } @@ -272,7 +274,9 @@ func ReadPassword(in io.Reader) ([]byte, error) { } password = append(password, buf[0]) } - + if len(password) == 0 { + return nil, errors.New("password cannot be empty") + } return password, nil } From 3c8fabe409d85234721d42d558012332d98ba2e3 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 05:49:40 -0500 Subject: [PATCH 143/182] Update deps --- web/package-lock.json | 814 +++++++++++++++++++++--------------------- 1 file changed, 415 insertions(+), 399 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 7e3fcfdb..f0cfd9f6 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -80,30 +80,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/parser": "^7.23.3", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -125,12 +125,12 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -293,9 +293,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -469,9 +469,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -481,9 +481,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -496,14 +496,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -512,6 +512,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -588,9 +604,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -603,9 +619,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -760,9 +776,9 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -775,9 +791,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -793,14 +809,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -810,9 +826,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -825,9 +841,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -840,12 +856,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -856,12 +872,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -873,18 +889,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -896,13 +912,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -912,9 +928,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -927,12 +943,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -943,9 +959,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -958,9 +974,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -974,12 +990,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -990,9 +1006,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1006,9 +1022,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1021,13 +1037,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1038,9 +1054,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1054,9 +1070,9 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1069,9 +1085,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1085,9 +1101,9 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1100,12 +1116,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1116,12 +1132,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1133,13 +1149,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, @@ -1151,12 +1167,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1183,9 +1199,9 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1198,9 +1214,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1214,9 +1230,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1230,16 +1246,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1249,13 +1265,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1265,9 +1281,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1281,9 +1297,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1298,9 +1314,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1313,12 +1329,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1329,13 +1345,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1347,9 +1363,9 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1362,9 +1378,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1377,9 +1393,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1392,9 +1408,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1408,9 +1424,9 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1423,9 +1439,9 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1438,9 +1454,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1454,9 +1470,9 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1469,9 +1485,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1484,9 +1500,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1499,9 +1515,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1514,12 +1530,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1530,12 +1546,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1546,12 +1562,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1562,25 +1578,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.2", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1592,56 +1609,55 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", "babel-plugin-polyfill-corejs2": "^0.4.6", "babel-plugin-polyfill-corejs3": "^0.8.5", "babel-plugin-polyfill-regenerator": "^0.5.3", @@ -1701,19 +1717,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1722,9 +1738,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", @@ -2304,9 +2320,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2330,9 +2346,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", "dependencies": { "@floating-ui/dom": "^1.5.1" }, @@ -2449,14 +2465,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", - "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", "dependencies": { "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -2480,18 +2496,18 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", - "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.16.tgz", - "integrity": "sha512-wmOgslMEGvbHZjFLru8uH5E+pif/ciXAvKNw16q6joK6EWVWU5rDYWFknDaZhCvz8ZE/K8ZnJQ+lMG6GgHzXbg==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", "dependencies": { "@babel/runtime": "^7.23.2" }, @@ -2514,16 +2530,16 @@ } }, "node_modules/@mui/material": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", - "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/base": "5.0.0-beta.22", - "@mui/core-downloads-tracker": "^5.14.16", - "@mui/system": "^5.14.16", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2558,12 +2574,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", - "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/utils": "^5.14.16", + "@mui/utils": "^5.14.18", "prop-types": "^15.8.1" }, "engines": { @@ -2584,9 +2600,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", - "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", "dependencies": { "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", @@ -2615,15 +2631,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", - "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/private-theming": "^5.14.16", - "@mui/styled-engine": "^5.14.16", - "@mui/types": "^7.2.8", - "@mui/utils": "^5.14.16", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2654,9 +2670,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", - "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -2667,12 +2683,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.16", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", - "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", "dependencies": { "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.9", + "@types/prop-types": "^15.7.10", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2738,9 +2754,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", - "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", + "integrity": "sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg==", "engines": { "node": ">=14.0.0" } @@ -2758,9 +2774,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2771,18 +2787,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2790,9 +2806,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -2811,36 +2827,36 @@ "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.14.tgz", - "integrity": "sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", + "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "node_modules/@types/react": { - "version": "18.2.35", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", - "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", + "version": "18.2.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", + "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2848,9 +2864,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", - "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", "dependencies": { "@types/react": "*" } @@ -2865,20 +2881,20 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", - "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", + "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==" }, "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", + "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", "dev": true }, "node_modules/@types/unist": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.9.tgz", - "integrity": "sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", @@ -2887,22 +2903,22 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", - "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", + "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", "dev": true, "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.3", + "@babel/core": "^7.23.3", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.4", "react-refresh": "^0.14.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0" + "vite": "^4.2.0 || ^5.0.0" } }, "node_modules/acorn": { @@ -3321,9 +3337,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "version": "1.0.30001563", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", + "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", "dev": true, "funding": [ { @@ -3654,9 +3670,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", + "version": "1.4.588", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", + "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", "dev": true }, "node_modules/emoji-regex": { @@ -3854,15 +3870,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4361,9 +4377,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4485,9 +4501,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -4495,7 +4511,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -4828,9 +4844,9 @@ } }, "node_modules/humanize-duration": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.30.0.tgz", - "integrity": "sha512-NxpT0fhQTFuMTLnuu1Xp+ozNpYirQnbV3NlOjEKBYlE3uvMRu3LDuq8EPc3gVXxVYnchQfqVM4/+T9iwHPLLeA==" + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.31.0.tgz", + "integrity": "sha512-fRrehgBG26NNZysRlTq1S+HPtDpp3u+Jzdc/d5A4cEzOD86YLAkDaJyJg8krSdCi7CJ+s7ht3fwRj8Dl+Btd0w==" }, "node_modules/i18next": { "version": "21.10.0", @@ -4877,9 +4893,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -6482,11 +6498,11 @@ } }, "node_modules/react-router": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", - "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.19.0.tgz", + "integrity": "sha512-0W63PKCZ7+OuQd7Tm+RbkI8kCLmn4GPjDbX61tWljPxWgqTKlEpeQUwPkT1DRjYhF8KSihK0hQpmhU4uxVMcdw==", "dependencies": { - "@remix-run/router": "1.11.0" + "@remix-run/router": "1.12.0" }, "engines": { "node": ">=14.0.0" @@ -6496,12 +6512,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", - "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.19.0.tgz", + "integrity": "sha512-N6dWlcgL2w0U5HZUUqU2wlmOrSb3ighJmtQ438SWbhB1yuLTXQ8yyTBMK3BSvVjp7gBtKurT554nCtMOgxCZmQ==", "dependencies": { - "@remix-run/router": "1.11.0", - "react-router": "6.18.0" + "@remix-run/router": "1.12.0", + "react-router": "6.19.0" }, "engines": { "node": ">=14.0.0" From 260e24f68b44dc697ae32463ea9d8accfc728e77 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 06:49:24 -0500 Subject: [PATCH 144/182] Added Docker Compose docs --- docs/config.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index 2662a537..8dd99b3c 100644 --- a/docs/config.md +++ b/docs/config.md @@ -24,7 +24,7 @@ get a list of [command line options](#command-line-options). The most basic settings are `base-url` (the external URL of the ntfy server), the HTTP/HTTPS listen address (`listen-http` and `listen-https`), and socket path (`listen-unix`). All the other things are additional features. -Here are a few working sample configs: +Here are a few working sample configs using a `/etc/ntfy/server.yml` file: === "server.yml (HTTP-only, with cache + attachments)" ``` yaml @@ -73,6 +73,56 @@ Here are a few working sample configs: keepalive-interval: "45s" ``` +Alternatively, you can also use command line arguments or environment variables to configure the server. Here's an example +using Docker Compose (i.e. `docker-compose.yml`): + +=== "Docker Compose (w/ auth, cache, attachments)" + ``` yaml + version: '3' + services: + ntfy: + image: binwiederhier/ntfy + restart: unless-stopped + environment: + NTFY_BASE_URL: http://ntfy.example.com + NTFY_AUTH_FILE: /var/lib/ntfy/auth.db + NTFY_AUTH_DEFAULT_ACCESS: deny-all + NTFY_BEHIND_PROXY: true + NTFY_ATTACHMENT_CACHE_DIR: /var/lib/ntfy/attachments + NTFY_ENABLE_LOGIN: true + volumes: + - ./:/var/lib/ntfy + ports: + - 80:80 + command: serve + ``` + +=== "Docker Compose (w/ auth, cache, web push, iOS)" + ``` yaml + version: '3' + services: + ntfy: + image: binwiederhier/ntfy + restart: unless-stopped + environment: + NTFY_BASE_URL: http://ntfy.example.com + NTFY_AUTH_FILE: /var/lib/ntfy/auth.db + NTFY_AUTH_DEFAULT_ACCESS: deny-all + NTFY_BEHIND_PROXY: true + NTFY_ATTACHMENT_CACHE_DIR: /var/lib/ntfy/attachments + NTFY_ENABLE_LOGIN: true + NTFY_UPSTREAM_BASE_URL: https://ntfy.sh + NTFY_WEB_PUSH_PUBLIC_KEY: + NTFY_WEB_PUSH_PRIVATE_KEY: + NTFY_WEB_PUSH_FILE: /etc/ntfy/webpush.db + NTFY_WEB_PUSH_EMAIL_ADDRESS: + volumes: + - ./:/var/lib/ntfy + ports: + - 8093:80 + command: serve + ``` + ## Message cache If desired, ntfy can temporarily keep notifications in an in-memory or an on-disk cache. Caching messages for a short period of time is important to allow [phones](subscribe/phone.md) and other devices with brittle Internet connections to be able to retrieve From 6b82cb2b7a7664c55b5b3933900cb5f4ea7e37c1 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 06:55:52 -0500 Subject: [PATCH 145/182] cache file --- docs/config.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/config.md b/docs/config.md index 8dd99b3c..ec73a62d 100644 --- a/docs/config.md +++ b/docs/config.md @@ -85,6 +85,7 @@ using Docker Compose (i.e. `docker-compose.yml`): restart: unless-stopped environment: NTFY_BASE_URL: http://ntfy.example.com + NTFY_CACHE_FILE: /var/lib/ntfy/cache.db NTFY_AUTH_FILE: /var/lib/ntfy/auth.db NTFY_AUTH_DEFAULT_ACCESS: deny-all NTFY_BEHIND_PROXY: true @@ -106,6 +107,7 @@ using Docker Compose (i.e. `docker-compose.yml`): restart: unless-stopped environment: NTFY_BASE_URL: http://ntfy.example.com + NTFY_CACHE_FILE: /var/lib/ntfy/cache.db NTFY_AUTH_FILE: /var/lib/ntfy/auth.db NTFY_AUTH_DEFAULT_ACCESS: deny-all NTFY_BEHIND_PROXY: true From 75a2cb92365fced41a2990f200b73e59ce8fec7d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 09:08:49 -0500 Subject: [PATCH 146/182] A few links --- docs/integrations.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 18b95fd7..2dc4487d 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -135,7 +135,9 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [systemd-ntfy](https://hackage.haskell.org/package/systemd-ntfy) - monitor a set of systemd services an send a notification to ntfy.sh whenever their status changes - [RouterOS Scripts](https://git.eworm.de/cgit/routeros-scripts/about/) - a collection of scripts for MikroTik RouterOS - [ntfy-android-builder](https://github.com/TheBlusky/ntfy-android-builder) - Script for building ntfy-android with custom Firebase configuration (Docker/Shell) -- [jetspotter](https://github.com/vvanouytsel/jetspotter) - a tool to send notifications whenever specified types of aircraft are spotted near a specified location +- [jetspotter](https://github.com/vvanouytsel/jetspotter) - send notifications when planes are spotted near you (Go) +- [monitoring_ntfy](https://www.drupal.org/project/monitoring_ntfy) - Drupal monitoring Ntfy.sh integration (PHP/Drupal) +- [Notify](https://flathub.org/apps/com.ranfdev.Notify) - Native GTK4 client for ntfy (Rust) ## Blog + forum posts @@ -151,6 +153,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [How to install Ntfy.sh on Portainer / Docker Compose](https://www.youtube.com/watch?v=utD9GNbAwyg) - youtube.com - 9/2023 - [ntfy - Push-Benachrichtigungen // Push Notifications](https://www.youtube.com/watch?v=LE3vRPPqZOU) - youtube.com - 9/2023 - [Podman Update Notifications via Ntfy](https://rair.dev/podman-upadte-notifications-ntfy/) - rair.dev - 9/2023 +- [How to Send Alerts From Raspberry Pi Pico W to a Phone or Tablet](https://www.tomshardware.com/how-to/send-alerts-raspberry-pi-pico-w-to-mobile-device) - tomshardware.com - 8/2023 - [NetworkChunk - how did I NOT know about this?](https://www.youtube.com/watch?v=poDIT2ruQ9M) ⭐ - youtube.com - 8/2023 - [NTFY - Command-Line Notifications](https://academy.networkchuck.com/blog/ntfy/) - academy.networkchuck.com - 8/2023 - [Open Source Push Notifications! Get notified of any event you can imagine. Triggers abound!](https://www.youtube.com/watch?v=WJgwWXt79pE) ⭐ - youtube.com - 8/2023 From 2525ef71a9b842fe73ee2ec0ba86435dedae000b Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 16:42:04 -0500 Subject: [PATCH 147/182] Release notes --- docs/releases.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 7a9c8a28..c3c21eff 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,25 @@ Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases) and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases). +### ntfy server v2.8.0 +Released November 19, 2023 + +This release brings a handful of random bug fixes: two unrelated access control list fixes, a fix around web app crashes for languages with underscores in the language code (e.g. `zh_Hant`, `zh_Hans`, `pt_BR`, ...), a workaround for the `Priority` header (often used in Cloudflare setups), and support among others support for HTML-only emails (finally), web app crash fixes + +**Bug fixes + maintenance:** + +* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690)/[#693](https://github.com/binwiederhier/ntfy/pull/693), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) +* Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) +* Fix ACL issue with order of read/write rules ([#914](https://github.com/binwiederhier/ntfy/issues/914)/[#917](https://github.com/binwiederhier/ntfy/pull/917), thanks to [@sandman7920](https://github.com/sandman7920)) +* Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) +* Add special logic to ignore `Priority` header if it resembles an RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) +* PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) +* Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) + +**Additional languages:** + +* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/)) + ## ntfy server v2.7.0 Released August 17, 2023 @@ -1283,22 +1302,6 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet -### ntfy server v2.8.0 (UNRELEASED) - -**Bug fixes + maintenance:** - -* Support for HTML-only emails ([#690](https://github.com/binwiederhier/ntfy/issues/690)/[#693](https://github.com/binwiederhier/ntfy/pull/693), thanks to [@teastrainer](https://github.com/teastrainer) and [@CrazyWolf13](https://github.com/CrazyWolf13) for reporting) -* Fix ACL issue with topic patterns containing underscores ([#840](https://github.com/binwiederhier/ntfy/issues/840), thanks to [@Joe-0237](https://github.com/Joe-0237) for reporting) -* Fix ACL issue with order of read/write rules ([#914](https://github.com/binwiederhier/ntfy/issues/914)/[#917](https://github.com/binwiederhier/ntfy/pull/917), thanks to [@sandman7920](https://github.com/sandman7920)) -* Re-add `tzdata` to Docker images for amd64 image ([#894](https://github.com/binwiederhier/ntfy/issues/894), [#307](https://github.com/binwiederhier/ntfy/pull/307)) -* Add special logic to ignore `Priority` header if it resembles an RFC 9218 value ([#851](https://github.com/binwiederhier/ntfy/pull/851)/[#895](https://github.com/binwiederhier/ntfy/pull/895), thanks to [@gusdleon](https://github.com/gusdleon), see also [#351](https://github.com/binwiederhier/ntfy/issues/351), [#353](https://github.com/binwiederhier/ntfy/issues/353), [#461](https://github.com/binwiederhier/ntfy/issues/461)) -* PWA: hide install prompt on macOS 14 Safari ([#899](https://github.com/binwiederhier/ntfy/pull/899), thanks to [@nihalgonsalves](https://github.com/nihalgonsalves)) -* Fix web app crash in Edge for languages with underline in locale ([#922](https://github.com/binwiederhier/ntfy/pull/922)/[#912](https://github.com/binwiederhier/ntfy/issues/912)/[#852](https://github.com/binwiederhier/ntfy/issues/852), thanks to [@imkero](https://github.com/imkero)) - -**Additional languages:** - -* Finnish (thanks to [@Seppo](https://hosted.weblate.org/user/Seppo/)) - ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From aaa4976c7d10d54b0484d541816b465997e5521e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 19 Nov 2023 16:48:19 -0500 Subject: [PATCH 148/182] Install page --- docs/install.md | 60 ++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/install.md b/docs/install.md index c1a621d7..2777a3a4 100644 --- a/docs/install.md +++ b/docs/install.md @@ -30,37 +30,37 @@ deb/rpm packages. === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.tar.gz - tar zxvf ntfy_2.7.0_linux_amd64.tar.gz - sudo cp -a ntfy_2.7.0_linux_amd64/ntfy /usr/local/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_amd64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_amd64.tar.gz + tar zxvf ntfy_2.8.0_linux_amd64.tar.gz + sudo cp -a ntfy_2.8.0_linux_amd64/ntfy /usr/local/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.8.0_linux_amd64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.tar.gz - tar zxvf ntfy_2.7.0_linux_armv6.tar.gz - sudo cp -a ntfy_2.7.0_linux_armv6/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_armv6/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv6.tar.gz + tar zxvf ntfy_2.8.0_linux_armv6.tar.gz + sudo cp -a ntfy_2.8.0_linux_armv6/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.8.0_linux_armv6/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.tar.gz - tar zxvf ntfy_2.7.0_linux_armv7.tar.gz - sudo cp -a ntfy_2.7.0_linux_armv7/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_armv7/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv7.tar.gz + tar zxvf ntfy_2.8.0_linux_armv7.tar.gz + sudo cp -a ntfy_2.8.0_linux_armv7/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.8.0_linux_armv7/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.tar.gz - tar zxvf ntfy_2.7.0_linux_arm64.tar.gz - sudo cp -a ntfy_2.7.0_linux_arm64/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.7.0_linux_arm64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_arm64.tar.gz + tar zxvf ntfy_2.8.0_linux_arm64.tar.gz + sudo cp -a ntfy_2.8.0_linux_arm64/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.8.0_linux_arm64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` @@ -110,7 +110,7 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_amd64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -118,7 +118,7 @@ Manually installing the .deb file: === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv6.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -126,7 +126,7 @@ Manually installing the .deb file: === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv7.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -134,7 +134,7 @@ Manually installing the .deb file: === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_arm64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -144,28 +144,28 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_amd64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_amd64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv6" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv6.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv6.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv7/armhf" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_armv7.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_armv7.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "arm64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_linux_arm64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_linux_arm64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` @@ -195,18 +195,18 @@ NixOS also supports [declarative setup of the ntfy server](https://search.nixos. ## macOS The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. -To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_darwin_all.tar.gz), +To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_darwin_all.tar.gz), extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`). If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at `~/Library/Application Support/ntfy/client.yml` (sample included in the tarball). ```bash -curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_darwin_all.tar.gz > ntfy_2.7.0_darwin_all.tar.gz -tar zxvf ntfy_2.7.0_darwin_all.tar.gz -sudo cp -a ntfy_2.7.0_darwin_all/ntfy /usr/local/bin/ntfy +curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_darwin_all.tar.gz > ntfy_2.8.0_darwin_all.tar.gz +tar zxvf ntfy_2.8.0_darwin_all.tar.gz +sudo cp -a ntfy_2.8.0_darwin_all/ntfy /usr/local/bin/ntfy mkdir ~/Library/Application\ Support/ntfy -cp ntfy_2.7.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml +cp ntfy_2.8.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml ntfy --help ``` @@ -224,7 +224,7 @@ brew install ntfy ## Windows The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on Windows as well. -To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.7.0/ntfy_2.7.0_windows_amd64.zip), +To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.8.0/ntfy_2.8.0_windows_amd64.zip), extract it and place the `ntfy.exe` binary somewhere in your `%Path%`. The default path for the client config file is at `%AppData%\ntfy\client.yml` (not created automatically, sample in the ZIP file). From 141cbad5ad8a6c3cc0e6fc56bb38e5e898e73e72 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 22 Nov 2023 07:19:51 -0500 Subject: [PATCH 149/182] Thank you @ubipo for your sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d4c30ca0..0d6d08b3 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 4817e3394270a64c35e70f337345e76ef3dbb32b Mon Sep 17 00:00:00 2001 From: Caio Facchinato Date: Thu, 23 Nov 2023 04:00:10 +0000 Subject: [PATCH 150/182] Translated using Weblate (Portuguese (Brazil)) Currently translated at 74.3% (284 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 66 +++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 89a01d89..462456ce 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -219,5 +219,69 @@ "signup_already_have_account": "Já possui uma conta? Entrar!", "nav_upgrade_banner_label": "Atualizar para ntfy Pro", "account_basics_phone_numbers_dialog_description": "Para usar o recurso de notificação de chamada, é necessários adicionar e verificar pelo menos um número de telefone. A verificação pode ser feita por SMS ou chamada telefônica.", - "account_basics_phone_numbers_description": "Para notificações de chamada telefônica" + "account_basics_phone_numbers_description": "Para notificações de chamada telefônica", + "account_basics_tier_interval_monthly": "mensal", + "account_basics_tier_canceled_subscription": "Sua assinatura foi cancelada e será rebaixada para uma conta gratuita em {{date}}.", + "account_basics_password_dialog_current_password_incorrect": "Senha incorreta", + "account_basics_phone_numbers_dialog_number_label": "Número de telefone", + "account_basics_password_dialog_button_submit": "Alterar senha", + "reserve_dialog_checkbox_label": "Guardar tópico e configurar acesso", + "account_basics_username_title": "Nome de usuário", + "account_basics_phone_numbers_dialog_check_verification_button": "Confirmar código", + "account_usage_attachment_storage_title": "Armazenamento de anexos", + "account_usage_messages_title": "Mensagens publicadas", + "account_basics_phone_numbers_dialog_verify_button_sms": "Enviar SMS", + "account_basics_tier_change_button": "Mudar", + "account_basics_tier_admin_suffix_with_tier": "(com nível {{tier}})", + "account_basics_title": "Conta", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ainda não há números de telefone", + "subscribe_dialog_subscribe_button_generate_topic_name": "Gerar nome", + "display_name_dialog_description": "Defina um nome alternativo para o tópico exibido na lista de inscrições. Isso pode ajudar a identificar mais facilmente tópicos com nomes complicados.", + "publish_dialog_chip_call_label": "Chamada telefônica", + "account_basics_phone_numbers_dialog_title": "Adicionar número de telefone", + "account_basics_username_admin_tooltip": "Você é Administrador", + "account_usage_reservations_none": "Nenhum tópico reservado para esta conta", + "account_usage_title": "Uso", + "account_basics_tier_upgrade_button": "Atualizar para Pro", + "subscribe_dialog_error_topic_already_reserved": "Tópico já reservado", + "account_basics_tier_admin_suffix_no_tier": "(sem nível)", + "account_basics_tier_payment_overdue": "O teu pagamento está atrasado. Por favor, atualize seu método de pagamento, ou sua conta será rebaixada em breve.", + "account_basics_tier_description": "Nível de poder da sua conta", + "account_basics_tier_free": "Grátis", + "account_basics_tier_admin": "Administrador", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Nenhum número de telefone verificado", + "account_basics_password_description": "Alterar a senha da sua conta", + "publish_dialog_call_label": "Chamada telefônica", + "account_usage_calls_title": "Chamadas de telefone feitas", + "account_basics_tier_basic": "Básico", + "alert_not_supported_context_description": "Notificações são suportadas apenas através de HTTPS. Esta é uma limitação da API de Notificações.", + "account_basics_phone_numbers_copied_to_clipboard": "Número de telefone copiado para a área de transferência", + "account_basics_tier_title": "Tipo de conta", + "account_basics_phone_numbers_dialog_number_placeholder": "ex. +1222333444", + "account_basics_phone_numbers_dialog_code_placeholder": "ex. 123456", + "account_basics_tier_manage_billing_button": "Gerenciar faturamento", + "account_basics_username_description": "Ei, é você ❤", + "account_basics_password_dialog_confirm_password_label": "Confirmar senha", + "account_basics_tier_interval_yearly": "anual", + "account_basics_phone_numbers_dialog_channel_call": "Ligar", + "account_basics_password_title": "Senha", + "account_basics_password_dialog_new_password_label": "Nova senha", + "display_name_dialog_placeholder": "Nome de exibição", + "account_usage_of_limit": "de {{limit}}", + "account_basics_password_dialog_title": "Alterar senha", + "account_usage_limits_reset_daily": "Os limites de uso são redefinidos diariamente à meia-noite (UTC)", + "account_usage_unlimited": "Ilimitado", + "account_basics_password_dialog_current_password_label": "Senha atual", + "account_usage_reservations_title": "Tópicos reservados", + "account_usage_calls_none": "Nenhum telefonema pode ser feito com esta conta", + "display_name_dialog_title": "Alterar o nome de exibição", + "nav_upgrade_banner_description": "Guarde tópicos, mais mensagens & emails e anexos grandes", + "publish_dialog_call_reset": "Remover chamada telefônica", + "account_basics_phone_numbers_dialog_code_label": "Código de verificação", + "account_basics_tier_paid_until": "Assinatura paga até {{date}}, será renovada automaticamente", + "account_usage_attachment_storage_description": "{{filesize}} por arquivo, excluído após {{expiry}}", + "account_basics_phone_numbers_dialog_verify_button_call": "Ligar pra mim", + "publish_dialog_call_item": "Ligue para o número de telefone {{number}}", + "account_usage_emails_title": "Emails enviados", + "account_basics_phone_numbers_dialog_channel_sms": "SMS" } From 87bcf59bd44c089349f9d3ad52ba854dcf810214 Mon Sep 17 00:00:00 2001 From: Cao Mingjun Date: Fri, 24 Nov 2023 14:00:16 +0000 Subject: [PATCH 151/182] Update docker-dev go version --- Dockerfile-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile-build b/Dockerfile-build index a0608b12..cd03a2ff 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -1,4 +1,4 @@ -FROM golang:1.20-bullseye as builder +FROM golang:1.21-bullseye as builder ARG VERSION=dev ARG COMMIT=unknown From a2b56154a7a16a17e4182c99adf28abb31518c37 Mon Sep 17 00:00:00 2001 From: wunter8 Date: Mon, 27 Nov 2023 06:33:33 -0700 Subject: [PATCH 152/182] Update docker compose example Noticed that this wasn't consistent with the other paths --- docs/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index ec73a62d..453e3cfe 100644 --- a/docs/config.md +++ b/docs/config.md @@ -116,7 +116,7 @@ using Docker Compose (i.e. `docker-compose.yml`): NTFY_UPSTREAM_BASE_URL: https://ntfy.sh NTFY_WEB_PUSH_PUBLIC_KEY: NTFY_WEB_PUSH_PRIVATE_KEY: - NTFY_WEB_PUSH_FILE: /etc/ntfy/webpush.db + NTFY_WEB_PUSH_FILE: /var/lib/ntfy/webpush.db NTFY_WEB_PUSH_EMAIL_ADDRESS: volumes: - ./:/var/lib/ntfy From 154e3945c90199a276b5544f38e001d25c8a2cbb Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 27 Nov 2023 21:56:22 -0500 Subject: [PATCH 153/182] Release notes --- docs/releases.md | 11 +++++++++++ mkdocs.yml | 47 ++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index c3c21eff..99bca6ca 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,17 @@ Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases) and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases). +## ntfy iOS app v1.3 +Released Nov 26, 2023 + +This release (hopefully) fixes the issues with the iOS UI not updating properly when new notifications arrive, as well as notifications not being received (anymore) after previously working. Both issues have been annoying and known bugs for a long time, and I hope that they are finally fixed. + +Many thanks to [@tcaputi](https://github.com/tcaputi) for fixing the issues, and to the anonymous donor for sponsoring these fixes. + +**Bug fixes:** + +* UI not updating properly ([#267](https://github.com/binwiederhier/ntfy/issues/267)/[#402](https://github.com/binwiederhier/ntfy/issues/402), thanks to [@tcaputi](https://github.com/tcaputi)) + ### ntfy server v2.8.0 Released November 19, 2023 diff --git a/mkdocs.yml b/mkdocs.yml index 98a2d078..bf0482aa 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -64,6 +64,7 @@ markdown_extensions: - attr_list - md_in_html - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:materialx.emoji.to_svg plugins: @@ -75,28 +76,28 @@ plugins: on_post_build: "docs.hooks:copy_fonts" nav: -- "Getting started": index.md -- "Publishing": - - "Sending messages": publish.md -- "Subscribing": - - "From your phone": subscribe/phone.md - - "From the Web app": subscribe/web.md - - "From the Desktop": subscribe/pwa.md - - "From the CLI": subscribe/cli.md - - "Using the API": subscribe/api.md -- "Self-hosting": - - "Installation": install.md - - "Configuration": config.md -- "Other things": - - "FAQs": faq.md - - "Examples": examples.md - - "Integrations + projects": integrations.md - - "Release notes": releases.md - - "Emojis 🥳 🎉": emojis.md - - "Troubleshooting": troubleshooting.md - - "Known issues": known-issues.md - - "Deprecation notices": deprecations.md - - "Development": develop.md - - "Privacy policy": privacy.md + - "Getting started": index.md + - "Publishing": + - "Sending messages": publish.md + - "Subscribing": + - "From your phone": subscribe/phone.md + - "From the Web app": subscribe/web.md + - "From the Desktop": subscribe/pwa.md + - "From the CLI": subscribe/cli.md + - "Using the API": subscribe/api.md + - "Self-hosting": + - "Installation": install.md + - "Configuration": config.md + - "Other things": + - "FAQs": faq.md + - "Examples": examples.md + - "Integrations + projects": integrations.md + - "Release notes": releases.md + - "Emojis 🥳 🎉": emojis.md + - "Troubleshooting": troubleshooting.md + - "Known issues": known-issues.md + - "Deprecation notices": deprecations.md + - "Development": develop.md + - "Privacy policy": privacy.md From aaf53d5d3f0e76c342e0c92a6b12998ebc0523ab Mon Sep 17 00:00:00 2001 From: ksurl Date: Thu, 30 Nov 2023 00:18:24 +0000 Subject: [PATCH 154/182] add auth token url format --- docs/examples.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 4e936d91..72a7feea 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -170,6 +170,12 @@ Or, if you only want to send notifications using shoutrrr: shoutrrr send -u "ntfy://ntfy.sh/my_watchtower_topic?title=WatchtowerUpdates" -m "testMessage" ``` +Authentication tokens are also supported via the generic webhook and authorization header using this url format (replace the domain, topic and token with your own): + +``` +generic+https://ntfy.mydomain.com/my_watchtower_topic?@authorization=Bearer+token` +``` + ## Sonarr, Radarr, Lidarr, Readarr, Prowlarr, SABnzbd From 0f44d20da526826609df1f43a1cd71e4c826ea23 Mon Sep 17 00:00:00 2001 From: ksurl Date: Thu, 30 Nov 2023 00:21:11 +0000 Subject: [PATCH 155/182] clean up --- docs/examples.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples.md b/docs/examples.md index 72a7feea..18ca3f2a 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -173,7 +173,7 @@ shoutrrr send -u "ntfy://ntfy.sh/my_watchtower_topic?title=WatchtowerUpdates" -m Authentication tokens are also supported via the generic webhook and authorization header using this url format (replace the domain, topic and token with your own): ``` -generic+https://ntfy.mydomain.com/my_watchtower_topic?@authorization=Bearer+token` +generic+https://DOMAIN/TOPIC?@authorization=Bearer+TOKEN` ``` ## Sonarr, Radarr, Lidarr, Readarr, Prowlarr, SABnzbd From f2d6f09671be69ce533343d93136e876a720945d Mon Sep 17 00:00:00 2001 From: Adam Rahja Date: Thu, 30 Nov 2023 08:08:52 -0600 Subject: [PATCH 156/182] Added non-root user to docker images. This gives you the ability to run ntfy as a non-root user. resolves #966 --- Dockerfile | 3 ++- Dockerfile-arm | 1 + Dockerfile-build | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 45dad05d..154a98ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,8 @@ LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" -RUN apk add --no-cache tzdata +RUN apk add --no-cache tzdata \ + && adduser -D -u 1000 ntfy COPY ntfy /usr/bin EXPOSE 80/tcp diff --git a/Dockerfile-arm b/Dockerfile-arm index 755092fd..05b56fb1 100644 --- a/Dockerfile-arm +++ b/Dockerfile-arm @@ -12,6 +12,7 @@ LABEL org.opencontainers.image.description="Send push notifications to your phon # Alpine does not support adding "tzdata" on ARM anymore, see # https://github.com/binwiederhier/ntfy/issues/894 +RUN adduser -D -u 1000 ntfy COPY ntfy /usr/bin EXPOSE 80/tcp diff --git a/Dockerfile-build b/Dockerfile-build index cd03a2ff..f454284b 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -53,6 +53,7 @@ LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" +RUN adduser -D -u 1000 ntfy COPY --from=builder /app/dist/ntfy_linux_server/ntfy /usr/bin/ntfy EXPOSE 80/tcp From d207f3ca2687685f36ebf92c27c4d759c3c3a4f5 Mon Sep 17 00:00:00 2001 From: Piotr Icikowski Date: Sat, 2 Dec 2023 22:07:28 +0000 Subject: [PATCH 157/182] Translated using Weblate (Polish) Currently translated at 91.8% (351 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pl/ --- web/public/static/langs/pl.json | 40 ++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pl.json b/web/public/static/langs/pl.json index 9dea2b8a..aec5df68 100644 --- a/web/public/static/langs/pl.json +++ b/web/public/static/langs/pl.json @@ -317,5 +317,43 @@ "account_upgrade_dialog_tier_features_emails_many": "{{emails}} maili dziennie", "account_upgrade_dialog_tier_features_messages_one": "{{messages}} wiadomość dziennie", "account_upgrade_dialog_tier_features_messages_few": "{{messages}} wiadomości dziennie", - "account_upgrade_dialog_tier_features_messages_many": "{{messages}} wiadomości dziennie" + "account_upgrade_dialog_tier_features_messages_many": "{{messages}} wiadomości dziennie", + "account_upgrade_dialog_tier_features_no_calls": "Brak połączeń telefonicznych", + "account_upgrade_dialog_tier_features_calls_one": "Dzienne rozmowy telefoniczne: {{calls}}", + "account_upgrade_dialog_tier_current_label": "Bieżące", + "account_basics_phone_numbers_dialog_number_label": "Numer telefonu", + "account_basics_phone_numbers_dialog_check_verification_button": "Potwierdź kod", + "account_upgrade_dialog_proration_info": "Proporcja: Przy ulepszaniu pomiędzy płatnymi planami, różnica ceny będzie pobrana natychmiast. Przy obniżaniu planu do niższych planów, środki zostaną użyte do rozliczenia przyszłych okresów subskrypcji.", + "account_upgrade_dialog_tier_features_emails_other": "Dzienne wiadomości e-mail: {{emails}}", + "account_upgrade_dialog_tier_features_calls_other": "Dzienne rozmowy telefoniczne: {{calls}}", + "account_basics_phone_numbers_dialog_verify_button_sms": "Wyślij SMS", + "account_tokens_dialog_expires_never": "Token nigdy nie wygasa", + "account_tokens_dialog_expires_x_days": "Token wygasa za {{days}} dni", + "account_basics_phone_numbers_dialog_description": "Aby używać funkcji powiadomień telefonicznych, musisz dodać i zweryfikować no najmniej jeden numer telefonu. Weryfikacja może być dokonana przez SMS lub połączenie telefoniczne.", + "account_upgrade_dialog_tier_features_messages_other": "Dzienne wiadomości: {{messages}}", + "account_basics_phone_numbers_no_phone_numbers_yet": "Brak numerów telefonów", + "account_tokens_delete_dialog_title": "Usuń token dostępu", + "publish_dialog_chip_call_label": "Rozmowa telefoniczna", + "account_basics_phone_numbers_dialog_title": "Dodaj numer telefonu", + "account_upgrade_dialog_tier_features_reservations_other": "Zarezerwowane tematy: {{reservations}}", + "account_upgrade_dialog_reservations_warning_one": "Wybrany plan zezwala na mniejszą liczbę zarezerwowanych tematów niż obecny. Przed zmianą planu, usuń co najmniej jedną rezerwację. Rezerwacje możesz usunąć w Ustawieniach.", + "account_basics_phone_numbers_description": "Dla powiadomień telefonicznych", + "account_upgrade_dialog_cancel_warning": "To anuluje Twoją subskrypcję i obniży status Twojego konta {{date}}. Tego dnia rezerwacja tematów oraz wiadomości przechowywane na serwerze zostaną usunięte.", + "account_tokens_dialog_expires_x_hours": "Token wygasa za {{hours}} godzin(y)", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Brak zweryfikowanych numerów telefonów", + "publish_dialog_call_label": "Rozmowa telefoniczna", + "account_usage_calls_title": "Wykonane połączenia telefoniczne", + "account_basics_phone_numbers_copied_to_clipboard": "Numer telefonu skopiowany do schowka", + "account_basics_phone_numbers_dialog_number_placeholder": "np. +1222333444", + "account_basics_phone_numbers_dialog_code_placeholder": "np. 123456", + "account_basics_phone_numbers_dialog_channel_call": "Zadzwoń", + "account_basics_phone_numbers_title": "Numery telefonów", + "account_usage_calls_none": "Nie wykonano żadnych połączeń z tego konta", + "publish_dialog_call_reset": "Usuń rozmowę telefoniczną", + "account_basics_phone_numbers_dialog_code_label": "Kod weryfikacyjny", + "account_basics_phone_numbers_dialog_verify_button_call": "Zadzwoń do mnie", + "publish_dialog_call_item": "Zadzwoń pod numer {{number}}", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_upgrade_dialog_tier_selected_label": "Wybrane", + "account_upgrade_dialog_reservations_warning_other": "Wybrany plan zezwala na mniejszą liczbę zarezerwowanych tematów niż obecny. Przed zmianą planu, usuń co najmniej tyle rezerwacji: {{count}}. Rezerwacje możesz usunąć w Ustawieniach." } From 1f4a0601f870da09a2caf9eea3cd5491c35268cc Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 4 Dec 2023 13:25:50 -0500 Subject: [PATCH 158/182] Thank you @tka85 for your generous donation! --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0d6d08b3..563a1f26 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 518505fa9d5d7c330e45feab542b57576f6c010d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 4 Dec 2023 13:27:33 -0500 Subject: [PATCH 159/182] Thank you @beekeeb for your generous sponsorship --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 563a1f26..f91fd1c2 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,7 @@ account costs. Even small donations are very much appreciated. A big fat **Thank + I'd also like to thank JetBrains for their awesome [IntelliJ IDEA](https://www.jetbrains.com/idea/), and [DigitalOcean](https://m.do.co/c/442b929528db) (*referral link*) for supporting the project: From 1e306e08c98c384901d93393dc810885b3dd0e34 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Wed, 6 Dec 2023 04:47:20 +0000 Subject: [PATCH 160/182] Translated using Weblate (Bulgarian) Currently translated at 88.2% (337 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index d3b73449..e1e447e1 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -333,5 +333,7 @@ "account_upgrade_dialog_button_pay_now": "Плащане и абониране", "account_upgrade_dialog_tier_selected_label": "Избрано", "account_upgrade_dialog_button_update_subscription": "Премяна на абонамент", - "account_upgrade_dialog_reservations_warning_other": "Избраното ниво разрешава по-малко резервирани теми, от колкото текущото. Преди промяна на нивото изтрийте най-малко {{count}} резервирани теми. Можете да премахвате теми в Настройки." + "account_upgrade_dialog_reservations_warning_other": "Избраното ниво разрешава по-малко резервирани теми, от колкото текущото. Преди промяна на нивото изтрийте най-малко {{count}} резервирани теми. Можете да премахвате теми в Настройки.", + "account_tokens_table_expires_header": "Изтича", + "account_tokens_table_never_expires": "Никога" } From f350b81da47eec9231a4b9072db6fbfe89b90f32 Mon Sep 17 00:00:00 2001 From: Timothy Redaelli Date: Sat, 9 Dec 2023 01:20:48 +0100 Subject: [PATCH 161/182] Fix typo in it.json --- web/public/static/langs/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 807689a8..fa31ee32 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -189,7 +189,7 @@ "prefs_notifications_delete_after_three_hours_description": "Le notifiche vengono eliminate automaticamente dopo tre ore", "error_boundary_unsupported_indexeddb_description": "L'app web ntfy ha bisogno di IndexedDB per funzionare e il tuo browser non supporta IndexedDB in modalità di navigazione privata.

Anche se questo è un peccato, non ha molto senso usare il web ntfy app in modalità di navigazione privata comunque, perché tutto è archiviato nella memoria del browser. Puoi leggere di più a riguardo in questo numero di GitHub o parlarci su Discord o Matrix.", "nav_upgrade_banner_label": "Passa alla versione Pro di ntfy", - "alert_not_supported_context_description": "Le Notificche sono supportate solo tramite HTTPS. Questa è una limitazione delle Notifications API.", + "alert_not_supported_context_description": "Le Notifiche sono supportate solo tramite HTTPS. Questa è una limitazione delle Notifications API.", "account_basics_password_dialog_new_password_label": "Nuova password", "action_bar_profile_logout": "Esci", "account_basics_tier_interval_monthly": "mensile", From 49168062983f986aab4c8dcec95e25e8c9856384 Mon Sep 17 00:00:00 2001 From: M G Date: Sun, 10 Dec 2023 19:26:48 +0100 Subject: [PATCH 162/182] Added translation using Weblate (Esperanto) --- web/public/static/langs/eo.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/eo.json diff --git a/web/public/static/langs/eo.json b/web/public/static/langs/eo.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/eo.json @@ -0,0 +1 @@ +{} From 99c03b0e83bfc070e5d0b68f8ae4b9011930e5b2 Mon Sep 17 00:00:00 2001 From: Panda Date: Tue, 12 Dec 2023 22:18:15 +0000 Subject: [PATCH 163/182] Translated using Weblate (Danish) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/da/ --- web/public/static/langs/da.json | 107 +++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/da.json b/web/public/static/langs/da.json index c7477dfc..8e92a996 100644 --- a/web/public/static/langs/da.json +++ b/web/public/static/langs/da.json @@ -35,7 +35,7 @@ "action_bar_sign_up": "Opret konto", "message_bar_type_message": "Skriv en besked her", "nav_button_settings": "Indstillinger", - "message_bar_publish": "Offentliggør besked", + "message_bar_publish": "Udgiv besked", "nav_topics_title": "Tilmeldte emner", "nav_button_all_notifications": "Alle notifikationer", "nav_button_connecting": "forbinder", @@ -103,7 +103,7 @@ "account_basics_tier_free": "Gratis", "account_basics_tier_admin_suffix_no_tier": "(intet niveau)", "account_basics_tier_admin_suffix_with_tier": "(med {{tier}}} niveau)", - "account_usage_messages_title": "Offentliggjorte meddelelser", + "account_usage_messages_title": "Udgivne beskeder", "account_delete_dialog_button_submit": "Slet konto permanent", "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} pr. fil", "account_upgrade_dialog_button_redirect_signup": "Tilmeld dig nu", @@ -279,5 +279,106 @@ "reservation_delete_dialog_action_keep_title": "Behold cachelagrede meddelelser og vedhæftede filer", "reservation_delete_dialog_action_delete_title": "Slet cachelagrede meddelelser og vedhæftede filer", "error_boundary_title": "Oh nej, ntfy brød sammen", - "error_boundary_description": "Dette bør naturligvis ikke ske. Det beklager vi meget.
Hvis du har et øjeblik, bedes du rapportere dette på GitHub, eller give os besked via Discord eller Matrix." + "error_boundary_description": "Dette bør naturligvis ikke ske. Det beklager vi meget.
Hvis du har et øjeblik, bedes du rapportere dette på GitHub, eller give os besked via Discord eller Matrix.", + "account_upgrade_dialog_tier_features_no_calls": "Ingen telefonopkald", + "account_upgrade_dialog_billing_contact_email": "For faktureringsspørgsmål bedes du kontakte os direkte.", + "account_basics_tier_interval_monthly": "månedlig", + "publish_dialog_checkbox_publish_another": "Udgiv en anden", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} daglige telefonopkald", + "publish_dialog_filename_placeholder": "Vedhæftet filnavn", + "prefs_users_description": "Tilføj/fjern brugere til dine beskyttede emner her. Vær opmærksom på, at brugernavn og adgangskode er gemt i browserens lokale lager.", + "account_basics_phone_numbers_dialog_number_label": "Telefonnummer", + "subscribe_dialog_subscribe_description": "Emner kan ikke beskyttes med adgangskode, så vælg et navn, der ikke er let at gætte. Når du har abonneret, kan du PUT/POST notifikationer.", + "account_basics_phone_numbers_dialog_check_verification_button": "Bekræft kode", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "spar op til {{discount}}%", + "account_upgrade_dialog_proration_info": "Proration: Når du opgraderer mellem betalte planer, vil prisforskellen blive opkrævet med det samme. Ved nedgradering til et lavere niveau, vil saldoen blive brugt til at betale for fremtidige faktureringsperioder.", + "account_usage_attachment_storage_title": "opbevaring af vedhæftede filer", + "message_bar_error_publishing": "Der opstod en fejl under udgivelse af meddelelse", + "publish_dialog_chip_delay_label": "Forsinke leveringen", + "prefs_reservations_table_not_subscribed": "Ikke abonneret", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} daglige telefonopkald", + "account_basics_phone_numbers_dialog_verify_button_sms": "Send SMS", + "prefs_reservations_table_everyone_read_only": "Jeg kan udgive og abonnere, alle kan abonnere", + "prefs_reservations_table_everyone_deny_all": "Kun jeg kan udgive og abonnere", + "publish_dialog_chip_topic_label": "Skift emne", + "account_basics_phone_numbers_dialog_description": "For at bruge opkaldsmeddelelsesfunktionen skal du tilføje og bekræfte mindst ét telefonnummer. Bekræftelse kan gøres via SMS eller et telefonopkald.", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} reserveret emne", + "account_upgrade_dialog_tier_features_no_reservations": "Ingen reserverede emner", + "publish_dialog_base_url_label": "Tjeneste-URL", + "prefs_users_table_cannot_delete_or_edit": "Kan ikke slette eller redigere en aktiv bruger", + "publish_dialog_title_no_topic": "Udgiv notifikation", + "publish_dialog_attach_label": "URL til vedhæftede filer", + "nav_button_muted": "Notifikationer slået fra", + "prefs_notifications_min_priority_description_x_or_higher": "Vis notifikationer hvis prioritet er {{number}} ({{name}}) eller højere", + "reservation_delete_dialog_description": "Fjernelse af en reservation opgiver ejerskabet over emnet og giver andre mulighed for at reservere det. Du kan beholde eller slette eksisterende beskeder og vedhæftede filer.", + "prefs_reservations_table_everyone_read_write": "Alle kan udgive og abonnere", + "account_upgrade_dialog_interval_monthly": "månedlig", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ingen telefonnumre endnu", + "notifications_no_subscriptions_description": "Klik på linket \"{{linktext}}\" for at oprette eller abonnere på et emne. Derefter kan du sende beskeder via PUT eller POST, og du vil modtage notifikationer her.", + "publish_dialog_message_published": "Notifikation udgivet", + "publish_dialog_chip_call_label": "Telefon opkald", + "account_basics_phone_numbers_dialog_title": "Tilføj telefonnummer", + "account_tokens_delete_dialog_description": "Før du sletter et adgangstoken, skal du sikre dig, at ingen programmer eller scripts aktivt bruger det. Denne handling kan ikke fortrydes.", + "account_upgrade_dialog_billing_contact_website": "For spørgsmål om fakturering, se venligst vores hjemmeside.", + "account_usage_reservations_none": "Ingen reserverede emner til denne konto", + "account_tokens_description": "Brug adgangstokens, når du udgiver og abonnerer via ntfy API, så du ikke behøver at sende dine kontooplysninger. Tjek dokumentationen for at få mere at vide.", + "prefs_reservations_table": "Reserverede emner tabel", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} daglig e-mail", + "prefs_reservations_description": "Her kan du reservere emnenavne til personlig brug. Reservering af et emne giver dig ejerskab over emnet og giver dig mulighed for at definere adgangstilladelser for andre brugere over emnet.", + "prefs_users_description_no_sync": "Brugere og adgangskoder er ikke synkroniseret til din konto.", + "nav_button_publish_message": "Udgiv notifikation", + "prefs_users_table_base_url_header": "Tjeneste-URL", + "publish_dialog_attach_reset": "Fjern URL til vedhæftede filer", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} daglig besked", + "account_upgrade_dialog_reservations_warning_one": "Det valgte niveau tillader færre reserverede emner end dit nuværende niveau. Før du ændrer dit niveau, slet venligst mindst én reservation. Du kan fjerne reservationer i Indstillinger.", + "error_boundary_unsupported_indexeddb_description": "ntfy-webappen har brug for IndexedDB for at fungere, og din browser understøtter ikke IndexedDB i privat browsing-tilstand.

Selv om dette er uheldigt, giver det heller ikke ret meget mening at bruge ntfy-webappen i privat browsing-tilstand alligevel, fordi alt er gemt i browserens lager. Du kan læse mere om det i dette GitHub issue, eller tale med os på Discord eller Matrix.", + "publish_dialog_title_placeholder": "Notifikationstitel, f.eks. Advarsel om diskplads", + "account_basics_tier_description": "Din kontos niveau", + "account_basics_phone_numbers_description": "For notifikationer via telefonopkald", + "account_upgrade_dialog_cancel_warning": "Dette vil annullere dit abonnement og nedgradere din konto den {{date}}. På den dato slettes emnereservationer samt meddelelser, der er gemt på serveren.", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Ingen verificerede telefonnumre", + "publish_dialog_call_label": "Telefon opkald", + "account_usage_calls_title": "Telefonopkald foretaget", + "prefs_notifications_min_priority_description_any": "Viser alle notifikationer, uanset prioritet", + "error_boundary_gathering_info": "Indsaml mere info…", + "reservation_delete_dialog_action_keep_description": "Beskeder og vedhæftede filer, der er cachelagret på serveren, bliver offentligt synlige for personer med kendskab til emnenavnet.", + "account_basics_phone_numbers_copied_to_clipboard": "Telefonnummer kopieret til udklipsholder", + "prefs_reservations_dialog_description": "Reservering af et emne giver dig ejerskab over emnet og giver dig mulighed for at definere adgangstilladelser for andre brugere over emnet.", + "publish_dialog_title_topic": "Udgiv til {{topic}}", + "account_basics_phone_numbers_dialog_number_placeholder": "f.eks. +4512345678", + "account_basics_phone_numbers_dialog_code_placeholder": "f.eks. 123456", + "account_basics_username_description": "Hej, der er du ❤", + "publish_dialog_base_url_placeholder": "Tjeneste-URL, f.eks. https://example.com", + "account_basics_tier_interval_yearly": "årligt", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} årligt. Faktureres månedligt.", + "account_basics_phone_numbers_dialog_channel_call": "Opkald", + "publish_dialog_attachment_limits_file_and_quota_reached": "overskrider filgrænsen og kvoten på {{fileSizeLimit}}, {{remainingBytes}} tilbage", + "account_upgrade_dialog_interval_yearly": "årligt", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} faktureres årligt. Spar {{save}}.", + "account_usage_basis_ip_description": "Brugsstatistikker og begrænsninger for denne konto er baseret på din IP-adresse, så de kan være delt med andre brugere. Ovenstående grænser er omtrentlige baseret på de eksisterende hastigheds grænser.", + "account_basics_password_dialog_title": "Skift kodeord", + "account_basics_phone_numbers_title": "Telefonnumre", + "account_upgrade_dialog_interval_yearly_discount_save": "spar {{discount}}%", + "publish_dialog_drop_file_here": "Smid filen her", + "prefs_reservations_table_everyone_write_only": "Jeg kan udgive og abonnere, alle kan udgive", + "account_tokens_table_cannot_delete_or_edit": "Kan ikke redigere eller slette nuværende sessionstoken", + "publish_dialog_attached_file_filename_placeholder": "Vedhæftet filnavn", + "subscribe_dialog_subscribe_base_url_label": "Tjeneste-URL", + "account_upgrade_dialog_tier_price_per_month": "måned", + "message_bar_show_dialog": "Vis udgivelsesdialogen", + "account_usage_calls_none": "Der kan ikke foretages telefonopkald med denne konto", + "nav_upgrade_banner_description": "Reserver emner, flere beskeder og e-mails og større vedhæftede filer", + "publish_dialog_call_reset": "Fjern telefon opkald", + "account_basics_phone_numbers_dialog_code_label": "Verifikationskode", + "reservation_delete_dialog_action_delete_description": "Cachelagrede beskeder og vedhæftede filer slettes permanent. Denne handling kan ikke fortrydes.", + "alert_grant_button": "Tillad nu", + "account_usage_attachment_storage_description": "{{filesize}} pr. fil, slettet efter {{expiry}}", + "publish_dialog_chip_click_label": "Klik på URL", + "account_basics_phone_numbers_dialog_verify_button_call": "Ring til mig", + "publish_dialog_call_item": "Ring til tlf. {{number}}", + "prefs_users_dialog_base_url_label": "Tjeneste-URL, f.eks. https://ntfy.sh", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_delete_dialog_billing_warning": "Hvis du sletter din konto, så annulleres dit abonnement med det samme. Du vil ikke længere have adgang til faktureringspanelet.", + "prefs_notifications_min_priority_description_max": "Vis notifikationer, hvis prioritet er 5 (maks.)", + "account_upgrade_dialog_reservations_warning_other": "Det valgte niveau tillader færre reserverede emner end dit nuværende niveau. Før du ændrer dit niveau, slet venligst mindst {{count}} reservationer. Du kan fjerne reservationer i Indstillinger." } From 1383b4106220446de36cea420dc05a43e2fc8c05 Mon Sep 17 00:00:00 2001 From: tinect Date: Fri, 29 Dec 2023 00:08:56 +0000 Subject: [PATCH 164/182] Translated using Weblate (German) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 4af63501..3fba87f3 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -217,7 +217,7 @@ "signup_form_password": "Kennwort", "signup_form_toggle_password_visibility": "Kennwort-Sichtbarkeit umschalten", "nav_button_account": "Konto", - "nav_upgrade_banner_description": "Themen reservieren, mehr Nachrichten & Emails, größere Anhänge", + "nav_upgrade_banner_description": "Themen reservieren, mehr Nachrichten & E-Mails und größere Anhänge", "display_name_dialog_title": "Anzeigennamen ändern", "display_name_dialog_placeholder": "Anzeigename", "reserve_dialog_checkbox_label": "Thema reservieren und Zugriffsrechte konfigurieren", From 80861d33b4437cc68f7f896e3d2d9c430350554f Mon Sep 17 00:00:00 2001 From: tinect Date: Fri, 29 Dec 2023 00:25:18 +0000 Subject: [PATCH 165/182] Translated using Weblate (German) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 3fba87f3..608a9b7c 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -25,7 +25,7 @@ "notifications_click_copy_url_title": "Link-URL in Zwischenablage kopieren", "publish_dialog_priority_low": "Niedrige Priorität", "publish_dialog_message_label": "Nachricht", - "action_bar_unsubscribe": "Abmelden", + "action_bar_unsubscribe": "Abbestellen", "notifications_copied_to_clipboard": "In Zwischenablage kopiert", "notifications_loading": "Benachrichtigungen werden geladen …", "notifications_attachment_open_title": "Gehe zu {{url}}", @@ -82,7 +82,7 @@ "publish_dialog_attach_placeholder": "Datei von URL anhängen, z.B. https://f-droid.org/F-Droid.apk", "publish_dialog_filename_placeholder": "Dateiname des Anhangs", "publish_dialog_delay_label": "Verzögerung", - "publish_dialog_email_placeholder": "E-Mail-Adresse, an welche die Benachrichtigung gesendet werden soll, z. B. phil@example.com", + "publish_dialog_email_placeholder": "E-Mail-Adresse, an welche die Benachrichtigung gesendet werden soll, z.B. phil@example.com", "publish_dialog_chip_click_label": "Klick-URL", "publish_dialog_button_cancel_sending": "Senden abbrechen", "publish_dialog_drop_file_here": "Datei hierher ziehen", @@ -180,7 +180,7 @@ "error_boundary_unsupported_indexeddb_description": "Die ntfy Web-App benötigt eine IndexedDB für eine korrekte Funktion, und Dein Browser unterstützt in privaten Tabs keinen IndexedDB.

Das ist zwar ärgerlich, eine Nutzung von ntfy in einem privaten Tab macht aber auch wenig Sinn da alle Daten im Browser gespeichert werden. Weitere Informationen gibt es in diesem GitHub-Issue, oder im Chat bei Discord oder Matrix.", "action_bar_toggle_action_menu": "Aktionsmenü öffnen/schließen", "notifications_new_indicator": "Neue Benachrichtigung", - "publish_dialog_email_reset": "Email-Weiterleitung entfernen", + "publish_dialog_email_reset": "E-Mail-Weiterleitung entfernen", "action_bar_logo_alt": "ntfy Logo", "nav_button_muted": "Benachrichtigungen stummgeschaltet", "notifications_list_item": "Benachrichtigung", @@ -245,7 +245,7 @@ "account_basics_tier_payment_overdue": "Deine Zahlung ist überfällig. Bitte aktualisiere Deine Zahlungsmethode, oder Dein Konto wird herabgestuft.", "account_basics_tier_manage_billing_button": "Zahlung verwalten", "account_usage_messages_title": "Veröffentlichte Nachrichten", - "account_usage_emails_title": "Gesendete Emails", + "account_usage_emails_title": "Gesendete E-Mails", "account_usage_reservations_title": "Reservierte Themen", "account_usage_reservations_none": "Keine reservierten Themen für dieses Konto", "account_usage_attachment_storage_title": "Speicherplatz für Anhänge", @@ -266,7 +266,7 @@ "account_upgrade_dialog_reservations_warning_other": "Das gewählte Level erlaubt weniger reservierte Themen als Dein aktueller Level. Bitte löschen vor dem Wechsel Deines Levels mindestens {{count}} Reservierungen. Du kannst Reservierungen in den Einstellungen löschen.", "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} reservierte Themen", "account_upgrade_dialog_tier_features_messages_other": "{{messages}} Nachrichten pro Tag", - "account_upgrade_dialog_tier_features_emails_other": "{{emails}} Emails pro Tag", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} E-Mails pro Tag", "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} pro Datei", "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} gesamter Speicherplatz", "account_upgrade_dialog_tier_selected_label": "Ausgewählt", From fe4101d26c71aef165ffb4567cf24202f5b919b6 Mon Sep 17 00:00:00 2001 From: Costin Stroie Date: Sat, 30 Dec 2023 09:08:04 +0000 Subject: [PATCH 166/182] Translated using Weblate (Romanian) Currently translated at 28.2% (108 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ro/ --- web/public/static/langs/ro.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ro.json b/web/public/static/langs/ro.json index f2d76c6e..98d03ba9 100644 --- a/web/public/static/langs/ro.json +++ b/web/public/static/langs/ro.json @@ -101,5 +101,11 @@ "notifications_click_open_button": "Deschide link", "publish_dialog_emoji_picker_show": "Alege un emoji", "notifications_loading": "Încărcare notificări…", - "publish_dialog_priority_low": "Prioritate joasă" + "publish_dialog_priority_low": "Prioritate joasă", + "signup_form_username": "Nume de utilizator", + "signup_form_button_submit": "Înscrie-te", + "common_copy_to_clipboard": "Copiază în clipboard", + "signup_form_toggle_password_visibility": "Schimbă vizibilitatea parolei", + "signup_title": "Crează un cont ntfy", + "signup_already_have_account": "Deja ai un cont? Autentifică-te!" } From 39dc90e795a72a0d14e93d0f4f14c0d22660c9cd Mon Sep 17 00:00:00 2001 From: Costin Stroie Date: Sat, 30 Dec 2023 09:12:01 +0000 Subject: [PATCH 167/182] Translated using Weblate (Romanian) Currently translated at 32.4% (124 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ro/ --- web/public/static/langs/ro.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ro.json b/web/public/static/langs/ro.json index 98d03ba9..9ed57360 100644 --- a/web/public/static/langs/ro.json +++ b/web/public/static/langs/ro.json @@ -107,5 +107,21 @@ "common_copy_to_clipboard": "Copiază în clipboard", "signup_form_toggle_password_visibility": "Schimbă vizibilitatea parolei", "signup_title": "Crează un cont ntfy", - "signup_already_have_account": "Deja ai un cont? Autentifică-te!" + "signup_already_have_account": "Deja ai un cont? Autentifică-te!", + "login_disabled": "Autentificarea este dezactivată", + "signup_error_creation_limit_reached": "S-a atins limita de conturi", + "action_bar_toggle_action_menu": "Deschide/Închide meniul de acțiuni", + "action_bar_sign_up": "Înscriere", + "message_bar_publish": "Publică mesajul", + "login_link_signup": "Înscrie-te", + "action_bar_sign_in": "Autentificare", + "action_bar_reservation_edit": "Schimbă rezervarea", + "action_bar_reservation_delete": "Șterge rezervarea", + "login_form_button_submit": "Autentifică-te", + "signup_disabled": "Înscrierea este dezactivată", + "action_bar_profile_logout": "Ieșire", + "message_bar_show_dialog": "Arată dialogul de publicare", + "signup_error_username_taken": "Numele de utilizator {{username}} este deja folosit", + "login_title": "Autentifică-te în contul ntfy", + "action_bar_reservation_add": "Rezervă topicul" } From 2cfe18c9c858fe42befbcec42579ebdd376faa0d Mon Sep 17 00:00:00 2001 From: Jonne Saloranta Date: Mon, 1 Jan 2024 19:09:11 +0000 Subject: [PATCH 168/182] Translated using Weblate (Finnish) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 42 +++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index ec590ecd..11b815f0 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -60,7 +60,7 @@ "publish_dialog_tags_placeholder": "Pilkuilla eroteltu luettelo tunnisteista, esim. varoitus, srv1-varmuuskopio", "account_delete_title": "Poista tili", "publish_dialog_attached_file_remove": "Poista liitetiedosto", - "nav_button_connecting": "yhdistää", + "nav_button_connecting": "yhdistetään", "account_delete_dialog_label": "Salasana", "subscribe_dialog_login_button_login": "Kirjaudu", "account_upgrade_dialog_tier_features_no_reservations": "Ei varattuja topikkeja", @@ -89,7 +89,7 @@ "action_bar_toggle_mute": "Hiljennä/poista hiljennys", "reservation_delete_dialog_submit_button": "Poista varaus", "account_basics_title": "Tili", - "nav_button_documentation": "Käyttäjä oppaat", + "nav_button_documentation": "Dokumentointi", "prefs_reservations_limit_reached": "Olet saavuttanut varattujen topikkien rajan.", "account_upgrade_dialog_interval_monthly": "Kuukausittain", "prefs_users_add_button": "Lisää käyttäjä", @@ -142,7 +142,7 @@ "account_basics_tier_upgrade_button": "Päivitä Pro versioon", "prefs_users_description_no_sync": "Käyttäjiä ja salasanoja ei ole synkronoitu tiliisi.", "account_tokens_dialog_title_edit": "Muokkaa käyttöoikeustunnusta", - "nav_button_publish_message": "Julkaisutiedot", + "nav_button_publish_message": "Julkaise ilmoitus", "prefs_users_table_base_url_header": "Palvelin URL", "notifications_click_copy_url_title": "Kopioi linkin URL-osoite leikepöydälle", "publish_dialog_attach_reset": "Poista liitteen URL-osoite", @@ -160,7 +160,7 @@ "publish_dialog_priority_low": "Matala tärkeys", "publish_dialog_priority_label": "Prioriteetti", "prefs_reservations_delete_button": "Poista topikin oikeudet", - "account_basics_tier_admin_suffix_no_tier": "(no tier)", + "account_basics_tier_admin_suffix_no_tier": "(e tasoa)", "prefs_notifications_delete_after_one_week_description": "Ilmoitukset poistetaan automaattisesti viikon kuluttua", "error_boundary_unsupported_indexeddb_description": "Ntfy-verkkosovellus tarvitsee IndexedDB:n toimiakseen, eikä selaimesi tue IndexedDB:tä yksityisessä selaustilassa.

Vaikka tämä on valitettavaa, ntfy-verkon käyttäminen ei myöskään ole kovin järkevää yksityisessä selaustilassa, koska kaikki on tallennettu selaimen tallennustilaan. Voit lukea siitä lisää tästä GitHub-numerosta tai puhua meille Discordissa tai Matrixissa.", "subscribe_dialog_subscribe_button_cancel": "Peruuta", @@ -175,7 +175,7 @@ "notifications_click_copy_url_button": "Kopioi linkki", "account_basics_tier_admin": "Admin", "subscribe_dialog_subscribe_title": "Tilaa topikki", - "nav_topics_title": "Tilatut topikit", + "nav_topics_title": "Tilatut aiheet", "prefs_notifications_sound_title": "Ilmoitusääni", "prefs_notifications_min_priority_default_and_higher": "Oletusprioriteetti ja korkeammat", "prefs_reservations_table_access_header": "Oikeudet", @@ -232,7 +232,7 @@ "account_basics_username_description": "Hei, se olet sinä ❤", "prefs_reservations_dialog_topic_label": "Topik", "account_basics_password_dialog_confirm_password_label": "Vahvista salasana", - "action_bar_reservation_edit": "Muokkaa varatopikkia", + "action_bar_reservation_edit": "Muokkaa varausta", "publish_dialog_base_url_placeholder": "Palvelun URL-osoite, esim. https://example.com", "prefs_users_title": "Hallinnoi käyttäjiä", "account_basics_tier_interval_yearly": "vuosittain", @@ -247,7 +247,7 @@ "publish_dialog_delay_label": "Viive", "error_boundary_button_copy_stack_trace": "Kopioi pinon jälki", "publish_dialog_button_send": "Lähetä", - "action_bar_reservation_delete": "Poista varatopikit", + "action_bar_reservation_delete": "Poista varaus", "publish_dialog_button_cancel_sending": "Peruuta lähetys", "account_tokens_dialog_title_delete": "Poista käyttöoikeustunnus", "account_usage_of_limit": "limiitistä {{limit}}", @@ -260,7 +260,7 @@ "account_upgrade_dialog_interval_yearly": "Vuosittain", "publish_dialog_tags_label": "Tagit", "signup_form_password": "Salasana", - "action_bar_reservation_limit_reached": "Varatopikien raja", + "action_bar_reservation_limit_reached": "Raja saavutettu", "account_upgrade_dialog_button_redirect_signup": "Kirjaudu nyt", "publish_dialog_click_placeholder": "URL-osoite, joka avautuu, kun ilmoitusta napsautetaan", "alert_not_supported_title": "Ilmoituksia ei tueta", @@ -314,14 +314,14 @@ "notifications_click_open_button": "Avaa linkki", "account_tokens_table_current_session": "Nykyinen selainistunto", "account_upgrade_dialog_button_pay_now": "Maksa nyt ja tilaa", - "nav_upgrade_banner_description": "Varaa aiheita, lisää viestejä ja sähköposteja sekä suurempia liitteitä", + "nav_upgrade_banner_description": "Varaa aiheita, lisää viestejä ja sähköposteja, sekä suurempia liitteitä", "publish_dialog_call_reset": "Poista puhelu", "publish_dialog_other_features": "Muut ominaisuudet:", "subscribe_dialog_subscribe_use_another_label": "Käytä toista palvelinta", "reservation_delete_dialog_action_delete_title": "Poista välimuistissa olevat viestit ja liitteet", "signup_error_username_taken": "Käyttäjätunnus {{username}} on jo varattu", "account_basics_phone_numbers_dialog_code_label": "Vahvistuskoodi", - "nav_button_subscribe": "Tilaa topik", + "nav_button_subscribe": "Tilaa aihe", "publish_dialog_topic_label": "Topikin nimi", "reservation_delete_dialog_action_delete_description": "Välimuistissa olevat viestit ja liitteet poistetaan pysyvästi. Tätä toimintoa ei voi kumota.", "alert_grant_button": "Myönnä nyt", @@ -341,7 +341,7 @@ "prefs_users_dialog_base_url_label": "Palvelin URL, esim. https://ntfy.sh", "account_usage_emails_title": "Sähköpostit lähetetty", "account_basics_phone_numbers_dialog_channel_sms": "SMS", - "action_bar_reservation_add": "Varalla oleva topikki", + "action_bar_reservation_add": "Varalla oleva aihe", "account_upgrade_dialog_tier_selected_label": "Valittu", "account_upgrade_dialog_button_update_subscription": "Päivitä tilaus", "notifications_attachment_file_video": "videotiedosto", @@ -363,6 +363,22 @@ "notifications_none_for_topic_description": "Jos haluat lähettää ilmoituksia tähän topikkiin, PUT tai POST topikin URL-osoitteeseen.", "notifications_none_for_any_description": "Jos haluat lähettää ilmoituksia topikkiin, PUT tai POST topikin URL-osoitteeseen. Tässä on esimerkki yhden topikin käyttämisestä.", "notifications_no_subscriptions_title": "Näyttää siltä, että sinulla ei ole vielä tilauksia.", - "notifications_none_for_topic_title": "Et ole vielä saanut ilmoituksia tästä topikista.", - "notifications_actions_http_request_title": "Lähetä HTTP {{method}} to {{url}}" + "notifications_none_for_topic_title": "Et ole vielä saanut ilmoituksia tästä aiheesta.", + "notifications_actions_http_request_title": "Lähetä HTTP {{method}} to {{url}}", + "reserve_dialog_checkbox_label": "Käänteinen aihe ja aseta pääsy", + "publish_dialog_progress_uploading": "Lähetetään …", + "publish_dialog_title_no_topic": "Julkaise ilmoitus", + "notifications_example": "Esimerkki", + "notifications_loading": "Ladataan ilmoituksia …", + "notifications_no_subscriptions_description": "Klikkaa \"{{linktext}}\" linkkiä luodaksesi tai tilataksesi aihe. Sen jälkeen voit lähettää viestejä PUT tai POST metodeilla ja saat ilmoituksesi täällä.", + "display_name_dialog_description": "Aseta vaihtoehtoinen nimi aiheelle, joka on näytetty tilaus-listassa. Tämä auttaa tunnistamaan aiheet helpommin, joilla on hankalat nimet.", + "publish_dialog_message_published": "Ilmoitus julkaistu", + "notifications_more_details": "Saadaksesi lisää tietoa, katso nettisivu tai documentointi.", + "publish_dialog_attachment_limits_quota_reached": "ylittää kiintiön, {{remainingBytes}} jäljellä", + "publish_dialog_title_topic": "Julkaise aiheeseen {{topic}}", + "display_name_dialog_placeholder": "Näyttönimi", + "publish_dialog_attachment_limits_file_and_quota_reached": "ylittää {{fileSizeLimit}} tiedostokoon rajan ja määrän, {{remainingBytes}} jäljellä", + "publish_dialog_attachment_limits_file_reached": "ylittää {{fileSizeLimit}} tiedostokoon rajan", + "publish_dialog_progress_uploading_detail": "Lähetetään {{loaded}}/{{total}} ({{percent}}%) …", + "display_name_dialog_title": "Vaihda näyttönimi" } From 020968961ed77b48c42dadc4f0383710f63c2ecb Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Thu, 4 Jan 2024 22:39:37 +0000 Subject: [PATCH 169/182] Translated using Weblate (Bulgarian) Currently translated at 88.2% (337 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index e1e447e1..3e14bb9f 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -60,9 +60,9 @@ "notifications_click_copy_url_button": "Копиране на препратка", "notifications_click_open_button": "Отваряне", "notifications_click_copy_url_title": "Копиране на препратката в междинната памет", - "notifications_none_for_topic_title": "Липсват известия в темата.", + "notifications_none_for_topic_title": "Темата е все още празна", "notifications_none_for_any_title": "Липсват известия.", - "notifications_none_for_topic_description": "За да изпратите известия в тази тема направете заявка чрез методите PUT или POST към адреса й.", + "notifications_none_for_topic_description": "За да изпратите известия в тази тема направете заявка чрез методите PUT или POST към адреса ѝ.", "notifications_none_for_any_description": "За да изпратите известия в тема направете заявка чрез методите PUT или POST към адреса ѝ. Ето пример с една от вашите теми.", "notifications_no_subscriptions_description": "Щракнете върху „{{linktext}}“, за да създадете тема или да се абонирате. След това като направите заявка чрез методите PUT или POST ще ги получите тук.", "notifications_more_details": "За допълнителна информация посетете страницата или документацията.", @@ -155,7 +155,7 @@ "notifications_actions_not_supported": "Действието не се поддържа от приложението за интернет", "action_bar_show_menu": "Показване на менюто", "action_bar_logo_alt": "Логотип на ntfy", - "action_bar_toggle_mute": "Заглушаване или пускне на известията", + "action_bar_toggle_mute": "Заглушаване или пускане на известията", "action_bar_toggle_action_menu": "Отваряне или затваряне на менюто с действията", "nav_button_muted": "Известията са заглушени", "notifications_list": "Списък с известия", From 4cfc64e528a66e5fb21340e45fad1f622aec8b0f Mon Sep 17 00:00:00 2001 From: Up <10714589+UpcraftLP@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:25:46 +0100 Subject: [PATCH 170/182] fix docs showing wrong apk path --- docs/develop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/develop.md b/docs/develop.md index b090c8c5..e343503b 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -363,7 +363,7 @@ To build your own version with Firebase, you must: * And change `app_base_url` in [values.xml](https://github.com/binwiederhier/ntfy-android/blob/main/app/src/main/res/values/values.xml) * Then run: ``` -# To build an unsigned .apk (app/build/outputs/apk/play/*.apk) +# To build an unsigned .apk (app/build/outputs/apk/play/release/*.apk) ./gradlew assemblePlayRelease # To build a bundle .aab (app/play/release/*.aab) From 1d2b759dc036011b8a3650e71708c22e49b5611e Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 21 Jan 2024 11:27:10 -0500 Subject: [PATCH 171/182] Bump --- go.mod | 52 +-- go.sum | 61 ++++ web/package-lock.json | 800 ++++++++++++++++++++++-------------------- 3 files changed, 501 insertions(+), 412 deletions(-) diff --git a/go.mod b/go.mod index c4f4fdc9..beb2c014 100644 --- a/go.mod +++ b/go.mod @@ -6,22 +6,22 @@ toolchain go1.21.3 require ( cloud.google.com/go/firestore v1.14.0 // indirect - cloud.google.com/go/storage v1.35.1 // indirect + cloud.google.com/go/storage v1.36.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 github.com/gabriel-vasile/mimetype v1.4.3 github.com/gorilla/websocket v1.5.1 - github.com/mattn/go-sqlite3 v1.14.18 + github.com/mattn/go-sqlite3 v1.14.19 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.4 - github.com/urfave/cli/v2 v2.25.7 - golang.org/x/crypto v0.15.0 - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 - golang.org/x/term v0.14.0 - golang.org/x/time v0.4.0 - google.golang.org/api v0.151.0 + github.com/urfave/cli/v2 v2.27.1 + golang.org/x/crypto v0.18.0 + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 + golang.org/x/term v0.16.0 + golang.org/x/time v0.5.0 + google.golang.org/api v0.157.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -30,15 +30,15 @@ replace github.com/emersion/go-smtp => github.com/emersion/go-smtp v0.17.0 // Pi require github.com/pkg/errors v0.9.1 // indirect require ( - firebase.google.com/go/v4 v4.12.1 + firebase.google.com/go/v4 v4.13.0 github.com/SherClockHolmes/webpush-go v1.3.0 github.com/microcosm-cc/bluemonday v1.0.26 - github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/client_golang v1.18.0 github.com/stripe/stripe-go/v74 v74.30.0 ) require ( - cloud.google.com/go v0.110.10 // indirect + cloud.google.com/go v0.112.0 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.5 // indirect @@ -50,12 +50,15 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/css v1.0.1 // indirect @@ -63,22 +66,27 @@ require ( github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/common v0.46.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/sys v0.14.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect + go.opentelemetry.io/otel v1.22.0 // indirect + go.opentelemetry.io/otel/metric v1.22.0 // indirect + go.opentelemetry.io/otel/trace v1.22.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/grpc v1.59.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect + google.golang.org/grpc v1.60.1 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2031b653..b441b5bf 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= @@ -13,8 +15,12 @@ cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgG cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= firebase.google.com/go/v4 v4.12.1/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= +firebase.google.com/go/v4 v4.13.0 h1:meFz9nvDNh/FDyrEykoAzSfComcQbmnQSjoHrePRqeI= +firebase.google.com/go/v4 v4.13.0/go.mod h1:e1/gaR6EnbQfsmTnAMx1hnz+ninJIrrr/RAh59Tpfn8= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -48,8 +54,15 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -89,6 +102,8 @@ github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= @@ -103,6 +118,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= +github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= @@ -115,11 +132,15 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -140,17 +161,33 @@ github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ5 github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= +github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI= +github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= +go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -171,9 +208,13 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= 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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -181,6 +222,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -194,12 +237,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -211,6 +258,8 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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= @@ -225,6 +274,8 @@ golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSm golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.157.0 h1:ORAeqmbrrozeyw5NjnMxh7peHO0UzV4wWYSwZeCUb20= +google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -236,10 +287,16 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac h1:OZkkudMUu9LVQMCoRUbI/1p5VCo9BOrlvkqMvWtqa6s= +google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -247,6 +304,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -261,6 +320,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/web/package-lock.json b/web/package-lock.json index f0cfd9f6..937d8597 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -68,11 +68,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -80,30 +80,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", - "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", - "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.3", - "@babel/types": "^7.23.3", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -125,12 +125,12 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", - "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.3", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -164,14 +164,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -180,17 +180,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -220,9 +220,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -403,9 +403,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } @@ -419,9 +419,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -442,23 +442,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -469,9 +469,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", - "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -513,9 +513,9 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -791,9 +791,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", - "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -841,9 +841,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", - "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -872,9 +872,9 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", - "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", @@ -889,16 +889,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", - "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -974,9 +973,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", - "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1006,9 +1005,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", - "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1022,12 +1021,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", - "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1054,9 +1054,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", - "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1085,9 +1085,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", - "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1214,9 +1214,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", - "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1230,9 +1230,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", - "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1246,9 +1246,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", - "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.3", @@ -1281,9 +1281,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", - "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1297,9 +1297,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", - "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1345,9 +1345,9 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", - "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1578,18 +1578,18 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", - "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", + "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1610,25 +1610,25 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.3", - "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.3", - "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", @@ -1636,15 +1636,15 @@ "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", - "@babel/plugin-transform-numeric-separator": "^7.23.3", - "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.3", - "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", "@babel/plugin-transform-parameters": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", "@babel/plugin-transform-property-literals": "^7.23.3", "@babel/plugin-transform-regenerator": "^7.23.3", "@babel/plugin-transform-reserved-words": "^7.23.3", @@ -1658,9 +1658,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1692,9 +1692,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1717,20 +1717,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", - "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.3", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1738,11 +1738,11 @@ } }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1809,14 +1809,14 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", - "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", + "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", + "@emotion/serialize": "^1.1.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", @@ -1832,9 +1832,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", "dependencies": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", @@ -2270,9 +2270,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2293,9 +2293,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2320,37 +2320,37 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", + "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", + "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.5.3", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.6.tgz", + "integrity": "sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==", "dependencies": { - "@floating-ui/dom": "^1.5.1" + "@floating-ui/dom": "^1.5.4" }, "peerDependencies": { "react": ">=16.8.0", @@ -2358,18 +2358,18 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -2390,9 +2390,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -2444,9 +2444,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2465,16 +2465,16 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.24", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", - "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", + "version": "5.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.32.tgz", + "integrity": "sha512-4VptvYeLUYMJhZapWBkD50GmKfOc0XT381KJcTK3ncZYIl8MdBhpR6l8jOyeP5cixUPBJhstjrnmQEAHjCLriw==", "dependencies": { - "@babel/runtime": "^7.23.2", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", + "@babel/runtime": "^7.23.8", + "@floating-ui/react-dom": "^2.0.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", + "clsx": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -2482,7 +2482,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -2496,27 +2496,27 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", - "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.5.tgz", + "integrity": "sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", - "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.5.tgz", + "integrity": "sha512-qiql0fd1JY7TZ1wm1RldvU7sL8QUatE9OC12i/qm5rnm/caTFyAfOyTIR7qqxorsJvoZGyrzwoMkal6Ij9kM0A==", "dependencies": { - "@babel/runtime": "^7.23.2" + "@babel/runtime": "^7.23.8" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@mui/material": "^5.0.0", @@ -2530,18 +2530,18 @@ } }, "node_modules/@mui/material": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", - "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.5.tgz", + "integrity": "sha512-2KfA39f/UWeQl0O22UJs3x1nG3chYlyu9wnux5vTnxUTLzkgYIzQIHaH+ZOGpv5JiZBMKktAPNfhqyhSaQ49qQ==", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/base": "5.0.0-beta.24", - "@mui/core-downloads-tracker": "^5.14.18", - "@mui/system": "^5.14.18", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "@types/react-transition-group": "^4.4.8", - "clsx": "^2.0.0", + "@babel/runtime": "^7.23.8", + "@mui/base": "5.0.0-beta.32", + "@mui/core-downloads-tracker": "^5.15.5", + "@mui/system": "^5.15.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", "react-is": "^18.2.0", @@ -2552,7 +2552,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -2574,12 +2574,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", - "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.5.tgz", + "integrity": "sha512-HU1KCyGNcJFsUamTbOM539ZDZJNI/XU7sZFdsN29glktUf+T6hNvDuO2ISinBiLTZy7Ab3R6DSSoYXRrLc4uwQ==", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/utils": "^5.14.18", + "@babel/runtime": "^7.23.8", + "@mui/utils": "^5.15.5", "prop-types": "^15.8.1" }, "engines": { @@ -2587,7 +2587,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -2600,11 +2600,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", - "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.5.tgz", + "integrity": "sha512-xoMUd8h270thNL7ZsOzmlluIAMsQg/HT7SCdRjPBVle+XHgTKaiWiRy1ekDOsrrF0rhjME3T7xeeUq2G269UUw==", "dependencies": { - "@babel/runtime": "^7.23.2", + "@babel/runtime": "^7.23.8", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2614,7 +2614,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.4.1", @@ -2631,16 +2631,16 @@ } }, "node_modules/@mui/system": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", - "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.5.tgz", + "integrity": "sha512-DMv2vGjUKaDt/m0RlzvLjpKiS5V0LoBhiMUHf5pWdj6uoNlN4FuKUe4pFeYmQMIO5DnVZKybmpPepfkdfEH+Og==", "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/private-theming": "^5.14.18", - "@mui/styled-engine": "^5.14.18", - "@mui/types": "^7.2.9", - "@mui/utils": "^5.14.18", - "clsx": "^2.0.0", + "@babel/runtime": "^7.23.8", + "@mui/private-theming": "^5.15.5", + "@mui/styled-engine": "^5.15.5", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.5", + "clsx": "^2.1.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" }, @@ -2649,7 +2649,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -2670,9 +2670,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", - "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -2683,12 +2683,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.18", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", - "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.5.tgz", + "integrity": "sha512-jEywgaMGZWPSlVFO7ZZAyXxNeLmq5XBp5At9Ne/sGohRJdesUcdxvyi8TP3odJxwQuL5L6PJV+JQ4DyIDM849A==", "dependencies": { - "@babel/runtime": "^7.23.2", - "@types/prop-types": "^15.7.10", + "@babel/runtime": "^7.23.8", + "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2697,7 +2697,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -2754,9 +2754,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", - "integrity": "sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", + "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", "engines": { "node": ">=14.0.0" } @@ -2774,9 +2774,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2787,9 +2787,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -2806,9 +2806,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -2835,9 +2835,9 @@ } }, "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "version": "20.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2849,14 +2849,14 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { - "version": "15.7.10", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", - "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.37.tgz", - "integrity": "sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==", + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2864,9 +2864,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", - "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } @@ -2881,14 +2881,14 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.6.tgz", - "integrity": "sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==" + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" }, "node_modules/@types/trusted-types": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz", - "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, "node_modules/@types/unist": { @@ -2903,15 +2903,15 @@ "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.0.tgz", - "integrity": "sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", "dev": true, "dependencies": { - "@babel/core": "^7.23.3", + "@babel/core": "^7.23.5", "@babel/plugin-transform-react-jsx-self": "^7.23.3", "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.4", + "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.0" }, "engines": { @@ -2922,9 +2922,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3189,13 +3189,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { @@ -3203,25 +3203,41 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.4.4", "core-js-compat": "^3.33.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3265,9 +3281,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -3284,9 +3300,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -3337,9 +3353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001563", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", - "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", + "version": "1.0.30001579", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", + "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", "dev": true, "funding": [ { @@ -3405,9 +3421,9 @@ } }, "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { "node": ">=6" } @@ -3467,12 +3483,12 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", "dev": true, "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -3534,9 +3550,9 @@ } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -3670,9 +3686,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.588", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", - "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", + "version": "1.4.640", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", + "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==", "dev": true }, "node_modules/emoji-regex": { @@ -3870,15 +3886,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4023,9 +4039,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -4044,7 +4060,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4253,9 +4269,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4417,9 +4433,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -5533,9 +5549,9 @@ } }, "node_modules/js-base64": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", - "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", + "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -5997,9 +6013,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/object-assign": { @@ -6029,13 +6045,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -6279,9 +6295,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, "funding": [ { @@ -6298,7 +6314,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -6498,11 +6514,11 @@ } }, "node_modules/react-router": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.19.0.tgz", - "integrity": "sha512-0W63PKCZ7+OuQd7Tm+RbkI8kCLmn4GPjDbX61tWljPxWgqTKlEpeQUwPkT1DRjYhF8KSihK0hQpmhU4uxVMcdw==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", + "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", "dependencies": { - "@remix-run/router": "1.12.0" + "@remix-run/router": "1.14.2" }, "engines": { "node": ">=14.0.0" @@ -6512,12 +6528,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.19.0.tgz", - "integrity": "sha512-N6dWlcgL2w0U5HZUUqU2wlmOrSb3ighJmtQ438SWbhB1yuLTXQ8yyTBMK3BSvVjp7gBtKurT554nCtMOgxCZmQ==", + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", + "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", "dependencies": { - "@remix-run/router": "1.12.0", - "react-router": "6.19.0" + "@remix-run/router": "1.14.2", + "react-router": "6.21.3" }, "engines": { "node": ">=14.0.0" @@ -6581,9 +6597,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -6784,13 +6800,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -6822,15 +6838,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6862,15 +6881,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7147,9 +7167,9 @@ } }, "node_modules/stylis": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", - "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" }, "node_modules/stylis-plugin-rtl": { "version": "2.1.1", @@ -7212,9 +7232,9 @@ } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7278,9 +7298,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -7636,9 +7656,9 @@ } }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "dependencies": { "esbuild": "^0.18.10", From 3f49f51847d644a92f12bc216000efc79688ca89 Mon Sep 17 00:00:00 2001 From: Lennart Date: Tue, 30 Jan 2024 17:01:36 +0100 Subject: [PATCH 172/182] docs: enhance watchtower example document usage of environment variable WATCHTOWER_NOTIFICATION_SKIP_TITLE for watchtower container so the provided title will not be overwritten --- docs/examples.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index 4e936d91..326a3531 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -162,9 +162,12 @@ services: image: containrrr/watchtower environment: - WATCHTOWER_NOTIFICATIONS=shoutrrr + - WATCHTOWER_NOTIFICATION_SKIP_TITLE=True - WATCHTOWER_NOTIFICATION_URL=ntfy://ntfy.sh/my_watchtower_topic?title=WatchtowerUpdates ``` +The environment variable `WATCHTOWER_NOTIFICATION_SKIP_TITLE` is required to prevent Watchtower from [replacing the `title` query parameter](https://containrrr.dev/watchtower/notifications/#settings). If omitted, the provided notification title will not be used. + Or, if you only want to send notifications using shoutrrr: ``` shoutrrr send -u "ntfy://ntfy.sh/my_watchtower_topic?title=WatchtowerUpdates" -m "testMessage" From 99a0c72d4978f07690daba417492d21ec377e1a4 Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Mon, 5 Feb 2024 13:29:47 +0100 Subject: [PATCH 173/182] Remove dependence on mkdocs-simple-hooks Since mkdocs v1.4, the hooks are a native feature --- docs/hooks.py | 7 ++++--- mkdocs.yml | 6 +++--- requirements.txt | 1 - 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/hooks.py b/docs/hooks.py index cdb31a52..4a6957d9 100644 --- a/docs/hooks.py +++ b/docs/hooks.py @@ -1,6 +1,7 @@ import os import shutil -def copy_fonts(config, **kwargs): - site_dir = config['site_dir'] - shutil.copytree('docs/static/fonts', os.path.join(site_dir, 'get')) + +def on_post_build(config, **kwargs): + site_dir = config["site_dir"] + shutil.copytree("docs/static/fonts", os.path.join(site_dir, "get")) diff --git a/mkdocs.yml b/mkdocs.yml index bf0482aa..210b3ab7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,13 +67,13 @@ markdown_extensions: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:materialx.emoji.to_svg +hooks: + - docs/hooks.py + plugins: - search - minify: minify_html: true - - mkdocs-simple-hooks: - hooks: - on_post_build: "docs.hooks:copy_fonts" nav: - "Getting started": index.md diff --git a/requirements.txt b/requirements.txt index 17b0fc1a..9c2212a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ # The documentation uses 'mkdocs', which is written in Python mkdocs-material mkdocs-minify-plugin -mkdocs-simple-hooks From 34f90facb28f6f1fe0bbaf56d66a6d78c9ac8a11 Mon Sep 17 00:00:00 2001 From: DerRockWolf <50499906+DerRockWolf@users.noreply.github.com> Date: Fri, 9 Feb 2024 21:13:59 +0000 Subject: [PATCH 174/182] docs(config.md): fix UnifiedPush links --- docs/config.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/config.md b/docs/config.md index 453e3cfe..2f10cdec 100644 --- a/docs/config.md +++ b/docs/config.md @@ -404,10 +404,10 @@ with the given username/password. Be sure to use HTTPS to avoid eavesdropping an ``` ### Example: UnifiedPush -[UnifiedPush](https://unifiedpush.org) requires that the [application server](https://unifiedpush.org/spec/definitions/#application-server) (e.g. Synapse, Fediverse Server, …) -has anonymous write access to the [topic](https://unifiedpush.org/spec/definitions/#endpoint) used for push messages. +[UnifiedPush](https://unifiedpush.org) requires that the [application server](https://unifiedpush.org/developers/spec/definitions/#application-server) (e.g. Synapse, Fediverse Server, …) +has anonymous write access to the [topic](https://unifiedpush.org/developers/spec/definitions/#endpoint) used for push messages. The topic names used by UnifiedPush all start with the `up*` prefix. Please refer to the -**[UnifiedPush documentation](https://unifiedpush.org/users/distributors/ntfy/#limit-access-to-some-users)** for more details. +**[UnifiedPush documentation](https://unifiedpush.org/users/distributors/ntfy/#limit-access-to-some-users-acl)** for more details. To enable support for UnifiedPush for private servers (i.e. `auth-default-access: "deny-all"`), you should either allow anonymous write access for the entire prefix or explicitly per topic: From b86c50c60afeb1309b4e15c2d6b5109a2db65c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D1=83=D1=81=D0=BD=D0=B8=D0=B4=D0=B4=D0=B8=D0=BD?= Date: Fri, 23 Feb 2024 23:28:55 +0100 Subject: [PATCH 175/182] Added translation using Weblate (Uzbek) --- web/public/static/langs/uz.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/uz.json diff --git a/web/public/static/langs/uz.json b/web/public/static/langs/uz.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/uz.json @@ -0,0 +1 @@ +{} From 9449b0b875aa90ce50d5020e1fb2e18b391aec20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D1=83=D1=81=D0=BD=D0=B8=D0=B4=D0=B4=D0=B8=D0=BD?= Date: Fri, 23 Feb 2024 22:30:55 +0000 Subject: [PATCH 176/182] Translated using Weblate (Uzbek) Currently translated at 6.5% (25 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/uz/ --- web/public/static/langs/uz.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/uz.json b/web/public/static/langs/uz.json index 0967ef42..b951406a 100644 --- a/web/public/static/langs/uz.json +++ b/web/public/static/langs/uz.json @@ -1 +1,27 @@ -{} +{ + "signup_title": "ntfy hisobini yaratish", + "signup_form_password": "Parol", + "signup_form_confirm_password": "Parolni tasdiqlang", + "signup_error_username_taken": "Foydalanuvchi nomi {{username}} allaqachon foydalanilmoqda", + "signup_error_creation_limit_reached": "Boshqa hisob raqam ocha olmaysiz", + "login_title": "Ntfy hisobingizga kiring", + "login_form_button_submit": "Kirish", + "login_link_signup": "Ro'yxatdan o'tish", + "login_disabled": "Kirish o'chirilgan", + "action_bar_show_menu": "Menyuni ko'rsatish", + "action_bar_logo_alt": "ntfy logotipi", + "action_bar_settings": "Sozlamalar", + "action_bar_change_display_name": "Ko'rsatilgan nomni o'zgartiring", + "action_bar_reservation_add": "Zaxira mavzusi", + "common_cancel": "Bekor qilish", + "common_save": "Saqlash", + "common_add": "Qo‘shish", + "common_back": "Orqaga", + "common_copy_to_clipboard": "Xotiraga nusxalash", + "signup_form_username": "Foydalanuvchi nomi", + "signup_form_button_submit": "Ro‘yxatdan o‘tish", + "signup_form_toggle_password_visibility": "Parol ko‘rinishini o‘zgartirish", + "signup_already_have_account": "Hisobingiz bormi? Tizimga kiring!", + "signup_disabled": "Ro‘yxatdan o‘tish o‘chirilgan", + "action_bar_account": "Hisob" +} From 78de5d48663f47a63dc0dc3fe625f263433c5a8a Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Tue, 27 Feb 2024 21:00:04 +0000 Subject: [PATCH 177/182] Translated using Weblate (Bulgarian) Currently translated at 98.1% (375 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 44 ++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index 3e14bb9f..a8766de5 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -55,7 +55,7 @@ "notifications_attachment_open_title": "Към {{url}}", "notifications_attachment_copy_url_button": "Копиране на адреса", "notifications_attachment_open_button": "Отваряне на прикачения файл", - "notifications_attachment_link_expires": "препратката изтича на {{date}}", + "notifications_attachment_link_expires": "давността на препратката изтича на {{date}}", "notifications_actions_open_url_title": "Към {{url}}", "notifications_click_copy_url_button": "Копиране на препратка", "notifications_click_open_button": "Отваряне", @@ -332,8 +332,46 @@ "account_upgrade_dialog_tier_price_per_month": "на месец", "account_upgrade_dialog_button_pay_now": "Плащане и абониране", "account_upgrade_dialog_tier_selected_label": "Избрано", - "account_upgrade_dialog_button_update_subscription": "Премяна на абонамент", + "account_upgrade_dialog_button_update_subscription": "Промяна на абонамент", "account_upgrade_dialog_reservations_warning_other": "Избраното ниво разрешава по-малко резервирани теми, от колкото текущото. Преди промяна на нивото изтрийте най-малко {{count}} резервирани теми. Можете да премахвате теми в Настройки.", "account_tokens_table_expires_header": "Изтича", - "account_tokens_table_never_expires": "Никога" + "account_tokens_table_never_expires": "Никога", + "prefs_reservations_title": "Резервирани теми", + "prefs_reservations_table_click_to_subscribe": "Докоснете, за да се абонирате", + "prefs_reservations_dialog_title_delete": "Премахване на резервирането", + "prefs_reservations_table_everyone_read_only": "Аз мога да публикувам и да се абонирам, всички останали могат да се абонират", + "prefs_reservations_table_not_subscribed": "Без абонамент", + "account_tokens_table_token_header": "Код за достъп", + "account_tokens_table_create_token_button": "Създаване на код за достъп", + "account_tokens_dialog_expires_x_days": "Кодът за достъп изтича след {{days}} дена", + "account_tokens_dialog_expires_never": "Кодът за достъп не изтича", + "account_tokens_delete_dialog_title": "Премахване на код за достъп", + "prefs_reservations_limit_reached": "Достигнахте ограничението за брой резервирани теми.", + "prefs_reservations_add_button": "Добавяне на тема", + "prefs_reservations_delete_button": "Нулиране на правата за достъп", + "prefs_reservations_table": "Списък с резервирани теми", + "prefs_reservations_dialog_title_add": "Резервиране на тема", + "prefs_reservations_dialog_title_edit": "Променяне на резервирана тема", + "account_tokens_table_current_session": "Текущ сеанс на четеца", + "account_tokens_table_copied_to_clipboard": "Кодът за достъп е копиран", + "account_tokens_table_cannot_delete_or_edit": "Не можете да променяте или премахвате кода за достъп на текущия сеанс", + "account_tokens_table_last_origin_tooltip": "От адрес по IP {{ip}}, щракнете за подробности", + "account_tokens_dialog_title_create": "Създаване на код за достъп", + "account_tokens_dialog_title_edit": "Променяне на код за достъп", + "account_tokens_dialog_title_delete": "Премахване на код за достъп", + "account_tokens_dialog_label": "Етикет, напр. Известия от Radarr", + "account_tokens_dialog_button_create": "Създаване на код за достъп", + "account_tokens_dialog_button_update": "Променяне на код за достъп", + "account_tokens_dialog_expires_label": "Кодът за достъп изтича след", + "account_tokens_dialog_expires_x_hours": "Кодът за достъп изтича след {{hours}} часа", + "account_tokens_dialog_expires_unchanged": "Без промяна на давността", + "account_tokens_delete_dialog_submit_button": "Безвъзвратно премахване на код за достъп", + "prefs_users_description_no_sync": "Потребителите и паролите не се синхронизират заедно с профила.", + "prefs_users_table_cannot_delete_or_edit": "Влезлият потребител не може да бъде премахнат", + "prefs_reservations_table_everyone_deny_all": "Само аз мога да публикувам и да се абонирам", + "prefs_reservations_table_everyone_write_only": "Аз мога да публикувам и да се абонирам, всички останали могат да публикуват", + "prefs_reservations_table_everyone_read_write": "Всички могат да публикуват и да се абонират", + "reservation_delete_dialog_submit_button": "Премахване на резервирането", + "account_tokens_description": "Използвайте код за достъп когато публикувате или се абонирате през ППИ на ntfy, за да не се налага да изпращате потребителско име и парола. Прочетете документацията за повече информация.", + "account_tokens_delete_dialog_description": "Преди да премахвате код за достъп се уверете, че не се използва от приложения или скриптове. Действието е необратимо." } From f2f7ad825313253f5bdc557f7585092ce67332c7 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Wed, 28 Feb 2024 11:07:29 +0000 Subject: [PATCH 178/182] Translated using Weblate (Bulgarian) Currently translated at 100.0% (382 of 382 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index a8766de5..025e9219 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -85,7 +85,7 @@ "publish_dialog_title_label": "Заглавие", "publish_dialog_priority_label": "Приоритет", "publish_dialog_click_placeholder": "Адрес, който се отваря при щракване върху известието", - "publish_dialog_email_placeholder": "Поща, на която да се препрати известието, напр. phil@example.com", + "publish_dialog_email_placeholder": "Адрес, към който да бъдат препращани известия, напр. phil@example.com", "publish_dialog_attach_label": "Адрес на прикачения файл", "publish_dialog_filename_placeholder": "Име на прикачения файл", "publish_dialog_attach_placeholder": "Прикачете файл от адрес, напр. https://f-droid.org/F-Droid.apk", @@ -257,7 +257,7 @@ "account_tokens_dialog_button_cancel": "Отказ", "account_delete_title": "Премахване на профила", "account_upgrade_dialog_title": "Промяна нивото на профила", - "account_usage_emails_title": "Изпратени съобщения", + "account_usage_emails_title": "Изпратени електронни писма", "account_usage_reservations_title": "Резервирани теми", "account_usage_reservations_none": "Няма резервирани теми", "account_usage_cannot_create_portal_session": "Порталът за разплащане не може да бъде отворен", @@ -373,5 +373,12 @@ "prefs_reservations_table_everyone_read_write": "Всички могат да публикуват и да се абонират", "reservation_delete_dialog_submit_button": "Премахване на резервирането", "account_tokens_description": "Използвайте код за достъп когато публикувате или се абонирате през ППИ на ntfy, за да не се налага да изпращате потребителско име и парола. Прочетете документацията за повече информация.", - "account_tokens_delete_dialog_description": "Преди да премахвате код за достъп се уверете, че не се използва от приложения или скриптове. Действието е необратимо." + "account_tokens_delete_dialog_description": "Преди да премахвате код за достъп се уверете, че не се използва от приложения или скриптове. Действието е необратимо.", + "prefs_reservations_dialog_description": "Резервирането ви осигурява собственост върху темата и ви дава възможност да определяте права за достъп от други потребители.", + "reservation_delete_dialog_action_keep_title": "Пазене на съобщения и прикачени файлове", + "reservation_delete_dialog_action_keep_description": "Съобщенията и прикачените файлове, които са във временната памет на сървъра ще бъдат достъпни за всеки, който знае името на темата.", + "reservation_delete_dialog_action_delete_title": "Премахване на съобщения и прикачени файлове", + "reservation_delete_dialog_action_delete_description": "Съобщенията и прикачените файлове, които са във временната памет ще бъдат премахнати. Действието е необратимо.", + "prefs_reservations_description": "Тук можете да резервирате тема за собствено ползване. Резервирането ви осигурява собственост върху темата и ви дава възможност да определяте права за достъп от други потребители.", + "reservation_delete_dialog_description": "С премахването на резервирането вие се отказвате от собствеността върху темата и давате възможност друг потребител да я резервира. Можете да оставите или да премахнете съществуващите съобщения и прикачени файлове." } From aecf0a5f259d1db0c084009037a752dbe88d81b1 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 7 Mar 2024 10:07:42 -0500 Subject: [PATCH 179/182] Remove Rate-Topics --- .github/workflows/build.yaml | 22 +- .github/workflows/release.yaml | 23 +- .github/workflows/test.yaml | 31 +- docs/config.md | 17 +- docs/deprecations.md | 2 +- docs/releases.md | 6 + go.mod | 62 +- go.sum | 168 +-- server/server.go | 22 +- server/server.yml | 13 +- server/server_test.go | 102 +- web/package-lock.json | 2178 ++++++++++++++++++++++++-------- 12 files changed, 1839 insertions(+), 807 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cb310934..b6dc8ddb 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,30 +1,24 @@ name: build -on: [push, pull_request] +on: [ push, pull_request ] jobs: build: runs-on: ubuntu-latest steps: - - - name: Checkout code + - name: Checkout code uses: actions/checkout@v3 - - - name: Install Go + - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.21.x' - - - name: Install node + go-version: '1.22.x' + - name: Install node uses: actions/setup-node@v3 with: node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build all the things + - name: Build all the things run: make build - - - name: Print build results and checksums + - name: Print build results and checksums run: make cli-build-results diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index c630a2d3..80155e5b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,35 +7,28 @@ jobs: release: runs-on: ubuntu-latest steps: - - - name: Checkout code + - name: Checkout code uses: actions/checkout@v3 - - - name: Install Go + - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.21.x' - - - name: Install node + go-version: '1.22.x' + - name: Install node uses: actions/setup-node@v3 with: node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - - - name: Docker login + - name: Docker login uses: docker/login-action@v2 with: username: ${{ github.repository_owner }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build and publish + - name: Build and publish run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Print build results and checksums + - name: Print build results and checksums run: make cli-build-results diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 53eb1d67..b0f99ffd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,39 +1,30 @@ name: test -on: [push, pull_request] +on: [ push, pull_request ] jobs: test: runs-on: ubuntu-latest steps: - - - name: Checkout code + - name: Checkout code uses: actions/checkout@v3 - - - name: Install Go + - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.21.x' - - - name: Install node + go-version: '1.22.x' + - name: Install node uses: actions/setup-node@v3 with: node-version: '20' cache: 'npm' cache-dependency-path: './web/package-lock.json' - - - name: Install dependencies + - name: Install dependencies run: make build-deps-ubuntu - - - name: Build docs (required for tests) + - name: Build docs (required for tests) run: make docs - - - name: Build web app (required for tests) + - name: Build web app (required for tests) run: make web - - - name: Run tests, formatting, vetting and linting + - name: Run tests, formatting, vetting and linting run: make check - - - name: Run coverage + - name: Run coverage run: make coverage - - - name: Upload coverage to codecov.io + - name: Upload coverage to codecov.io run: make coverage-upload diff --git a/docs/config.md b/docs/config.md index 453e3cfe..6208f90d 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1078,20 +1078,23 @@ By default, ntfy puts almost all rate limits on the message publisher, e.g. numb size are all based on the visitor who publishes a message. **Subscriber-based rate limiting is a way to use the rate limits of a topic's subscriber, instead of the limits of the publisher.** -If enabled, subscribers may opt to have published messages counted against their own rate limits, as opposed -to the publisher's rate limits. This is especially useful to increase the amount of messages that high-volume -publishers (e.g. Matrix/Mastodon servers) are allowed to send. +If subscriber-based rate limiting is enabled, **messages published on UnifiedPush topics** (topics starting with `up`, e.g. `up123456789012`) +will be counted towards the "rate visitor" of the topic. A "rate visitor" is the first subscriber to the topic. -Once enabled, a client may send a `Rate-Topics: ,,...` header when subscribing to topics via -HTTP stream, or websockets, thereby registering itself as the "rate visitor", i.e. the visitor whose rate limits -to use when publishing on this topic. Note that setting the rate visitor requires **read-write permission** on the topic. +Once enabled, a client subscribing to UnifiedPush topics via HTTP stream, or websockets, will be automatically registered as +a "rate visitor", i.e. the visitor whose rate limits will be used when publishing on this topic. Note that setting the rate visitor +requires **read-write permission** on the topic. -UnifiedPush only: If this setting is enabled, publishing to UnifiedPush topics will lead to an `HTTP 507 Insufficient Storage` +If this setting is enabled, publishing to UnifiedPush topics will lead to an `HTTP 507 Insufficient Storage` response if no "rate visitor" has been previously registered. This is to avoid burning the publisher's `visitor-message-daily-limit`. To enable subscriber-based rate limiting, set `visitor-subscriber-rate-limiting: true`. +!!! info + Due to a denial-of-service issue, support for the `Rate-Topics` header was removed entirely. This is unfortunate, + but subscriber-based rate limiting will still work for `up*` topics. + ## Tuning for scale If you're running ntfy for your home server, you probably don't need to worry about scale at all. In its default config, if it's not behind a proxy, the ntfy server can keep about **as many connections as the open file limit allows**. diff --git a/docs/deprecations.md b/docs/deprecations.md index 99cdeeb9..56b1db85 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -1,4 +1,4 @@ -# Deprecation notices +# Deprecations and breaking changes This page is used to list deprecation notices for ntfy. Deprecated commands and options will be **removed after 1-3 months** from the time they were deprecated. How long the feature is deprecated before the behavior is changed depends on the severity of the change, and how prominent the feature is. diff --git a/docs/releases.md b/docs/releases.md index 99bca6ca..fd61693c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1313,6 +1313,12 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet +### ntfy server v2.9.0 + +**Bug fixes + maintenance:** + +* Remove `Rate-Topics` header due to DoS security issue if `visitor-subscriber-rate-limiting: true` ([#1048](https://github.com/binwiederhier/ntfy/issues/1048)) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** diff --git a/go.mod b/go.mod index beb2c014..1a5ecf76 100644 --- a/go.mod +++ b/go.mod @@ -5,23 +5,23 @@ go 1.21 toolchain go1.21.3 require ( - cloud.google.com/go/firestore v1.14.0 // indirect - cloud.google.com/go/storage v1.36.0 // indirect + cloud.google.com/go/firestore v1.15.0 // indirect + cloud.google.com/go/storage v1.39.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/emersion/go-smtp v0.18.0 github.com/gabriel-vasile/mimetype v1.4.3 github.com/gorilla/websocket v1.5.1 - github.com/mattn/go-sqlite3 v1.14.19 + github.com/mattn/go-sqlite3 v1.14.22 github.com/olebedev/when v1.0.0 github.com/stretchr/testify v1.8.4 github.com/urfave/cli/v2 v2.27.1 - golang.org/x/crypto v0.18.0 - golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/crypto v0.21.0 + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sync v0.6.0 - golang.org/x/term v0.16.0 + golang.org/x/term v0.18.0 golang.org/x/time v0.5.0 - google.golang.org/api v0.157.0 + google.golang.org/api v0.168.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -33,16 +33,16 @@ require ( firebase.google.com/go/v4 v4.13.0 github.com/SherClockHolmes/webpush-go v1.3.0 github.com/microcosm-cc/bluemonday v1.0.26 - github.com/prometheus/client_golang v1.18.0 + github.com/prometheus/client_golang v1.19.0 github.com/stripe/stripe-go/v74 v74.30.0 ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute v1.25.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/longrunning v0.5.4 // indirect + cloud.google.com/go/iam v1.1.6 // indirect + cloud.google.com/go/longrunning v0.5.5 // indirect github.com/AlekSi/pointer v1.2.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/aymerick/douceur v0.2.0 // indirect @@ -56,37 +56,35 @@ require ( github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.46.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.50.0 // indirect + github.com/prometheus/procfs v0.13.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect - go.opentelemetry.io/otel v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine/v2 v2.0.5 // indirect - google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac // indirect - google.golang.org/grpc v1.60.1 // indirect - google.golang.org/protobuf v1.32.0 // indirect + google.golang.org/genproto v0.0.0-20240304212257-790db918fca8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b441b5bf..bdd68ab7 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/compute v1.25.0 h1:H1/4SqSUhjPFE7L5ddzHOfY2bCAvjwNRZPNl6Ni5oYU= +cloud.google.com/go/compute v1.25.0/go.mod h1:GR7F0ZPZH8EhChlMo9FkLd7eUTwEymjqQagxzilIxIE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= -cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -firebase.google.com/go/v4 v4.12.1 h1:tDNvobifGsx/1HSFLnM0fmNfx/CDZSgsTO2KhZtgpcs= -firebase.google.com/go/v4 v4.12.1/go.mod h1:60c36dWLK4+j05Vw5XMllek3b3PCynU3BfI46OSwsUE= +cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/storage v1.39.0 h1:brbjUa4hbDHhpQf48tjqMaXEV+f1OGoaTmQau9tmCsA= +cloud.google.com/go/storage v1.39.0/go.mod h1:OAEj/WZwUYjA3YHQ10/YcN9ttGuEpLwvaoyBXIPikEk= firebase.google.com/go/v4 v4.13.0 h1:meFz9nvDNh/FDyrEykoAzSfComcQbmnQSjoHrePRqeI= firebase.google.com/go/v4 v4.13.0/go.mod h1:e1/gaR6EnbQfsmTnAMx1hnz+ninJIrrr/RAh59Tpfn8= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= @@ -84,8 +78,8 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 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/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -100,14 +94,12 @@ github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3 github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= @@ -116,12 +108,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= -github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= -github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= @@ -130,19 +118,15 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= -github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= -github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= +github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= +github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= +github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -159,35 +143,31 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI= github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -206,22 +186,16 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= 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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -235,18 +209,14 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -256,8 +226,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= -golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -272,10 +240,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.151.0 h1:FhfXLO/NFdJIzQtCqjpysWwqKk8AzGWBUhMIx67cVDU= -google.golang.org/api v0.151.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= -google.golang.org/api v0.157.0 h1:ORAeqmbrrozeyw5NjnMxh7peHO0UzV4wWYSwZeCUb20= -google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= +google.golang.org/api v0.168.0 h1:MBRe+Ki4mMN93jhDDbpuRLjRddooArz4FeSObvUMmjY= +google.golang.org/api v0.168.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= 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.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= @@ -285,27 +251,19 @@ google.golang.org/appengine/v2 v2.0.5/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac h1:OZkkudMUu9LVQMCoRUbI/1p5VCo9BOrlvkqMvWtqa6s= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac h1:nUQEQmH/csSvFECKYRv6HWEyypysidKl2I6Qpsglq/0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto v0.0.0-20240304212257-790db918fca8 h1:Fe8QycXyEd9mJgnwB9kmw00WgB43eQ/xYO5C6gceybQ= +google.golang.org/genproto v0.0.0-20240304212257-790db918fca8/go.mod h1:yA7a1bW1kwl459Ol0m0lV4hLTfrL/7Bkk4Mj2Ir1mWI= +google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8 h1:IR+hp6ypxjH24bkMfEJ0yHR21+gwPWdV+/IBrPQyn3k= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240304212257-790db918fca8/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -318,10 +276,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/server/server.go b/server/server.go index c0f3b641..aad452ed 100644 --- a/server/server.go +++ b/server/server.go @@ -743,8 +743,8 @@ func (s *Server) handlePublishInternal(r *http.Request, v *visitor) (*message, e return nil, e.With(t) } if unifiedpush && s.config.VisitorSubscriberRateLimiting && t.RateVisitor() == nil { - // UnifiedPush clients must subscribe before publishing to allow proper subscriber-based rate limiting (see - // Rate-Topics header). The 5xx response is because some app servers (in particular Mastodon) will remove + // UnifiedPush clients must subscribe before publishing to allow proper subscriber-based rate limiting. + // The 5xx response is because some app servers (in particular Mastodon) will remove // the subscription as invalid if any 400-499 code (except 429/408) is returned. // See https://github.com/mastodon/mastodon/blob/730bb3e211a84a2f30e3e2bbeae3f77149824a68/app/workers/web/push_notification_worker.rb#L35-L46 return nil, errHTTPInsufficientStorageUnifiedPush.With(t) @@ -1182,7 +1182,7 @@ func (s *Server) handleSubscribeHTTP(w http.ResponseWriter, r *http.Request, v * if err != nil { return err } - poll, since, scheduled, filters, rateTopics, err := parseSubscribeParams(r) + poll, since, scheduled, filters, err := parseSubscribeParams(r) if err != nil { return err } @@ -1212,7 +1212,7 @@ func (s *Server) handleSubscribeHTTP(w http.ResponseWriter, r *http.Request, v * } return nil } - if err := s.maybeSetRateVisitors(r, v, topics, rateTopics); err != nil { + if err := s.maybeSetRateVisitors(r, v, topics); err != nil { return err } w.Header().Set("Access-Control-Allow-Origin", s.config.AccessControlAllowOrigin) // CORS, allow cross-origin requests @@ -1278,7 +1278,7 @@ func (s *Server) handleSubscribeWS(w http.ResponseWriter, r *http.Request, v *vi if err != nil { return err } - poll, since, scheduled, filters, rateTopics, err := parseSubscribeParams(r) + poll, since, scheduled, filters, err := parseSubscribeParams(r) if err != nil { return err } @@ -1364,7 +1364,7 @@ func (s *Server) handleSubscribeWS(w http.ResponseWriter, r *http.Request, v *vi } return conn.WriteJSON(msg) } - if err := s.maybeSetRateVisitors(r, v, topics, rateTopics); err != nil { + if err := s.maybeSetRateVisitors(r, v, topics); err != nil { return err } w.Header().Set("Access-Control-Allow-Origin", s.config.AccessControlAllowOrigin) // CORS, allow cross-origin requests @@ -1397,7 +1397,7 @@ func (s *Server) handleSubscribeWS(w http.ResponseWriter, r *http.Request, v *vi return err } -func parseSubscribeParams(r *http.Request) (poll bool, since sinceMarker, scheduled bool, filters *queryFilter, rateTopics []string, err error) { +func parseSubscribeParams(r *http.Request) (poll bool, since sinceMarker, scheduled bool, filters *queryFilter, err error) { poll = readBoolParam(r, false, "x-poll", "poll", "po") scheduled = readBoolParam(r, false, "x-scheduled", "scheduled", "sched") since, err = parseSince(r, poll) @@ -1408,7 +1408,6 @@ func parseSubscribeParams(r *http.Request) (poll bool, since sinceMarker, schedu if err != nil { return } - rateTopics = readCommaSeparatedParam(r, "x-rate-topics", "rate-topics") return } @@ -1420,9 +1419,8 @@ func parseSubscribeParams(r *http.Request) (poll bool, since sinceMarker, schedu // - or the topic is reserved, and v.user is the owner // - or the topic is not reserved, and v.user has write access // -// Note: This TEMPORARILY also registers all topics starting with "up" (= UnifiedPush). This is to ease the transition -// until the Android app will send the "Rate-Topics" header. -func (s *Server) maybeSetRateVisitors(r *http.Request, v *visitor, topics []*topic, rateTopics []string) error { +// This only applies to UnifiedPush topics ("up..."). +func (s *Server) maybeSetRateVisitors(r *http.Request, v *visitor, topics []*topic) error { // Bail out if not enabled if !s.config.VisitorSubscriberRateLimiting { return nil @@ -1431,7 +1429,7 @@ func (s *Server) maybeSetRateVisitors(r *http.Request, v *visitor, topics []*top // Make a list of topics that we'll actually set the RateVisitor on eligibleRateTopics := make([]*topic, 0) for _, t := range topics { - if (strings.HasPrefix(t.ID, unifiedPushTopicPrefix) && len(t.ID) == unifiedPushTopicLength) || util.Contains(rateTopics, t.ID) { + if strings.HasPrefix(t.ID, unifiedPushTopicPrefix) && len(t.ID) == unifiedPushTopicLength { eligibleRateTopics = append(eligibleRateTopics, t) } } diff --git a/server/server.yml b/server/server.yml index b044a914..e9e55e9b 100644 --- a/server/server.yml +++ b/server/server.yml @@ -277,15 +277,14 @@ # Rate limiting: Enable subscriber-based rate limiting (mostly used for UnifiedPush) # -# If enabled, subscribers may opt to have published messages counted against their own rate limits, as opposed -# to the publisher's rate limits. This is especially useful to increase the amount of messages that high-volume -# publishers (e.g. Matrix/Mastodon servers) are allowed to send. +# If subscriber-based rate limiting is enabled, messages published on UnifiedPush topics** (topics starting with "up") +# will be counted towards the "rate visitor" of the topic. A "rate visitor" is the first subscriber to the topic. # -# Once enabled, a client may send a "Rate-Topics: ,,..." header when subscribing to topics via -# HTTP stream, or websockets, thereby registering itself as the "rate visitor", i.e. the visitor whose rate limits -# to use when publishing on this topic. Note: Setting the rate visitor requires READ-WRITE permission on the topic. +# Once enabled, a client subscribing to UnifiedPush topics via HTTP stream, or websockets, will be automatically registered as +# a "rate visitor", i.e. the visitor whose rate limits will be used when publishing on this topic. Note that setting the rate visitor +# requires **read-write permission** on the topic. # -# UnifiedPush only: If this setting is enabled, publishing to UnifiedPush topics will lead to a HTTP 507 response if +# If this setting is enabled, publishing to UnifiedPush topics will lead to a HTTP 507 response if # no "rate visitor" has been previously registered. This is to avoid burning the publisher's "visitor-message-daily-limit". # # visitor-subscriber-rate-limiting: false diff --git a/server/server_test.go b/server/server_test.go index 5f2bac6a..8d965153 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -1346,9 +1346,7 @@ func TestServer_PublishUnifiedPushBinary_AndPoll(t *testing.T) { s := newTestServer(t, newTestConfig(t)) // Register a UnifiedPush subscriber - response := request(t, s, "GET", "/up123456789012/json?poll=1", "", map[string]string{ - "Rate-Topics": "up123456789012", - }) + response := request(t, s, "GET", "/up123456789012/json?poll=1", "", nil) require.Equal(t, 200, response.Code) // Publish message to topic @@ -1379,9 +1377,7 @@ func TestServer_PublishUnifiedPushBinary_Truncated(t *testing.T) { s := newTestServer(t, newTestConfig(t)) // Register a UnifiedPush subscriber - response := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ - "Rate-Topics": "mytopic", - }) + response := request(t, s, "GET", "/mytopic/json?poll=1", "", nil) require.Equal(t, 200, response.Code) // Publish message to topic @@ -1400,9 +1396,7 @@ func TestServer_PublishUnifiedPushText(t *testing.T) { s := newTestServer(t, newTestConfig(t)) // Register a UnifiedPush subscriber - response := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ - "Rate-Topics": "mytopic", - }) + response := request(t, s, "GET", "/mytopic/json?poll=1", "", nil) require.Equal(t, 200, response.Code) // Publish UnifiedPush text message @@ -1434,9 +1428,7 @@ func TestServer_MatrixGateway_Discovery_Failure_Unconfigured(t *testing.T) { func TestServer_MatrixGateway_Push_Success(t *testing.T) { s := newTestServer(t, newTestConfig(t)) - response := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ - "Rate-Topics": "mytopic", // Register first! - }) + response := request(t, s, "GET", "/mytopic/json?poll=1", "", nil) require.Equal(t, 200, response.Code) notification := `{"notification":{"devices":[{"pushkey":"http://127.0.0.1:12345/mytopic?up=1"}]}}` @@ -2266,16 +2258,14 @@ func TestServer_SubscriberRateLimiting_Success(t *testing.T) { c.VisitorSubscriberRateLimiting = true s := newTestServer(t, c) - // "Register" visitor 1.2.3.4 to topic "subscriber1topic" as a rate limit visitor + // "Register" visitor 1.2.3.4 to topic "upAAAAAAAAAAAA" as a rate limit visitor subscriber1Fn := func(r *http.Request) { r.RemoteAddr = "1.2.3.4" } - rr := request(t, s, "GET", "/subscriber1topic/json?poll=1", "", map[string]string{ - "Rate-Topics": "subscriber1topic", - }, subscriber1Fn) + rr := request(t, s, "GET", "/upAAAAAAAAAAAA/json?poll=1", "", nil, subscriber1Fn) require.Equal(t, 200, rr.Code) require.Equal(t, "", rr.Body.String()) - require.Equal(t, "1.2.3.4", s.topics["subscriber1topic"].rateVisitor.ip.String()) + require.Equal(t, "1.2.3.4", s.topics["upAAAAAAAAAAAA"].rateVisitor.ip.String()) // "Register" visitor 8.7.7.1 to topic "up012345678912" as a rate limit visitor (implicitly via topic name) subscriber2Fn := func(r *http.Request) { @@ -2289,10 +2279,10 @@ func TestServer_SubscriberRateLimiting_Success(t *testing.T) { // Publish 2 messages to "subscriber1topic" as visitor 9.9.9.9. It'd be 3 normally, but the // GET request before is also counted towards the request limiter. for i := 0; i < 2; i++ { - rr := request(t, s, "PUT", "/subscriber1topic", "some message", nil) + rr := request(t, s, "PUT", "/upAAAAAAAAAAAA", "some message", nil) require.Equal(t, 200, rr.Code) } - rr = request(t, s, "PUT", "/subscriber1topic", "some message", nil) + rr = request(t, s, "PUT", "/upAAAAAAAAAAAA", "some message", nil) require.Equal(t, 429, rr.Code) // Publish another 2 messages to "up012345678912" as visitor 9.9.9.9 @@ -2325,14 +2315,12 @@ func TestServer_SubscriberRateLimiting_NotEnabled_Failed(t *testing.T) { // Subscriber rate limiting is disabled! // Registering visitor 1.2.3.4 to topic has no effect - rr := request(t, s, "GET", "/subscriber1topic/json?poll=1", "", map[string]string{ - "Rate-Topics": "subscriber1topic", - }, func(r *http.Request) { + rr := request(t, s, "GET", "/upAAAAAAAAAAAA/json?poll=1", "", nil, func(r *http.Request) { r.RemoteAddr = "1.2.3.4" }) require.Equal(t, 200, rr.Code) require.Equal(t, "", rr.Body.String()) - require.Nil(t, s.topics["subscriber1topic"].rateVisitor) + require.Nil(t, s.topics["upAAAAAAAAAAAA"].rateVisitor) // Registering visitor 8.7.7.1 to topic has no effect rr = request(t, s, "GET", "/up012345678912/json?poll=1", "", nil, func(r *http.Request) { @@ -2342,7 +2330,7 @@ func TestServer_SubscriberRateLimiting_NotEnabled_Failed(t *testing.T) { require.Equal(t, "", rr.Body.String()) require.Nil(t, s.topics["up012345678912"].rateVisitor) - // Publish 3 messages to "subscriber1topic" as visitor 9.9.9.9 + // Publish 3 messages to "upAAAAAAAAAAAA" as visitor 9.9.9.9 for i := 0; i < 3; i++ { rr := request(t, s, "PUT", "/subscriber1topic", "some message", nil) require.Equal(t, 200, rr.Code) @@ -2415,80 +2403,30 @@ func TestServer_SubscriberRateLimiting_VisitorExpiration(t *testing.T) { subscriberFn := func(r *http.Request) { r.RemoteAddr = "1.2.3.4" } - rr := request(t, s, "GET", "/mytopic/json?poll=1", "", map[string]string{ - "rate-topics": "mytopic", - }, subscriberFn) + rr := request(t, s, "GET", "/upAAAAAAAAAAAA/json?poll=1", "", nil, subscriberFn) require.Equal(t, 200, rr.Code) - require.Equal(t, "1.2.3.4", s.topics["mytopic"].rateVisitor.ip.String()) - require.Equal(t, s.visitors["ip:1.2.3.4"], s.topics["mytopic"].rateVisitor) + require.Equal(t, "1.2.3.4", s.topics["upAAAAAAAAAAAA"].rateVisitor.ip.String()) + require.Equal(t, s.visitors["ip:1.2.3.4"], s.topics["upAAAAAAAAAAAA"].rateVisitor) // Publish message, observe rate visitor tokens being decreased - response := request(t, s, "POST", "/mytopic", "some message", nil) + response := request(t, s, "POST", "/upAAAAAAAAAAAA", "some message", nil) require.Equal(t, 200, response.Code) require.Equal(t, int64(0), s.visitors["ip:9.9.9.9"].messagesLimiter.Value()) - require.Equal(t, int64(1), s.topics["mytopic"].rateVisitor.messagesLimiter.Value()) - require.Equal(t, s.visitors["ip:1.2.3.4"], s.topics["mytopic"].rateVisitor) + require.Equal(t, int64(1), s.topics["upAAAAAAAAAAAA"].rateVisitor.messagesLimiter.Value()) + require.Equal(t, s.visitors["ip:1.2.3.4"], s.topics["upAAAAAAAAAAAA"].rateVisitor) // Expire visitor s.visitors["ip:1.2.3.4"].seen = time.Now().Add(-1 * 25 * time.Hour) s.pruneVisitors() // Publish message again, observe that rateVisitor is not used anymore and is reset - response = request(t, s, "POST", "/mytopic", "some message", nil) + response = request(t, s, "POST", "/upAAAAAAAAAAAA", "some message", nil) require.Equal(t, 200, response.Code) require.Equal(t, int64(1), s.visitors["ip:9.9.9.9"].messagesLimiter.Value()) - require.Nil(t, s.topics["mytopic"].rateVisitor) + require.Nil(t, s.topics["upAAAAAAAAAAAA"].rateVisitor) require.Nil(t, s.visitors["ip:1.2.3.4"]) } -func TestServer_SubscriberRateLimiting_ProtectedTopics(t *testing.T) { - c := newTestConfigWithAuthFile(t) - c.AuthDefault = user.PermissionDenyAll - c.VisitorSubscriberRateLimiting = true - s := newTestServer(t, c) - - // Create some ACLs - require.Nil(t, s.userManager.AddTier(&user.Tier{ - Code: "test", - MessageLimit: 5, - })) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) - require.Nil(t, s.userManager.ChangeTier("ben", "test")) - require.Nil(t, s.userManager.AllowAccess("ben", "announcements", user.PermissionReadWrite)) - require.Nil(t, s.userManager.AllowAccess(user.Everyone, "announcements", user.PermissionRead)) - require.Nil(t, s.userManager.AllowAccess(user.Everyone, "public_topic", user.PermissionReadWrite)) - - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) - require.Nil(t, s.userManager.ChangeTier("phil", "test")) - require.Nil(t, s.userManager.AddReservation("phil", "reserved-for-phil", user.PermissionReadWrite)) - - // Set rate visitor as user "phil" on topic - // - "reserved-for-phil": Allowed, because I am the owner - // - "public_topic": Allowed, because it has read-write permissions for everyone - // - "announcements": NOT allowed, because it has read-only permissions for everyone - rr := request(t, s, "GET", "/reserved-for-phil,public_topic,announcements/json?poll=1", "", map[string]string{ - "Authorization": util.BasicAuth("phil", "phil"), - "Rate-Topics": "reserved-for-phil,public_topic,announcements", - }) - require.Equal(t, 200, rr.Code) - require.Equal(t, "phil", s.topics["reserved-for-phil"].rateVisitor.user.Name) - require.Equal(t, "phil", s.topics["public_topic"].rateVisitor.user.Name) - require.Nil(t, s.topics["announcements"].rateVisitor) - - // Set rate visitor as user "ben" on topic - // - "reserved-for-phil": NOT allowed, because I am not the owner - // - "public_topic": Allowed, because it has read-write permissions for everyone - // - "announcements": Allowed, because I have read-write permissions - rr = request(t, s, "GET", "/reserved-for-phil,public_topic,announcements/json?poll=1", "", map[string]string{ - "Authorization": util.BasicAuth("ben", "ben"), - "Rate-Topics": "reserved-for-phil,public_topic,announcements", - }) - require.Equal(t, 200, rr.Code) - require.Equal(t, "phil", s.topics["reserved-for-phil"].rateVisitor.user.Name) - require.Equal(t, "ben", s.topics["public_topic"].rateVisitor.user.Name) - require.Equal(t, "ben", s.topics["announcements"].rateVisitor.user.Name) -} - func TestServer_SubscriberRateLimiting_ProtectedTopics_WithDefaultReadWrite(t *testing.T) { c := newTestConfigWithAuthFile(t) c.AuthDefault = user.PermissionReadWrite diff --git a/web/package-lock.json b/web/package-lock.json index 937d8597..4242fc3b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -55,13 +55,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -89,9 +89,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -99,11 +99,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -180,9 +180,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", + "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -324,9 +324,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -442,14 +442,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -469,9 +469,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -791,9 +791,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1149,9 +1149,9 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", @@ -1246,14 +1246,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.23.3" }, @@ -1578,14 +1578,14 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", @@ -1610,7 +1610,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", @@ -1632,13 +1632,13 @@ "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", @@ -1658,9 +1658,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1692,9 +1692,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1703,23 +1703,23 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -1728,8 +1728,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1738,9 +1738,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1750,6 +1750,15 @@ "node": ">=6.9.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", @@ -1796,9 +1805,9 @@ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -1809,9 +1818,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", - "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -2320,37 +2329,37 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz", - "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz", - "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dependencies": { - "@floating-ui/core": "^1.5.3", + "@floating-ui/core": "^1.0.0", "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.6.tgz", - "integrity": "sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", "dependencies": { - "@floating-ui/dom": "^1.5.4" + "@floating-ui/dom": "^1.6.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -2396,32 +2405,32 @@ "dev": true }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2444,9 +2453,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2465,14 +2474,14 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.32", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.32.tgz", - "integrity": "sha512-4VptvYeLUYMJhZapWBkD50GmKfOc0XT381KJcTK3ncZYIl8MdBhpR6l8jOyeP5cixUPBJhstjrnmQEAHjCLriw==", + "version": "5.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.38.tgz", + "integrity": "sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ==", "dependencies": { - "@babel/runtime": "^7.23.8", - "@floating-ui/react-dom": "^2.0.5", + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.5", + "@mui/utils": "^5.15.12", "@popperjs/core": "^2.11.8", "clsx": "^2.1.0", "prop-types": "^15.8.1" @@ -2496,20 +2505,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.5.tgz", - "integrity": "sha512-VhT8klyXy8GrWrARqLMoM6Nzz809Jc3Wn5wd7WOZfre2vFO1rBV1dBANAPBhBqpaQI0HCMRTWEYoSyOFgRnz4A==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz", + "integrity": "sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.5.tgz", - "integrity": "sha512-qiql0fd1JY7TZ1wm1RldvU7sL8QUatE9OC12i/qm5rnm/caTFyAfOyTIR7qqxorsJvoZGyrzwoMkal6Ij9kM0A==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.12.tgz", + "integrity": "sha512-3BXiDlOd3AexZoEXa/VqpIpVIvosCzjLHsdMWzKMXbZdnBiJjmb9ECdqfjn5SpTClO49qvkKLhkTqdBH3fSFGw==", "dependencies": { - "@babel/runtime": "^7.23.8" + "@babel/runtime": "^7.23.9" }, "engines": { "node": ">=12.0.0" @@ -2530,19 +2539,19 @@ } }, "node_modules/@mui/material": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.5.tgz", - "integrity": "sha512-2KfA39f/UWeQl0O22UJs3x1nG3chYlyu9wnux5vTnxUTLzkgYIzQIHaH+ZOGpv5JiZBMKktAPNfhqyhSaQ49qQ==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.12.tgz", + "integrity": "sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA==", "dependencies": { - "@babel/runtime": "^7.23.8", - "@mui/base": "5.0.0-beta.32", - "@mui/core-downloads-tracker": "^5.15.5", - "@mui/system": "^5.15.5", + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.38", + "@mui/core-downloads-tracker": "^5.15.12", + "@mui/system": "^5.15.12", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.5", + "@mui/utils": "^5.15.12", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -2574,12 +2583,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.5.tgz", - "integrity": "sha512-HU1KCyGNcJFsUamTbOM539ZDZJNI/XU7sZFdsN29glktUf+T6hNvDuO2ISinBiLTZy7Ab3R6DSSoYXRrLc4uwQ==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz", + "integrity": "sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA==", "dependencies": { - "@babel/runtime": "^7.23.8", - "@mui/utils": "^5.15.5", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.12", "prop-types": "^15.8.1" }, "engines": { @@ -2600,13 +2609,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.5.tgz", - "integrity": "sha512-xoMUd8h270thNL7ZsOzmlluIAMsQg/HT7SCdRjPBVle+XHgTKaiWiRy1ekDOsrrF0rhjME3T7xeeUq2G269UUw==", + "version": "5.15.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz", + "integrity": "sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==", "dependencies": { - "@babel/runtime": "^7.23.8", + "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -2631,17 +2640,17 @@ } }, "node_modules/@mui/system": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.5.tgz", - "integrity": "sha512-DMv2vGjUKaDt/m0RlzvLjpKiS5V0LoBhiMUHf5pWdj6uoNlN4FuKUe4pFeYmQMIO5DnVZKybmpPepfkdfEH+Og==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz", + "integrity": "sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ==", "dependencies": { - "@babel/runtime": "^7.23.8", - "@mui/private-theming": "^5.15.5", - "@mui/styled-engine": "^5.15.5", + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.12", + "@mui/styled-engine": "^5.15.11", "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.5", + "@mui/utils": "^5.15.12", "clsx": "^2.1.0", - "csstype": "^3.1.2", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -2683,11 +2692,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.5.tgz", - "integrity": "sha512-jEywgaMGZWPSlVFO7ZZAyXxNeLmq5XBp5At9Ne/sGohRJdesUcdxvyi8TP3odJxwQuL5L6PJV+JQ4DyIDM849A==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz", + "integrity": "sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow==", "dependencies": { - "@babel/runtime": "^7.23.8", + "@babel/runtime": "^7.23.9", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -2754,13 +2763,19 @@ } }, "node_modules/@remix-run/router": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz", - "integrity": "sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.2.tgz", + "integrity": "sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==", "engines": { "node": ">=14.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "peer": true + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -2814,6 +2829,21 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "peer": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -2835,10 +2865,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", - "dev": true, + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2854,9 +2883,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.2.64", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz", + "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2921,6 +2950,19 @@ "vite": "^4.2.0 || ^5.0.0" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -2962,7 +3004,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2978,6 +3019,19 @@ "node": ">=4" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2994,13 +3048,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3025,17 +3082,55 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3080,31 +3175,44 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.tosorted": { + "node_modules/array.prototype.toreversed": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -3145,10 +3253,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3203,29 +3314,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3255,14 +3350,69 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "peer": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3272,7 +3422,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3281,9 +3430,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3300,8 +3449,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3330,15 +3479,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3353,9 +3515,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001596", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", + "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", "dev": true, "funding": [ { @@ -3420,6 +3582,53 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/clsx": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", @@ -3468,8 +3677,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -3477,24 +3685,85 @@ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "dev": true }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.22.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "peer": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -3554,12 +3823,27 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "peer": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3592,17 +3876,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3622,6 +3908,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3631,10 +3926,23 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/dexie": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz", - "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.6.tgz", + "integrity": "sha512-R9VzQ27/cncQymoAeD1kfu66NUrdxcnMNXVfEoFLnQ+apVVbS4++veUcSGxft9V++zaeiLkMAREOMf8EwgR/Vw==", + "dependencies": { + "karma-safari-launcher": "^1.0.0" + }, "engines": { "node": ">=6.0" } @@ -3649,6 +3957,12 @@ "react": ">=16" } }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "peer": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3670,6 +3984,24 @@ "csstype": "^3.0.2" } }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "peer": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "peer": true + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -3686,9 +4018,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.640", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", - "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==", + "version": "1.4.695", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.695.tgz", + "integrity": "sha512-eMijZmeqPtm774pCZIOrfUHMs/7ls++W1sLhxwqgu8KQ8E2WmMtzwyqOMt0XXUJ3HTIPfuwlfwF+I5cwnfItBA==", "dev": true }, "node_modules/emoji-regex": { @@ -3697,6 +4029,51 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "peer": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "peer": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3714,50 +4091,52 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3766,37 +4145,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3866,14 +4274,19 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "peer": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3886,16 +4299,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -4013,9 +4426,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4121,27 +4534,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -4381,6 +4796,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "peer": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4433,9 +4854,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4487,7 +4908,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4495,6 +4915,51 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -4531,10 +4996,29 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, "node_modules/for-each": { "version": "0.3.3", @@ -4546,31 +5030,28 @@ } }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "peer": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=6 <7 || >=8" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -4624,17 +5105,29 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4646,13 +5139,14 @@ "dev": true }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4665,7 +5159,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4721,7 +5214,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4732,8 +5224,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -4759,22 +5250,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -4786,7 +5275,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4795,12 +5283,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4810,9 +5298,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -4859,6 +5347,53 @@ "void-elements": "3.1.0" } }, + "node_modules/html-parse-stringify/node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/humanize-duration": { "version": "3.31.0", "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.31.0.tgz", @@ -4902,6 +5437,18 @@ "cross-fetch": "3.1.5" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -4909,9 +5456,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -4945,7 +5492,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4954,8 +5500,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inline-style-parser": { "version": "0.1.1", @@ -4963,12 +5508,12 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -4999,14 +5544,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5044,6 +5591,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -5133,7 +5692,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5150,6 +5708,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -5169,7 +5736,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5202,9 +5768,9 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5217,7 +5783,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -5298,12 +5863,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5352,12 +5920,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5406,6 +5974,18 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "peer": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5549,9 +6129,9 @@ } }, "node_modules/js-base64": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", - "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==" + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -5624,13 +6204,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -5659,6 +6236,61 @@ "node": ">=4.0" } }, + "node_modules/karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "peer": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-safari-launcher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz", + "integrity": "sha512-qmypLWd6F2qrDJfAETvXDfxHvKDk+nyIjpH9xIeI3/hENr0U3nuqkxaftq73PfXZ4aOuOChA6SnLW4m4AxfRjQ==", + "peerDependencies": { + "karma": ">=0.9" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5731,8 +6363,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -5752,6 +6383,22 @@ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "peer": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5896,6 +6543,15 @@ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5943,11 +6599,43 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5959,11 +6647,22 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5993,6 +6692,15 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -6018,6 +6726,15 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6030,7 +6747,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6094,15 +6810,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.hasown": { @@ -6135,11 +6852,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -6236,6 +6964,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6249,7 +6986,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6286,7 +7022,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6294,10 +7029,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -6394,6 +7138,30 @@ "node": ">=6" } }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "peer": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6423,6 +7191,30 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -6514,11 +7306,11 @@ } }, "node_modules/react-router": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz", - "integrity": "sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg==", + "version": "6.22.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.2.tgz", + "integrity": "sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==", "dependencies": { - "@remix-run/router": "1.14.2" + "@remix-run/router": "1.15.2" }, "engines": { "node": ">=14.0.0" @@ -6528,12 +7320,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.21.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz", - "integrity": "sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g==", + "version": "6.22.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.2.tgz", + "integrity": "sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==", "dependencies": { - "@remix-run/router": "1.14.2", - "react-router": "6.21.3" + "@remix-run/router": "1.15.2", + "react-router": "6.22.2" }, "engines": { "node": ">=14.0.0" @@ -6558,16 +7350,29 @@ "react-dom": ">=16.6.0" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -6611,14 +7416,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -6702,6 +7508,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6711,6 +7526,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "peer": true + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -6745,11 +7566,16 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "peer": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -6838,13 +7664,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -6854,6 +7680,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "peer": true + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -6881,14 +7713,14 @@ } }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" }, @@ -6897,19 +7729,26 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "peer": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6932,19 +7771,63 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/socket.io": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", + "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "peer": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "peer": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -7037,6 +7920,49 @@ "stacktrace-gps": "^3.0.4" } }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "peer": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "peer": true + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -7120,7 +8046,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7232,9 +8157,9 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -7263,6 +8188,15 @@ "node": ">=8" } }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "peer": true, + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7275,7 +8209,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -7283,6 +8216,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -7345,30 +8287,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -7378,16 +8334,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -7397,19 +8354,48 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -7428,8 +8414,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -7570,12 +8555,21 @@ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "peer": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/upath": { @@ -7627,6 +8621,24 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -7732,9 +8744,10 @@ } }, "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7835,16 +8848,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8026,12 +9039,39 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -8096,6 +9136,15 @@ "punycode": "^2.1.0" } }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -8143,6 +9192,7 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dev": true, "dependencies": { "workbox-background-sync": "6.6.0", @@ -8238,11 +9288,81 @@ "workbox-core": "6.6.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/xtend": { "version": "4.0.2", @@ -8252,6 +9372,15 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -8266,6 +9395,33 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", From cae696c323c5aacbd3291d537b4bb3b8641959c7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 7 Mar 2024 10:17:43 -0500 Subject: [PATCH 180/182] Switch to non-deprecated emoji extension in mkdocs --- mkdocs.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index bf0482aa..a91ba6a2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -65,8 +65,7 @@ markdown_extensions: - md_in_html - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg - + emoji_generator: !!python/name:material.extensions.emoji.to_svg plugins: - search - minify: From 766ca05e15ce8f7527f4980da64462bede4d93b9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 7 Mar 2024 10:24:19 -0500 Subject: [PATCH 181/182] Release notes --- docs/releases.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index fd61693c..99060d79 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1319,6 +1319,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Remove `Rate-Topics` header due to DoS security issue if `visitor-subscriber-rate-limiting: true` ([#1048](https://github.com/binwiederhier/ntfy/issues/1048)) +**Documentation:** + +* Remove `mkdocs-simple-hooks` ([#1016](https://github.com/binwiederhier/ntfy/pull/1016), thanks to [@Tom-Hubrecht](https://github.com/Tom-Hubrecht)) + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From a8c17c18569f21275251bfbc74117cf0c58ce01b Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 7 Mar 2024 10:36:56 -0500 Subject: [PATCH 182/182] Release notes --- docs/releases.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index 99060d79..3549330b 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1318,10 +1318,13 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Remove `Rate-Topics` header due to DoS security issue if `visitor-subscriber-rate-limiting: true` ([#1048](https://github.com/binwiederhier/ntfy/issues/1048)) +* Add non-root user to Docker image, ntfy can be run as non-root ([#967](https://github.com/binwiederhier/ntfy/pull/967)/[#966](https://github.com/binwiederhier/ntfy/issues/966), thanks to [@arahja](https://github.com/arahja)) **Documentation:** * Remove `mkdocs-simple-hooks` ([#1016](https://github.com/binwiederhier/ntfy/pull/1016), thanks to [@Tom-Hubrecht](https://github.com/Tom-Hubrecht)) +* Update Watchtower example ([#1014](https://github.com/binwiederhier/ntfy/pull/1014), thanks to [@lennart-m](https://github.com/lennart-m)) +* Fix dead links ([#1022](https://github.com/binwiederhier/ntfy/pull/1022), thanks to [@DerRockWolf](https://github.com/DerRockWolf)) ### ntfy Android app v1.16.1 (UNRELEASED)