From bd5066a9ae62bec1238106ee4fcc4cbc7164d808 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 4 Mar 2022 16:49:37 +0000 Subject: Translated using Weblate (German) Currently translated at 100.0% (248 of 248 strings) Translation: GNU Taler/Main web site Translate-URL: http://weblate.taler.net/projects/gnu-taler/main-web-site/de/ --- locale/de/LC_MESSAGES/messages.po | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po index c56a2629..5bc446c3 100644 --- a/locale/de/LC_MESSAGES/messages.po +++ b/locale/de/LC_MESSAGES/messages.po @@ -3,10 +3,10 @@ msgstr "" "Project-Id-Version: German (Taler Website)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-02-24 18:55+0100\n" -"PO-Revision-Date: 2022-02-22 10:48+0000\n" +"PO-Revision-Date: 2022-03-04 16:49+0000\n" "Last-Translator: Stefan \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -318,7 +318,7 @@ msgstr "Hier auch als PDF." #: template/docs.html.j2:59 msgid "Exchange" -msgstr "Taler-Exchange" +msgstr "Exchange" #: template/docs.html.j2:61 msgid "Operator's manual for the GNU Taler exchange." @@ -1453,9 +1453,7 @@ msgstr "Keine neue Währung!" #: template/index.html.j2:37 msgid "Empowers communities to run their own payment infrastructure" -msgstr "" -"Ermöglicht Gemeinschaften die Entwicklung einer selbstbestimmten " -"Zahlungsinfrastruktur" +msgstr "Ermöglicht die Entwicklung einer selbstbestimmten Zahlungsinfrastruktur" #: template/index.html.j2:41 msgid "Free Software" -- cgit v1.2.3 From 172a3a975b0222953560233b38eb8b4e50287570 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 4 Mar 2022 16:56:18 +0000 Subject: Translated using Weblate (Arabic) Currently translated at 93.1% (231 of 248 strings) Translation: GNU Taler/Main web site Translate-URL: http://weblate.taler.net/projects/gnu-taler/main-web-site/ar/ --- locale/ar/LC_MESSAGES/messages.po | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/locale/ar/LC_MESSAGES/messages.po b/locale/ar/LC_MESSAGES/messages.po index a94c78bc..d174f42b 100644 --- a/locale/ar/LC_MESSAGES/messages.po +++ b/locale/ar/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-02-24 18:55+0100\n" -"PO-Revision-Date: 2022-02-25 00:55+0000\n" +"PO-Revision-Date: 2022-03-04 17:02+0000\n" "Last-Translator: Stefan \n" "Language-Team: Arabic \n" @@ -212,15 +212,12 @@ msgid "Executive team" msgstr "الفريق التنفيذي" #: template/contact.html.j2:77 -#, fuzzy -#| msgid "" -#| "For non-technical commercial requests, please contact ceo AT taler." -#| "net." msgid "" "For non-technical commercial requests, please contact ceo AT taler-" "systems.com." msgstr "" -"للطلبات غير الفنية الخاصة بالأعمال ، يرجى مراسلة CEO AT taler.net ." +"للطلبات غير الفنية الخاصة بالأعمال ، يرجى مراسلة CEO AT taler-systems." +"com ." #: template/copyright.html.j2:6 msgid "Copyright Assignment" @@ -404,10 +401,8 @@ msgid "IRC" msgstr "بروتوكول الدردشة عبر الإنترنت" #: template/docs.html.j2:186 -#, fuzzy -#| msgid "Our IRC channel is #taler on freenode." msgid "Our IRC channel is #taler on Libera." -msgstr "قناتنا للدردشة عبر الإنترنت هي taler# وموجودة في موقع freenode." +msgstr "قناتنا للدردشة عبر الإنترنت هي taler# وموجودة في موقع Libera." #: template/docs.html.j2:192 msgid "Bug Tracker" @@ -1639,13 +1634,9 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "ستُفر محافظ للمتصفحات الأخرى في المستقبل القريب." #: template/news/index.html.j2:11 -#, fuzzy -#| msgid "" -#| "News posts about changes related to GNU Taler such as releases and events" msgid "News posts about changes related to GNUnet such as releases and events" msgstr "" -"منشورات إخبارية عن التغييرات المتعلقة بنظام GNU Taler مثل الإصدارات " -"والفعاليات" +"منشورات إخبارية عن التغييرات المتعلقة بنظام GNUnet مثل الإصدارات والفعاليات" #: template/news/index.html.j2:16 msgid "subscribe to our RSS feed" -- cgit v1.2.3 From 4e2878c2c8c7264c571ecc46949980b4e104f8ba Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Wed, 9 Mar 2022 21:42:38 +0100 Subject: Language switcher: Türk --> Türkce, Navbar: Company link without language differentiation, Index: Open new browser tabs when clicking on tiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Kügel --- common/navigation.j2.inc | 4 ++-- template/index.html.j2 | 6 +++--- www.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/navigation.j2.inc b/common/navigation.j2.inc index 8114f855..85a3bbe4 100644 --- a/common/navigation.j2.inc +++ b/common/navigation.j2.inc @@ -24,7 +24,7 @@ {{ navlink('principles.html', _('Principles')) }} {{ navlink('docs.html', _('Docs')) }} {{ navlink('news/index.html', _('News')) }} - {{ _('Company') }} + {{ _('Company') }}
diff --git a/www.yml b/www.yml index 70efe552..5bb713b1 100644 --- a/www.yml +++ b/www.yml @@ -25,7 +25,7 @@ langs_full: ru: Ру́сский язы́к es: Español sv: Svenska - tr: Türk + tr: Türkçe meetingnotes: newsposts: - page: 2022-03.html -- cgit v1.2.3 From 7e79b5a40a2dee106f71ad63a5866c157baaf351 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 10 Mar 2022 00:07:12 +0100 Subject: publish --- www.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www.yml b/www.yml index 5bb713b1..a374d742 100644 --- a/www.yml +++ b/www.yml @@ -29,7 +29,7 @@ langs_full: meetingnotes: newsposts: - page: 2022-03.html - date: 2022-03-12 + date: 2022-03-11 title: "Central Bank Accounts are Dangerous and Unnecessary: A critique of two papers" - page: 2022-02.html date: 2022-02-21 -- cgit v1.2.3 From d2ef641955ef6d4b80e1fa20523dec53b782b409 Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Thu, 10 Mar 2022 18:00:43 +0000 Subject: Translated using Weblate (Turkish) Currently translated at 100.0% (248 of 248 strings) Translation: GNU Taler/Main web site Translate-URL: http://weblate.taler.net/projects/gnu-taler/main-web-site/tr/ --- locale/tr/LC_MESSAGES/messages.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/tr/LC_MESSAGES/messages.po b/locale/tr/LC_MESSAGES/messages.po index 94a79093..4fc13b2e 100644 --- a/locale/tr/LC_MESSAGES/messages.po +++ b/locale/tr/LC_MESSAGES/messages.po @@ -8,10 +8,10 @@ msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-02-24 18:55+0100\n" -"PO-Revision-Date: 2022-02-24 17:35+0000\n" -"Last-Translator: Alp \n" -"Language-Team: Turkish \n" +"PO-Revision-Date: 2022-03-10 18:04+0000\n" +"Last-Translator: Stefan Kügel \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -313,7 +313,7 @@ msgstr " PDF olarak da mevcuttur." #: template/docs.html.j2:59 msgid "Exchange" -msgstr "Alışveriş" +msgstr "Exchange" #: template/docs.html.j2:61 msgid "Operator's manual for the GNU Taler exchange." -- cgit v1.2.3 From b0bc83c3058066334c6341a023883e60762e1af4 Mon Sep 17 00:00:00 2001 From: MS Date: Fri, 11 Mar 2022 10:25:53 +0100 Subject: inc submodule --- inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc b/inc index 2b72c7f5..218f02cf 160000 --- a/inc +++ b/inc @@ -1 +1 @@ -Subproject commit 2b72c7f57d318271856f992eb2e58c133ae5179e +Subproject commit 218f02cfc0453a0d4cc067ba9256123a675040ce -- cgit v1.2.3 From f24fcd6c66147211f663c631aed1b0d7b4b24321 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 27 Mar 2022 04:15:31 +0200 Subject: create transparent version --- static/images/stock1.png | Bin 0 -> 224301 bytes static/images/stock1.xcf | Bin 0 -> 374521 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/images/stock1.png create mode 100644 static/images/stock1.xcf diff --git a/static/images/stock1.png b/static/images/stock1.png new file mode 100644 index 00000000..cf8d8afd Binary files /dev/null and b/static/images/stock1.png differ diff --git a/static/images/stock1.xcf b/static/images/stock1.xcf new file mode 100644 index 00000000..e0c72559 Binary files /dev/null and b/static/images/stock1.xcf differ -- cgit v1.2.3 From 59679c9b4e5941f3a86267bfc504204bc9b4995c Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Wed, 20 Apr 2022 08:24:09 +0200 Subject: Text updates: GNUnet-->GNU Taler on News page; enhanced answers on FAQ page for two questions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Kügel --- template/faq.html.j2 | 13 +++++-------- template/news/index.html.j2 | 5 +---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/template/faq.html.j2 b/template/faq.html.j2 index 7a5245c4..703ad12e 100644 --- a/template/faq.html.j2 +++ b/template/faq.html.j2 @@ -52,9 +52,7 @@

{{ _("What if my computer is hacked?") }}

{% trans %} - In case of a compromise of one of your devices, an attacker can - spend coins from your wallet. Checking your balance might reveal - to you that your device has been compromised. + In case of a compromise of one of your devices, an attacker can spend coins from your wallet. Checking your balance might reveal to you whether your device has eventually been compromised. If a coin has been spent, this coin cannot be spent a second time. The Exchange examines every coin whether it has been spent and thus makes double spending impossible. {% endtrans %}

@@ -150,11 +148,10 @@

{{ _("To whom would consumers complain to in case of non-conversion or non-compliance?") }}

{% trans %} - Any exchange should be audited by one or more independent auditors. Merchants and - consumer wallets will report certain issues automatically to the auditors, but auditors - may also provide a method for manual submission of issues. The auditors are expected - to make their reports available to the respective regulatory authorities, or even - the general public. + From a technical point of view, any exchange is audited by one or more independent auditors. Merchants and consumer wallets will report certain issues automatically to the auditors, but auditors may also provide a method for manual submission of issues. The auditors are expected to make their reports available to the respective regulatory authorities, or even the general public. +

+

+ From a legal point of view, users can always turn to their national authority responsible for settling disputes concerning the management of exchange services. For exchange services conducting business in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle des Bundes). In addition to this, the European Online Dispute Resolution (see ODR) as a platform provided by the European Commission can be called for the settlement of disputes concerning exchange services headquartered in member states of the European Union. {% endtrans %}

diff --git a/template/news/index.html.j2 b/template/news/index.html.j2 index 5c5cf284..f98468c5 100644 --- a/template/news/index.html.j2 +++ b/template/news/index.html.j2 @@ -8,10 +8,7 @@

{{ _("News") }}

- {% trans %} - News posts about changes related to - GNUnet such as releases and events - {% endtrans %} + {% trans %}News posts about changes related to GNU Taler such as releases and events{% endtrans %} – {{ _("subscribe to our RSS feed") }}

-- cgit v1.2.3 From ef290f4ee726cf007ab9ee65cd9afa706c0dec4d Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Wed, 20 Apr 2022 08:26:51 +0200 Subject: Updated strings in the messages.pot file for Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Kügel --- locale/messages.pot | 84 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/locale/messages.pot b/locale/messages.pot index 2363172c..9692ad3b 100644 --- a/locale/messages.pot +++ b/locale/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -446,46 +446,48 @@ msgstr "" #: template/faq.html.j2:54 msgid "" "In case of a compromise of one of your devices, an attacker can spend " -"coins from your wallet. Checking your balance might reveal to you that " -"your device has been compromised." +"coins from your wallet. Checking your balance might reveal to you whether" +" your device has eventually been compromised. If a coin has been spent, " +"this coin cannot be spent a second time. The Exchange examines every coin" +" whether it has been spent and thus makes double spending impossible." msgstr "" -#: template/faq.html.j2:61 +#: template/faq.html.j2:59 msgid "Can I send money to my friends with Taler?" msgstr "" -#: template/faq.html.j2:63 +#: template/faq.html.j2:61 msgid "" "If your friends provide goods or services for you in exchange for a " "payment, they can easily set up a Taler merchant and receive the payment " "in their bank account." msgstr "" -#: template/faq.html.j2:70 +#: template/faq.html.j2:68 msgid "" "Future versions of the Taler wallet may allow exchanging coins among " "friends directly as well." msgstr "" -#: template/faq.html.j2:76 +#: template/faq.html.j2:74 msgid "How does Taler handle payments in different currencies?" msgstr "" -#: template/faq.html.j2:78 +#: template/faq.html.j2:76 msgid "" "Taler wallets can store digital coins corresponding to multiple different" " currencies such as the Euro, US Dollars or Bitcoins." msgstr "" -#: template/faq.html.j2:84 +#: template/faq.html.j2:82 msgid "Taler currently does not offer conversion between currencies." msgstr "" -#: template/faq.html.j2:89 +#: template/faq.html.j2:87 msgid "How does Taler protect my privacy?" msgstr "" -#: template/faq.html.j2:91 +#: template/faq.html.j2:89 msgid "" "Your wallet stores digital coins that are blindly signed" @@ -494,11 +496,11 @@ msgid "" "customer." msgstr "" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or" @@ -511,11 +513,11 @@ msgid "" " requirements from the regulator and could thus easily be 10x higher." msgstr "" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently" " does not support conversion between currencies. However, in principle an" @@ -526,24 +528,24 @@ msgid "" "near future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros " "would have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank " "money in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, " "and that bank would hold the funds in escrow. Note that this bank could " @@ -553,27 +555,37 @@ msgid "" "conversion from Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically " -"to the auditors, but auditors may also provide a method for manual " -"submission of issues. The auditors are expected to make their reports " -"available to the respective regulatory authorities, or even the general " -"public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a " +"method for manual submission of issues. The auditors are expected to make" +" their reports available to the respective regulatory authorities, or " +"even the general public.

From a legal point of view, users can " +"always turn to their national authority responsible for settling disputes" +" concerning the management of exchange services. For exchange services " +"conducting business in Germany, this would be the general authority in " +"charge of disputes (Universalschlichtungsstelle des Bundes). In addition " +"to this, the European Online Dispute Resolution (see ODR) as a platform provided by the " +"European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the " +"European Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having" " developed working prototypes. We are also in discussions with several " @@ -584,11 +596,11 @@ msgid "" "issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis " @@ -1347,14 +1359,14 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "" #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "News posts about changes related to GNU Taler such as releases and events" msgstr "" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "" -- cgit v1.2.3 From 7ee699f178fea398e98966028888b6caa52b2ade Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Wed, 20 Apr 2022 08:33:40 +0200 Subject: Updating all language files for Weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Kügel --- locale/ar/LC_MESSAGES/messages.po | 116 +++++++++++++++++++----------- locale/cs/LC_MESSAGES/messages.po | 83 ++++++++++++--------- locale/de/LC_MESSAGES/messages.po | 127 ++++++++++++++++++++------------- locale/en/LC_MESSAGES/messages.po | 83 ++++++++++++--------- locale/es/LC_MESSAGES/messages.po | 114 ++++++++++++++++++----------- locale/fr/LC_MESSAGES/messages.po | 113 ++++++++++++++++++----------- locale/hi/LC_MESSAGES/messages.po | 88 ++++++++++++++--------- locale/hu/LC_MESSAGES/messages.po | 88 ++++++++++++++--------- locale/it/LC_MESSAGES/messages.po | 113 ++++++++++++++++++----------- locale/ja/LC_MESSAGES/messages.po | 108 ++++++++++++++++++---------- locale/ko/LC_MESSAGES/messages.po | 106 +++++++++++++++++---------- locale/pt/LC_MESSAGES/messages.po | 83 ++++++++++++--------- locale/pt_BR/LC_MESSAGES/messages.po | 106 ++++++++++++++++----------- locale/ru/LC_MESSAGES/messages.po | 110 +++++++++++++++++----------- locale/sv/LC_MESSAGES/messages.po | 110 +++++++++++++++++----------- locale/tr/LC_MESSAGES/messages.po | 116 +++++++++++++++++++----------- locale/zh_Hans/LC_MESSAGES/messages.po | 106 +++++++++++++++++---------- locale/zh_Hant/LC_MESSAGES/messages.po | 106 +++++++++++++++++---------- 18 files changed, 1166 insertions(+), 710 deletions(-) diff --git a/locale/ar/LC_MESSAGES/messages.po b/locale/ar/LC_MESSAGES/messages.po index d174f42b..449014da 100644 --- a/locale/ar/LC_MESSAGES/messages.po +++ b/locale/ar/LC_MESSAGES/messages.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-03-04 17:02+0000\n" "Last-Translator: Stefan \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -62,8 +62,8 @@ msgid "" "We are grateful for support and free hosting of this site by BFH." msgstr "" -"نحن ممتنون للدعم والاستضافة المجانية لهذا الموقع من جامعة برن للعلوم التطبيقية ." +"نحن ممتنون للدعم والاستضافة المجانية لهذا الموقع من جامعة برن للعلوم التطبيقية ." #: common/footer.j2.inc:35 #, fuzzy @@ -507,21 +507,28 @@ msgid "What if my computer is hacked?" msgstr "ماذا يحدث لو تعرض حاسوبي للقرصنة؟" #: template/faq.html.j2:54 +#, fuzzy +#| msgid "" +#| "In case of a compromise of one of your devices, an attacker can spend " +#| "coins from your wallet. Checking your balance might reveal to you that " +#| "your device has been compromised." msgid "" "In case of a compromise of one of your devices, an attacker can spend coins " -"from your wallet. Checking your balance might reveal to you that your device " -"has been compromised." +"from your wallet. Checking your balance might reveal to you whether your " +"device has eventually been compromised. If a coin has been spent, this coin " +"cannot be spent a second time. The Exchange examines every coin whether it " +"has been spent and thus makes double spending impossible." msgstr "" "في حالة اختراق أحد أجهزتك، فإنّ القرصان يمكن أن ينفق عملات معدنية من محفظتك. " "قد يكشف فحص رصيدك بأن جهاز قد تعرض للاختراق." -#: template/faq.html.j2:61 +#: template/faq.html.j2:59 #, fuzzy #| msgid "Can I send money to my friend with Taler?" msgid "Can I send money to my friends with Taler?" msgstr "هل يمكنني إرسال الأموال لصديقي عبر نظام Taler؟" -#: template/faq.html.j2:63 +#: template/faq.html.j2:61 #, fuzzy #| msgid "" #| "If your friend provides goods or services for you in exchange for a " @@ -535,7 +542,7 @@ msgstr "" "إذا قدم لك صديقك سلعًا أو خدمات مقابل مدفوعات، يمكنهم بسهولة فتح حساب تاجر في " "نظام Taler واستلام الدفع في حسابهم المصرفي." -#: template/faq.html.j2:70 +#: template/faq.html.j2:68 msgid "" "Future versions of the Taler wallet may allow exchanging coins among friends " "directly as well." @@ -543,11 +550,11 @@ msgstr "" "قد تتيح الإصدارات المستقبلية من محفظة Taler بتبادل العملات المعدنية بين " "الأصدقاء مباشرة أيضًا." -#: template/faq.html.j2:76 +#: template/faq.html.j2:74 msgid "How does Taler handle payments in different currencies?" msgstr "كيف يتعامل نظام Taler مع المدفوعات بعملات مختلفة؟" -#: template/faq.html.j2:78 +#: template/faq.html.j2:76 msgid "" "Taler wallets can store digital coins corresponding to multiple different " "currencies such as the Euro, US Dollars or Bitcoins." @@ -555,15 +562,15 @@ msgstr "" "يمكن لمحافظ Taler حفظ العملات الرقمية المقابلة لعدة عملات مختلفة مثل اليورو " "أو الدولار الأمريكي أو عملات البيتكوين." -#: template/faq.html.j2:84 +#: template/faq.html.j2:82 msgid "Taler currently does not offer conversion between currencies." msgstr "لا يمنح نظام Taler حاليًا التحويل بين العملات." -#: template/faq.html.j2:89 +#: template/faq.html.j2:87 msgid "How does Taler protect my privacy?" msgstr "كيف يحمي نظام Taler خصوصيتي؟" -#: template/faq.html.j2:91 +#: template/faq.html.j2:89 msgid "" "Your wallet stores digital coins that are blindly signed by an exchange. The use of a blind " @@ -575,11 +582,11 @@ msgstr "" "التوقيع المستتر خصوصيتك لأنه يمنع شركة الصرافة من معرفة العملة التي وقع " "عليها أي عميل." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "كم تكلّف هذه العملية؟" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -600,11 +607,11 @@ msgstr "" "يُرجى ملاحظة أنّ هذا تقدير مبكر ، فقد تعتمد التفاصيل على متطلبات الاستضافة " "والنسخ الاحتياطي من الجهة المنظمة، وبالتالي يمكن أن تزيد بسهولة عن 10 أضعاف." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "هل يتعامل نظام Taler بالمدفوعات الدولية؟" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -619,11 +626,11 @@ msgstr "" "ويسمح بعمليات السحب بعملة أخرى. ينصب تركيز نظام Taler على المدفوعات اليومية، " "لذلك ليس لدينا خطط لدعم تحويل العملات في المستقبل القريب." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "كيف يرتبط نظام Taler بتوجيهات الأموال الإلكترونية (الأوروبية)؟" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -632,7 +639,7 @@ msgstr "" "نعتقدُ بأن التوجيهات الأوروبية للأموال الإلكترونية يوفر جزءًا من الإطار " "التنظيمي الذي يجب أن شركة الصرافةلنظام الدفع Taler بالعملات المعدنية باليورو." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -640,7 +647,7 @@ msgstr "" "ما هو البنك الذي سيضمن التحويل بين عملات نظام الدفع Taler وأموال البنوك في " "الحسابات المصرفية العادية؟" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -655,30 +662,36 @@ msgstr "" "البنك للوائح المصرفية ذات الصلة التي تحدد سبب ثقة العملاء في التحويل من " "عملات نظام Taler إلى أموال بنكية عادية." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "إلى من سيشتكي العملاء في حالة عدم التحويل أو عدم الامتثال؟" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"يجب أن تخضع أي شركة صرافة للتدقيق من طرف مدقق حسابات مستقل واحد أو أكثر. " -"سيُبلغُ التجار ومَحافظ العملاء عن مشكلات معينة تلقائيًا إلى المدققين، ولكن قد " -"يوفر المدققون أيضًا طريقة لإرسال المشكلات يدويًا. يتوقع من المدققين إتاحة " -"تقاريرهم لهيئات الرقابة المختصة، أو حتى لعامة الناس." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "هل هناك أي مؤسسات تستخدم نظام Talerفعليًا؟" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -694,11 +707,11 @@ msgstr "" "\"https://gnunet.org/bugs/\">متعقب الأخطاءللحصول على قائمة المشاكل " "المفتوحة)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "هل يدعم نظام Taler الدفعات المتكررة؟" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1634,18 +1647,35 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "ستُفر محافظ للمتصفحات الأخرى في المستقبل القريب." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "منشورات إخبارية عن التغييرات المتعلقة بنظام GNUnet مثل الإصدارات والفعاليات" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "اشترك في نشرتنا الإخبارية RSS" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "اقرأ المزيد" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "يجب أن تخضع أي شركة صرافة للتدقيق من طرف مدقق حسابات مستقل واحد أو أكثر. " +#~ "سيُبلغُ التجار ومَحافظ العملاء عن مشكلات معينة تلقائيًا إلى المدققين، ولكن قد " +#~ "يوفر المدققون أيضًا طريقة لإرسال المشكلات يدويًا. يتوقع من المدققين إتاحة " +#~ "تقاريرهم لهيئات الرقابة المختصة، أو حتى لعامة الناس." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/cs/LC_MESSAGES/messages.po b/locale/cs/LC_MESSAGES/messages.po index e0322a6c..35f6ad5f 100644 --- a/locale/cs/LC_MESSAGES/messages.po +++ b/locale/cs/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-04-08 12:55+0000\n" "Last-Translator: Stefan Kügel \n" "Language-Team: Czech blindly signed by an exchange. The use of a blind " @@ -570,11 +572,11 @@ msgid "" "which coin it signed for which customer." msgstr "" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -587,11 +589,11 @@ msgid "" "regulator and could thus easily be 10x higher." msgstr "" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -602,24 +604,24 @@ msgid "" "future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " "have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -629,26 +631,36 @@ msgid "" "Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -658,11 +670,11 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1420,15 +1432,16 @@ msgstr "" #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Zprávy o změnách týkajících se GNU Taleru, jeho verze, setkání a události" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "Přihlaste se k našemu RSS kanálu" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "Číst dál" diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po index 5bc446c3..9ab7a700 100644 --- a/locale/de/LC_MESSAGES/messages.po +++ b/locale/de/LC_MESSAGES/messages.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: German (Taler Website)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-03-04 16:49+0000\n" "Last-Translator: Stefan \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -540,10 +540,17 @@ msgid "What if my computer is hacked?" msgstr "Was ist, wenn mein Computer gehackt wurde?" #: template/faq.html.j2:54 +#, fuzzy +#| msgid "" +#| "In case of a compromise of one of your devices, an attacker can spend " +#| "coins from your wallet. Checking your balance might reveal to you that " +#| "your device has been compromised." msgid "" "In case of a compromise of one of your devices, an attacker can spend coins " -"from your wallet. Checking your balance might reveal to you that your device " -"has been compromised." +"from your wallet. Checking your balance might reveal to you whether your " +"device has eventually been compromised. If a coin has been spent, this coin " +"cannot be spent a second time. The Exchange examines every coin whether it " +"has been spent and thus makes double spending impossible." msgstr "" "Im Fall eines Einbruchs in die Geräte können tatsächlich Coins aus Taler-" "Wallets ausgegeben werden. Wurde ein Coin ausgegeben, ist das Coin " @@ -551,11 +558,11 @@ msgstr "" "bietet sich daher an, den Bestand regelmäßig zu kontrollieren, um einen " "eventuellen Verlust zeitnah festzustellen." -#: template/faq.html.j2:61 +#: template/faq.html.j2:59 msgid "Can I send money to my friends with Taler?" msgstr "Kann ich anderen Menschen mit Taler Geld senden?" -#: template/faq.html.j2:63 +#: template/faq.html.j2:61 msgid "" "If your friends provide goods or services for you in exchange for a payment, " "they can easily set up a Taler merchant and receive the payment in their " @@ -567,7 +574,7 @@ msgstr "" "den Exchange gesammelt und ihre entsprechenden Geldwerte mit einer " "Sammelbuchung auf dem Bankkonto des Verkäufers gutgeschrieben." -#: template/faq.html.j2:70 +#: template/faq.html.j2:68 msgid "" "Future versions of the Taler wallet may allow exchanging coins among friends " "directly as well." @@ -576,11 +583,11 @@ msgstr "" "Coins auszutauschen (peer-to-peer). Möchte man Coins aus dem Taler-Wallet an " "andere Personen senden, wird dies dann schnell und kostengünstig ermöglicht." -#: template/faq.html.j2:76 +#: template/faq.html.j2:74 msgid "How does Taler handle payments in different currencies?" msgstr "Wie behandelt Taler Zahlungen in verschiedenen Währungen?" -#: template/faq.html.j2:78 +#: template/faq.html.j2:76 msgid "" "Taler wallets can store digital coins corresponding to multiple different " "currencies such as the Euro, US Dollars or Bitcoins." @@ -588,17 +595,17 @@ msgstr "" "Ein Taler-Wallet verwaltet digitale Münzen in verschiedenen Währungen wie " "Euro, Dollar oder Bitcoin." -#: template/faq.html.j2:84 +#: template/faq.html.j2:82 msgid "Taler currently does not offer conversion between currencies." msgstr "" "Taler bietet zurzeit keinen direkten Umtausch zwischen verschiedenen " "Währungen." -#: template/faq.html.j2:89 +#: template/faq.html.j2:87 msgid "How does Taler protect my privacy?" msgstr "Wie schützt Taler meine privaten Daten?" -#: template/faq.html.j2:91 +#: template/faq.html.j2:89 msgid "" "Your wallet stores digital coins that are blindly signed by an exchange. The use of a blind " @@ -612,11 +619,11 @@ msgstr "" "Informationen dazu hat die Wikipedia-Seite zur digitalen Signatur." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Wie hoch sind die Kosten? Welche Gebühren fallen an?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -643,11 +650,11 @@ msgstr "" "(für den Fall von hohen Transaktionsmengen, auf welche die Betriebskosten " "degressiv verteilt werden)." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Funktioniert Taler mit grenzüberschreitenden Zahlungen?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -668,12 +675,12 @@ msgstr "" "bietet Taler jedenfalls in der näheren Zukunft keine Funktionalität für den " "Umtausch von Währungen." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "In welchem Verhältnis steht Taler zur (europäischen) E-Geld-Richtlinie?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -683,7 +690,7 @@ msgstr "" "Recht einen Bestandteil der Regulatorik darstellt, die ein Taler-Exchange " "erfüllen muss, um Buchungen in Euro verarbeiten zu können." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -691,7 +698,7 @@ msgstr "" "Welche Bank zeichnet sich verantwortlich für die Weiterbuchung von Coins aus " "dem Taler-Wallet auf ein gewöhnliches Geschäftsbankenkonto?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -718,7 +725,7 @@ msgstr "" "Zahlungsdiensterichtlinie und die Anforderungen der Regulierungsbehörden " "erfüllen, wenn sie das Vertrauen der Nutzer erhalten wollen." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -726,29 +733,30 @@ msgstr "" "An welche Stelle können sich Nutzer des Bezahlsystems wenden, falls es zu " "Problemen mit Umwandlungen von Geldwerten oder Transaktionen kommt?" -#: template/faq.html.j2:152 -msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Jeder Taler-Exchange sollte von einem oder mehreren unabhängigen Auditoren " -"geprüft und validiert werden. Sowohl die Verkäufersoftware ('Merchants') als " -"auch Taler-Wallets senden automatisiert Berichte an die Auditoren, die aus " -"den Berichten erkennen, falls es zu Problemen bei Buchungen gekommen sein " -"sollte. Die Auditoren haben auch die Möglichkeit, jederzeit einen Bericht " -"über die Buchungen des Exchange manuell auszulösen, um Probleme zeitnah zu " -"erkennen. Die Auditoren sind verpflichtet, ihre Berichte an die zuständigen " -"Aufsichtsbehörden - und auch an die interessierte Öffentlichkeit - " -"weiterzuleiten." - -#: template/faq.html.j2:161 +#: template/faq.html.j2:150 +msgid "" +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Gibt es schon Projekte, die Taler verwenden?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -766,11 +774,11 @@ msgstr "" "Betrieb noch zu früh wäre (siehe Liste der offenen Arbeiten in unserem Bug-Tracker)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Beherrscht Taler Daueraufträge (wiederkehrende Zahlungen)?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1453,7 +1461,8 @@ msgstr "Keine neue Währung!" #: template/index.html.j2:37 msgid "Empowers communities to run their own payment infrastructure" -msgstr "Ermöglicht die Entwicklung einer selbstbestimmten Zahlungsinfrastruktur" +msgstr "" +"Ermöglicht die Entwicklung einer selbstbestimmten Zahlungsinfrastruktur" #: template/index.html.j2:41 msgid "Free Software" @@ -1903,19 +1912,41 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "Wallets für andere Browser werden zukünftig bereitgestellt." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Nachrichtenbeiträge zu Änderungen, die GNUnet betreffen, wie neue Versionen " "und Veranstaltungen" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "Abonniere unseren RSS-Feed" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "weiterlesen" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Jeder Taler-Exchange sollte von einem oder mehreren unabhängigen " +#~ "Auditoren geprüft und validiert werden. Sowohl die Verkäufersoftware " +#~ "('Merchants') als auch Taler-Wallets senden automatisiert Berichte an die " +#~ "Auditoren, die aus den Berichten erkennen, falls es zu Problemen bei " +#~ "Buchungen gekommen sein sollte. Die Auditoren haben auch die Möglichkeit, " +#~ "jederzeit einen Bericht über die Buchungen des Exchange manuell " +#~ "auszulösen, um Probleme zeitnah zu erkennen. Die Auditoren sind " +#~ "verpflichtet, ihre Berichte an die zuständigen Aufsichtsbehörden - und " +#~ "auch an die interessierte Öffentlichkeit - weiterzuleiten." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/en/LC_MESSAGES/messages.po b/locale/en/LC_MESSAGES/messages.po index 6fc95844..424afc62 100644 --- a/locale/en/LC_MESSAGES/messages.po +++ b/locale/en/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: en \n" @@ -439,46 +439,48 @@ msgstr "" #: template/faq.html.j2:54 msgid "" "In case of a compromise of one of your devices, an attacker can spend coins " -"from your wallet. Checking your balance might reveal to you that your device " -"has been compromised." +"from your wallet. Checking your balance might reveal to you whether your " +"device has eventually been compromised. If a coin has been spent, this coin " +"cannot be spent a second time. The Exchange examines every coin whether it " +"has been spent and thus makes double spending impossible." msgstr "" -#: template/faq.html.j2:61 +#: template/faq.html.j2:59 msgid "Can I send money to my friends with Taler?" msgstr "" -#: template/faq.html.j2:63 +#: template/faq.html.j2:61 msgid "" "If your friends provide goods or services for you in exchange for a payment, " "they can easily set up a Taler merchant and receive the payment in their " "bank account." msgstr "" -#: template/faq.html.j2:70 +#: template/faq.html.j2:68 msgid "" "Future versions of the Taler wallet may allow exchanging coins among friends " "directly as well." msgstr "" -#: template/faq.html.j2:76 +#: template/faq.html.j2:74 msgid "How does Taler handle payments in different currencies?" msgstr "" -#: template/faq.html.j2:78 +#: template/faq.html.j2:76 msgid "" "Taler wallets can store digital coins corresponding to multiple different " "currencies such as the Euro, US Dollars or Bitcoins." msgstr "" -#: template/faq.html.j2:84 +#: template/faq.html.j2:82 msgid "Taler currently does not offer conversion between currencies." msgstr "" -#: template/faq.html.j2:89 +#: template/faq.html.j2:87 msgid "How does Taler protect my privacy?" msgstr "" -#: template/faq.html.j2:91 +#: template/faq.html.j2:89 msgid "" "Your wallet stores digital coins that are blindly signed by an exchange. The use of a blind " @@ -486,11 +488,11 @@ msgid "" "which coin it signed for which customer." msgstr "" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -503,11 +505,11 @@ msgid "" "regulator and could thus easily be 10x higher." msgstr "" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -518,24 +520,24 @@ msgid "" "future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " "have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -545,26 +547,36 @@ msgid "" "Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -574,11 +586,11 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1331,13 +1343,14 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "" #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "" diff --git a/locale/es/LC_MESSAGES/messages.po b/locale/es/LC_MESSAGES/messages.po index 85b1e58c..c6a1714d 100644 --- a/locale/es/LC_MESSAGES/messages.po +++ b/locale/es/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-11 16:47+0000\n" "Last-Translator: Stefan \n" "Language-Team: Spanish blindly signed by an exchange. The use of a blind " @@ -585,11 +592,11 @@ msgstr "" "firma ciega protege tu privacidad porque previene al banco saber que moneda " "ha sido firmada para cada cliente." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "¿Cuanto cuesta?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -614,11 +621,11 @@ msgstr "" "requerimientos de copias de seguridad del regulador y podrían ser fácilmente " "diez veces más altos." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "¿Funciona Taler con pagos internacionales?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -636,12 +643,12 @@ msgstr "" "enfoque de Taler son los pagos del día a día, así que no tenemos planes de " "soportar conversión de divisas en un futuro cercano." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "¿Como se relaciona Taler con la directiva de dinero electrónico (Europea)?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -651,7 +658,7 @@ msgstr "" "parte del marco de regulación, debería seguir a un exchange Taler con " "monedas denominadas en Euros." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -659,7 +666,7 @@ msgstr "" "¿Que banco garantizaría la conversión entre monedas Taler y dinero de banco " "en cuentas bancarias normales?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -676,7 +683,7 @@ msgstr "" "tendrían fe en la conversión desde monedas Taler hacia dinero bancario " "normal." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -684,27 +691,30 @@ msgstr "" "¿A quien se quejarían los consumidores en el caso de una no-conversión o un " "no-cumplimiento?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Cualquier exchage tiene que se auditado por uno o más auditores " -"independientes. Las carteras de vendedores y consumidores informarán de " -"ciertas incidencias automáticamente a los auditores, pero los auditores " -"también podrían proporcionar un método para envíos manuales de incidencias. " -"Se espera que de los auditores puedan hacer que sus informes estén " -"disponibles a las respectivas autoridades reguladoras, o incluso al público " -"general." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "¿Hay algún proyecto que ya esté usando Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -721,11 +731,11 @@ msgstr "" "(ver también nuestro rastreador de " "errores para ver una lista de incidencias abiertas)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "¿Soporta Taler pagos recurrentes?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1731,19 +1741,39 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "Carteras para otros navegadores serán provistas en un futuro próximo." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Noticias sobre cambios relacionados con GNUnet como lanzamientos, versiones " "y eventos" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "suscribirse a nuestro RSS" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "leer más" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Cualquier exchage tiene que se auditado por uno o más auditores " +#~ "independientes. Las carteras de vendedores y consumidores informarán de " +#~ "ciertas incidencias automáticamente a los auditores, pero los auditores " +#~ "también podrían proporcionar un método para envíos manuales de " +#~ "incidencias. Se espera que de los auditores puedan hacer que sus informes " +#~ "estén disponibles a las respectivas autoridades reguladoras, o incluso al " +#~ "público general." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/fr/LC_MESSAGES/messages.po b/locale/fr/LC_MESSAGES/messages.po index f55da6e6..627396ff 100644 --- a/locale/fr/LC_MESSAGES/messages.po +++ b/locale/fr/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: French (Taler Website)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-11 15:52+0000\n" "Last-Translator: Stefan \n" "Language-Team: French blindly signed by an exchange. The use of a blind " @@ -600,11 +607,11 @@ msgstr "" "puisqu'elle empêche le bureau de change de savoir quelle pièce il a signée " "pour quel acheteur." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Combien ça coûte ?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -629,11 +636,11 @@ msgstr "" "exigences de sauvegarde de la part du régulateur et cela pourrait donc " "facilement être 10x plus élevé." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Est-ce Taler permet les paiements à l'international ?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -652,13 +659,13 @@ msgstr "" "au jour le jour, donc nous n'avons pas prévu de supporter la conversion de " "devise dans un futur proche." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "Comment se situe Taler par rapport à la directive européenne sur les " "monnaies électroniques ?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -668,7 +675,7 @@ msgstr "" "fournit une partie du cadre de travail réglementaire qu'un bureau de change " "Taler avec des pièces estampillées en Euro devrait suivre." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -676,7 +683,7 @@ msgstr "" "Quelle banque garantirait la conversion entre de l'argent en Taler et de " "l'argent dans des comptes en banque classiques ?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -693,7 +700,7 @@ msgstr "" "les consommateurs auraient confiance dans la conversion d'argent Taler en " "argent de banque classique." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -701,26 +708,30 @@ msgstr "" "Auprès de qui se plaindraient les consommateurs en cas de non-conversion ou " "de non-conformité ?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Tout bureau de change devrait être audité par un ou plusieurs auditeurs " -"indépendants. Les commerçants et les porte-monnaies des clients signaleront " -"automatiquement certains problèmes aux auditeurs, mais les auditeurs " -"pourraient également proposer une méthode permettant de signaler des " -"problèmes manuellement. On attend des auditeurs qu'ils fassent leur rapport " -"aux autorités de régulation respectives, voire même au grand public." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Y a-t-il des projets utilisant Taler ?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -738,11 +749,11 @@ msgstr "" "\"https://gnunet.org/bugs/\">notre gestionnaire de suivi des bogues pour " "une liste des tickets en cours)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Est-ce que Taler permet les paiements récurrents ?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1778,19 +1789,39 @@ msgstr "" "que possible." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Articles d'actualité à propos des changements concernant GNUnet, tels les " "annonces de nouvelles versions ou d'événements" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "s'abonner à notre flux RSS" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "lire la suite" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Tout bureau de change devrait être audité par un ou plusieurs auditeurs " +#~ "indépendants. Les commerçants et les porte-monnaies des clients " +#~ "signaleront automatiquement certains problèmes aux auditeurs, mais les " +#~ "auditeurs pourraient également proposer une méthode permettant de " +#~ "signaler des problèmes manuellement. On attend des auditeurs qu'ils " +#~ "fassent leur rapport aux autorités de régulation respectives, voire même " +#~ "au grand public." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/hi/LC_MESSAGES/messages.po b/locale/hi/LC_MESSAGES/messages.po index 79ad00f8..359c32bf 100644 --- a/locale/hi/LC_MESSAGES/messages.po +++ b/locale/hi/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-21 20:25+0000\n" "Last-Translator: Stefan \n" "Language-Team: Hindi blindly signed by an exchange. The use of a blind " @@ -577,11 +584,11 @@ msgstr "" "उपयोग आपकी गोपनीयता की रक्षा करता है क्योंकि यह एक्सचेंज को यह जानने से रोकता है कि यह " "किस ग्राहक के लिए किस सिक्के पर हस्ताक्षर किया गया है।" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "इसकी क्या कीमत है?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -601,11 +608,11 @@ msgstr "" "लग बग एक अरब स्थानांतरण, ना मान के प्रवास मूल्य)। ध्यान दे कि ये एक शीघ्र अंदाज़ा हे, " "विस्तार हो सके निर्भर करे समुदाय एवं पूर्तिकर आवश्यकताओ" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "क्या Taler अंतर्राष्ट्रीय भुगतान से काम करता है ?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -616,24 +623,24 @@ msgid "" "future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " "have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -643,26 +650,36 @@ msgid "" "Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -672,13 +689,13 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 #, fuzzy #| msgid "Does Taler work with international payments?" msgid "Does Taler support recurring payments?" msgstr "क्या Taler अंतर्राष्ट्रीय भुगतान से काम करता है ?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1449,14 +1466,15 @@ msgstr "निकट भविष्य में अन्य ब्राउ #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "GNU टेलर से संबंधित परिवर्तनों के बारे में समाचार पोस्ट करता है जैसे कि रिलीज़ और ईवेंट" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "हमारी आरएसएस फीड को सब्सक्राइब करें" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "और पढ़ें..." diff --git a/locale/hu/LC_MESSAGES/messages.po b/locale/hu/LC_MESSAGES/messages.po index f1467b5e..134b02b5 100644 --- a/locale/hu/LC_MESSAGES/messages.po +++ b/locale/hu/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-04-08 12:55+0000\n" "Last-Translator: Stefan \n" "Language-Team: Hungarian blindly signed by an exchange. The use of a blind " @@ -577,11 +584,11 @@ msgid "" "which coin it signed for which customer." msgstr "" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -594,11 +601,11 @@ msgid "" "regulator and could thus easily be 10x higher." msgstr "" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -609,24 +616,24 @@ msgid "" "future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " "have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -636,26 +643,36 @@ msgid "" "Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -665,11 +682,11 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1427,16 +1444,17 @@ msgstr "" #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Újdonságok a GNU Talerrel kapcsolatos változásokról, mint például " "megjelenések és események" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "iratkozzon fel RSS hírlevelünkre" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "olvasson tovább" diff --git a/locale/it/LC_MESSAGES/messages.po b/locale/it/LC_MESSAGES/messages.po index 24d3416e..64326e0c 100644 --- a/locale/it/LC_MESSAGES/messages.po +++ b/locale/it/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-07 15:13+0000\n" "Last-Translator: Stefan \n" "Language-Team: Italian blindly signed by an exchange. The use of a blind " @@ -585,11 +592,11 @@ msgstr "" "cambio. L'uso di una firma anonima protegge la tua privacy perché impedisce " "al cambio di sapere quale valuta è stata siglata per quale cliente." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Quanto costa?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -613,11 +620,11 @@ msgstr "" "iniziale, i dettagli possono dipendere dai requisiti di hosting e di backup " "del regolatore e potrebbero quindi essere facilmente 10 volte più alti." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Taler accetta pagamenti internazionali?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -635,13 +642,13 @@ msgstr "" "concentra sui pagamenti giornalieri e non è prevista la conversione delle " "valute nel prossimo futuro." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "Come si pone Taler rispetto alla direttiva (europea) sulla moneta " "elettronica?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -651,7 +658,7 @@ msgstr "" "del quadro normativo che un cambio di Taler con monete espresse in euro " "dovrebbe seguire." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -659,7 +666,7 @@ msgstr "" "Quale banca garantirebbe la conversione tra le monete Taler e il denaro in " "conti bancari abituali?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -676,7 +683,7 @@ msgstr "" "i consumatori si fiderebbero della conversione da monete Taler in denaro " "bancario tradizionale." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -684,26 +691,30 @@ msgstr "" "A chi si rivolgerebbero i consumatori in caso di mancata conversione o non " "conformità?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Ogni scambio dovrebbe essere controllato da uno o più revisori indipendenti. " -"I portafogli dei commercianti e dei consumatori riporteranno alcuni problemi " -"automaticamente ai revisori, ma questi ultimi possono anche fornire un " -"metodo per la segnalazione manuale di tali problemi. Ci si aspetta che i " -"revisori rendano i loro rapporti disponibili alle autorità di " -"regolamentazione interessate, o anche al pubblico in senso lato." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Esistono progetti che già utilizzano Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -720,11 +731,11 @@ msgstr "" "\"https://gnunet.org/bugs/\">il nostro bugtracker per una lista di " "questioni aperte)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Taler gestisce i pagamenti ricorrenti?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1716,18 +1727,38 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "I wallet per altri browser saranno forniti nel prossimo futuro." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Post di notizie relative alle novità di GNUnet come nuove versioni ed eventi" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "Abbonati ai nostri RSS feed" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "Leggi di più" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Ogni scambio dovrebbe essere controllato da uno o più revisori " +#~ "indipendenti. I portafogli dei commercianti e dei consumatori " +#~ "riporteranno alcuni problemi automaticamente ai revisori, ma questi " +#~ "ultimi possono anche fornire un metodo per la segnalazione manuale di " +#~ "tali problemi. Ci si aspetta che i revisori rendano i loro rapporti " +#~ "disponibili alle autorità di regolamentazione interessate, o anche al " +#~ "pubblico in senso lato." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/ja/LC_MESSAGES/messages.po b/locale/ja/LC_MESSAGES/messages.po index f28c661e..b8163e65 100644 --- a/locale/ja/LC_MESSAGES/messages.po +++ b/locale/ja/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-22 10:35+0000\n" "Last-Translator: Mizuhashi Lexee \n" "Language-Team: Japanese blindly signed by an exchange. The use of a blind " @@ -570,11 +577,11 @@ msgstr "" "とでプライバシーが保護され、取引所は署名したコインのどれがどの顧客のものかは" "わからない仕組みになっています。" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "どのくらいの費用がかかりますか?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -595,11 +602,11 @@ msgstr "" "期段階での見積もりのため、詳細は監督当局による運用やバックアップに関する規則" "に因ります。取引コストが十倍となっていることも容易に起こり得ます。" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Talerは国際決済可能ですか?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -615,11 +622,11 @@ msgstr "" "に複雑な傾向です。GNU Talerとしては日々の支払いに注力しており、当面は通貨間の" "変換には対応しない予定です。" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "GNU Talerは(欧州)電子マネー指令にどのように対応していますか?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -628,7 +635,7 @@ msgstr "" "欧州電子マネー指令はユーロ建てコインを取り扱うGNU Taler取引所が則るべき規制枠" "組みの一部を規定していると思われます。" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -636,7 +643,7 @@ msgstr "" "GNUコインと通常の銀行口座にある資金間の変換を銀行はどうやって保証しているので" "しょうか?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -651,30 +658,36 @@ msgstr "" "通常の銀行資金へ変換する場合、その理由を確認することが各銀行の規定となってい" "ます。" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "変換が行われないときや不履行の場合の問い合わせ先はどこですか?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"各取引所は一つ以上の独立した監査団体により監査を受ける必要があります。マー" -"チャントと顧客のウォレットは自動的に監査側に問題を報告することになりますが、" -"監査側は手動による問題報告の提出方法を示してもよいです。監査側は同報告書をそ" -"れぞれの監督当局もしくは公衆の閲覧に供することになっています。" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "すでにTalerを使用しているプロジェクトはありますか?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -689,11 +702,11 @@ msgstr "" "しょう(未決課題リストに関してはバグ管理" "システム も併せて参照ください)。" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "GNU Talerは自動引き落としに対応していますか?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1654,17 +1667,34 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "他のブラウザ用ウォレットは開発中です。" #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "GNUnetのリリースやイベントなどに関連する変更のお知らせ" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "RSSフィードを購読する" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "続きを読む" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "各取引所は一つ以上の独立した監査団体により監査を受ける必要があります。マー" +#~ "チャントと顧客のウォレットは自動的に監査側に問題を報告することになります" +#~ "が、監査側は手動による問題報告の提出方法を示してもよいです。監査側は同報告" +#~ "書をそれぞれの監督当局もしくは公衆の閲覧に供することになっています。" + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/ko/LC_MESSAGES/messages.po b/locale/ko/LC_MESSAGES/messages.po index bef961db..0049d890 100644 --- a/locale/ko/LC_MESSAGES/messages.po +++ b/locale/ko/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-03-20 15:15+0000\n" "Last-Translator: Choyi Whang \n" "Language-Team: Korean blindly signed by an exchange. The use of a blind " @@ -581,11 +588,11 @@ msgstr "" "래에서 어떤 고객이 어떤 코인을 서명했는지 알지 못하게 하기 때문에, 은닉서명" "을 통해 당신의 사생활을 보호합니다." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "비용은 얼마인가요?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -606,11 +613,11 @@ msgstr "" "초기 예측 비용으로, 자세한 사항은 규제 담당자의 호스팅과 백업 요건에 따라 변" "경될 수 있으며 예측된 비용의 10배가 될 가능성도 높습니다." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "탈러를 해외 결제에 사용할 수 있나요?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -626,11 +633,11 @@ msgstr "" "다로울만큼 복잡합니다. 탈러는 매일 일어나는 결제에 초점을 맞추고 있기 때문에 " "가까운 미래에 통화 간 환전을 지원할 계획이 없습니다." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "(유럽) 전자화폐 지침과 탈러는 어떻게 연관이 되어있나요?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -639,14 +646,14 @@ msgstr "" "유럽 전자화폐 지침(European Electronic Money Directive)는 유로화로 표시된 코" "인을 탈러로 교환할 때 따라야 할 규율 체계를 규정하고 있다고 생각합니다." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" "어느 은행이 탈러 코인과 일반적인 은행계좌 내 예치금과의 전환을 보장하나요?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -660,30 +667,36 @@ msgstr "" "수 있습니다. 이에 상관없이, 해당 은행은 소비자들이 탈러 코인과 은행 예치금 " "간 전환에 대한 믿음을 줄 수 있는 관련 은행 규율 하에 놓이게 됩니다." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "미전환 혹은 미준수 사항이 생길 시 소비자는 누구에게 항의하나요?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"모든 환전은 한 명 이상의 독립된 감사자에 의해 감사를 받습니다. 상인 및 소비자" -"의 지갑은 특정 문제에 대해 자동으로 감사자에게 보고됩니다만, 감사자는 수동으" -"로 직접 문제를 보고할 수 있는 방법을 제공할 수 있습니다. 감사자들은 관련 규제" -"기관, 혹은 심지어 대중에게 감사보고서를 제공하도록 요구되고 있습니다." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "이미 탈러를 사용하고 있는 프로젝트가 있나요?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -698,11 +711,11 @@ msgstr "" "황 상 아직 이르다고 판단하고 있습니다 (공개된 이슈 관련 버그트래커 참고)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "반복되는 결제를 탈러가 지원하나요?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1635,17 +1648,32 @@ msgstr "다른 브라우저를 위한 지갑은 머지않아 제공될 예정입 #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "GNU 탈러 관련 변경 사항에 대한 뉴스기사 (출시, 행사 등)" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "RSS 피드 구독" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "더 읽기" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "모든 환전은 한 명 이상의 독립된 감사자에 의해 감사를 받습니다. 상인 및 소" +#~ "비자의 지갑은 특정 문제에 대해 자동으로 감사자에게 보고됩니다만, 감사자는 " +#~ "수동으로 직접 문제를 보고할 수 있는 방법을 제공할 수 있습니다. 감사자들은 " +#~ "관련 규제기관, 혹은 심지어 대중에게 감사보고서를 제공하도록 요구되고 있습" +#~ "니다." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/pt/LC_MESSAGES/messages.po b/locale/pt/LC_MESSAGES/messages.po index 62aae256..b99ee64f 100644 --- a/locale/pt/LC_MESSAGES/messages.po +++ b/locale/pt/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: GNU taler master\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-03-25 09:18+0000\n" "Last-Translator: Stefan \n" "Language-Team: Portuguese blindly signed by an exchange. The use of a blind " @@ -567,11 +569,11 @@ msgid "" "which coin it signed for which customer." msgstr "" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -584,11 +586,11 @@ msgid "" "regulator and could thus easily be 10x higher." msgstr "" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -599,24 +601,24 @@ msgid "" "future." msgstr "" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " "have to follow." msgstr "" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -626,26 +628,36 @@ msgid "" "Taler coins into regular bank money." msgstr "" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -655,11 +667,11 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1427,16 +1439,17 @@ msgstr "" #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Publicações de notícias acerca de mudanças ao GNU Taler, como versões, e " "eventos" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "subscreva ao nosso feed RSS" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "ler mais" diff --git a/locale/pt_BR/LC_MESSAGES/messages.po b/locale/pt_BR/LC_MESSAGES/messages.po index 112e3fb6..9e725c4e 100644 --- a/locale/pt_BR/LC_MESSAGES/messages.po +++ b/locale/pt_BR/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-22 10:48+0000\n" "Last-Translator: Stefan \n" "Language-Team: Portuguese (Brazil)

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 #, fuzzy msgid "Are there any projects already using Taler?" msgstr "Já existem projetos usando Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -786,12 +791,12 @@ msgid "" "gnunet.org/bugs/\">our bugtracker for a list of open issues)." msgstr "" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 #, fuzzy msgid "Does Taler support recurring payments?" msgstr "Taler funciona com pagamentos internacionais?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1555,21 +1560,38 @@ msgstr "" #: template/news/index.html.j2:11 #, fuzzy -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Publicações de novidades sobre mudanças relacionadas ao GNU Taler, como " "lançamentos e eventos" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 #, fuzzy msgid "subscribe to our RSS feed" msgstr "Inscrever-se no Feed RSS" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 #, fuzzy msgid "read more" msgstr "ler mais" +#, fuzzy +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Qualquer câmbio deve ser auditado por um ou mais auditores independentes. " +#~ "Carteiras de comerciantes e consumidores reportarão certos problemas " +#~ "automaticamente para os auditores, mas os auditores também podem fornecer " +#~ "um método para submissão manual de problemas. Espera-se que os auditores " +#~ "disponibilizem seus relatórios para as respectivas autoridades de " +#~ "regulamentação, ou mesmo para o público geral." + #, fuzzy #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " diff --git a/locale/ru/LC_MESSAGES/messages.po b/locale/ru/LC_MESSAGES/messages.po index 649ee599..e899a27f 100644 --- a/locale/ru/LC_MESSAGES/messages.po +++ b/locale/ru/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-10 22:16+0000\n" "Last-Translator: Stefan \n" "Language-Team: Russian blindly signed by an exchange. The use of a blind " @@ -598,11 +605,11 @@ msgstr "" "это не позволяет бирже видеть информацию о том, какая монета и для какого " "покупателя была подписана." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Какова стоимость транзакций?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -627,11 +634,11 @@ msgstr "" "хостингу и резервному копированию и, таким образом, запросто повысить ее в " "десять раз." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Работает ли Taler с международными платежами?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -649,11 +656,11 @@ msgstr "" "повседневными платежами, поэтому мы не планируем поддерживать конвертацию " "валюты в ближайшем будущем." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "Как Директива ЕС по электронным деньгам затрагивает Taler?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -664,7 +671,7 @@ msgstr "" "которым Taler должен будет руководствоваться при работе с обменом монет, " "деноминированных в евро." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -672,7 +679,7 @@ msgstr "" "Какой банк может гарантировать конвертацию монет Taler в безналичные деньги, " "хранящиеся на счёте в банке?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -688,7 +695,7 @@ msgstr "" "под соответствующее регулирование. Это даёт потребителям основание уверенно " "конвертировать монеты Taler в безналичные деньги." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -696,26 +703,30 @@ msgstr "" "Куда потребитель может подать жалобу в случае отказа от конвертации или " "несоблюдения требований?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Каждая конверсионная операция должна пройти аудиторскую проверку одним или " -"несколькими аудиторами. Кошельки продавцов и покупателей автоматически " -"выдадут сообщение о конкретных ошибках, которое будет направлено аудиторам. " -"Аудиторы также могут предоставить свой метод обратной связи, который " -"позволит сообщать об ошибках напрямую. Аудиторы должны предоставлять свои " -"отчёты в соответствующие органы или даже делать их общедоступными." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Какие проекты используют Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -732,11 +743,11 @@ msgstr "" "система отслеживания ошибок и " "список ошибок)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Поддерживает ли Taler регулярные платежи?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1680,17 +1691,34 @@ msgstr "" #, fuzzy #| msgid "" #| "News posts about changes related to GNU Taler such as releases and events" -msgid "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "Обновления и мероприятия GNU Taler" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "подпишитесь на нашу RSS-ленту" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "Подробнее" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Каждая конверсионная операция должна пройти аудиторскую проверку одним " +#~ "или несколькими аудиторами. Кошельки продавцов и покупателей " +#~ "автоматически выдадут сообщение о конкретных ошибках, которое будет " +#~ "направлено аудиторам. Аудиторы также могут предоставить свой метод " +#~ "обратной связи, который позволит сообщать об ошибках напрямую. Аудиторы " +#~ "должны предоставлять свои отчёты в соответствующие органы или даже делать " +#~ "их общедоступными." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/sv/LC_MESSAGES/messages.po b/locale/sv/LC_MESSAGES/messages.po index 1629eb5b..d0d4ee86 100644 --- a/locale/sv/LC_MESSAGES/messages.po +++ b/locale/sv/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-02-11 12:44+0000\n" "Last-Translator: Stefan \n" "Language-Team: Swedish blindly signed by an exchange. The use of a blind " @@ -583,11 +590,11 @@ msgstr "" "förhindrar växlingskontoret från att veta vilket mynt det signerade eller " "vilken kund." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Hur mycket kostar det?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -610,11 +617,11 @@ msgstr "" "säkerhetskopieringskrav från tillsynsmyndigheter och kan därför lätt bli 10 " "gånger högre." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Fungerar Taler med internationella betalningar?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -631,12 +638,12 @@ msgstr "" "betalningar, så vi har inga planer på att stödja valutakonvertering inom en " "snar framtid." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "Hur relaterar Taler till (det europeiska) direktivet om elektroniska pengar?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -645,7 +652,7 @@ msgstr "" "Vi tror att det europeiska direktivet om elektroniska pengar utgör en del av " "regelverket som ett Taler-växlingskontor för Euro skulle behöva följa." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -653,7 +660,7 @@ msgstr "" "Vilken bank skulle garantera omvandlingen mellan Taler-mynt och bankpengar " "till vanliga bankkonton?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -669,7 +676,7 @@ msgstr "" "anledning till att konsumenterna skulle tro på omvandlingen från Taler-mynt " "till vanliga pengar." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -677,25 +684,30 @@ msgstr "" "Till vem skulle konsumenter klaga på i händelse av bristande omvandling " "eller bristande efterlevnad?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Varje växlingskontor bör granskas av en eller flera oberoende revisorer. " -"Säljare och konsumentplånböcker rapporterar automatiskt till revisorerna, " -"men revisorer kan också manuellt inhämta rapporter. Revisorerna förväntas " -"göra sina rapporter tillgängliga för respektive tillsynsmyndighet, eller " -"till och med för allmänheten." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Finns det några projekt som redan använder Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -711,11 +723,11 @@ msgstr "" "projektets tillstånd (se även vår " "bugtracker för en lista över öppna problem)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Stöder Taler återkommande betalningar?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1701,18 +1713,36 @@ msgstr "" "framtid." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Nyheter om förändringar relaterade till GNUnet såsom releaser och evenemang" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "prenumerera på vårt RSS-flöde" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "läs mer" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Varje växlingskontor bör granskas av en eller flera oberoende revisorer. " +#~ "Säljare och konsumentplånböcker rapporterar automatiskt till revisorerna, " +#~ "men revisorer kan också manuellt inhämta rapporter. Revisorerna förväntas " +#~ "göra sina rapporter tillgängliga för respektive tillsynsmyndighet, eller " +#~ "till och med för allmänheten." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/tr/LC_MESSAGES/messages.po b/locale/tr/LC_MESSAGES/messages.po index 4fc13b2e..1af564a9 100644 --- a/locale/tr/LC_MESSAGES/messages.po +++ b/locale/tr/LC_MESSAGES/messages.po @@ -7,11 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2022-03-10 18:04+0000\n" "Last-Translator: Stefan Kügel \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -512,20 +512,27 @@ msgid "What if my computer is hacked?" msgstr "Ya bilgisayarım ele geçirilirse ve istismar edilirse ?" #: template/faq.html.j2:54 +#, fuzzy +#| msgid "" +#| "In case of a compromise of one of your devices, an attacker can spend " +#| "coins from your wallet. Checking your balance might reveal to you that " +#| "your device has been compromised." msgid "" "In case of a compromise of one of your devices, an attacker can spend coins " -"from your wallet. Checking your balance might reveal to you that your device " -"has been compromised." +"from your wallet. Checking your balance might reveal to you whether your " +"device has eventually been compromised. If a coin has been spent, this coin " +"cannot be spent a second time. The Exchange examines every coin whether it " +"has been spent and thus makes double spending impossible." msgstr "" "Cihazlarınızdan birinin tehlikeye girmesi durumunda, bir saldırgan " "cüzdanınızdan bozuk para harcayabilir. Bakiyenizi kontrol etmek, cihazınızın " "ele geçirildiğini size gösterebilir." -#: template/faq.html.j2:61 +#: template/faq.html.j2:59 msgid "Can I send money to my friends with Taler?" msgstr "Taler ile arkadaşlarıma para gönderebilir miyim?" -#: template/faq.html.j2:63 +#: template/faq.html.j2:61 msgid "" "If your friends provide goods or services for you in exchange for a payment, " "they can easily set up a Taler merchant and receive the payment in their " @@ -534,7 +541,7 @@ msgstr "" "Arkadaşlarınız size bir ödeme karşılığında mal veya hizmet sağlarsa, kolayca " "bir Taler tüccarı kurabilir ve ödemeyi banka hesaplarına alabilirler." -#: template/faq.html.j2:70 +#: template/faq.html.j2:68 msgid "" "Future versions of the Taler wallet may allow exchanging coins among friends " "directly as well." @@ -542,11 +549,11 @@ msgstr "" "Taler cüzdanının gelecekteki sürümleri, doğrudan arkadaşlar arasında para " "alışverişine de izin verebilir." -#: template/faq.html.j2:76 +#: template/faq.html.j2:74 msgid "How does Taler handle payments in different currencies?" msgstr "Taler, farklı para birimlerindeki ödemeleri nasıl ele alır?" -#: template/faq.html.j2:78 +#: template/faq.html.j2:76 msgid "" "Taler wallets can store digital coins corresponding to multiple different " "currencies such as the Euro, US Dollars or Bitcoins." @@ -554,15 +561,15 @@ msgstr "" "Taler cüzdanlar, Euro, ABD Doları veya Bitcoin gibi birden fazla farklı para " "birimine karşılık gelen dijital paraları saklayabilir." -#: template/faq.html.j2:84 +#: template/faq.html.j2:82 msgid "Taler currently does not offer conversion between currencies." msgstr "Taler şu anda para birimleri arasında dönüştürme sunmamaktadır." -#: template/faq.html.j2:89 +#: template/faq.html.j2:87 msgid "How does Taler protect my privacy?" msgstr "Taler mahremiyetimi nasıl koruyor?" -#: template/faq.html.j2:91 +#: template/faq.html.j2:89 msgid "" "Your wallet stores digital coins that are blindly signed by an exchange. The use of a blind " @@ -574,11 +581,11 @@ msgstr "" "imza kullanımı, takasın hangi parayı hangi müşteri için imzaladığını " "bilmesini engellediği için gizliliğinizi korur." -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "Fiyatı ne kadar?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -602,11 +609,11 @@ msgstr "" "gereksinimlerine bağlı olabileceğini ve bu nedenle kolayca 10 kat daha " "yüksek olabileceğini unutmayın." -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Taler uluslararası ödemelerde çalışıyor mu?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -624,12 +631,12 @@ msgstr "" "günlük ödemelerdir, bu nedenle yakın gelecekte para birimi dönüştürmeyi " "destekleme planımız yoktur." -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "" "Taler'in (Avrupa) Elektronik Para Direktifi ile nasıl bir ilişkisi var?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -638,7 +645,7 @@ msgstr "" "Avrupa Elektronik Para Direktifi'nin düzenleyici çerçevenin bir bölümünü " "Euro cinsinden paralarla Taler takasının takip etmesi gerektiğine inanıyoruz." -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" @@ -646,7 +653,7 @@ msgstr "" "Normal banka hesaplarında Taler coinleri ile banka parası arasındaki " "dönüşümü hangi banka garanti eder?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -662,7 +669,7 @@ msgstr "" "paralarının normal banka parasına dönüştürülmesine neden inandıklarını " "belirleyen ilgili bankacılık düzenlemelerine tabi olacaktı." -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" @@ -670,26 +677,30 @@ msgstr "" "Dönüşüm olmaması veya uyumsuzluk durumunda tüketiciler kime şikayette " "bulunur?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"Herhangi bir değişim, bir veya daha fazla bağımsız denetçi tarafından " -"denetlenmelidir. Satıcılar ve tüketici cüzdanları, belirli sorunları " -"denetçilere otomatik olarak bildirir, ancak denetçiler ayrıca sorunların " -"manuel olarak iletilmesi için bir yöntem de sağlayabilir. Denetçilerin " -"raporlarını ilgili düzenleyici makamlara ve hatta kamuoyuna sunmaları " -"beklenir." - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "Halihazırda Taler kullanan herhangi bir proje var mı?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -705,11 +716,11 @@ msgstr "" "olacağına inanıyoruz (ayrıca bkz. hata " "takip aracımıza açık sorunların listesi için)." -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Taler, yinelenen ödemeleri destekliyor mu?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1700,19 +1711,38 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "Diğer tarayıcılar için cüzdanlar yakın gelecekte sağlanacaktır." #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "" "Sürümler ve etkinlikler gibi GNUnet ile ilgili değişiklikler hakkında haber " "bildirimleri" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "RSS akışına abone olun" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "daha fazlasını okumak için" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "Herhangi bir değişim, bir veya daha fazla bağımsız denetçi tarafından " +#~ "denetlenmelidir. Satıcılar ve tüketici cüzdanları, belirli sorunları " +#~ "denetçilere otomatik olarak bildirir, ancak denetçiler ayrıca sorunların " +#~ "manuel olarak iletilmesi için bir yöntem de sağlayabilir. Denetçilerin " +#~ "raporlarını ilgili düzenleyici makamlara ve hatta kamuoyuna sunmaları " +#~ "beklenir." + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." diff --git a/locale/zh_Hans/LC_MESSAGES/messages.po b/locale/zh_Hans/LC_MESSAGES/messages.po index 3a9c022d..e1111a61 100644 --- a/locale/zh_Hans/LC_MESSAGES/messages.po +++ b/locale/zh_Hans/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-08-24 09:07+0000\n" "Last-Translator: Yiyuan Zhou \n" "Language-Team: Chinese (Simplified) blindly signed by an exchange. The use of a blind " @@ -554,11 +561,11 @@ msgstr "" "Blind_signature\">盲签名的数字货币。使用盲签可以保护您的隐私,因为它可以" "防止交易所知道它为哪个客户签署了哪种货币。" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "它的费用是多少?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -576,11 +583,11 @@ msgstr "" "下,按数十亿交易分摊,不包括迁移成本)。 请注意,这只是一个早期估计,细节可能" "取决于监管机构的托管和备份要求。因此,最终可能很容易高出数10 倍。" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Taler是否支持国际收支?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -595,11 +602,11 @@ msgstr "" "管障碍往往特别复杂。 Taler 的重心是日常支付,因此我们近期没有支持外汇兑换的计" "划。" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "Taler与(欧盟)电子货币指令有什么关系?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -608,13 +615,13 @@ msgstr "" "我们认为,欧盟电子货币指令是以欧元计价的Taler交易所必须遵循的监管框架的一部" "分。" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "哪家银行会保证 Taler 货币和普通银行账户中的银行货币之间的转换?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -628,29 +635,36 @@ msgstr "" "该银行都将遵循其所属的银行法规,这也是消费者可以信任Taler货币兑换为普通银行货" "币的原因。" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "如果出现无法兑换或不遵守规定的情况,消费者向谁投诉?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"任何交易所都应由一名或多名独立审计师进行审计。 商家和消费者钱包会自动向审计师" -"报告某些问题,但审计师也可提供手动提交问题的方法。 审计师应将其报告提供给各自" -"的监管机构,甚至是公众。" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "是否有项目已经在使用Taler?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -664,11 +678,11 @@ msgstr "" "项目的状态,我们认为目前还为时过早(另请参阅我们的错误跟踪器 获取未决问题清单)。" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Taler支持定期付款吗?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1547,13 +1561,29 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "其他浏览器的钱包将在不久的将来提供。" #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "有关 GNUnet 相关变更的新闻帖子,例如发布和活动" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "订阅我们的 RSS 提要" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "阅读更多" + +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "任何交易所都应由一名或多名独立审计师进行审计。 商家和消费者钱包会自动向审" +#~ "计师报告某些问题,但审计师也可提供手动提交问题的方法。 审计师应将其报告提" +#~ "供给各自的监管机构,甚至是公众。" diff --git a/locale/zh_Hant/LC_MESSAGES/messages.po b/locale/zh_Hant/LC_MESSAGES/messages.po index 4abb09f5..0fec293f 100644 --- a/locale/zh_Hant/LC_MESSAGES/messages.po +++ b/locale/zh_Hant/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-02-24 18:55+0100\n" +"POT-Creation-Date: 2022-04-20 08:21+0200\n" "PO-Revision-Date: 2021-08-23 08:58+0000\n" "Last-Translator: Ting-Yi Fu \n" "Language-Team: Chinese (Traditional) blindly signed by an exchange. The use of a blind " @@ -557,11 +564,11 @@ msgstr "" "Blind_signature\">盲簽名的數位硬幣。由於盲簽名防止交易所得知該錢幣被哪個" "顧客所簽署,盲簽名可以用來保護您的隱私。" -#: template/faq.html.j2:101 +#: template/faq.html.j2:99 msgid "How much does it cost?" msgstr "這需要花費多少錢?" -#: template/faq.html.j2:103 +#: template/faq.html.j2:101 msgid "" "The Taler protocol allows any exchange to set its own fee structure, " "allowing operators to set fees for withdrawing, depositing, refreshing or " @@ -580,11 +587,11 @@ msgstr "" "期的估計數字,更多細節可能會取決於管理機關對於託管以及備份的相關要求,因此," "這個數字可能會很容易地比預期的高出 10 倍以上。" -#: template/faq.html.j2:117 +#: template/faq.html.j2:115 msgid "Does Taler work with international payments?" msgstr "Taler 支持跨國轉帳嗎?" -#: template/faq.html.j2:119 +#: template/faq.html.j2:117 msgid "" "Taler's wallet supports multiple currencies, but the system currently " "does not support conversion between currencies. However, in principle an " @@ -599,11 +606,11 @@ msgstr "" "往往十分複雜。Taler 所著重的是日常的付款,所以我們近期並沒有計畫支持貨幣轉換" "的功能。" -#: template/faq.html.j2:130 +#: template/faq.html.j2:128 msgid "How does Taler relate to the (European) Electronic Money Directive?" msgstr "Taler 與(歐洲)電子貨幣指令有甚麼關係?" -#: template/faq.html.j2:132 +#: template/faq.html.j2:130 msgid "" "We believe the European Electronic Money Directive provides part of the " "regulatory framework a Taler exchange with coins denominated in Euros would " @@ -612,13 +619,13 @@ msgstr "" "我們認為,《歐洲電子貨幣指令》是以歐元計價的 Taler 交易所必須遵循的監管框架的" "一部分。" -#: template/faq.html.j2:139 +#: template/faq.html.j2:137 msgid "" "What bank would guarantee the conversion between Taler coins and bank money " "in regular bank accounts?" msgstr "哪家銀行可以保證 Taler 貨幣與常規銀行帳戶中的銀行貨幣之間的轉換?" -#: template/faq.html.j2:141 +#: template/faq.html.j2:139 msgid "" "The exchange would be operated by a bank or in cooperation with a bank, and " "that bank would hold the funds in escrow. Note that this bank could be a " @@ -632,29 +639,36 @@ msgstr "" "遵循其所屬的銀行法規,這也是消費者可以信任 Taler 貨幣兌換成普通銀行貨幣的原" "因。" -#: template/faq.html.j2:150 +#: template/faq.html.j2:148 msgid "" "To whom would consumers complain to in case of non-conversion or non-" "compliance?" msgstr "如果出現無法兌換或是不遵守規定的情況,消費者該向誰投訴?" -#: template/faq.html.j2:152 +#: template/faq.html.j2:150 msgid "" -"Any exchange should be audited by one or more independent auditors. " -"Merchants and consumer wallets will report certain issues automatically to " -"the auditors, but auditors may also provide a method for manual submission " -"of issues. The auditors are expected to make their reports available to the " -"respective regulatory authorities, or even the general public." -msgstr "" -"任何交易所均應由一名或多名獨立審計師進行審計。商家以及顧客錢包會自動向審計師" -"舉報特定問題,但審計師也可以提供對於手動提交問題的方法。期望中,審計師的報告" -"應要讓個別的監管部門、甚至是大眾可以獲得。" - -#: template/faq.html.j2:161 +"From a technical point of view, any exchange is audited by one or more " +"independent auditors. Merchants and consumer wallets will report certain " +"issues automatically to the auditors, but auditors may also provide a method " +"for manual submission of issues. The auditors are expected to make their " +"reports available to the respective regulatory authorities, or even the " +"general public.

From a legal point of view, users can always turn " +"to their national authority responsible for settling disputes concerning the " +"management of exchange services. For exchange services conducting business " +"in Germany, this would be the general authority in charge of disputes (Universalschlichtungsstelle " +"des Bundes). In addition to this, the European Online Dispute Resolution " +"(see ODR) as a platform provided by " +"the European Commission can be called for the settlement of disputes " +"concerning exchange services headquartered in member states of the European " +"Union." +msgstr "" + +#: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" msgstr "有任何項目已經在使用 Taler 了嗎?" -#: template/faq.html.j2:163 +#: template/faq.html.j2:160 msgid "" "We are aware of several businesses running exploratory projects or having " "developed working prototypes. We are also in discussions with several " @@ -668,11 +682,11 @@ msgstr "" "為這對於此計畫目前的狀態來說言之過早(請一併查看我們的 bugtracker 以檢視未解決問題清單)。" -#: template/faq.html.j2:174 +#: template/faq.html.j2:171 msgid "Does Taler support recurring payments?" msgstr "Taler 支援定期付款嗎?" -#: template/faq.html.j2:176 +#: template/faq.html.j2:173 msgid "" "Today, our wallet implementation does not support recurring payments. " "Recurring payments, where some fixed amount is paid on a regular basis are " @@ -1555,17 +1569,33 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "其他瀏覽器的錢包會於近期提供。" #: template/news/index.html.j2:11 -msgid "News posts about changes related to GNUnet such as releases and events" +#, fuzzy +#| msgid "" +#| "News posts about changes related to GNUnet such as releases and events" +msgid "" +"News posts about changes related to GNU Taler such as releases and events" msgstr "與 GNU Taler 更改、發布、活動等相關的最新消息" -#: template/news/index.html.j2:16 +#: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" msgstr "訂閱我們的 RSS feed" -#: template/news/index.html.j2:36 +#: template/news/index.html.j2:33 msgid "read more" msgstr "閱讀更多" +#~ msgid "" +#~ "Any exchange should be audited by one or more independent auditors. " +#~ "Merchants and consumer wallets will report certain issues automatically " +#~ "to the auditors, but auditors may also provide a method for manual " +#~ "submission of issues. The auditors are expected to make their reports " +#~ "available to the respective regulatory authorities, or even the general " +#~ "public." +#~ msgstr "" +#~ "任何交易所均應由一名或多名獨立審計師進行審計。商家以及顧客錢包會自動向審計" +#~ "師舉報特定問題,但審計師也可以提供對於手動提交問題的方法。期望中,審計師的" +#~ "報告應要讓個別的監管部門、甚至是大眾可以獲得。" + #~ msgid "" #~ "You can find some team members in the IRC channel #taler on " #~ "irc.freenode.net." -- cgit v1.2.3 From 709e5471e0ed942c062a015e56b0b78751229eea Mon Sep 17 00:00:00 2001 From: Stefan Kügel Date: Wed, 20 Apr 2022 06:40:46 +0000 Subject: Translated using Weblate (German) Currently translated at 100.0% (248 of 248 strings) Translation: GNU Taler/Main web site Translate-URL: http://weblate.taler.net/projects/gnu-taler/main-web-site/de/ --- locale/de/LC_MESSAGES/messages.po | 50 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po index 9ab7a700..cc3bf06e 100644 --- a/locale/de/LC_MESSAGES/messages.po +++ b/locale/de/LC_MESSAGES/messages.po @@ -3,10 +3,10 @@ msgstr "" "Project-Id-Version: German (Taler Website)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2022-04-20 08:21+0200\n" -"PO-Revision-Date: 2022-03-04 16:49+0000\n" -"Last-Translator: Stefan \n" -"Language-Team: German \n" +"PO-Revision-Date: 2022-04-20 06:40+0000\n" +"Last-Translator: Stefan Kügel \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -540,11 +540,6 @@ msgid "What if my computer is hacked?" msgstr "Was ist, wenn mein Computer gehackt wurde?" #: template/faq.html.j2:54 -#, fuzzy -#| msgid "" -#| "In case of a compromise of one of your devices, an attacker can spend " -#| "coins from your wallet. Checking your balance might reveal to you that " -#| "your device has been compromised." msgid "" "In case of a compromise of one of your devices, an attacker can spend coins " "from your wallet. Checking your balance might reveal to you whether your " @@ -552,11 +547,13 @@ msgid "" "cannot be spent a second time. The Exchange examines every coin whether it " "has been spent and thus makes double spending impossible." msgstr "" -"Im Fall eines Einbruchs in die Geräte können tatsächlich Coins aus Taler-" -"Wallets ausgegeben werden. Wurde ein Coin ausgegeben, ist das Coin " -"entwertet. Wer es zuerst ausgibt, verfügt über den bewegten Geldwert. Es " -"bietet sich daher an, den Bestand regelmäßig zu kontrollieren, um einen " -"eventuellen Verlust zeitnah festzustellen." +"Im Fall eines Einbruchs in eines deiner Geräte können Coins aus einem Taler-" +"Wallet ausgegeben werden. Daher sollte der Bestand im Wallet regelmäßig " +"kontrolliert werden, um einen eventuellen Einbruch oder Verlust zeitnah " +"festzustellen. Wurde ein Coin zum Bezahlen verwendet, kann dieses nicht ein " +"zweites Mal ausgegeben werden. Der Taler Exchange prüft beim Bezahlen, ob " +"ein Coin bereits verwendet wurde, und verhindert so eine mehrmalige Ausgabe " +"des gleichen Coins." #: template/faq.html.j2:59 msgid "Can I send money to my friends with Taler?" @@ -751,6 +748,24 @@ msgid "" "concerning exchange services headquartered in member states of the European " "Union." msgstr "" +"Die technische Lösung besteht darin, dass jeder Taler-Exchange von einem " +"oder mehreren unabhängigen Auditoren überwacht und validiert wird. Sowohl " +"die Verkäufersoftware als auch Taler-Wallets senden automatisiert Berichte " +"an die Auditoren, die aus den Berichten erkennen, falls es zu Problemen bei " +"Buchungen gekommen sein sollte. Die Auditoren haben auch die Möglichkeit, " +"jederzeit einen Bericht über die Buchungen des Exchange manuell auszulösen, " +"um Probleme zeitnah zu erkennen. Die Auditoren sind verpflichtet, ihre " +"Berichte an die zuständigen Aufsichtsbehörden - und auch an die " +"interessierte Öffentlichkeit - weiterzuleiten.

In juristischer " +"Hinsicht können sich Taler-Nutzer bei Problemen an die nationale " +"Schlichtungsstelle des Landes wenden, in dem der Exchange-Betreiber seinen " +"Hauptsitz hat. In Deutschland ist dies die Universalschlichtungsstelle des " +"Bundes in Kehl (Universalschlichtungsstelle des Bundes). Bei einem Hauptsitz des " +"Exchange-Betreibers in einem Staat der Europäischen Union besteht zudem die " +"Möglichkeit, über die Plattform der Europäischen Kommission zur Online-" +"Streitbeilegung (ODR) eine " +"Beschwerde einzureichen." #: template/faq.html.j2:158 msgid "Are there any projects already using Taler?" @@ -1912,14 +1927,11 @@ msgid "Wallets for other browsers will be provided in the near future." msgstr "Wallets für andere Browser werden zukünftig bereitgestellt." #: template/news/index.html.j2:11 -#, fuzzy -#| msgid "" -#| "News posts about changes related to GNUnet such as releases and events" msgid "" "News posts about changes related to GNU Taler such as releases and events" msgstr "" -"Nachrichtenbeiträge zu Änderungen, die GNUnet betreffen, wie neue Versionen " -"und Veranstaltungen" +"Nachrichtenbeiträge zu Änderungen, die GNU Taler betreffen, wie z.B. neue " +"Versionen und Veranstaltungen" #: template/news/index.html.j2:13 msgid "subscribe to our RSS feed" -- cgit v1.2.3 From ede112f1290353954a1f68d0f1a1543b55e8faf3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 25 May 2022 13:55:26 +0200 Subject: -article --- template/news/2022-05.html.j2 | 40 ++++++++++++++++++++++++++++++++++++++++ www.yml | 3 +++ 2 files changed, 43 insertions(+) create mode 100644 template/news/2022-05.html.j2 diff --git a/template/news/2022-05.html.j2 b/template/news/2022-05.html.j2 new file mode 100644 index 00000000..b309807d --- /dev/null +++ b/template/news/2022-05.html.j2 @@ -0,0 +1,40 @@ +{% extends "common/news.j2" %} {% block body_content %} + +

2022-5: "Who comes after us? The correct mindset for designing a Central Bank Digital Currency" published by SUREF

+ +

Background

+

+The title of the paper refers to the former DIRNSA, who claimed that +"nobody comes after us" just before the NSA lost control of its data +on Afghanistan collaborators to the Taliban. The paper urges for this +cautionary tale to be considered when central banks are creating +digital currencies. +

+ +

Abstract

+

+In December 2021 the European Central Bank (ECB) published a report on +"Central Bank Digital Currency: functional scope, pricing and controls" in its +Occasional Paper Series [BPT21], detailing various challenges for the Digital +Euro. While the authors peripherally acknowledge the existence of token-based +payment systems, the notion that a Digital Euro will somehow require citizens +to have some kind of central bank account is pervasive in the paper. We argue +that an account-based design cannot meet the ECB’s stated design goals and +that the ECB needs to fundamentally change its mindset when thinking about its +role in the context of the Digital Euro if it wants the project to +succeed. Along the same lines, the French National Council for Digitalization +published a report on "Notes and Tokens, The New Competition of Currencies" +[DGTV21]. Here, the authors make related incorrect claims about inevitable +properties of Central Bank Digital Currencies (CBDCs), going as far as stating +that a CBDC is not possible without an eID system. Our paper sets the record +straight. +

+

Download links

+ + +{% endblock body_content %} diff --git a/www.yml b/www.yml index a374d742..2d80e257 100644 --- a/www.yml +++ b/www.yml @@ -28,6 +28,9 @@ langs_full: tr: Türkçe meetingnotes: newsposts: + - page: 2022-05.html + date: 2022-05-25 + title: "Who comes after us? The correct mindset for designing a Central Bank Digital Currency" - page: 2022-03.html date: 2022-03-11 title: "Central Bank Accounts are Dangerous and Unnecessary: A critique of two papers" -- cgit v1.2.3 From dcd75239a255e2af7c688c9d54f029cc875f8695 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jun 2022 19:53:57 +0200 Subject: -add mboss ad --- inc | 2 +- locale/messages.pot | 4 ++-- template/news/2022-06.html.j2 | 48 +++++++++++++++++++++++++++++++++++++++++++ www.yml | 3 +++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 template/news/2022-06.html.j2 diff --git a/inc b/inc index 218f02cf..2b72c7f5 160000 --- a/inc +++ b/inc @@ -1 +1 @@ -Subproject commit 218f02cfc0453a0d4cc067ba9256123a675040ce +Subproject commit 2b72c7f57d318271856f992eb2e58c133ae5179e diff --git a/locale/messages.pot b/locale/messages.pot index 9692ad3b..72037f33 100644 --- a/locale/messages.pot +++ b/locale/messages.pot @@ -8,14 +8,14 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-20 08:21+0200\n" +"POT-Creation-Date: 2022-06-15 19:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.8.0\n" +"Generated-By: Babel 2.9.1\n" #: common/base.j2:5 common/news.j2:5 msgid "GNU Taler" diff --git a/template/news/2022-06.html.j2 b/template/news/2022-06.html.j2 new file mode 100644 index 00000000..30353cb1 --- /dev/null +++ b/template/news/2022-06.html.j2 @@ -0,0 +1,48 @@ +{% extends "common/news.j2" %} {% block body_content %} + +

2022-6: "GNU Taler Scalability: Measuring and Improving the Performance of GNU Taler on Grid’5000"

+ +

Background

+

+Anonymity loves company. Hence, to provide the best +possible anonymity to GNU Taler users, the scalability of +individual installations of a Taler payment service matters. +While our design scales nicely on paper, +NGI Fed4Fire+ +enabled us to evaluate the transaction rates that could be achieved +with the actual implementation. Experiments were conducted by Marco Boss for +his Bachelor's thesis at the Bern +University of Applied Sciences to assess bottlenecks and suggest +avenues for further improvement. +

+ +

Abstract

+

+This thesis is on the GNU Taler scalability experiments conducted +on Grid’5000 in the first +half of 2022, which was preceded by preparations carried out in the second half of 2021 +supported by the Next Generation Internet initiative’s +NGI Fed4Fire+ program. +
+The primary goal of this study was to evaluate the scalability of GNU Taler in a real-world +scenario. That is, moving away from the loopback system to a distributed network and iden- +tifying improvement opportunities therein to analyze and improve performance. While the +basic framework was already known from the previous study, this work focuses on extend- +ing the framework and making further improvements to GNU Taler. This includes, among +other things, the horizontal distribution of the PostgreSQL database. +
+We identified and fixed several bottlenecks in the GNU Taler software. We parallelized the +execution of the cryptographic frontend, leaving the PostgreSQL database as the natural bot- +tleneck. Here, we optimized queries and modified the schema to enable table partitioning. +The scalability demonstrated in our experiments shows that Taler is very capable of pro- +cessing enough transactions per second to be considered an acceptable payment system. +Throughout this work, we were able to increase the performance of Taler by a factor of 95, +from about 300 to 28.5k transactions per second, showing that Central Bank Digital Curren- +cies based on Taler would require only a few exchanges per continent. +

+

Download links

+ + +{% endblock body_content %} diff --git a/www.yml b/www.yml index 2d80e257..e443ea32 100644 --- a/www.yml +++ b/www.yml @@ -28,6 +28,9 @@ langs_full: tr: Türkçe meetingnotes: newsposts: + - page: 2022-06.html + date: 2022-06-25 + title: "GNU Taler Scalability" - page: 2022-05.html date: 2022-05-25 title: "Who comes after us? The correct mindset for designing a Central Bank Digital Currency" -- cgit v1.2.3 From d188ac95f3f7774f65d824e3a848fb499abc8a15 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jun 2022 20:21:23 +0200 Subject: -add actual thesis --- static/papers/boss2022thesis.pdf | Bin 0 -> 4257707 bytes template/news/2022-06.html.j2 | 20 ++++++++++---------- www.yml | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 static/papers/boss2022thesis.pdf diff --git a/static/papers/boss2022thesis.pdf b/static/papers/boss2022thesis.pdf new file mode 100644 index 00000000..d9f94c58 Binary files /dev/null and b/static/papers/boss2022thesis.pdf differ diff --git a/template/news/2022-06.html.j2 b/template/news/2022-06.html.j2 index 30353cb1..701f2acc 100644 --- a/template/news/2022-06.html.j2 +++ b/template/news/2022-06.html.j2 @@ -25,20 +25,20 @@ supported by the Next Generation Internet initiative’s NGI Fed4Fire+ program.
The primary goal of this study was to evaluate the scalability of GNU Taler in a real-world -scenario. That is, moving away from the loopback system to a distributed network and iden- -tifying improvement opportunities therein to analyze and improve performance. While the -basic framework was already known from the previous study, this work focuses on extend- -ing the framework and making further improvements to GNU Taler. This includes, among +scenario. That is, moving away from the loopback system to a distributed network and identifying +improvement opportunities therein to analyze and improve performance. While the +basic framework was already known from the previous study, this work focuses on extending +the framework and making further improvements to GNU Taler. This includes, among other things, the horizontal distribution of the PostgreSQL database.
We identified and fixed several bottlenecks in the GNU Taler software. We parallelized the -execution of the cryptographic frontend, leaving the PostgreSQL database as the natural bot- -tleneck. Here, we optimized queries and modified the schema to enable table partitioning. -The scalability demonstrated in our experiments shows that Taler is very capable of pro- -cessing enough transactions per second to be considered an acceptable payment system. +execution of the cryptographic frontend, leaving the PostgreSQL database as the natural bottleneck. +Here, we optimized queries and modified the schema to enable table partitioning. +The scalability demonstrated in our experiments shows that Taler is very capable of processing +enough transactions per second to be considered an acceptable payment system. Throughout this work, we were able to increase the performance of Taler by a factor of 95, -from about 300 to 28.5k transactions per second, showing that Central Bank Digital Curren- -cies based on Taler would require only a few exchanges per continent. +from about 300 to 28.5k transactions per second, showing that Central Bank Digital Currencies +based on Taler would require only a few exchanges per continent.

Download links

    diff --git a/www.yml b/www.yml index e443ea32..e328f08a 100644 --- a/www.yml +++ b/www.yml @@ -29,7 +29,7 @@ langs_full: meetingnotes: newsposts: - page: 2022-06.html - date: 2022-06-25 + date: 2022-06-16 title: "GNU Taler Scalability" - page: 2022-05.html date: 2022-05-25 -- cgit v1.2.3 From 746e142ff38348b21d1bf8794fdefebbc06c5643 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jun 2022 20:27:38 +0200 Subject: -update bibliography --- www.yml | 56 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/www.yml b/www.yml index e328f08a..e5fe2755 100644 --- a/www.yml +++ b/www.yml @@ -141,6 +141,36 @@ newsposts: title: Launching taler.net videoslist: paperslist: + - year: 2022 + authors: + - Marco Boss + name: "GNU Taler Scalability" + kind: Bachelor Thesis + url: + url_html: + url_pdf: "papers/boss2022thesis.pdf" + comment: + - year: 2022 + authors: + - Gian Demarmels + - Lucien Heuzeveldt + name: "Adding Schnorr's Blind Signature in Taler" + kind: Bachelor Thesis + url: + url_html: + url_pdf: "papers/cs-thesis.pdf" + comment: + - year: 2022 + authors: + - Antoine d'Aligny + - Emmanuel Benoist + - Florian Dold + - Christian Grothoff + - Özgür Kesim + - Martin Schanzenbach + name: "Central Bank Accounts are Dangerous and Unnecessary: A critique of two papers" + kind: Article + url_pdf: "papers/accounts-dangerous-2022.pdf" - year: 2021 authors: - Christian Grothoff @@ -151,14 +181,6 @@ paperslist: url_html: https://www.suerf.org/suer-policy-brief/27227/how-to-issue-a-privacy-preserving-central-bank-digital-currency url_pdf: "papers/suerf2021en.pdf" comment: - - year: 2021 - authors: - - Belén Barros Pena - kind: PhD Thesis - name: "Understanding and designing technologies for everyday financial collaboration" - url_html: - comment: - url_pdf: "papers/thesis_belen_barros_pena.pdf" - year: 2021 authors: - Christian Grothoff @@ -201,15 +223,14 @@ paperslist: url_html: url_pdf: "papers/cbdc2021it.pdf" comment: Translation by Dora Scilipoti - - year: 2019 + - year: 2021 authors: - - Florian Dold - name: "The GNU Taler System: Practical and Provably Secure Electronic Payments" + - Belén Barros Pena kind: PhD Thesis - url: + name: "Understanding and designing technologies for everyday financial collaboration" url_html: - url_pdf: "papers/thesis-dold-phd-2019.pdf" comment: + url_pdf: "papers/thesis_belen_barros_pena.pdf" - year: 2020 authors: - Dominik Wenger @@ -239,6 +260,15 @@ paperslist: url_html: url_pdf: "papers/thesis-anastasis-2020.pdf" comment: + - year: 2019 + authors: + - Florian Dold + name: "The GNU Taler System: Practical and Provably Secure Electronic Payments" + kind: PhD Thesis + url: + url_html: + url_pdf: "papers/thesis-dold-phd-2019.pdf" + comment: - year: 2019 authors: - Christian Grothoff -- cgit v1.2.3 From d8680af471c03bfd5f1fbb96df93fda3b8efd097 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 15 Jun 2022 20:33:23 +0200 Subject: -yaml fix --- www.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/www.yml b/www.yml index e5fe2755..7884bdfe 100644 --- a/www.yml +++ b/www.yml @@ -170,7 +170,10 @@ paperslist: - Martin Schanzenbach name: "Central Bank Accounts are Dangerous and Unnecessary: A critique of two papers" kind: Article + url: + url_html: url_pdf: "papers/accounts-dangerous-2022.pdf" + comment: - year: 2021 authors: - Christian Grothoff @@ -187,6 +190,7 @@ paperslist: - Florian Dold kind: Article name: "Why a Digital Euro should be Online-first and Bearer-based" + url: url_html: comment: url_pdf: "papers/euro-bearer-online-2021.pdf" -- cgit v1.2.3 From d2b9adcc2ec8e1f0eec445f62ba6ac86e504d242 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 16 Jun 2022 11:39:40 +0200 Subject: -link --- template/news/2022-06.html.j2 | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/template/news/2022-06.html.j2 b/template/news/2022-06.html.j2 index 701f2acc..9491a2f2 100644 --- a/template/news/2022-06.html.j2 +++ b/template/news/2022-06.html.j2 @@ -15,7 +15,12 @@ his Bachelor's thesis at the Bern University of Applied Sciences to assess bottlenecks and suggest avenues for further improvement.

    - +

    Introduction video

    +

    + +

    Abstract

    This thesis is on the GNU Taler scalability experiments conducted @@ -40,9 +45,10 @@ Throughout this work, we were able to increase the performance of Taler by a fac from about 300 to 28.5k transactions per second, showing that Central Bank Digital Currencies based on Taler would require only a few exchanges per continent.

    -

    Download links

    +

    Download links

    {% endblock body_content %} -- cgit v1.2.3 From 4665fa7fa0bcaeb84cf97ffabbc4e1c733e028da Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 21 Jun 2022 13:08:48 +0200 Subject: -add oenb report --- .../papers/digital-euro-and-the-future-of-cash.pdf | Bin 0 -> 355173 bytes static/presentations/boss2022poster.pdf | Bin 0 -> 614577 bytes template/news/2022-07.html.j2 | 38 +++++++++++++++++++++ www.yml | 13 +++++++ 4 files changed, 51 insertions(+) create mode 100644 static/papers/digital-euro-and-the-future-of-cash.pdf create mode 100644 static/presentations/boss2022poster.pdf create mode 100644 template/news/2022-07.html.j2 diff --git a/static/papers/digital-euro-and-the-future-of-cash.pdf b/static/papers/digital-euro-and-the-future-of-cash.pdf new file mode 100644 index 00000000..1e879135 Binary files /dev/null and b/static/papers/digital-euro-and-the-future-of-cash.pdf differ diff --git a/static/presentations/boss2022poster.pdf b/static/presentations/boss2022poster.pdf new file mode 100644 index 00000000..543c6e96 Binary files /dev/null and b/static/presentations/boss2022poster.pdf differ diff --git a/template/news/2022-07.html.j2 b/template/news/2022-07.html.j2 new file mode 100644 index 00000000..5a1fd2e7 --- /dev/null +++ b/template/news/2022-07.html.j2 @@ -0,0 +1,38 @@ +{% extends "common/news.j2" %} {% block body_content %} + +

    2022-6: "A digital euro and the future of cash"

    + +

    Background

    +

    +The Central Bank of Austria has +published a report in the context of celebrating 20 years of +Euro-denominated cash. The report discusses the future of cash, +including account- and blockchain-based designs, as well as +GNU Taler. +

    +

    Abstract

    +

    +What is the discussion about a digital euro – and, more generally, digital +central bank currencies – all about? We are focusing here on the future of +cash. For strategic reasons, central banks are seeking to provide a credible +and viable public anchor for digital money given that the future might be +shaped more strongly by new private issuers of money. The technological +structures and business model-driven incentives of the new players, which are +associated with the internet economy and thrive on network effects, might lead +to a concentration of significant market power in payments. Ultimately, this +might even result in a fragmented monetary system and jeopardize universal +access to public money. From a central bank’s perspective, the crucial +question is therefore not so much about replacing cash with new payment +technologies but about finding ways to ensure that the monetary system will +continue to work in the public interest in a digital future. Cash will, and +should, play a role also in a future monetary system. By creating a digital +euro, central banks in the euro area aim to adapt cash in such a way that it +meets the needs of the digital age. +

    +

    Download links

    + + +{% endblock body_content %} diff --git a/www.yml b/www.yml index 7884bdfe..35840b91 100644 --- a/www.yml +++ b/www.yml @@ -28,6 +28,9 @@ langs_full: tr: Türkçe meetingnotes: newsposts: + - page: 2022-07.html + date: 2022-06-21 + title: "A digital euro and the future of cash" - page: 2022-06.html date: 2022-06-16 title: "GNU Taler Scalability" @@ -141,6 +144,16 @@ newsposts: title: Launching taler.net videoslist: paperslist: + - year: 2022 + authors: + - Martin Summer + - Hannes Hermanky + name: "A digital euro and the future of cash" + kind: Article + url: https://www.oenb.at/dam/jcr:0e3c00d6-2e0a-4089-b23c-5604e60ebde5/07_Mop_Q1-2_22_A-digital-euro-and-the-future-of-cash.pdf + url_html: + url_pdf: "papers/digital-euro-and-the-future-of-cash.pdf" + comment: - year: 2022 authors: - Marco Boss -- cgit v1.2.3 From 5c2be8a528ae0dac752b171c1b0726afb166a167 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 21 Jun 2022 13:23:20 +0200 Subject: -link to workshop --- template/news/2022-07.html.j2 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/template/news/2022-07.html.j2 b/template/news/2022-07.html.j2 index 5a1fd2e7..876f7488 100644 --- a/template/news/2022-07.html.j2 +++ b/template/news/2022-07.html.j2 @@ -5,8 +5,9 @@

    Background

    The Central Bank of Austria has -published a report in the context of celebrating 20 years of -Euro-denominated cash. The report discusses the future of cash, +published a report in the context of a workshop +celebrating 20 years of +Euro-denominated cash. The report discusses the future of cash, including account- and blockchain-based designs, as well as GNU Taler.

    -- cgit v1.2.3 From 04fe5101d48846a73ed0113aa1615f7d12816d99 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 21 Jun 2022 13:24:51 +0200 Subject: -label --- template/news/2022-07.html.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/news/2022-07.html.j2 b/template/news/2022-07.html.j2 index 876f7488..823a2c35 100644 --- a/template/news/2022-07.html.j2 +++ b/template/news/2022-07.html.j2 @@ -33,7 +33,7 @@ meets the needs of the digital age.

    Download links

    {% endblock body_content %} -- cgit v1.2.3 From 0e74d9fb7336dfdbfc495b30cc2ab9b38307d4e9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 25 Jun 2022 21:06:40 +0200 Subject: add video --- template/news/2022-08.html.j2 | 13 +++++++++++++ www.yml | 3 +++ 2 files changed, 16 insertions(+) create mode 100644 template/news/2022-08.html.j2 diff --git a/template/news/2022-08.html.j2 b/template/news/2022-08.html.j2 new file mode 100644 index 00000000..7eff7bd1 --- /dev/null +++ b/template/news/2022-08.html.j2 @@ -0,0 +1,13 @@ +{% extends "common/news.j2" %} +{% block body_content %} +

    2022-06: Vortrag zu "Datenschutzfreundliches digitales Bezahlen" beim Netzpolitischen Abend in Zürich

    +

    + +

    +

    + Creative Commons License
    "Taler" by Christian Grothoff, produced by c3voc.de is licensed under a Creative Commons Attribution NoDerivatives 3.0 Unported License. +

    +{% endblock body_content %} diff --git a/www.yml b/www.yml index 35840b91..b7f78aa1 100644 --- a/www.yml +++ b/www.yml @@ -28,6 +28,9 @@ langs_full: tr: Türkçe meetingnotes: newsposts: + - page: 2022-08.html + date: 2022-06-26 + title: "Datenschutzfreundliches digitales Bezahlen" - page: 2022-07.html date: 2022-06-21 title: "A digital euro and the future of cash" -- cgit v1.2.3 From 257de016fe0b82bd9ff22ead30111ae801de8334 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 26 Jun 2022 14:16:48 +0200 Subject: -link --- template/press.html.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/template/press.html.j2 b/template/press.html.j2 index 241c5cd5..6688d15b 100644 --- a/template/press.html.j2 +++ b/template/press.html.j2 @@ -2,6 +2,10 @@ {% block body_content %}

    {{ _("GNU Taler in the Press")}}

    +

    {{ _("2022")}}

    +

    {{ _("2021")}}

      -- cgit v1.2.3 From 7d31e2eddbc1a847e8a1b724a21d9e2f46e24244 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 26 Jun 2022 17:04:10 +0200 Subject: draft CBDC news --- template/news/2022-09.html.j2 | 9 +++++++++ www.yml | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 template/news/2022-09.html.j2 diff --git a/template/news/2022-09.html.j2 b/template/news/2022-09.html.j2 new file mode 100644 index 00000000..eb7046e3 --- /dev/null +++ b/template/news/2022-09.html.j2 @@ -0,0 +1,9 @@ +{% extends "common/news.j2" %} +{% block body_content %} +

      2022-07: GNU Taler presentations and demonstration at the CBDC Forum in Frankfurt

      +

      + We will be presenting and demonstrating GNU Taler at the + CBDC Forum in Frankfurt + on August 26th. +

      +{% endblock body_content %} diff --git a/www.yml b/www.yml index b7f78aa1..2bde4f9b 100644 --- a/www.yml +++ b/www.yml @@ -28,6 +28,9 @@ langs_full: tr: Türkçe meetingnotes: newsposts: + - page: 2022-09.html + date: 2022-07-01 + title: "GNU Taler presentations and demonstration at the CBDC Forum in Frankfurt" - page: 2022-08.html date: 2022-06-26 title: "Datenschutzfreundliches digitales Bezahlen" @@ -39,13 +42,13 @@ newsposts: title: "GNU Taler Scalability" - page: 2022-05.html date: 2022-05-25 - title: "Who comes after us? The correct mindset for designing a Central Bank Digital Currency" + title: "Paper: Who comes after us? The correct mindset for designing a Central Bank Digital Currency" - page: 2022-03.html date: 2022-03-11 title: "Central Bank Accounts are Dangerous and Unnecessary: A critique of two papers" - page: 2022-02.html date: 2022-02-21 - title: Adding Schnorr's Blind Signatures to Taler + title: "Adding Schnorr's Blind Signatures to Taler" - page: 2022-01.html date: 2022-02-05 title: Come una banca centrale dovrebbe emettere una moneta digitale -- cgit v1.2.3 From 5ecf693327f7fb05696490fc192d0c5f52033428 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 1 Jul 2022 16:27:56 +0200 Subject: link --- template/press.html.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/template/press.html.j2 b/template/press.html.j2 index 6688d15b..24036829 100644 --- a/template/press.html.j2 +++ b/template/press.html.j2 @@ -9,6 +9,7 @@

      {{ _("2021")}}

        +
      • A digital dollar CBDC may use this privacy preserving design
      • Der GNU-Taler – digitales Bargeld ohne Blockchain
      • Digital money – GNU Taler: The cash of the future can do that
      • GNUプロジェクトの一部として開発されているプライバシー重視の決済サービス
      • -- cgit v1.2.3 From 76b7d04932a0b69c853e64bbb0385d3e4c1e1e3c Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 9 Aug 2022 11:14:08 +0200 Subject: esorics paper published --- static/papers/esorics2022-age-restriction.pdf | Bin 0 -> 415798 bytes template/news/2022-09.html.j2 | 28 ++++++++++++++++++++------ www.yml | 15 ++++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 static/papers/esorics2022-age-restriction.pdf diff --git a/static/papers/esorics2022-age-restriction.pdf b/static/papers/esorics2022-age-restriction.pdf new file mode 100644 index 00000000..03dc4553 Binary files /dev/null and b/static/papers/esorics2022-age-restriction.pdf differ diff --git a/template/news/2022-09.html.j2 b/template/news/2022-09.html.j2 index eb7046e3..27148b0a 100644 --- a/template/news/2022-09.html.j2 +++ b/template/news/2022-09.html.j2 @@ -1,9 +1,25 @@ -{% extends "common/news.j2" %} -{% block body_content %} -

        2022-07: GNU Taler presentations and demonstration at the CBDC Forum in Frankfurt

        +{% extends "common/news.j2" %} {% block body_content %} + +

        2022-9: "Zero-Knowledge Age Restriction for GNU Taler"

        + +

        Abstract

        - We will be presenting and demonstrating GNU Taler at the - CBDC Forum in Frankfurt - on August 26th. + We propose a design for a privacy-friendly method of age restriction in + e-commerce that is aligned with the principle of subsidiarity. The design + is presented as an extension of a privacy-friendly payment protocol with a + zero-knowledge scheme that cryprographically augments coins for this purpose. + Our scheme enables buyers to prove to be of sufficient age for a particular + transaction without disclosing it. Our modification preserves the privacy and + security properties of the payment system such as the anonymity of minors as + buyers as well as unlinkability of transactions. We show how our scheme can be + instantiated with ECDSA as well with a variant of EdDSA, respectively, and how + it can be integrated with the GNU Taler payment system. We provide formal + proofs and implementation of our proposal. Key performance measurements for + various CPU architectures and implementations are presented.

        +

        Download links

        + + {% endblock body_content %} diff --git a/www.yml b/www.yml index 2bde4f9b..7ee0895d 100644 --- a/www.yml +++ b/www.yml @@ -29,8 +29,8 @@ langs_full: meetingnotes: newsposts: - page: 2022-09.html - date: 2022-07-01 - title: "GNU Taler presentations and demonstration at the CBDC Forum in Frankfurt" + date: 2022-08-09 + title: "Zero-Knowledge Age Restriction for GNU Taler" - page: 2022-08.html date: 2022-06-26 title: "Datenschutzfreundliches digitales Bezahlen" @@ -150,6 +150,17 @@ newsposts: title: Launching taler.net videoslist: paperslist: + - year: 2022 + authors: + - Özgür Kesim + - Christian Grothoff + - Florian Dold + - Martin Schanzenbach + name: "Zero-Knowledge Age Restriction for GNU Taler" + kind: article + url: + url_html: + url_pdf: "papers/esorics2022-age-restriction.pdf" - year: 2022 authors: - Martin Summer -- cgit v1.2.3 From cbe90e7fb4a1c9483c430e992a9a14ec9728f89f Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 9 Aug 2022 20:30:18 +0200 Subject: fix --- locale/ar/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/cs/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/de/LC_MESSAGES/messages.po | 28 ++++++++++++++++------------ locale/en/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/es/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/fr/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/hi/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/hu/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/it/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/ja/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/ko/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/messages.pot | 22 +++++++++++++--------- locale/pt/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/pt_BR/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/ru/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/sv/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/tr/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/zh_Hans/LC_MESSAGES/messages.po | 20 ++++++++++++-------- locale/zh_Hant/LC_MESSAGES/messages.po | 20 ++++++++++++-------- www.yml | 3 ++- 20 files changed, 235 insertions(+), 158 deletions(-) diff --git a/locale/ar/LC_MESSAGES/messages.po b/locale/ar/LC_MESSAGES/messages.po index 449014da..8a0118eb 100644 --- a/locale/ar/LC_MESSAGES/messages.po +++ b/locale/ar/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-20 08:21+0200\n" +"POT-Creation-Date: 2022-08-09 20:29+0200\n" "PO-Revision-Date: 2022-03-04 17:02+0000\n" "Last-Translator: Stefan \n" "Language-Team: Arabic \n" "Language-Team: Czech \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -760,8 +760,8 @@ msgstr "" "Hinsicht können sich Taler-Nutzer bei Problemen an die nationale " "Schlichtungsstelle des Landes wenden, in dem der Exchange-Betreiber seinen " "Hauptsitz hat. In Deutschland ist dies die Universalschlichtungsstelle des " -"Bundes in Kehl (Universalschlichtungsstelle des Bundes). Bei einem Hauptsitz des " +"Bundes in Kehl (Universalschlichtungsstelle des Bundes). Bei einem Hauptsitz des " "Exchange-Betreibers in einem Staat der Europäischen Union besteht zudem die " "Möglichkeit, über die Plattform der Europäischen Kommission zur Online-" "Streitbeilegung (ODR) eine " @@ -1512,31 +1512,35 @@ msgstr "" msgid "GNU Taler in the Press" msgstr "GNU Taler in den Medien" -#: template/press.html.j2:6 +#: template/press.html.j2:5 +msgid "2022" +msgstr "" + +#: template/press.html.j2:10 msgid "2021" msgstr "2021" -#: template/press.html.j2:37 +#: template/press.html.j2:42 msgid "2020" msgstr "2020" -#: template/press.html.j2:51 +#: template/press.html.j2:56 msgid "2019" msgstr "2019" -#: template/press.html.j2:57 +#: template/press.html.j2:62 msgid "2018" msgstr "2018" -#: template/press.html.j2:67 +#: template/press.html.j2:72 msgid "2017" msgstr "2017" -#: template/press.html.j2:77 +#: template/press.html.j2:82 msgid "2016" msgstr "2016" -#: template/press.html.j2:95 +#: template/press.html.j2:100 msgid "2015" msgstr "2015" diff --git a/locale/en/LC_MESSAGES/messages.po b/locale/en/LC_MESSAGES/messages.po index 424afc62..262f6971 100644 --- a/locale/en/LC_MESSAGES/messages.po +++ b/locale/en/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-20 08:21+0200\n" +"POT-Creation-Date: 2022-08-09 20:29+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: en \n" @@ -1045,31 +1045,35 @@ msgstr "" msgid "GNU Taler in the Press" msgstr "" -#: template/press.html.j2:6 +#: template/press.html.j2:5 +msgid "2022" +msgstr "" + +#: template/press.html.j2:10 msgid "2021" msgstr "" -#: template/press.html.j2:37 +#: template/press.html.j2:42 msgid "2020" msgstr "" -#: template/press.html.j2:51 +#: template/press.html.j2:56 msgid "2019" msgstr "" -#: template/press.html.j2:57 +#: template/press.html.j2:62 msgid "2018" msgstr "" -#: template/press.html.j2:67 +#: template/press.html.j2:72 msgid "2017" msgstr "" -#: template/press.html.j2:77 +#: template/press.html.j2:82 msgid "2016" msgstr "" -#: template/press.html.j2:95 +#: template/press.html.j2:100 msgid "2015" msgstr "" diff --git a/locale/es/LC_MESSAGES/messages.po b/locale/es/LC_MESSAGES/messages.po index c6a1714d..65afaf52 100644 --- a/locale/es/LC_MESSAGES/messages.po +++ b/locale/es/LC_MESSAGES/messages.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-20 08:21+0200\n" +"POT-Creation-Date: 2022-08-09 20:29+0200\n" "PO-Revision-Date: 2022-02-11 16:47+0000\n" "Last-Translator: Stefan \n" "Language-Team: Spanish \n" "Language-Team: French \n" "Language-Team: Hindi \n" "Language-Team: Hungarian \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: Korean \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.9.1\n" +"Generated-By: Babel 2.8.0\n" #: common/base.j2:5 common/news.j2:5 msgid "GNU Taler" @@ -1060,31 +1060,35 @@ msgstr "" msgid "GNU Taler in the Press" msgstr "" -#: template/press.html.j2:6 +#: template/press.html.j2:5 +msgid "2022" +msgstr "" + +#: template/press.html.j2:10 msgid "2021" msgstr "" -#: template/press.html.j2:37 +#: template/press.html.j2:42 msgid "2020" msgstr "" -#: template/press.html.j2:51 +#: template/press.html.j2:56 msgid "2019" msgstr "" -#: template/press.html.j2:57 +#: template/press.html.j2:62 msgid "2018" msgstr "" -#: template/press.html.j2:67 +#: template/press.html.j2:72 msgid "2017" msgstr "" -#: template/press.html.j2:77 +#: template/press.html.j2:82 msgid "2016" msgstr "" -#: template/press.html.j2:95 +#: template/press.html.j2:100 msgid "2015" msgstr "" diff --git a/locale/pt/LC_MESSAGES/messages.po b/locale/pt/LC_MESSAGES/messages.po index b99ee64f..4177cf2b 100644 --- a/locale/pt/LC_MESSAGES/messages.po +++ b/locale/pt/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: GNU taler master\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2022-04-20 08:21+0200\n" +"POT-Creation-Date: 2022-08-09 20:29+0200\n" "PO-Revision-Date: 2021-03-25 09:18+0000\n" "Last-Translator: Stefan \n" "Language-Team: Portuguese \n" "Language-Team: Portuguese (Brazil) \n" "Language-Team: Russian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) Date: Mon, 29 Aug 2022 00:03:20 -0400 Subject: for wallet, mention source directory https://bugs.gnunet.org/view.php?id=6680 --- template/wallet.html.j2 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/template/wallet.html.j2 b/template/wallet.html.j2 index 1febffae..7997a5d8 100644 --- a/template/wallet.html.j2 +++ b/template/wallet.html.j2 @@ -131,6 +131,14 @@ document.addEventListener('DOMContentLoaded', onLoad); demonstration {% endtrans %} . + {% trans %} + For source, see this + {% endtrans %} + + {% trans %} + directory + {% endtrans %} + .
-- cgit v1.2.3 From f0a6b101b1b474278374bdc21ec98a9ac35acb3a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 11 Sep 2022 11:59:29 +0200 Subject: -fix link --- static/javascript.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/javascript.html b/static/javascript.html index d85654c1..dc872704 100644 --- a/static/javascript.html +++ b/static/javascript.html @@ -3,9 +3,9 @@ - + - +
bootstrap.min.jsbootstrap.min.js Expatbootstrap.jsbootstrap.js
-- cgit v1.2.3 From a8be206eb962cc045a432656f9eb0eed8e837a3d Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 11 Sep 2022 12:21:33 +0200 Subject: fix JS links, migrate to current jquery and bootstrap versions --- common/header.j2.inc | 8 +- locale/ar/LC_MESSAGES/messages.po | 36 +- locale/cs/LC_MESSAGES/messages.po | 36 +- locale/de/LC_MESSAGES/messages.po | 36 +- locale/en/LC_MESSAGES/messages.po | 36 +- locale/es/LC_MESSAGES/messages.po | 36 +- locale/fr/LC_MESSAGES/messages.po | 36 +- locale/hi/LC_MESSAGES/messages.po | 36 +- locale/hu/LC_MESSAGES/messages.po | 36 +- locale/it/LC_MESSAGES/messages.po | 36 +- locale/ja/LC_MESSAGES/messages.po | 36 +- locale/ko/LC_MESSAGES/messages.po | 36 +- locale/messages.pot | 36 +- locale/pt/LC_MESSAGES/messages.po | 36 +- locale/pt_BR/LC_MESSAGES/messages.po | 36 +- locale/ru/LC_MESSAGES/messages.po | 36 +- locale/sv/LC_MESSAGES/messages.po | 36 +- locale/tr/LC_MESSAGES/messages.po | 36 +- locale/zh_Hans/LC_MESSAGES/messages.po | 36 +- locale/zh_Hant/LC_MESSAGES/messages.po | 36 +- static/dist/bootstrap | 1 + static/dist/bootstrap-5.2.1.zip | Bin 0 -> 8919788 bytes static/dist/bootstrap@5.2.1/bootstrap-grid.css | 4124 +++++++ static/dist/bootstrap@5.2.1/bootstrap-grid.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap-grid.min.css | 7 + .../bootstrap@5.2.1/bootstrap-grid.min.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap-grid.rtl.css | 4123 +++++++ .../bootstrap@5.2.1/bootstrap-grid.rtl.css.map | 1 + .../bootstrap@5.2.1/bootstrap-grid.rtl.min.css | 7 + .../bootstrap@5.2.1/bootstrap-grid.rtl.min.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap-reboot.css | 488 + .../dist/bootstrap@5.2.1/bootstrap-reboot.css.map | 1 + .../dist/bootstrap@5.2.1/bootstrap-reboot.min.css | 7 + .../bootstrap@5.2.1/bootstrap-reboot.min.css.map | 1 + .../dist/bootstrap@5.2.1/bootstrap-reboot.rtl.css | 485 + .../bootstrap@5.2.1/bootstrap-reboot.rtl.css.map | 1 + .../bootstrap@5.2.1/bootstrap-reboot.rtl.min.css | 7 + .../bootstrap-reboot.rtl.min.css.map | 1 + .../dist/bootstrap@5.2.1/bootstrap-utilities.css | 4197 +++++++ .../bootstrap@5.2.1/bootstrap-utilities.css.map | 1 + .../bootstrap@5.2.1/bootstrap-utilities.min.css | 7 + .../bootstrap-utilities.min.css.map | 1 + .../bootstrap@5.2.1/bootstrap-utilities.rtl.css | 4188 +++++++ .../bootstrap-utilities.rtl.css.map | 1 + .../bootstrap-utilities.rtl.min.css | 7 + .../bootstrap-utilities.rtl.min.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.bundle.js | 7090 ++++++++++++ .../dist/bootstrap@5.2.1/bootstrap.bundle.js.map | 1 + .../dist/bootstrap@5.2.1/bootstrap.bundle.min.js | 7 + .../bootstrap@5.2.1/bootstrap.bundle.min.js.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.css | 10914 +++++++++++++++++++ static/dist/bootstrap@5.2.1/bootstrap.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.esm.js | 5217 +++++++++ static/dist/bootstrap@5.2.1/bootstrap.esm.js.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.esm.min.js | 7 + .../dist/bootstrap@5.2.1/bootstrap.esm.min.js.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.js | 5264 +++++++++ static/dist/bootstrap@5.2.1/bootstrap.js.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.min.css | 7 + static/dist/bootstrap@5.2.1/bootstrap.min.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.min.js | 7 + static/dist/bootstrap@5.2.1/bootstrap.min.js.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.rtl.css | 10874 ++++++++++++++++++ static/dist/bootstrap@5.2.1/bootstrap.rtl.css.map | 1 + static/dist/bootstrap@5.2.1/bootstrap.rtl.min.css | 7 + .../dist/bootstrap@5.2.1/bootstrap.rtl.min.css.map | 1 + static/dist/jquery/jquery.slim.js | 1 + static/dist/jquery/jquery.slim.min.js | 1 + static/dist/jquery@3.6.1/jquery-3.6.1.slim.js | 8810 +++++++++++++++ static/dist/jquery@3.6.1/jquery-3.6.1.slim.min.js | 2 + static/javascript.html | 9 +- 71 files changed, 66307 insertions(+), 272 deletions(-) create mode 120000 static/dist/bootstrap create mode 100644 static/dist/bootstrap-5.2.1.zip create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.rtl.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.rtl.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.rtl.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-grid.rtl.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.rtl.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.rtl.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.rtl.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-reboot.rtl.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.rtl.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.rtl.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.rtl.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap-utilities.rtl.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.bundle.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.bundle.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.bundle.min.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.bundle.min.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.esm.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.esm.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.esm.min.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.esm.min.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.min.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.min.js create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.min.js.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.rtl.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.rtl.css.map create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.rtl.min.css create mode 100644 static/dist/bootstrap@5.2.1/bootstrap.rtl.min.css.map create mode 120000 static/dist/jquery/jquery.slim.js create mode 120000 static/dist/jquery/jquery.slim.min.js create mode 100644 static/dist/jquery@3.6.1/jquery-3.6.1.slim.js create mode 100644 static/dist/jquery@3.6.1/jquery-3.6.1.slim.min.js diff --git a/common/header.j2.inc b/common/header.j2.inc index 0a630f4d..bd3d7d01 100644 --- a/common/header.j2.inc +++ b/common/header.j2.inc @@ -3,7 +3,7 @@ @licstart The following is the entire license notice for the JavaScript code in this page. - Copyright (C) 2014, 2015, 2016, 2020, 2021 Taler Systems SA + Copyright (C) 2014, 2015, 2016, 2020, 2021, 2022 Taler Systems SA The JavaScript code in this page is free software: you can redistribute it and/or modify it under the terms of the GNU @@ -46,12 +46,12 @@ - + - - + + 'click') + event = event.replace(stripNameRegex, ''); + return customEvents[event] || event; + } + + const EventHandler = { + on(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, false); + }, + + one(element, event, handler, delegationFunction) { + addHandler(element, event, handler, delegationFunction, true); + }, + + off(element, originalTypeEvent, handler, delegationFunction) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + + const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); + const inNamespace = typeEvent !== originalTypeEvent; + const events = getElementEvents(element); + const storeElementEvent = events[typeEvent] || {}; + const isNamespace = originalTypeEvent.startsWith('.'); + + if (typeof callable !== 'undefined') { + // Simplest case: handler is passed, remove that listener ONLY. + if (!Object.keys(storeElementEvent).length) { + return; + } + + removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); + return; + } + + if (isNamespace) { + for (const elementEvent of Object.keys(events)) { + removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); + } + } + + for (const keyHandlers of Object.keys(storeElementEvent)) { + const handlerKey = keyHandlers.replace(stripUidRegex, ''); + + if (!inNamespace || originalTypeEvent.includes(handlerKey)) { + const event = storeElementEvent[keyHandlers]; + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); + } + } + }, + + trigger(element, event, args) { + if (typeof event !== 'string' || !element) { + return null; + } + + const $ = getjQuery(); + const typeEvent = getTypeEvent(event); + const inNamespace = event !== typeEvent; + let jQueryEvent = null; + let bubbles = true; + let nativeDispatch = true; + let defaultPrevented = false; + + if (inNamespace && $) { + jQueryEvent = $.Event(event, args); + $(element).trigger(jQueryEvent); + bubbles = !jQueryEvent.isPropagationStopped(); + nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); + defaultPrevented = jQueryEvent.isDefaultPrevented(); + } + + let evt = new Event(event, { + bubbles, + cancelable: true + }); + evt = hydrateObj(evt, args); + + if (defaultPrevented) { + evt.preventDefault(); + } + + if (nativeDispatch) { + element.dispatchEvent(evt); + } + + if (evt.defaultPrevented && jQueryEvent) { + jQueryEvent.preventDefault(); + } + + return evt; + } + + }; + + function hydrateObj(obj, meta) { + for (const [key, value] of Object.entries(meta || {})) { + try { + obj[key] = value; + } catch (_unused) { + Object.defineProperty(obj, key, { + configurable: true, + + get() { + return value; + } + + }); + } + } + + return obj; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): dom/data.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * Constants + */ + const elementMap = new Map(); + const Data = { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()); + } + + const instanceMap = elementMap.get(element); // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); + return; + } + + instanceMap.set(key, instance); + }, + + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null; + } + + return null; + }, + + remove(element, key) { + if (!elementMap.has(element)) { + return; + } + + const instanceMap = elementMap.get(element); + instanceMap.delete(key); // free up element references if there are no instances left for an element + + if (instanceMap.size === 0) { + elementMap.delete(element); + } + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): dom/manipulator.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + function normalizeData(value) { + if (value === 'true') { + return true; + } + + if (value === 'false') { + return false; + } + + if (value === Number(value).toString()) { + return Number(value); + } + + if (value === '' || value === 'null') { + return null; + } + + if (typeof value !== 'string') { + return value; + } + + try { + return JSON.parse(decodeURIComponent(value)); + } catch (_unused) { + return value; + } + } + + function normalizeDataKey(key) { + return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); + } + + const Manipulator = { + setDataAttribute(element, key, value) { + element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); + }, + + removeDataAttribute(element, key) { + element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); + }, + + getDataAttributes(element) { + if (!element) { + return {}; + } + + const attributes = {}; + const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig')); + + for (const key of bsKeys) { + let pureKey = key.replace(/^bs/, ''); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + attributes[pureKey] = normalizeData(element.dataset[key]); + } + + return attributes; + }, + + getDataAttribute(element, key) { + return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/config.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Class definition + */ + + class Config { + // Getters + static get Default() { + return {}; + } + + static get DefaultType() { + return {}; + } + + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!'); + } + + _getConfig(config) { + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + + this._typeCheckConfig(config); + + return config; + } + + _configAfterMerge(config) { + return config; + } + + _mergeConfigObj(config, element) { + const jsonConfig = isElement$1(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse + + return { ...this.constructor.Default, + ...(typeof jsonConfig === 'object' ? jsonConfig : {}), + ...(isElement$1(element) ? Manipulator.getDataAttributes(element) : {}), + ...(typeof config === 'object' ? config : {}) + }; + } + + _typeCheckConfig(config, configTypes = this.constructor.DefaultType) { + for (const property of Object.keys(configTypes)) { + const expectedTypes = configTypes[property]; + const value = config[property]; + const valueType = isElement$1(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); + } + } + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): base-component.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const VERSION = '5.2.1'; + /** + * Class definition + */ + + class BaseComponent extends Config { + constructor(element, config) { + super(); + element = getElement(element); + + if (!element) { + return; + } + + this._element = element; + this._config = this._getConfig(config); + Data.set(this._element, this.constructor.DATA_KEY, this); + } // Public + + + dispose() { + Data.remove(this._element, this.constructor.DATA_KEY); + EventHandler.off(this._element, this.constructor.EVENT_KEY); + + for (const propertyName of Object.getOwnPropertyNames(this)) { + this[propertyName] = null; + } + } + + _queueCallback(callback, element, isAnimated = true) { + executeAfterTransition(callback, element, isAnimated); + } + + _getConfig(config) { + config = this._mergeConfigObj(config, this._element); + config = this._configAfterMerge(config); + + this._typeCheckConfig(config); + + return config; + } // Static + + + static getInstance(element) { + return Data.get(getElement(element), this.DATA_KEY); + } + + static getOrCreateInstance(element, config = {}) { + return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); + } + + static get VERSION() { + return VERSION; + } + + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + + static eventName(name) { + return `${name}${this.EVENT_KEY}`; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/component-functions.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const enableDismissTrigger = (component, method = 'hide') => { + const clickEvent = `click.dismiss${component.EVENT_KEY}`; + const name = component.NAME; + EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) { + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + if (isDisabled(this)) { + return; + } + + const target = getElementFromSelector(this) || this.closest(`.${name}`); + const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method + + instance[method](); + }); + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): alert.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$f = 'alert'; + const DATA_KEY$a = 'bs.alert'; + const EVENT_KEY$b = `.${DATA_KEY$a}`; + const EVENT_CLOSE = `close${EVENT_KEY$b}`; + const EVENT_CLOSED = `closed${EVENT_KEY$b}`; + const CLASS_NAME_FADE$5 = 'fade'; + const CLASS_NAME_SHOW$8 = 'show'; + /** + * Class definition + */ + + class Alert extends BaseComponent { + // Getters + static get NAME() { + return NAME$f; + } // Public + + + close() { + const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); + + if (closeEvent.defaultPrevented) { + return; + } + + this._element.classList.remove(CLASS_NAME_SHOW$8); + + const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5); + + this._queueCallback(() => this._destroyElement(), this._element, isAnimated); + } // Private + + + _destroyElement() { + this._element.remove(); + + EventHandler.trigger(this._element, EVENT_CLOSED); + this.dispose(); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Alert.getOrCreateInstance(this); + + if (typeof config !== 'string') { + return; + } + + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](this); + }); + } + + } + /** + * Data API implementation + */ + + + enableDismissTrigger(Alert, 'close'); + /** + * jQuery + */ + + defineJQueryPlugin(Alert); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): button.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$e = 'button'; + const DATA_KEY$9 = 'bs.button'; + const EVENT_KEY$a = `.${DATA_KEY$9}`; + const DATA_API_KEY$6 = '.data-api'; + const CLASS_NAME_ACTIVE$3 = 'active'; + const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; + const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`; + /** + * Class definition + */ + + class Button extends BaseComponent { + // Getters + static get NAME() { + return NAME$e; + } // Public + + + toggle() { + // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method + this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Button.getOrCreateInstance(this); + + if (config === 'toggle') { + data[config](); + } + }); + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => { + event.preventDefault(); + const button = event.target.closest(SELECTOR_DATA_TOGGLE$5); + const data = Button.getOrCreateInstance(button); + data.toggle(); + }); + /** + * jQuery + */ + + defineJQueryPlugin(Button); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): dom/selector-engine.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const SelectorEngine = { + find(selector, element = document.documentElement) { + return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); + }, + + findOne(selector, element = document.documentElement) { + return Element.prototype.querySelector.call(element, selector); + }, + + children(element, selector) { + return [].concat(...element.children).filter(child => child.matches(selector)); + }, + + parents(element, selector) { + const parents = []; + let ancestor = element.parentNode.closest(selector); + + while (ancestor) { + parents.push(ancestor); + ancestor = ancestor.parentNode.closest(selector); + } + + return parents; + }, + + prev(element, selector) { + let previous = element.previousElementSibling; + + while (previous) { + if (previous.matches(selector)) { + return [previous]; + } + + previous = previous.previousElementSibling; + } + + return []; + }, + + // TODO: this is now unused; remove later along with prev() + next(element, selector) { + let next = element.nextElementSibling; + + while (next) { + if (next.matches(selector)) { + return [next]; + } + + next = next.nextElementSibling; + } + + return []; + }, + + focusableChildren(element) { + const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(','); + return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)); + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/swipe.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$d = 'swipe'; + const EVENT_KEY$9 = '.bs.swipe'; + const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`; + const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`; + const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`; + const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`; + const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`; + const POINTER_TYPE_TOUCH = 'touch'; + const POINTER_TYPE_PEN = 'pen'; + const CLASS_NAME_POINTER_EVENT = 'pointer-event'; + const SWIPE_THRESHOLD = 40; + const Default$c = { + endCallback: null, + leftCallback: null, + rightCallback: null + }; + const DefaultType$c = { + endCallback: '(function|null)', + leftCallback: '(function|null)', + rightCallback: '(function|null)' + }; + /** + * Class definition + */ + + class Swipe extends Config { + constructor(element, config) { + super(); + this._element = element; + + if (!element || !Swipe.isSupported()) { + return; + } + + this._config = this._getConfig(config); + this._deltaX = 0; + this._supportPointerEvents = Boolean(window.PointerEvent); + + this._initEvents(); + } // Getters + + + static get Default() { + return Default$c; + } + + static get DefaultType() { + return DefaultType$c; + } + + static get NAME() { + return NAME$d; + } // Public + + + dispose() { + EventHandler.off(this._element, EVENT_KEY$9); + } // Private + + + _start(event) { + if (!this._supportPointerEvents) { + this._deltaX = event.touches[0].clientX; + return; + } + + if (this._eventIsPointerPenTouch(event)) { + this._deltaX = event.clientX; + } + } + + _end(event) { + if (this._eventIsPointerPenTouch(event)) { + this._deltaX = event.clientX - this._deltaX; + } + + this._handleSwipe(); + + execute(this._config.endCallback); + } + + _move(event) { + this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX; + } + + _handleSwipe() { + const absDeltaX = Math.abs(this._deltaX); + + if (absDeltaX <= SWIPE_THRESHOLD) { + return; + } + + const direction = absDeltaX / this._deltaX; + this._deltaX = 0; + + if (!direction) { + return; + } + + execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback); + } + + _initEvents() { + if (this._supportPointerEvents) { + EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event)); + EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event)); + + this._element.classList.add(CLASS_NAME_POINTER_EVENT); + } else { + EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event)); + EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event)); + EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event)); + } + } + + _eventIsPointerPenTouch(event) { + return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH); + } // Static + + + static isSupported() { + return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): carousel.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$c = 'carousel'; + const DATA_KEY$8 = 'bs.carousel'; + const EVENT_KEY$8 = `.${DATA_KEY$8}`; + const DATA_API_KEY$5 = '.data-api'; + const ARROW_LEFT_KEY$1 = 'ArrowLeft'; + const ARROW_RIGHT_KEY$1 = 'ArrowRight'; + const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + const ORDER_NEXT = 'next'; + const ORDER_PREV = 'prev'; + const DIRECTION_LEFT = 'left'; + const DIRECTION_RIGHT = 'right'; + const EVENT_SLIDE = `slide${EVENT_KEY$8}`; + const EVENT_SLID = `slid${EVENT_KEY$8}`; + const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`; + const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`; + const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`; + const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`; + const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`; + const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`; + const CLASS_NAME_CAROUSEL = 'carousel'; + const CLASS_NAME_ACTIVE$2 = 'active'; + const CLASS_NAME_SLIDE = 'slide'; + const CLASS_NAME_END = 'carousel-item-end'; + const CLASS_NAME_START = 'carousel-item-start'; + const CLASS_NAME_NEXT = 'carousel-item-next'; + const CLASS_NAME_PREV = 'carousel-item-prev'; + const SELECTOR_ACTIVE = '.active'; + const SELECTOR_ITEM = '.carousel-item'; + const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM; + const SELECTOR_ITEM_IMG = '.carousel-item img'; + const SELECTOR_INDICATORS = '.carousel-indicators'; + const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; + const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; + const KEY_TO_DIRECTION = { + [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT, + [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT + }; + const Default$b = { + interval: 5000, + keyboard: true, + pause: 'hover', + ride: false, + touch: true, + wrap: true + }; + const DefaultType$b = { + interval: '(number|boolean)', + // TODO:v6 remove boolean support + keyboard: 'boolean', + pause: '(string|boolean)', + ride: '(boolean|string)', + touch: 'boolean', + wrap: 'boolean' + }; + /** + * Class definition + */ + + class Carousel extends BaseComponent { + constructor(element, config) { + super(element, config); + this._interval = null; + this._activeElement = null; + this._isSliding = false; + this.touchTimeout = null; + this._swipeHelper = null; + this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); + + this._addEventListeners(); + + if (this._config.ride === CLASS_NAME_CAROUSEL) { + this.cycle(); + } + } // Getters + + + static get Default() { + return Default$b; + } + + static get DefaultType() { + return DefaultType$b; + } + + static get NAME() { + return NAME$c; + } // Public + + + next() { + this._slide(ORDER_NEXT); + } + + nextWhenVisible() { + // FIXME TODO use `document.visibilityState` + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && isVisible(this._element)) { + this.next(); + } + } + + prev() { + this._slide(ORDER_PREV); + } + + pause() { + if (this._isSliding) { + triggerTransitionEnd(this._element); + } + + this._clearInterval(); + } + + cycle() { + this._clearInterval(); + + this._updateInterval(); + + this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval); + } + + _maybeEnableCycle() { + if (!this._config.ride) { + return; + } + + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.cycle()); + return; + } + + this.cycle(); + } + + to(index) { + const items = this._getItems(); + + if (index > items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.to(index)); + return; + } + + const activeIndex = this._getItemIndex(this._getActive()); + + if (activeIndex === index) { + return; + } + + const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; + + this._slide(order, items[index]); + } + + dispose() { + if (this._swipeHelper) { + this._swipeHelper.dispose(); + } + + super.dispose(); + } // Private + + + _configAfterMerge(config) { + config.defaultInterval = config.interval; + return config; + } + + _addEventListeners() { + if (this._config.keyboard) { + EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event)); + } + + if (this._config.pause === 'hover') { + EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause()); + EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle()); + } + + if (this._config.touch && Swipe.isSupported()) { + this._addTouchEventListeners(); + } + } + + _addTouchEventListeners() { + for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) { + EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault()); + } + + const endCallBack = () => { + if (this._config.pause !== 'hover') { + return; + } // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + + + this.pause(); + + if (this.touchTimeout) { + clearTimeout(this.touchTimeout); + } + + this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval); + }; + + const swipeConfig = { + leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)), + rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)), + endCallback: endCallBack + }; + this._swipeHelper = new Swipe(this._element, swipeConfig); + } + + _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + const direction = KEY_TO_DIRECTION[event.key]; + + if (direction) { + event.preventDefault(); + + this._slide(this._directionToOrder(direction)); + } + } + + _getItemIndex(element) { + return this._getItems().indexOf(element); + } + + _setActiveIndicatorElement(index) { + if (!this._indicatorsElement) { + return; + } + + const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement); + activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); + activeIndicator.removeAttribute('aria-current'); + const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement); + + if (newActiveIndicator) { + newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2); + newActiveIndicator.setAttribute('aria-current', 'true'); + } + } + + _updateInterval() { + const element = this._activeElement || this._getActive(); + + if (!element) { + return; + } + + const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); + this._config.interval = elementInterval || this._config.defaultInterval; + } + + _slide(order, element = null) { + if (this._isSliding) { + return; + } + + const activeElement = this._getActive(); + + const isNext = order === ORDER_NEXT; + const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); + + if (nextElement === activeElement) { + return; + } + + const nextElementIndex = this._getItemIndex(nextElement); + + const triggerEvent = eventName => { + return EventHandler.trigger(this._element, eventName, { + relatedTarget: nextElement, + direction: this._orderToDirection(order), + from: this._getItemIndex(activeElement), + to: nextElementIndex + }); + }; + + const slideEvent = triggerEvent(EVENT_SLIDE); + + if (slideEvent.defaultPrevented) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + // todo: change tests that use empty divs to avoid this check + return; + } + + const isCycling = Boolean(this._interval); + this.pause(); + this._isSliding = true; + + this._setActiveIndicatorElement(nextElementIndex); + + this._activeElement = nextElement; + const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; + const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; + nextElement.classList.add(orderClassName); + reflow(nextElement); + activeElement.classList.add(directionalClassName); + nextElement.classList.add(directionalClassName); + + const completeCallBack = () => { + nextElement.classList.remove(directionalClassName, orderClassName); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); + this._isSliding = false; + triggerEvent(EVENT_SLID); + }; + + this._queueCallback(completeCallBack, activeElement, this._isAnimated()); + + if (isCycling) { + this.cycle(); + } + } + + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_SLIDE); + } + + _getActive() { + return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + } + + _getItems() { + return SelectorEngine.find(SELECTOR_ITEM, this._element); + } + + _clearInterval() { + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + } + + _directionToOrder(direction) { + if (isRTL()) { + return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; + } + + return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; + } + + _orderToDirection(order) { + if (isRTL()) { + return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + + return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Carousel.getOrCreateInstance(this, config); + + if (typeof config === 'number') { + data.to(config); + return; + } + + if (typeof config === 'string') { + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) { + const target = getElementFromSelector(this); + + if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { + return; + } + + event.preventDefault(); + const carousel = Carousel.getOrCreateInstance(target); + const slideIndex = this.getAttribute('data-bs-slide-to'); + + if (slideIndex) { + carousel.to(slideIndex); + + carousel._maybeEnableCycle(); + + return; + } + + if (Manipulator.getDataAttribute(this, 'slide') === 'next') { + carousel.next(); + + carousel._maybeEnableCycle(); + + return; + } + + carousel.prev(); + + carousel._maybeEnableCycle(); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => { + const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); + + for (const carousel of carousels) { + Carousel.getOrCreateInstance(carousel); + } + }); + /** + * jQuery + */ + + defineJQueryPlugin(Carousel); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): collapse.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$b = 'collapse'; + const DATA_KEY$7 = 'bs.collapse'; + const EVENT_KEY$7 = `.${DATA_KEY$7}`; + const DATA_API_KEY$4 = '.data-api'; + const EVENT_SHOW$6 = `show${EVENT_KEY$7}`; + const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`; + const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`; + const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`; + const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`; + const CLASS_NAME_SHOW$7 = 'show'; + const CLASS_NAME_COLLAPSE = 'collapse'; + const CLASS_NAME_COLLAPSING = 'collapsing'; + const CLASS_NAME_COLLAPSED = 'collapsed'; + const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; + const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; + const WIDTH = 'width'; + const HEIGHT = 'height'; + const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; + const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; + const Default$a = { + parent: null, + toggle: true + }; + const DefaultType$a = { + parent: '(null|element)', + toggle: 'boolean' + }; + /** + * Class definition + */ + + class Collapse extends BaseComponent { + constructor(element, config) { + super(element, config); + this._isTransitioning = false; + this._triggerArray = []; + const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); + + for (const elem of toggleList) { + const selector = getSelectorFromElement(elem); + const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element); + + if (selector !== null && filterElement.length) { + this._triggerArray.push(elem); + } + } + + this._initializeChildren(); + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + static get Default() { + return Default$a; + } + + static get DefaultType() { + return DefaultType$a; + } + + static get NAME() { + return NAME$b; + } // Public + + + toggle() { + if (this._isShown()) { + this.hide(); + } else { + this.show(); + } + } + + show() { + if (this._isTransitioning || this._isShown()) { + return; + } + + let activeChildren = []; // find active children + + if (this._config.parent) { + activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, { + toggle: false + })); + } + + if (activeChildren.length && activeChildren[0]._isTransitioning) { + return; + } + + const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6); + + if (startEvent.defaultPrevented) { + return; + } + + for (const activeInstance of activeChildren) { + activeInstance.hide(); + } + + const dimension = this._getDimension(); + + this._element.classList.remove(CLASS_NAME_COLLAPSE); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.style[dimension] = 0; + + this._addAriaAndCollapsedClass(this._triggerArray, true); + + this._isTransitioning = true; + + const complete = () => { + this._isTransitioning = false; + + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + + this._element.style[dimension] = ''; + EventHandler.trigger(this._element, EVENT_SHOWN$6); + }; + + const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + const scrollSize = `scroll${capitalizedDimension}`; + + this._queueCallback(complete, this._element, true); + + this._element.style[dimension] = `${this._element[scrollSize]}px`; + } + + hide() { + if (this._isTransitioning || !this._isShown()) { + return; + } + + const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6); + + if (startEvent.defaultPrevented) { + return; + } + + const dimension = this._getDimension(); + + this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; + reflow(this._element); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7); + + for (const trigger of this._triggerArray) { + const element = getElementFromSelector(trigger); + + if (element && !this._isShown(element)) { + this._addAriaAndCollapsedClass([trigger], false); + } + } + + this._isTransitioning = true; + + const complete = () => { + this._isTransitioning = false; + + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE); + + EventHandler.trigger(this._element, EVENT_HIDDEN$6); + }; + + this._element.style[dimension] = ''; + + this._queueCallback(complete, this._element, true); + } + + _isShown(element = this._element) { + return element.classList.contains(CLASS_NAME_SHOW$7); + } // Private + + + _configAfterMerge(config) { + config.toggle = Boolean(config.toggle); // Coerce string values + + config.parent = getElement(config.parent); + return config; + } + + _getDimension() { + return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; + } + + _initializeChildren() { + if (!this._config.parent) { + return; + } + + const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4); + + for (const element of children) { + const selected = getElementFromSelector(element); + + if (selected) { + this._addAriaAndCollapsedClass([element], this._isShown(selected)); + } + } + } + + _getFirstLevelChildren(selector) { + const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth + + return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element)); + } + + _addAriaAndCollapsedClass(triggerArray, isOpen) { + if (!triggerArray.length) { + return; + } + + for (const element of triggerArray) { + element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); + element.setAttribute('aria-expanded', isOpen); + } + } // Static + + + static jQueryInterface(config) { + const _config = {}; + + if (typeof config === 'string' && /show|hide/.test(config)) { + _config.toggle = false; + } + + return this.each(function () { + const data = Collapse.getOrCreateInstance(this, _config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { + event.preventDefault(); + } + + const selector = getSelectorFromElement(this); + const selectorElements = SelectorEngine.find(selector); + + for (const element of selectorElements) { + Collapse.getOrCreateInstance(element, { + toggle: false + }).toggle(); + } + }); + /** + * jQuery + */ + + defineJQueryPlugin(Collapse); + + var top = 'top'; + var bottom = 'bottom'; + var right = 'right'; + var left = 'left'; + var auto = 'auto'; + var basePlacements = [top, bottom, right, left]; + var start = 'start'; + var end = 'end'; + var clippingParents = 'clippingParents'; + var viewport = 'viewport'; + var popper = 'popper'; + var reference = 'reference'; + var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); + }, []); + var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); + }, []); // modifiers that need to read the DOM + + var beforeRead = 'beforeRead'; + var read = 'read'; + var afterRead = 'afterRead'; // pure-logic modifiers + + var beforeMain = 'beforeMain'; + var main = 'main'; + var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + + var beforeWrite = 'beforeWrite'; + var write = 'write'; + var afterWrite = 'afterWrite'; + var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + + function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; + } + + function getWindow(node) { + if (node == null) { + return window; + } + + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + + return node; + } + + function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; + } + + function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; + } + + function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } + + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; + } + + // and applies them to the HTMLElements such as popper and arrow + + function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] + + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; + + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); + } + + function effect$2(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); + }); + }; + } // eslint-disable-next-line import/no-unused-modules + + + const applyStyles$1 = { + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: effect$2, + requires: ['computeStyles'] + }; + + function getBasePlacement(placement) { + return placement.split('-')[0]; + } + + var max = Math.max; + var min = Math.min; + var round = Math.round; + + function getUAString() { + var uaData = navigator.userAgentData; + + if (uaData != null && uaData.brands) { + return uaData.brands.map(function (item) { + return item.brand + "/" + item.version; + }).join(' '); + } + + return navigator.userAgent; + } + + function isLayoutViewport() { + return !/^((?!chrome|android).)*safari/i.test(getUAString()); + } + + function getBoundingClientRect(element, includeScale, isFixedStrategy) { + if (includeScale === void 0) { + includeScale = false; + } + + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + + var clientRect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + + if (includeScale && isHTMLElement(element)) { + scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1; + scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1; + } + + var _ref = isElement(element) ? getWindow(element) : window, + visualViewport = _ref.visualViewport; + + var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; + var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; + var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var width = clientRect.width / scaleX; + var height = clientRect.height / scaleY; + return { + width: width, + height: height, + top: y, + right: x + width, + bottom: y + height, + left: x, + x: x, + y: y + }; + } + + // means it doesn't take into account transforms. + + function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; + } + + function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; + } + + function getComputedStyle$1(element) { + return getWindow(element).getComputedStyle(element); + } + + function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; + } + + function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; + } + + function getParentNode(element) { + if (getNodeName(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) // fallback + + ); + } + + function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle$1(element).position === 'fixed') { + return null; + } + + return element.offsetParent; + } // `.offsetParent` reports `null` for fixed elements, while absolute elements + // return the containing block + + + function getContainingBlock(element) { + var isFirefox = /firefox/i.test(getUAString()); + var isIE = /Trident/i.test(getUAString()); + + if (isIE && isHTMLElement(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = getComputedStyle$1(element); + + if (elementCss.position === 'fixed') { + return null; + } + } + + var currentNode = getParentNode(element); + + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + + while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + + return null; + } // Gets the closest ancestor positioned element. Handles some edge cases, + // such as table ancestors and cross browser bugs. + + + function getOffsetParent(element) { + var window = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; + } + + function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; + } + + function within(min$1, value, max$1) { + return max(min$1, min(value, max$1)); + } + function withinMaxClamp(min, value, max) { + var v = within(min, value, max); + return v > max ? max : v; + } + + function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; + } + + function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); + } + + function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); + } + + var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + }; + + function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === 'y' ? top : left; + var maxProp = axis === 'y' ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = within(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); + } + + function effect$1(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (!contains(state.elements.popper, arrowElement)) { + + return; + } + + state.elements.arrow = arrowElement; + } // eslint-disable-next-line import/no-unused-modules + + + const arrow$1 = { + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect$1, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] + }; + + function getVariation(placement) { + return placement.split('-')[1]; + } + + var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' + }; // Round the offsets to the nearest suitable subpixel based on the DPR. + // Zooming can change the DPR, but it seems to report a value that will + // cleanly divide the values into the appropriate subpixels. + + function roundOffsetsByDPR(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; + } + + function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + variation = _ref2.variation, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets, + isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, + x = _offsets$x === void 0 ? 0 : _offsets$x, + _offsets$y = offsets.y, + y = _offsets$y === void 0 ? 0 : _offsets$y; + + var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ + x: x, + y: y + }) : { + x: x, + y: y + }; + + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = left; + var sideY = top; + var win = window; + + if (adaptive) { + var offsetParent = getOffsetParent(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === getWindow(popper)) { + offsetParent = getDocumentElement(popper); + + if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] + offsetParent[heightProp]; + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] + offsetParent[widthProp]; + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x: x, + y: y + }) : { + x: x, + y: y + }; + + x = _ref4.x; + y = _ref4.y; + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); + } + + function computeStyles(_ref5) { + var state = _ref5.state, + options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration, + isFixed: state.options.strategy === 'fixed' + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const computeStyles$1 = { + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} + }; + + var passive = { + passive: true + }; + + function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; + } // eslint-disable-next-line import/no-unused-modules + + + const eventListeners = { + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} + }; + + var hash$1 = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' + }; + function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash$1[matched]; + }); + } + + var hash = { + start: 'end', + end: 'start' + }; + function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); + } + + function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; + } + + function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; + } + + function getViewportRect(element, strategy) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + var layoutViewport = isLayoutViewport(); + + if (layoutViewport || !layoutViewport && strategy === 'fixed') { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + + return { + width: width, + height: height, + x: x + getWindowScrollBarX(element), + y: y + }; + } + + // of the `` and `` rect bounds if horizontally scrollable + + function getDocumentRect(element) { + var _element$ownerDocumen; + + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + + if (getComputedStyle$1(body || html).direction === 'rtl') { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + + return { + width: width, + height: height, + x: x, + y: y + }; + } + + function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = getComputedStyle$1(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); + } + + function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + + return getScrollParent(getParentNode(node)); + } + + /* + given a DOM element, return the list of all scroll parents, up the list of ancesors + until we get to the top window object. This list is what we attach scroll listeners + to, because if any of these parent elements scroll, we'll need to re-calculate the + reference element's position. + */ + + function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))); + } + + function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); + } + + function getInnerBoundingClientRect(element, strategy) { + var rect = getBoundingClientRect(element, false, strategy === 'fixed'); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; + } + + function getClientRectFromMixedType(element, clippingParent, strategy) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); + } // A "clipping parent" is an overflowable container with the characteristic of + // clipping (or hiding) overflowing elements with a position different from + // `initial` + + + function getClippingParents(element) { + var clippingParents = listScrollParents(getParentNode(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + + if (!isElement(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; + }); + } // Gets the maximum area that the element is visible in due to any number of + // clipping parents + + + function getClippingRect(element, boundary, rootBoundary, strategy) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent, strategy); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent, strategy)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; + } + + function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case bottom: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case right: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case left: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + } + } + + return offsets; + } + + function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$strategy = _options.strategy, + strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === popper && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; + } + + function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { + return getVariation(placement) === variation; + }) : basePlacements; + var allowedPlacements = placements$1.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements$1; + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[getBasePlacement(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); + } + + function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; + } + + function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = getBasePlacement(placement); + + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } + } // eslint-disable-next-line import/no-unused-modules + + + const flip$1 = { + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } + }; + + function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; + } + + function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function (side) { + return overflow[side] >= 0; + }); + } + + function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: 'reference' + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); + } // eslint-disable-next-line import/no-unused-modules + + + const hide$1 = { + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide + }; + + function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; + } + + function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const offset$1 = { + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset + }; + + function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); + } // eslint-disable-next-line import/no-unused-modules + + + const popperOffsets$1 = { + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} + }; + + function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; + } + + function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis) { + var _offsetModifierState$; + + var mainSide = mainAxis === 'y' ? top : left; + var altSide = mainAxis === 'y' ? bottom : right; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min$1 = offset + overflow[mainSide]; + var max$1 = offset - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _offsetModifierState$2; + + var _mainSide = mainAxis === 'x' ? top : left; + + var _altSide = mainAxis === 'x' ? bottom : right; + + var _offset = popperOffsets[altAxis]; + + var _len = altAxis === 'y' ? 'height' : 'width'; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + + state.modifiersData[name] = data; + } // eslint-disable-next-line import/no-unused-modules + + + const preventOverflow$1 = { + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] + }; + + function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + + function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } + } + + function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; + } // Returns the composite rect of an element relative to its offsetParent. + // Composite means it takes into account transforms as well as layout. + + + function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; + } + + function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; + } + + function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return modifierPhases.reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); + } + + function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; + } + + function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); + } + + var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' + }; + + function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); + } + + function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(setOptionsAction) { + var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], + popper: listScrollParents(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), + popper: getLayoutRect(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + + for (var index = 0; index < state.orderedModifiers.length; index++) { + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; + } + var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; + var createPopper$1 = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers$1 + }); // eslint-disable-next-line import/no-unused-modules + + var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; + var createPopper = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers + }); // eslint-disable-next-line import/no-unused-modules + + const Popper = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ + __proto__: null, + popperGenerator, + detectOverflow, + createPopperBase: createPopper$2, + createPopper, + createPopperLite: createPopper$1, + top, + bottom, + right, + left, + auto, + basePlacements, + start, + end, + clippingParents, + viewport, + popper, + reference, + variationPlacements, + placements, + beforeRead, + read, + afterRead, + beforeMain, + main, + afterMain, + beforeWrite, + write, + afterWrite, + modifierPhases, + applyStyles: applyStyles$1, + arrow: arrow$1, + computeStyles: computeStyles$1, + eventListeners, + flip: flip$1, + hide: hide$1, + offset: offset$1, + popperOffsets: popperOffsets$1, + preventOverflow: preventOverflow$1 + }, Symbol.toStringTag, { value: 'Module' })); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): dropdown.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$a = 'dropdown'; + const DATA_KEY$6 = 'bs.dropdown'; + const EVENT_KEY$6 = `.${DATA_KEY$6}`; + const DATA_API_KEY$3 = '.data-api'; + const ESCAPE_KEY$2 = 'Escape'; + const TAB_KEY$1 = 'Tab'; + const ARROW_UP_KEY$1 = 'ArrowUp'; + const ARROW_DOWN_KEY$1 = 'ArrowDown'; + const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button + + const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`; + const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`; + const EVENT_SHOW$5 = `show${EVENT_KEY$6}`; + const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`; + const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`; + const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`; + const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`; + const CLASS_NAME_SHOW$6 = 'show'; + const CLASS_NAME_DROPUP = 'dropup'; + const CLASS_NAME_DROPEND = 'dropend'; + const CLASS_NAME_DROPSTART = 'dropstart'; + const CLASS_NAME_DROPUP_CENTER = 'dropup-center'; + const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; + const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; + const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`; + const SELECTOR_MENU = '.dropdown-menu'; + const SELECTOR_NAVBAR = '.navbar'; + const SELECTOR_NAVBAR_NAV = '.navbar-nav'; + const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; + const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'; + const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'; + const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'; + const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'; + const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'; + const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'; + const PLACEMENT_TOPCENTER = 'top'; + const PLACEMENT_BOTTOMCENTER = 'bottom'; + const Default$9 = { + autoClose: true, + boundary: 'clippingParents', + display: 'dynamic', + offset: [0, 2], + popperConfig: null, + reference: 'toggle' + }; + const DefaultType$9 = { + autoClose: '(boolean|string)', + boundary: '(string|element)', + display: 'string', + offset: '(array|string|function)', + popperConfig: '(null|object|function)', + reference: '(string|element|object)' + }; + /** + * Class definition + */ + + class Dropdown extends BaseComponent { + constructor(element, config) { + super(element, config); + this._popper = null; + this._parent = this._element.parentNode; // dropdown wrapper + // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ + + this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0]; + this._inNavbar = this._detectNavbar(); + } // Getters + + + static get Default() { + return Default$9; + } + + static get DefaultType() { + return DefaultType$9; + } + + static get NAME() { + return NAME$a; + } // Public + + + toggle() { + return this._isShown() ? this.hide() : this.show(); + } + + show() { + if (isDisabled(this._element) || this._isShown()) { + return; + } + + const relatedTarget = { + relatedTarget: this._element + }; + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget); + + if (showEvent.defaultPrevented) { + return; + } + + this._createPopper(); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) { + for (const element of [].concat(...document.body.children)) { + EventHandler.on(element, 'mouseover', noop); + } + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + this._menu.classList.add(CLASS_NAME_SHOW$6); + + this._element.classList.add(CLASS_NAME_SHOW$6); + + EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget); + } + + hide() { + if (isDisabled(this._element) || !this._isShown()) { + return; + } + + const relatedTarget = { + relatedTarget: this._element + }; + + this._completeHide(relatedTarget); + } + + dispose() { + if (this._popper) { + this._popper.destroy(); + } + + super.dispose(); + } + + update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper) { + this._popper.update(); + } + } // Private + + + _completeHide(relatedTarget) { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget); + + if (hideEvent.defaultPrevented) { + return; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.off(element, 'mouseover', noop); + } + } + + if (this._popper) { + this._popper.destroy(); + } + + this._menu.classList.remove(CLASS_NAME_SHOW$6); + + this._element.classList.remove(CLASS_NAME_SHOW$6); + + this._element.setAttribute('aria-expanded', 'false'); + + Manipulator.removeDataAttribute(this._menu, 'popper'); + EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget); + } + + _getConfig(config) { + config = super._getConfig(config); + + if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { + // Popper virtual elements require a getBoundingClientRect method + throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + } + + return config; + } + + _createPopper() { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + } + + let referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = this._parent; + } else if (isElement$1(this._config.reference)) { + referenceElement = getElement(this._config.reference); + } else if (typeof this._config.reference === 'object') { + referenceElement = this._config.reference; + } + + const popperConfig = this._getPopperConfig(); + + this._popper = createPopper(referenceElement, this._menu, popperConfig); + } + + _isShown() { + return this._menu.classList.contains(CLASS_NAME_SHOW$6); + } + + _getPlacement() { + const parentDropdown = this._parent; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { + return PLACEMENT_RIGHT; + } + + if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { + return PLACEMENT_LEFT; + } + + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { + return PLACEMENT_TOPCENTER; + } + + if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { + return PLACEMENT_BOTTOMCENTER; + } // We need to trim the value because custom properties can also include spaces + + + const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { + return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; + } + + return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; + } + + _detectNavbar() { + return this._element.closest(SELECTOR_NAVBAR) !== null; + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(value => Number.parseInt(value, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _getPopperConfig() { + const defaultBsPopperConfig = { + placement: this._getPlacement(), + modifiers: [{ + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }] + }; // Disable Popper if we have a static display or Dropdown is in Navbar + + if (this._inNavbar || this._config.display === 'static') { + Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove + + defaultBsPopperConfig.modifiers = [{ + name: 'applyStyles', + enabled: false + }]; + } + + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _selectMenuItem({ + key, + target + }) { + const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element)); + + if (!items.length) { + return; + } // if target isn't included in items (e.g. when expanding the dropdown) + // allow cycling to get the last item in case key equals ARROW_UP_KEY + + + getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus(); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Dropdown.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + }); + } + + static clearMenus(event) { + if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) { + return; + } + + const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); + + for (const toggle of openToggles) { + const context = Dropdown.getInstance(toggle); + + if (!context || context._config.autoClose === false) { + continue; + } + + const composedPath = event.composedPath(); + const isMenuTarget = composedPath.includes(context._menu); + + if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { + continue; + } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu + + + if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) { + continue; + } + + const relatedTarget = { + relatedTarget: context._element + }; + + if (event.type === 'click') { + relatedTarget.clickEvent = event; + } + + context._completeHide(relatedTarget); + } + } + + static dataApiKeydownHandler(event) { + // If not an UP | DOWN | ESCAPE key => not a dropdown command + // If input/textarea && if key is other than ESCAPE => not a dropdown command + const isInput = /input|textarea/i.test(event.target.tagName); + const isEscapeEvent = event.key === ESCAPE_KEY$2; + const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key); + + if (!isUpOrDownEvent && !isEscapeEvent) { + return; + } + + if (isInput && !isEscapeEvent) { + return; + } + + event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ + + const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0]; + const instance = Dropdown.getOrCreateInstance(getToggleButton); + + if (isUpOrDownEvent) { + event.stopPropagation(); + instance.show(); + + instance._selectMenuItem(event); + + return; + } + + if (instance._isShown()) { + // else is escape and we check if it is shown + event.stopPropagation(); + instance.hide(); + getToggleButton.focus(); + } + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); + EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { + event.preventDefault(); + Dropdown.getOrCreateInstance(this).toggle(); + }); + /** + * jQuery + */ + + defineJQueryPlugin(Dropdown); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/scrollBar.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; + const SELECTOR_STICKY_CONTENT = '.sticky-top'; + const PROPERTY_PADDING = 'padding-right'; + const PROPERTY_MARGIN = 'margin-right'; + /** + * Class definition + */ + + class ScrollBarHelper { + constructor() { + this._element = document.body; + } // Public + + + getWidth() { + // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes + const documentWidth = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - documentWidth); + } + + hide() { + const width = this.getWidth(); + + this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width + + + this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth + + + this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width); + + this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width); + } + + reset() { + this._resetElementAttributes(this._element, 'overflow'); + + this._resetElementAttributes(this._element, PROPERTY_PADDING); + + this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING); + + this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN); + } + + isOverflowing() { + return this.getWidth() > 0; + } // Private + + + _disableOverFlow() { + this._saveInitialAttribute(this._element, 'overflow'); + + this._element.style.overflow = 'hidden'; + } + + _setElementAttributes(selector, styleProperty, callback) { + const scrollbarWidth = this.getWidth(); + + const manipulationCallBack = element => { + if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { + return; + } + + this._saveInitialAttribute(element, styleProperty); + + const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty); + element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`); + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + _saveInitialAttribute(element, styleProperty) { + const actualValue = element.style.getPropertyValue(styleProperty); + + if (actualValue) { + Manipulator.setDataAttribute(element, styleProperty, actualValue); + } + } + + _resetElementAttributes(selector, styleProperty) { + const manipulationCallBack = element => { + const value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero + + if (value === null) { + element.style.removeProperty(styleProperty); + return; + } + + Manipulator.removeDataAttribute(element, styleProperty); + element.style.setProperty(styleProperty, value); + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + _applyManipulationCallback(selector, callBack) { + if (isElement$1(selector)) { + callBack(selector); + return; + } + + for (const sel of SelectorEngine.find(selector, this._element)) { + callBack(sel); + } + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/backdrop.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$9 = 'backdrop'; + const CLASS_NAME_FADE$4 = 'fade'; + const CLASS_NAME_SHOW$5 = 'show'; + const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`; + const Default$8 = { + className: 'modal-backdrop', + clickCallback: null, + isAnimated: false, + isVisible: true, + // if false, we use the backdrop helper without adding any element to the dom + rootElement: 'body' // give the choice to place backdrop under different elements + + }; + const DefaultType$8 = { + className: 'string', + clickCallback: '(function|null)', + isAnimated: 'boolean', + isVisible: 'boolean', + rootElement: '(element|string)' + }; + /** + * Class definition + */ + + class Backdrop extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + this._isAppended = false; + this._element = null; + } // Getters + + + static get Default() { + return Default$8; + } + + static get DefaultType() { + return DefaultType$8; + } + + static get NAME() { + return NAME$9; + } // Public + + + show(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._append(); + + const element = this._getElement(); + + if (this._config.isAnimated) { + reflow(element); + } + + element.classList.add(CLASS_NAME_SHOW$5); + + this._emulateAnimation(() => { + execute(callback); + }); + } + + hide(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._getElement().classList.remove(CLASS_NAME_SHOW$5); + + this._emulateAnimation(() => { + this.dispose(); + execute(callback); + }); + } + + dispose() { + if (!this._isAppended) { + return; + } + + EventHandler.off(this._element, EVENT_MOUSEDOWN); + + this._element.remove(); + + this._isAppended = false; + } // Private + + + _getElement() { + if (!this._element) { + const backdrop = document.createElement('div'); + backdrop.className = this._config.className; + + if (this._config.isAnimated) { + backdrop.classList.add(CLASS_NAME_FADE$4); + } + + this._element = backdrop; + } + + return this._element; + } + + _configAfterMerge(config) { + // use getElement() with the default "body" to get a fresh Element on each instantiation + config.rootElement = getElement(config.rootElement); + return config; + } + + _append() { + if (this._isAppended) { + return; + } + + const element = this._getElement(); + + this._config.rootElement.append(element); + + EventHandler.on(element, EVENT_MOUSEDOWN, () => { + execute(this._config.clickCallback); + }); + this._isAppended = true; + } + + _emulateAnimation(callback) { + executeAfterTransition(callback, this._getElement(), this._config.isAnimated); + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/focustrap.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$8 = 'focustrap'; + const DATA_KEY$5 = 'bs.focustrap'; + const EVENT_KEY$5 = `.${DATA_KEY$5}`; + const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`; + const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`; + const TAB_KEY = 'Tab'; + const TAB_NAV_FORWARD = 'forward'; + const TAB_NAV_BACKWARD = 'backward'; + const Default$7 = { + autofocus: true, + trapElement: null // The element to trap focus inside of + + }; + const DefaultType$7 = { + autofocus: 'boolean', + trapElement: 'element' + }; + /** + * Class definition + */ + + class FocusTrap extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + this._isActive = false; + this._lastTabNavDirection = null; + } // Getters + + + static get Default() { + return Default$7; + } + + static get DefaultType() { + return DefaultType$7; + } + + static get NAME() { + return NAME$8; + } // Public + + + activate() { + if (this._isActive) { + return; + } + + if (this._config.autofocus) { + this._config.trapElement.focus(); + } + + EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop + + EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event)); + EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event)); + this._isActive = true; + } + + deactivate() { + if (!this._isActive) { + return; + } + + this._isActive = false; + EventHandler.off(document, EVENT_KEY$5); + } // Private + + + _handleFocusin(event) { + const { + trapElement + } = this._config; + + if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) { + return; + } + + const elements = SelectorEngine.focusableChildren(trapElement); + + if (elements.length === 0) { + trapElement.focus(); + } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { + elements[elements.length - 1].focus(); + } else { + elements[0].focus(); + } + } + + _handleKeydown(event) { + if (event.key !== TAB_KEY) { + return; + } + + this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): modal.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$7 = 'modal'; + const DATA_KEY$4 = 'bs.modal'; + const EVENT_KEY$4 = `.${DATA_KEY$4}`; + const DATA_API_KEY$2 = '.data-api'; + const ESCAPE_KEY$1 = 'Escape'; + const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`; + const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`; + const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`; + const EVENT_SHOW$4 = `show${EVENT_KEY$4}`; + const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`; + const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`; + const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`; + const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`; + const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`; + const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`; + const CLASS_NAME_OPEN = 'modal-open'; + const CLASS_NAME_FADE$3 = 'fade'; + const CLASS_NAME_SHOW$4 = 'show'; + const CLASS_NAME_STATIC = 'modal-static'; + const OPEN_SELECTOR$1 = '.modal.show'; + const SELECTOR_DIALOG = '.modal-dialog'; + const SELECTOR_MODAL_BODY = '.modal-body'; + const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; + const Default$6 = { + backdrop: true, + focus: true, + keyboard: true + }; + const DefaultType$6 = { + backdrop: '(boolean|string)', + focus: 'boolean', + keyboard: 'boolean' + }; + /** + * Class definition + */ + + class Modal extends BaseComponent { + constructor(element, config) { + super(element, config); + this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + this._isShown = false; + this._isTransitioning = false; + this._scrollBar = new ScrollBarHelper(); + + this._addEventListeners(); + } // Getters + + + static get Default() { + return Default$6; + } + + static get DefaultType() { + return DefaultType$6; + } + + static get NAME() { + return NAME$7; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown || this._isTransitioning) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + this._isTransitioning = true; + + this._scrollBar.hide(); + + document.body.classList.add(CLASS_NAME_OPEN); + + this._adjustDialog(); + + this._backdrop.show(() => this._showElement(relatedTarget)); + } + + hide() { + if (!this._isShown || this._isTransitioning) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4); + + if (hideEvent.defaultPrevented) { + return; + } + + this._isShown = false; + this._isTransitioning = true; + + this._focustrap.deactivate(); + + this._element.classList.remove(CLASS_NAME_SHOW$4); + + this._queueCallback(() => this._hideModal(), this._element, this._isAnimated()); + } + + dispose() { + for (const htmlElement of [window, this._dialog]) { + EventHandler.off(htmlElement, EVENT_KEY$4); + } + + this._backdrop.dispose(); + + this._focustrap.deactivate(); + + super.dispose(); + } + + handleUpdate() { + this._adjustDialog(); + } // Private + + + _initializeBackDrop() { + return new Backdrop({ + isVisible: Boolean(this._config.backdrop), + // 'static' option will be translated to true, and booleans will keep their value, + isAnimated: this._isAnimated() + }); + } + + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + + _showElement(relatedTarget) { + // try to append dynamic modal + if (!document.body.contains(this._element)) { + document.body.append(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.scrollTop = 0; + const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); + + if (modalBody) { + modalBody.scrollTop = 0; + } + + reflow(this._element); + + this._element.classList.add(CLASS_NAME_SHOW$4); + + const transitionComplete = () => { + if (this._config.focus) { + this._focustrap.activate(); + } + + this._isTransitioning = false; + EventHandler.trigger(this._element, EVENT_SHOWN$4, { + relatedTarget + }); + }; + + this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); + } + + _addEventListeners() { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => { + if (event.key !== ESCAPE_KEY$1) { + return; + } + + if (this._config.keyboard) { + event.preventDefault(); + this.hide(); + return; + } + + this._triggerBackdropTransition(); + }); + EventHandler.on(window, EVENT_RESIZE$1, () => { + if (this._isShown && !this._isTransitioning) { + this._adjustDialog(); + } + }); + EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => { + EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => { + // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks + if (this._dialog.contains(event.target) || this._dialog.contains(event2.target)) { + return; + } + + if (this._config.backdrop === 'static') { + this._triggerBackdropTransition(); + + return; + } + + if (this._config.backdrop) { + this.hide(); + } + }); + }); + } + + _hideModal() { + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._isTransitioning = false; + + this._backdrop.hide(() => { + document.body.classList.remove(CLASS_NAME_OPEN); + + this._resetAdjustments(); + + this._scrollBar.reset(); + + EventHandler.trigger(this._element, EVENT_HIDDEN$4); + }); + } + + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_FADE$3); + } + + _triggerBackdropTransition() { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1); + + if (hideEvent.defaultPrevented) { + return; + } + + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed + + if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) { + return; + } + + if (!isModalOverflowing) { + this._element.style.overflowY = 'hidden'; + } + + this._element.classList.add(CLASS_NAME_STATIC); + + this._queueCallback(() => { + this._element.classList.remove(CLASS_NAME_STATIC); + + this._queueCallback(() => { + this._element.style.overflowY = initialOverflowY; + }, this._dialog); + }, this._dialog); + + this._element.focus(); + } + /** + * The following methods are used to handle overflowing modals + */ + + + _adjustDialog() { + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + const scrollbarWidth = this._scrollBar.getWidth(); + + const isBodyOverflowing = scrollbarWidth > 0; + + if (isBodyOverflowing && !isModalOverflowing) { + const property = isRTL() ? 'paddingLeft' : 'paddingRight'; + this._element.style[property] = `${scrollbarWidth}px`; + } + + if (!isBodyOverflowing && isModalOverflowing) { + const property = isRTL() ? 'paddingRight' : 'paddingLeft'; + this._element.style[property] = `${scrollbarWidth}px`; + } + } + + _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + } // Static + + + static jQueryInterface(config, relatedTarget) { + return this.each(function () { + const data = Modal.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](relatedTarget); + }); + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + EventHandler.one(target, EVENT_SHOW$4, showEvent => { + if (showEvent.defaultPrevented) { + // only register focus restorer if modal will actually get shown + return; + } + + EventHandler.one(target, EVENT_HIDDEN$4, () => { + if (isVisible(this)) { + this.focus(); + } + }); + }); // avoid conflict when clicking modal toggler while another one is open + + const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1); + + if (alreadyOpen) { + Modal.getInstance(alreadyOpen).hide(); + } + + const data = Modal.getOrCreateInstance(target); + data.toggle(this); + }); + enableDismissTrigger(Modal); + /** + * jQuery + */ + + defineJQueryPlugin(Modal); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): offcanvas.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$6 = 'offcanvas'; + const DATA_KEY$3 = 'bs.offcanvas'; + const EVENT_KEY$3 = `.${DATA_KEY$3}`; + const DATA_API_KEY$1 = '.data-api'; + const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`; + const ESCAPE_KEY = 'Escape'; + const CLASS_NAME_SHOW$3 = 'show'; + const CLASS_NAME_SHOWING$1 = 'showing'; + const CLASS_NAME_HIDING = 'hiding'; + const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; + const OPEN_SELECTOR = '.offcanvas.show'; + const EVENT_SHOW$3 = `show${EVENT_KEY$3}`; + const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`; + const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`; + const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`; + const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`; + const EVENT_RESIZE = `resize${EVENT_KEY$3}`; + const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`; + const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`; + const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; + const Default$5 = { + backdrop: true, + keyboard: true, + scroll: false + }; + const DefaultType$5 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + scroll: 'boolean' + }; + /** + * Class definition + */ + + class Offcanvas extends BaseComponent { + constructor(element, config) { + super(element, config); + this._isShown = false; + this._backdrop = this._initializeBackDrop(); + this._focustrap = this._initializeFocusTrap(); + + this._addEventListeners(); + } // Getters + + + static get Default() { + return Default$5; + } + + static get DefaultType() { + return DefaultType$5; + } + + static get NAME() { + return NAME$6; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + + this._backdrop.show(); + + if (!this._config.scroll) { + new ScrollBarHelper().hide(); + } + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.classList.add(CLASS_NAME_SHOWING$1); + + const completeCallBack = () => { + if (!this._config.scroll || this._config.backdrop) { + this._focustrap.activate(); + } + + this._element.classList.add(CLASS_NAME_SHOW$3); + + this._element.classList.remove(CLASS_NAME_SHOWING$1); + + EventHandler.trigger(this._element, EVENT_SHOWN$3, { + relatedTarget + }); + }; + + this._queueCallback(completeCallBack, this._element, true); + } + + hide() { + if (!this._isShown) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); + + if (hideEvent.defaultPrevented) { + return; + } + + this._focustrap.deactivate(); + + this._element.blur(); + + this._isShown = false; + + this._element.classList.add(CLASS_NAME_HIDING); + + this._backdrop.hide(); + + const completeCallback = () => { + this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + if (!this._config.scroll) { + new ScrollBarHelper().reset(); + } + + EventHandler.trigger(this._element, EVENT_HIDDEN$3); + }; + + this._queueCallback(completeCallback, this._element, true); + } + + dispose() { + this._backdrop.dispose(); + + this._focustrap.deactivate(); + + super.dispose(); + } // Private + + + _initializeBackDrop() { + const clickCallback = () => { + if (this._config.backdrop === 'static') { + EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + return; + } + + this.hide(); + }; // 'static' option will be translated to true, and booleans will keep their value + + + const isVisible = Boolean(this._config.backdrop); + return new Backdrop({ + className: CLASS_NAME_BACKDROP, + isVisible, + isAnimated: true, + rootElement: this._element.parentNode, + clickCallback: isVisible ? clickCallback : null + }); + } + + _initializeFocusTrap() { + return new FocusTrap({ + trapElement: this._element + }); + } + + _addEventListeners() { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { + if (event.key !== ESCAPE_KEY) { + return; + } + + if (!this._config.keyboard) { + EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + return; + } + + this.hide(); + }); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Offcanvas.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](this); + }); + } + + } + /** + * Data API implementation + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + if (isDisabled(this)) { + return; + } + + EventHandler.one(target, EVENT_HIDDEN$3, () => { + // focus on trigger when it is closed + if (isVisible(this)) { + this.focus(); + } + }); // avoid conflict when clicking a toggler of an offcanvas, while another is open + + const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); + + if (alreadyOpen && alreadyOpen !== target) { + Offcanvas.getInstance(alreadyOpen).hide(); + } + + const data = Offcanvas.getOrCreateInstance(target); + data.toggle(this); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => { + for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { + Offcanvas.getOrCreateInstance(selector).show(); + } + }); + EventHandler.on(window, EVENT_RESIZE, () => { + for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) { + if (getComputedStyle(element).position !== 'fixed') { + Offcanvas.getOrCreateInstance(element).hide(); + } + } + }); + enableDismissTrigger(Offcanvas); + /** + * jQuery + */ + + defineJQueryPlugin(Offcanvas); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); + const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + + const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts + */ + + const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; + + const allowedAttribute = (attribute, allowedAttributeList) => { + const attributeName = attribute.nodeName.toLowerCase(); + + if (allowedAttributeList.includes(attributeName)) { + if (uriAttributes.has(attributeName)) { + return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)); + } + + return true; + } // Check if a regular expression validates the attribute. + + + return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName)); + }; + + const DefaultAllowlist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { + if (!unsafeHtml.length) { + return unsafeHtml; + } + + if (sanitizeFunction && typeof sanitizeFunction === 'function') { + return sanitizeFunction(unsafeHtml); + } + + const domParser = new window.DOMParser(); + const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + const elements = [].concat(...createdDocument.body.querySelectorAll('*')); + + for (const element of elements) { + const elementName = element.nodeName.toLowerCase(); + + if (!Object.keys(allowList).includes(elementName)) { + element.remove(); + continue; + } + + const attributeList = [].concat(...element.attributes); + const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); + + for (const attribute of attributeList) { + if (!allowedAttribute(attribute, allowedAttributes)) { + element.removeAttribute(attribute.nodeName); + } + } + } + + return createdDocument.body.innerHTML; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): util/template-factory.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$5 = 'TemplateFactory'; + const Default$4 = { + allowList: DefaultAllowlist, + content: {}, + // { selector : text , selector2 : text2 , } + extraClass: '', + html: false, + sanitize: true, + sanitizeFn: null, + template: '
' + }; + const DefaultType$4 = { + allowList: 'object', + content: 'object', + extraClass: '(string|function)', + html: 'boolean', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + template: 'string' + }; + const DefaultContentType = { + entry: '(string|element|function|null)', + selector: '(string|element)' + }; + /** + * Class definition + */ + + class TemplateFactory extends Config { + constructor(config) { + super(); + this._config = this._getConfig(config); + } // Getters + + + static get Default() { + return Default$4; + } + + static get DefaultType() { + return DefaultType$4; + } + + static get NAME() { + return NAME$5; + } // Public + + + getContent() { + return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean); + } + + hasContent() { + return this.getContent().length > 0; + } + + changeContent(content) { + this._checkContent(content); + + this._config.content = { ...this._config.content, + ...content + }; + return this; + } + + toHtml() { + const templateWrapper = document.createElement('div'); + templateWrapper.innerHTML = this._maybeSanitize(this._config.template); + + for (const [selector, text] of Object.entries(this._config.content)) { + this._setContent(templateWrapper, text, selector); + } + + const template = templateWrapper.children[0]; + + const extraClass = this._resolvePossibleFunction(this._config.extraClass); + + if (extraClass) { + template.classList.add(...extraClass.split(' ')); + } + + return template; + } // Private + + + _typeCheckConfig(config) { + super._typeCheckConfig(config); + + this._checkContent(config.content); + } + + _checkContent(arg) { + for (const [selector, content] of Object.entries(arg)) { + super._typeCheckConfig({ + selector, + entry: content + }, DefaultContentType); + } + } + + _setContent(template, content, selector) { + const templateElement = SelectorEngine.findOne(selector, template); + + if (!templateElement) { + return; + } + + content = this._resolvePossibleFunction(content); + + if (!content) { + templateElement.remove(); + return; + } + + if (isElement$1(content)) { + this._putElementInTemplate(getElement(content), templateElement); + + return; + } + + if (this._config.html) { + templateElement.innerHTML = this._maybeSanitize(content); + return; + } + + templateElement.textContent = content; + } + + _maybeSanitize(arg) { + return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg; + } + + _resolvePossibleFunction(arg) { + return typeof arg === 'function' ? arg(this) : arg; + } + + _putElementInTemplate(element, templateElement) { + if (this._config.html) { + templateElement.innerHTML = ''; + templateElement.append(element); + return; + } + + templateElement.textContent = element.textContent; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): tooltip.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$4 = 'tooltip'; + const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); + const CLASS_NAME_FADE$2 = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW$2 = 'show'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; + const EVENT_MODAL_HIDE = 'hide.bs.modal'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + const EVENT_HIDE$2 = 'hide'; + const EVENT_HIDDEN$2 = 'hidden'; + const EVENT_SHOW$2 = 'show'; + const EVENT_SHOWN$2 = 'shown'; + const EVENT_INSERTED = 'inserted'; + const EVENT_CLICK$1 = 'click'; + const EVENT_FOCUSIN$1 = 'focusin'; + const EVENT_FOCUSOUT$1 = 'focusout'; + const EVENT_MOUSEENTER = 'mouseenter'; + const EVENT_MOUSELEAVE = 'mouseleave'; + const AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: isRTL() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: isRTL() ? 'right' : 'left' + }; + const Default$3 = { + allowList: DefaultAllowlist, + animation: true, + boundary: 'clippingParents', + container: false, + customClass: '', + delay: 0, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + html: false, + offset: [0, 0], + placement: 'top', + popperConfig: null, + sanitize: true, + sanitizeFn: null, + selector: false, + template: '', + title: '', + trigger: 'hover focus' + }; + const DefaultType$3 = { + allowList: 'object', + animation: 'boolean', + boundary: '(string|element)', + container: '(string|element|boolean)', + customClass: '(string|function)', + delay: '(number|object)', + fallbackPlacements: 'array', + html: 'boolean', + offset: '(array|string|function)', + placement: '(string|function)', + popperConfig: '(null|object|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + selector: '(string|boolean)', + template: 'string', + title: '(string|element|function)', + trigger: 'string' + }; + /** + * Class definition + */ + + class Tooltip extends BaseComponent { + constructor(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } + + super(element, config); // Private + + this._isEnabled = true; + this._timeout = 0; + this._isHovered = null; + this._activeTrigger = {}; + this._popper = null; + this._templateFactory = null; + this._newContent = null; // Protected + + this.tip = null; + + this._setListeners(); + } // Getters + + + static get Default() { + return Default$3; + } + + static get DefaultType() { + return DefaultType$3; + } + + static get NAME() { + return NAME$4; + } // Public + + + enable() { + this._isEnabled = true; + } + + disable() { + this._isEnabled = false; + } + + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + + toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(); + } else { + context._leave(); + } + + return; + } + + if (this._isShown()) { + this._leave(); + + return; + } + + this._enter(); + } + + dispose() { + clearTimeout(this._timeout); + EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + + if (this.tip) { + this.tip.remove(); + } + + if (this._config.originalTitle) { + this._element.setAttribute('title', this._config.originalTitle); + } + + this._disposePopper(); + + super.dispose(); + } + + show() { + if (this._element.style.display === 'none') { + throw new Error('Please use show on visible elements'); + } + + if (!(this._isWithContent() && this._isEnabled)) { + return; + } + + const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2)); + const shadowRoot = findShadowRoot(this._element); + + const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); + + if (showEvent.defaultPrevented || !isInTheDom) { + return; + } // todo v6 remove this OR make it optional + + + if (this.tip) { + this.tip.remove(); + this.tip = null; + } + + const tip = this._getTipElement(); + + this._element.setAttribute('aria-describedby', tip.getAttribute('id')); + + const { + container + } = this._config; + + if (!this._element.ownerDocument.documentElement.contains(this.tip)) { + container.append(tip); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); + } + + if (this._popper) { + this._popper.update(); + } else { + this._popper = this._createPopper(tip); + } + + tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.on(element, 'mouseover', noop); + } + } + + const complete = () => { + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2)); + + if (this._isHovered === false) { + this._leave(); + } + + this._isHovered = false; + }; + + this._queueCallback(complete, this.tip, this._isAnimated()); + } + + hide() { + if (!this._isShown()) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2)); + + if (hideEvent.defaultPrevented) { + return; + } + + const tip = this._getTipElement(); + + tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + for (const element of [].concat(...document.body.children)) { + EventHandler.off(element, 'mouseover', noop); + } + } + + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + this._isHovered = null; // it is a trick to support manual triggering + + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } + + if (!this._isHovered) { + tip.remove(); + } + + this._element.removeAttribute('aria-describedby'); + + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2)); + + this._disposePopper(); + }; + + this._queueCallback(complete, this.tip, this._isAnimated()); + } + + update() { + if (this._popper) { + this._popper.update(); + } + } // Protected + + + _isWithContent() { + return Boolean(this._getTitle()); + } + + _getTipElement() { + if (!this.tip) { + this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); + } + + return this.tip; + } + + _createTipElement(content) { + const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6 + + + if (!tip) { + return null; + } + + tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only + + tip.classList.add(`bs-${this.constructor.NAME}-auto`); + const tipId = getUID(this.constructor.NAME).toString(); + tip.setAttribute('id', tipId); + + if (this._isAnimated()) { + tip.classList.add(CLASS_NAME_FADE$2); + } + + return tip; + } + + setContent(content) { + this._newContent = content; + + if (this._isShown()) { + this._disposePopper(); + + this.show(); + } + } + + _getTemplateFactory(content) { + if (this._templateFactory) { + this._templateFactory.changeContent(content); + } else { + this._templateFactory = new TemplateFactory({ ...this._config, + // the `content` var has to be after `this._config` + // to override config.content in case of popover + content, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }); + } + + return this._templateFactory; + } + + _getContentForTemplate() { + return { + [SELECTOR_TOOLTIP_INNER]: this._getTitle() + }; + } + + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._config.originalTitle; + } // Private + + + _initializeOnDelegatedTarget(event) { + return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + } + + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2); + } + + _isShown() { + return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2); + } + + _createPopper(tip) { + const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; + const attachment = AttachmentMap[placement.toUpperCase()]; + return createPopper(this._element, tip, this._getPopperConfig(attachment)); + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(value => Number.parseInt(value, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _resolvePossibleFunction(arg) { + return typeof arg === 'function' ? arg.call(this._element) : arg; + } + + _getPopperConfig(attachment) { + const defaultBsPopperConfig = { + placement: attachment, + modifiers: [{ + name: 'flip', + options: { + fallbackPlacements: this._config.fallbackPlacements + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }, { + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'arrow', + options: { + element: `.${this.constructor.NAME}-arrow` + } + }, { + name: 'preSetPlacement', + enabled: true, + phase: 'beforeMain', + fn: data => { + // Pre-set Popper's placement attribute in order to read the arrow sizes properly. + // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement + this._getTipElement().setAttribute('data-popper-placement', data.state.placement); + } + }] + }; + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _setListeners() { + const triggers = this._config.trigger.split(' '); + + for (const trigger of triggers) { + if (trigger === 'click') { + EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => this.toggle(event)); + } else if (trigger !== TRIGGER_MANUAL) { + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1); + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1); + EventHandler.on(this._element, eventIn, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + + context._enter(); + }); + EventHandler.on(this._element, eventOut, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + + context._leave(); + }); + } + } + + this._hideModalHandler = () => { + if (this._element) { + this.hide(); + } + }; + + EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + + if (this._config.selector) { + this._config = { ...this._config, + trigger: 'manual', + selector: '' + }; + } else { + this._fixTitle(); + } + } + + _fixTitle() { + const title = this._config.originalTitle; + + if (!title) { + return; + } + + if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { + this._element.setAttribute('aria-label', title); + } + + this._element.removeAttribute('title'); + } + + _enter() { + if (this._isShown() || this._isHovered) { + this._isHovered = true; + return; + } + + this._isHovered = true; + + this._setTimeout(() => { + if (this._isHovered) { + this.show(); + } + }, this._config.delay.show); + } + + _leave() { + if (this._isWithActiveTrigger()) { + return; + } + + this._isHovered = false; + + this._setTimeout(() => { + if (!this._isHovered) { + this.hide(); + } + }, this._config.delay.hide); + } + + _setTimeout(handler, timeout) { + clearTimeout(this._timeout); + this._timeout = setTimeout(handler, timeout); + } + + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(true); + } + + _getConfig(config) { + const dataAttributes = Manipulator.getDataAttributes(this._element); + + for (const dataAttribute of Object.keys(dataAttributes)) { + if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { + delete dataAttributes[dataAttribute]; + } + } + + config = { ...dataAttributes, + ...(typeof config === 'object' && config ? config : {}) + }; + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + + this._typeCheckConfig(config); + + return config; + } + + _configAfterMerge(config) { + config.container = config.container === false ? document.body : getElement(config.container); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + config.originalTitle = this._element.getAttribute('title') || ''; + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + return config; + } + + _getDelegateConfig() { + const config = {}; + + for (const key in this._config) { + if (this.constructor.Default[key] !== this._config[key]) { + config[key] = this._config[key]; + } + } // In the future can be replaced with: + // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) + // `Object.fromEntries(keysWithDifferentValues)` + + + return config; + } + + _disposePopper() { + if (this._popper) { + this._popper.destroy(); + + this._popper = null; + } + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Tooltip.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + }); + } + + } + /** + * jQuery + */ + + + defineJQueryPlugin(Tooltip); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): popover.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$3 = 'popover'; + const SELECTOR_TITLE = '.popover-header'; + const SELECTOR_CONTENT = '.popover-body'; + const Default$2 = { ...Tooltip.Default, + content: '', + offset: [0, 8], + placement: 'right', + template: '', + trigger: 'click' + }; + const DefaultType$2 = { ...Tooltip.DefaultType, + content: '(null|string|element|function)' + }; + /** + * Class definition + */ + + class Popover extends Tooltip { + // Getters + static get Default() { + return Default$2; + } + + static get DefaultType() { + return DefaultType$2; + } + + static get NAME() { + return NAME$3; + } // Overrides + + + _isWithContent() { + return this._getTitle() || this._getContent(); + } // Private + + + _getContentForTemplate() { + return { + [SELECTOR_TITLE]: this._getTitle(), + [SELECTOR_CONTENT]: this._getContent() + }; + } + + _getContent() { + return this._resolvePossibleFunction(this._config.content); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Popover.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + }); + } + + } + /** + * jQuery + */ + + + defineJQueryPlugin(Popover); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.2.1): scrollspy.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * Constants + */ + + const NAME$2 = 'scrollspy'; + const DATA_KEY$2 = 'bs.scrollspy'; + const EVENT_KEY$2 = `.${DATA_KEY$2}`; + const DATA_API_KEY = '.data-api'; + const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`; + const EVENT_CLICK = `click${EVENT_KEY$2}`; + const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`; + const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; + const CLASS_NAME_ACTIVE$1 = 'active'; + const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; + const SELECTOR_TARGET_LINKS = '[href]'; + const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; + const SELECTOR_NAV_LINKS = '.nav-link'; + const SELECTOR_NAV_ITEMS = '.nav-item'; + const SELECTOR_LIST_ITEMS = '.list-group-item'; + const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; + const SELECTOR_DROPDOWN = '.dropdown'; + const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; + const Default$1 = { + offset: null, + // TODO: v6 @deprecated, keep it for backwards compatibility reasons + rootMargin: '0px 0px -25%', + smoothScroll: false, + target: null, + threshold: [0.1, 0.5, 1] + }; + const DefaultType$1 = { + offset: '(number|null)', + // TODO v6 @deprecated, keep it for backwards compatibility reasons + rootMargin: 'string', + smoothScroll: 'boolean', + target: 'element', + threshold: 'array' + }; + /** + * Class definition + */ + + class ScrollSpy extends BaseComponent { + constructor(element, config) { + super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper + + this._targetLinks = new Map(); + this._observableSections = new Map(); + this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element; + this._activeTarget = null; + this._observer = null; + this._previousScrollData = { + visibleEntryTop: 0, + parentScrollTop: 0 + }; + this.refresh(); // initialize + } // Getters + + + static get Default() { + return Default$1; + } + + static get DefaultType() { + return DefaultType$1; + } + + static get NAME() { + return NAME$2; + } // Public + + + refresh() { + this._initializeTargetsAndObservables(); + + this._maybeEnableSmoothScroll(); + + if (this._observer) { + this._observer.disconnect(); + } else { + this._observer = this._getNewObserver(); + } + + for (const section of this._observableSections.values()) { + this._observer.observe(section); + } + } + + dispose() { + this._observer.disconnect(); + + super.dispose(); + } // Private + + + _configAfterMerge(config) { + // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case + config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only + + config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; + + if (typeof config.threshold === 'string') { + config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value)); + } + + return config; + } + + _maybeEnableSmoothScroll() { + if (!this._config.smoothScroll) { + return; + } // unregister any previous listeners + + + EventHandler.off(this._config.target, EVENT_CLICK); + EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => { + const observableSection = this._observableSections.get(event.target.hash); + + if (observableSection) { + event.preventDefault(); + const root = this._rootElement || window; + const height = observableSection.offsetTop - this._element.offsetTop; + + if (root.scrollTo) { + root.scrollTo({ + top: height, + behavior: 'smooth' + }); + return; + } // Chrome 60 doesn't support `scrollTo` + + + root.scrollTop = height; + } + }); + } + + _getNewObserver() { + const options = { + root: this._rootElement, + threshold: this._config.threshold, + rootMargin: this._config.rootMargin + }; + return new IntersectionObserver(entries => this._observerCallback(entries), options); + } // The logic of selection + + + _observerCallback(entries) { + const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`); + + const activate = entry => { + this._previousScrollData.visibleEntryTop = entry.target.offsetTop; + + this._process(targetElement(entry)); + }; + + const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; + const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; + this._previousScrollData.parentScrollTop = parentScrollTop; + + for (const entry of entries) { + if (!entry.isIntersecting) { + this._activeTarget = null; + + this._clearActiveClass(targetElement(entry)); + + continue; + } + + const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop + + if (userScrollsDown && entryIsLowerThanPrevious) { + activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration + + if (!parentScrollTop) { + return; + } + + continue; + } // if we are scrolling up, pick the smallest offsetTop + + + if (!userScrollsDown && !entryIsLowerThanPrevious) { + activate(entry); + } + } + } + + _initializeTargetsAndObservables() { + this._targetLinks = new Map(); + this._observableSections = new Map(); + const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); + + for (const anchor of targetLinks) { + // ensure that the anchor has an id and is not disabled + if (!anchor.hash || isDisabled(anchor)) { + continue; + } + + const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible + + if (isVisible(observableSection)) { + this._targetLinks.set(anchor.hash, anchor); + + this._observableSections.set(anchor.hash, observableSection); + } + } + } + + _process(target) { + if (this._activeTarget === target) { + return; + } + + this._clearActiveClass(this._config.target); + + this._activeTarget = target; + target.classList.add(CLASS_NAME_ACTIVE$1); + + this._activateParents(target); + + EventHandler.trigger(this._element, EVENT_ACTIVATE, { + relatedTarget: target + }); + } + + _activateParents(target) { + // Activate dropdown parents + if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { + SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1); + return; + } + + for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { + // Set triggered links parents as active + // With both