34 Commits

Author SHA1 Message Date
1e96d7e787 Version 4.2.1 Beta
For translators
2019-10-06 08:12:27 +02:00
612478bcc7 Add license to changelog 2019-10-06 08:12:00 +02:00
23f84fbde0 Use both .currentSrc and .src for image gathering
Works around some lazy-loader issues and make it at least as compatible as v3

Closes #145
2019-10-06 08:00:50 +02:00
b7b4c57034 Update de 2019-10-06 08:00:50 +02:00
872b058d4c Update et (#146) 2019-10-06 07:56:38 +02:00
93ad3e71db Update of lt locale (#144) 2019-10-05 22:39:52 +02:00
7d824bf61e Update Japanese translation 5th (#143) 2019-10-05 22:39:25 +02:00
06228d9ec9 Update messages.json (#141) 2019-10-03 17:04:27 +02:00
f9232ffd96 Update messages.json (#140) 2019-10-03 14:30:31 +02:00
ab3c335bf1 Polish pref window a bit 2019-10-03 09:04:00 +02:00
9142cc023f Add a basic editorconfig 2019-10-03 08:30:45 +02:00
3133a8d8ad Dark theme modals 2019-10-03 08:26:22 +02:00
312f39f7f6 Dark mode scrollbar colors 2019-10-02 22:09:04 +02:00
4ba7bb530d Close unhandled ports 2019-10-02 21:47:38 +02:00
9caad6b3a5 Detect browser theme on Firefox (#139) 2019-10-02 14:54:51 +02:00
5e323db2f0 Make theme configurable (#139) 2019-10-02 14:24:36 +02:00
18daa28cea Initial dark theme (#139) 2019-10-02 13:57:27 +02:00
65c358c01b Update Readme.md 2019-10-02 10:49:09 +02:00
2d14432efe Update TODO.md 2019-10-02 04:43:45 +02:00
19b1cc8856 Add Character batches
Closes #118
2019-10-02 04:37:19 +02:00
883f9a6f0b Add Changelog 2019-10-02 04:05:32 +02:00
e969ba237a Update packages 2019-10-02 04:04:39 +02:00
207248e706 Update ar translation (#90) 2019-10-02 01:55:26 +02:00
9925dec0f4 Use onDeterminingFilename when supported
Closes #132
2019-09-26 08:46:57 +02:00
09b2b4be10 4.1.2 2019-09-26 07:19:43 +02:00
f331de4134 Add Cmd+F shortcut to focus filter box 2019-09-26 07:08:26 +02:00
7760072e8e Avoid the filter box getting an outline in chrome 2019-09-26 07:02:12 +02:00
626bf592de List da locale in all.json 2019-09-26 06:38:49 +02:00
d550de0e27 Add Danish locale
Close #133
2019-09-26 06:37:49 +02:00
367efb4b53 Fix domain parsing in particular IPs
Closes #135
2019-09-26 06:34:23 +02:00
4a82c62958 Update zh_TW translation (#129) 2019-09-23 07:27:39 +02:00
891aa66bff Update zh_CN translation (#126) 2019-09-23 07:24:50 +02:00
2513b60c1b Update ko locale
Closes #127
2019-09-22 17:22:40 +02:00
31cca481f9 Update nl locale
Closes #128
2019-09-22 17:17:24 +02:00
55 changed files with 5361 additions and 2231 deletions

View File

@ -1,3 +1,7 @@
![DownThemAll!](https://raw.githubusercontent.com/downthemall/downthemall/master/style/icon96.png)
# DownThemAll! WE # DownThemAll! WE
The DownThemAll! WebExtension. The DownThemAll! WebExtension.

View File

@ -1,8 +1,6 @@
TODO TODO
--- ---
aka a lot
P2 P2
=== ===
@ -26,11 +24,7 @@ Nice-to-haves.
* Manipulate downloads (e.g. rewrite URLs) * Manipulate downloads (e.g. rewrite URLs)
* Native context menus? * Native context menus?
* Would require massive reworks incl the need for new icon formats, but potentially feasible. * Would require massive reworks incl the need for new icon formats, but potentially feasible.
* Import/Export
* Download priorities (manual scheduling overrides) * Download priorities (manual scheduling overrides)
* Dark Theme support
* os/browser define be default
* overwritable
* Remove `any` types as possible, and generally improve typescript (new language to me) * Remove `any` types as possible, and generally improve typescript (new language to me)
P4 P4

View File

@ -2,6 +2,7 @@
"ar": "العربية [ar]", "ar": "العربية [ar]",
"bg": "Български [bg]", "bg": "Български [bg]",
"cs": "Čeština (CZ) [cs]", "cs": "Čeština (CZ) [cs]",
"da": "Dansk [da]",
"de": "Deutsch [de]", "de": "Deutsch [de]",
"el": "Ελληνικά [el]", "el": "Ελληνικά [el]",
"en": "English (US) [en]", "en": "English (US) [en]",

View File

@ -191,6 +191,22 @@
"message": "احذف", "message": "احذف",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "احذف الملفات",
"description": "menu action"
},
"deletefiles_button": {
"message": "احذف",
"description": "button text"
},
"deletefiles_text": {
"message": "أتريد إزالة الملفات الآتية؟",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "حذف الملفات",
"description": "messagebox title"
},
"description": { "description": {
"message": "الوصف", "message": "الوصف",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "العنوان غير صالح", "message": "العنوان غير صالح",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "لا تدعم المتصفّحات أي مسار مُطلق للمجلدات الفرعية",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "لا تدعم المتصفّحات النقط (.) في المجلدات الفرعية",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "لم تحدّد عناصر", "message": "لم تحدّد عناصر",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "صدّر إلى ملف",
"description": "menu text"
},
"export_aria2": {
"message": "صدّر بنسق قائمة aria2",
"description": "menu text"
},
"export_metalink": {
"message": "صدّر بنسق Metalink",
"description": "menu text"
},
"export_text": {
"message": "صدّر كنصّ",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "أداة التنزيل لبحور من الروابط، داخل متصفحك", "message": "أداة التنزيل لبحور من الروابط، داخل متصفحك",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "يُجبر البدء", "message": "يُجبر البدء",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "استورِد من نصّ",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "معلومات", "message": "معلومات",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "أضفِ التنزيلات الجديدة ملبثة، بدل بدئها مباشرة عند إضافتها", "message": "أضفِ التنزيلات الجديدة ملبثة، بدل بدئها مباشرة عند إضافتها",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "زر ”نزّلها كلها!“:",
"description": "label"
},
"pref_button_type_dta": {
"message": "تحديد ”نزّلها كلها“",
"description": "label"
},
"pref_button_type_manager": {
"message": "يفتح المدير",
"description": "label"
},
"pref_button_type_popup": {
"message": "يعرض القائمة",
"description": "label"
},
"pref_button_type_turbo": {
"message": "ينفّذ ”بنقرة واحدة!“",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "التنزيلات المتزامنة", "message": "التنزيلات المتزامنة",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "اعرض إخطارًا حين ينتهي تنزيل طابور التنزيلات", "message": "اعرض إخطارًا حين ينتهي تنزيل طابور التنزيلات",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "ليكن زر المتصفح ”بنقرة واحدة!“",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "لا تعرض عناصر القائمة السياقية العامة", "message": "لا تعرض عناصر القائمة السياقية العامة",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "المدير", "message": "المدير",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "افتح المدير في نافذة منبثقة جديدة",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "اعرض التلميحات في ألسنة المدير", "message": "اعرض التلميحات في ألسنة المدير",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +637,22 @@
"message": "أزِل التنزيلات الناقصة بعد إعادة التشغيل", "message": "أزِل التنزيلات الناقصة بعد إعادة التشغيل",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "عدد مرات إعادة التنزيل في حال الأخطاء المؤقتة",
"description": "pref text"
},
"pref_retry_time": {
"message": "أعِد كل (بالدقيقة)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "اعرض العناوين بدل الأسماء", "message": "اعرض العناوين بدل الأسماء",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "شغّل الأصوات",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)", "message": "حاوِل البحث عن الروابط في نص موقع الوِب (أبطأ)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "استأنف", "message": "استأنف",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "يُعيد",
"description": "Status text"
},
"retrying_error": {
"message": "يُعيد -$ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "يعمل", "message": "يعمل",
"description": "Status text" "description": "Status text"
@ -943,6 +1033,18 @@
"message": "اضبط قناع تغيير الاسم", "message": "اضبط قناع تغيير الاسم",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "اضبط قناع تغيير اسم جديد",
"description": "dialog text"
},
"set_referrer": {
"message": "اضبط المُعيد",
"description": "menu text"
},
"set_referrer_text": {
"message": "اضبط مُعيدًا جديدًا",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "الدفعات مدعومة، مثل:", "message": "الدفعات مدعومة، مثل:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1225,14 @@
"message": "لن تبدأ أي تنزيلات جديدة", "message": "لن تبدأ أي تنزيلات جديدة",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "المجلد الفرعي:",
"description": "label text"
},
"subfolder_placeholder": {
"message": "ضَع الملفات في هذا المجلد الفرعي لدليل المجلدات في الجهاز",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "العنوان", "message": "العنوان",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "استعمله مرة واحدة", "message": "استعمله مرة واحدة",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "ألغاها المستخدم",
"description": "Error message"
} }
} }

1284
_locales/da/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -657,6 +657,22 @@
"message": "Versuche Text-Links in Webseiten zu finden (langsamer)", "message": "Versuche Text-Links in Webseiten zu finden (langsamer)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Theme:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Dunkel",
"description": "option text"
},
"pref_theme_default": {
"message": "System/Browser",
"description": "option text"
},
"pref_theme_light": {
"message": "Hell",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Benutzeroberfläche", "message": "Benutzeroberfläche",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"

View File

@ -665,6 +665,22 @@
"description": "Preferences/General", "description": "Preferences/General",
"message": "Try to find links in the website text (slower)" "message": "Try to find links in the website text (slower)"
}, },
"pref_theme": {
"description": "label text",
"message": "Theme:"
},
"pref_theme_dark": {
"description": "option text",
"message": "Dark"
},
"pref_theme_default": {
"description": "option text",
"message": "System/Browser"
},
"pref_theme_light": {
"description": "option text",
"message": "Light"
},
"pref_ui": { "pref_ui": {
"description": "Preferences/General; group text", "description": "Preferences/General; group text",
"message": "User Interface" "message": "User Interface"

View File

@ -657,6 +657,22 @@
"message": "Intentar buscar enlaces en el texto del sitio web (más lento)", "message": "Intentar buscar enlaces en el texto del sitio web (más lento)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Oscuro",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistema/Navegador",
"description": "option text"
},
"pref_theme_light": {
"message": "Claro",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Interfaz de usuario", "message": "Interfaz de usuario",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"

View File

@ -657,6 +657,22 @@
"message": "Ürita leida linke veebisaidi tekstist (aeglasem)", "message": "Ürita leida linke veebisaidi tekstist (aeglasem)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Teema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Tume",
"description": "option text"
},
"pref_theme_default": {
"message": "Süsteem/Veebilehitseja",
"description": "option text"
},
"pref_theme_light": {
"message": "Hele",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Kasutajaliides", "message": "Kasutajaliides",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"

View File

@ -8,7 +8,7 @@
"description": "Language code the locale will use, e.g. de or en-GB or pt-BR" "description": "Language code the locale will use, e.g. de or en-GB or pt-BR"
}, },
"addpaused": { "addpaused": {
"message": "一時停止状態で追加", "message": "待機状態で追加",
"description": "Action: Add paused" "description": "Action: Add paused"
}, },
"add_download": { "add_download": {
@ -20,15 +20,15 @@
"description": "Button text (adding filters, limits and such)" "description": "Button text (adding filters, limits and such)"
}, },
"add_paused_once": { "add_paused_once": {
"message": "今回は一時停止で追加", "message": "今回は待機状態で追加",
"description": "Checkbox label" "description": "Checkbox label"
}, },
"add_paused_question": { "add_paused_question": {
"message": "この決定を覚えて、今後新しいダウンロードを常に一時停止で追加しますか?", "message": "この決定を覚えて、今後新しいダウンロードを常に待機状態で追加しますか?",
"description": "Messagebox text" "description": "Messagebox text"
}, },
"add_paused_title": { "add_paused_title": {
"message": "常に一時停止で追加しますか?", "message": "常に待機状態で追加しますか?",
"description": "Title for the add-paused dialog" "description": "Title for the add-paused dialog"
}, },
"ask_again_later": { "ask_again_later": {
@ -570,27 +570,27 @@
"description": "Window/tab title; Preferences" "description": "Window/tab title; Preferences"
}, },
"pref_add_paused": { "pref_add_paused": {
"message": "すぐに開始せず、新しいダウンロードを一時停止状態で追加する", "message": "すぐに開始せず、新しいダウンロードを待機状態で追加する",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": { "pref_button_type": {
"message": "DownThemAll! アイコンクリック時:", "message": "DownThemAll! アイコンクリック時:",
"description": "label" "description": "label"
}, },
"pref_button_type_dta": { "pref_button_type_dta": {
"message": "DownThemAll! 選択画面", "message": "ダウンロード選択画面",
"description": "label" "description": "label"
}, },
"pref_button_type_manager": { "pref_button_type_manager": {
"message": "マネージャを開く", "message": "マネージャを開く",
"description": "label" "description": "label"
}, },
"pref_button_type_popup": { "pref_button_type_popup": {
"message": "メニュー展開", "message": "メニュー展開",
"description": "label" "description": "label"
}, },
"pref_button_type_turbo": { "pref_button_type_turbo": {
"message": "OneClick! ダウンロード", "message": "OneClick! ダウンロード",
"description": "label" "description": "label"
}, },
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
@ -654,9 +654,25 @@
"description": "checkbox text" "description": "checkbox text"
}, },
"pref_text_links": { "pref_text_links": {
"message": "Webサイトの文字列でリンクを見つけてみる (但し、遅い)", "message": "Webサイトの文字列でリンクを抽出する (但し、遅い)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "テーマ:",
"description": "label text"
},
"pref_theme_dark": {
"message": "ダーク",
"description": "option text"
},
"pref_theme_default": {
"message": "システム/ブラウザのテーマ",
"description": "option text"
},
"pref_theme_light": {
"message": "ライト",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "ユーザーインターフェイス", "message": "ユーザーインターフェイス",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
@ -820,7 +836,7 @@
"description": "Messagebox text" "description": "Messagebox text"
}, },
"remove_selected_downloads": { "remove_selected_downloads": {
"message": "選択を削除", "message": "選択した項目を削除",
"description": "Menu text" "description": "Menu text"
}, },
"rename": { "rename": {

View File

@ -191,6 +191,22 @@
"message": "삭제", "message": "삭제",
"description": "button text" "description": "button text"
}, },
"deletefiles": {
"message": "파일 삭제",
"description": "menu action"
},
"deletefiles_button": {
"message": "삭제",
"description": "button text"
},
"deletefiles_text": {
"message": "정말 다음 파일(들)을 삭제하시겠습니까?",
"description": "messagebox text"
},
"deletefiles_title": {
"message": "파일 삭제",
"description": "messagebox title"
},
"description": { "description": {
"message": "설명", "message": "설명",
"description": "Description (keep it short); e.g. the description column in select" "description": "Description (keep it short); e.g. the description column in select"
@ -275,10 +291,34 @@
"message": "잘못된 URL", "message": "잘못된 URL",
"description": "Error message; single window" "description": "Error message; single window"
}, },
"error_noabsolutepath": {
"message": "하위 폴더의 절대 경로는 브라우저에서 지원되지 않습니다",
"description": "Error Message; select/single window"
},
"error_nodotsinpath": {
"message": "하위 폴더의 점(.)은 브라우저에서 지원되지 않습니다",
"description": "Error Message; select/single window"
},
"error_noItemsSelected": { "error_noItemsSelected": {
"message": "선택된 항목 없음", "message": "선택된 항목 없음",
"description": "Error Message; select window" "description": "Error Message; select window"
}, },
"export": {
"message": "파일로 내보내기",
"description": "menu text"
},
"export_aria2": {
"message": "aria2 리스트로 내보내기",
"description": "menu text"
},
"export_metalink": {
"message": "메타링크로 내보내기",
"description": "menu text"
},
"export_text": {
"message": "텍스트로 내보내기",
"description": "menu text"
},
"extensionDescription": { "extensionDescription": {
"message": "브라우저용 대량 다운로더", "message": "브라우저용 대량 다운로더",
"description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one" "description": "DownThemAll! tagline, displayed in about:addons; Please do NOT refer to a specific browser such as firefox, as we will probably support more than one"
@ -331,6 +371,10 @@
"message": "강제 시작", "message": "강제 시작",
"description": "Menu text" "description": "Menu text"
}, },
"import": {
"message": "파일에서 가져오기",
"description": "menu text"
},
"information_title": { "information_title": {
"message": "정보", "message": "정보",
"description": "Used in message boxes" "description": "Used in message boxes"
@ -529,6 +573,26 @@
"message": "새 다운로드를 즉시 시작하는 대신 일시중지로 추가", "message": "새 다운로드를 즉시 시작하는 대신 일시중지로 추가",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_button_type": {
"message": "DownThemAll! 버튼:",
"description": "label"
},
"pref_button_type_dta": {
"message": "DownThemAll! 선택",
"description": "label"
},
"pref_button_type_manager": {
"message": "관리자 열기",
"description": "label"
},
"pref_button_type_popup": {
"message": "팝업 메뉴",
"description": "label"
},
"pref_button_type_turbo": {
"message": "OneClick!",
"description": "label"
},
"pref_concurrent_downloads": { "pref_concurrent_downloads": {
"message": "동시 다운로드", "message": "동시 다운로드",
"description": "Preferences/Network" "description": "Preferences/Network"
@ -537,10 +601,6 @@
"message": "다운로드 대기열이 끝나면 알림 표시", "message": "다운로드 대기열이 끝나면 알림 표시",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_global_turbo": {
"message": "브라우저 버튼을 OneClick!으로 작동",
"description": "Preferences/General"
},
"pref_hide_context": { "pref_hide_context": {
"message": "일반 컨텍스트 메뉴 항목 표시 안 함", "message": "일반 컨텍스트 메뉴 항목 표시 안 함",
"description": "Preferences/General" "description": "Preferences/General"
@ -549,6 +609,10 @@
"message": "관리자", "message": "관리자",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"
}, },
"pref_manager_in_popup": {
"message": "새 팝업 창에 관리자 열기",
"description": "checkbox text"
},
"pref_manager_tooltip": { "pref_manager_tooltip": {
"message": "관리자 탭에서 툴팁 표시", "message": "관리자 탭에서 툴팁 표시",
"description": "Preferences/General" "description": "Preferences/General"
@ -573,10 +637,22 @@
"message": "다시 시작한 후 누락된 다운로드 제거", "message": "다시 시작한 후 누락된 다운로드 제거",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_retries": {
"message": "일시적인 오류에 대한 다운로드 재시도 횟수",
"description": "pref text"
},
"pref_retry_time": {
"message": "재시도 간격 (분)",
"description": "pref text"
},
"pref_show_urls": { "pref_show_urls": {
"message": "이름 대신 URL 표시", "message": "이름 대신 URL 표시",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_sounds": {
"message": "소리 재생",
"description": "checkbox text"
},
"pref_text_links": { "pref_text_links": {
"message": "웹 사이트 텍스트에서 링크를 찾도록 시도 (느림)", "message": "웹 사이트 텍스트에서 링크를 찾도록 시도 (느림)",
"description": "Preferences/General" "description": "Preferences/General"
@ -895,6 +971,20 @@
"message": "계속", "message": "계속",
"description": "Action for resuming a download" "description": "Action for resuming a download"
}, },
"retrying": {
"message": "재시도중",
"description": "Status text"
},
"retrying_error": {
"message": "재시도중 - $ERROR$",
"description": "status text",
"placeholders": {
"error": {
"content": "$1",
"example": "Server Error"
}
}
},
"running": { "running": {
"message": "실행중", "message": "실행중",
"description": "Status text" "description": "Status text"
@ -943,6 +1033,18 @@
"message": "이름 바꾸기 마스크 설정", "message": "이름 바꾸기 마스크 설정",
"description": "Menu text; select window" "description": "Menu text; select window"
}, },
"set_mask_text": {
"message": "새 이름 바꾸기 마스크 설정",
"description": "dialog text"
},
"set_referrer": {
"message": "참조 페이지 설정",
"description": "menu text"
},
"set_referrer_text": {
"message": "새 참조 페이지 설정",
"description": "dialog text"
},
"single_batchexamples": { "single_batchexamples": {
"message": "일괄 처리가 지원됩니다, 예:", "message": "일괄 처리가 지원됩니다, 예:",
"description": "Header text; single window" "description": "Header text; single window"
@ -1123,6 +1225,14 @@
"message": "새 다운로드가 시작되지 않습니다", "message": "새 다운로드가 시작되지 않습니다",
"description": "Status bar tooltip; manager network icon" "description": "Status bar tooltip; manager network icon"
}, },
"subfolder": {
"message": "하위 폴더",
"description": "label text"
},
"subfolder_placeholder": {
"message": "다운로드 디렉토리 내의 이 하위 폴더에 파일을 저장합니다",
"description": "placeholder text within an input box"
},
"title": { "title": {
"message": "제목", "message": "제목",
"description": "Column text; Title label (short)" "description": "Column text; Title label (short)"
@ -1166,5 +1276,9 @@
"useonlyonce": { "useonlyonce": {
"message": "한번만", "message": "한번만",
"description": "Label for Use-Once checkboxes" "description": "Label for Use-Once checkboxes"
},
"USER_CANCELED": {
"message": "사용자 취소",
"description": "Error message"
} }
} }

View File

@ -657,6 +657,22 @@
"message": "Bandyti tinklalapio tekste rasti nuorodas (lėčiau)", "message": "Bandyti tinklalapio tekste rasti nuorodas (lėčiau)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Tamsi",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistemos/Naršyklės",
"description": "option text"
},
"pref_theme_light": {
"message": "Šviesi",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Naudotojo sąsaja", "message": "Naudotojo sąsaja",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"

File diff suppressed because it is too large Load Diff

View File

@ -657,6 +657,22 @@
"message": "Tentar encontrar links no texto do site (mais lento)", "message": "Tentar encontrar links no texto do site (mais lento)",
"description": "Preferences/General" "description": "Preferences/General"
}, },
"pref_theme": {
"message": "Tema:",
"description": "label text"
},
"pref_theme_dark": {
"message": "Escuro",
"description": "option text"
},
"pref_theme_default": {
"message": "Sistema/Navegador",
"description": "option text"
},
"pref_theme_light": {
"message": "Claro",
"description": "option text"
},
"pref_ui": { "pref_ui": {
"message": "Interface de usuário", "message": "Interface de usuário",
"description": "Preferences/General; group text" "description": "Preferences/General; group text"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

475
changelog/index.html Normal file
View File

@ -0,0 +1,475 @@
<!doctype html>
<html lang="en">
<!-- License: Creative Commons Attribution-ShareAlike 4.0 International License -->
<head>
<meta charset="utf-8">
<title>DownThemAll! Changes</title>
<style>
@font-face {
font-family: "Reenie Beanie";
font-style: normal;
font-weight: 400;
font-display: block;
src: local("Reenie Beanie"), local("ReenieBeanie"),
url(res/ReenieBeanie-Regular.woff2) format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
U+FEFF, U+FFFD;
}
:root {
--content-width: 1000px;
}
html,
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Ubuntu",
"Helvetica Neue", sans-serif;
font-size: 12pt;
color: rgb(20, 20, 20);
background: white;
width: 100%;
height: 100%;
}
body {
display: grid;
background: white repeat-x url(res/background-tile.png);
grid-template-columns: 1fr [content] auto 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
". header ."
". content ."
"footer footer footer";
}
a {
color: rgb(30, 30, 70);
}
li {
list-style-type: circle;
}
nav {
max-width: var(--content-width);
grid-area: header;
display: flex;
box-sizing: border-box;
padding-right: 120px;
padding-top: 1em;
padding-left: 32px;
align-content: center;
align-items: baseline;
background: no-repeat top right url(res/halo.svg);
background-size: 120px;
min-height: 100px;
text-shadow: rgba(255, 255, 255, 0.8) 1px 3px 0px;
font-family: "Reenie Beanie", cursive;
}
nav h1,
nav h2 {
margin: 0;
margin-right: 1ex;
display: inline-block;
}
nav h1 {
font-size: 400%;
}
nav h2 {
font-size: 250%;
}
article {
max-width: var(--content-width);
grid-area: content;
box-sizing: border-box;
padding: 1ex 32px;
background: white;
border-bottom: 0;
border-radius: 20px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
h3 em {
display: inline-block;
padding-left: 1em;
font-size: 80%;
}
#paypal {
margin: 1em;
display: grid;
grid-template-columns: auto auto auto auto auto;
grid-row-gap: 1em;
grid-column-gap: 1em;
justify-content: center;
justify-items: center;
}
footer {
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 2em;
padding: 2em 2em 1em 2em;
background: transparent center top repeat-x url(res/footerbg.png);
font-size: x-small;
color: gray;
grid-area: footer;
}
footer p {
margin: 0.3ex 0;
}
#logo {
width: 48px;
align-self: center;
opacity: 0.7;
filter: grayscale(90%);
}
@media only screen and (max-width: 750px) {
nav {
flex-direction: column;
margin-bottom: 1em;
padding-right: 120px;
}
nav h1 {
font-size: 275%;
}
nav h2 {
font-size: 220%;
}
#paypal {
grid-template-columns: auto auto;
}
#homepage {
display: none;
}
}
</style>
</head>
<body>
<nav>
<h1>DownThemAll!</h1>
<h2>Changes</h2>
</nav>
<article>
<h3>DownThemAll needs your support!</h3>
<section id="paypal">
<a href="https://www.paypal.me/NilsMaier/10" title="Donate €10" target="_blank">
<svg viewBox="0 0 300 72" width=110>
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="10">
<path
d="m173.05 47.333h7.9336v-22.517l-8.1436 1.6801v-6.1135l8.0969-1.6801h8.5403v28.631h7.9336v6.2069h-24.361z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/15" title="Donate €15" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" opacity=".75" stroke="#003087"
stroke-width="1px" aria-label="15">
<path
d="m173.05 47.333h7.9336v-22.517l-8.1436 1.6801v-6.1135l8.0969-1.6801h8.5403v28.631h7.9336v6.2069h-24.361z" />
<path
d="m208.75 18.702h22.331v6.6035h-15.167v5.3902q1.0267-0.28001 2.0534-0.42001 1.05-0.16334 2.1701-0.16334 6.3702 0 9.917 3.1968 3.5468 3.1734 3.5468 8.8669 0 5.6468-3.8734 8.8436-3.8501 3.1968-10.71 3.1968-2.9634 0-5.8802-0.58335-2.8934-0.56002-5.7635-1.7267v-7.0702q2.8468 1.6334 5.3902 2.4501 2.5667 0.81669 4.8302 0.81669 3.2668 0 5.1335-1.5867 1.89-1.61 1.89-4.3401 0-2.7534-1.89-4.3401-1.8667-1.5867-5.1335-1.5867-1.9367 0-4.1301 0.51335-2.1934 0.49002-4.7135 1.54z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/20" title="Donate €20" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="20">
<path
d="m181.22 46.936h15.33v6.6035h-25.317v-6.6035l12.717-11.224q1.7034-1.54 2.5201-3.0101 0.81669-1.47 0.81669-3.0568 0-2.4501-1.6567-3.9435-1.6334-1.4934-4.3635-1.4934-2.1001 0-4.5968 0.91003-2.4968 0.88669-5.3435 2.6601v-7.6536q3.0334-1.0034 5.9968-1.5167 2.9634-0.53668 5.8102-0.53668 6.2535 0 9.707 2.7534 3.4768 2.7534 3.4768 7.6769 0 2.8468-1.47 5.3202-1.47 2.4501-6.1835 6.5802z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a href="https://www.paypal.me/NilsMaier/30" title="Donate €30" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(28.855)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#009cde" stroke="#003087" stroke-width="1px"
aria-label="30">
<path
d="m189.71 34.756q3.5234 0.91003 5.3435 3.1734 1.8434 2.2401 1.8434 5.7168 0 5.1802-3.9668 7.8869-3.9668 2.6834-11.574 2.6834-2.6834 0-5.3902-0.44335-2.6834-0.42001-5.3202-1.2834v-6.9302q2.5201 1.26 4.9935 1.9134 2.4967 0.63002 4.9002 0.63002 3.5701 0 5.4602-1.2367 1.9134-1.2367 1.9134-3.5468 0-2.3801-1.9601-3.5934-1.9367-1.2367-5.7402-1.2367h-3.5934v-5.7868h3.7801q3.3834 0 5.0402-1.05 1.6567-1.0734 1.6567-3.2434 0-2.0067-1.61-3.1034t-4.5501-1.0967q-2.1701 0-4.3868 0.49002t-4.4101 1.4467v-6.5802q2.6601-0.74669 5.2735-1.12 2.6134-0.37334 5.1335-0.37334 6.7902 0 10.15 2.2401 3.3834 2.2167 3.3834 6.6969 0 3.0568-1.61 5.0168-1.61 1.9367-4.7601 2.7301z" />
<path
d="m225.67 36.086q0-6.5335-1.2367-9.1936-1.2134-2.6834-4.1068-2.6834t-4.1301 2.6834q-1.2367 2.6601-1.2367 9.1936 0 6.6035 1.2367 9.3103 1.2367 2.7067 4.1301 2.7067 2.8701 0 4.1068-2.7067t1.2367-9.3103zm8.9836 0.07q0 8.6569-3.7334 13.37-3.7334 4.6901-10.594 4.6901-6.8835 0-10.617-4.6901-3.7334-4.7135-3.7334-13.37 0-8.6803 3.7334-13.37 3.7334-4.7135 10.617-4.7135 6.8602 0 10.594 4.7135 3.7334 4.6901 3.7334 13.37z" />
</g>
<g transform="matrix(1.004 0 0 .996 4.7854 0)" fill="#003087" aria-label="€">
<path
d="m153.83 51.627q-2.2167 1.2834-4.6435 1.9367-2.4034 0.65335-5.0168 0.65335-6.1135 0-10.314-3.0334-4.1768-3.0568-5.9268-8.7736h-5.0635l2.0534-4.5501h2.2867q-0.0233-0.32668-0.0467-0.67669 0-0.37334 0-1.0267 0-0.67669 0-1.05 0.0233-0.37334 0.0467-0.72336h-4.3401l2.0534-4.5501h3.0101q1.7967-5.7402 5.9502-8.7503 4.1768-3.0101 10.29-3.0101 2.6134 0 5.0168 0.65335 2.4267 0.65335 4.6435 1.9367v7.2102q-1.8901-1.8201-4.0368-2.7301-2.1467-0.93336-4.4568-0.93336-2.9634 0-5.0635 1.4467-2.0767 1.4234-3.1268 4.1768h12.577l-2.0067 4.5501h-11.504q-0.0467 0.37334-0.07 0.79336 0 0.42001 0 1.26 0 0.30334 0 0.67669 0.0233 0.35001 0.0467 0.74669h10.01l-2.0767 4.5501h-6.9769q1.1667 2.8468 3.1968 4.2701 2.0534 1.4234 4.9935 1.4234 2.3101 0 4.4101-0.91003 2.1234-0.93336 4.0835-2.7768z"
fill="#003087" stroke-width="1px" />
</g>
</svg>
</a>
<a id="ppanother" href="https://www.paypal.me/NilsMaier" title="Donate another amount" target="_blank">
<svg viewBox="0 0 300 72" width="110">
<rect x="1.5" y="1.5" width="297" height="69" ry="34.093" fill="#ffc439" fill-rule="evenodd" stroke="#dadce0"
stroke-dashoffset="89.999" stroke-linejoin="round" stroke-width="3" style="paint-order:normal" />
<g transform="translate(19.23)">
<path
d="m42.414 58.373 0.83858-5.284-1.868-0.04295h-8.9197l6.1988-38.991c0.01924-0.1177 0.08177-0.22746 0.17317-0.3054 0.09139-0.07794 0.20844-0.12089 0.3303-0.12089h15.04c4.993 0 8.4387 1.0307 10.238 3.0651 0.84339 0.95437 1.3805 1.9517 1.6403 3.0492 0.27258 1.1516 0.27739 2.5275 0.01122 4.2056l-0.01924 0.12248v1.0753l0.84339 0.474c0.71031 0.37379 1.2747 0.80167 1.7076 1.2916 0.72153 0.81599 1.1881 1.8531 1.3853 3.0826 0.20363 1.2645 0.13629 2.7693-0.19722 4.4728-0.38482 1.9596-1.0069 3.6664-1.8471 5.0629-0.77284 1.2868-1.7573 2.3541-2.9262 3.1812-1.116 0.78576-2.442 1.3822-3.9412 1.764-1.4527 0.37538-3.109 0.56467-4.9257 0.56467h-1.1705c-0.83698 0-1.6499 0.29904-2.2881 0.83507-0.63976 0.54717-1.0631 1.2948-1.1929 2.1123l-0.08819 0.47559-1.4815 9.3131-0.06734 0.34198c-0.01764 0.10816-0.0481 0.16224-0.093 0.19883-0.04008 0.0334-0.09781 0.05567-0.15393 0.05567z"
fill="#253b80" />
<path
d="m67.719 24.195c-0.0449 0.28472-0.0962 0.5758-0.15393 0.87484-1.9834 10.102-8.769 13.592-17.435 13.592h-4.4126c-1.0598 0-1.9529 0.7635-2.1181 1.8006l-2.2592 14.214-0.63976 4.029c-0.10743 0.68078 0.4217 1.2948 1.1144 1.2948h7.8262c0.92677 0 1.714-0.66806 1.8599-1.5747l0.07696-0.39447 1.4735-9.2765 0.0946-0.509c0.14431-0.90983 0.93318-1.5779 1.8599-1.5779h1.1705c7.5825 0 13.518-3.054 15.253-11.891 0.72474-3.6918 0.34954-6.7744-1.5681-8.9424-0.58043-0.65374-1.3004-1.1961-2.1421-1.6383z"
fill="#179bd7" />
<path
d="m65.644 23.374c-0.30304-0.08748-0.61571-0.16702-0.93639-0.23859-0.32228-0.06999-0.65259-0.13202-0.99251-0.1861-1.1897-0.19087-2.4933-0.28154-3.8899-0.28154h-11.788c-0.29022 0-0.566 0.06522-0.81293 0.18292-0.54355 0.25927-0.94761 0.76986-1.0454 1.395l-2.5077 15.757-0.07215 0.45969c0.16515-1.0371 1.0582-1.8006 2.1181-1.8006h4.4126c8.6664 0 15.452-3.4914 17.435-13.592 0.05933-0.29904 0.10903-0.59012 0.15393-0.87484-0.50187-0.26404-1.0454-0.48991-1.6307-0.68237-0.14431-0.04772-0.29342-0.09385-0.44414-0.13838z"
fill="#222d65" />
<path
d="m46.179 24.246c0.09781-0.62511 0.50187-1.1357 1.0454-1.3934 0.24853-0.11771 0.52271-0.18292 0.81293-0.18292h11.788c1.3966 0 2.7001 0.09066 3.8899 0.28154 0.33992 0.05408 0.67022 0.11612 0.99251 0.1861 0.32068 0.07158 0.63334 0.15111 0.93639 0.23859 0.15072 0.04454 0.29984 0.09067 0.44575 0.13679 0.58524 0.19246 1.1288 0.41992 1.6307 0.68237 0.59005-3.7332-0.0048-6.275-2.0395-8.5766-2.2432-2.5338-6.2918-3.6186-11.472-3.6186h-15.04c-1.0582 0-1.961 0.7635-2.1245 1.8022l-6.2645 39.392c-0.12346 0.7794 0.48262 1.4825 1.2747 1.4825h9.2853l2.3314-14.673z"
fill="#253b80" />
</g>
<g transform="translate(0 -.24886)" stroke-width="1.7342px">
<g transform="matrix(.57894 0 0 .57432 95.638 27.862)" fill="#009cde" stroke="#003087" aria-label="Amount">
<path
d="m62.511 47.193h-14.047l-2.2167 6.3469h-9.0303l12.904-34.838h10.71l12.904 34.838h-9.0303zm-11.807-6.4635h9.5436l-4.7601-13.86z" />
<path
d="m105.19 31.746q1.5867-2.4267 3.7568-3.6868 2.1934-1.2834 4.8068-1.2834 4.5035 0 6.8602 2.7768t2.3567 8.0736v15.914h-8.4002v-13.627q0.0233-0.30334 0.0233-0.63002 0.0233-0.32668 0.0233-0.93336 0-2.7768-0.8167-4.0135-0.81669-1.26-2.6367-1.26-2.3801 0-3.6868 1.9601-1.2834 1.9601-1.33 5.6702v12.834h-8.4002v-13.627q0-4.3401-0.74669-5.5768-0.74669-1.26-2.6601-1.26-2.4034 0-3.7101 1.9834-1.3067 1.9601-1.3067 5.6235v12.857h-8.4003v-26.134h8.4003v3.8268q1.54-2.2167 3.5234-3.3368 2.0067-1.12 4.4101-1.12 2.7067 0 4.7835 1.3067 2.0767 1.3067 3.1501 3.6634z" />
<path
d="m146.26 32.749q-2.7768 0-4.2468 2.0067-1.4467 1.9834-1.4467 5.7402t1.4467 5.7635q1.47 1.9834 4.2468 1.9834 2.7301 0 4.1768-1.9834 1.4467-2.0067 1.4467-5.7635t-1.4467-5.7402q-1.4467-2.0067-4.1768-2.0067zm0-5.9735q6.7435 0 10.524 3.6401 3.8034 3.6401 3.8034 10.08 0 6.4402-3.8034 10.08-3.7801 3.6401-10.524 3.6401-6.7669 0-10.594-3.6401-3.8034-3.6401-3.8034-10.08 0-6.4402 3.8034-10.08 3.8268-3.6401 10.594-3.6401z" />
<path
d="m169.41 43.366v-15.96h8.4002v2.6134q0 2.1234-0.0233 5.3435-0.0233 3.1968-0.0233 4.2701 0 3.1501 0.16334 4.5501 0.16334 1.3767 0.56002 2.0067 0.51335 0.81669 1.33 1.26 0.84002 0.44335 1.9134 0.44335 2.6134 0 4.1068-2.0067t1.4934-5.5768v-12.904h8.3536v26.134h-8.3536v-3.7801q-1.8901 2.2867-4.0134 3.3834-2.1001 1.0734-4.6435 1.0734-4.5268 0-6.9069-2.7768-2.3567-2.7768-2.3567-8.0736z" />
<path
d="m233.04 37.626v15.914h-8.4003v-12.18q0-3.3834-0.16333-4.6668-0.14001-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84003-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-26.134h8.3536v3.8268q1.8901-2.2867 4.0135-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m252.97 19.986v7.4202h8.6103v5.9735h-8.6103v11.084q0 1.8201 0.72335 2.4734 0.72336 0.63002 2.8701 0.63002h4.2935v5.9735h-7.1636q-4.9468 0-7.0236-2.0534-2.0534-2.0767-2.0534-7.0235v-11.084h-4.1535v-5.9735h4.1535v-7.4202z" />
</g>
<g transform="matrix(.57894 0 0 .57432 95.638 23.862)" fill="#003087" aria-label="Another">
<path
d="m57.459 11.049h-14.047l-2.2167 6.3469h-9.0303l12.904-34.838h10.71l12.904 34.838h-9.0303zm-11.807-6.4635h9.5436l-4.7601-13.86z" />
<path
d="m102.19 1.4817v15.914h-8.4003v-12.18q0-3.3834-0.16334-4.6668-0.14-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84002-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-26.134h8.3536v3.8268q1.8901-2.2867 4.0135-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m125.43-3.3951q-2.7768 0-4.2468 2.0067-1.4467 1.9834-1.4467 5.7402t1.4467 5.7635q1.47 1.9834 4.2468 1.9834 2.7301 0 4.1768-1.9834 1.4467-2.0067 1.4467-5.7635t-1.4467-5.7402q-1.4467-2.0067-4.1768-2.0067zm0-5.9735q6.7435 0 10.524 3.6401 3.8034 3.6401 3.8034 10.08 0 6.4402-3.8034 10.08-3.7801 3.6401-10.524 3.6401-6.7669 0-10.594-3.6401-3.8034-3.6401-3.8034-10.08 0-6.4402 3.8034-10.08 3.8268-3.6401 10.594-3.6401z" />
<path
d="m157.99-16.159v7.4202h8.6103v5.9735h-8.6103v11.084q0 1.8201 0.72336 2.4734 0.72336 0.63002 2.8701 0.63002h4.2935v5.9735h-7.1636q-4.9468 0-7.0236-2.0534-2.0534-2.0767-2.0534-7.0235v-11.084h-4.1535v-5.9735h4.1535v-7.4202z" />
<path
d="m201.02 1.4817v15.914h-8.4002v-12.134q0-3.4301-0.16334-4.7135-0.14001-1.2834-0.51335-1.8901-0.49002-0.81669-1.33-1.26-0.84003-0.46668-1.9134-0.46668-2.6134 0-4.1068 2.0301-1.4934 2.0067-1.4934 5.5768v12.857h-8.3536v-36.308h8.3536v14q1.89-2.2867 4.0134-3.3601 2.1234-1.0967 4.6901-1.0967 4.5268 0 6.8602 2.7768 2.3567 2.7768 2.3567 8.0736z" />
<path
d="m237.91 4.2585v2.3801h-19.531q0.30334 2.9401 2.1234 4.4101 1.8201 1.47 5.0868 1.47 2.6367 0 5.3902-0.77002 2.7768-0.79336 5.6935-2.3801v6.4402q-2.9634 1.12-5.9268 1.6801-2.9634 0.58335-5.9268 0.58335-7.0936 0-11.037-3.5934-3.9201-3.6168-3.9201-10.127 0-6.3935 3.8501-10.057 3.8734-3.6634 10.64-3.6634 6.1602 0 9.847 3.7101 3.7101 3.7101 3.7101 9.917zm-8.5869-2.7768q0-2.3801-1.4-3.8268-1.3767-1.47-3.6168-1.47-2.4267 0-3.9434 1.3767-1.5167 1.3534-1.8901 3.9201z" />
<path
d="m266.64-1.6217q-1.0967-0.51335-2.1934-0.74669-1.0734-0.25667-2.1701-0.25667-3.2201 0-4.9702 2.0767-1.7267 2.0534-1.7267 5.9035v12.04h-8.3536v-26.134h8.3536v4.2935q1.61-2.5667 3.6868-3.7334 2.1001-1.19 5.0168-1.19 0.42001 0 0.91002 0.046668 0.49002 0.023334 1.4234 0.14z" />
</g>
</g>
</svg>
</a>
</section>
<p>It requires <strong>a lot of time and some money</strong> to create the extension, keep up with browser
changes, read and answer emails, bug reports and feature requests, and actually publish the final versions.
<em>Any contribution is appreciated. Thank you!</em></p>
<h2>Major version changes</h2>
<h3>Version 4.2 <em>Grune 42, Year of the Sneezing Panda</em></h3>
<ul>
<li>Vastly improved name handling in Chrome. (<a
href="https://bugzilla.mozilla.org/show_bug.cgi?id=1245652">Missing in Firefox</a>)</li>
<li>Support <code>[a:z]</code> character batches</li>
<li>Dark theme support</li>
<li>Improved the gathering of images in websites</li>
</ul>
<h3>Version 4.1 <em>September 21, 2019</em></h3>
<ul>
<li>Subfolder dropdown. While it was previously possible to use masks for subfolders already, based on user
feedback having a dedicated subfolder selection dropdown is more convenient and easier to discover.</li>
<li>You can configure the browser button to more different actions now</li>
<li>Play sounds: When the queue finishes, play a sound (can be enabled/disabled in the preferences)</li>
<li>Delete files from within the manager</li>
<li>Manager can now configured to be opened in a popup window instead of a tab</li>
<li>Automatic retries (This feature relies on Firefox reporting errors correctly to extensions, which it
only started doing in Firefox 71, which is currently available as Nightly).</li>
</ul>
<h3>Version 4.0 <em>August 31, 2019</em></h3>
<p>DownThemAll! reborn, as a WebExtension</p>
</article>
<footer>
<svg id="logo" viewBox="0 0 16 16">
<defs>
<linearGradient id="b">
<stop stop-color="#116597" offset="0" />
<stop stop-color="#062638" offset="1" />
</linearGradient>
<linearGradient id="a">
<stop stop-color="#fffe99" offset="0" />
<stop stop-color="#e49218" offset=".2" />
<stop stop-color="#116597" offset="1" />
</linearGradient>
<radialGradient id="c" xlink:href="#a" gradientUnits="userSpaceOnUse" cy="17.413" cx="11.75"
gradientTransform="matrix(.41233 0 0 1.1548 3.24 -8.74)" r="10.752" />
<linearGradient id="h" y2="-.242" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(2.495 -6.342) scale(.6787)" y1="4.218" x1="8.101" />
<linearGradient id="i" y2="-.242" xlink:href="#a" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(2.495 -1.882) scale(.6787)" y1="4.218" x1="8.101" />
<linearGradient id="g" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(7.08 4.18) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="f" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(7.657 1.298) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="e" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(1.851 4.18) scale(.43866)" y1="4.218" x1="8.101" />
<linearGradient id="d" y2="-.242" xlink:href="#b" gradientUnits="userSpaceOnUse" x2="7.763"
gradientTransform="translate(1.851 1.298) scale(.43866)" y1="4.218" x1="8.101" />
</defs>
<g stroke="#072739">
<g stroke-width=".646">
<path
d="M4.561 7.134v1.515H1.996v.262l2.949 3.333 2.666 3.05h.99l2.686-3.05 2.848-3.252V8.65h-2.727V7.134H4.561z"
fill="url(#c)" />
<g stroke-linecap="round" stroke-dashoffset="10" fill-rule="evenodd">
<path fill="url(#d)" d="M4.562 1.346h1.649v1.649H4.562z" />
<path fill="url(#e)" d="M4.562 4.228h1.649v1.649H4.562z" />
<path fill="url(#f)" d="M10.368 1.346h1.649v1.649h-1.649z" />
<path fill="url(#g)" d="M9.792 4.228h1.649v1.649H9.792z" />
</g>
</g>
<g fill-rule="evenodd" stroke-linecap="round" stroke-dashoffset="10">
<path fill="url(#h)" d="M6.689-6.268H9.24v2.551H6.689z" transform="translate(2.874 4.614) scale(.64633)" />
<path fill="url(#i)" d="M6.689-1.808H9.24V.743H6.689z" transform="translate(2.874 4.614) scale(.64633)" />
</g>
</g>
</svg>
<section>
<p>Copyright © 2007-2018 Nils Maier, Stefano Verna, Federico Parodi</p>
<p>Copyright © 2007-2019 Nils Maier</p>
<p>The information on this website is licensed under the
<a href="https://creativecommons.org/licenses/by-sa/4.0/">
Creative Commons Attribution-ShareAlike 4.0 International License</a>.</p>
</section>
<a id="homepage" href="https://downthemall.org/">
<svg viewBox="0 0 250 32" height="20" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.1174 0 0 1.122 -217.76 -441.22)">
<path
d="m277.86 402.4c-2.106 0.594-3.9921 1.3387-5.0625 3.0371-1.8782 2.9802-1.8825 0.50072-5.0625 1.0117-0.075 4.312-1.6927 7.0814-1.0117 12.148 0.251 1.099-0.2614 1.8228 2.0234 2.0254 5.078-2.0169 2.6252-12.605 9.1113-13.162 0.661 5.076 1.325 12.532 3.0371 14.174h2.0254c2.0004 0 2.4284-0.24992 2.0254-4.0449-0.157-1.478-1.5594-2.1928-2.0234-4.0508-0.436-1.744-0.20767-2.7525-1.0137-5.0625 0.20397-2.5435-3.0757-5.9543-4.0488-6.0762z" />
<path
d="m205.98 396.32c0.71583-0.71583 3.037 0 3.037 0 3.312 2.743 2.107 7.979 3.037 12.148 0.97 4.354 2.863 8.229 3.037 12.149-3.865 0.827-3.919-2.155-5.062-4.05-3.517 0.195-3.843 3.58-7.086 4.05 0 0-3.0927 1.1003-6.074 0-2.2496-1.309-2.6451-6.2394-0.9158-9.8255 1.7293-3.5861 5.5833-5.828 10.027-5.3615 0 0-2.1472-6.9628 0-9.11zm-7.087 21.261c5.626-0.111 9.345-2.129 9.111-8.1-5.62-4-11.843 3.748-9.111 8.1z" />
<path
d="m262.67 400.37c3.124 1.378 4.2238 9.6188 3.037 14.174-0.21875 0.83965-3.6 4.9793-4.049 5.062-5.6104 1.0329-9.589-0.535-13.161-2.024-3.76 0.627-4.631 4.142-10.124 3.037-2.976-2.578-3.758-15.21 2.025-15.187 0.646 5.261-2.233 8.114 0 12.149 7.523 0.437 4.919-9.254 9.111-12.149 4.209 1.404 0.0379 4.9881 2.024 8.1 0.7405 1.1602 0.55971 3.037 2.025 3.037h5.062c2.561-0.813 3.5092-3.7334 4.049-6.074 1.0218-4.4307-3.744-7.344 1e-3 -10.125z" />
<path
d="m229.26 404.42c4.2274 1.6428 6.429 7.195 4.049 13.161-6.917 2.7019-16.888 6.2299-17.211-1.012-0.35916-8.0617 4.062-15.685 13.162-12.149zm-9.111 11.136c2.075 3.041 7.753 2.154 10.124 0 2.323-10.366-12.448-10.366-10.124 0z" />
<path
d="m415.54 393.28c1.635-0.285 1.742 0.957 3.037 1.012 0.117 7.88 0.244 15.768-6.074 17.211 0.518-6.569 1.518-12.656 3.037-18.223z" />
<path
d="m397.32 396.32c0.901 0.449 1.811 0.89 2.024 2.025 1.436 2.366 1.224 7.424 1.013 12.148-0.182 4.063 1.111 10.063-3.037 10.124-1.656-5.939-1.656-18.356 0-24.297z" />
<path
d="m405.42 396.32c0.901 0.449 1.811 0.89 2.024 2.025 1.436 2.366 1.225 7.424 1.013 12.148-0.182 4.063 1.112 10.063-3.037 10.124-1.656-5.939-1.656-18.356 0-24.297z" />
<path
d="m386.18 405.43c1.879 2.172 2.706 5.394 3.037 9.112 0.405 2.632 3.021 3.053 3.037 6.074-3.694 0.657-5.392-0.683-7.086-2.025-1.896 2.882-11.656 3.4133-12.148 0-1.2181-8.4422 3.734-13.813 13.16-13.161zm-10.123 11.136c5.229 3.119 8.32-1.521 8.123-7.087-3.941-4.338-8.175 1.277-8.123 7.087z" />
<path d="m412.5 414.54c2.928 0.446 4.614 2.134 5.062 5.062-3.131 3.21-8.628-1.578-5.062-5.062z" />
<g fill="#069">
<path
d="m344.67 399.36c-3.462 3.288-12.431 1.068-14.174 6.074-0.212 4.938 5.378 4.072 10.124 4.05-0.763 3.287-5.684 2.415-8.099 4.05 0.194 6.297 7.9627 1.1977 12.148 3.037 2.1858 0.96059-2.6665 2.6983-4.05 3.037-0.92 0.229-7.2519 3.9961-10.124 1.013-4.022-4.1774-6.0966-12.401-2.0268-19.74 2.1561-3.8884 7.9908-2.3919 12.151-3.5449 2.1724-1.0195 4.0825-0.57137 4.051 2.024z" />
<path
d="m368.97 398.35c0.91935 1.2579 1.638 4.258 2.024 7.086 0.632 4.615 1.344 11.963-3.037 12.149 0.605-6.006-1.776-9.022-1.012-15.187-2.943 2.12-2.8572 7.4034-6.074 9.112-5.4038 2.8702-7.236-2.214-10.124-4.05-0.162 4.899 0.612 10.735-4.05 11.136-0.788-6.862 1.383-10.766 1.013-17.21 6.881-1.144 5.642 5.832 10.124 7.086 2.854-2.881 4.6308-6.3006 7.086-10.123 0.7296-1.1359 3.2534-1.0889 4.05 1e-3z" />
<path
d="m299.12 404.42c2.5659-0.14763 2.6804 4.5418 3.037 7.087 0.319 2.835 0.61 6.509-1.012 8.099-3.139 1.088-1.619-3.049-2.025-5.062-0.701-3.477-2.194-6.897 0-10.124z" />
<path
d="m324 395.29c-4.1284 0.12154 0.92333 9.4224-3.6191 9.1289-3.094-0.731-3.6892 1.0347-6.0742 1.0117-5.024-0.414 3.2846-5.0625 3.2846-5.0625-1.3331-0.17112-4.8554 0.83219-4.9679-2.0635-1.1226-0.18087-1.4286 0.17857-3.0288 0.0563-0.30668 3.1413-2.5989 3.3131-5.6576 3.0448-6.3424-0.5564-15.93 1.6227-20.001 5.0366-0.88745 0.20112-1.9712 0.15704-2.4673-0.0332l0.44194 2.0606c8.225-2.236 14.819-5.3086 26.322-5.0625 0.802 5.947-2.2449 15.743 3.0371 17.211 4.327-0.057 0.29512-5.5363 2.0234-9.0879 1.899-3.9024 2.4597-3.319 5.0625-4.0723 5.9836-1.7317 0.3075 9.815 5.0625 10.123 3.109 0.858 1.9194-3.3815 2.0234-5.0625 0.3-4.805 0.0473-13.108-1.0117-17.211-0.15291-0.0158-0.29651-0.0215-0.42969-0.0176z" />
</g>
</g>
</svg>
</a>
</footer>
</body>
</html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
changelog/res/footerbg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

55
changelog/res/halo.svg Normal file
View File

@ -0,0 +1,55 @@
<svg version="1.1" viewBox="0 0 200 180" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<radialGradient id="d" cx="161.46" cy="-144.02" r="160.02" gradientTransform="matrix(1 0 0 .99838 0 -.23281)" gradientUnits="userSpaceOnUse">
<stop stop-color="#febb00" offset="0"/>
<stop stop-color="#ffd571" stop-opacity=".49804" offset=".64286"/>
<stop stop-color="#ffe5a7" stop-opacity="0" offset=".95153"/>
<stop stop-color="#ffe5a7" stop-opacity="0" offset="1"/>
</radialGradient>
<filter id="e" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.32807532"/>
</filter>
<radialGradient id="c" cx="161.46" cy="-144.02" r="160.02" gradientTransform="matrix(1 0 0 .99838 0 -.23281)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ffd14e" offset="0"/>
<stop stop-color="#ffeeb5" stop-opacity=".49804" offset=".71429"/>
<stop stop-color="#ffeeb5" stop-opacity=".49804" offset="1"/>
</radialGradient>
<radialGradient id="b" cx="12.389" cy="11.882" r="8.199" gradientUnits="userSpaceOnUse">
<stop stop-color="#e69412" offset="0"/>
<stop stop-color="#f4c478" stop-opacity="0" offset="1"/>
</radialGradient>
<radialGradient id="a" cx="11.75" cy="17.413" r="10.752" gradientTransform="matrix(3.3776 0 0 9.4595 121.98 -293.39)" gradientUnits="userSpaceOnUse">
<stop stop-color="#fffe99" offset="0"/>
<stop stop-color="#f69706" offset=".2"/>
<stop stop-color="#136fa7" offset="1"/>
</radialGradient>
</defs>
<g transform="translate(-61.457 224.02)">
<g transform="matrix(.62494 0 0 .62494 60.557 -51.015)" fill="url(#d)" fill-rule="evenodd">
<path d="m161.46-144.02 72.75 144.62-46.61 15.146z"/>
<path d="m161.46-144.02 143.86 74.228-28.81 39.653z"/>
<path d="m161.46-144.02 160.02-24.507v49.014z"/>
<path d="m161.46-144.02 115.05-113.88 28.81 39.653z"/>
<path d="m161.46-144.02 26.14-159.76 46.615 15.146z"/>
<path d="m161.46-144.02-72.755-144.61 46.615-15.146z"/>
<path d="m161.46-144.02-143.86-74.228 28.81-39.653z"/>
<path d="m161.46-144.02-160.02 24.507-2.7e-6 -49.014z"/>
<path d="m161.46-144.02-115.05 113.89-28.81-39.653z"/>
<path d="m161.46-144.02-26.14 159.76-46.618-15.146z"/>
</g>
<g transform="matrix(.59435 -.19312 .19312 .59435 93.307 -24.24)" fill="url(#c)" fill-rule="evenodd" opacity=".88">
<path d="m161.46-144.02 72.75 144.62-46.61 15.146z"/>
<path d="m161.46-144.02 143.86 74.228-28.81 39.653z"/>
<path d="m161.46-144.02 160.02-24.507v49.014z"/>
<path d="m161.46-144.02 115.05-113.88 28.81 39.653z"/>
<path d="m161.46-144.02 26.14-159.76 46.615 15.146z"/>
<path d="m161.46-144.02-72.755-144.61 46.615-15.146z"/>
<path d="m161.46-144.02-143.86-74.228 28.81-39.653z"/>
<path d="m161.46-144.02-160.02 24.507-2.7e-6 -49.014z"/>
<path d="m161.46-144.02-115.05 113.89-28.81-39.653z"/>
<path d="m161.46-144.02-26.14 159.76-46.618-15.146z"/>
</g>
<path transform="matrix(7.0729 0 0 7.4575 73.647 -229.61)" d="m20.588 11.882a8.199 8.199 0 1 1-16.398 0 8.199 8.199 0 1 1 16.398 0z" fill="url(#b)" filter="url(#e)"/>
<path d="m133.31-207.91v55.137h-17.218c-6.602-0.97334-3.1317 2.1508-3.1317 2.1508l23.494 26.472 18.653 21.422c1.9951 2.9976 3.1147 2.8985 6.486 2.8985 3.5137 0.43957 4.2275-0.28033 6.4176-2.757l19.07-21.564 22.666-25.81c3.6888-3.9672-2.8847-2.8126-2.8847-2.8126h-18.954v-54.904c0.65539-9.337-1.0536-9.0538-8.6714-8.7929h-37.608c-7.6308-0.26075-8.3181 0.1211-8.3181 8.5607z" fill="url(#a)" stroke="#0a3b56" stroke-width="5.1532"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -17,6 +17,7 @@
"remove-missing-on-init": false, "remove-missing-on-init": false,
"retries": 5, "retries": 5,
"retry-time": 10, "retry-time": 10,
"theme": "default",
"limits": [ "limits": [
{ {
"domain": "*", "domain": "*",

View File

@ -22,6 +22,8 @@ import {
runtime, runtime,
history, history,
sessions, sessions,
// eslint-disable-next-line no-unused-vars
OnInstalled,
} from "./browser"; } from "./browser";
import { Bus } from "./bus"; import { Bus } from "./bus";
import { filterInSitu } from "./util"; import { filterInSitu } from "./util";
@ -135,6 +137,28 @@ class Handler {
} }
} }
function getMajor(version?: string) {
if (!version) {
return "";
}
const match = version.match(/^\d+\.\d+/);
if (!match) {
return "";
}
return match[0];
}
runtime.onInstalled.addListener(({reason, previousVersion}: OnInstalled) => {
const {version} = runtime.getManifest();
const major = getMajor(version);
const prevMajor = getMajor(previousVersion);
if (reason === "install" || (reason === "update" && major !== prevMajor)) {
tabs.create({
url: `https://about.downthemall.org/changelog/?cur=${major}&prev=${prevMajor}`,
});
}
});
locale.then(() => { locale.then(() => {
const menuHandler = new class Menus extends Handler { const menuHandler = new class Menus extends Handler {
constructor() { constructor() {

View File

@ -73,7 +73,7 @@ class Numeral implements Generator {
this.digits = dir ? rawpieces[0].length : rawpieces[1].length; this.digits = dir ? rawpieces[0].length : rawpieces[1].length;
this.length = Math.floor( this.length = Math.floor(
(this.stop - this.start + (dir ? 1 : -1)) / this.step); (this.stop - this.start + (dir ? 1 : -1)) / this.step);
this.preview = this[Symbol.iterator]().next().value; this.preview = this[Symbol.iterator]().next().value as string;
Object.freeze(this); Object.freeze(this);
} }
@ -93,6 +93,60 @@ class Numeral implements Generator {
} }
} }
class Character implements Generator {
public readonly start: number;
public readonly stop: number;
public readonly step: number;
public readonly length: number;
public readonly preview: string;
constructor(str: string) {
const rawpieces = str.split(":").map(e => e.trim());
const pieces = rawpieces.map((e, i) => {
if (i === 2) {
return reallyParseInt(e);
}
if (e.length > 1) {
throw new Error("Malformed Character sequence");
}
return e.charCodeAt(0);
});
if (pieces.length < 2) {
throw new Error("Invalid input");
}
const [start, stop, step] = pieces;
if (step === 0) {
throw new Error("Invalid step");
}
this.step = !step ? 1 : step;
const dir = this.step > 0;
if (dir && start > stop) {
throw new Error("Invalid sequence");
}
else if (!dir && start < stop) {
throw new Error("Invalid sequence");
}
this.start = start;
this.stop = stop;
this.length = Math.floor(
(this.stop - this.start + (dir ? 1 : -1)) / this.step);
this.preview = this[Symbol.iterator]().next().value as string;
Object.freeze(this);
}
*[Symbol.iterator]() {
const {start, stop, step} = this;
const dir = step > 0;
for (let i = start; (dir ? i <= stop : i >= stop); i += step) {
yield String.fromCharCode(i);
}
}
}
export class BatchGenerator implements Generator { export class BatchGenerator implements Generator {
private readonly gens: Generator[]; private readonly gens: Generator[];
@ -120,11 +174,16 @@ export class BatchGenerator implements Generator {
try { try {
this.gens.push(new Numeral(tok)); this.gens.push(new Numeral(tok));
} }
catch (ex) { catch {
try {
this.gens.push(new Character(tok));
}
catch {
this.gens.push(new Literal(`[${tok}]`)); this.gens.push(new Literal(`[${tok}]`));
this.hasInvalid = true; this.hasInvalid = true;
} }
} }
}
if (str) { if (str) {
this.gens.push(new Literal(str)); this.gens.push(new Literal(str));
} }

View File

@ -9,33 +9,33 @@ interface ExtensionListener {
} }
export interface MessageSender { export interface MessageSender {
tab?: Tab; readonly tab?: Tab;
frameId?: number; readonly frameId?: number;
id?: number; readonly id?: number;
url?: string; readonly url?: string;
tlsChannelId?: string; readonly tlsChannelId?: string;
} }
export interface Tab { export interface Tab {
id?: number; readonly id?: number;
incognito?: boolean; readonly incognito?: boolean;
} }
export interface MenuClickInfo { export interface MenuClickInfo {
menuItemId: string | number; readonly menuItemId: string | number;
button?: number; readonly button?: number;
linkUrl?: string; readonly linkUrl?: string;
srcUrl?: string; readonly srcUrl?: string;
} }
export interface RawPort { export interface RawPort {
error: any; readonly error: any;
name: string; readonly name: string;
onDisconnect: ExtensionListener; readonly sender?: MessageSender;
onMessage: ExtensionListener; readonly onDisconnect: ExtensionListener;
sender?: MessageSender; readonly onMessage: ExtensionListener;
disconnect: () => void; disconnect: () => void;
postMessage: (message: any) => void; postMessage: (message: any) => void;
} }
@ -57,7 +57,7 @@ type Header = {name: string; value: string};
export interface DownloadOptions { export interface DownloadOptions {
conflictAction: string; conflictAction: string;
filename: string; filename?: string;
saveAs: boolean; saveAs: boolean;
url: string; url: string;
method?: string; method?: string;
@ -82,15 +82,22 @@ interface Downloads {
getFileIcon(id: number, options?: any): Promise<string>; getFileIcon(id: number, options?: any): Promise<string>;
setShelfEnabled(state: boolean): void; setShelfEnabled(state: boolean): void;
removeFile(manId: number): Promise<void>; removeFile(manId: number): Promise<void>;
onCreated: ExtensionListener; readonly onCreated: ExtensionListener;
onChanged: ExtensionListener; readonly onChanged: ExtensionListener;
onErased: ExtensionListener; readonly onErased: ExtensionListener;
readonly onDeterminingFilename?: ExtensionListener;
} }
interface WebRequest { interface WebRequest {
onBeforeSendHeaders: WebRequestListener; readonly onBeforeSendHeaders: WebRequestListener;
onSendHeaders: WebRequestListener; readonly onSendHeaders: WebRequestListener;
onHeadersReceived: WebRequestListener; readonly onHeadersReceived: WebRequestListener;
}
export interface OnInstalled {
readonly reason: string;
readonly previousVersion?: string;
readonly temporary: boolean;
} }
export const {browserAction} = polyfill; export const {browserAction} = polyfill;
@ -107,5 +114,6 @@ export const {tabs} = polyfill;
export const {webNavigation} = polyfill; export const {webNavigation} = polyfill;
export const {webRequest}: {webRequest: WebRequest} = polyfill; export const {webRequest}: {webRequest: WebRequest} = polyfill;
export const {windows} = polyfill; export const {windows} = polyfill;
export const {theme} = polyfill;
export const CHROME = navigator.appVersion.includes("Chrome/"); export const CHROME = navigator.appVersion.includes("Chrome/");

View File

@ -8,32 +8,35 @@ import {runtime, tabs, RawPort, MessageSender} from "./browser";
export class Port extends EventEmitter { export class Port extends EventEmitter {
private port: RawPort | null; private port: RawPort | null;
private disconnected = false;
constructor(port: RawPort) { constructor(port: RawPort) {
super(); super();
this.port = port; this.port = port;
let disconnected = false;
const disconnect = () => {
if (disconnected) {
return;
}
disconnected = true;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
};
// Nasty firefox bug, thus listen for tab removal explicitly // Nasty firefox bug, thus listen for tab removal explicitly
if (port.sender && port.sender.tab && port.sender.tab.id) { if (port.sender && port.sender.tab && port.sender.tab.id) {
const otherTabId = port.sender.tab.id; const otherTabId = port.sender.tab.id;
const tabListener = function(tabId: number) { const tabListener = (tabId: number) => {
if (tabId !== otherTabId) { if (tabId !== otherTabId) {
return; return;
} }
disconnect(); this.disconnect();
}; };
tabs.onRemoved.addListener(tabListener); tabs.onRemoved.addListener(tabListener);
} }
port.onMessage.addListener(this.onMessage.bind(this)); port.onMessage.addListener(this.onMessage.bind(this));
port.onDisconnect.addListener(disconnect); port.onDisconnect.addListener(this.disconnect.bind(this));
}
disconnect() {
if (this.disconnected) {
return;
}
this.disconnected = true;
const {port} = this;
this.port = null; // Break the cycle
this.emit("disconnect", this, port);
} }
get name() { get name() {
@ -120,6 +123,9 @@ export const Bus = new class extends EventEmitter {
port.disconnect(); port.disconnect();
return; return;
} }
this.ports.emit(port.name, new Port(port)); const wrapped = new Port(port);
if (!this.ports.emit(port.name, wrapped)) {
wrapped.disconnect();
}
} }
}(); }();

4
lib/ipreg.ts Normal file
View File

@ -0,0 +1,4 @@
"use strict";
// License: MIT
export const IPReg = /^(?:(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$|^(?:(?:(?:[0-9a-fA-F]{1,4}):){7}(?:(?:[0-9a-fA-F]{1,4})|:)|(?:(?:[0-9a-fA-F]{1,4}):){6}(?:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|:(?:[0-9a-fA-F]{1,4})|:)|(?:(?:[0-9a-fA-F]{1,4}):){5}(?::((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,2}|:)|(?:(?:[0-9a-fA-F]{1,4}):){4}(?:(:(?:[0-9a-fA-F]{1,4})){0,1}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,3}|:)|(?:(?:[0-9a-fA-F]{1,4}):){3}(?:(:(?:[0-9a-fA-F]{1,4})){0,2}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,4}|:)|(?:(?:[0-9a-fA-F]{1,4}):){2}(?:(:(?:[0-9a-fA-F]{1,4})){0,3}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,5}|:)|(?:(?:[0-9a-fA-F]{1,4}):){1}(?:(:(?:[0-9a-fA-F]{1,4})){0,4}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(:(?:[0-9a-fA-F]{1,4})){1,6}|:)|(?::((?::(?:[0-9a-fA-F]{1,4})){0,5}:((?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])[.]){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])|(?::(?:[0-9a-fA-F]{1,4})){1,7}|:)))(%[0-9a-zA-Z]{1,})?$/;

View File

@ -22,7 +22,8 @@ import {
RUNNING, RUNNING,
RETRYING RETRYING
} from "./state"; } from "./state";
import { Preroller } from "./preroller"; // eslint-disable-next-line no-unused-vars
import { Preroller, PrerollResults } from "./preroller";
function isRecoverable(error: string) { function isRecoverable(error: string) {
switch (error) { switch (error) {
@ -130,11 +131,13 @@ export class Download extends BaseDownload {
} }
const options: DownloadOptions = { const options: DownloadOptions = {
conflictAction: await Prefs.get("conflict-action"), conflictAction: await Prefs.get("conflict-action"),
filename: this.dest.full,
saveAs: false, saveAs: false,
url: this.url, url: this.url,
headers: [], headers: [],
}; };
if (!CHROME) {
options.filename = this.dest.full;
}
if (!CHROME && this.private) { if (!CHROME && this.private) {
options.incognito = true; options.incognito = true;
} }
@ -194,15 +197,7 @@ export class Download extends BaseDownload {
if (!res) { if (!res) {
return; return;
} }
if (res.mime) { this.adoptPrerollResults(res);
this.mime = res.mime;
}
if (res.name) {
this.serverName = res.name;
}
if (res.error) {
this.cancelAccordingToError(res.error);
}
} }
catch (ex) { catch (ex) {
console.error("Failed to preroll", this, ex.toString(), ex.stack, ex); console.error("Failed to preroll", this, ex.toString(), ex.stack, ex);
@ -215,6 +210,18 @@ export class Download extends BaseDownload {
} }
} }
adoptPrerollResults(res: PrerollResults) {
if (res.mime) {
this.mime = res.mime;
}
if (res.name) {
this.serverName = res.name;
}
if (res.error) {
this.cancelAccordingToError(res.error);
}
}
resume(forced = false) { resume(forced = false) {
if (!(FORCABLE & this.state)) { if (!(FORCABLE & this.state)) {
return; return;
@ -391,4 +398,27 @@ export class Download extends BaseDownload {
this.setMissing(); this.setMissing();
} }
} }
updatefromSuggestion(state: any) {
const res: PrerollResults = {};
if (state.mime) {
res.mime = state.mime;
}
if (state.filename) {
res.name = state.filename;
}
if (state.finalUrl) {
res.finalURL = state.finalUrl;
const detected = Preroller.maybeFindNameFromSearchParams(this, res);
if (detected) {
res.name = detected;
}
}
try {
this.adoptPrerollResults(res);
}
finally {
this.markDirty();
}
}
} }

View File

@ -82,6 +82,10 @@ export class Manager extends EventEmitter {
downloads.onChanged.addListener(this.onChanged.bind(this)); downloads.onChanged.addListener(this.onChanged.bind(this));
downloads.onErased.addListener(this.onErased.bind(this)); downloads.onErased.addListener(this.onErased.bind(this));
if (CHROME && downloads.onDeterminingFilename) {
downloads.onDeterminingFilename.addListener(
this.onDeterminingFilename.bind(this));
}
Bus.onPort("manager", (port: Port) => { Bus.onPort("manager", (port: Port) => {
const mport = new ManagerPort(this, port); const mport = new ManagerPort(this, port);
@ -89,6 +93,7 @@ export class Manager extends EventEmitter {
this.ports.delete(mport); this.ports.delete(mport);
}); });
this.ports.add(mport); this.ports.add(mport);
return true;
}); });
Limits.on("changed", () => { Limits.on("changed", () => {
this.resetScheduler(); this.resetScheduler();
@ -157,6 +162,20 @@ export class Manager extends EventEmitter {
this.manIds.delete(downloadId); this.manIds.delete(downloadId);
} }
onDeterminingFilename(state: any, suggest: Function) {
const download = this.manIds.get(state.id);
if (!download) {
return;
}
try {
download.updatefromSuggestion(state);
}
finally {
const suggestion = {filename: download.dest.full};
suggest(suggestion);
}
}
async resetScheduler() { async resetScheduler() {
this.scheduler = null; this.scheduler = null;
await this.startNext(); await this.startNext();

View File

@ -54,6 +54,9 @@ export class Preroller {
} }
get shouldPreroll() { get shouldPreroll() {
if (CHROME) {
return false;
}
const {uURL, renamer} = this.download; const {uURL, renamer} = this.download;
const {pathname, search, host} = uURL; const {pathname, search, host} = uURL;
if (PREROLL_NOPE.has(host)) { if (PREROLL_NOPE.has(host)) {
@ -167,39 +170,15 @@ export class Preroller {
rv.mime = type.essence; rv.mime = type.essence;
} }
const {p_ext: ext} = this.download.renamer;
const dispHeader = headers.get("content-disposition"); const dispHeader = headers.get("content-disposition");
if (dispHeader) { if (dispHeader) {
const file = CDPARSER.parse(dispHeader); const file = CDPARSER.parse(dispHeader);
// Sanitize // Sanitize
rv.name = sanitizePath(file.replace(/[/\\]+/g, "-")); rv.name = sanitizePath(file.replace(/[/\\]+/g, "-"));
} }
else if (!ext || PREROLL_SEARCHEXTS.has(ext.toLocaleLowerCase())) { else {
const {searchParams} = this.download.uURL; const detected = Preroller.maybeFindNameFromSearchParams(
let detected = ""; this.download, rv);
for (const [, value] of searchParams) {
if (!NAME_TESTER.test(value)) {
continue;
}
const p = parsePath(value);
if (!p.base || !p.ext) {
continue;
}
if (!MimeDB.hasExtension(p.ext)) {
continue;
}
if (rv.mime) {
const mime = MimeDB.getMime(rv.mime);
if (mime && !mime.extensions.has(p.ext.toLowerCase())) {
continue;
}
}
const sanitized = sanitizePath(p.name);
if (sanitized.length <= detected.length) {
continue;
}
detected = sanitized;
}
if (detected) { if (detected) {
rv.name = detected; rv.name = detected;
} }
@ -231,4 +210,43 @@ export class Preroller {
return rv; return rv;
} }
static maybeFindNameFromSearchParams(
download: Download, res: PrerollResults) {
const {p_ext: ext} = download.renamer;
if (ext && !PREROLL_SEARCHEXTS.has(ext.toLocaleLowerCase())) {
return undefined;
}
return Preroller.findNameFromSearchParams(download.uURL, res.mime);
}
static findNameFromSearchParams(url: URL, mimetype?: string) {
const {searchParams} = url;
let detected = "";
for (const [, value] of searchParams) {
if (!NAME_TESTER.test(value)) {
continue;
}
const p = parsePath(value);
if (!p.base || !p.ext) {
continue;
}
if (!MimeDB.hasExtension(p.ext)) {
continue;
}
if (mimetype) {
const mime = MimeDB.getMime(mimetype);
if (mime && !mime.extensions.has(p.ext.toLowerCase())) {
continue;
}
}
const sanitized = sanitizePath(p.name);
if (sanitized.length <= detected.length) {
continue;
}
detected = sanitized;
}
return detected;
}
} }

View File

@ -101,7 +101,10 @@ export async function select(links: BaseItem[], media: BaseItem[]) {
tracker.track(window.id, null); tracker.track(window.id, null);
try { try {
const port = await Promise.race<Port>([ const port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("select", resolve)), new Promise<Port>(resolve => Bus.oncePort("select", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]); timeout<Port>(5 * 1000)]);
if (!port.isSelf) { if (!port.isSelf) {
throw Error("Invalid sender connected"); throw Error("Invalid sender connected");

View File

@ -24,7 +24,10 @@ export async function single(item: BaseItem | null) {
tracker.track(window.id, null); tracker.track(window.id, null);
try { try {
const port: Port = await Promise.race<Port>([ const port: Port = await Promise.race<Port>([
new Promise<Port>(resolve => Bus.oncePort("single", resolve)), new Promise<Port>(resolve => Bus.oncePort("single", port => {
resolve(port);
return true;
})),
timeout<Port>(5 * 1000)]); timeout<Port>(5 * 1000)]);
if (!port.isSelf) { if (!port.isSelf) {
throw Error("Invalid sender connected"); throw Error("Invalid sender connected");

View File

@ -3,6 +3,7 @@
import * as psl from "psl"; import * as psl from "psl";
import { identity, memoize } from "./memoize"; import { identity, memoize } from "./memoize";
import { IPReg } from "./ipreg";
export { debounce } from "../uikit/lib/util"; export { debounce } from "../uikit/lib/util";
export class Promised { export class Promised {
@ -237,7 +238,10 @@ export interface URLd extends URL {
Object.defineProperty(URL.prototype, "domain", { Object.defineProperty(URL.prototype, "domain", {
get() { get() {
try { try {
return hostToDomain(this.host) || this.host; const {hostname} = this;
return IPReg.test(hostname) ?
hostname :
hostToDomain(hostname) || hostname;
} }
catch (ex) { catch (ex) {
console.error(ex); console.error(ex);

View File

@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "DownThemAll!", "name": "DownThemAll!",
"version": "4.1.1", "version": "4.2.1",
"description": "__MSG_extensionDescription__", "description": "__MSG_extensionDescription__",
"homepage_url": "https://downthemall.org/", "homepage_url": "https://downthemall.org/",
@ -33,6 +33,7 @@
"sessions", "sessions",
"storage", "storage",
"tabs", "tabs",
"theme",
"webNavigation", "webNavigation",
"webRequest", "webRequest",
"webRequestBlocking" "webRequestBlocking"

View File

@ -18,24 +18,24 @@
"author": "Nils Maier", "author": "Nils Maier",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/node": "^12.7.2", "@types/node": "^12.7.8",
"@typescript-eslint/eslint-plugin": "^2.0.0", "@typescript-eslint/eslint-plugin": "^2.3.2",
"@typescript-eslint/parser": "^2.0.0", "@typescript-eslint/parser": "^2.3.2",
"chai": "^4.1.2", "chai": "^4.1.2",
"eslint": "^6.2.2", "eslint": "^6.5.1",
"mocha": "^6.2.0", "mocha": "^6.2.1",
"ts-loader": "^6.0.4", "ts-loader": "^6.2.0",
"ts-node": "^8.3.0", "ts-node": "^8.4.1",
"typescript": "^3.5.3", "typescript": "^3.6.3",
"webpack": "^4.39.3", "webpack": "^4.41.0",
"webpack-cli": "^3.3.7", "webpack-cli": "^3.3.9",
"xregexp": "^4.2.4" "xregexp": "^4.2.4"
}, },
"dependencies": { "dependencies": {
"@types/psl": "^1.1.0", "@types/psl": "^1.1.0",
"@types/whatwg-mimetype": "^2.1.0", "@types/whatwg-mimetype": "^2.1.0",
"psl": "^1.3.0", "psl": "^1.4.0",
"webextension-polyfill": "^0.4.0", "webextension-polyfill": "^0.5.0",
"whatwg-mimetype": "^2.3.0" "whatwg-mimetype": "^2.3.0"
} }
} }

View File

@ -121,14 +121,26 @@ class Gatherer {
*collectImageInternal(img: HTMLImageElement) { *collectImageInternal(img: HTMLImageElement) {
try { try {
const src = img.currentSrc || img.src; {
const {src} = img;
const item = this.makeItem(src, img); const item = this.makeItem(src, img);
if (item) { if (item) {
item.fileName = ""; item.fileName = "";
item.description = item.title; item.description = item.title;
yield item; yield item;
} }
}
{
const {currentSrc} = img;
const item = this.makeItem(currentSrc, img);
if (item) {
item.fileName = "";
item.description = item.title;
yield item;
}
}
{
const {srcset} = img; const {srcset} = img;
if (!srcset) { if (!srcset) {
return; return;
@ -146,6 +158,7 @@ class Gatherer {
} }
} }
} }
}
catch (ex) { catch (ex) {
console.error("oops image", ex.toString(), ex.stack, ex); console.error("oops image", ex.toString(), ex.stack, ex);
} }

View File

@ -2,11 +2,25 @@
/* License: gpl-v2 */ /* License: gpl-v2 */
:root { :root {
--general-color: #2a2a2e;
--general-bgcolor: rgb(249, 249, 250);
--general-border-color: lightgray;
--general-input-color: black;
--general-input-bgcolor: white;
--general-button-color: black;
--general-button-bgcolor: rgb(246, 246, 246);
--general-button-bgcolor-hover: white;
--general-button-shadow: 0px 0px 5px 1px rgba(128, 128, 128, 0.5);
--menu-bgcolor: white;
--menu-bgcolor-hover: #2283fb;
--table-bgcolor: white;
--table-head-bgcolor: white;
--toolbar-bg-color: rgb(248, 134, 6); --toolbar-bg-color: rgb(248, 134, 6);
--toolbar-active-border-color: #478de7; --toolbar-active-border-color: #478de7;
--toolbar-hover-border-color: red; --toolbar-hover-border-color: red;
--toolbar-hover-background: rgb(247, 149, 37); --toolbar-hover-background: rgb(247, 149, 37);
--toolbar-border-width: 2px; --toolbar-border-width: 2px;
--toolbar-border: 1px solid rgba(255, 255, 255, 0.5);
--add-color: navy; --add-color: navy;
--queue-color: gray; --queue-color: gray;
--pause-color: #ffa318; --pause-color: #ffa318;
@ -20,24 +34,76 @@
--maskbutton-color: rgb(236, 185, 16); --maskbutton-color: rgb(236, 185, 16);
--missing-color: rgb(0, 82, 204); --missing-color: rgb(0, 82, 204);
--open-color: rgba(236, 185, 16, 0.8); --open-color: rgba(236, 185, 16, 0.8);
--status-icon-color: #363636;
--status-icon-color-hover: #6e6d6d;
--tile-url: url(tile.png);
--file-icon-image-color: rgb(17, 107, 163);
--popup-bgcolor: #fff;
--popup-color: #0c0c0d;
--modal-color: black;
--modal-bgcolor: white;
}
html.dark {
--add-color: lightblue;
--general-bgcolor: #2a2a2e;
--general-border-color: rgb(85, 85, 85);
--general-button-bgcolor-hover: black;
--general-button-bgcolor: rgb(36, 36, 36);
--general-button-color: white;
--general-color: rgb(249, 249, 250);
--menu-bgcolor: black;
--menu-bgcolor-hover: #1a6bce;
--table-bgcolor: #1a1a1e;
--table-head-bgcolor: #3a3a3e;
--toolbar-bg-color: rgb(202, 108, 0);
--status-icon-color: #b9b9b9;
--status-icon-color-hover: #e2e2e2;
--tile-url: url(tile-dark.png?3);
--toolbar-border: 1px solid rgba(30, 30, 30, 0.5);
--file-icon-image-color: rgb(21, 130, 197);
--popup-bgcolor: #4a4a4f;
--popup-color: rgb(249, 249, 250);
--general-button-shadow: 0px 0px 7px 1px rgba(128, 128, 128, 0.8);
--modal-color: white;
--modal-bgcolor: #333;
scrollbar-color: rgba(249, 249, 250, 0.4) rgba(20, 20, 25, 0.3);
}
html.dark a {
color: lightblue;
}
html.dark ::-webkit-scrollbar {
background: rgba(20, 20, 25, 0.3);
}
html.dark ::-webkit-scrollbar-thumb {
background: rgba(249, 249, 250, 0.4);
}
html.dark ::-webkit-scrollbar-corner {
background: #000;
} }
html[data-platform="mac"] { html[data-platform="mac"] {
--folder-color: rgb(4, 102, 214); --folder-color: rgb(4, 102, 214);
} }
html, body { html,
body {
font-size: 10pt !important; font-size: 10pt !important;
} }
@font-face { @font-face {
font-family: 'downthemall'; font-family: "downthemall";
src: url('downthemall.woff2?75791791') format('woff2'); src: url("downthemall.woff2?75791791") format("woff2");
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
[class^="icon-"]:before, [class*=" icon-"]:before { [class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: "downthemall"; font-family: "downthemall";
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
@ -54,72 +120,187 @@ html, body {
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-add:before { content: '\e800'; } /* '' */ .icon-add:before {
.icon-addsegment:before { content: '\e801'; } /* '' */ content: "\e800";
.icon-bottom:before { content: '\e802'; } /* '' */ } /* '' */
.icon-picture:before { content: '\e803'; } /* '' */ .icon-addsegment:before {
.icon-circle:before { content: '\e804'; } /* '' */ content: "\e801";
.icon-delete:before { content: '\e805'; } /* '' */ } /* '' */
.icon-done:before { content: '\e806'; } /* '' */ .icon-bottom:before {
.icon-down:before { content: '\e807'; } /* '' */ content: "\e802";
.icon-download:before { content: '\e808'; } /* '' */ } /* '' */
.icon-dupe:before { content: '\e809'; } /* '' */ .icon-picture:before {
.icon-error:before { content: '\e80a'; } /* '' */ content: "\e803";
.icon-failed:before { content: '\e80b'; } /* '' */ } /* '' */
.icon-file:before { content: '\e80c'; } /* '' */ .icon-circle:before {
.icon-find:before { content: '\e80d'; } /* '' */ content: "\e804";
.icon-folder:before { content: '\e80e'; } /* '' */ } /* '' */
.icon-force:before { content: '\e80f'; } /* '' */ .icon-delete:before {
.icon-go:before { content: '\e810'; } /* '' */ content: "\e805";
.icon-import:before { content: '\e811'; } /* '' */ } /* '' */
.icon-info:before { content: '\e812'; } /* '' */ .icon-done:before {
.icon-launch:before { content: '\e813'; } /* '' */ content: "\e806";
.icon-missing:before { content: '\e814'; } /* '' */ } /* '' */
.icon-network-off:before { content: '\e815'; } /* '' */ .icon-down:before {
.icon-network-on:before { content: '\e816'; } /* '' */ content: "\e807";
.icon-pause:before { content: '\e817'; } /* '' */ } /* '' */
.icon-remsegment:before { content: '\e818'; } /* '' */ .icon-download:before {
.icon-rename:before { content: '\e819'; } /* '' */ content: "\e808";
.icon-save:before { content: '\e81a'; } /* '' */ } /* '' */
.icon-settings:before { content: '\e81b'; } /* '' */ .icon-dupe:before {
.icon-top:before { content: '\e81c'; } /* '' */ content: "\e809";
.icon-unchecked:before { content: '\e81d'; } /* '' */ } /* '' */
.icon-unlimited:before { content: '\e81e'; } /* '' */ .icon-error:before {
.icon-link:before { content: '\e81f'; } /* '' */ content: "\e80a";
.icon-up:before { content: '\e820'; } /* '' */ } /* '' */
.icon-privacy:before { content: '\e821'; } /* '' */ .icon-failed:before {
.icon-tags:before { content: '\e822'; } /* '' */ content: "\e80b";
.icon-attention:before { content: '\e823'; } /* '' */ } /* '' */
.icon-notification:before { content: '\e824'; } /* '' */ .icon-file:before {
.icon-file-video:before { content: '\e825'; } /* '' */ content: "\e80c";
.icon-file-generic:before { content: '\e826'; } /* '' */ } /* '' */
.icon-question-dark:before { content: '\e827'; } /* '' */ .icon-find:before {
.icon-forward:before { content: '\e828'; } /* '' */ content: "\e80d";
.icon-filter:before { content: '\f0b0'; } /* '' */ } /* '' */
.icon-donate:before { content: '\f0d6'; } /* '' */ .icon-folder:before {
.icon-file-doc:before { content: '\f0f6'; } /* '' */ content: "\e80e";
.icon-interface:before { content: '\f108'; } /* '' */ } /* '' */
.icon-folder-1:before { content: '\f115'; } /* '' */ .icon-force:before {
.icon-sort-asc:before { content: '\f15d'; } /* '' */ content: "\e80f";
.icon-sort-desc:before { content: '\f15e'; } /* '' */ } /* '' */
.icon-file-pdf:before { content: '\f1c1'; } /* '' */ .icon-go:before {
.icon-file-word:before { content: '\f1c2'; } /* '' */ content: "\e810";
.icon-file-image:before { content: '\f1c5'; } /* '' */ } /* '' */
.icon-file-archive:before { content: '\f1c6'; } /* '' */ .icon-import:before {
.icon-file-audio:before { content: '\f1c7'; } /* '' */ content: "\e811";
.icon-toggle-off:before { content: '\f204'; } /* '' */ } /* '' */
.icon-toggle-on:before { content: '\f205'; } /* '' */ .icon-info:before {
.icon-server:before { content: '\f233'; } /* '' */ content: "\e812";
.icon-question-light:before { content: '\f29c'; } /* '' */ } /* '' */
.icon-launch:before {
content: "\e813";
} /* '' */
.icon-missing:before {
content: "\e814";
} /* '' */
.icon-network-off:before {
content: "\e815";
} /* '' */
.icon-network-on:before {
content: "\e816";
} /* '' */
.icon-pause:before {
content: "\e817";
} /* '' */
.icon-remsegment:before {
content: "\e818";
} /* '' */
.icon-rename:before {
content: "\e819";
} /* '' */
.icon-save:before {
content: "\e81a";
} /* '' */
.icon-settings:before {
content: "\e81b";
} /* '' */
.icon-top:before {
content: "\e81c";
} /* '' */
.icon-unchecked:before {
content: "\e81d";
} /* '' */
.icon-unlimited:before {
content: "\e81e";
} /* '' */
.icon-link:before {
content: "\e81f";
} /* '' */
.icon-up:before {
content: "\e820";
} /* '' */
.icon-privacy:before {
content: "\e821";
} /* '' */
.icon-tags:before {
content: "\e822";
} /* '' */
.icon-attention:before {
content: "\e823";
} /* '' */
.icon-notification:before {
content: "\e824";
} /* '' */
.icon-file-video:before {
content: "\e825";
} /* '' */
.icon-file-generic:before {
content: "\e826";
} /* '' */
.icon-question-dark:before {
content: "\e827";
} /* '' */
.icon-forward:before {
content: "\e828";
} /* '' */
.icon-filter:before {
content: "\f0b0";
} /* '' */
.icon-donate:before {
content: "\f0d6";
} /* '' */
.icon-file-doc:before {
content: "\f0f6";
} /* '' */
.icon-interface:before {
content: "\f108";
} /* '' */
.icon-folder-1:before {
content: "\f115";
} /* '' */
.icon-sort-asc:before {
content: "\f15d";
} /* '' */
.icon-sort-desc:before {
content: "\f15e";
} /* '' */
.icon-file-pdf:before {
content: "\f1c1";
} /* '' */
.icon-file-word:before {
content: "\f1c2";
} /* '' */
.icon-file-image:before {
content: "\f1c5";
} /* '' */
.icon-file-archive:before {
content: "\f1c6";
} /* '' */
.icon-file-audio:before {
content: "\f1c7";
} /* '' */
.icon-toggle-off:before {
content: "\f204";
} /* '' */
.icon-toggle-on:before {
content: "\f205";
} /* '' */
.icon-server:before {
content: "\f233";
} /* '' */
.icon-question-light:before {
content: "\f29c";
} /* '' */
@media (min-resolution: 144dpi) { @media (min-resolution: 144dpi) {
[class^="icon-file-"]:before, [class*=" icon-file-"]:before { [class^="icon-file-"]:before,
[class*=" icon-file-"]:before {
font-weight: bold !important; font-weight: bold !important;
} }
} }
.icon-file-image { .icon-file-image {
color: rgb(17, 107, 163); color: var(--file-icon-image-color);
} }
.icon-file-pdf, .icon-file-pdf,
@ -140,18 +321,29 @@ html, body {
color: rgb(202, 81, 198); color: rgb(202, 81, 198);
} }
body, html { body,
background: #F6F6F8; html {
color: #0C0C0D;
font: message-box; font: message-box;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Ubuntu",
"Helvetica Neue", sans-serif;
height: 100%; height: 100%;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 100%; width: 100%;
color: var(--general-color);
background: var(--general-bgcolor);
} }
h1, h2, h3, h4 { html#popup,
html#popup > body {
color: var(--popup-color);
background: var(--popup-bgcolor);
}
h1,
h2,
h3,
h4 {
font: caption; font: caption;
font-weight: bold; font-weight: bold;
} }
@ -191,7 +383,11 @@ section {
} }
.virtualtable-column:active { .virtualtable-column:active {
background-image: linear-gradient(to top, rgba(0,0,0,0.03), rgba(128,128,128,0.1)); background-image: linear-gradient(
to top,
rgba(0, 0, 0, 0.03),
rgba(128, 128, 128, 0.1)
);
} }
th.virtualtable { th.virtualtable {
@ -218,7 +414,11 @@ td.virtualtable {
font-size: 12px; font-size: 12px;
align-items: stretch; align-items: stretch;
justify-items: center; justify-items: center;
background: linear-gradient(to bottom, rgba(128,128,128,0.1) 0%,rgba(0,0,0,0) 100%); background: linear-gradient(
to bottom,
rgba(128, 128, 128, 0.1) 0%,
rgba(0, 0, 0, 0) 100%
);
border-top: 1px solid rgba(128, 128, 128, 0.6); border-top: 1px solid rgba(128, 128, 128, 0.6);
display: flex; display: flex;
margin-bottom: 1ex; margin-bottom: 1ex;
@ -251,10 +451,10 @@ td.virtualtable {
#statusPrefs { #statusPrefs {
cursor: pointer; cursor: pointer;
color: #363636; color: var(--status-icon-color);
} }
#statusPrefs:hover { #statusPrefs:hover {
color: #6e6d6d; color: var(--status-icon-color-hover);
} }
.dropdown { .dropdown {
@ -279,6 +479,7 @@ td.virtualtable {
-moz-appearance: none; -moz-appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
appearance: none; appearance: none;
color: black;
background: white; background: white;
border: none; border: none;
bottom: 2px; bottom: 2px;
@ -301,7 +502,6 @@ td.virtualtable {
padding-bottom: 1ex; padding-bottom: 1ex;
} }
@supports (not (-moz-appearance: none)) { @supports (not (-moz-appearance: none)) {
.dropdown select { .dropdown select {
background: white; background: white;
@ -371,3 +571,49 @@ td.virtualtable {
#maskButton { #maskButton {
color: var(--maskbutton-color); color: var(--maskbutton-color);
} }
table.virtualtable,
.virtualtable-body {
color: var(--general-color);
background: var(--table-bgcolor);
}
.virtualtable-head,
.virtualtable-head > table {
background: var(--table-head-bgcolor) !important;
}
.virtualtable-column {
border-right: 1px solid var(--general-border-color);
}
.virtualtable-cell {
border-right: 1px dotted var(--general-border-color);
}
.virtualtable-head,
.virtualtable-body {
border-bottom: 1px solid var(--general-border-color);
}
ul.context-menu,
ul.context-menu ul {
color: var(--general-color);
background: var(--menu-bgcolor);
}
.context-menu-item:hover:not(.context-menu-seperator),
.context-menu-item:hover:not(.context-menu-seperator) > * {
background: var(--menu-bgcolor-hover);
}
input {
color: var(--general-input-color);
background: var(--general-input-bgcolor);
border: inherit;
padding: 2px;
}
.modal-dialog {
color: var(--modal-color);
background: var(--modal-bgcolor);
}

View File

@ -16,7 +16,7 @@ body > * {
#toolbar { #toolbar {
display: flex; display: flex;
margin: 0; margin: 0;
background: var(--toolbar-bg-color) url(tile.png) repeat-x; background: var(--toolbar-bg-color) var(--tile-url) repeat-x;
} }
#toolbar .spacer { #toolbar .spacer {
@ -42,9 +42,9 @@ body > * {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
box-shadow: 0px 0px 5px 1px rgba(128,128,128,0.5); box-shadow: var(--general-button-shadow);
background: rgb(246,246,246); background: var(--general-button-bgcolor);
color: black; color: var(--general-button-color);
transition: box-shadow 0.5s, background 1s; transition: box-shadow 0.5s, background 1s;
font-size: 24px; font-size: 24px;
line-height: 24px; line-height: 24px;
@ -60,7 +60,7 @@ body > * {
} }
#toolbar > .button:hover:not(.disabled) { #toolbar > .button:hover:not(.disabled) {
background: white; background: var(--general-button-bgcolor-hover);
box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75); box-shadow: 0px 0px 7px 2px rgba(70,70,70,0.75);
} }
@ -88,14 +88,14 @@ body > * {
flex: 1 1 auto; flex: 1 1 auto;
overflow: hidden; overflow: hidden;
display: grid; display: grid;
background: white; background: var(--general-bgcolor);
} }
#loading { #loading {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
background: rgba(255,255,255,0.9); background: var(--general-button-bgcolor);
font-weight: bolder; font-weight: bolder;
font-size: 200%; font-size: 200%;
z-index: 10; z-index: 10;
@ -311,7 +311,7 @@ body > * {
color: crimson; color: crimson;
} }
#statusNetwork.icon-network-on { #statusNetwork.icon-network-on {
color: navy; color: var(--add-color);
} }
#statusFilter { #statusFilter {
@ -344,6 +344,7 @@ body > * {
height: 16px; height: 16px;
-moz-appearance: none; -moz-appearance: none;
border: 0; border: 0;
outline: 0;
background: transparent; background: transparent;
width: calc(100% - 28px); width: calc(100% - 28px);
} }
@ -403,7 +404,7 @@ body > * {
font-size: 10pt !important; font-size: 10pt !important;
} }
#nagging { #nagging {
border-top: 1px solid lightgray; border-top: 1px solid var(--general-border-color);
display: grid; display: grid;
grid-template-columns: 1fr auto auto auto; grid-template-columns: 1fr auto auto auto;
align-content: center; align-content: center;

View File

@ -1,8 +1,8 @@
/* License: gpl-v2 */ /* License: gpl-v2 */
@import 'common.css'; @import "common.css";
html, body { html,
background: transparent !important; body {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
@ -19,9 +19,10 @@ article {
#tabs { #tabs {
display: flex; display: flex;
background: url(icon64.png) 1em 50%/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon64.png) 1em 50%/32px 32px no-repeat,
var(--tile-url) repeat-x, var(--toolbar-bg-color);
padding-left: calc(2em + 32px); padding-left: calc(2em + 32px);
color: white; color: var(--general-bgcolor);
} }
input.tab { input.tab {
@ -54,9 +55,10 @@ input.tab {
#tabsel-general:checked ~ #tabs #tabel-general, #tabsel-general:checked ~ #tabs #tabel-general,
#tabsel-filters:checked ~ #tabs #tabel-filters, #tabsel-filters:checked ~ #tabs #tabel-filters,
#tabsel-network:checked ~ #tabs #tabel-network { #tabsel-network:checked ~ #tabs #tabel-network {
color: black !important; color: var(--general-color) !important;
background: white; background: var(--general-bgcolor);
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color); border-top: var(--toolbar-border-width) solid
var(--toolbar-active-border-color);
} }
#tabs > label { #tabs > label {
@ -64,13 +66,14 @@ input.tab {
border-top: var(--toolbar-border-width) solid transparent; border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid transparent; border-left: 1px solid transparent;
border-right: 1px solid transparent; border-right: 1px solid transparent;
border-left: 1px solid rgba(255, 255, 255, 0.5); border-left: var(--toolbar-border);
border-right: 1px solid rgba(255, 255, 255, 0.5); border-right: var(--toolbar-border);
background: var(--toolbar-bg-color); background: var(--toolbar-bg-color);
} }
#tabs > label:hover:not(:checked) { #tabs > label:hover:not(:checked) {
border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color); border-top: var(--toolbar-border-width) solid
var(--toolbar-hover-border-color);
background: var(--toolbar-hover-background); background: var(--toolbar-hover-background);
} }
@ -113,15 +116,27 @@ input.tab {
fieldset { fieldset {
display: flex; display: flex;
margin-bottom: 1em; margin-bottom: 1em;
border: 1px solid lightgray; border: 1px solid var(--general-border-color);
border-radius: 6px; border-radius: 6px;
box-shadow: 1px 1px 6px lightgray; box-shadow: 1px 1px 6px var(--general-border-color);
background: rgba(128, 128, 128, 0.05); background: rgba(128, 128, 128, 0.05);
flex-direction: column; flex-direction: column;
max-width: 60em; max-width: 60em;
padding: 1.2em; padding: 1.2em;
} }
.optiongroups,
fieldset > label {
display: flex;
align-items: center;
}
fieldset > label > input,
fieldset > label > select {
margin-left: 1ex;
margin-right: 1ex;
}
legend { legend {
font-weight: bold; font-weight: bold;
font-size: 120%; font-size: 120%;
@ -134,10 +149,10 @@ legend {
} }
.virtualtable-container { .virtualtable-container {
border: 1px solid lightgray; border: 1px solid var(--general-border-color);
border-radius: 6px; border-radius: 6px;
background: rgba(128, 128, 128, 0.05); background: rgba(128, 128, 128, 0.05);
box-shadow: 1px 1px 6px lightgray; box-shadow: 1px 1px 6px var(--general-border-color);
} }
#network-general { #network-general {
@ -146,3 +161,24 @@ legend {
grid-column-gap: 1em; grid-column-gap: 1em;
grid-row-gap: 1ex; grid-row-gap: 1ex;
} }
.optiongroups {
display: grid;
grid-template-columns: auto 1fr;
grid-column-gap: 1em;
grid-row-gap: 1ex;
}
.optiongroups > div,
.optiongroups > div > label {
display: flex;
align-items: center;
}
.optiongroups input {
margin-left: 1em;
margin-right: 0.7ex;
}
hr {
width: 100%;
}

View File

@ -107,7 +107,7 @@ body > * {
padding: 0; padding: 0;
padding-left: calc(2em + 32px); padding-left: calc(2em + 32px);
color: black; color: black;
background: url(icon32.png) 1em 0/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon32.png) 1em 0/32px 32px no-repeat, var(--tile-url) repeat-x, var(--toolbar-bg-color);
font: caption; font: caption;
font-size: 150%; font-size: 150%;
font-weight: bold; font-weight: bold;
@ -117,7 +117,7 @@ body > * {
} }
@media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 124.8dpi) { @media (-webkit-min-device-pixel-ratio: 1.3), (min-resolution: 124.8dpi) {
#tabs { #tabs {
background: url(icon64.png) 1em 50%/32px 32px no-repeat, url(tile.png) repeat-x, var(--toolbar-bg-color); background: url(icon64.png) 1em 50%/32px 32px no-repeat, var(--tile-url) repeat-x, var(--toolbar-bg-color);
} }
} }
@ -145,27 +145,27 @@ body > * {
-webkit-user-select: none; -webkit-user-select: none;
user-select: none; user-select: none;
background: var(--toolbar-bg-color); background: var(--toolbar-bg-color);
color: white; color: var(--general-color);
min-width: 10em; min-width: 10em;
padding: 1ex; padding: 1ex;
padding-left: 1em; padding-left: 1em;
cursor: pointer; cursor: pointer;
border: 0; border: 0;
border-top: var(--toolbar-border-width) solid transparent; border-top: var(--toolbar-border-width) solid transparent;
border-left: 1px solid rgba(255,255,255,0.3); border-left: var(--toolbar-border);
border-right: 1px solid rgba(255,255,255,0.3); border-right: var(--toolbar-border);
transition: border 1s; transition: border 1s;
} }
.tab:not(.active):not(.disabled):hover { .tab:not(.active):not(.disabled):hover {
border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color); border-top: var(--toolbar-border-width) solid var(--toolbar-hover-border-color);
color: rgb(255, 226, 167); color: var(--general-color);
background: var(--toolbar-hover-background); background: var(--toolbar-hover-background);
} }
.tab.active { .tab.active {
color: black; color: var(--general-color);
background: white; background: var(--table-head-bgcolor);
border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color); border-top: var(--toolbar-border-width) solid var(--toolbar-active-border-color);
border-left: 1px solid transparent; border-left: 1px solid transparent;
border-right: 1px solid transparent; border-right: 1px solid transparent;

BIN
style/tile-dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

10
tests/.editorconfig Normal file
View File

@ -0,0 +1,10 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
tab_width = 2
trim_trailing_whitespace = true

View File

@ -113,4 +113,29 @@ describe("BatchGenerator", function() {
expect(items[0]).to.equal(gen.preview); expect(items[0]).to.equal(gen.preview);
expect(gen.hasInvalid).to.be.true; expect(gen.hasInvalid).to.be.true;
}); });
it("characters", function() {
const gen = new BatchGenerator("abc[a:c].lol[1].b");
const items = Array.from(gen);
expect(items).to.deep.equal([
"abca.lol[1].b",
"abcb.lol[1].b",
"abcc.lol[1].b",
]);
expect(items.length).to.equal(gen.length);
expect(items[0]).to.equal(gen.preview);
});
it("characters two", function() {
const gen = new BatchGenerator("abc[D:G].lol[1].b");
const items = Array.from(gen);
expect(items).to.deep.equal([
"abcD.lol[1].b",
"abcE.lol[1].b",
"abcF.lol[1].b",
"abcG.lol[1].b",
]);
expect(items.length).to.equal(gen.length);
expect(items[0]).to.equal(gen.preview);
});
}); });

43
tests/test_urld.js Normal file
View File

@ -0,0 +1,43 @@
/* eslint-env node */
/* eslint-disable @typescript-eslint/no-var-requires */
"use strict";
// License: CC0 1.0
require("../lib/util");
describe("URLd", function() {
it("basic domain", function() {
let u = new URL("https://www.google.de");
expect(u.domain).to.equal("google.de");
u = new URL("https://www.google.de:8443");
expect(u.domain).to.equal("google.de");
});
it("plain basic domain", function() {
const u = new URL("https://google.de");
expect(u.domain).to.equal("google.de");
});
it("special domain", function() {
let u = new URL("https://www.google.co.uk");
expect(u.domain).to.equal("google.co.uk");
u = new URL("https://google.co.uk");
expect(u.domain).to.equal("google.co.uk");
u = new URL("https://www.google.co.uk:8443");
expect(u.domain).to.equal("google.co.uk");
});
it("ipv4", function() {
let u = new URL("https://127.0.0.1:8443");
expect(u.domain).to.equal("127.0.0.1");
u = new URL("https://0.0.0.0:8443");
expect(u.domain).to.equal("0.0.0.0");
});
it("ipv6", function() {
let u = new URL("https://[::1]:8443");
expect(u.domain).to.equal("[::1]");
u = new URL("https://[2a00:1450:4005:800::2003]:8443");
expect(u.domain).to.equal("[2a00:1450:4005:800::2003]");
});
});

View File

@ -27,7 +27,7 @@ LICENSED = set((".css", ".html", ".js", "*.ts"))
IGNORED = set((".DS_Store", "Thumbs.db")) IGNORED = set((".DS_Store", "Thumbs.db"))
PERM_IGNORED_FX = set(("downloads.shelf", "webRequest", "webRequestBlocking")) PERM_IGNORED_FX = set(("downloads.shelf", "webRequest", "webRequestBlocking"))
PERM_IGNORED_CHROME = set(("menus", "sessions")) PERM_IGNORED_CHROME = set(("menus", "sessions", "theme"))
SCRIPTS = [ SCRIPTS = [
"yarn build:regexps", "yarn build:regexps",

View File

@ -8,6 +8,8 @@ import PORT from "./manager/port";
import { runtime } from "../lib/browser"; import { runtime } from "../lib/browser";
import { Promised } from "../lib/util"; import { Promised } from "../lib/util";
import { PromiseSerializer } from "../lib/pserializer"; import { PromiseSerializer } from "../lib/pserializer";
import { Keys } from "./keys";
import "./theme";
const $ = document.querySelector.bind(document); const $ = document.querySelector.bind(document);
@ -120,6 +122,11 @@ addEventListener("DOMContentLoaded", function dom() {
statusNetwork.setAttribute("title", _("statusNetwork-inactive.title")); statusNetwork.setAttribute("title", _("statusNetwork-inactive.title"));
} }
}); });
Keys.on("ACCEL-KeyF", () => {
$("#filter").focus();
return true;
});
}); });
addEventListener("contextmenu", event => { addEventListener("contextmenu", event => {

View File

@ -1,4 +1,6 @@
<!doctype html> <!doctype html>
<html id="popup">
<head> <head>
<!-- License: GPL-v2 --> <!-- License: GPL-v2 -->
<meta charset="utf-8"> <meta charset="utf-8">
@ -11,6 +13,8 @@
height: auto !important; height: auto !important;
-webkit-user-select: none; -webkit-user-select: none;
user-select: none; user-select: none;
margin: 0;
padding: 0;
} }
ul { ul {
@ -106,3 +110,5 @@
</li> </li>
</ul> </ul>
</body> </body>
</html>

View File

@ -2,6 +2,7 @@
// License: MIT // License: MIT
import { localize } from "../lib/i18n"; import { localize } from "../lib/i18n";
import "./theme";
declare let browser: any; declare let browser: any;
declare let chrome: any; declare let chrome: any;

View File

@ -43,13 +43,21 @@
<article id="tab-general" class="tab"> <article id="tab-general" class="tab">
<fieldset> <fieldset>
<legend data-i18n="pref.ui">UI</legend> <legend data-i18n="pref.ui">UI</legend>
<div id="pref-button-type"> <div class="optiongroups">
<label data-i18n="pref-button-type"></label> <label data-i18n="pref-button-type"></label>
<div id="pref-button-type">
<label><input type="radio" name="pref-button-type" value="popup"> <span data-i18n="pref-button-type-popup"></span></label> <label><input type="radio" name="pref-button-type" value="popup"> <span data-i18n="pref-button-type-popup"></span></label>
<label><input type="radio" name="pref-button-type" value="dta"> <span data-i18n="pref-button-type-dta"></span></label> <label><input type="radio" name="pref-button-type" value="dta"> <span data-i18n="pref-button-type-dta"></span></label>
<label><input type="radio" name="pref-button-type" value="turbo"> <span data-i18n="pref-button-type-turbo"></span></label> <label><input type="radio" name="pref-button-type" value="turbo"> <span data-i18n="pref-button-type-turbo"></span></label>
<label><input type="radio" name="pref-button-type" value="manager"> <span data-i18n="pref-button-type-manager"></span></label> <label><input type="radio" name="pref-button-type" value="manager"> <span data-i18n="pref-button-type-manager"></span></label>
</div> </div>
<label data-i18n="pref-theme"></label>
<div id="pref-theme">
<label><input type="radio" name="pref-theme" value="default"> <span data-i18n="pref-theme-default"></span></label>
<label><input type="radio" name="pref-theme" value="light"> <span data-i18n="pref-theme-light"></span></label>
<label><input type="radio" name="pref-theme" value="dark"> <span data-i18n="pref-theme-dark"></span></label>
</div>
</div>
<hr> <hr>
<label><input type="checkbox" id="pref-manager-in-popup"> <span data-i18n="pref-manager-in-popup"></span></label> <label><input type="checkbox" id="pref-manager-in-popup"> <span data-i18n="pref-manager-in-popup"></span></label>
<label><input type="checkbox" id="pref-finish-notification"> <span data-i18n="pref-finish-notification"></span></label> <label><input type="checkbox" id="pref-finish-notification"> <span data-i18n="pref-finish-notification"></span></label>
@ -81,7 +89,8 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Translations</legend> <legend>Translations</legend>
<label>Language: <label>
<span>Language:</span>
<select id="languages"> <select id="languages">
<option value="default">Browser default</option> <option value="default">Browser default</option>
</select> </select>
@ -123,14 +132,16 @@
</article> </article>
<article id="tab-network" class="tab"> <article id="tab-network" class="tab">
<fieldset id="network-general"> <fieldset>
<legend data-i18n="pref.netglobal"></legend> <legend data-i18n="pref.netglobal"></legend>
<div id="network-general">
<label data-i18n="pref-concurrent-downloads">Concurrent downloads</label> <label data-i18n="pref-concurrent-downloads">Concurrent downloads</label>
<input id="pref-concurrent-downloads" type="number" min="1" max="10"> <input id="pref-concurrent-downloads" type="number" min="1" max="10">
<label data-i18n="pref-retries"></label> <label data-i18n="pref-retries"></label>
<input id="pref-retries" type="number" min="0" max="100"> <input id="pref-retries" type="number" min="0" max="100">
<label data-i18n="pref-retry-time"></label> <label data-i18n="pref-retry-time"></label>
<input id="pref-retry-time" type="number" min="1" max="600"> <input id="pref-retry-time" type="number" min="1" max="600">
</div>
</fieldset> </fieldset>
<table id="limits" data-singleselect="true"> <table id="limits" data-singleselect="true">
<tr> <tr>

View File

@ -20,6 +20,7 @@ import { VirtualTable } from "../uikit/lib/table";
import { Icons } from "./icons"; import { Icons } from "./icons";
import { $ } from "./winutil"; import { $ } from "./winutil";
import { runtime, storage } from "../lib/browser"; import { runtime, storage } from "../lib/browser";
import "./theme";
const ICON_BASE_SIZE = 16; const ICON_BASE_SIZE = 16;
@ -566,6 +567,7 @@ addEventListener("DOMContentLoaded", async () => {
new BoolPref("pref-show-urls", "show-urls"); new BoolPref("pref-show-urls", "show-urls");
new BoolPref("pref-remove-missing-on-init", "remove-missing-on-init"); new BoolPref("pref-remove-missing-on-init", "remove-missing-on-init");
new OptionPref("pref-button-type", "button-type"); new OptionPref("pref-button-type", "button-type");
new OptionPref("pref-theme", "theme");
new OptionPref("pref-conflict-action", "conflict-action"); new OptionPref("pref-conflict-action", "conflict-action");
$("#reset-confirmations").addEventListener("click", async () => { $("#reset-confirmations").addEventListener("click", async () => {

View File

@ -25,6 +25,7 @@ import { ItemDelta } from "../lib/select";
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { TableConfig } from "../uikit/lib/config"; import { TableConfig } from "../uikit/lib/config";
import { validateSubFolder as validateSubfolder } from "../lib/util"; import { validateSubFolder as validateSubfolder } from "../lib/util";
import "./theme";
const PORT: RawPort = runtime.connect(null, { name: "select" }); const PORT: RawPort = runtime.connect(null, { name: "select" });

View File

@ -15,6 +15,7 @@ import { hookButton } from "../lib/manager/renamer";
import { runtime } from "../lib/browser"; import { runtime } from "../lib/browser";
import { $ } from "./winutil"; import { $ } from "./winutil";
import { validateSubFolder } from "../lib/util"; import { validateSubFolder } from "../lib/util";
import "./theme";
const PORT = runtime.connect(null, { name: "single" }); const PORT = runtime.connect(null, { name: "single" });

112
windows/theme.ts Normal file
View File

@ -0,0 +1,112 @@
/* eslint-disable no-magic-numbers */
"use strict";
// License: MIT
import { PrefWatcher } from "../lib/prefs";
import { theme } from "../lib/browser";
import { memoize } from "../lib/memoize";
const resolveColor = memoize(function(color) {
try {
const el = document.createElement("div");
el.style.backgroundColor = color;
el.style.display = "none";
document.body.appendChild(el);
try {
const resolved = window.getComputedStyle(el, null).backgroundColor;
return resolved;
}
finally {
document.body.removeChild(el);
}
}
catch {
return undefined;
}
}, 10, 1);
export const THEME = new class Theme extends PrefWatcher {
public systemDark: boolean;
public themeDark?: boolean;
constructor() {
super("theme", "default");
if (theme && theme.onUpdated) {
theme.onUpdated.addListener(this.onThemeUpdated.bind(this));
theme.getCurrent().then((theme: any) => this.onThemeUpdated({theme}));
}
this.themeDark = undefined;
const query = window.matchMedia("(prefers-color-scheme: dark)");
this.systemDark = query.matches;
query.addListener(e => {
this.systemDark = e.matches;
this.recalculate();
});
this.recalculate();
}
get dark() {
if (this.value === "dark") {
return true;
}
if (this.value === "light") {
return false;
}
if (typeof this.themeDark === "undefined") {
return this.systemDark;
}
return this.themeDark;
}
changed(prefs: any, key: string, value: any) {
const rv = super.changed(prefs, key, value);
this.recalculate();
return rv;
}
onThemeUpdated({theme}: {theme: any}) {
try {
if (!theme) {
this.themeDark = undefined;
return;
}
const {colors} = theme;
if (!colors) {
this.themeDark = undefined;
return;
}
const color = resolveColor(
colors.toolbar || colors.popup || colors.ntp_background);
if (!color) {
this.themeDark = undefined;
return;
}
const pieces = color.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/);
if (!pieces) {
this.themeDark = undefined;
return;
}
const r = parseInt(pieces[1], 10);
const g = parseInt(pieces[2], 10);
const b = parseInt(pieces[3], 10);
// HSP (Highly Sensitive Poo) equation from
// http://alienryderflex.com/hsp.html
const hsp = Math.sqrt(
0.299 * (r * r) +
0.587 * (g * g) +
0.114 * (b * b)
);
this.themeDark = hsp < 128;
}
finally {
this.recalculate();
}
}
recalculate() {
document.documentElement.classList[this.dark ? "add" : "remove"]("dark");
}
}();

250
yarn.lock
View File

@ -36,10 +36,10 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
"@types/node@^12.7.2": "@types/node@^12.7.8":
version "12.7.2" version "12.7.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.2.tgz#c4e63af5e8823ce9cc3f0b34f7b998c2171f0c44" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708"
integrity sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg== integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==
"@types/psl@^1.1.0": "@types/psl@^1.1.0":
version "1.1.0" version "1.1.0"
@ -51,43 +51,45 @@
resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f981bbdf1813a75820a6ec3a7fdfa0d452552cc7" resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f981bbdf1813a75820a6ec3a7fdfa0d452552cc7"
integrity sha512-bJ/bZ+pA69lm+Ll8JJRoAD9saH7unIMfxPQQpl7bxa00qNqvUXSyk3xvoRMea1uCpAOxweI7CzjWx48ysX6yug== integrity sha512-bJ/bZ+pA69lm+Ll8JJRoAD9saH7unIMfxPQQpl7bxa00qNqvUXSyk3xvoRMea1uCpAOxweI7CzjWx48ysX6yug==
"@typescript-eslint/eslint-plugin@^2.0.0": "@typescript-eslint/eslint-plugin@^2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz#609a5d7b00ce21a6f94d7ef282eba9da57ca1e42" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.3.2.tgz#7e112ca0bb29044d915baf10163a8199a20f7c69"
integrity sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA== integrity sha512-tcnpksq1bXzcIRbYLeXkgp6l+ggEMXXUcl1wsSvL807fRtmvVQKygElwEUf4hBA76dNag3VAK1q2m3vd7qJaZA==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "2.0.0" "@typescript-eslint/experimental-utils" "2.3.2"
eslint-utils "^1.4.0" eslint-utils "^1.4.2"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
regexpp "^2.0.1" regexpp "^2.0.1"
tsutils "^3.14.0" tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.0.0": "@typescript-eslint/experimental-utils@2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz#f3d298bb411357f35c4184e24280b256b6321949" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.2.tgz#e50f31264507e6fec7b33840bb6af260c24f4ea8"
integrity sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg== integrity sha512-t+JGdTT6dRbmvKDlhlVkEueoZa0fhJNfG6z2cpnRPLwm3VwYr2BjR//acJGC1Yza0I9ZNcDfRY7ubQEvvfG6Jg==
dependencies: dependencies:
"@types/json-schema" "^7.0.3" "@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.0.0" "@typescript-eslint/typescript-estree" "2.3.2"
eslint-scope "^4.0.0" eslint-scope "^5.0.0"
"@typescript-eslint/parser@^2.0.0": "@typescript-eslint/parser@^2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.0.0.tgz#4273bb19d03489daf8372cdaccbc8042e098178f" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.3.2.tgz#e9b742e191cd1209930da469cde379591ad0af5b"
integrity sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA== integrity sha512-nq1UQeNGdKdqdgF6Ww+Ov2OidWgiL96+JYdXXZ2rkP/OWyc6KMNSbs6MpRCpI8q+PmDa7hBnHNQIo7w/drYccA==
dependencies: dependencies:
"@types/eslint-visitor-keys" "^1.0.0" "@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.0.0" "@typescript-eslint/experimental-utils" "2.3.2"
"@typescript-eslint/typescript-estree" "2.0.0" "@typescript-eslint/typescript-estree" "2.3.2"
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.0.0": "@typescript-eslint/typescript-estree@2.3.2":
version "2.0.0" version "2.3.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz#c9f6c0efd1b11475540d6a55dc973cc5b9a67e77" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.2.tgz#107414aa04e689fe6f7251eb63fb500217f2b7f4"
integrity sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w== integrity sha512-eZNEAai16nwyhIVIEaWQlaUgAU3S9CkQ58qvK0+3IuSdLJD3W1PNuehQFMIhW/mTP1oFR9GNoTcLg7gtXz6lzA==
dependencies: dependencies:
glob "^7.1.4"
is-glob "^4.0.1"
lodash.unescape "4.0.1" lodash.unescape "4.0.1"
semver "^6.2.0" semver "^6.3.0"
"@webassemblyjs/ast@1.8.5": "@webassemblyjs/ast@1.8.5":
version "1.8.5" version "1.8.5"
@ -717,15 +719,6 @@ cli-width@^2.0.0:
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
cliui@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
dependencies:
string-width "^2.1.1"
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
cliui@^5.0.0: cliui@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@ -1116,7 +1109,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
eslint-scope@^4.0.0, eslint-scope@^4.0.3: eslint-scope@^4.0.3:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@ -1132,7 +1125,7 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0" esrecurse "^4.1.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-utils@^1.4.0, eslint-utils@^1.4.2: eslint-utils@^1.4.2:
version "1.4.2" version "1.4.2"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
@ -1144,10 +1137,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.2.2: eslint@^6.5.1:
version "6.2.2" version "6.5.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.2.2.tgz#03298280e7750d81fcd31431f3d333e43d93f24f" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6"
integrity sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw== integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "^7.0.0"
ajv "^6.10.0" ajv "^6.10.0"
@ -1489,11 +1482,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1" strip-ansi "^3.0.1"
wide-align "^1.1.0" wide-align "^1.1.0"
get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
get-caller-file@^2.0.1: get-caller-file@^2.0.1:
version "2.0.5" version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
@ -2105,7 +2093,7 @@ lodash.unescape@4.0.1:
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14: lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15:
version "4.17.15" version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -2305,10 +2293,10 @@ mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies: dependencies:
minimist "0.0.8" minimist "0.0.8"
mocha@^6.2.0: mocha@^6.2.1:
version "6.2.0" version "6.2.1"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.1.tgz#da941c99437da9bac412097859ff99543969f94c"
integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== integrity sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==
dependencies: dependencies:
ansi-colors "3.2.3" ansi-colors "3.2.3"
browser-stdout "1.3.1" browser-stdout "1.3.1"
@ -2330,9 +2318,9 @@ mocha@^6.2.0:
supports-color "6.0.0" supports-color "6.0.0"
which "1.3.1" which "1.3.1"
wide-align "1.1.3" wide-align "1.1.3"
yargs "13.2.2" yargs "13.3.0"
yargs-parser "13.0.0" yargs-parser "13.1.1"
yargs-unparser "1.5.0" yargs-unparser "1.6.0"
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
@ -2607,7 +2595,7 @@ os-homedir@^1.0.0:
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^3.0.0, os-locale@^3.1.0: os-locale@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
@ -2799,10 +2787,10 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
psl@^1.3.0: psl@^1.4.0:
version "1.3.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2"
integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==
public-encrypt@^4.0.0: public-encrypt@^4.0.0:
version "4.0.3" version "4.0.3"
@ -2951,11 +2939,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
require-main-filename@^2.0.0: require-main-filename@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@ -3088,7 +3071,7 @@ semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: semver@^6.0.0, semver@^6.1.2, semver@^6.3.0:
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -3289,7 +3272,7 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0" is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: "string-width@^1.0.2 || 2", string-width@^2.1.0:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@ -3498,10 +3481,10 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2" regex-not "^1.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
ts-loader@^6.0.4: ts-loader@^6.2.0:
version "6.0.4" version "6.2.0"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.0.tgz#52d3993ecbc5474c1513242388e1049da0fce880"
integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== integrity sha512-Da8h3fD+HiZ9GvZJydqzk3mTC9nuOKYlJcpuk+Zv6Y1DPaMvBL+56GRzZFypx2cWrZFMsQr869+Ua2slGoLxvQ==
dependencies: dependencies:
chalk "^2.3.0" chalk "^2.3.0"
enhanced-resolve "^4.0.0" enhanced-resolve "^4.0.0"
@ -3509,10 +3492,10 @@ ts-loader@^6.0.4:
micromatch "^4.0.0" micromatch "^4.0.0"
semver "^6.0.0" semver "^6.0.0"
ts-node@^8.3.0: ts-node@^8.4.1:
version "8.3.0" version "8.4.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.4.1.tgz#270b0dba16e8723c9fa4f9b4775d3810fd994b4f"
integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== integrity sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==
dependencies: dependencies:
arg "^4.1.0" arg "^4.1.0"
diff "^4.0.1" diff "^4.0.1"
@ -3525,7 +3508,7 @@ tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
tsutils@^3.14.0: tsutils@^3.17.1:
version "3.17.1" version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
@ -3554,10 +3537,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^3.5.3: typescript@^3.6.3:
version "3.5.3" version "3.6.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da"
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==
union-value@^1.0.0: union-value@^1.0.0:
version "1.0.1" version "1.0.1"
@ -3664,15 +3647,15 @@ watchpack@^1.6.0:
graceful-fs "^4.1.2" graceful-fs "^4.1.2"
neo-async "^2.5.0" neo-async "^2.5.0"
webextension-polyfill@^0.4.0: webextension-polyfill@^0.5.0:
version "0.4.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz#9cc5a60f0f2bf907a6b349fdd7e61701f54956f9" resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.5.0.tgz#795e0bf6a2b8eadcdb6edaecd169e9228c747519"
integrity sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag== integrity sha512-aFrl38x43t1bTboX/paCT8I97+idzX/TY0+fuM52hrIkCpYfROEF9kSn0BXuEIi3J9LTYt2ZZKkhx9NB1qF3nA==
webpack-cli@^3.3.7: webpack-cli@^3.3.9:
version "3.3.7" version "3.3.9"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.7.tgz#77c8580dd8e92f69d635e0238eaf9d9c15759a91" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a"
integrity sha512-OhTUCttAsr+IZSMVwGROGRHvT+QAs8H6/mHIl4SvhAwYywjiylYjpwybGx7WQ9Hkb45FhjtsymkwiRRbGJ1SZQ== integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==
dependencies: dependencies:
chalk "2.4.2" chalk "2.4.2"
cross-spawn "6.0.5" cross-spawn "6.0.5"
@ -3694,10 +3677,10 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1:
source-list-map "^2.0.0" source-list-map "^2.0.0"
source-map "~0.6.1" source-map "~0.6.1"
webpack@^4.39.3: webpack@^4.41.0:
version "4.39.3" version "4.41.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.3.tgz#a02179d1032156b713b6ec2da7e0df9d037def50" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.0.tgz#db6a254bde671769f7c14e90a1a55e73602fc70b"
integrity sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ== integrity sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==
dependencies: dependencies:
"@webassemblyjs/ast" "1.8.5" "@webassemblyjs/ast" "1.8.5"
"@webassemblyjs/helper-module-context" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5"
@ -3759,14 +3742,6 @@ worker-farm@^1.7.0:
dependencies: dependencies:
errno "~0.1.7" errno "~0.1.7"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
dependencies:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi@^5.1.0: wrap-ansi@^5.1.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@ -3800,7 +3775,7 @@ xtend@^4.0.0, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: y18n@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
@ -3810,23 +3785,7 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
yargs-parser@13.0.0: yargs-parser@13.1.1, yargs-parser@^13.1.0, yargs-parser@^13.1.1:
version "13.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b"
integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.0.0, yargs-parser@^13.1.0:
version "13.1.1" version "13.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
@ -3834,31 +3793,14 @@ yargs-parser@^13.0.0, yargs-parser@^13.1.0:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs-unparser@1.5.0: yargs-unparser@1.6.0:
version "1.5.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
dependencies: dependencies:
flat "^4.1.0" flat "^4.1.0"
lodash "^4.17.11" lodash "^4.17.15"
yargs "^12.0.5" yargs "^13.3.0"
yargs@13.2.2:
version "13.2.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993"
integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==
dependencies:
cliui "^4.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
os-locale "^3.1.0"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.0.0"
yargs@13.2.4: yargs@13.2.4:
version "13.2.4" version "13.2.4"
@ -3877,23 +3819,21 @@ yargs@13.2.4:
y18n "^4.0.0" y18n "^4.0.0"
yargs-parser "^13.1.0" yargs-parser "^13.1.0"
yargs@^12.0.5: yargs@13.3.0, yargs@^13.3.0:
version "12.0.5" version "13.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
dependencies: dependencies:
cliui "^4.0.0" cliui "^5.0.0"
decamelize "^1.2.0"
find-up "^3.0.0" find-up "^3.0.0"
get-caller-file "^1.0.1" get-caller-file "^2.0.1"
os-locale "^3.0.0"
require-directory "^2.1.1" require-directory "^2.1.1"
require-main-filename "^1.0.1" require-main-filename "^2.0.0"
set-blocking "^2.0.0" set-blocking "^2.0.0"
string-width "^2.0.0" string-width "^3.0.0"
which-module "^2.0.0" which-module "^2.0.0"
y18n "^3.2.1 || ^4.0.0" y18n "^4.0.0"
yargs-parser "^11.1.1" yargs-parser "^13.1.1"
yn@^3.0.0: yn@^3.0.0:
version "3.1.1" version "3.1.1"