modoboa 2.4.9__py3-none-any.whl → 2.4.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. modoboa/admin/api/v1/serializers.py +7 -1
  2. modoboa/admin/api/v2/serializers.py +4 -2
  3. modoboa/core/api/v2/serializers.py +34 -15
  4. modoboa/core/app_settings.py +1 -1
  5. modoboa/core/management/commands/load_initial_data.py +7 -15
  6. modoboa/core/migrations/0025_rename_user_email_is_active_core_user_email_c0c03f_idx.py +5 -5
  7. modoboa/frontend_dist/assets/{AccountAliasForm-DO4IpT1M.js → AccountAliasForm-DVXatAhB.js} +1 -1
  8. modoboa/frontend_dist/assets/{AccountEditView-BLA0CnKd.js → AccountEditView-DmvQjxpx.js} +1 -1
  9. modoboa/frontend_dist/assets/AccountLayout-OGtZvlHR.js +1 -0
  10. modoboa/frontend_dist/assets/{AccountPasswordSubForm-D9xU4Or7.js → AccountPasswordSubForm-g3IEGrgM.js} +1 -1
  11. modoboa/frontend_dist/assets/{AccountView-DegeD2uG.js → AccountView-DsxYqr3k.js} +1 -1
  12. modoboa/frontend_dist/assets/{AddressBook-CJM-ajGg.js → AddressBook-3RoKiKon.js} +1 -1
  13. modoboa/frontend_dist/assets/{AdminLayout-CTbzqJSq.js → AdminLayout-CWfn8zaQ.js} +1 -1
  14. modoboa/frontend_dist/assets/{AlarmsView-CpIExehE.js → AlarmsView-D3Mh8ntf.js} +1 -1
  15. modoboa/frontend_dist/assets/{AliasEditView-Bu0rnLCQ.js → AliasEditView-C15eUZ11.js} +1 -1
  16. modoboa/frontend_dist/assets/{AliasRecipientForm-CGuaOz6K.js → AliasRecipientForm-DVZXWaUX.js} +1 -1
  17. modoboa/frontend_dist/assets/{AliasView-Cdwd7AvE.js → AliasView-Cyvc5vMb.js} +1 -1
  18. modoboa/frontend_dist/assets/{AuditTrailView-Dn1B2S23.js → AuditTrailView-LI2XuLLn.js} +1 -1
  19. modoboa/frontend_dist/assets/{CalendarView-CV-DAWtd.js → CalendarView-BpOlPh3f.js} +1 -1
  20. modoboa/frontend_dist/assets/{ChoiceField-BS45Bjds.js → ChoiceField-7eU7c_rI.js} +1 -1
  21. modoboa/frontend_dist/assets/{ComposeEmailForm-22JKKl9M.js → ComposeEmailForm-CNfI7ept.js} +1 -1
  22. modoboa/frontend_dist/assets/ComposeEmailView-B866Xsrc.js +1 -0
  23. modoboa/frontend_dist/assets/{ConfirmDialog-BLu1kBWp.js → ConfirmDialog-BvqxQsD1.js} +1 -1
  24. modoboa/frontend_dist/assets/ConnectedLayout-BQ3ug6Jh.js +1 -0
  25. modoboa/frontend_dist/assets/{ConnectedLayout-AhwwAZvE.css → ConnectedLayout-BaJZ3BeR.css} +1 -1
  26. modoboa/frontend_dist/assets/CreationForm-C9Kh05ax.js +1 -0
  27. modoboa/frontend_dist/assets/CreationForm-HaiQhqwK.css +1 -0
  28. modoboa/frontend_dist/assets/{DashboardView-CubvMqxt.js → DashboardView-Cw-gIcuB.js} +1 -1
  29. modoboa/frontend_dist/assets/{DomainAdminList-B0z8fRmf.js → DomainAdminList-CsWUNKVk.js} +1 -1
  30. modoboa/frontend_dist/assets/DomainEditView-DocxeOeW.js +1 -0
  31. modoboa/frontend_dist/assets/DomainTransportForm-DPnPGBOp.js +1 -0
  32. modoboa/frontend_dist/assets/{DomainView-DCfSLvj-.css → DomainView-BDKoBFYr.css} +1 -1
  33. modoboa/frontend_dist/assets/DomainView-Djc_0PsF.js +5 -0
  34. modoboa/frontend_dist/assets/DomainsView-B-Lxru7P.js +1 -0
  35. modoboa/frontend_dist/assets/{DomainsView-BUgJLN9o.css → DomainsView-DasJ0NdZ.css} +1 -1
  36. modoboa/frontend_dist/assets/{EmailField-phdi2rhQ.js → EmailField-BEKxuYni.js} +1 -1
  37. modoboa/frontend_dist/assets/{EmailView-B8eqs4jh.js → EmailView-BsR1Wes5.js} +1 -1
  38. modoboa/frontend_dist/assets/EmptyLayout-BzPFOeLU.js +1 -0
  39. modoboa/frontend_dist/assets/{FiltersView-Dq_lXOZQ.js → FiltersView-5rmpC5cC.js} +1 -1
  40. modoboa/frontend_dist/assets/ForwardEmailView-D7MbetcT.js +1 -0
  41. modoboa/frontend_dist/assets/{HtmlEditor-KH0pmxrK.js → HtmlEditor-uM4AtIGi.js} +1 -1
  42. modoboa/frontend_dist/assets/IdentitiesView-BqjD9Lue.js +1 -0
  43. modoboa/frontend_dist/assets/IdentitiesView-jmuItyMZ.css +1 -0
  44. modoboa/frontend_dist/assets/{InformationView-DlwtlpvG.js → InformationView-CghcvPn2.js} +1 -1
  45. modoboa/frontend_dist/assets/{LoadingData-BYDZn1pb.js → LoadingData-CVD2Aen8.js} +1 -1
  46. modoboa/frontend_dist/assets/{LoginCallbackView-xSv3LV4_.js → LoginCallbackView-sWzBke1g.js} +1 -1
  47. modoboa/frontend_dist/assets/{LoginView-R5FtOIzW.js → LoginView-wmN73W0f.js} +1 -1
  48. modoboa/frontend_dist/assets/{MailboxView-esEw0ueS.js → MailboxView-T_p-_ZtJ.js} +1 -1
  49. modoboa/frontend_dist/assets/{MenuItems-Bck8ixGf.js → MenuItems-kHCMzR5E.js} +1 -1
  50. modoboa/frontend_dist/assets/{MessagesView-Dyg8Y4bi.js → MessagesView-Cerv3xsy.js} +1 -1
  51. modoboa/frontend_dist/assets/{MigrationsView-BHTt1qeH.js → MigrationsView-7kjqPyYU.js} +1 -1
  52. modoboa/frontend_dist/assets/Modoboa_RVB-BLEU-SANS-pKrnjsR_.png +0 -0
  53. modoboa/frontend_dist/assets/{ParametersForm-Bx5J7UU0.js → ParametersForm-BCeQljir.js} +1 -1
  54. modoboa/frontend_dist/assets/ParametersView-DspBxVMV.js +1 -0
  55. modoboa/frontend_dist/assets/ParametersView-Dy0H5ep1.js +1 -0
  56. modoboa/frontend_dist/assets/{ProviderEditView-d2fBym_r.js → ProviderEditView-DDLMOylC.js} +1 -1
  57. modoboa/frontend_dist/assets/{ProviderGeneralForm-C9jkYxB7.js → ProviderGeneralForm-BwOSKNHK.js} +1 -1
  58. modoboa/frontend_dist/assets/{ProvidersView-CjKsqSYV.js → ProvidersView-C99UD0WB.js} +1 -1
  59. modoboa/frontend_dist/assets/ReplyEmailView-DAPBHldd.js +1 -0
  60. modoboa/frontend_dist/assets/{ResourcesForm-RZNnt_x1.js → ResourcesForm-D87PHeH0.js} +1 -1
  61. modoboa/frontend_dist/assets/{SettingsView-TStQqZWd.js → SettingsView-OxDo9wNd.js} +1 -1
  62. modoboa/frontend_dist/assets/{StatisticsView-CABa0tgU.js → StatisticsView-CM__Eqku.js} +1 -1
  63. modoboa/frontend_dist/assets/{TimeSerieChart-BjM9PGIT.js → TimeSerieChart-C6j0uYR_.js} +1 -1
  64. modoboa/frontend_dist/assets/UserLayout-CckCGnPS.js +1 -0
  65. modoboa/frontend_dist/assets/{VAlert-DSMD0lqo.js → VAlert-B7mzOJIO.js} +1 -1
  66. modoboa/frontend_dist/assets/{VApp-D2FuKvLN.js → VApp-BKxnjOoi.js} +1 -1
  67. modoboa/frontend_dist/assets/{VAutocomplete-CQ5LL_Nk.js → VAutocomplete-Cc4_tcl1.js} +1 -1
  68. modoboa/frontend_dist/assets/{VAvatar-DbAmPjyA.js → VAvatar-BAgTUIvX.js} +1 -1
  69. modoboa/frontend_dist/assets/{VCard-BGXTuaE-.js → VCard-DFWiFORP.js} +1 -1
  70. modoboa/frontend_dist/assets/{VCheckbox-BM1QzY5m.js → VCheckbox-CKsH_vq3.js} +1 -1
  71. modoboa/frontend_dist/assets/{VCheckboxBtn-DdHQE-gt.js → VCheckboxBtn-j7di4leN.js} +1 -1
  72. modoboa/frontend_dist/assets/{VChip-Bm7znPZ6.js → VChip-nZ0uhY7t.js} +1 -1
  73. modoboa/frontend_dist/assets/{VColorPicker-CYCnVu_Z.js → VColorPicker-Os2aeP6J.js} +1 -1
  74. modoboa/frontend_dist/assets/{VContainer-B8HjqhNU.js → VContainer-Btam4lk2.js} +1 -1
  75. modoboa/frontend_dist/assets/{VDataTable-Etpc99CI.js → VDataTable-D_0_xJTl.js} +1 -1
  76. modoboa/frontend_dist/assets/{VDataTableServer-BNNG6dBx.js → VDataTableServer-BWTt4Mzi.js} +1 -1
  77. modoboa/frontend_dist/assets/{VDataTableVirtual-D9Km3t6e.js → VDataTableVirtual-BwVmkt4u.js} +1 -1
  78. modoboa/frontend_dist/assets/{VDialog-0NvxFg1X.js → VDialog-CZqM2Ofu.js} +1 -1
  79. modoboa/frontend_dist/assets/{VExpansionPanels-eED_hKBs.js → VExpansionPanels-B5D6GOa3.js} +1 -1
  80. modoboa/frontend_dist/assets/{VFileInput-COIdDRxq.js → VFileInput-Cv9DIPki.js} +1 -1
  81. modoboa/frontend_dist/assets/{VForm-DwwrfSN8.js → VForm-CpoZf60D.js} +1 -1
  82. modoboa/frontend_dist/assets/{VMenu-CTyyRlRb.js → VMenu-B_dVqOmo.js} +1 -1
  83. modoboa/frontend_dist/assets/{VPicker-3NOHH3h1.js → VPicker-CXkIGEze.js} +1 -1
  84. modoboa/frontend_dist/assets/{VProgressCircular-1VQzh5PK.js → VProgressCircular-CrEXxs7k.js} +1 -1
  85. modoboa/frontend_dist/assets/{VRadioGroup-CnRLqIcd.js → VRadioGroup-D8ypjYOO.js} +1 -1
  86. modoboa/frontend_dist/assets/{VRow-DgX40uiD.js → VRow-C_Ydf6yr.js} +1 -1
  87. modoboa/frontend_dist/assets/{VSelect-CeY-emKK.js → VSelect-CS51PDEt.js} +1 -1
  88. modoboa/frontend_dist/assets/{VSelectionControl-BYdVI5Q9.js → VSelectionControl-DiOqtY38.js} +1 -1
  89. modoboa/frontend_dist/assets/{VSheet-C8P69LA8.js → VSheet-5VVWtHvs.js} +1 -1
  90. modoboa/frontend_dist/assets/VSpacer-C6PZ3X24.js +1 -0
  91. modoboa/frontend_dist/assets/{VSwitch-BSifpScd.js → VSwitch-Chg5o-Cp.js} +1 -1
  92. modoboa/frontend_dist/assets/{VTable-BeyU0Uhj.js → VTable-KsiZ3cBz.js} +1 -1
  93. modoboa/frontend_dist/assets/{VTabs-Dzq8prKm.js → VTabs-tNrJIYO0.js} +1 -1
  94. modoboa/frontend_dist/assets/{VTextField-FBM5XwC5.js → VTextField-CLwRV0Cb.js} +1 -1
  95. modoboa/frontend_dist/assets/{VTextarea-BwkVlXPS.js → VTextarea-Di8jbl8m.js} +1 -1
  96. modoboa/frontend_dist/assets/{VToolbar-AQXTYlxS.js → VToolbar-CGwhgdmI.js} +1 -1
  97. modoboa/frontend_dist/assets/{VWindowItem-p9SJ1V9Y.js → VWindowItem-wWSFAGI-.js} +1 -1
  98. modoboa/frontend_dist/assets/{WebmailLayout-E3DJFEW2.js → WebmailLayout-DsYThBrz.js} +1 -1
  99. modoboa/frontend_dist/assets/{admin-B0fFM9gW.js → admin-CJVLMHh9.js} +1 -1
  100. modoboa/frontend_dist/assets/{aliases-C-hC9If-.js → aliases-c3n-dCV_.js} +1 -1
  101. modoboa/frontend_dist/assets/{contacts-DZDbAN4o.js → contacts-Bqckz8sr.js} +1 -1
  102. modoboa/frontend_dist/assets/{domains-CWdc-ODs.js → domains-nBMR-fRf.js} +1 -1
  103. modoboa/frontend_dist/assets/{domains.store-B6sc48r9.js → domains.store-ChZgLcqP.js} +1 -1
  104. modoboa/frontend_dist/assets/{filter-BSw3r225.js → filter-D7NrAf6a.js} +1 -1
  105. modoboa/frontend_dist/assets/{forwardRefs-Cn7kyt_f.js → forwardRefs-Cpc3YYl6.js} +1 -1
  106. modoboa/frontend_dist/assets/{global.store-IwCGIFoO.js → global.store-DUP26-A5.js} +1 -1
  107. modoboa/frontend_dist/assets/importExport-Dn9vYw7T.js +1 -0
  108. modoboa/frontend_dist/assets/{index-BCUdq-Zu.js → index-DV9Li2cg.js} +2 -2
  109. modoboa/frontend_dist/assets/{index-CJ87ZZG1.js → index-DzL89N4E.js} +1 -1
  110. modoboa/frontend_dist/assets/{layout-CLqGxWz4.js → layout-CHO37cA6.js} +1 -1
  111. modoboa/frontend_dist/assets/{layout.store-CSmWF8Cf.js → layout.store-BxBoBlgf.js} +1 -1
  112. modoboa/frontend_dist/assets/{logs-DIXCC1C0.js → logs-DrTzylW7.js} +1 -1
  113. modoboa/frontend_dist/assets/{parameters-u6VE5cq8.js → parameters-Lgiqp7aw.js} +1 -1
  114. modoboa/frontend_dist/assets/{parameters.store-D4x8W7LS.js → parameters.store-C9k9DuTj.js} +1 -1
  115. modoboa/frontend_dist/assets/{permissions-C7XVO62l.js → permissions-mL5hLHcW.js} +1 -1
  116. modoboa/frontend_dist/assets/{ssrBoot-B-x5LB2_.js → ssrBoot-BsxW6uW4.js} +1 -1
  117. modoboa/frontend_dist/assets/{tag-DCSJ2lri.js → tag-CFK9dzMJ.js} +1 -1
  118. modoboa/frontend_dist/assets/transports-TO08iTXJ.js +1 -0
  119. modoboa/frontend_dist/assets/{webmail-D2rioayn.js → webmail-KrD8ZhNM.js} +1 -1
  120. modoboa/frontend_dist/config.json +1 -3
  121. modoboa/frontend_dist/index.html +1 -1
  122. modoboa/maillog/management/commands/logparser.py +1 -0
  123. modoboa/pdfcredentials/api/v2/serializers.py +17 -5
  124. modoboa/pdfcredentials/api/v2/tests.py +28 -0
  125. modoboa/pdfcredentials/app_settings.py +1 -1
  126. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/METADATA +2 -2
  127. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/RECORD +132 -130
  128. modoboa/frontend_dist/assets/AccountLayout-DMwguvdC.js +0 -1
  129. modoboa/frontend_dist/assets/ComposeEmailView-B6Tbw3MS.js +0 -1
  130. modoboa/frontend_dist/assets/ConnectedLayout-CNzvhsb9.js +0 -1
  131. modoboa/frontend_dist/assets/CreationForm-ChgnxngD.js +0 -1
  132. modoboa/frontend_dist/assets/CreationForm-DLumMdUy.css +0 -1
  133. modoboa/frontend_dist/assets/DomainEditView-DrZ9__pt.js +0 -1
  134. modoboa/frontend_dist/assets/DomainTransportForm-DEsm5zOa.js +0 -1
  135. modoboa/frontend_dist/assets/DomainView-RmJalGk7.js +0 -5
  136. modoboa/frontend_dist/assets/DomainsView-DzL9wtff.js +0 -1
  137. modoboa/frontend_dist/assets/EmptyLayout-FS-cJHKI.js +0 -1
  138. modoboa/frontend_dist/assets/ForwardEmailView-Lpw9sqB4.js +0 -1
  139. modoboa/frontend_dist/assets/IdentitiesView-7nHABB9n.js +0 -1
  140. modoboa/frontend_dist/assets/IdentitiesView-cvIq8q24.css +0 -1
  141. modoboa/frontend_dist/assets/ParametersView-Bkw5_CyJ.js +0 -1
  142. modoboa/frontend_dist/assets/ParametersView-CyAAGtfU.js +0 -1
  143. modoboa/frontend_dist/assets/ReplyEmailView-DcUkD2HR.js +0 -1
  144. modoboa/frontend_dist/assets/UserLayout-C6_Zjp6P.js +0 -1
  145. modoboa/frontend_dist/assets/VSpacer-pLqQLLwB.js +0 -1
  146. modoboa/frontend_dist/assets/importExport-B7mBfHxZ.js +0 -1
  147. {modoboa-2.4.9.data → modoboa-2.4.10.data}/scripts/modoboa-admin.py +0 -0
  148. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/WHEEL +0 -0
  149. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/entry_points.txt +0 -0
  150. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/licenses/LICENSE +0 -0
  151. {modoboa-2.4.9.dist-info → modoboa-2.4.10.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmptyLayout-FS-cJHKI.js","assets/VApp-D2FuKvLN.js","assets/tag-DCSJ2lri.js","assets/layout-CLqGxWz4.js","assets/ssrBoot-B-x5LB2_.js","assets/VApp-DwhR0sAF.css","assets/LoginView-R5FtOIzW.js","assets/VRow-DgX40uiD.js","assets/VGrid-Cb7FdSrp.css","assets/VProgressCircular-1VQzh5PK.js","assets/VProgressCircular-BPJdTVu4.css","assets/VContainer-B8HjqhNU.js","assets/LoginCallbackView-xSv3LV4_.js","assets/AdminLayout-CTbzqJSq.js","assets/parameters-u6VE5cq8.js","assets/ConnectedLayout-CNzvhsb9.js","assets/global.store-IwCGIFoO.js","assets/admin-B0fFM9gW.js","assets/layout.store-CSmWF8Cf.js","assets/VAvatar-DbAmPjyA.js","assets/VAvatar-DXG1YGB5.css","assets/forwardRefs-Cn7kyt_f.js","assets/forwardRefs-i-22bMcD.css","assets/VMenu-CTyyRlRb.js","assets/VMenu-CxE66Rh1.css","assets/VCard-BGXTuaE-.js","assets/VCard-BNvk7mV7.css","assets/VSheet-C8P69LA8.js","assets/VSheet-B07QgQE8.css","assets/ConnectedLayout-AhwwAZvE.css","assets/parameters.store-D4x8W7LS.js","assets/DashboardView-CubvMqxt.js","assets/VDataTable-Etpc99CI.js","assets/VSelect-CeY-emKK.js","assets/VTextField-FBM5XwC5.js","assets/VTextField-C-J20yj_.css","assets/VCheckboxBtn-DdHQE-gt.js","assets/VSelectionControl-BYdVI5Q9.js","assets/VSelectionControl-CIeJsqfW.css","assets/VChip-Bm7znPZ6.js","assets/VChip-D0iltsFo.css","assets/VSelect-SEzwNEUK.css","assets/VTable-BeyU0Uhj.js","assets/VTable-CHRVGI94.css","assets/filter-BSw3r225.js","assets/VDataTable-CJyX7uj5.css","assets/VToolbar-AQXTYlxS.js","assets/VToolbar-BxjAEfSk.css","assets/DashboardView-BLlMi6Qb.css","assets/DomainsView-DzL9wtff.js","assets/domains-CWdc-ODs.js","assets/permissions-C7XVO62l.js","assets/VForm-DwwrfSN8.js","assets/VSwitch-BSifpScd.js","assets/VSwitch-Mm7Rd7At.css","assets/VSpacer-pLqQLLwB.js","assets/CreationForm-ChgnxngD.js","assets/ConfirmDialog-BLu1kBWp.js","assets/VDialog-0NvxFg1X.js","assets/VDialog-DwTSAOeg.css","assets/VWindowItem-p9SJ1V9Y.js","assets/VWindowItem-CWBhiE_Y.css","assets/CreationForm-DLumMdUy.css","assets/DomainTransportForm-DEsm5zOa.js","assets/ChoiceField-BS45Bjds.js","assets/ChoiceField-D2BiBorq.css","assets/VAutocomplete-CQ5LL_Nk.js","assets/VAutocomplete-CPd3yAvV.css","assets/VCheckbox-BM1QzY5m.js","assets/VCheckbox-CvH8ekHL.css","assets/AccountPasswordSubForm-D9xU4Or7.js","assets/VAlert-DSMD0lqo.js","assets/VAlert-iGJ3gOzk.css","assets/DomainAdminList-B0z8fRmf.js","assets/VDataTableVirtual-D9Km3t6e.js","assets/MenuItems-Bck8ixGf.js","assets/importExport-B7mBfHxZ.js","assets/VFileInput-COIdDRxq.js","assets/VFileInput-VtUg4zpy.css","assets/DomainsView-BUgJLN9o.css","assets/DomainView-RmJalGk7.js","assets/colors-DoZdCu1D.js","assets/VExpansionPanels-eED_hKBs.js","assets/VExpansionPanels-RsCANmDP.css","assets/LoadingData-BYDZn1pb.js","assets/ResourcesForm-RZNnt_x1.js","assets/TimeSerieChart-BjM9PGIT.js","assets/VPicker-3NOHH3h1.js","assets/VPicker-CfsXFhHv.css","assets/TimeSerieChart-CxiwMzE8.css","assets/VTabs-Dzq8prKm.js","assets/VTabs-Bv8FUb0o.css","assets/DomainView-DCfSLvj-.css","assets/DomainEditView-DrZ9__pt.js","assets/domains.store-B6sc48r9.js","assets/DomainEditView-CA90-K2a.css","assets/MigrationsView-BHTt1qeH.js","assets/MigrationsView--E1YzUUh.css","assets/ProvidersView-CjKsqSYV.js","assets/ProviderGeneralForm-C9jkYxB7.js","assets/ProviderGeneralForm-DU1OrxZe.css","assets/ProvidersView-D_ER4F1h.css","assets/ProviderEditView-d2fBym_r.js","assets/IdentitiesView-7nHABB9n.js","assets/aliases-C-hC9If-.js","assets/index-CJ87ZZG1.js","assets/VRadioGroup-CnRLqIcd.js","assets/VRadioGroup-Cp9mZ7cb.css","assets/VDataTableServer-BNNG6dBx.js","assets/AliasRecipientForm-CGuaOz6K.js","assets/EmailField-phdi2rhQ.js","assets/EmailField-DdJb059h.css","assets/VTextarea-BwkVlXPS.js","assets/VTextarea-BTR7f0gW.css","assets/AccountAliasForm-DO4IpT1M.js","assets/AccountAliasForm-DChJEu0C.css","assets/IdentitiesView-cvIq8q24.css","assets/AccountView-DegeD2uG.js","assets/AccountView-BJzPTPbV.css","assets/AccountEditView-BLA0CnKd.js","assets/AccountEditView-DLE8e_xz.css","assets/AliasView-Cdwd7AvE.js","assets/AliasView-DD9e67NS.css","assets/AliasEditView-Bu0rnLCQ.js","assets/AliasEditView-Cx9410JP.css","assets/ParametersView-Bkw5_CyJ.js","assets/ParametersForm-Bx5J7UU0.js","assets/HtmlEditor-KH0pmxrK.js","assets/HtmlEditor-girA1Pzv.css","assets/VColorPicker-CYCnVu_Z.js","assets/VColorPicker-C5_3l312.css","assets/ParametersForm-Dk-qwlRm.css","assets/ParametersView-DaKFNERg.css","assets/AlarmsView-CpIExehE.js","assets/AlarmsView-Bheey-gp.css","assets/StatisticsView-CABa0tgU.js","assets/StatisticsView-DtNkgGdm.css","assets/AuditTrailView-Dn1B2S23.js","assets/logs-DIXCC1C0.js","assets/AuditTrailView-epmsGz6G.css","assets/MessagesView-Dyg8Y4bi.js","assets/MessagesView-Bg8UAJJG.css","assets/InformationView-DlwtlpvG.js","assets/InformationView-U5Ww-Sx1.css","assets/AccountLayout-DMwguvdC.js","assets/FiltersView-Dq_lXOZQ.js","assets/ParametersView-CyAAGtfU.js","assets/ParametersView-Bwo4l7jC.css","assets/SettingsView-TStQqZWd.js","assets/SettingsView-DIvKGRBY.css","assets/UserLayout-C6_Zjp6P.js","assets/AddressBook-CJM-ajGg.js","assets/contacts-DZDbAN4o.js","assets/CalendarView-CV-DAWtd.js","assets/WebmailLayout-E3DJFEW2.js","assets/webmail-D2rioayn.js","assets/WebmailLayout-UlftFiiT.css","assets/MailboxView-esEw0ueS.js","assets/MailboxView-B-aI4XBq.css","assets/EmailView-B8eqs4jh.js","assets/EmailView-DCAPX4Dw.css","assets/ComposeEmailView-B6Tbw3MS.js","assets/ComposeEmailForm-22JKKl9M.js","assets/ComposeEmailForm-DHFthaP6.css","assets/ReplyEmailView-DcUkD2HR.js","assets/ForwardEmailView-Lpw9sqB4.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmptyLayout-BzPFOeLU.js","assets/VApp-BKxnjOoi.js","assets/tag-CFK9dzMJ.js","assets/layout-CHO37cA6.js","assets/ssrBoot-BsxW6uW4.js","assets/VApp-DwhR0sAF.css","assets/LoginView-wmN73W0f.js","assets/VRow-C_Ydf6yr.js","assets/VGrid-Cb7FdSrp.css","assets/VProgressCircular-CrEXxs7k.js","assets/VProgressCircular-BPJdTVu4.css","assets/VContainer-Btam4lk2.js","assets/LoginCallbackView-sWzBke1g.js","assets/AdminLayout-CWfn8zaQ.js","assets/parameters-Lgiqp7aw.js","assets/ConnectedLayout-BQ3ug6Jh.js","assets/global.store-DUP26-A5.js","assets/admin-CJVLMHh9.js","assets/layout.store-BxBoBlgf.js","assets/VAvatar-BAgTUIvX.js","assets/VAvatar-DXG1YGB5.css","assets/forwardRefs-Cpc3YYl6.js","assets/forwardRefs-i-22bMcD.css","assets/VMenu-B_dVqOmo.js","assets/VMenu-CxE66Rh1.css","assets/VCard-DFWiFORP.js","assets/VCard-BNvk7mV7.css","assets/VSheet-5VVWtHvs.js","assets/VSheet-B07QgQE8.css","assets/ConnectedLayout-BaJZ3BeR.css","assets/parameters.store-C9k9DuTj.js","assets/DashboardView-Cw-gIcuB.js","assets/VDataTable-D_0_xJTl.js","assets/VSelect-CS51PDEt.js","assets/VTextField-CLwRV0Cb.js","assets/VTextField-C-J20yj_.css","assets/VCheckboxBtn-j7di4leN.js","assets/VSelectionControl-DiOqtY38.js","assets/VSelectionControl-CIeJsqfW.css","assets/VChip-nZ0uhY7t.js","assets/VChip-D0iltsFo.css","assets/VSelect-SEzwNEUK.css","assets/VTable-KsiZ3cBz.js","assets/VTable-CHRVGI94.css","assets/filter-D7NrAf6a.js","assets/VDataTable-CJyX7uj5.css","assets/VToolbar-CGwhgdmI.js","assets/VToolbar-BxjAEfSk.css","assets/DashboardView-BLlMi6Qb.css","assets/DomainsView-B-Lxru7P.js","assets/domains-nBMR-fRf.js","assets/permissions-mL5hLHcW.js","assets/VForm-CpoZf60D.js","assets/VSwitch-Chg5o-Cp.js","assets/VSwitch-Mm7Rd7At.css","assets/VSpacer-C6PZ3X24.js","assets/CreationForm-C9Kh05ax.js","assets/ConfirmDialog-BvqxQsD1.js","assets/VDialog-CZqM2Ofu.js","assets/VDialog-DwTSAOeg.css","assets/VWindowItem-wWSFAGI-.js","assets/VWindowItem-CWBhiE_Y.css","assets/CreationForm-HaiQhqwK.css","assets/DomainTransportForm-DPnPGBOp.js","assets/ChoiceField-7eU7c_rI.js","assets/ChoiceField-D2BiBorq.css","assets/transports-TO08iTXJ.js","assets/VAutocomplete-Cc4_tcl1.js","assets/VAutocomplete-CPd3yAvV.css","assets/VCheckbox-CKsH_vq3.js","assets/VCheckbox-CvH8ekHL.css","assets/AccountPasswordSubForm-g3IEGrgM.js","assets/VAlert-B7mzOJIO.js","assets/VAlert-iGJ3gOzk.css","assets/DomainAdminList-CsWUNKVk.js","assets/VDataTableVirtual-BwVmkt4u.js","assets/MenuItems-kHCMzR5E.js","assets/importExport-Dn9vYw7T.js","assets/VFileInput-Cv9DIPki.js","assets/VFileInput-VtUg4zpy.css","assets/DomainsView-DasJ0NdZ.css","assets/DomainView-Djc_0PsF.js","assets/colors-DoZdCu1D.js","assets/VExpansionPanels-B5D6GOa3.js","assets/VExpansionPanels-RsCANmDP.css","assets/LoadingData-CVD2Aen8.js","assets/ResourcesForm-D87PHeH0.js","assets/TimeSerieChart-C6j0uYR_.js","assets/VPicker-CXkIGEze.js","assets/VPicker-CfsXFhHv.css","assets/TimeSerieChart-CxiwMzE8.css","assets/VTabs-tNrJIYO0.js","assets/VTabs-Bv8FUb0o.css","assets/DomainView-BDKoBFYr.css","assets/DomainEditView-DocxeOeW.js","assets/domains.store-ChZgLcqP.js","assets/DomainEditView-CA90-K2a.css","assets/MigrationsView-7kjqPyYU.js","assets/MigrationsView--E1YzUUh.css","assets/ProvidersView-C99UD0WB.js","assets/ProviderGeneralForm-BwOSKNHK.js","assets/ProviderGeneralForm-DU1OrxZe.css","assets/ProvidersView-D_ER4F1h.css","assets/ProviderEditView-DDLMOylC.js","assets/IdentitiesView-BqjD9Lue.js","assets/aliases-c3n-dCV_.js","assets/index-DzL89N4E.js","assets/VRadioGroup-D8ypjYOO.js","assets/VRadioGroup-Cp9mZ7cb.css","assets/VDataTableServer-BWTt4Mzi.js","assets/AliasRecipientForm-DVZXWaUX.js","assets/EmailField-BEKxuYni.js","assets/EmailField-DdJb059h.css","assets/VTextarea-Di8jbl8m.js","assets/VTextarea-BTR7f0gW.css","assets/AccountAliasForm-DVXatAhB.js","assets/AccountAliasForm-DChJEu0C.css","assets/IdentitiesView-jmuItyMZ.css","assets/AccountView-DsxYqr3k.js","assets/AccountView-BJzPTPbV.css","assets/AccountEditView-DmvQjxpx.js","assets/AccountEditView-DLE8e_xz.css","assets/AliasView-Cyvc5vMb.js","assets/AliasView-DD9e67NS.css","assets/AliasEditView-C15eUZ11.js","assets/AliasEditView-Cx9410JP.css","assets/ParametersView-DspBxVMV.js","assets/ParametersForm-BCeQljir.js","assets/HtmlEditor-uM4AtIGi.js","assets/HtmlEditor-girA1Pzv.css","assets/VColorPicker-Os2aeP6J.js","assets/VColorPicker-C5_3l312.css","assets/ParametersForm-Dk-qwlRm.css","assets/ParametersView-DaKFNERg.css","assets/AlarmsView-D3Mh8ntf.js","assets/AlarmsView-Bheey-gp.css","assets/StatisticsView-CM__Eqku.js","assets/StatisticsView-DtNkgGdm.css","assets/AuditTrailView-LI2XuLLn.js","assets/logs-DrTzylW7.js","assets/AuditTrailView-epmsGz6G.css","assets/MessagesView-Cerv3xsy.js","assets/MessagesView-Bg8UAJJG.css","assets/InformationView-CghcvPn2.js","assets/InformationView-U5Ww-Sx1.css","assets/AccountLayout-OGtZvlHR.js","assets/FiltersView-5rmpC5cC.js","assets/ParametersView-Dy0H5ep1.js","assets/ParametersView-Bwo4l7jC.css","assets/SettingsView-OxDo9wNd.js","assets/SettingsView-DIvKGRBY.css","assets/UserLayout-CckCGnPS.js","assets/AddressBook-3RoKiKon.js","assets/contacts-Bqckz8sr.js","assets/CalendarView-BpOlPh3f.js","assets/WebmailLayout-DsYThBrz.js","assets/webmail-KrD8ZhNM.js","assets/WebmailLayout-UlftFiiT.css","assets/MailboxView-T_p-_ZtJ.js","assets/MailboxView-B-aI4XBq.css","assets/EmailView-BsR1Wes5.js","assets/EmailView-DCAPX4Dw.css","assets/ComposeEmailView-B866Xsrc.js","assets/ComposeEmailForm-CNfI7ept.js","assets/ComposeEmailForm-DHFthaP6.css","assets/ReplyEmailView-DAPBHldd.js","assets/ForwardEmailView-D7MbetcT.js"])))=>i.map(i=>d[i]);
2
2
  (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))o(u);new MutationObserver(u=>{for(const f of u)if(f.type==="childList")for(const g of f.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&o(g)}).observe(document,{childList:!0,subtree:!0});function a(u){const f={};return u.integrity&&(f.integrity=u.integrity),u.referrerPolicy&&(f.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?f.credentials="include":u.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function o(u){if(u.ep)return;u.ep=!0;const f=a(u);fetch(u.href,f)}})();/**
3
3
  * @vue/shared v3.5.16
4
4
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
@@ -36,7 +36,7 @@ Expected #hex, #hexa, rgb(), rgba(), hsl(), hsla(), object or number`)}function
36
36
  `)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...a){const o=new this(t);return a.forEach(u=>o.set(u)),o}static accessor(t){const o=(this[Od]=this[Od]={accessors:{}}).accessors,u=this.prototype;function f(g){const y=za(g);o[y]||(eS(u,g),o[y]=!0)}return te.isArray(t)?t.forEach(f):f(t),this}};ti.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);te.reduceDescriptors(ti.prototype,({value:e},t)=>{let a=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(o){this[a]=o}}});te.freezeMethods(ti);function Oo(e,t){const a=this||Sr,o=t||a,u=ti.from(o.headers);let f=o.data;return te.forEach(e,function(y){f=y.call(a,f,u.normalize(),t?t.status:void 0)}),u.normalize(),f}function gp(e){return!!(e&&e.__CANCEL__)}function Ma(e,t,a){Xe.call(this,e??"canceled",Xe.ERR_CANCELED,t,a),this.name="CanceledError"}te.inherits(Ma,Xe,{__CANCEL__:!0});function pp(e,t,a){const o=a.config.validateStatus;!a.status||!o||o(a.status)?e(a):t(new Xe("Request failed with status code "+a.status,[Xe.ERR_BAD_REQUEST,Xe.ERR_BAD_RESPONSE][Math.floor(a.status/100)-4],a.config,a.request,a))}function tS(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function iS(e,t){e=e||10;const a=new Array(e),o=new Array(e);let u=0,f=0,g;return t=t!==void 0?t:1e3,function(k){const A=Date.now(),M=o[f];g||(g=A),a[u]=k,o[u]=A;let P=f,N=0;for(;P!==u;)N+=a[P++],P=P%e;if(u=(u+1)%e,u===f&&(f=(f+1)%e),A-g<t)return;const H=M&&A-M;return H?Math.round(N*1e3/H):void 0}}function sS(e,t){let a=0,o=1e3/t,u,f;const g=(A,M=Date.now())=>{a=M,u=null,f&&(clearTimeout(f),f=null),e.apply(null,A)};return[(...A)=>{const M=Date.now(),P=M-a;P>=o?g(A,M):(u=A,f||(f=setTimeout(()=>{f=null,g(u)},o-P)))},()=>u&&g(u)]}const yn=(e,t,a=3)=>{let o=0;const u=iS(50,250);return sS(f=>{const g=f.loaded,y=f.lengthComputable?f.total:void 0,k=g-o,A=u(k),M=g<=y;o=g;const P={loaded:g,total:y,progress:y?g/y:void 0,bytes:k,rate:A||void 0,estimated:A&&y&&M?(y-g)/A:void 0,event:f,lengthComputable:y!=null,[t?"download":"upload"]:!0};e(P)},a)},Nd=(e,t)=>{const a=e!=null;return[o=>t[0]({lengthComputable:a,total:e,loaded:o}),t[1]]},Fd=e=>(...t)=>te.asap(()=>e(...t)),aS=Wt.hasStandardBrowserEnv?((e,t)=>a=>(a=new URL(a,Wt.origin),e.protocol===a.protocol&&e.host===a.host&&(t||e.port===a.port)))(new URL(Wt.origin),Wt.navigator&&/(msie|trident)/i.test(Wt.navigator.userAgent)):()=>!0,rS=Wt.hasStandardBrowserEnv?{write(e,t,a,o,u,f){const g=[e+"="+encodeURIComponent(t)];te.isNumber(a)&&g.push("expires="+new Date(a).toGMTString()),te.isString(o)&&g.push("path="+o),te.isString(u)&&g.push("domain="+u),f===!0&&g.push("secure"),document.cookie=g.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function nS(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function oS(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function mp(e,t,a){let o=!nS(t);return e&&(o||a==!1)?oS(e,t):t}const zd=e=>e instanceof ti?{...e}:e;function js(e,t){t=t||{};const a={};function o(A,M,P,N){return te.isPlainObject(A)&&te.isPlainObject(M)?te.merge.call({caseless:N},A,M):te.isPlainObject(M)?te.merge({},M):te.isArray(M)?M.slice():M}function u(A,M,P,N){if(te.isUndefined(M)){if(!te.isUndefined(A))return o(void 0,A,P,N)}else return o(A,M,P,N)}function f(A,M){if(!te.isUndefined(M))return o(void 0,M)}function g(A,M){if(te.isUndefined(M)){if(!te.isUndefined(A))return o(void 0,A)}else return o(void 0,M)}function y(A,M,P){if(P in t)return o(A,M);if(P in e)return o(void 0,A)}const k={url:f,method:f,data:f,baseURL:g,transformRequest:g,transformResponse:g,paramsSerializer:g,timeout:g,timeoutMessage:g,withCredentials:g,withXSRFToken:g,adapter:g,responseType:g,xsrfCookieName:g,xsrfHeaderName:g,onUploadProgress:g,onDownloadProgress:g,decompress:g,maxContentLength:g,maxBodyLength:g,beforeRedirect:g,transport:g,httpAgent:g,httpsAgent:g,cancelToken:g,socketPath:g,responseEncoding:g,validateStatus:y,headers:(A,M,P)=>u(zd(A),zd(M),P,!0)};return te.forEach(Object.keys(Object.assign({},e,t)),function(M){const P=k[M]||u,N=P(e[M],t[M],M);te.isUndefined(N)&&P!==y||(a[M]=N)}),a}const vp=e=>{const t=js({},e);let{data:a,withXSRFToken:o,xsrfHeaderName:u,xsrfCookieName:f,headers:g,auth:y}=t;t.headers=g=ti.from(g),t.url=dp(mp(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),y&&g.set("Authorization","Basic "+btoa((y.username||"")+":"+(y.password?unescape(encodeURIComponent(y.password)):"")));let k;if(te.isFormData(a)){if(Wt.hasStandardBrowserEnv||Wt.hasStandardBrowserWebWorkerEnv)g.setContentType(void 0);else if((k=g.getContentType())!==!1){const[A,...M]=k?k.split(";").map(P=>P.trim()).filter(Boolean):[];g.setContentType([A||"multipart/form-data",...M].join("; "))}}if(Wt.hasStandardBrowserEnv&&(o&&te.isFunction(o)&&(o=o(t)),o||o!==!1&&aS(t.url))){const A=u&&f&&rS.read(f);A&&g.set(u,A)}return t},lS=typeof XMLHttpRequest<"u",cS=lS&&function(e){return new Promise(function(a,o){const u=vp(e);let f=u.data;const g=ti.from(u.headers).normalize();let{responseType:y,onUploadProgress:k,onDownloadProgress:A}=u,M,P,N,H,z;function G(){H&&H(),z&&z(),u.cancelToken&&u.cancelToken.unsubscribe(M),u.signal&&u.signal.removeEventListener("abort",M)}let Q=new XMLHttpRequest;Q.open(u.method.toUpperCase(),u.url,!0),Q.timeout=u.timeout;function q(){if(!Q)return;const $=ti.from("getAllResponseHeaders"in Q&&Q.getAllResponseHeaders()),B={data:!y||y==="text"||y==="json"?Q.responseText:Q.response,status:Q.status,statusText:Q.statusText,headers:$,config:e,request:Q};pp(function(ae){a(ae),G()},function(ae){o(ae),G()},B),Q=null}"onloadend"in Q?Q.onloadend=q:Q.onreadystatechange=function(){!Q||Q.readyState!==4||Q.status===0&&!(Q.responseURL&&Q.responseURL.indexOf("file:")===0)||setTimeout(q)},Q.onabort=function(){Q&&(o(new Xe("Request aborted",Xe.ECONNABORTED,e,Q)),Q=null)},Q.onerror=function(){o(new Xe("Network Error",Xe.ERR_NETWORK,e,Q)),Q=null},Q.ontimeout=function(){let re=u.timeout?"timeout of "+u.timeout+"ms exceeded":"timeout exceeded";const B=u.transitional||hp;u.timeoutErrorMessage&&(re=u.timeoutErrorMessage),o(new Xe(re,B.clarifyTimeoutError?Xe.ETIMEDOUT:Xe.ECONNABORTED,e,Q)),Q=null},f===void 0&&g.setContentType(null),"setRequestHeader"in Q&&te.forEach(g.toJSON(),function(re,B){Q.setRequestHeader(B,re)}),te.isUndefined(u.withCredentials)||(Q.withCredentials=!!u.withCredentials),y&&y!=="json"&&(Q.responseType=u.responseType),A&&([N,z]=yn(A,!0),Q.addEventListener("progress",N)),k&&Q.upload&&([P,H]=yn(k),Q.upload.addEventListener("progress",P),Q.upload.addEventListener("loadend",H)),(u.cancelToken||u.signal)&&(M=$=>{Q&&(o(!$||$.type?new Ma(null,e,Q):$),Q.abort(),Q=null)},u.cancelToken&&u.cancelToken.subscribe(M),u.signal&&(u.signal.aborted?M():u.signal.addEventListener("abort",M)));const ie=tS(u.url);if(ie&&Wt.protocols.indexOf(ie)===-1){o(new Xe("Unsupported protocol "+ie+":",Xe.ERR_BAD_REQUEST,e));return}Q.send(f||null)})},uS=(e,t)=>{const{length:a}=e=e?e.filter(Boolean):[];if(t||a){let o=new AbortController,u;const f=function(A){if(!u){u=!0,y();const M=A instanceof Error?A:this.reason;o.abort(M instanceof Xe?M:new Ma(M instanceof Error?M.message:M))}};let g=t&&setTimeout(()=>{g=null,f(new Xe(`timeout ${t} of ms exceeded`,Xe.ETIMEDOUT))},t);const y=()=>{e&&(g&&clearTimeout(g),g=null,e.forEach(A=>{A.unsubscribe?A.unsubscribe(f):A.removeEventListener("abort",f)}),e=null)};e.forEach(A=>A.addEventListener("abort",f));const{signal:k}=o;return k.unsubscribe=()=>te.asap(y),k}},dS=function*(e,t){let a=e.byteLength;if(a<t){yield e;return}let o=0,u;for(;o<a;)u=o+t,yield e.slice(o,u),o=u},hS=async function*(e,t){for await(const a of fS(e))yield*dS(a,t)},fS=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:a,value:o}=await t.read();if(a)break;yield o}}finally{await t.cancel()}},Bd=(e,t,a,o)=>{const u=hS(e,t);let f=0,g,y=k=>{g||(g=!0,o&&o(k))};return new ReadableStream({async pull(k){try{const{done:A,value:M}=await u.next();if(A){y(),k.close();return}let P=M.byteLength;if(a){let N=f+=P;a(N)}k.enqueue(new Uint8Array(M))}catch(A){throw y(A),A}},cancel(k){return y(k),u.return()}},{highWaterMark:2})},to=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",bp=to&&typeof ReadableStream=="function",gS=to&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),xp=(e,...t)=>{try{return!!e(...t)}catch{return!1}},pS=bp&&xp(()=>{let e=!1;const t=new Request(Wt.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Hd=64*1024,Tl=bp&&xp(()=>te.isReadableStream(new Response("").body)),wn={stream:Tl&&(e=>e.body)};to&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!wn[t]&&(wn[t]=te.isFunction(e[t])?a=>a[t]():(a,o)=>{throw new Xe(`Response type '${t}' is not supported`,Xe.ERR_NOT_SUPPORT,o)})})})(new Response);const mS=async e=>{if(e==null)return 0;if(te.isBlob(e))return e.size;if(te.isSpecCompliantForm(e))return(await new Request(Wt.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(te.isArrayBufferView(e)||te.isArrayBuffer(e))return e.byteLength;if(te.isURLSearchParams(e)&&(e=e+""),te.isString(e))return(await gS(e)).byteLength},vS=async(e,t)=>{const a=te.toFiniteNumber(e.getContentLength());return a??mS(t)},bS=to&&(async e=>{let{url:t,method:a,data:o,signal:u,cancelToken:f,timeout:g,onDownloadProgress:y,onUploadProgress:k,responseType:A,headers:M,withCredentials:P="same-origin",fetchOptions:N}=vp(e);A=A?(A+"").toLowerCase():"text";let H=uS([u,f&&f.toAbortSignal()],g),z;const G=H&&H.unsubscribe&&(()=>{H.unsubscribe()});let Q;try{if(k&&pS&&a!=="get"&&a!=="head"&&(Q=await vS(M,o))!==0){let B=new Request(t,{method:"POST",body:o,duplex:"half"}),de;if(te.isFormData(o)&&(de=B.headers.get("content-type"))&&M.setContentType(de),B.body){const[ae,U]=Nd(Q,yn(Fd(k)));o=Bd(B.body,Hd,ae,U)}}te.isString(P)||(P=P?"include":"omit");const q="credentials"in Request.prototype;z=new Request(t,{...N,signal:H,method:a.toUpperCase(),headers:M.normalize().toJSON(),body:o,duplex:"half",credentials:q?P:void 0});let ie=await fetch(z);const $=Tl&&(A==="stream"||A==="response");if(Tl&&(y||$&&G)){const B={};["status","statusText","headers"].forEach(J=>{B[J]=ie[J]});const de=te.toFiniteNumber(ie.headers.get("content-length")),[ae,U]=y&&Nd(de,yn(Fd(y),!0))||[];ie=new Response(Bd(ie.body,Hd,ae,()=>{U&&U(),G&&G()}),B)}A=A||"text";let re=await wn[te.findKey(wn,A)||"text"](ie,e);return!$&&G&&G(),await new Promise((B,de)=>{pp(B,de,{data:re,headers:ti.from(ie.headers),status:ie.status,statusText:ie.statusText,config:e,request:z})})}catch(q){throw G&&G(),q&&q.name==="TypeError"&&/Load failed|fetch/i.test(q.message)?Object.assign(new Xe("Network Error",Xe.ERR_NETWORK,e,z),{cause:q.cause||q}):Xe.from(q,q&&q.code,e,z)}}),Pl={http:Rk,xhr:cS,fetch:bS};te.forEach(Pl,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Wd=e=>`- ${e}`,xS=e=>te.isFunction(e)||e===null||e===!1,yp={getAdapter:e=>{e=te.isArray(e)?e:[e];const{length:t}=e;let a,o;const u={};for(let f=0;f<t;f++){a=e[f];let g;if(o=a,!xS(a)&&(o=Pl[(g=String(a)).toLowerCase()],o===void 0))throw new Xe(`Unknown adapter '${g}'`);if(o)break;u[g||"#"+f]=o}if(!o){const f=Object.entries(u).map(([y,k])=>`adapter ${y} `+(k===!1?"is not supported by the environment":"is not available in the build"));let g=t?f.length>1?`since :
37
37
  `+f.map(Wd).join(`
38
38
  `):" "+Wd(f[0]):"as no adapter specified";throw new Xe("There is no suitable adapter to dispatch the request "+g,"ERR_NOT_SUPPORT")}return o},adapters:Pl};function No(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ma(null,e)}function Yd(e){return No(e),e.headers=ti.from(e.headers),e.data=Oo.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),yp.getAdapter(e.adapter||Sr.adapter)(e).then(function(o){return No(e),o.data=Oo.call(e,e.transformResponse,o),o.headers=ti.from(o.headers),o},function(o){return gp(o)||(No(e),o&&o.response&&(o.response.data=Oo.call(e,e.transformResponse,o.response),o.response.headers=ti.from(o.response.headers))),Promise.reject(o)})}const wp="1.9.0",io={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{io[e]=function(o){return typeof o===e||"a"+(t<1?"n ":" ")+e}});const Vd={};io.transitional=function(t,a,o){function u(f,g){return"[Axios v"+wp+"] Transitional option '"+f+"'"+g+(o?". "+o:"")}return(f,g,y)=>{if(t===!1)throw new Xe(u(g," has been removed"+(a?" in "+a:"")),Xe.ERR_DEPRECATED);return a&&!Vd[g]&&(Vd[g]=!0,console.warn(u(g," has been deprecated since v"+a+" and will be removed in the near future"))),t?t(f,g,y):!0}};io.spelling=function(t){return(a,o)=>(console.warn(`${o} is likely a misspelling of ${t}`),!0)};function yS(e,t,a){if(typeof e!="object")throw new Xe("options must be an object",Xe.ERR_BAD_OPTION_VALUE);const o=Object.keys(e);let u=o.length;for(;u-- >0;){const f=o[u],g=t[f];if(g){const y=e[f],k=y===void 0||g(y,f,e);if(k!==!0)throw new Xe("option "+f+" must be "+k,Xe.ERR_BAD_OPTION_VALUE);continue}if(a!==!0)throw new Xe("Unknown option "+f,Xe.ERR_BAD_OPTION)}}const en={assertOptions:yS,validators:io},Pi=en.validators;let Bs=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Ld,response:new Ld}}async request(t,a){try{return await this._request(t,a)}catch(o){if(o instanceof Error){let u={};Error.captureStackTrace?Error.captureStackTrace(u):u=new Error;const f=u.stack?u.stack.replace(/^.+\n/,""):"";try{o.stack?f&&!String(o.stack).endsWith(f.replace(/^.+\n.+\n/,""))&&(o.stack+=`
39
- `+f):o.stack=f}catch{}}throw o}}_request(t,a){typeof t=="string"?(a=a||{},a.url=t):a=t||{},a=js(this.defaults,a);const{transitional:o,paramsSerializer:u,headers:f}=a;o!==void 0&&en.assertOptions(o,{silentJSONParsing:Pi.transitional(Pi.boolean),forcedJSONParsing:Pi.transitional(Pi.boolean),clarifyTimeoutError:Pi.transitional(Pi.boolean)},!1),u!=null&&(te.isFunction(u)?a.paramsSerializer={serialize:u}:en.assertOptions(u,{encode:Pi.function,serialize:Pi.function},!0)),a.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?a.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:a.allowAbsoluteUrls=!0),en.assertOptions(a,{baseUrl:Pi.spelling("baseURL"),withXsrfToken:Pi.spelling("withXSRFToken")},!0),a.method=(a.method||this.defaults.method||"get").toLowerCase();let g=f&&te.merge(f.common,f[a.method]);f&&te.forEach(["delete","get","head","post","put","patch","common"],z=>{delete f[z]}),a.headers=ti.concat(g,f);const y=[];let k=!0;this.interceptors.request.forEach(function(G){typeof G.runWhen=="function"&&G.runWhen(a)===!1||(k=k&&G.synchronous,y.unshift(G.fulfilled,G.rejected))});const A=[];this.interceptors.response.forEach(function(G){A.push(G.fulfilled,G.rejected)});let M,P=0,N;if(!k){const z=[Yd.bind(this),void 0];for(z.unshift.apply(z,y),z.push.apply(z,A),N=z.length,M=Promise.resolve(a);P<N;)M=M.then(z[P++],z[P++]);return M}N=y.length;let H=a;for(P=0;P<N;){const z=y[P++],G=y[P++];try{H=z(H)}catch(Q){G.call(this,Q);break}}try{M=Yd.call(this,H)}catch(z){return Promise.reject(z)}for(P=0,N=A.length;P<N;)M=M.then(A[P++],A[P++]);return M}getUri(t){t=js(this.defaults,t);const a=mp(t.baseURL,t.url,t.allowAbsoluteUrls);return dp(a,t.params,t.paramsSerializer)}};te.forEach(["delete","get","head","options"],function(t){Bs.prototype[t]=function(a,o){return this.request(js(o||{},{method:t,url:a,data:(o||{}).data}))}});te.forEach(["post","put","patch"],function(t){function a(o){return function(f,g,y){return this.request(js(y||{},{method:t,headers:o?{"Content-Type":"multipart/form-data"}:{},url:f,data:g}))}}Bs.prototype[t]=a(),Bs.prototype[t+"Form"]=a(!0)});let wS=class kp{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let a;this.promise=new Promise(function(f){a=f});const o=this;this.promise.then(u=>{if(!o._listeners)return;let f=o._listeners.length;for(;f-- >0;)o._listeners[f](u);o._listeners=null}),this.promise.then=u=>{let f;const g=new Promise(y=>{o.subscribe(y),f=y}).then(u);return g.cancel=function(){o.unsubscribe(f)},g},t(function(f,g,y){o.reason||(o.reason=new Ma(f,g,y),a(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const a=this._listeners.indexOf(t);a!==-1&&this._listeners.splice(a,1)}toAbortSignal(){const t=new AbortController,a=o=>{t.abort(o)};return this.subscribe(a),t.signal.unsubscribe=()=>this.unsubscribe(a),t.signal}static source(){let t;return{token:new kp(function(u){t=u}),cancel:t}}};function kS(e){return function(a){return e.apply(null,a)}}function SS(e){return te.isObject(e)&&e.isAxiosError===!0}const Il={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Il).forEach(([e,t])=>{Il[t]=e});function Sp(e){const t=new Bs(e),a=Qg(Bs.prototype.request,t);return te.extend(a,Bs.prototype,t,{allOwnKeys:!0}),te.extend(a,t,null,{allOwnKeys:!0}),a.create=function(u){return Sp(js(e,u))},a}const At=Sp(Sr);At.Axios=Bs;At.CanceledError=Ma;At.CancelToken=wS;At.isCancel=gp;At.VERSION=wp;At.toFormData=eo;At.AxiosError=Xe;At.Cancel=At.CanceledError;At.all=function(t){return Promise.all(t)};At.spread=kS;At.isAxiosError=SS;At.mergeConfig=js;At.AxiosHeaders=ti;At.formToJSON=e=>fp(te.isHTMLForm(e)?new FormData(e):e);At.getAdapter=yp.getAdapter;At.HttpStatusCode=Il;At.default=At;const{Axios:YM,AxiosError:VM,CanceledError:XM,isCancel:UM,CancelToken:jM,VERSION:GM,all:qM,Cancel:$M,isAxiosError:KM,spread:ZM,toFormData:JM,AxiosHeaders:QM,HttpStatusCode:eT,formToJSON:tT,getAdapter:iT,mergeConfig:sT}=At;/*! js-cookie v3.0.5 | MIT */function Br(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var o in a)e[o]=a[o]}return e}var AS={read:function(e){return e[0]==='"'&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function _l(e,t){function a(u,f,g){if(!(typeof document>"u")){g=Br({},t,g),typeof g.expires=="number"&&(g.expires=new Date(Date.now()+g.expires*864e5)),g.expires&&(g.expires=g.expires.toUTCString()),u=encodeURIComponent(u).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var y="";for(var k in g)g[k]&&(y+="; "+k,g[k]!==!0&&(y+="="+g[k].split(";")[0]));return document.cookie=u+"="+e.write(f,u)+y}}function o(u){if(!(typeof document>"u"||arguments.length&&!u)){for(var f=document.cookie?document.cookie.split("; "):[],g={},y=0;y<f.length;y++){var k=f[y].split("="),A=k.slice(1).join("=");try{var M=decodeURIComponent(k[0]);if(g[M]=e.read(A,M),u===M)break}catch{}}return u?g[u]:g}}return Object.create({set:a,get:o,remove:function(u,f){a(u,"",Br({},f,{expires:-1}))},withAttributes:function(u){return _l(this.converter,Br({},this.attributes,u))},withConverter:function(u){return _l(Br({},this.converter,u),this.attributes)}},{attributes:{value:Object.freeze(t)},converter:{value:Object.freeze(e)}})}var Dl=_l(AS,{path:"/"});const Pe=At.create();Pe.interceptors.request.use(async function(e){const t=so();if(t.isAuthenticated){const a=await t.getAccessToken();e.headers["Accept-Language"]=t.authUser.language,e.headers.Authorization=`Bearer ${a}`}return e},function(e){return Promise.reject(e)});Pe.interceptors.response.use(function(e){return e},function(e){if(e.response.status===418)return ms.push({name:"TwoFA"}),Promise.reject(e);if(e.response.status===429)return Promise.reject(e);if(e.response.status!==401||ms.currentRoute.name==="Login")return e.response.status!==518&&e.config&&!e.config.ignoreErrors&&NA().displayNotification({msg:e.response.data,type:"error"}),Promise.reject(e);const t=Dl.get("refreshToken"),a=so();return e.config.url.endsWith("/token/refresh/")||!t?(a.$reset(),ms.currentRoute.name!=="Login"&&ms.push({name:"Login"}),Promise.reject(e)):Pe.post("/token/refresh/",{refresh:t}).then(o=>{Dl.set("token",o.data.access,{sameSite:"strict"}),Pe.defaults.headers.common.Authorization=`Bearer ${o.data.access}`;const u=e.config;return u.headers.Authorization=`Bearer ${o.data.access}`,new Promise((f,g)=>{Pe.request(u).then(y=>{f(y)}).catch(y=>{g(y)})})}).catch(o=>{Promise.reject(o)})});function CS(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function ES(e,t){return t!=null&&typeof Symbol<"u"&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function MS(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{},o=Object.keys(a);typeof Object.getOwnPropertySymbols=="function"&&(o=o.concat(Object.getOwnPropertySymbols(a).filter(function(u){return Object.getOwnPropertyDescriptor(a,u).enumerable}))),o.forEach(function(u){CS(e,u,a[u])})}return e}var TS=/[[\].]{1,2}/g,Ap=/%\{((?:.|\n)+?)\}/g,PS=/\{\{((?:.|\n)+?)\}\}/g,Dc=function(e){return function(t){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,u=arguments.length>3?arguments[3]:void 0,f=e.silent;!f&&PS.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '.concat(t));var g=t.replace(Ap,function(y,k){var A=function(G,Q){for(var q=Q.split(TS).filter(function(ie){return ie});q.length;)G=G[q.shift()];return G},M=k.trim(),P,N={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function H(z,G,Q){try{P=A(z,G)}catch{}if(P==null){if(Q)return H(Q.ctx,G,Q.parent);console.warn("Cannot evaluate expression: ".concat(G)),P=G}var q=P.toString();return o?q:q.replace(/[&<>"']/g,function(ie){return N[ie]})}return H(a,M,u)});return g}};Dc.INTERPOLATION_RE=Ap;Dc.INTERPOLATION_PREFIX="%{";var Rc=Dc,Xd={getTranslationIndex:function(t,a){switch(a=Number(a),a=typeof a=="number"&&isNaN(a)?1:a,t.length>2&&t!=="pt_BR"&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return a%10!==1||a%100===11?1:0;case"jv":return a!==0?1:0;case"mk":return a===1||a%10===1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":return a>1?1:0;case"lv":return a%10===1&&a%100!==11?0:a!==0?1:2;case"lt":return a%10===1&&a%100!==11?0:a%10>=2&&(a%100<10||a%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return a%10===1&&a%100!==11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"mnk":return a===0?0:a===1?1:2;case"ro":return a===1?0:a===0||a%100>0&&a%100<20?1:2;case"pl":return a===1?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"cs":case"sk":return a===1?0:a>=2&&a<=4?1:2;case"csb":return a===1?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"sl":return a%100===1?0:a%100===2?1:a%100===3||a%100===4?2:3;case"mt":return a===1?0:a===0||a%100>1&&a%100<11?1:a%100>10&&a%100<20?2:3;case"gd":return a===1||a===11?0:a===2||a===12?1:a>2&&a<20?2:3;case"cy":return a===1?0:a===2?1:a!==8&&a!==11?2:3;case"kw":return a===1?0:a===2?1:a===3?2:3;case"ga":return a===1?0:a===2?1:a>2&&a<7?2:a>6&&a<11?3:4;case"ar":return a===0?0:a===1?1:a===2?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5;default:return a!==1?1:0}}},IS=function(e){return{getTranslation:function(a){var o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:null,g=arguments.length>4?arguments[4]:void 0,y=arguments.length>5?arguments[5]:void 0,k=arguments.length>6&&arguments[6]!==void 0?arguments[6]:!1;g===void 0&&(g=e.current);var A=function($,re){return re?e.interpolate($,re,k):$};if(a=a.trim(),!a)return"";var M=g?e.silent||e.muted.indexOf(g)!==-1:!1,P=g;e.sourceCodeLanguage&&(P=e.sourceCodeLanguage);var N=f&&Xd.getTranslationIndex(P,o)>0?f:a,H=e.translations,z=H[g]||H[g.split("_")[0]];if(!z)return M||console.warn("No translations found for ".concat(g)),A(N,y);var G=function($){var re=Xd.getTranslationIndex(g,o);$.length===1&&o===1&&(re=0);var B=$[re];if(!B){if(B==="")return A(N,y);throw new Error(a+" "+re+" "+e.current+" "+o)}return A(B,y)},Q=function(){if(!M){var $="Untranslated ".concat(g," key found: ").concat(a);u&&($+=" (with context: ".concat(u,")")),console.warn($)}return A(N,y)},q=function($){var re=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;if(ES($,Object)){if(Array.isArray($))return G($);var B=re??"",de=$[B];return q(de)}return re||!$?Q():A($,y)},ie=z[a];return q(ie,u)},gettext:function(a,o){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;return this.getTranslation(a,void 0,void 0,void 0,void 0,o,u)},pgettext:function(a,o,u){var f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;return this.getTranslation(o,1,a,void 0,void 0,u,f)},ngettext:function(a,o,u,f){var g=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!1;return this.getTranslation(a,u,null,o,void 0,f,g)},npgettext:function(a,o,u,f,g){var y=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!1;return this.getTranslation(o,f,a,u,void 0,g,y)}}},Lc=IS,Rl=Symbol("GETTEXT");function _S(e){return e.replace(/\r?\n|\r/,"").replace(/\s\s+/g," ").trim()}function Ud(e){var t={};return Object.keys(e).forEach(function(a){var o=e[a],u={};Object.keys(o).forEach(function(f){u[_S(f)]=o[f]}),t[a]=u}),t}var DS=function(){var e=bt(Rl,null);if(!e)throw new Error("Failed to inject gettext. Make sure vue3-gettext is set up properly.");return e},RS=xr({name:"translate",props:{tag:{type:String,default:"span"},translateN:{type:Number,default:null},translatePlural:{type:String,default:null},translateContext:{type:String,default:null},translateParams:{type:Object,default:null},translateComment:{type:String,default:null}},setup:function(t,a){var o=t.translateN!==void 0&&t.translatePlural!==void 0;if(!o&&(t.translateN||t.translatePlural)){var u,f,g;throw new Error("`translate-n` and `translate-plural` attributes must be used together: ".concat((f=(g=a.slots).default)===null||f===void 0||(u=f.call(g)[0])===null||u===void 0?void 0:u.children,"."))}var y=wt(),k=DS(),A=wt(null);Bn(function(){!A.value&&y.value&&(A.value=y.value.innerHTML.trim())});var M=dt(function(){var P,N=Lc(k).getTranslation(A.value,t.translateN,t.translateContext,o?t.translatePlural:null,k.current);return Rc(k)(N,t.translateParams,void 0,(P=ws())===null||P===void 0?void 0:P.parent)});return function(){return A.value?Xs(t.tag,{ref:y,innerHTML:M.value}):Xs(t.tag,{ref:y},a.slots.default?a.slots.default():"")}}}),jd=RS,LS=function(e,t,a,o){var u=o.props||{},f=t.dataset.msgid,g=u["translate-context"],y=u["translate-n"],k=u["translate-plural"],A=y!==void 0&&k!==void 0,M=u["render-html"]==="true";if(!A&&(y||k))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+f+".");!e.silent&&u["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: ".concat(f));var P=Lc(e).getTranslation(f,y,g,A?k:null,e.current),N,H=Object.assign((N=a.instance)!==null&&N!==void 0?N:{},a.value),z=Rc(e)(P,H,M,null);t.innerHTML=z};function Gd(e){var t=function(a,o,u){a.dataset.currentLanguage=e.current,LS(e,a,o,u)};return{beforeMount:function(o,u,f){o.dataset.msgid||(o.dataset.msgid=o.innerHTML),Rt(e,function(){t(o,u,f)}),t(o,u,f)},updated:function(o,u,f){t(o,u,f)}}}var qd={availableLanguages:{en:"English"},defaultLanguage:"en",sourceCodeLanguage:void 0,mutedLanguages:[],silent:!1,translations:{},setGlobalProperties:!0,globalProperties:{language:["$language"],gettext:["$gettext"],pgettext:["$pgettext"],ngettext:["$ngettext"],npgettext:["$npgettext"],interpolate:["$gettextInterpolate"]},provideDirective:!0,provideComponent:!0};function OS(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Object.keys(e).forEach(function(g){if(Object.keys(qd).indexOf(g)===-1)throw new Error("".concat(g," is an invalid option for the translate plugin."))});var t=MS({},qd,e),a=wt(Ud(t.translations)),o=Bi({available:t.availableLanguages,muted:t.mutedLanguages,silent:t.silent,translations:dt({get:function(){return a.value},set:function(g){a.value=Ud(g)}}),current:t.defaultLanguage,sourceCodeLanguage:t.sourceCodeLanguage,install:function(y){if(y[Rl]=o,y.provide(Rl,o),t.setGlobalProperties){var k=y.config.globalProperties,A=t.globalProperties.gettext||["$gettext"];A.forEach(function(M){k[M]=o.$gettext}),A=t.globalProperties.pgettext||["$pgettext"],A.forEach(function(M){k[M]=o.$pgettext}),A=t.globalProperties.ngettext||["$ngettext"],A.forEach(function(M){k[M]=o.$ngettext}),A=t.globalProperties.npgettext||["$npgettext"],A.forEach(function(M){k[M]=o.$npgettext}),A=t.globalProperties.interpolate||["$gettextInterpolate"],A.forEach(function(M){k[M]=o.interpolate}),A=t.globalProperties.language||["$language"],A.forEach(function(M){k[M]=o})}t.provideDirective&&y.directive("translate",Gd(o)),t.provideComponent&&y.component("translate",jd)}}),u=Lc(o),f=Rc(o);return o.$gettext=u.gettext.bind(u),o.$pgettext=u.pgettext.bind(u),o.$ngettext=u.ngettext.bind(u),o.$npgettext=u.npgettext.bind(u),o.interpolate=f.bind(f),o.directive=Gd(o),o.component=jd,o}const NS={},FS={Account:"Kont",Actions:"Oberioù",Add:"Ouzhpennañ",Address:"Chomlec'h","Address book information":"Chomlec'h titouroù al levr","Administered domains":"Domanioù meret",Administrators:"Merourien",Alias:"Alias",Aliases:"Aliasoù","API access":"API moned",Apply:"Arloañ",Authentication:"O vezañ anavezet","Bind/named format. Click to copy":"Stumm Ereet/anvet",Categories:"Rummadoù","Check this option if passwords contained in your file are not crypted":"Kochit an dibarzh ma ne vez ket kriptet ar gerioù-tremen endalc'het en ho restr",City:"Kêr",Close:"Serriñ",Closed:"Serriñ",Company:"Embregerezh",Confirmation:"Kadarnadur",Contacts:"Darempredoù","Continue on error":"Kenderc'hel war ar fazi",Country:"Bro","Create a domain administrator":"Krouit ur merour domani","Create a mailbox for the administrator.":"Krouiñ ur voest-posteloù evit ar merour.","Create aliases":"Krouiñ aliasoù","Creation date":"Deiziad krouidigezh","Crypt passwords":"Kriptañ ar gerioù-tremen",Dashboard:"Taolenn-stur","Default mailbox quota":"Kota boest-posteloù dre-ziouer","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":`Kota arloet d'ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh "0" a dalvez kota ebet.`,Description:"Deskrivadur",Disabled:"Lazhet","DKIM key":"Alc'hwez DKIM",DNS:"DNS","DNS status":"Statud DNS",Domain:"Domani","Domain administrator":"Merour an domani","Domain created":"Domani krouet",Domains:"Domanioù",Email:"Postel","Email address":"Chomlec'h postel","Enable DKIM signing":"Enaouiñ ar sinadur DKIM","Enable DNS checks":"Enaouiñ ar gwiriañ DNS",Enabled:"Enaouet","Expire at":"Diamzeriet da",Failed:"C'hwitet",Forward:"Treuzkas","Forward messages and store copies into your local mailbox":"Treuzkas kemennadennoù ha stokiñ eiladennoù e-barzh ar voest-posteloù lec'hel","Forward updated":"Treuzkas hizivaet","Full name":"Anv klok",General:"Hollek",Identities:"Identelezhioù",Import:"Emporzhiañ","Import domains":"Emporzhiañ domanioù","Import identities":"Emporzhiañ identelezhioù",Information:"Titouroù","Installed version":"Stumm staliet","Keep local copies":"Mirout eiladennoù lec'hel","Last modification date":"Deiziad aozañ diwezhañ","Last name":"Anv familh",Level:"Live",Logger:"Enroller",Logout:"Digevreañ",Mailbox:"Boest-posteloù",Mailboxes:"Boest-posteloù",Message:"Implij",Modified:"Aozet",More:"Muioc'h",Name:"Anv","New account":"Kont nevez","New alias":"Alias nevez","New domain":"Domani nevez",Next:"Da-heul","Not generated":"Neket ganet",Note:"Notenn","One or more updates are available":"Hegerz ez eus un hizivadenn pe muioc'h",Options:"Dibarzhioù","Partially aligned":"Linennet dre an hanter",Password:"Ger-tremen","Passwords mismatch":"Disklotadurioù gerioù-tremen",Phone:"Pellgomz","Phone number":"Niverenn pellgomz",Profile:"Profil","Profile updated":"Profil hizivaet",Quota:"Kota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Kota evit ar voest-posteloù-mañ. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Termeniñ un dalvoudegezh ispisial pe implijit talvoudegezh an domani. Laoskit goullo evit termeniñ un dalvoudegezh divevenn (berzet evit ar verourien zomani).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":`Kota rannet kenetre ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh "0" a dalvez kota ebet.`,"Random address":"Chomlec'h dre-zegouezh","Random password":"Ger-tremen dre-zegouezh","Recipient(s)":"Resever(ien)",Recipients:"Reseverien",Reseller:"Eilgwerzher",Resources:"Mammennoù","Resources usage":"Implij mammennoù",Role:"Rol",Save:"Enrollañ",Search:"Klask","Secondary email":"Eil chomlec'h postel","Sender addresses":"Chomlec'hioù ar c'haser",Separator:"Skejer",Settings:"Arventennoù","Show key":"Diskouez an alc'hwez","Simple user":"Implijer diazez","State/Province":"Stad/Proviñs",Status:"Statud",Summary:"Berradenn","Super administrator":"Dreist-merour","The credentials are the same than the ones you use to access Modoboa.":"An titouroù anaout a vez ar memes re hag ar re a implijit da dizhout Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Evit tizhoù al levr chomlec'hioù-mañ adalek an diavaez (evel da skouer Mozilla Thunderbird war ho poellgomzer), implijit an URL da-heul:",Total:"Hollad",Transport:"Treuzdougen",Type:"Doare",Unknown:"Dizanv","Unknown sources / Threats":"Mammennoù dizanv/Gourdrouzioù",unlimited:"divevennet",Update:"Hizivaat",Updated:"Hizivaet","Use domain default value":"Implijout un dalvoudegezh domani dre-ziouer",Username:"Anv implier","Welcome to Modoboa":"Degemer mat e-barzh Modoboa","With a mailbox":"Gant ur voest-posteloù"},zS={},BS={Account:"Konto",Actions:"Aktionen",Add:"Hinzufügen",Address:"Adresse","Administered domains":"Administrierte Domains",Administrators:"Administratoren",Alias:"Alias",Aliases:"Aliase","API access":"API Zugriff",Apply:"Antworten",Authentication:"Authentifizierung","Bind/named format. Click to copy":"Gebundenes Format","Check this option if passwords contained in your file are not crypted":"Auswählen, wenn Kennwörter in Datei nicht verschlüsselt sind",Close:"Schließen",Closed:"Schließen",Confirmation:"Bestätigung","Continue on error":"Bei Fehler fortfahren","Create a domain administrator":"Domain-Administrator erstellen","Create a mailbox for the administrator.":"Erzeuge Postfach für den Administrator.","Create aliases":"Aliase erstellen","Creation date":"Erstellungsdatum","Crypt passwords":"Passwörter verschlüsseln",Dashboard:"Dashboard",Date:"Datum",Day:"Tag","Default mailbox quota":"Standard Postfach Kontingent","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Auf Postfächer angewendete Quota. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden.",Description:"Beschreibung","Disable 2FA":"Deaktiviere 2-Faktor-Authentifizierung",Disabled:"Deaktiviert","DKIM key":"DKIM Schlüssel",DNS:"DNS","DNS status":"DNS Status",Domain:"Domain","Domain administrator":"Domain Administrator","Domain created":"Domain erstellt.",Domains:"Domains","Email address":"E-Mail Adresse","Enable DKIM signing":"Aktiviere DKIM Signierung","Enable DNS checks":"Aktiviere DNS Prüfungen",Enabled:"Aktiviert","Expire at":"Läuft ab am",Failed:"Fehlgeschlagen",Forward:"Weiterleiten","Forward messages and store copies into your local mailbox":"Nachricht weiterleiten und Kopie in Mailbox ablegen","Forward updated":"Weiterleitung aktualisiert",From:"Von","Full name":"Vollständiger Name",General:"Allgemein",Identities:"Identitäten",Import:"Import","Import domains":"Domains importieren","Import identities":"Identitäten importieren",Information:"Information","Installed version":"Installierte Version","Keep local copies":"Lokale Kopien behalten","Last modification date":"Datum der letzten Änderung",Level:"Stufe",Logger:"Logger",Logout:"Logout",Mailbox:"Postfächer",Mailboxes:"Mailboxen",Message:"Verwendung",Modified:"Verändert",Month:"Monat",Name:"Name","New account":"Neues Konto","New alias":"Neuer Alias","New domain":"Neue Domain","New recovery codes":"Neue Wiederherstellungscodes",Next:"Weiter","Not generated":"Nicht generiert","One or more updates are available":"Eine oder mehrere Aktualisierungen sind verfügbar",Options:"Optionen","Partially aligned":"Teilweise zugeordnet",Password:"Passwort","Passwords mismatch":"Passwörter stimmen nicht überein","Phone number":"Telefonnummer","Pin code":"Pincode",Profile:"Profil","Profile updated":"Profil aktualisiert","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Quota dieses Postfachs. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. Eigenen Wert eingeben oder Voreinstellung der Domain verwenden lassen. Frei lassen, um Quota auf unlimitiert zu setzen (nur Super-Administratoren).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Von Postfächern gemeinsam genutzte Quota/Speicherplatz. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden.","Random address":"Zufällige Adresse","Random password":"Zufälliges Passwort","Recipient(s)":"Empfänger",Recipients:"Empfänger",Register:"Registrieren",Reseller:"Reseller","Reset recovery codes":"Setze Wiederherstellungscodes zurück",Resources:"Ressourcen","Resources usage":"Ressourcen-Verbrauch",Role:"Rolle",Save:"Speichern",Search:"Suchen","Secondary email":"Zweite E-Mail Adresse","Sender addresses":"Ab­sen­der­ad­res­sen ",Separator:"Separator",Settings:"Einstellungen","Show key":"Zeige Schlüssel","Simple user":"Normaler Benutzer",Status:"Status",Summary:"Zusammenfassung","Super administrator":"Super-Administrator",To:"Bis",Total:"Total",Type:"Typ",Unknown:"Unbekannt","Unknown sources / Threats":"Unbekannte Quellen / Bedrohungen",unlimited:"unbegrenzt",Update:"Aktualisieren",Updated:"Aktualisieren","Use domain default value":"Standardwert der Domain verwenden",Username:"Benutzername",Week:"Woche","Welcome to Modoboa":"Willkommen zu Modoboa","With a mailbox":"Mit einem Postfach",Year:"Jahr"},HS={},WS={Account:"Cuenta",Actions:"Acciones",Add:"Agregar",Address:"Dirección","Address book information":"Información del libro de direcciones","Administered domains":"Dominios administrados",Administrators:"Administradores",Alias:"Alias",Aliases:"Alias","API access":"Acceso API",Apply:"Aplicar",Authentication:"Autenticación","Bind/named format. Click to copy":"Formato inválido",Categories:"Categorías","Check this option if passwords contained in your file are not crypted":"Marque esta opción si las contraseñas que contiene su fichero no están cifradas",City:"Ciudad",Close:"Cerrar",Company:"Compañía",Confirmation:"Confirmación",Contacts:"Contactos","Continue on error":"Continúe en error.",Country:"País","Create a domain administrator":"Crear un administrador del dominio","Create a mailbox for the administrator.":"Crear mailbox para el administrador.","Create aliases":"Crear alias","Creation date":"Fecha de creación","Crypt passwords":"Contraseñas cifradas",Dashboard:"Panel de Control",Day:"Día","Default mailbox quota":"Cuota de mailbox por defecto","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite.",Description:"Descripción",Disabled:"Deshabilitado","DNS status":"Estado de DNS",Domain:"Dominio","Domain administrator":"Administrador del dominio","Domain created":"Dominio creado",Domains:"Dominios",Email:"Correo-e","Email address":"Dirección de email","Enable DNS checks":"Activar comprobación de DNS",Enabled:"Activado","Expire at":"Caduca en",Forward:"Siguiente","Forward messages and store copies into your local mailbox":"Reenvía mensajes y guarda copias en su mailbox local","Forward updated":"Reenvío actualizado","Full name":"Nombre completo",General:"General",Identities:"Identidades",Import:"Importar","Import domains":"Importar dominios","Import identities":"Importar identidades",Information:"Información","Installed version":"Versión instalada","Keep local copies":"Mantener copias locales","Last modification date":"Última fecha de modificación","Last name":"Apellidos",Level:"Nivel",Logger:"Logger",Logout:"Salir",Mailbox:"Mailboxes",Mailboxes:"Mailboxes",Message:"Uso",Modified:"Modificado",Month:"Mes",More:"Más",Name:"Nombre","New account":"Nueva cuenta","New alias":"Nuevo alias","New domain":"Nuevo dominio",Next:"Siguiente","Not generated":"Sin definir",Note:"Nota","One or more updates are available":"Una o más actualizaciones están disponibles",Options:"Opciones",Password:"Contraseña","Passwords mismatch":"Las contraseñas no coinciden",Phone:"Teléfono","Phone number":"Número de teléfono","Profile updated":"Perfil actualizado","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Cuota en MB para este mailbox. Defina un valor por defecto o use el del dominio por defecto. Déjelo vacío para definir un valor ilimitado (no permitido para los administradores del dominio)","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite.","Random address":"Dirección aleatoria","Random password":"Dirección aleatoria","Recipient(s)":"Destinatario(s)",Recipients:"Destinatarios",Reseller:"Revendedor",Resources:"Recursos","Resources usage":"Uso de recursos",Role:"Rol",Save:"Guardar",Search:"Buscar","Secondary email":"Email secundario","Sender addresses":"Direcciónes de remitente",Separator:"Separador",Settings:"Configuración","Simple user":"Usuario normal","State/Province":"CC.AA./Provincia",Status:"Estatus",Summary:"Sumario","Super administrator":"Super administrador","The credentials are the same than the ones you use to access Modoboa.":"Las credenciales para acceder a este libro de direcciones son las mismas que usa para acceder a Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acceder remotamente a este libro de direcciones (como con Mozilla Thunderbird o desde su smartphone), use la siguiente URL:",Type:"Tipo",Unknown:"Desconocido",unlimited:"ilimitado",Update:"Actualizar",Updated:"Actualizado","Use domain default value":"Usar el valor por defecto del dominio",Username:"Nombre de usuario",Week:"Semana","Welcome to Modoboa":"Bienvenido a Modoboa","With a mailbox":"Con una mailbox",Year:"Año"},YS=JSON.parse(`{"A documentation of the API is available":"API:n dokumentaatio on saatavilla","A new key will be generated soon. Refresh the page in a moment to see it.":"Uusi avain luodaan pian. Päivitä sivu hetken kuluttua nähdäksesi sen.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Käyttäjä, jolla on kaikki oikeudet, voi tehdä mitä tahansa. Oletusarvoisesti tällaisella käyttäjällä ei ole postilaatikkoa, joten hän ei voi käyttää loppukäyttäjän ominaisuuksia.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Käyttäjä, jolla ei ole oikeuksia mutta jolla on postilaatikko. Hän saa käyttää kaikkia loppukäyttäjän ominaisuuksia: webmail, kalenteri, yhteystiedot, suodattimet.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Käyttäjä, jolla on oikeuksia yhdessä tai useammassa verkkotunnuksessa. Hänellä on oikeus hallinnoida postilaatikoita ja hänellä voi myös olla postilaatikko.","Absolute time range":"Määrämittainen aikaraja","Account":"Tili","Actions":"Toiminnot","Add":"Lisää","Add a new domain alias":"Lisää uusi verkkotunnuksen alias","Add administrator":"Lisää järjestelmänvalvoja","Add sender address":"Lisää lähettäjän osoite","Address":"Osoite","Administered domains":"Hallinnoidut verkkotunnukset","Administrator added":"Järjestelmänvalvoja lisäsi","Administrator name":"Järjestelmänvalvojan nimi","Administrator removed":"Järjestelmänvalvoja poistettu","Administrators":"Ylläpitäjät","Alarms":"Hälytykset","Alias":"Alias","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Tämän postilaatikon alias-nimet. Jos haluat luoda catchall-aliaksen, kirjoita vain verkkotunnus (@domain.tld).","Aliases":"Aliakset","API access":"API-pääsy","API token copied to your clipboard":"API-tunniste kopioitu leikepöydälle","API token created":"API-tunniste luotu","API token deleted":"API-tunniste poistettu","Apply":"Käytä","Audit trail":"Tarkastusketju","Authentication":"Tunnistautuminen","Auto configuration":"Automaattinen asetusten määrittäminen","autoconfig record (Mozilla) not found":"autoconfig-tallennetta (Mozilla) ei löydy","autoconfig record (Mozilla): %{ value }":"autoconfig-tietue (Mozilla): %{ value }","autodiscover record (Microsoft) not found":"autodiscover-tietuetta (Microsoft) ei löydy","autodiscover record (Microsoft): %{ value }":"autodiscover-tietue (Microsoft): %{ value }","Back":"Takaisin","Bind/named format. Click to copy":"Bind/nimetty muoto. Kopioi klikkaamalla","Cancel":"Peruuta","Check this option if passwords contained in your file are not crypted":"Valitse tämä vaihtoehto, jos tiedostosi sisältämiä salasanoja ei ole salakirjoitettu","Choose a domain":"Valitse verkkotunnus","Choose a role":"Valitse käyttäjätyyppisi","Close":"Sulje","Confirm and create":"Vahvista ja luo","Confirmation":"Vahvistus","Continue on error":"Jatka virheestä","Control if this domain will be allowed to send and receive messages":"Määritä, saako tämä verkkotunnus lähettää ja vastaanottaa viestejä","Copy to clipboard":"Kopioi leikepöydälle","Copy token to clipboard":"Kopioi turvatunnus leikepöydälle","Create a domain administrator":"Luo verkkotunnuksen ylläpitäjä","Create a mailbox for the administrator.":"Luo ylläpitäjän postilaatikko.","Create aliases":"Luo aliaksia","Create standard aliases for the domain.":"Luo verkkotunnuksen tavanomaiset aliakset.","Creation date":"Luontipäivä","Crypt passwords":"Salakirjoita salasanat","Current password":"Nykyinen salasana","Daily message sending limit":"Päivittäinen viestien lähetysraja","Daily sending limit":"Päivittäinen lähetysraja","Dashboard":"Työpöytä","Date":"Päivämäärä","Day":"Päivä","Default mailbox quota":"Oletuspostilaatikkokiintiö","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Postilaatikoihin sovellettava oletuskiintiö. Voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Arvo 0 tarkoittaa, ettei kiintiötä ole.","Delete":"Poista","Delete token":"Poista avain","Description":"Kuvaus","Disable 2FA":"Poista kaksivaiheinen tunnistautuminen (2FA) käytöstä","Disabled":"Pois käytöstä","DKIM key":"DKIM-avain","DKIM key length":"DKIM-avaimen pituus","DKIM key selector":"DKIM-avaimen valitsin-tietue","DKIM keys already exist for this domain. Do you want to overwrite them?":"DKIM-avaimet ovat jo olemassa tälle verkkotunnukselle. Haluatko korvata ne?","DKIM public key for":"DKIM julkinen avain tietueelle","DKIM record found":"DKIM-tietue löydetty","DKIM record not found":"DKIM-tietuetta ei löydy","DKIM signing":"DKIM-allekirjoitus","DMARC record found":"DMARC-tietue löydetty","DMARC record not found":"DMARC-tietuetta ei löydy","DNS":"DNS","DNS checks":"DNS-tarkistukset","DNS configuration help":"DNS-määritysapu","DNS status":"DNS-tila","Do not delete account folder":"Älä poista tilikansiota","Do not delete domain folder":"Älä poista verkkotunnuksen kansiota","Domain":"Verkkotunnus","Domain administrator":"Luo verkkotunnuksen ylläpitäjä","Domain alias created":"Verkkotunnuksen alias luotu","Domain alias deleted":"Verkkotunnuksen alias poistettu","Domain alias updated":"Verkkotunnuksen alias päivitetty","Domain created":"Verkkotunnus luotu","Domain default value":"Verkkotunnuksen oletusarvo","Domain name (ex: domain.tld)":"Verkkotunnus (esim. domain.tld)","domain's default value":"verkkotunnuksen oletusarvo","Domains":"Sinulla ei ole oikeutta tuoda verkkotunnuksia","Don't treat duplicated objects as errors":"Älä käsittele päällekkäisiä objekteja virheinä","Edit":"Muokkaa","Edit account":"Muokkaa tiliä","Edit alias":"Muokkaa aliasta","Edit domain":"Muokkaa verkkotunnusta","Edit domain alias":"Muokkaa verkkotunnusta","Email":"Sähköposti","Email address":"Sähköpostiosoite","Empty":"Tyhjä","Enable DKIM signing":"Ota DKIM-allekirjoitus käyttöön","Enable DNS checks":"Ota DNS-tarkistukset käyttöön","Enabled":"Käytössä","Enter a simple username or an email address":"Anna yksinkertainen käyttäjätunnus tai sähköpostiosoite","Enter an email address":"Syötä oikean muotoinen sähköpostiosoite","Ex: 10MB. Leave empty for no limit":"Esim: 10 MB. Jätä tyhjäksi, jos et halua rajoitusta","Expire at":"Vanhenee","Export accounts and aliases to CSV":"Vie tilit ja aliakset CSV-tiedostoon","Export domains and aliases to CSV":"Vie verkkotunnukset ja aliakset CSV-tiedostoon","First name":"Etunimi","Forward":"Välitä","Forward messages and store copies into your local mailbox":"Välitä viestit ja tallenna kopiot paikalliseen postilaatikkoon","Forward updated":"Välitystieto päivitetty","From":"Lähde","Full name":"Koko nimi","General":"Yleiset","General information":"Yleiset tiedot","General settings":"Yleiset asetukset","Generate":"Luo","Generate a new DKIM key":"Luo uusi DKIM-avain","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Tässä on esimerkki DNS-määrityksistä (bind-muodossa). Korvaa [ ]:n välissä olevat arvot sopivilla arvoilla.","Identification":"Tunniste","Identities":"Identiteetit","If you close this form now, your modifications won't be saved. Do you confirm?":"Jos suljet tämän lomakkeen nyt, muutokset eivät tallennu. Vahvistatko?","Import":"Tuonti","Import accounts and aliases from CSV file":"Tuo tilejä ja aliaksia CSV-tiedostosta","Import domains":"Tuo verkkotunnuksia","Import domains and aliases from CSV file":"Tuo verkkotunnukset ja aliakset CSV-tiedostosta","Import identities":"Tuo identiteetit","Indicate one or more recipients separated by a comma (,)":"Ilmoita yksi tai useampi vastaanottaja pilkulla (,) erotettuna","Installed version":"Asennettu versio","Keep local copies":"Säilytä paikallisia kopioita","Language":"Kieli","Last login date":"Viimeisin kirjautumispäivä","Last modification date":"Viimeisin muutospäivä","Last name":"Sukunimi","Leave empty for no limit":"Jätä tyhjäksi, jos rajaa ei ole","Level":"Taso","Limitations":"Rajoitukset","Logger":"Lokikirja","Logout":"Kirjaudu ulos","Mailbox":"Postilaatikko","Mailboxes":"Postilaatikot","Message":"Viesti","Message history":"Viestien historia","Message sending limit":"Viestien lähetysraja","messages":"viestit","Messages":"Viestit","Modified":"Muokattu","Modify":"Muokkaa","Month":"Kuukausi","MX records":"MX-tietueet","Name":"Nimi","Name of the administrator":"Ylläpitäjän nimi","Never logged-in":"Ei koskaan kirjautunut sisään","New":"Uusi","New account":"Uusi tili","New alias":"Uusi alias","New domain":"Uusi verkkotunnus","New recovery codes":"Uudet palautuskoodit","Next":"Seuraava","no":"ei","No":"Ei","No sender address defined for this account":"Tälle tilille ei ole määritelty lähettäjän osoitetta","No sending limit":"Ei lähetysrajaa","Not generated":"Ei luotu","Number of messages this domain can send per day. Leave empty for no limit.":"Viestien määrä, jonka tämä verkkotunnus voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Viestien määrä, jonka tämä postilaatikko voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta.","OK":"OK","One or more updates are available":"Yksi tai useampi päivitys on saatavilla","Opened alarms":"Avatut hälytykset","Options":"Vaihtoehdot","Parameters updated":"Parametrit päivitetty","Password":"Salasana","Password copied to clipboard":"Salasana kopioitu leikepöydälle","Password updated":"Salasana päivitetty","Passwords mismatch":"Salasanat eivät täsmää","Pending":"Odottaa","Period":"Jakso","Phone number":"Puhelinnumero","Pin code":"Pin-koodi","Problem":"Ongelma","Proceed":"Jatka","Profile":"Profiili","Profile updated":"Profiili päivitetty","Provide a CSV file where lines respect one of the following formats:":"Toimita CSV-tiedosto, jonka rivit ovat jossakin seuraavista muodoista:","Queue ID":"Jonon ID","Quota":"Verkkotunnuksen oletuskiintiö","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Tämän postilaatikon kiintiö, joka voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Määritä oma arvo tai käytä toimialueen oletusarvoa. Jätä tyhjäksi, jos haluat määrittää rajoittamattoman arvon (ei sallittu toimialueen ylläpitäjille).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Postilaatikoiden kesken jaettu kiintiö. Voidaan ilmaista kilotavuina (KB), megatavuina (MB) (oletus) tai gigatavuina (GB). Arvo 0 tarkoittaa, ettei kiintiötä ole.","Random address":"Satunnainen osoite","Random password":"Satunnainen salasana","Raw format. Click to copy":"Raakamuoto. Kopioi napsauttamalla","Recipient(s)":"Vastaanottaja(t)","Recipients":"Vastaanottajat","Register":"Rekisteröidy","Relative time ranges":"Suhteelliset aikavälialueet","Relay":"Välitysrele","Remove this address":"Poista tämä osoite","Remove this administrator":"Poista tämä ylläpitäjä","Reseller":"Jälleenmyyjä","Resources":"Resurssit","Resources usage":"Resurssien käyttö","Role":"Rooli","Save":"Tallenna","Search":"Hae","Secondary email":"Toissijainen sähköpostiosoite","Select an account":"Valitse tili","Select file":"Valitse tiedosto","Sender address added":"Lähettäjän osoite lisätty","Sender address deleted":"Lähettäjän osoite poistettu","Sender addresses":"Lähettäjän osoitteet","Sending limit":"Lähetysraja","Separator":"Erotin","Service":"Palvelu","Settings":"Asetukset","Show key":"Näytä avain","Simple user":"Yksinkertainen käyttäjä","Specify an email address":"Määritä sähköpostiosoite","SPF record found":"SPF-tietue löydetty","SPF record not found":"SPF-tietuetta ei löydy","Start typing a name here...":"Aloita nimen kirjoittaminen tästä...","Status":"Tila","Summary":"Yhteenveto","Super administrator":"Pääylläpitäjä","The first element of each line is mandatory and must be equal to one of the previous values.":"Kunkin rivin ensimmäinen elementti on pakollinen, ja sen on oltava yhtä suuri kuin jokin edellisistä arvoista.","To":"Vastaanottaja","Transport":"Siirto","Type":"Tyyppi","Unknown":"Tuntematon","unlimited":"rajoittamaton","Update":"Päivitä","Update Password":"Vaihda salasana","Update settings":"Päivitä asetukset","Updated":"Päivitetty","Use domain default value":"Käytä verkkotunnuksen oletusarvoa","Username":"Käyttäjätunnus","Username:":"Käyttäjätunnus:","Valid":"Kelvollinen","Warning":"Varoitus","Week":"Viikko","Welcome to Modoboa":"Tervetuloa Modoboaan","With a mailbox":"Postilaatikolla","With mailbox":"Postilaatikolla","Year":"Vuosi","yes":"kyllä","Yes":"Kyllä","You are about to delete your API access token":"Olet poistamassa API-pääsytunnistetta","You can use a different character as separator.":"Voit käyttää erottimena eri merkkiä.","Your API token has not been generated yet.":"API-pääsytunnistetta ei ole vielä luotu.","Your API token is:":"API-pääsytunnisteesi on:"}`),VS=JSON.parse(`{"(the domain will be created locally)":"(Le domaine sera créé automatiquement)","%{ n } event imported":["%{n} évènement importé","%{ n} évènements importés","%{n} évènements importés"],"A documentation of the API is available":"Une documentation de l'API est disponible","A new key will be generated soon. Refresh the page in a moment to see it.":"Une nouvelle clé sera générée bientôt. Actualisez dans un moment la page pour la voir.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Un utilisateur ayant tous les privilège, peut tout faire. Par défaut, il n'a pas de boîte mail et ne peut donc pas accéder aux fonctionnalités d'un utilisateur final.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Un utilisateur sans privilèges mais ayant une boîte mail. Il sera autorisé à utiliser toutes les fonctionnalités de l'utilisateur final : webmail, calendrier, contacts, filtres.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Un utilisateur avec des privilèges sur un ou plusieurs domaines. Il sera autorisé à administrer les boîtes mail et il peut avoir aussi une boîte aux lettres.","Absolute time range":"Plage de temps absolue","Access rules":"Règles d'accès","Account":"Compte","Account deleted":"Compte supprimé","Account settings":"Paramètres du compte","Accounts":"Comptes","Actions":"Actions","Activate filter set":"Activer le jeu de filtre","Activate your auto reply from this date":"Activez votre réponse automatique à partir de cette date","Activate your auto reply until this date":"Activez votre réponse automatique jusqu'à cette date","active":"actif","Active":"Actif","Add":"Ajouter","Add a category":"Ajouter une catégorie","Add a new domain alias":"Ajouter un nouvel alias de domaine","Add action":"Ajouter une action","Add administrator":"Ajouter un administrateur","Add category":"Ajouter une catégorie","Add condition":"Ajouter une condition","Add filter set":"Ajouter un jeu de filtre","Add new filter":"Ajouter un nouveau filtre","Add sender address":"Ajouter l'adresse de l'expéditeur","Add to contacts":"Ajouter aux contacts","Add/Remove from the domain page":"Ajouter/Supprimer depuis la page du domaine","Added On":"Ajouté le","Address":"Adresse","Address (hostname or IP)":"Adresse (nom d'hôte ou IP)","Address book information":"Information du carnet d'adresse","Administered domains":"Domaines administrés","Administrator added":"L'administrateur a ajouté","Administrator name":"Nom de l'administrateur","Administrator removed":"Administrateur supprimé","Administrators":"Administrateurs","Administrators of":"Administrateurs de","Alarm closed":"Alarme fermée","Alarm deleted":"Alarme supprimée","Alarm re-opened":"Alarme ré-ouverte","Alarms":"Alarmes","Alarms deleted":"Alarmes supprimées","Alias":"Alias","Alias already added":"Alias déjà ajouté","Alias already exists, redirecting to edit page":"L'alias existe déjà, redirection vers la page de modification","Alias deleted":"Alias supprimé","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Alias(s) de cette boîte aux lettres. Pour créer un alias fourre-tout, entrer uniquement le nom du domaine (@domain.tld).","Aliases":"Alias","Alignment":"Alignement","All messages":"Tous les messages","All of the following":"Tous les éléments suivants","An intermediate user who has the same privileges than a Domain administrator, plus the possibility to create domains and to assign resources.":"Un utilisateur intermédiaire qui a les mêmes privilèges qu'un administrateur de domaine, et la possibilité de créer des domaines et d'affecter des ressources.","Any of the following":"Un des éléments suivants","API access":"Accès API","API token copied to your clipboard":"Jeton API copié dans votre presse-papier","API token created":"Jeton API créé","API token deleted":"Jeton API supprimé","Apply":"Appliquer","Are you sure you want to delete this alias?":"Voulez-vous réellement supprimer cet alias ?","Are you sure you want to delete this identity ?":"Voulez-vous réellement supprimer cette identité ?","Associated domain":"Domaine associé","Associated domains":"Domaines associés","Attach":"Joindre","Attachments":"Pièce jointes","Attempting to log you in.":"Tentative de connexion.","Attendees":"Participants","Audit trail":"Journal des modifications","Authentication":"Authentification","Auto configuration":"Configuration automatique","Auto-reply message":"Message de réponse automatique","Auto-reply message updated":"Message de réponse automatique mis à jour","autoconfig record (Mozilla) not found":"Enregistrement autoconfig (Mozilla) introuvable","autoconfig record (Mozilla): %{ value }":"Enregistrement autoconfig (Mozilla) : %{ value }","autodiscover record (Microsoft) not found":"Enregistrement autodiscover (Microsoft) non trouvé","autodiscover record (Microsoft): %{ value }":"Enregistrement autodiscover (Microsoft): %{ value }","Back":"Retour","Backup codes":"Codes de récupération","Bcc":"Cci","Bind/named format. Click to copy":"Format bind/named. Cliquez pour copier","Birth date":"Date de naissance","Calendar":"Calendrier","Calendar created":"Calendrier créé","Calendar deleted":"Calendrier supprimé","Calendar information":"Information du calendrier","Calendar sharing":"Partage de calendrier","Calendar updated":"Calendrier mis à jour","Cancel":"Annuler","Categories":"Catégories","Category deleted":"Catégorie supprimée","Cc":"Cc","Change the value of <strong>Default password scheme</strong>":"Changez la valeur de <strong>Méthode de chiffrement par défaut</strong>","Check connection:":"Vérifier la connexion :","Check out the following list to find related components":"Consulter la liste suivante pour trouver des composants associés","Check this option if passwords contained in your file are not crypted":"Cochez cette option si les mots de passe contenus dans votre fichier ne sont pas chiffrés","Choose a domain":"Choisissez un domaine","Choose a header":"Choisissez un entếte","Choose a role":"Choisissez un rôle","Choose an action":"Choisissez une action","Choose an operator":"Choisissez un opérateur","Choose columns to display":"Choisir les colonnes à afficher","City":"Ville","Click here to copy the key":"Cliquer ici pour copier la clé","Close":"Fermer","Close alarm":"Fermer l'alarme","Closed":"Fermé","Color":"Couleur","Company":"Société","Compose":"Ecrire","Compress this mailbox":"Compresser cette boîte aux lettres","Conditions":"Conditions","Confirm and create":"Confirmer et créer","Confirmation":"Confirmation","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Félicitations ! L'authentification à deux facteurs utilisant des mots de passe jetable est désormais active pour votre compte.","Contact added to address book":"Contact ajouté au carnet d'adresse","Contacts":"Contacts","Content":"Contenu","Continue on error":"Continuer en cas d'erreur","Control if this domain will be allowed to send and receive messages":"Contrôler si ce domaine sera autorisé à envoyer et recevoir des messages.","Copy key to clipboard":"Copier la clé dans la presse-papiers","Copy to clipboard":"Copier dans le presse-papiers","Copy token to clipboard":"Copier le jeton dans la presse-papiers","Could not save parameters":"Impossible de sauvegarder les paramètres","Country":"Pays","Create":"Créer","Create a domain administrator":"Créer un administrateur de domaine","Create a mailbox for the administrator.":"Créer une boite aux lettres pour l'administrateur","Create a new filter set":"Créer un nouveau jeu de filtre","Create a new mailbox":"Créer une nouvelle boîte aux lettres","Create aliases":"Créer des alias","Create new mailbox":"Créer une nouvelle boîte aux lettres","Create standard aliases for the domain.":"Créer des aliases standard pour le domaine","Creation date":"Date de création","Creation denied":"Création interdite","Crypt passwords":"Chiffrer les mots de passe","CSV seems to be badly formatted":"Le fichier CSV semble être mal formaté","Current password":"Mot de passe actuel","Customize displayed columns":"Personnaliser les colonnes affichées","Daily message sending limit":"Limite quotidienne d'envoi de messages","Daily sending limit":"Limite d'envoi quotidienne","Dashboard":"Tableau de bord","Date":"Date","Day":"Jour","Default mailbox quota":"Quota par défaut pour une boîte aux lettres","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Quota par défaut appliqué aux boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota.","Delete":"Supprimer","Delete filter set":"Supprimer le jeu de filtre","Delete this mailbox":"Supprimer cette boite aux lettres","Delete this mailbox?":"Supprimer cette boite aux lettres ?","Delete token":"Supprimer le jeton","Description":"Description","Detail":"Détail","Disable":"Desactiver","Disable 2FA":"Désactiver l'authentification à double facteur","Disable links":"Desactiver les liens","Disabled":"Désactivés","Display address book information":"Afficher les informations du carnet d'adresse","Display name":"Nom affiché","Display source":"Afficher la source","DKIM key":"Clé DKIM","DKIM key copied to clipboard":"Clé DKIM copiée dans le presse-papier","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"La génération de la clé DKIM ne semble pas avoir eu lieu ou a échoué. Voulez vous replanifier cette action ?","DKIM key length":"Longeur de clé DKIM","DKIM key selector":"Sélecteur de clé DKIM","DKIM keys already exist for this domain. Do you want to overwrite them?":"Des clés DKIM existent déjà pour ce domaine. Voulez-vous les écraser?","DKIM public key for":"Clé publique DKIM pour ","DKIM record found":"Enregistrement DKIM trouvé","DKIM record not found":"Enregistrement DKIM introuvable","DKIM signing":"Signature DKIM","DMARC":"DMARC","DMARC record found":"Enregistrement DMARC trouvé","DMARC record not found":"Enregistrement DMARC introuvable","DMARC support does not seem to be enabled for this domain.":"La support DMARC ne semble pas actif pour ce domaine.","DNS":"DNS","DNS checks":"Vérifications DNS","DNS configuration for ":"Configuration DNS pour","DNS configuration help":"Aide à la configuration du DNS","DNS status":"Statut DNS","Do not delete account folder":"Ne pas supprimer le dossier du compte","Do not delete domain folder":"Ne pas supprimer le dossier des domaines","Do you really want to delete the domain %{ domain }?":"Voulez-vous réellement supprimer le domaine %{ domaine } ?","Do you really want to delete this calendar?":"Voulez-vous vraiment supprimer ce calendrier ?","Do you really want to delete this WebAuthn device?":"Voulez vous vraiment supprimer ce périphérique Webauthn ?","Domain":"Domaine","Domain administrator":"Administrateur de domaine","Domain alias created":"Alias de domaine créé","Domain alias deleted":"Alias de domaine supprimé","Domain alias updated":"Alias de domaine mise à jour","Domain created":"Domaine créé","Domain default value":"Valeur du domaine par défaut","Domain deleted":"Supprimer le domaine","Domain name (ex: domain.tld)":"Nom de domaine (ex: domaine.tld)","domain's default value":"La valeur par défaut du domaine","Domains":"Domaines","Don't treat duplicated objects as errors":"Ne pas traiter les objets dupliqués comme des erreurs","Download filter set":"Télécharger le jeu de filtre","E-mail":"Courriel","Edit":"Modifier","Edit account":"Modifier le compte","Edit alias":"Modifier l'alias","Edit calendar":"Modifier le calendrier","Edit category":"Modifier la catégorie","Edit contact":"Modifier le contact","Edit domain":"Modifier le domaine","Edit domain alias":"Modifier l'alias de domaine","Edit event":"Modifier l'évènement","Edit filter":"Modifier le filtre","Edit mailbox":"Modifier la boite aux lettres","Edit provider":"Modifier le fournisseur","Edit this mailbox":"Modifier cette boite aux lettres","Edit your device":"Modifier votre périphérique","Edition":"Modification","Email":"E-mail","Email address":"Adresse email","Email providers":"Fournisseurs de messagerie","Email sent":"Message envoyé","Empty":"Vide","Empty mailbox":"Vider la boite aux lettres","Enable":"Activer","Enable DKIM signing":"Activer la signature DKIM","Enable DNS checks":"Activer les tests DNS","Enable links":"Activer les liens","Enabled":"Activé","Enter a name to register a new webauthn device.":"Renseignez un nom pour enregistrer un nouveau périphérique webauthn.","Enter a simple username or an email address":"Entrer un nom d'utilisateur simple ou une adresse e-mail","Enter an email address":"Entrer une adresse e-mail","Event added":"Evènement ajouté","Event deleted":"Evènement supprimé","Event updated":"Evènement mis à jour","Ex: 10MB. Leave empty for no limit":"Ex: 10MB. Laisser vide pour aucune limite","Expire at":"Expire le","Export accounts and aliases to CSV":"Exporter les comptes et les alias au format CSV","Export domains and aliases to CSV":"Exporter les domaines et les alias au format CSV","Failed":"Échoué","Failed to display template. Using raw mode":"Impossible d'afficher le modèle. Utilisation du mode brut","Feel free to improve the translations":"N'hésitez pas à améliorer les traductions","Field is required":"Ce champ est requis","Filter added":"Filtre ajouté","Filter disabled":"Filtre desactivé","Filter enabled":"Filtre activé","Filter removed":"Filtre supprimé","Filter set activated":"Jeu de filtre activé","Filter set created":"Jeu de filtre créé","Filter set removed":"Jeu de filtre supprimé","Filter set updated":"Jeu de filtre mis à jour","Filter updated":"Filtre mis à jour","Filters":"Filtres","First name":"Prénom","Forward":"Transfert","Forward messages and store copies into your local mailbox":"Transférer les messages et stocker des copies dans votre boîte aux lettres locale","Forward updated":"Transfert mise à jour","Forwarded":"Transféré","Forwarders with ARC":"Transporteur avec ARC","From":"De","Full address":"Adresse complète","Full name":"Nom complet","Fully aligned":"Entièrement aligné","General":"Général","General information":"Information générale","General settings":"Paramètres généraux ","Generate":"Générer","Generate a new DKIM key":"Générer une nouvelle clé DKIM","Generated address":"Adresse générée","Go to <strong>Settings > General</strong> section":"Allez dans la section <strong>Paramètres > Général</strong>","here":"ici","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Voici un exemplaire de configuration DNS (format bind). Remplacer les valeurs entre [ ] par les valeurs appropriées.","Identification":"Identification","Identities":"Identités","If you close this form now, your modifications won't be saved. Do you confirm?":"Si vous fermez ce formulaire maintenant, vos modifications ne seront pas sauvegardées. Confirmez-vous ?","If you configured it recently, please wait for the first report to be received and processed.":"Si vous l'avez récemment configuré, veuillez attendre que le premier rapport soit reçu et traité. ","IMAP Migration":"Migration IMAP","IMAP Port":"Port IMAP","Import":"Importer","Import accounts and aliases from CSV file":"Importation de comptes et alias à partir d'un fichier CSV","Import domains":"Importer des domaines","Import domains and aliases from CSV file":"Importation de domaines et alias à partir d'un fichier CSV","Import events":"Importer des évènements","Import identities":"Importer des identités","Important messages":"Messages importants","inactive":"inactif","Indicate one or more recipients separated by a comma (,)":"Indiquer un ou plusieurs destinataires séparés par une virgule (,) ","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informez <strong>TOUS</strong> vos utilisateurs qu'ils doivent se connecter à Modoboa pour compléter cette opération","Information":"Information","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Installez un logiciel d'authentification de jeton comme FreeOTP ou google\\n Authentification depuis votre magasin d'applications et utilisez\\n cette application pour scanner ce QR code.","Installed components":"Composants installés","Installed version":"Version installée","Invalid port number":"Numéro de port incorrect","Is the IMAP connection secured using SSL/TLS or StartTLS":"La connexion IMAP est-elle sécurisée via l'utilisation de SSL/TLS ou StartTLS","Keep local copies":"Conserver des copies locales","Language":"Langage","Language does no exist":"Cette langue n'existe pas","Last login":"Dernière connexion","Last login date":"Date de dernière connexion","Last modification":"Dernière modification","Last modification date":"Date de dernière modification","Last name":"Nom de famille","Last Name":"Nom","Last Used":"Dernière utilisation","Latest news":"Dernières nouvelles","Latest version":"Dernière version","Leave empty for no limit":"Laisser vide pour aucune limite","Less":"Moins","Level":"Niveau","Limitations":"Limites","Local domain (optional)":"Domaine local (optionnel)","Logger":"Logger","Logout":"Déconnexion","Logout / Login with your current account so its password gets updated":"Re-connectez vous avec votre compte courant pour que son mot de passe soit mis à jour","Mailbox":"Boîte aux lettres","Mailbox compressed":"Boite aux lettres compressées","Mailbox created":"Boite aux lettres créée","Mailbox deleted":"Boite aux lettres supprimée","Mailbox renamed":"Boite aux lettres renommée","Mailboxes":"Boîtes aux lettres","Make sure <strong>Update password scheme at login</strong> option is enabled":"Assurez vous que l'option <strong>Mettre à jour la méthode de chiffrement du mot de passe à la connexion</strong> est activée","Mark as followed":"Marquer comme suivi","Mark as read":"Marqué comme lu","Mark as unfollowed":"Marqué comme non suivi","Mark as unread":"Marquer comme non lu","MB":"Mo","Message":"Message","Message deleted":"Marquer comme supprimé","Message filters":"Filtres de messages","Message history":"Historique des messages","Message marked as junk":"Message marqué comme pourriel","Message marked as not junk":"Message marqué comme légitime","Message sending limit":"Limite d'envoi des messages","Message(s) deleted":"Message(s) supprimé(s)","Message(s) flagged":"Message(s) marqué(s)","Message(s) marked as junk":"Message(s) marqués comme pourriel","Message(s) marked as not junk":"Message(s) marqué(s) comme légitime(s)","messages":"messages","Messages":"Messages","Migration deleted":"Migration supprimée","Migrations":"Migrations","Minimum length is %{ length }":"La taille minimale est %{ length }","Modified":"Modifié","Modify":"Modifier","Monitoring":"Supervision","Month":"Mois","More":"Plus","Move down":"Déplacer vers le bas","Move up":"Déplacer vers le haut","Must be a numeric value or empty":"Valeur numérique requise, ou pas de valeur","MX records":"Enregistrements MX","My calendars":"Mes calendriers","name":"nom","Name":"Nom","Name of the administrator":"Nom de l'administrateur","Name of the domain to migrate":"Nom du domaine à migrer","Name:":"Nom :","Name: ":"Nom :","Never":"Jamais","Never logged-in":"Jamais connecté","New":{"":"Nouvelle","male":"Nouveau"},"New account":"Nouveau compte","New alias":"Nouvel alias","New calendar":"Nouveau calendrier","New contact":"Nouveau contact","New device name":"Nom du nouveau périphérique","New domain":"Nouveau domaine","New event":"Nouvel évènement","New filter":"Nouveau filtre","New provider":"Nouveau fournisseur","New recovery codes":"Nouveaux codes de récupération","Next":"Suivant","no":"non","No":"Non","No associated domains":"Aucun domaine associé","No data to export":"Aucune donnée à exporter","No domain managed":"Aucun domaine géré","No message yet in this mailbox":"Aucun message dans cette boite aux lettres","No quota":"Pas de quota","No sender address defined for this account":"Aucune adresse d'expéditeur définie pour ce compte","No sending limit":"Pas de limite d'envoi","No two-factor authentificator is yet set for your account.":"Aucune authentification à deux facteurs n'est encore active pour votre compte.","Not a valid email":"Ce n'est pas un email correct","Not generated":"Non générée","Note":"Note","Number of allowed mailbox aliases:":"Nombre d'alias autorisé :","Number of allowed mailboxes:":"Nombre de boites aux lettres autorisé :","Number of associated alias:":"Nombre d'alias associés :","Number of associated domains:":"Nombre de domaines associés :","Number of messages this domain can send per day. Leave empty for no limit.":"Nombre de messages que ce domaine peut envoyer par jour. Laisser vide pour aucune limite.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Nombre de messages que cette boîte aux lettres peut envoyer par jour. Laisser vide pour aucune limite.","OK":"OK","Old account":"Ancien compte","on":"le","One or more updates are available":"Une ou plusieurs mise à jour sont disponibles","One-time passwords":"Mots de passe jetables","Opened":"Ouvert","Opened alarms":"Alarmes ouvertes","Options":"Options","or suggest a new language":"ou suggérer une nouvelle langue","Parameters updated":"Paramètres mis à jour","Parent mailbox":"Boite aux lettres parent","Partially aligned":"Partiellement aligné","Partially trusted sources / Forwarders":"Sources partiellement fiables / Transitaires","Password":"Mot de passe","Password copied to clipboard":"Mot de passe copié dans la presse-papier","Password mismatch":"Le mot de passe est différent","Password updated":"Mot de passe mis à jour","Passwords mismatch":"Les mots de passe diffèrent","Pending":"En attente","Period":"Période","Phone":"Téléphone","Phone number":"Numéro de téléphone","Pin code":"Code Pin","Please add at least one recipient.":"Veuillez ajouter au moins un destinataire","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Veuillez noter que vous verrez ce message jusqu'à ce que <strong>TOUS</strong> les mots de passe de vos utilisateurs aient été convertis en utilisant la nouvelle méthode.","Port":"Port","Position":"Rôle","Problem":"Problème","Proceed":"Procéder","Profile":"Profil","Profile updated":"Profil mis à jour","Provide a CSV file where lines respect one of the following formats:":"Fournir un fichier CSV dont les lignes respectent l'un des formats suivants:","Provide one or more addresses":"Fournir une ou plusieurs adresses","Provider":"Fournisseur","Provider created":"Fournisseur créé","Provider deleted":"Fournisseur supprimé","Provider name":"Nom du fournisseur","Provider updated":"Fournisseur mis à jour","Providers":"Fournisseurs","Queue ID":"ID de file","Quota":"Quota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Quota pour cette boite. Peut être exprimé en Ko, Mo (défaut) ou Go. Définir une valeur spécifique ou utiliser la valeur par défaut du domaine. Laisser vide pour définir une valeur illimitée (interdit pour les admins. de domaine).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota.","Quota: ":"Quota :","Random address":"Adresse aléatoire","Random password":"Mot de passe aléatoire","Raw format. Click to copy":"Format brut. Cliquer pour copier","Raw mode":"Mode brut","Read":"Lecture","Recipient(s)":"Destinataire(s)","Recipients":"Destinataires","Register":"Enregistrer","Register authenticator":"Enregistrer l'authentificateur","Registered Webauthn devices":"Péréphériques Webauthn enregistrés","Relative time ranges":"Intervalles des temps relatifs","Relay":"Relais","Relay domain":"Domaine relais","Reload":"Recharger","Remove action":"Supprimer l'action","Remove condition":"Supprimer la condition","Remove this address":"Supprimer cette adresse","Remove this administrator":"Supprimer cet administrateur","Reopen alarm":"Ré-ouvrir l'alarme","Reply":"Répondre","Reply all":"Répondre à tous","Reseller":"Revendeur","Reset recovery codes":"Rénitialiser les codes de récupération","Resources":"Ressources","Resources usage":"Utilisation des ressources","Role":"Rôle","Save":"Enregistrer","Save your changes":"Sauvegardez vos changements","Search":"Chercher","Search in messages":"Chercher dans les messages","Secondary email":"E-mail secondaire","Secured":"Sécurisé","Select a filter set":"Sélectionner un jeu de filtre","Select an account":"Sélectionner un compte","Select an ICS file":"Sélectionner un fichier ICS","Select an ICS file to import and click on the Send button":"Sélectionner un fichier ICS à importer et cliquer sur le bouton Envoyer","Select file":"Sélectionner un fichier","Send":"Envoyer","Send only":"Envoi uniquement","Send only account":"Compte limité à l'envoi","Sender address added":"Adresse d'expédition ajoutée","Sender address deleted":"Adresse d'expédition supprimée","Sender addresses":"Adresses d'expédition","Sending limit":"Limite d'envoi","Sending limit: ":"Limite d'envoi :","Separator":"Séparateur","Service":"Service","Service: ":"Service :","Settings":"Paramètres","Setup device":"Configurer le périphérique","Show key":"Afficher la clé","Simple user":"Utilisateur simple","Specify an email address":"Spécifier une adresse e-mail","SPF record found":"Enregistrement SPF trouvé","SPF record not found":"Enregistrement SPF introuvable","Start typing a name here...":"Commencer à saisir un nom ici...","State/Province":"Etat/Région","Statistics":"Statistiques","Status":"Statut","Subject":"Sujet","Summary":"Résumé","Super administrator":"Super administrateur","Synchronization started":"Synchronisation démarée","Synchronize contacts with address book":"Synchroniser les contacts avec le carnet d'adresse","TFA enabled":"TFA activée","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"Le contenu de votre réponse. Vous pouvez utiliser les variables suivantes, qui seront automatiquement remplacées par les valeurs appropriées : %(name)s, %(fromdate)s, %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"Les identifiants sont les mêmes que ceux utilisés pour accéder à Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Les codes de récupération suivants peuvent être utilisés une fois chacun pour vous permettre de récupérer un accès à votre compte, au cas où vous perdriez votre téléphone par exemple. Assurez-vous de les conserver dans un lieu sûr, autrement vous ne serez définitivement plus en mesure d'accéder à votre compte.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"La méthode de chiffrement de mot de passe que vous utilisez a été rendue obsolète et sera retirée dans la prochaine version mineure. La procédure de mise à jour vers une méthode plus sûre est la suivante :","there":"ici","Title":"Titre","To":"A","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Pour accéder à ce carnet d'adresse depuis l'extérieur (comme Mozilla Thunderbird ou votre smartphone), utilisez l'URL suivante :","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Pour accéder à ce calendrier depuis l'extérieur (comme Mozilla Thunderbird ou votre smartphone), utilisez l'URL suivante :","Total":"Total","TOTP enabled":"TOTP activé","Transport":"Transport","Triggered":"Déclenché","Trusted sources":"Sources de confiance","Two-factor auth":"Authentification à deux facteurs","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"L'authentification à deux facteurs (2FA) utilisant des mots de passe jetables n'est pas encore activée pour votre compte.","Two-factor authentication using one-time passwords is enabled for your account.":"L'authentification à deux facteurs utilisant des mots de passe jetables est active pour votre compte.","Type":"Type","Type: ":"Type :","Unknown":"Inconnu","Unknown sources / Threats":"Sources inconnues / Menaces","unlimited":"illimité","Unlimited":"illimité","Until":"Jusqu'au","Update":"Mettre à jour","Update auto-reply":"Mettre à jour la réponse automatique","Update contact":"Mettre à jour le contact","Update Password":"Mise à jour du mot de passe","Update settings":"Mise à jour des paramètres","Updated":"Mis à jour","Use count":"Nombre d'utilisations","Use domain default value":"Utiliser la valeur par défaut du domaine","Username":"Nom d'utilisateur","Username:":"Nom d'utilisateur :","Valid":"Valide","Value":"Valeur","Visit the official weblog for more information":"Visitez le weblog officiel pour plus d'information","warning":"Avertissement","Warning":"Avertissement","WebAuthn":"WebAuthn","WebAutn enabled":"WebAuthn activé","Webmail":"Webmail","Week":"Semaine","Welcome to Modoboa":"Bienvenue dans Modoboa","With a mailbox":"Avec une boite aux lettres","With mailbox":"Avec boîte aux lettres","Write":"Ecriture","Year":"Année","yes":"oui","Yes":"Oui","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Vous avez déjà généré des codes de récupération pour ce compte. Si vous ne vous en souvenez plus ou que vous les avez tous utilisés, vous pouvez en générer de nouveaux.","You are about to delete your API access token":"Vous êtes sur le point de supprimer votre jeton d'accès à l'API","You can also share a read-only version of this calendar using the following URL: ":"Vous pouvez aussi partager une version en lecture seule de ce calendrier en utilisant l'URL suivante :","You can update your password from the Account section":"Vous pouvez mettre à jour votre mot de passer depuis la section Mon compte","You can use a different character as separator.":"Vous pouvez utiliser autre caractère comme séparateur","You don't have any WebAuthN device registered as a second authentication method.":"Vous n'avez aucun périphérique WebAuthn enregistré en tant que seconde méthode d'authentification.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Vous devez appliquer cette procédure <strong>AVANT</strong> d'installer une nouvelle version de Modoboa, autrement <strong>vous ne pourrez plus vous connecter à l'interface web</strong>.","You need to bind at least one domain to the provider.":"Vous devez associer au moins un domaine à ce fournisseur.","Your API token has not been generated yet.":"Votre jeton API n'a pas encore été généré.","Your API token is:":"Votre jeton API est :","Your browser does not seem compatible with WebAuthN":"Votre navigateur ne semble pas compatible avec WebAuthN","Zip code":"Code postal"}`),XS={},US={Account:"Account",Actions:"Azioni",Add:"Aggiungi",Address:"Indirizzi","Address book information":"Informazioni di rubrica","Administered domains":"Domini amministrati",Administrators:"Amministratori",Alias:"Alias",Aliases:"Alias","API access":"Accesso API",Apply:"Applica",Authentication:"Autenticazione","Bind/named format. Click to copy":"Formato bind/named",Categories:"Categorie","Check this option if passwords contained in your file are not crypted":"Seleziona questa opzione se le password contenute nel file non sono criptate",City:"Città",Close:"Chiudi",Closed:"Chiudi",Company:"Azienda",Confirmation:"Conferma",Contacts:"Contatti","Continue on error":"Continuare in caso di errore",Country:"Paese","Create a domain administrator":"Crea un amministratore di dominio","Create a mailbox for the administrator.":"Crea una casella di posta per l'amministratore.","Create aliases":"Crea alias","Creation date":"Data di creazione","Crypt passwords":"Cripta le password",Day:"Giorno","Default mailbox quota":"Dimensione massima predefinita per le mailbox","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite.",Description:"Descrizione",Disabled:"Disabilitato","DKIM key":"Chiave DKIM",DNS:"DNS","DNS status":"Stato del DNS",Domain:"Dominio","Domain administrator":"Amministratore di dominio","Domain created":"Dominio creato",Domains:"Domini",Email:"Email","Email address":"Indirizzo email","Enable DKIM signing":"Abilita la firma DKIM","Enable DNS checks":"Abilita i controlli DNS",Enabled:"Abilitato","Expire at":"Scade il",Failed:"Fallito",Forward:"Inoltra","Forward messages and store copies into your local mailbox":"Inoltra i messaggi e memorizza le copie nella tua casella di posta locale","Forward updated":"Inoltro aggiornato","Full name":"Nome completo",General:"Generale",Identities:"Identità",Import:"Importa","Import domains":"Importa domini","Import identities":"Identità di importazione",Information:"Informazioni","Installed version":"Versione installata","Keep local copies":"Mantieni copie locali","Last modification date":"Data dell'ultima modifica","Last name":"Cognome",Level:"Livello",Logger:"Logger",Logout:"Esci",Mailbox:"Caselle di posta",Mailboxes:"Caselle di posta",Message:"Utilizzo",Modified:"Modificato",Month:"Mese",More:"Più informazioni",Name:"Nome","New account":"Nuovo account","New alias":"Nuovo alias","New domain":"Nuovo dominio",Next:"Successivo","Not generated":"Non generata",Note:"Note","One or more updates are available":"Sono disponibili nuovi aggiornamenti",Options:"Opzioni","Partially aligned":"Parzialmente allineato",Password:"Password","Passwords mismatch":"Le password non corrispondono",Phone:"Telefono","Phone number":"Numero di telefono",Profile:"Profilo","Profile updated":"Profilo aggiornato",Quota:"Dimensione massima","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Dimensione massima per questa mailbox, può essere espressa in KB, MB (predefinito) o GB. Definire un valore personalizzato o utilizzare quello predefinito per il dominio. Lasciare vuoto per specificare un valore non limitato (non permesso per amministratori di dominio).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite.","Random address":"Indirizzo casuale","Random password":"Password casuale","Recipient(s)":"Destinatario(i)",Recipients:"Destinatari",Reseller:"Rivenditore",Resources:"Risorse","Resources usage":"Utilizzo risorse",Role:"Ruolo",Save:"Salva",Search:"Cerca","Secondary email":"Email secondaria","Sender addresses":"Indirizzi mittenti",Separator:"Separatore",Settings:"Impostazioni","Show key":"Visualizza chiave","Simple user":"Utente semplice","State/Province":"Provincia",Status:"Stato",Summary:"Sommario","Super administrator":"Super amministratore","The credentials are the same than the ones you use to access Modoboa.":"Le credenziali sono le stesse con cui accedi a Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Per accedere a questa rubrica da applicazioni esterne (es. Mozilla Thunderbird o il tuo smartphone), usa la seguente URL:",Total:"Totale",Transport:"Trasporto",Type:"Tipo",Unknown:"Sconosciuto","Unknown sources / Threats":"Fonti sconosciute / Minaccie",unlimited:"senza limiti",Update:"Aggiorna",Updated:"Aggiornato","Use domain default value":"Usa il valore predefinito",Username:"Nome utente",Week:"Settimana","Welcome to Modoboa":"Benvenuti in Modoboa","With a mailbox":"Con una casella di posta",Year:"Anno"},jS={},GS={},qS=JSON.parse(`{"(the domain will be created locally)":"(o domínio será criado localmente)","%{ n } event imported":["%{ n } evento importado","%{ n } eventos importados","%{ n } eventos importados"],"A documentation of the API is available":"Uma documentação da API está disponível","A new key will be generated soon. Refresh the page in a moment to see it.":"Uma nova chave será gerada em breve. Atualize a página logo mais para vê-la.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Um usuário com todos os privilégios pode fazer qualquer coisa. Por padrão, esse usuário não tem uma caixa de correio, portanto, não pode acessar os recursos do usuário final.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Um usuário sem privilégios, mas com uma caixa de correio. Ele terá permissão para usar todos os recursos do usuário final: webmail, calendário, contatos, filtros.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Um usuário com privilégios em um ou mais domínios. Ele terá permissão para administrar caixas de correio e também poderá ter uma caixa de correio.","Absolute time range":"Intervalo de tempo absoluto","Access rules":"Regras de acesso","Account":"Conta","Account settings":"Configurações de conta","Actions":"Ações","Activate filter set":"Ativar conjunto de filtros","Activate your auto reply from this date":"Ative sua resposta automática a partir desta data","Activate your auto reply until this date":"Ative sua resposta automática até esta data","active":"ativo","Active":"Ativo","Add":"Adicionar","Add a category":"Adicionar uma categoria","Add a new domain alias":"Adicionar um novo apelido de domínio","Add action":"Adicionar ação","Add administrator":"Adicionar administrador","Add category":"Adicionar categoria","Add condition":"Adicionar condição","Add filter set":"Adicionar conjunto de filtros","Add new filter":"Adicionar novo filtro","Add sender address":"Adicionar endereço do remetente","Add/Remove from the domain page":"Adicionar/Remover da página do domínio","Added On":"Adicionado Em","Address":"Endereço","Address (hostname or IP)":"Endereço (hostname ou IP)","Address book information":"Informação do catálogo de endereços","Administered domains":"Domínios administrados","Administrator added":"Administrador adicionado","Administrator name":"Nome do administrador","Administrator removed":"Administrador removido","Administrators":"Administradores","Administrators of":"Administradores de","Alarm closed":"Alarme fechado","Alarm deleted":"Alarme removido","Alarm re-opened":"Alarme reaberto","Alarms":"Alarmes","Alarms deleted":"Alarmes removidos","Alias":"Apelido","Alias already added":"Apelido já adicionado","Alias already exists, redirecting to edit page":"Apelido já existe, redirecionando para a página de edição","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Apelido(s) desta caixa de correio. Para criar um apelido catchall, basta digitar o nome de domínio (@domain.tld).","Aliases":"Apelidos","Alignment":"Alinhamento","All messages":"Todas as mensagens","All of the following":"Todas os seguintes","Any of the following":"Uma dos seguintes","API access":"Acesso à API","API token copied to your clipboard":"Token da API copiado para sua área de transferência","API token created":"Token de API criado","API token deleted":"Token de API removido","Apply":"Aplicar","Are you sure you want to delete this alias?":"Você tem certeza que deseja remover este apelido?","Are you sure you want to delete this identity ?":"Você tem certeza que deseja remover esta identidade ?","Associated domain":"Domínio associado","Associated domains":"Domínios associados","Attempting to log you in.":"Tentando fazer login.","Attendees":"Participantes","Audit trail":"Trilha de auditoria","Authentication":"Autenticação","Auto configuration":"Auto configuração","Auto-reply message":"Mensagem de resposta automática","Auto-reply message updated":"Mensagem de resposta automática atualizada","autoconfig record (Mozilla) not found":"registro de configuração automática (Mozilla) não encontrado.","autoconfig record (Mozilla): %{ value }":"registro de configuração automática (Mozilla): %{ value }","autodiscover record (Microsoft) not found":"registro de descoberta automática (Microsoft) não encontrado.","autodiscover record (Microsoft): %{ value }":"registro de descoberta automática (Microsoft): %{ value }","Back":"Voltar","Backup codes":"Códigos de backup","Bind/named format. Click to copy":"Formato de associação/nomeado. Clique para copiar","Birth date":"Data de nascimento","Calendar":"Calendário","Calendar created":"Calendário criado","Calendar deleted":"Calendário excluído","Calendar information":"Informação do calendário","Calendar sharing":"Compartilhamento de calendário","Calendar updated":"Calendário atualizado","Cancel":"Cancelar","Categories":"Categorias","Category deleted":"Categoria excluída","Change the value of <strong>Default password scheme</strong>":"Alterar o valor do <strong>Esquema de senha padrão</strong>","Check connection:":"Verificar conexão:","Check out the following list to find related components":"Confira a lista a seguir para encontrar componentes relacionados","Check this option if passwords contained in your file are not crypted":"Marque esta opção se as senhas contidas em seu arquivo não estiverem criptografadas","Choose a domain":"Escolha um domínio","Choose a header":"Escolha um cabeçalho","Choose a role":"Escolha um papel","Choose an action":"Escolha uma ação","Choose an operator":"Escolha um operador","City":"Cidade","Click here to copy the key":"Clique aqui para copiar a chave","Close":"Fechar","Close alarm":"Fechar alarme","Closed":"Fechado","Color":"Cor","Company":"Empresa","Conditions":"Condições","Confirm and create":"Confirmar e criar","Confirmation":"Confirmação","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Parabéns! A autenticação de dois fatores usando senhas de uso único agora está habilitada para sua conta.","Contacts":"Contatos","Content":"Conteúdo","Continue on error":"Continuar em caso de erro","Control if this domain will be allowed to send and receive messages":"Controle se este domínio terá permissão para enviar e receber mensagens","Copy key to clipboard":"Copiar chave para a área de transferência","Copy to clipboard":"Copiar para área de transferência","Copy token to clipboard":"Copiar token para a área de transferência","Could not save parameters":"Não é possível salvar os parâmetros","Country":"País","Create":"Criar","Create a domain administrator":"Criar um administrador de domínio","Create a mailbox for the administrator.":"Criar uma caixa de e-mail para o administrador.","Create a new filter set":"Criar um novo conjunto de filtros","Create aliases":"Criar apelidos","Create standard aliases for the domain.":"Criar apelidos padrão para este domínio.","Creation date":"Data de criação","Crypt passwords":"Criptografar senhas","CSV seems to be badly formatted":"CSV parece estar mal formatado","Current password":"Senha atual","Daily message sending limit":"Limite diário de envio de mensagens","Daily sending limit":"Limite diário de envio","Dashboard":"Painel","Date":"Data","Day":"Dia","Default mailbox quota":"Cota padrão da caixa de correio","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cota padrão aplicada para caixas de correio. Pode ser expresso em KB, MB (padrão) ou GB. Um valor 0 significa que não há cota.","Delete":"Remover","Delete filter set":"Remover conjunto de filtros","Delete token":"Remover token","Description":"Descrição","Detail":"Detalhe","Disable":"Desabilitar","Disable 2FA":"Desabilitar 2FA","Disabled":"Desabilitado","Display address book information":"Exibir informações do catálogo de endereços","Display name":"Nome de exibição","DKIM key":"Chave DKIM","DKIM key copied to clipboard":"Chave DKIM copiada para a área de transferência","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"A chave DKIM parece não ter sido gerada ainda ou falhou. Deseja recolocar o trabalho na fila?","DKIM key length":"Comprimento da chave DKIM","DKIM key selector":"Seletor da chave DKIM","DKIM keys already exist for this domain. Do you want to overwrite them?":"Já existem chaves DKIM para este domínio. Deseja sobrescrevê-las?","DKIM public key for":"Chave pública DKIM para","DKIM record found":"Registro DKIM encontrado","DKIM record not found":"Registro DKIM não encontrado","DKIM signing":"Assinatura DKIM","DMARC":"DMARC","DMARC record found":"Registro DMARC encontrado","DMARC record not found":"Registro DMARC não encontrado","DMARC support does not seem to be enabled for this domain.":"Aparentemente o suporte para DMARC não está habilitado para este domínio.","DNS":"DNS","DNS checks":"Verificações de DNS","DNS configuration for ":"Configuração de DNS para ","DNS configuration help":"Ajuda para configuração de DNS","DNS status":"Status do DNS","Do not delete account folder":"Não remover pasta da conta","Do not delete domain folder":"Não remover pasta do domínio","Do you really want to delete the domain %{ domain }?":"Você tem certeza que deseja remover o domínio %{ domain }?","Do you really want to delete this calendar?":"Tem certeza que deseja excluir esse calendário?","Do you really want to delete this WebAuthn device?":"Você tem certeza que deseja remover este dispositivo WebAuthn?","Domain":"Domínio","Domain administrator":"Administrador do domínio","Domain alias created":"Apelido de domínio criado","Domain alias deleted":"Apelido de domínio removido","Domain alias updated":"Apelido de domínio atualizado","Domain created":"Domínio criado","Domain default value":"Valor padrão do domínio","Domain deleted":"Domínio removido","Domain name (ex: domain.tld)":"Nome do domínio (ex: domain.tld)","domain's default value":"Valor padrão do domínio ","Domains":"Domínios","Don't treat duplicated objects as errors":"Não tratar objetos duplicados como erro","Download filter set":"Baixar conjunto de filtros","E-mail":"E-mail","Edit":"Editar","Edit account":"Editar conta","Edit alias":"Editar apelido","Edit calendar":"Editar calendário","Edit category":"Editar categoria","Edit contact":"Editar contato","Edit domain":"Editar domínio","Edit domain alias":"Editar apelido de domínio","Edit event":"Editar evento","Edit filter":"Editar filtro","Edit provider":"Editar provedor","Edit your device":"Editar seu dispositivo","Edition":"Edição","Email":"E-mail","Email address":"Endereço de e-mail","Email providers":"Provedores de e-mail","Empty":"Vazio","Enable":"Habilitar","Enable DKIM signing":"Habilitar assinatura DKIM","Enable DNS checks":"Habilitar verificações de DNS","Enabled":"Habilitado","Enter a name to register a new webauthn device.":"Digite um nome para registrar um novo dispositivo webauthn.","Enter a simple username or an email address":"Digite um simples nome de usuário ou um endereço de e-mail","Enter an email address":"Digite seu endereço de e-mail","Event added":"Evento adicionado","Event updated":"Evento atualizado","Ex: 10MB. Leave empty for no limit":"Ex: 10 MB. Deixe vazio para ilimitado","Expire at":"Expira em","Export accounts and aliases to CSV":"Exportar contas e apelidos para CSV","Export domains and aliases to CSV":"Exportar domínios e apelidos para CSV","Failed":"Falhou","Failed to display template. Using raw mode":"Falha ao exibir o modelo. Usando o modo RAW","Feel free to improve the translations":"Sinta-se livre para melhorar as traduções","Field is required":"Campo obrigatório","Filter added":"Filtro adicionado","Filter disabled":"Filtro desabilitado","Filter enabled":"Filtro habilitado","Filter removed":"Filtro removido","Filter set activated":"Conjuntos de filtros ativado","Filter set created":"Conjunto de filtros criado","Filter set removed":"Conjunto de filtros removido","Filter set updated":"Conjunto de filtros atualizado","Filter updated":"Filtro atualizado","Filters":"Filtros","First name":"Nome","Forward":"Encaminhar","Forward messages and store copies into your local mailbox":"Encaminhar mensagens e armazenar cópias em sua caixa de e-mail local","Forward updated":"Encaminhamento atualizado","Forwarded":"Encaminhado","Forwarders with ARC":"Forwarders com ARC","From":"De","Full address":"Endereço completo","Full name":"Nome completo","Fully aligned":"Completamente alinhado","General":"Geral","General information":"Informação geral","General settings":"Configurações gerais","Generate":"Gerar","Generate a new DKIM key":"Gerar uma nova chave DKIM","Generated address":"Endereço gerado","Go to <strong>Settings > General</strong> section":"Vá para a seção <strong>Configurações > Geral</strong>","here":"aqui","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Aqui está um exemplo de configuração de DNS (formato bind). Substitua os valores entre [ ] pelos apropriados.","Identification":"Identificação","Identities":"Identidades","If you close this form now, your modifications won't be saved. Do you confirm?":"Se você fechar este formulário agora, suas modificações não serão salvas. Você confirma?","If you configured it recently, please wait for the first report to be received and processed.":"Se você o configurou recentemente, aguarde o primeiro relatório ser recebido e processado.","IMAP Migration":"Migração IMAP","IMAP Port":"Porta IMAP","Import":"Importar","Import accounts and aliases from CSV file":"Importar contas e apelidos do arquivo CSV","Import domains":"Importar domínios","Import domains and aliases from CSV file":"Importar domínios e apelidos do arquivo CSV","Import events":"Importar eventos","Import identities":"Importar identidades","Important messages":"Mensagens importantes","inactive":"inativo","Indicate one or more recipients separated by a comma (,)":"Indique um ou mais destinatários separados por vírgula (,)","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informe a <strong>TODOS</strong> os seus usuários que eles devem efetuar login no Modoboa para concluir a operação","Information":"Informação","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Instale um autenticador de token de software como FreeOTP ou Google Authenticator do repositório de aplicativos e use esse aplicativo para escanear esse QR code.","Installed components":"Componentes instalados","Installed version":"Versão instalada","Invalid port number":"Número de porta inválido","Is the IMAP connection secured using SSL/TLS or StartTLS":"A conexão IMAP é protegida usando SSL/TLS ou StartTLS","Keep local copies":"Manter cópias locais","Language":"idioma ","Language does no exist":"Idioma não existe","Last login date":"Data do último login","Last modification date":"Data da última modificação","Last name":"Sobrenome","Last Used":"Último Uso","Latest version":"Última versão","Leave empty for no limit":"Deixe em branco para ilimitado","Less":"Menos","Level":"Nível","Limitations":"Limitações","Local domain (optional)":"Domínio local (opcional)","Logger":"Registrador","Logout":"Sair","Logout / Login with your current account so its password gets updated":"Saia e entre novamente com sua conta atual para que sua senha seja atualizada","Mailbox":"Caixa de e-mail","Mailboxes":"Caixas de e-mail","Make sure <strong>Update password scheme at login</strong> option is enabled":"Certifique-se de que a opção <strong>Atualizar esquema de senha no login</strong> esteja habilitada","MB":"MB","Message":"Mensagem","Message filters":"Filtros de mensagem","Message history":"Histórico de mensagens","Message sending limit":"Limite de envio de mensagens","messages":"mensagens","Messages":"Mensagens","Migration deleted":"Migração removida","Migrations":"MIgrações","Minimum length is %{ length }":"O comprimento mínimo é %{ length }","Modified":"Modificado","Modify":"Modificar","Monitoring":"Monitoramento","Month":"Mês","More":"Mais","Move down":"Mover para baixo","Move up":"Mover para cima","Must be a numeric value or empty":"Deve ser um valor numérico ou vazio","MX records":"Registros MX","My calendars":"Meus calendários","name":"nome","Name":"Nome","Name of the administrator":"Nome do administador","Name of the domain to migrate":"Nome do domínio para migrar","Name:":"Nome:","Name: ":"Nome: ","Never":"Nunca","Never logged-in":"Nunca autenticado","New":"Novo","New account":"Nova conta","New alias":"Novo apelido","New calendar":"Novo calendário","New contact":"Novo contato","New device name":"Novo nome de dispositivo","New domain":"Novo domínio","New event":"Novo evento","New filter":"Novo filtro","New provider":"Novo provedor","New recovery codes":"Novos códigos de recuperação","Next":"Próximo","no":"não","No":"Não","No associated domains":"Nenhum domínios associados","No data to export":"Nenhum dado para exportar","No domain managed":"Nenhum domínio gerenciado","No sender address defined for this account":"Nenhum endereço de remetente definido para esta conta","No sending limit":"Sem limite de envio","No two-factor authentificator is yet set for your account.":"Ainda não existe nenhum autenticador de dois fatores definido para sua conta.","Not a valid email":"Não é um e-mail válido","Not generated":"Não gerado","Note":"Nota","Number of allowed mailbox aliases:":"Número de apelidos de caixa de correio permitidos:","Number of allowed mailboxes:":"Número de caixas de correio permitidas:","Number of associated alias:":"Número de apelidos associados:","Number of associated domains:":"Número de domínios associados:","Number of messages this domain can send per day. Leave empty for no limit.":"Número de mensagens que este domínio pode enviar por dia. Deixe vazio para ilimitado.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Número de mensagens que esta caixa de correio pode enviar por dia. Deixe vazio para ilimitado.","OK":"OK","Old account":"Conta antiga","One or more updates are available":"Uma ou mais atualizações estão disponíveis","One-time passwords":"Senhas de uso único","Opened":"Aberto","Opened alarms":"Alarmes abertos","Options":"Opções","or suggest a new language":"ou sugira um novo idioma","Parameters updated":"Parâmetros atualizados","Partially aligned":"Parcialmente alinhado","Partially trusted sources / Forwarders":"Fontes / encaminhadores parcialmente confiáveis","Password":"Senha","Password copied to clipboard":"Senha copiada para a área de transferência","Password mismatch":"Senha não confere","Password updated":"Senha atualizada","Passwords mismatch":"Senhas não conferem","Pending":"Pendente","Period":"Período","Phone":"Telefone","Phone number":"Número de telefone","Pin code":"Código PIN","Please add at least one recipient.":"Por favor, adicione pelo menos um destinatário.","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Observe que você verá esta mensagem até que <strong>TODAS</strong> as senhas dos usuários tenham sido convertidas usando o novo esquema.","Port":"Porta","Position":"Posição","Problem":"Problema","Proceed":"Proceder","Profile":"Perfil","Profile updated":"Perfil atualizado","Provide a CSV file where lines respect one of the following formats:":"Forneça um arquivo CSV em que as linhas respeitem um dos seguintes formatos:","Provider":"Provedor","Provider created":"Provedor criado","Provider deleted":"Provedor removido","Provider name":"Nome do provedor","Provider updated":"Provedor atualizado","Providers":"Provedores","Queue ID":"ID da fila","Quota":"Cota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"A cota para essa caixa de correio pode ser expressa em KB, MB (padrão) ou GB. Defina um valor personalizado ou use o padrão do domínio. Deixe em branco para definir um valor ilimitado (não permitido para administradores de domínio).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cota compartilhada entre caixas de correio. Pode ser expresso em KB, MB (padrão) ou GB. Um valor 0 significa que não há cota.","Quota: ":"Cota: ","Random address":"Endereço aleatório","Random password":"Senha randômica","Raw format. Click to copy":"Formato bruto. Clique para copiar","Raw mode":"Modo bruto","Read":"Leitura","Recipient(s)":"Destinatário(s)","Recipients":"Destinatários","Register":"Registrar","Register authenticator":"Autenticador de registro","Registered Webauthn devices":"Dispositivos Webauthn registrados","Relative time ranges":"Intervalos de tempo relativos","Relay":"Relay","Reload":"Recarregar","Remove action":"Remover ação","Remove condition":"Remover condição","Remove this address":"Remover este endereço","Remove this administrator":"Remover este administrador","Reopen alarm":"Reabrir alarme","Reseller":"Revendedor","Reset recovery codes":"Redefinir códigos de recuperação","Resources":"Recursos","Resources usage":"Uso de recursos","Role":"Papel","Save":"Salvar","Save your changes":"Salve suas alterações","Search":"Busca","Secondary email":"E-mail secundário","Secured":"Seguro","Select a filter set":"Selecione um conjunto de filtros","Select an account":"Selecione uma conta","Select an ICS file":"Selecione um arquivo ICS","Select an ICS file to import and click on the Send button":"Selecione um arquivo ICS para importar e clique no botão \\"Enviar\\"","Select file":"Selecionar arquivo","Send":"Enviar","Send only":"Apenas enviar","Send only account":"Apenas enviar conta","Sender address added":"Endereço do remetente adicionado","Sender address deleted":"Endereço do remetente excluído","Sender addresses":"Endereços do remetente","Sending limit":"Limite de envio","Sending limit: ":"Limite de envio: ","Separator":"Separador","Service":"Serviço","Service: ":"Serviço: ","Settings":"Configurações","Setup device":"Configurar dispositivo","Show key":"Mostrar chave","Simple user":"Usuário simples","Specify an email address":"Especifique um endereço de e-mail","SPF record found":"Registro SPF encontrado","SPF record not found":"Registro SPF não encontrado","Start typing a name here...":"Comece a digitar um nome aqui...","State/Province":"Estado/Província","Statistics":"Estatísticas","Status":"Status","Subject":"Assunto","Summary":"Sumário","Super administrator":"Super administrador","Synchronization started":"Sincronização iniciada","Synchronize contacts with address book":"Sincronize seus contatos com o catálogo de endereços","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"O conteúdo da sua resposta. Você pode usar as seguintes variáveis, que serão substituídas automaticamente pelo valor apropriado: %(name)s, %(fromdate)s %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"As credenciais são as mesmas que você usa para acessar o Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"O primeiro elemento de cada linha é obrigatório e deve ser igual a um dos valores anteriores.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Os seguintes códigos de recuperação podem ser usados uma vez cada para permitir que você recupere o acesso à sua conta, caso perca seu telefone, por exemplo. Certifique-se de salvá-los em um local seguro, caso contrário, você não poderá mais acessar sua conta.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"O esquema de senha que você está usando foi descontinuado e será removido na próxima atualização. O procedimento para atualizar para um esquema mais forte é o seguinte:","there":"ali","Title":"Título","To":"Para","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acessar esse catálogo de endereços externamente (como do Mozilla Thunderbird ou de seu celular), use a seguinte URL:","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acessar esta calendário externamente (como do Mozilla Thunderbird ou de seu celular), use a seguinte URL:","Total":"Total","Transport":"Transporte","Triggered":"Provocado","Trusted sources":"Fontes confiáveis","Two-factor auth":"Autenticação de dois fatores","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"A autenticação de dois fatores (2FA) usando senhas de uso único ainda não está ativada para sua conta.","Two-factor authentication using one-time passwords is enabled for your account.":"A autenticação de dois fatores usando senhas de uso único está habilitada para sua conta.","Type":"Tipo","Type: ":"Tipo: ","Unknown":"Desconhecido","Unknown sources / Threats":"Fontes desconhecidas / Ameaças","unlimited":"ilimitado","Unlimited":"Ilimitado","Until":"Até","Update":"Atualizar","Update auto-reply":"Atualizar resposta automática","Update Password":"Atualizar Senha","Update settings":"Atualizar configurações","Updated":"Atualizado","Use count":"Usar contagem","Use domain default value":"Usar valor padrão de domínio","Username":"Nome de usuário","Username:":"Nome de usuário:","Valid":"Válido","Value":"Valor","warning":"atenção","Warning":"Atenção","WebAuthn":"WebAuthn","Week":"Semana","Welcome to Modoboa":"Bem-vindo ao Modoboa","With a mailbox":"Com uma caixa de e-mail","With mailbox":"Com caixa de correio","Write":"Escrita","Year":"Ano","yes":"sim","Yes":"Sim","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Você já gerou códigos de backup para esta conta. Se você não se lembra deles ou já usou todos eles, pode gerar novos.","You are about to delete your API access token":"Você está prestes a excluir seu token de acesso à API","You can also share a read-only version of this calendar using the following URL: ":"Você também pode compartilhar uma versão \\"Somente leitura\\" deste calendário usando a seguinte URL:","You can use a different character as separator.":"Você pode usar um caractere diferente como separador.","You don't have any WebAuthN device registered as a second authentication method.":"Você não tem nenhum dispositivo WebAuthN registrado como um segundo método de autenticação.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Você deve aplicar este procedimento <strong>ANTES</strong> de instalar uma versão mais recente do Modoboa, caso contrário <strong>você não conseguirá mais se conectar à interface web</strong>.","You need to bind at least one domain to the provider.":"Você precisa associar pelo menos um domínio ao provedor.","Your API token has not been generated yet.":"Seu token de API ainda não foi gerado.","Your API token is:":"Seu token de API é:","Your browser does not seem compatible with WebAuthN":"Seu navegador não parece compatível com WebAuthN","Zip code":"CEP"}`),$S={Account:"Добавить аккаунт",Actions:"Действие",Add:"Адрес",Address:"Адрес","Administered domains":"Список квот",Administrators:"Администраторы",Alias:"Синоним",Aliases:"Синоним(ы)",Apply:"Применить",Authentication:"Аутентификация","Bind/named format. Click to copy":"Неверный формат","Check this option if passwords contained in your file are not crypted":"Выберите эту опцию если пароль в вашем файле не зашифрован ",Confirmation:"Подтверждение","Continue on error":"Продолжать при ошибке","Create a domain administrator":"Создание администратора домена","Create a mailbox for the administrator.":"Создание администратора домена","Create aliases":"Создание синонимов","Creation date":"Дата создания","Crypt passwords":"Шифровать пароль",Dashboard:"Приборная панель",Day:"День",Disabled:"Разрешен","DNS status":"Статистика","Domain administrator":"Администратор домена","Domain created":"Домен создан",Domains:"Домены","Email address":"Е-майл адрес",Enabled:"Разрешено",Forward:"Перенаправленые","Forward messages and store copies into your local mailbox":"Перенаправление сообщения, и сохранение копии в вашем локальном почтовом ящике","Forward updated":"Перенаправление обновлено","Full name":"Имя файла",General:"Основные",Identities:"Пользователи",Import:"Импорт","Import domains":"Импорт доменов","Import identities":"Импорт информации о пользователях",Information:"Информация","Installed version":"Установленная версия","Keep local copies":"Сохранить локальную копию","Last modification date":"Дата последней модификации",Level:"Уровень",Logger:"Логгер",Logout:"Завершить сеанс",Mailbox:"Почтовые ящики",Mailboxes:"Почтовые ящики",Message:"использование (%%)",Modified:"Синоним изменен",Month:"Месяц",Name:"Логин","New account":"Новый аккаунт","New alias":"Новый синоним","New domain":"Новый домен",Next:"Следующая","Not generated":"Получатель не определен","One or more updates are available":"Доступны одно или более обновлений.",Options:"Опции",Password:"Пароль","Passwords mismatch":"Пароли не совпадают","Profile updated":"Профиль обновлен","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Квота в мегабайтах для этого почтового ящика. Определите собственное значение или используйте значение по умолчанию для родительского домена. Оставьте пустым для неограниченного значения. (Не разрешено администраторам домена)","Random address":"Ошибочный запрос","Random password":"Ошибочный запрос","Recipient(s)":"Получатели",Recipients:"Получатели",Reseller:"Реселлер",Resources:"Ресурсы","Resources usage":"Использование ресурсов",Role:"Роль",Save:"Сохранить",Search:"Поиск","Sender addresses":"Ошибочный запрос",Separator:"Разделитель",Settings:"Настройки","Simple user":"Обычный пользователь",Status:"Статистика","Super administrator":"Супер администратор",Unknown:"Неизвестное",unlimited:"Не лимитировано",Update:"Обновление",Updated:"Обновление","Use domain default value":"Используются значения домена по умолчанию ",Username:"Логин пользователя",Week:"Неделя","Welcome to Modoboa":"Добро пожаловать в Modoboa!",Year:"Год"},KS={"API access":"API erişimi",Authentication:"Kimlik Doğrulama",Close:"Kapat",Confirmation:"Onayla",Dashboard:"Gösterge Paneli",Date:"Tarih",Description:"Tanım","Disable 2FA":"2FA'yı devre dışı bırak","Domain administrator":"Alan adı Yöneticisi",From:"Kimden",General:"Genel",Information:"Bilgi","Installed version":"Kurulu sürüm",Level:"Seviye",Logger:"Kayıtçı",Logout:"Çıkış Yapın",Message:"İleti",Name:"İsim","New recovery codes":"Yeni kurtarma kodları",Next:"Sonraki",No:"Hayır","One or more updates are available":"Bir veya daha fazla güncelleme mevcut",Password:"Parola","Passwords mismatch":"Parolalar uyuşmuyor","Phone number":"Telefon numarası","Pin code":"Pin kodu",Profile:"Profil","Profile updated":"Profil güncellendi",Register:"Kayıt ol",Reseller:"Bayii","Reset recovery codes":"Kurtarma kodlarını sıfırla",Role:"Rol",Save:"Kaydet","Secondary email":"İkincil e-posta",Settings:"Ayarlar","Simple user":"Basit kullanıcı",To:"Kime",Unknown:"Bilinmeyen",Update:"Güncelle",Username:"Kullanıcı adı","Welcome to Modoboa":"Modoboa'ya hoş geldiniz",Yes:"Evet"},ZS=JSON.parse(`{"(the domain will be created locally)":"(domänen kommer att skapas lokalt)","%{ n } event imported":["%{ n } händelse importerad","%{ n } händelser importerade"],"A documentation of the API is available":"En dokumentation av API:et finns tillgänglig","A new key will be generated soon. Refresh the page in a moment to see it.":"En ny nyckel kommer snart att skapas. Ladda om sidan om en stund för att se den.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Användare med alla rättigheter som kan göra allt. Som standard har en sån här användare ingen brevlåda så den kan inte komma åt slutanvändarfunktioner.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Användare utan privilegier men som har en en brevlåda. Den kommer att kunna använda alla slutanvändarfunktioner: webbmail, kalender, kontakter, filter.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Användare med rättigheter på en eller flera domäner. Den kan administrera brevlådor och han kan även ha en brevlåda.","Absolute time range":"Absolut tidsintervall","Access rules":"Åtkomstregler","Account":"Konto","Account settings":"Kontoinställningar","Actions":"Åtgärder","Activate filter set":"Aktivera filteruppsättning","Activate your auto reply from this date":"Aktivera ditt autosvar från detta datum","Activate your auto reply until this date":"Aktivera ditt autosvar fram till detta datum","active":"aktiv","Active":"Aktiv","Add":"Lägg till","Add a category":"Lägg till en kategori","Add a new domain alias":"Lägg till nytt domän alias","Add action":"Lägg till åtgärd","Add administrator":"Lägg till administratör","Add category":"Lägg till kategori","Add condition":"Lägg till villkor","Add filter set":"Lägg till filteruppsättning","Add new filter":"Lägg till nytt filter","Add sender address":"Lägg till avsändaradress","Add to contacts":"Lägg till i kontakter","Add/Remove from the domain page":"Lägg till/ta bort från domänsidan","Added On":"Tillagd på","Address":"Adress","Address (hostname or IP)":"Adress (värdnamn eller IP)","Address book information":"Adressboksinformation","Administered domains":"Administrerade domäner","Administrator added":"Administratör tillagd","Administrator name":"Administratörs namn","Administrator removed":"Administratör raderad","Administrators":"Administratörer","Administrators of":"Administratörer för","Alarm closed":"Larm stängt","Alarm deleted":"Larm raderat","Alarm re-opened":"Larm öppnat på nytt","Alarms":"Larm","Alarms deleted":"Larm raderade","Alias":"Alias","Alias already added":"Alias ​​har redan lagts till","Alias already exists, redirecting to edit page":"Aliaset finns redan, omdirigerar till redigeringssidan","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Alias för denna brevlåda. För att skapa ett catchall-alias anger du bara domännamnet (@domain.tld).","Aliases":"Alias","Alignment":"Placering","All messages":"Alla meddelanden","All of the following":"Alla följande","Any of the following":"Något av följande","API access":"API åtkomst","API token copied to your clipboard":"API token kopierat till urklipp","API token created":"API token skapat","API token deleted":"API token raderat","Apply":"Tillämpa","Are you sure you want to delete this alias?":"Är du säker på att du vill ta bort detta alias?","Are you sure you want to delete this identity ?":"Är du säker på att du vill ta bort den här identiteten?","Associated domain":"Associerad domän","Associated domains":"Associerade domäner","Attach":"Bifoga","Attachments":"Bilagor","Attempting to log you in.":"Försöker logga in dig.","Attendees":"Deltagare","Audit trail":"Verifieringskedja","Authentication":"Autentisering","Auto configuration":"Automatisk konfiguration","Auto-reply message":"Automatiskt svarsmeddelande","Auto-reply message updated":"Automatiskt svarsmeddelande uppdaterat","autoconfig record (Mozilla) not found":"autoconfig-posten (Mozilla) hittades inte","autoconfig record (Mozilla): %{ value }":"\\"autoconfig-post (Mozilla): %{ value }\\"","autodiscover record (Microsoft) not found":"autodiscover-post (Microsoft) hittades inte","autodiscover record (Microsoft): %{ value }":"autodiscover-post (Microsoft): %{ value }","Back":"Tillbaka","Backup codes":"Säkerhetskopieringskoder","Bcc":"Bcc","Bind/named format. Click to copy":"Bind/named formatterat. Klicka för att kopiera","Birth date":"Födelsedatum","Calendar":"Kalender","Calendar created":"Kalender skapad","Calendar deleted":"Kalender raderad","Calendar information":"Kalenderinformation","Calendar sharing":"Kalenderdelning","Calendar updated":"Kalender uppdaterad","Cancel":"Avbryt","Categories":"Kategorier","Category deleted":"Kategori raderad","Cc":"Cc","Change the value of <strong>Default password scheme</strong>":"Ändra värdet på <strong>Standard lösenordsschema</strong>","Check connection:":"Kontrollera anslutning:","Check out the following list to find related components":"Kolla in följande lista för att hitta relaterade komponenter","Check this option if passwords contained in your file are not crypted":"Markera det här alternativet om lösenorden i din fil inte är krypterade","Choose a domain":"Välj en domän","Choose a header":"Välj en rubrik","Choose a role":"Välj en roll","Choose an action":"Välj en åtgärd","Choose an operator":"Välj en operatör","City":"Stad","Click here to copy the key":"Klicka här för att kopiera nyckeln","Close":"Stäng","Close alarm":"Stäng alarm","Closed":"Stängd","Color":"Färg","Company":"Företag","Compose":"Författa","Compress this mailbox":"Komprimera denna brevlåda","Conditions":"Villkor","Confirm and create":"Bekräfta och skapa","Confirmation":"Bekräftelse","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Grattis! Tvåfaktorsautentisering med engångslösenord är nu aktiverad för ditt konto.","Contact added to address book":"Kontakt har lagts till i adressboken","Contacts":"Kontakter","Content":"Innehåll","Continue on error":"Fortsätt vid fel","Control if this domain will be allowed to send and receive messages":"Kontrollera om den här domänen ska tillåtas skicka och ta emot meddelanden","Copy key to clipboard":"Kopiera nyckel till urklipp","Copy to clipboard":"Kopiera till urklipp","Copy token to clipboard":"Kopiera token till urklipp","Could not save parameters":"Kunde inte spara parametrar","Country":"Land","Create":"Skapa","Create a domain administrator":"Skapa en domänadministratör","Create a mailbox for the administrator.":"Skapa en brevlåda för administratören.","Create a new filter set":"Skapa ny filteruppsättning","Create a new mailbox":"Skapa en ny brevlåda","Create aliases":"Skapa alias","Create new mailbox":"Skapa ny brevlåda","Create standard aliases for the domain.":"Skapa standardalias för domänen.","Creation date":"Datum skapad","Crypt passwords":"Kryptera lösenord","CSV seems to be badly formatted":"CSV verkar vara dåligt formaterad","Current password":"Nuvarande lösenord","Daily message sending limit":"Daglig sändningsgräns för meddelanden","Daily sending limit":"Daglig sändningsgräns","Dashboard":"Instrumentbräda","Date":"Datum","Day":"Dag","Default mailbox quota":"Standard brevlådekvota","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Standardkvot tillämpas på postlådor. Kan uttryckas i KB, MB (standard) eller GB. Ett värde på 0 betyder ingen kvot.","Delete":"Radera","Delete filter set":"Ta bort filteruppsättning","Delete this mailbox":"Ta bort den här brevlådan","Delete this mailbox?":"Ta bort den här brevlådan?","Delete token":"Radera token","Description":"Beskrivning","Detail":"Detalj","Disable":"Inaktivera","Disable 2FA":"Inaktivear 2FA","Disable links":"Inaktivera länkar","Disabled":"Inaktiverad","Display address book information":"Visa adressboksinformation","Display name":"Display name","Display source":"Visa källa","DKIM key":"DKIM nyckel","DKIM key copied to clipboard":"DKIM-nyckel kopierad till urklipp","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"DKIM-nyckeln verkar inte ha genererats ännu eller har misslyckats. Vill du köa jobbet?","DKIM key length":"DKIM nyckellängd","DKIM key selector":"DKIM nyckel väljare","DKIM keys already exist for this domain. Do you want to overwrite them?":"DKIM-nycklar finns redan för den här domänen. Vill du skriva över dem?","DKIM public key for":"DKIM publik nyckel för","DKIM record found":"DKIM-post hittades","DKIM record not found":"DKIM-posten hittades inte","DKIM signing":"DKIM signering","DMARC":"DMARC","DMARC record found":"DMARC post hittad","DMARC record not found":"DMARC post ej hittad","DMARC support does not seem to be enabled for this domain.":"DMARC-stöd verkar inte vara aktiverat för den här domänen.","DNS":"DNS","DNS checks":"DNS kontroller","DNS configuration for ":"DNS-konfiguration för","DNS configuration help":"DNS konfigurering hjälp","DNS status":"DNS status","Do not delete account folder":"Ta inte bort kontomappen","Do not delete domain folder":"Ta inte bort domänmappen","Do you really want to delete the domain %{ domain }?":"Vill du verkligen ta bort domänen %{ domain }?","Do you really want to delete this calendar?":"Vill du verkligen ta bort den här kalendern?","Do you really want to delete this WebAuthn device?":"Vill du verkligen ta bort den här WebAuthn-enheten?","Domain":"Domän","Domain administrator":"Domänadministratör","Domain alias created":"Domän alias skapat","Domain alias deleted":"Domänalias raderat","Domain alias updated":"Domänalias uppdaterat","Domain created":"Domän skapad","Domain default value":"Domän standardvärde","Domain deleted":"Domän raderad","Domain name (ex: domain.tld)":"Domännamn (ex: domain.tld)","domain's default value":"domänens standardvärde","Domains":"Domäner","Don't treat duplicated objects as errors":"Behandla inte duplicerade objekt som fel","Download filter set":"Ladda ner filteruppsättning","E-mail":"E-post","Edit":"Redigera","Edit account":"Redigera konto","Edit alias":"Redigera alias","Edit calendar":"Redigera kalender","Edit category":"Redigera kategori","Edit contact":"Redigera kontakt","Edit domain":"Redigera domän","Edit domain alias":"Redigera domänalias","Edit event":"Redigera händelse","Edit filter":"Redigera filter","Edit mailbox":"Redigera brevlåda","Edit provider":"Redigera leverantör","Edit this mailbox":"Redigera den här brevlådan","Edit your device":"Redigera din enhet","Edition":"Utgåva","Email":"E-post","Email address":"E-postadress","Email providers":"E-postleverantörer","Email sent":"E-post skickat","Empty":"Tom","Empty mailbox":"Tom brevlåda","Enable":"Aktivera","Enable DKIM signing":"Aktivera DKIM signering","Enable DNS checks":"Aktivera DNS kontroller","Enable links":"Aktivera länkar","Enabled":"Aktiverad","Enter a name to register a new webauthn device.":"Ange ett namn för att registrera en ny webauthn-enhet.","Enter a simple username or an email address":"Ange ett enkelt användarnamn eller en e-postadress","Enter an email address":"Ange en e-postadress","Event added":"Event added","Event updated":"Händelse uppdaterad","Ex: 10MB. Leave empty for no limit":"Ex: 10MB. Lämna tomt för ingen gräns","Expire at":"Utgår kl","Export accounts and aliases to CSV":"Exportera konton och alias till CSV","Export domains and aliases to CSV":"Exportera domäner och alias till CSV","Failed":"Misslyckades","Failed to display template. Using raw mode":"Det gick inte att visa mallen. Använder råläge","Feel free to improve the translations":"Förbättra gärna översättningarna","Field is required":"Fält är obligatoriskt","Filter added":"Filter har lagts till","Filter disabled":"Filter inaktiverat","Filter enabled":"Filter aktiverat","Filter removed":"Filter borttaget","Filter set activated":"Filterset aktiverat","Filter set created":"Filteruppsättning skapad","Filter set removed":"Filterset har tagits bort","Filter set updated":"Filteruppsättningen uppdaterad","Filter updated":"Filter uppdaterat","Filters":"Filter","First name":"Förnamn","Forward":"Vidarebefordra","Forward messages and store copies into your local mailbox":"Vidarebefordra meddelanden och lagra kopior i din lokala brevlåda","Forward updated":"Vidarebefordring uppdaterad","Forwarded":"Vidarebefordrad","Forwarders with ARC":"Vidarebefordrare med ARC","From":"Från","Full address":"Fullständig adress","Full name":"Komplett namn","Fully aligned":"Helt inriktad","General":"Allmän","General information":"Allmänn information","General settings":"Allmänna inställningar","Generate":"Generera","Generate a new DKIM key":"Generera en ny DKIM nyckel","Generated address":"Genererad adress","Go to <strong>Settings > General</strong> section":"Gå till avsnittet <strong>Inställningar > Allmänt</strong>","here":"här","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Här är ett exempel på DNS-konfiguration (bind-format). Ersätt värdena mellan [ ] med de lämpliga värdena.","Identification":"Identifikation","Identities":"Identiteter","If you close this form now, your modifications won't be saved. Do you confirm?":"Om du stänger formuläret nu kommer dina ändringar inte att sparas. Bekräftar du?","If you configured it recently, please wait for the first report to be received and processed.":"Om du konfigurerade det nyligen, vänta tills den första rapporten tas emot och behandlas.","IMAP Migration":"IMAP migrering","IMAP Port":"IMAP port","Import":"Importera","Import accounts and aliases from CSV file":"Importera konton och alias från CSV-fil","Import domains":"Importera domäner","Import domains and aliases from CSV file":"Importera domäner och alias från CSV-fil","Import events":"Importera händelser","Import identities":"Importera identiteter","Important messages":"Viktiga meddelanden","inactive":"inaktiv","Indicate one or more recipients separated by a comma (,)":"Ange en eller flera mottagare separerade med kommatecken (,)","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informera <strong>ALLA</strong> dina användare att de måste logga in på Modoboa för att slutföra operationen","Information":"Information","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Installera en mjuk token-autentisering som FreeOTP eller Google Authenticator från ditt programförråd och använd den appen för att skanna den här QR-koden.","Installed components":"Installerade komponenter","Installed version":"Installerad version","Invalid port number":"Ogiltigt portnummer","Is the IMAP connection secured using SSL/TLS or StartTLS":"Är IMAP-anslutningen säker med SSL/TLS eller StartTLS","Keep local copies":"Behåll lokala kopior","Language":"Språk","Language does no exist":"Språket existerar inte","Last login date":"Senaste inloggning","Last modification date":"Senaste ändrad datum","Last name":"Efternamn","Last Used":"Senast använd","Latest version":"Senaste version","Leave empty for no limit":"Lämna tomt för ingen gräns","Less":"Mindre","Level":"Nivå","Limitations":"Gränser","Local domain (optional)":"Lokal domän (valfritt)§","Logger":"Logger","Logout":"Logga ut","Logout / Login with your current account so its password gets updated":"Logga ut / Logga in med ditt nuvarande konto så att lösenordet uppdateras","Mailbox":"Brevlåda","Mailbox compressed":"Brevlåda komprimerad","Mailbox created":"Brevlåda skapad","Mailbox deleted":"Brevlåda raderad","Mailbox renamed":"Brevlåda omdöpt","Mailboxes":"Brevlådor","Make sure <strong>Update password scheme at login</strong> option is enabled":"Se till att alternativet <strong>Uppdatera lösenordsschema vid inloggning</strong> är aktiverat","Mark as followed":"Markera enligt följande","Mark as read":"Markera som läst","Mark as unfollowed":"Markera som ej följt","Mark as unread":"Markera som oläst","MB":"MB","Message":"Meddelande","Message deleted":"Meddelandet raderat","Message filters":"Meddelandefilter","Message history":"Meddelande historik","Message marked as junk":"Meddelande markerat som skräp","Message marked as not junk":"Meddelandet markerat som inte skräp","Message sending limit":"Begränsning för meddelandesändning","Message(s) deleted":"Meddelande(n) raderade","Message(s) flagged":"Meddelande(n) flaggade","Message(s) marked as junk":"Meddelande(n) markerade som skräp","Message(s) marked as not junk":"Meddelande(n) markerade som inte skräp","messages":"meddelanden","Messages":"Meddelanden","Migration deleted":"Migrering raderad","Migrations":"Migreringar","Minimum length is %{ length }":"Minsta längd är %{ length }","Modified":"Ändrad","Modify":"Ändra","Monitoring":"Monitoring","Month":"Månad","More":"Mer","Move down":"Flytta ner","Move up":"Flytta upp","Must be a numeric value or empty":"Måste vara ett numeriskt värde eller tomt","MX records":"MX poster","My calendars":"Mina kalendrar","name":"namn","Name":"Namn","Name of the administrator":"Namn på administratören","Name of the domain to migrate":"Namn på domänen att migrera","Name:":"Namn:","Name: ":"Namn:","Never":"Aldrig","Never logged-in":"Aldrig inloggad","New":"Ny","New account":"Nytt konto","New alias":"Nytt alias","New calendar":"Ny kalender","New contact":"Ny kontakt","New device name":"Nytt enhetsnamn","New domain":"Ny domän","New event":"Ny händelse","New filter":"Nytt filter","New provider":"Ny leverantör","New recovery codes":"Nya återställningskoder","Next":"Nästa","no":"nej","No":"Nej","No associated domains":"Inga associerade domäner","No data to export":"Ingen data att exportera","No domain managed":"Ingen domän hanterad","No message yet in this mailbox":"Inget meddelande ännu i denna brevlåda","No sender address defined for this account":"Inge avsändaradress agedd för detta konto","No sending limit":"Ingen sändningsbegränsning","No two-factor authentificator is yet set for your account.":"Ingen tvåfaktorsautentisering är ännu inställd för ditt konto.","Not a valid email":"Inte ett giltigt mejl","Not generated":"Ej genererad","Note":"Anteckning","Number of allowed mailbox aliases:":"Antal tillåtna postlådealias:","Number of allowed mailboxes:":"Antal tillåtna brevlådor:","Number of associated alias:":"Antal associerade alias:","Number of associated domains:":"Antal associerade domäner:","Number of messages this domain can send per day. Leave empty for no limit.":"Antal meddelanden som denna domän kan skicka per dag. Lämna tomt för ingen begränsning.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Antal meddelanden som denna brevlåda kan skicka per dag. Lämna tomt för ingen begränsning.","OK":"OK","Old account":"Gammalt konto","on":"på","One or more updates are available":"En eller flera uppdateringar tillgängliga","One-time passwords":"Engångslösenord","Opened":"Öppnad","Opened alarms":"Öppnade alarm","Options":"Alternativ","or suggest a new language":"eller föreslå ett nytt språk","Parameters updated":"Parametrar uppdaterade","Parent mailbox":"Förälders brevlåda","Partially aligned":"Delvis justerad","Partially trusted sources / Forwarders":"Delvis pålitliga källor / speditörer","Password":"Lösenord","Password copied to clipboard":"Lösenord kopierat till urklipp","Password mismatch":"Lösenordet matchar inte","Password updated":"Lösenord uppdaterat","Passwords mismatch":"Lösenord matchar ej","Pending":"Väntande","Period":"Period","Phone":"Telefon","Phone number":"Telefonnummer","Pin code":"Pinkod","Please add at least one recipient.":"Lägg till minst en mottagare.","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Observera att du kommer att se detta meddelande tills <strong>ALLA</strong> användarlösenord har konverterats med det nya schemat.","Port":"Port","Position":"Plats","Problem":"Problem","Proceed":"Fortsätt","Profile":"Profil","Profile updated":"Profil uppdaterad","Provide a CSV file where lines respect one of the following formats:":"Ange en CSV-fil där raderna respekterar ett av följande format:","Provide one or more addresses":"Ange en eller flera adresser","Provider":"Leverantör","Provider created":"Leverantör skapad","Provider deleted":"Leverantör raderad","Provider name":"Leverantörsnamn","Provider updated":"Leverantör uppdaterad","Providers":"Leverantörer","Queue ID":"Kö ID","Quota":"Kvota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Kvot för denna brevlåda, kan anges i KB, MB (standard) eller GB. Ange ett anpassat värde eller använd domänens standardvärde. Lämna tomt för att ange ett obegränsat värde (inte tillåtet för domänadministratörer).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Kvot delad mellan brevlådor. Kan anges i KB, MB (standard) eller GB. Ett värde av 0 innebär ingen kvot.","Quota: ":"Kvota:","Random address":"Slumpmässig adress","Random password":"Slumpmässigt lösenord","Raw format. Click to copy":"Råformat. Klicka för att kopiera","Raw mode":"Råläge","Read":"Läs","Recipient(s)":"Mottagare","Recipients":"Mottagare","Register":"Register","Register authenticator":"Registrera autentiseringsverktyg","Registered Webauthn devices":"Registrerade Webauthn-enheter","Relative time ranges":"Relativa tidsintervall","Relay":"Relä","Reload":"Ladda om","Remove action":"Ta bort åtgärd","Remove condition":"Ta bort tillstånd","Remove this address":"Radera denna adress","Remove this administrator":"Radera denna administratör","Reopen alarm":"Återöppna larmet","Reply":"Svara","Reply all":"Svara alla","Reseller":"Återförsäljare","Reset recovery codes":"Återställ återställningskoder","Resources":"Resurser","Resources usage":"Resursanvändning","Role":"Roll","Save":"Spara","Save your changes":"Spara dina ändringar","Search":"Sök","Search in messages":"Sök i meddelanden","Secondary email":"Sekundär e-post","Secured":"Säkrad","Select a filter set":"Välj ett filterset","Select an account":"Välj ett konto","Select an ICS file":"Välj en ICS-fil","Select an ICS file to import and click on the Send button":"Välj en ICS-fil att importera och klicka på knappen Skicka","Select file":"Välj fil","Send":"Skicka","Send only":"Skicka endast","Send only account":"Skicka endast konto","Sender address added":"Avsändaradress tillagd","Sender address deleted":"Avsändaradress raderad","Sender addresses":"Avsändaradresser","Sending limit":"Sändningsgräns","Sending limit: ":"Sändningsgräns:","Separator":"Avgränsare","Service":"Tjänst","Service: ":"Service:","Settings":"Inställningar","Setup device":"Konfigurera enhet","Show key":"Visa nyckel","Simple user":"Enkel användare","Specify an email address":"Ange en e-postadress","SPF record found":"SPF post hittad","SPF record not found":"SPF post saknas","Start typing a name here...":"Börja skriva ett namn här...","State/Province":"Stat/Provins","Statistics":"Statistik","Status":"Status","Subject":"Ämne","Summary":"Sammanfattning","Super administrator":"Superadministratör","Synchronization started":"Synkronisering startade","Synchronize contacts with address book":"Synkronisera kontakter med adressboken","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"Innehållet i ditt svar. Du kan använda följande variabler, som automatiskt ersätts med lämpligt värde: %(name)s, %(fromdate)s, %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"Inloggningsuppgifterna är desamma som de du använder för att komma åt Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"Det första elementet i varje rad är obligatoriskt och måste vara lika med ett av de tidigare värdena.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Följande återställningskoder kan användas en gång var för att låta dig återfå åtkomst till ditt konto, om du till exempel skulle tappa din telefon. Se till att spara dem på ett säkert ställe, annars kommer du inte att kunna komma åt ditt konto längre.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"Lösenordsschemat du använder har föråldrats och kommer att tas bort i nästa mindre version. Proceduren för att uppgradera till ett starkare system är som följer:","there":"där","Title":"Titel","To":"Till","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"För att komma åt den här adressboken från utsidan (som Mozilla Thunderbird eller din smartphone), använd följande URL:","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"För att komma åt den här kalendern från utsidan (som Mozilla Thunderbird eller din smartphone), använd följande URL:","Total":"Totalt","Transport":"Transport","Triggered":"Triggad","Trusted sources":"Pålitliga källor","Two-factor auth":"Tvåfaktorsautentisering","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"Tvåfaktorsautentisering (2FA) med engångslösenord är ännu inte aktiverad för ditt konto.","Two-factor authentication using one-time passwords is enabled for your account.":"Tvåfaktorsautentisering med engångslösenord är aktiverad för ditt konto.","Type":"Typ","Type: ":"Typ: ","Unknown":"Okänd","Unknown sources / Threats":"Okända källor / hot","unlimited":"obegränsat","Unlimited":"Obegränsat","Until":"Tills","Update":"Uppdatera","Update auto-reply":"Uppdatera autosvar","Update contact":"Uppdatera kontakt","Update Password":"Uppdatera lösenord","Update settings":"Uppdatera inställningar","Updated":"Uppdaterad","Use count":"Använd antal","Use domain default value":"Använd domänens standardvärde","Username":"Användarnamn","Username:":"Användarnamn:","Valid":"Giltig","Value":"Värde","warning":"varning","Warning":"Varning","WebAuthn":"WebAuthn","Webmail":"Webmail","Week":"Vecka","Welcome to Modoboa":"Välkommen till Modoboa","With a mailbox":"Med en brevlåda","With mailbox":"Med brevlåda","Write":"Skriv","Year":"År","yes":"ja","Yes":"Ja","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Du har redan genererat reservkoder för det här kontot. Om du inte kommer ihåg dem eller har använt dem alla kan du skapa nya.","You are about to delete your API access token":"Du håller på att radera din API-åtkomsttoken","You can also share a read-only version of this calendar using the following URL: ":"Du kan också dela en skrivskyddad version av den här kalendern med följande URL:","You can use a different character as separator.":"Du kan använda ett annat tecken som avgränsare.","You don't have any WebAuthN device registered as a second authentication method.":"Du har ingen WebAuthN-enhet registrerad som en andra autentiseringsmetod.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Du måste tillämpa denna procedur <strong>INNAN</strong> du installerar en senaste version av Modoboa, annars <strong> kommer du inte att kunna ansluta till webbgränssnittet längre</strong>.","You need to bind at least one domain to the provider.":"Du måste binda minst en domän till leverantören.","Your API token has not been generated yet.":"Ditt API token har ännu ej genererats.","Your API token is:":"Ditt API token är:","Your browser does not seem compatible with WebAuthN":"Din webbläsare verkar inte vara kompatibel med WebAuthN","Zip code":"Postnummer"}`),JS={},QS={en:NS,br:FS,cs:zS,de:BS,el:HS,es:WS,fi:YS,fr:VS,ja:XS,it:US,pl:jS,nl:GS,pt_BR:qS,ru:$S,tr:KS,sv:ZS,zh:JS},Hs=OS({availableLanguages:{en:"English",cs:"Czech",de:"German",br:"Breton",el:"Greek",es:"Spain",fi:"Finnish",fr:"French",it:"Italian",ja:"Japanese",nl:"Dutch",pl:"Polish",pt_BR:"Portuguese (BR)",ru:"Russian",sv:"Swedish",tr:"tr",zh:"Chinese"},defaultLanguage:"en",translations:QS,silent:!0});class Wa extends Error{}Wa.prototype.name="InvalidTokenError";function eA(e){return decodeURIComponent(atob(e).replace(/(.)/g,(t,a)=>{let o=a.charCodeAt(0).toString(16).toUpperCase();return o.length<2&&(o="0"+o),"%"+o}))}function tA(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw new Error("base64 string is not of the correct length")}try{return eA(t)}catch{return atob(t)}}function iA(e,t){if(typeof e!="string")throw new Wa("Invalid token specified: must be a string");t||(t={});const a=t.header===!0?0:1,o=e.split(".")[a];if(typeof o!="string")throw new Wa(`Invalid token specified: missing part #${a+1}`);let u;try{u=tA(o)}catch(f){throw new Wa(`Invalid token specified: invalid base64 for part #${a+1} (${f.message})`)}try{return JSON.parse(u)}catch(f){throw new Wa(`Invalid token specified: invalid json for part #${a+1} (${f.message})`)}}var sA={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}},Li,Oi,kn=(e=>(e[e.NONE=0]="NONE",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(kn||{});(e=>{function t(){Li=3,Oi=sA}e.reset=t;function a(u){if(!(0<=u&&u<=4))throw new Error("Invalid log level");Li=u}e.setLevel=a;function o(u){Oi=u}e.setLogger=o})(kn||(kn={}));var $e=class _i{constructor(t){this._name=t}debug(...t){Li>=4&&Oi.debug(_i._format(this._name,this._method),...t)}info(...t){Li>=3&&Oi.info(_i._format(this._name,this._method),...t)}warn(...t){Li>=2&&Oi.warn(_i._format(this._name,this._method),...t)}error(...t){Li>=1&&Oi.error(_i._format(this._name,this._method),...t)}throw(t){throw this.error(t),t}create(t){const a=Object.create(this);return a._method=t,a.debug("begin"),a}static createStatic(t,a){const o=new _i(`${t}.${a}`);return o.debug("begin"),o}static _format(t,a){const o=`[${t}]`;return a?`${o} ${a}:`:o}static debug(t,...a){Li>=4&&Oi.debug(_i._format(t),...a)}static info(t,...a){Li>=3&&Oi.info(_i._format(t),...a)}static warn(t,...a){Li>=2&&Oi.warn(_i._format(t),...a)}static error(t,...a){Li>=1&&Oi.error(_i._format(t),...a)}};kn.reset();var Sn=class{static decode(e){try{return iA(e)}catch(t){throw $e.error("JwtUtils.decode",t),t}}static async generateSignedJwt(e,t,a){const o=ii.encodeBase64Url(new TextEncoder().encode(JSON.stringify(e))),u=ii.encodeBase64Url(new TextEncoder().encode(JSON.stringify(t))),f=`${o}.${u}`,g=await window.crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},a,new TextEncoder().encode(f)),y=ii.encodeBase64Url(new Uint8Array(g));return`${f}.${y}`}},aA="10000000-1000-4000-8000-100000000000",Ll=e=>btoa([...new Uint8Array(e)].map(t=>String.fromCharCode(t)).join("")),Cp=class Di{static _randomWord(){const t=new Uint32Array(1);return crypto.getRandomValues(t),t[0]}static generateUUIDv4(){return aA.replace(/[018]/g,a=>(+a^Di._randomWord()&15>>+a/4).toString(16)).replace(/-/g,"")}static generateCodeVerifier(){return Di.generateUUIDv4()+Di.generateUUIDv4()+Di.generateUUIDv4()}static async generateCodeChallenge(t){if(!crypto.subtle)throw new Error("Crypto.subtle is available only in secure contexts (HTTPS).");try{const o=new TextEncoder().encode(t),u=await crypto.subtle.digest("SHA-256",o);return Ll(u).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}catch(a){throw $e.error("CryptoUtils.generateCodeChallenge",a),a}}static generateBasicAuth(t,a){const u=new TextEncoder().encode([t,a].join(":"));return Ll(u)}static async hash(t,a){const o=new TextEncoder().encode(a),u=await crypto.subtle.digest(t,o);return new Uint8Array(u)}static async customCalculateJwkThumbprint(t){let a;switch(t.kty){case"RSA":a={e:t.e,kty:t.kty,n:t.n};break;case"EC":a={crv:t.crv,kty:t.kty,x:t.x,y:t.y};break;case"OKP":a={crv:t.crv,kty:t.kty,x:t.x};break;case"oct":a={crv:t.k,kty:t.kty};break;default:throw new Error("Unknown jwk type")}const o=await Di.hash("SHA-256",JSON.stringify(a));return Di.encodeBase64Url(o)}static async generateDPoPProof({url:t,accessToken:a,httpMethod:o,keyPair:u,nonce:f}){let g,y;const k={jti:window.crypto.randomUUID(),htm:o??"GET",htu:t,iat:Math.floor(Date.now()/1e3)};a&&(g=await Di.hash("SHA-256",a),y=Di.encodeBase64Url(g),k.ath=y),f&&(k.nonce=f);try{const A=await crypto.subtle.exportKey("jwk",u.publicKey),M={alg:"ES256",typ:"dpop+jwt",jwk:{crv:A.crv,kty:A.kty,x:A.x,y:A.y}};return await Sn.generateSignedJwt(M,k,u.privateKey)}catch(A){throw A instanceof TypeError?new Error(`Error exporting dpop public key: ${A.message}`):A}}static async generateDPoPJkt(t){try{const a=await crypto.subtle.exportKey("jwk",t.publicKey);return await Di.customCalculateJwkThumbprint(a)}catch(a){throw a instanceof TypeError?new Error(`Could not retrieve dpop keys from storage: ${a.message}`):a}}static async generateDPoPKeys(){return await window.crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!1,["sign","verify"])}};Cp.encodeBase64Url=e=>Ll(e).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_");var ii=Cp,fs=class{constructor(t){this._name=t,this._callbacks=[],this._logger=new $e(`Event('${this._name}')`)}addHandler(t){return this._callbacks.push(t),()=>this.removeHandler(t)}removeHandler(t){const a=this._callbacks.lastIndexOf(t);a>=0&&this._callbacks.splice(a,1)}async raise(...t){this._logger.debug("raise:",...t);for(const a of this._callbacks)await a(...t)}},$d=class{static center({...e}){var t,a,o;return e.width==null&&(e.width=(t=[800,720,600,480].find(u=>u<=window.outerWidth/1.618))!=null?t:360),(a=e.left)!=null||(e.left=Math.max(0,Math.round(window.screenX+(window.outerWidth-e.width)/2))),e.height!=null&&((o=e.top)!=null||(e.top=Math.max(0,Math.round(window.screenY+(window.outerHeight-e.height)/2)))),e}static serialize(e){return Object.entries(e).filter(([,t])=>t!=null).map(([t,a])=>`${t}=${typeof a!="boolean"?a:a?"yes":"no"}`).join(",")}},Ji=class tn extends fs{constructor(){super(...arguments),this._logger=new $e(`Timer('${this._name}')`),this._timerHandle=null,this._expiration=0,this._callback=()=>{const t=this._expiration-tn.getEpochTime();this._logger.debug("timer completes in",t),this._expiration<=tn.getEpochTime()&&(this.cancel(),super.raise())}}static getEpochTime(){return Math.floor(Date.now()/1e3)}init(t){const a=this._logger.create("init");t=Math.max(Math.floor(t),1);const o=tn.getEpochTime()+t;if(this.expiration===o&&this._timerHandle){a.debug("skipping since already initialized for expiration at",this.expiration);return}this.cancel(),a.debug("using duration",t),this._expiration=o;const u=Math.min(t,5);this._timerHandle=setInterval(this._callback,u*1e3)}get expiration(){return this._expiration}cancel(){this._logger.create("cancel"),this._timerHandle&&(clearInterval(this._timerHandle),this._timerHandle=null)}},Ol=class{static readParams(e,t="query"){if(!e)throw new TypeError("Invalid URL");const o=new URL(e,"http://127.0.0.1")[t==="fragment"?"hash":"search"];return new URLSearchParams(o.slice(1))}},Sa=";",Gs=class extends Error{constructor(e,t){var a,o,u;if(super(e.error_description||e.error||""),this.form=t,this.name="ErrorResponse",!e.error)throw $e.error("ErrorResponse","No error passed"),new Error("No error passed");this.error=e.error,this.error_description=(a=e.error_description)!=null?a:null,this.error_uri=(o=e.error_uri)!=null?o:null,this.state=e.userState,this.session_state=(u=e.session_state)!=null?u:null,this.url_state=e.url_state}},Oc=class extends Error{constructor(e){super(e),this.name="ErrorTimeout"}},rA=class{constructor(e){this._logger=new $e("AccessTokenEvents"),this._expiringTimer=new Ji("Access token expiring"),this._expiredTimer=new Ji("Access token expired"),this._expiringNotificationTimeInSeconds=e.expiringNotificationTimeInSeconds}async load(e){const t=this._logger.create("load");if(e.access_token&&e.expires_in!==void 0){const a=e.expires_in;if(t.debug("access token present, remaining duration:",a),a>0){let u=a-this._expiringNotificationTimeInSeconds;u<=0&&(u=1),t.debug("registering expiring timer, raising in",u,"seconds"),this._expiringTimer.init(u)}else t.debug("canceling existing expiring timer because we're past expiration."),this._expiringTimer.cancel();const o=a+1;t.debug("registering expired timer, raising in",o,"seconds"),this._expiredTimer.init(o)}else this._expiringTimer.cancel(),this._expiredTimer.cancel()}async unload(){this._logger.debug("unload: canceling existing access token timers"),this._expiringTimer.cancel(),this._expiredTimer.cancel()}addAccessTokenExpiring(e){return this._expiringTimer.addHandler(e)}removeAccessTokenExpiring(e){this._expiringTimer.removeHandler(e)}addAccessTokenExpired(e){return this._expiredTimer.addHandler(e)}removeAccessTokenExpired(e){this._expiredTimer.removeHandler(e)}},nA=class{constructor(e,t,a,o,u){this._callback=e,this._client_id=t,this._intervalInSeconds=o,this._stopOnError=u,this._logger=new $e("CheckSessionIFrame"),this._timer=null,this._session_state=null,this._message=g=>{g.origin===this._frame_origin&&g.source===this._frame.contentWindow&&(g.data==="error"?(this._logger.error("error message from check session op iframe"),this._stopOnError&&this.stop()):g.data==="changed"?(this._logger.debug("changed message from check session op iframe"),this.stop(),this._callback()):this._logger.debug(g.data+" message from check session op iframe"))};const f=new URL(a);this._frame_origin=f.origin,this._frame=window.document.createElement("iframe"),this._frame.style.visibility="hidden",this._frame.style.position="fixed",this._frame.style.left="-1000px",this._frame.style.top="0",this._frame.width="0",this._frame.height="0",this._frame.src=f.href}load(){return new Promise(e=>{this._frame.onload=()=>{e()},window.document.body.appendChild(this._frame),window.addEventListener("message",this._message,!1)})}start(e){if(this._session_state===e)return;this._logger.create("start"),this.stop(),this._session_state=e;const t=()=>{!this._frame.contentWindow||!this._session_state||this._frame.contentWindow.postMessage(this._client_id+" "+this._session_state,this._frame_origin)};t(),this._timer=setInterval(t,this._intervalInSeconds*1e3)}stop(){this._logger.create("stop"),this._session_state=null,this._timer&&(clearInterval(this._timer),this._timer=null)}},Ep=class{constructor(){this._logger=new $e("InMemoryWebStorage"),this._data={}}clear(){this._logger.create("clear"),this._data={}}getItem(e){return this._logger.create(`getItem('${e}')`),this._data[e]}setItem(e,t){this._logger.create(`setItem('${e}')`),this._data[e]=t}removeItem(e){this._logger.create(`removeItem('${e}')`),delete this._data[e]}get length(){return Object.getOwnPropertyNames(this._data).length}key(e){return Object.getOwnPropertyNames(this._data)[e]}},Nl=class extends Error{constructor(e,t){super(t),this.name="ErrorDPoPNonce",this.nonce=e}},Nc=class{constructor(e=[],t=null,a={}){this._jwtHandler=t,this._extraHeaders=a,this._logger=new $e("JsonService"),this._contentTypes=[],this._contentTypes.push(...e,"application/json"),t&&this._contentTypes.push("application/jwt")}async fetchWithTimeout(e,t={}){const{timeoutInSeconds:a,...o}=t;if(!a)return await fetch(e,o);const u=new AbortController,f=setTimeout(()=>u.abort(),a*1e3);try{return await fetch(e,{...t,signal:u.signal})}catch(g){throw g instanceof DOMException&&g.name==="AbortError"?new Oc("Network timed out"):g}finally{clearTimeout(f)}}async getJson(e,{token:t,credentials:a,timeoutInSeconds:o}={}){const u=this._logger.create("getJson"),f={Accept:this._contentTypes.join(", ")};t&&(u.debug("token passed, setting Authorization header"),f.Authorization="Bearer "+t),this._appendExtraHeaders(f);let g;try{u.debug("url:",e),g=await this.fetchWithTimeout(e,{method:"GET",headers:f,timeoutInSeconds:o,credentials:a})}catch(A){throw u.error("Network Error"),A}u.debug("HTTP response received, status",g.status);const y=g.headers.get("Content-Type");if(y&&!this._contentTypes.find(A=>y.startsWith(A))&&u.throw(new Error(`Invalid response Content-Type: ${y??"undefined"}, from URL: ${e}`)),g.ok&&this._jwtHandler&&(y!=null&&y.startsWith("application/jwt")))return await this._jwtHandler(await g.text());let k;try{k=await g.json()}catch(A){throw u.error("Error parsing JSON response",A),g.ok?A:new Error(`${g.statusText} (${g.status})`)}if(!g.ok)throw u.error("Error from server:",k),k.error?new Gs(k):new Error(`${g.statusText} (${g.status}): ${JSON.stringify(k)}`);return k}async postForm(e,{body:t,basicAuth:a,timeoutInSeconds:o,initCredentials:u,extraHeaders:f}){const g=this._logger.create("postForm"),y={Accept:this._contentTypes.join(", "),"Content-Type":"application/x-www-form-urlencoded",...f};a!==void 0&&(y.Authorization="Basic "+a),this._appendExtraHeaders(y);let k;try{g.debug("url:",e),k=await this.fetchWithTimeout(e,{method:"POST",headers:y,body:t,timeoutInSeconds:o,credentials:u})}catch(N){throw g.error("Network error"),N}g.debug("HTTP response received, status",k.status);const A=k.headers.get("Content-Type");if(A&&!this._contentTypes.find(N=>A.startsWith(N)))throw new Error(`Invalid response Content-Type: ${A??"undefined"}, from URL: ${e}`);const M=await k.text();let P={};if(M)try{P=JSON.parse(M)}catch(N){throw g.error("Error parsing JSON response",N),k.ok?N:new Error(`${k.statusText} (${k.status})`)}if(!k.ok){if(g.error("Error from server:",P),k.headers.has("dpop-nonce")){const N=k.headers.get("dpop-nonce");throw new Nl(N,`${JSON.stringify(P)}`)}throw P.error?new Gs(P,t):new Error(`${k.statusText} (${k.status}): ${JSON.stringify(P)}`)}return P}_appendExtraHeaders(e){const t=this._logger.create("appendExtraHeaders"),a=Object.keys(this._extraHeaders),o=["accept","content-type"],u=["authorization"];a.length!==0&&a.forEach(f=>{if(o.includes(f.toLocaleLowerCase())){t.warn("Protected header could not be set",f,o);return}if(u.includes(f.toLocaleLowerCase())&&Object.keys(e).includes(f)){t.warn("Header could not be overridden",f,u);return}const g=typeof this._extraHeaders[f]=="function"?this._extraHeaders[f]():this._extraHeaders[f];g&&g!==""&&(e[f]=g)})}},oA=class{constructor(e){this._settings=e,this._logger=new $e("MetadataService"),this._signingKeys=null,this._metadata=null,this._metadataUrl=this._settings.metadataUrl,this._jsonService=new Nc(["application/jwk-set+json"],null,this._settings.extraHeaders),this._settings.signingKeys&&(this._logger.debug("using signingKeys from settings"),this._signingKeys=this._settings.signingKeys),this._settings.metadata&&(this._logger.debug("using metadata from settings"),this._metadata=this._settings.metadata),this._settings.fetchRequestCredentials&&(this._logger.debug("using fetchRequestCredentials from settings"),this._fetchRequestCredentials=this._settings.fetchRequestCredentials)}resetSigningKeys(){this._signingKeys=null}async getMetadata(){const e=this._logger.create("getMetadata");if(this._metadata)return e.debug("using cached values"),this._metadata;if(!this._metadataUrl)throw e.throw(new Error("No authority or metadataUrl configured on settings")),null;e.debug("getting metadata from",this._metadataUrl);const t=await this._jsonService.getJson(this._metadataUrl,{credentials:this._fetchRequestCredentials,timeoutInSeconds:this._settings.requestTimeoutInSeconds});return e.debug("merging remote JSON with seed metadata"),this._metadata=Object.assign({},t,this._settings.metadataSeed),this._metadata}getIssuer(){return this._getMetadataProperty("issuer")}getAuthorizationEndpoint(){return this._getMetadataProperty("authorization_endpoint")}getUserInfoEndpoint(){return this._getMetadataProperty("userinfo_endpoint")}getTokenEndpoint(e=!0){return this._getMetadataProperty("token_endpoint",e)}getCheckSessionIframe(){return this._getMetadataProperty("check_session_iframe",!0)}getEndSessionEndpoint(){return this._getMetadataProperty("end_session_endpoint",!0)}getRevocationEndpoint(e=!0){return this._getMetadataProperty("revocation_endpoint",e)}getKeysEndpoint(e=!0){return this._getMetadataProperty("jwks_uri",e)}async _getMetadataProperty(e,t=!1){const a=this._logger.create(`_getMetadataProperty('${e}')`),o=await this.getMetadata();if(a.debug("resolved"),o[e]===void 0){if(t===!0){a.warn("Metadata does not contain optional property");return}a.throw(new Error("Metadata does not contain property "+e))}return o[e]}async getSigningKeys(){const e=this._logger.create("getSigningKeys");if(this._signingKeys)return e.debug("returning signingKeys from cache"),this._signingKeys;const t=await this.getKeysEndpoint(!1);e.debug("got jwks_uri",t);const a=await this._jsonService.getJson(t,{timeoutInSeconds:this._settings.requestTimeoutInSeconds});if(e.debug("got key set",a),!Array.isArray(a.keys))throw e.throw(new Error("Missing keys on keyset")),null;return this._signingKeys=a.keys,this._signingKeys}},Mp=class{constructor({prefix:e="oidc.",store:t=localStorage}={}){this._logger=new $e("WebStorageStateStore"),this._store=t,this._prefix=e}async set(e,t){this._logger.create(`set('${e}')`),e=this._prefix+e,await this._store.setItem(e,t)}async get(e){return this._logger.create(`get('${e}')`),e=this._prefix+e,await this._store.getItem(e)}async remove(e){this._logger.create(`remove('${e}')`),e=this._prefix+e;const t=await this._store.getItem(e);return await this._store.removeItem(e),t}async getAllKeys(){this._logger.create("getAllKeys");const e=await this._store.length,t=[];for(let a=0;a<e;a++){const o=await this._store.key(a);o&&o.indexOf(this._prefix)===0&&t.push(o.substr(this._prefix.length))}return t}},lA="code",cA="openid",uA="client_secret_post",dA=60*15,Fl=class{constructor({authority:e,metadataUrl:t,metadata:a,signingKeys:o,metadataSeed:u,client_id:f,client_secret:g,response_type:y=lA,scope:k=cA,redirect_uri:A,post_logout_redirect_uri:M,client_authentication:P=uA,prompt:N,display:H,max_age:z,ui_locales:G,acr_values:Q,resource:q,response_mode:ie,filterProtocolClaims:$=!0,loadUserInfo:re=!1,requestTimeoutInSeconds:B,staleStateAgeInSeconds:de=dA,mergeClaimsStrategy:ae={array:"replace"},disablePKCE:U=!1,stateStore:J,revokeTokenAdditionalContentTypes:fe,fetchRequestCredentials:ge,refreshTokenAllowedScope:se,extraQueryParams:Me={},extraTokenParams:Te={},extraHeaders:Je={},dpop:He,omitScopeWhenRequesting:_e=!1}){var Ve;if(this.authority=e,t?this.metadataUrl=t:(this.metadataUrl=e,e&&(this.metadataUrl.endsWith("/")||(this.metadataUrl+="/"),this.metadataUrl+=".well-known/openid-configuration")),this.metadata=a,this.metadataSeed=u,this.signingKeys=o,this.client_id=f,this.client_secret=g,this.response_type=y,this.scope=k,this.redirect_uri=A,this.post_logout_redirect_uri=M,this.client_authentication=P,this.prompt=N,this.display=H,this.max_age=z,this.ui_locales=G,this.acr_values=Q,this.resource=q,this.response_mode=ie,this.filterProtocolClaims=$??!0,this.loadUserInfo=!!re,this.staleStateAgeInSeconds=de,this.mergeClaimsStrategy=ae,this.omitScopeWhenRequesting=_e,this.disablePKCE=!!U,this.revokeTokenAdditionalContentTypes=fe,this.fetchRequestCredentials=ge||"same-origin",this.requestTimeoutInSeconds=B,J)this.stateStore=J;else{const ai=typeof window<"u"?window.localStorage:new Ep;this.stateStore=new Mp({store:ai})}if(this.refreshTokenAllowedScope=se,this.extraQueryParams=Me,this.extraTokenParams=Te,this.extraHeaders=Je,this.dpop=He,this.dpop&&!((Ve=this.dpop)!=null&&Ve.store))throw new Error("A DPoPStore is required when dpop is enabled")}},hA=class{constructor(e,t){this._settings=e,this._metadataService=t,this._logger=new $e("UserInfoService"),this._getClaimsFromJwt=async a=>{const o=this._logger.create("_getClaimsFromJwt");try{const u=Sn.decode(a);return o.debug("JWT decoding successful"),u}catch(u){throw o.error("Error parsing JWT response"),u}},this._jsonService=new Nc(void 0,this._getClaimsFromJwt,this._settings.extraHeaders)}async getClaims(e){const t=this._logger.create("getClaims");e||this._logger.throw(new Error("No token passed"));const a=await this._metadataService.getUserInfoEndpoint();t.debug("got userinfo url",a);const o=await this._jsonService.getJson(a,{token:e,credentials:this._settings.fetchRequestCredentials,timeoutInSeconds:this._settings.requestTimeoutInSeconds});return t.debug("got claims",o),o}},Tp=class{constructor(e,t){this._settings=e,this._metadataService=t,this._logger=new $e("TokenClient"),this._jsonService=new Nc(this._settings.revokeTokenAdditionalContentTypes,null,this._settings.extraHeaders)}async exchangeCode({grant_type:e="authorization_code",redirect_uri:t=this._settings.redirect_uri,client_id:a=this._settings.client_id,client_secret:o=this._settings.client_secret,extraHeaders:u,...f}){const g=this._logger.create("exchangeCode");a||g.throw(new Error("A client_id is required")),t||g.throw(new Error("A redirect_uri is required")),f.code||g.throw(new Error("A code is required"));const y=new URLSearchParams({grant_type:e,redirect_uri:t});for(const[P,N]of Object.entries(f))N!=null&&y.set(P,N);let k;switch(this._settings.client_authentication){case"client_secret_basic":if(o==null)throw g.throw(new Error("A client_secret is required")),null;k=ii.generateBasicAuth(a,o);break;case"client_secret_post":y.append("client_id",a),o&&y.append("client_secret",o);break}const A=await this._metadataService.getTokenEndpoint(!1);g.debug("got token endpoint");const M=await this._jsonService.postForm(A,{body:y,basicAuth:k,timeoutInSeconds:this._settings.requestTimeoutInSeconds,initCredentials:this._settings.fetchRequestCredentials,extraHeaders:u});return g.debug("got response"),M}async exchangeCredentials({grant_type:e="password",client_id:t=this._settings.client_id,client_secret:a=this._settings.client_secret,scope:o=this._settings.scope,...u}){const f=this._logger.create("exchangeCredentials");t||f.throw(new Error("A client_id is required"));const g=new URLSearchParams({grant_type:e});this._settings.omitScopeWhenRequesting||g.set("scope",o);for(const[M,P]of Object.entries(u))P!=null&&g.set(M,P);let y;switch(this._settings.client_authentication){case"client_secret_basic":if(a==null)throw f.throw(new Error("A client_secret is required")),null;y=ii.generateBasicAuth(t,a);break;case"client_secret_post":g.append("client_id",t),a&&g.append("client_secret",a);break}const k=await this._metadataService.getTokenEndpoint(!1);f.debug("got token endpoint");const A=await this._jsonService.postForm(k,{body:g,basicAuth:y,timeoutInSeconds:this._settings.requestTimeoutInSeconds,initCredentials:this._settings.fetchRequestCredentials});return f.debug("got response"),A}async exchangeRefreshToken({grant_type:e="refresh_token",client_id:t=this._settings.client_id,client_secret:a=this._settings.client_secret,timeoutInSeconds:o,extraHeaders:u,...f}){const g=this._logger.create("exchangeRefreshToken");t||g.throw(new Error("A client_id is required")),f.refresh_token||g.throw(new Error("A refresh_token is required"));const y=new URLSearchParams({grant_type:e});for(const[P,N]of Object.entries(f))Array.isArray(N)?N.forEach(H=>y.append(P,H)):N!=null&&y.set(P,N);let k;switch(this._settings.client_authentication){case"client_secret_basic":if(a==null)throw g.throw(new Error("A client_secret is required")),null;k=ii.generateBasicAuth(t,a);break;case"client_secret_post":y.append("client_id",t),a&&y.append("client_secret",a);break}const A=await this._metadataService.getTokenEndpoint(!1);g.debug("got token endpoint");const M=await this._jsonService.postForm(A,{body:y,basicAuth:k,timeoutInSeconds:o,initCredentials:this._settings.fetchRequestCredentials,extraHeaders:u});return g.debug("got response"),M}async revoke(e){var t;const a=this._logger.create("revoke");e.token||a.throw(new Error("A token is required"));const o=await this._metadataService.getRevocationEndpoint(!1);a.debug(`got revocation endpoint, revoking ${(t=e.token_type_hint)!=null?t:"default token type"}`);const u=new URLSearchParams;for(const[f,g]of Object.entries(e))g!=null&&u.set(f,g);u.set("client_id",this._settings.client_id),this._settings.client_secret&&u.set("client_secret",this._settings.client_secret),await this._jsonService.postForm(o,{body:u,timeoutInSeconds:this._settings.requestTimeoutInSeconds}),a.debug("got response")}},fA=class{constructor(e,t,a){this._settings=e,this._metadataService=t,this._claimsService=a,this._logger=new $e("ResponseValidator"),this._userInfoService=new hA(this._settings,this._metadataService),this._tokenClient=new Tp(this._settings,this._metadataService)}async validateSigninResponse(e,t,a){const o=this._logger.create("validateSigninResponse");this._processSigninState(e,t),o.debug("state processed"),await this._processCode(e,t,a),o.debug("code processed"),e.isOpenId&&this._validateIdTokenAttributes(e),o.debug("tokens validated"),await this._processClaims(e,t==null?void 0:t.skipUserInfo,e.isOpenId),o.debug("claims processed")}async validateCredentialsResponse(e,t){const a=this._logger.create("validateCredentialsResponse"),o=e.isOpenId&&!!e.id_token;o&&this._validateIdTokenAttributes(e),a.debug("tokens validated"),await this._processClaims(e,t,o),a.debug("claims processed")}async validateRefreshResponse(e,t){var a,o;const u=this._logger.create("validateRefreshResponse");e.userState=t.data,(a=e.session_state)!=null||(e.session_state=t.session_state),(o=e.scope)!=null||(e.scope=t.scope),e.isOpenId&&e.id_token&&(this._validateIdTokenAttributes(e,t.id_token),u.debug("ID Token validated")),e.id_token||(e.id_token=t.id_token,e.profile=t.profile);const f=e.isOpenId&&!!e.id_token;await this._processClaims(e,!1,f),u.debug("claims processed")}validateSignoutResponse(e,t){const a=this._logger.create("validateSignoutResponse");if(t.id!==e.state&&a.throw(new Error("State does not match")),a.debug("state validated"),e.userState=t.data,e.error)throw a.warn("Response was error",e.error),new Gs(e)}_processSigninState(e,t){var a;const o=this._logger.create("_processSigninState");if(t.id!==e.state&&o.throw(new Error("State does not match")),t.client_id||o.throw(new Error("No client_id on state")),t.authority||o.throw(new Error("No authority on state")),this._settings.authority!==t.authority&&o.throw(new Error("authority mismatch on settings vs. signin state")),this._settings.client_id&&this._settings.client_id!==t.client_id&&o.throw(new Error("client_id mismatch on settings vs. signin state")),o.debug("state validated"),e.userState=t.data,e.url_state=t.url_state,(a=e.scope)!=null||(e.scope=t.scope),e.error)throw o.warn("Response was error",e.error),new Gs(e);t.code_verifier&&!e.code&&o.throw(new Error("Expected code in response"))}async _processClaims(e,t=!1,a=!0){const o=this._logger.create("_processClaims");if(e.profile=this._claimsService.filterProtocolClaims(e.profile),t||!this._settings.loadUserInfo||!e.access_token){o.debug("not loading user info");return}o.debug("loading user info");const u=await this._userInfoService.getClaims(e.access_token);o.debug("user info claims received from user info endpoint"),a&&u.sub!==e.profile.sub&&o.throw(new Error("subject from UserInfo response does not match subject in ID Token")),e.profile=this._claimsService.mergeClaims(e.profile,this._claimsService.filterProtocolClaims(u)),o.debug("user info claims received, updated profile:",e.profile)}async _processCode(e,t,a){const o=this._logger.create("_processCode");if(e.code){o.debug("Validating code");const u=await this._tokenClient.exchangeCode({client_id:t.client_id,client_secret:t.client_secret,code:e.code,redirect_uri:t.redirect_uri,code_verifier:t.code_verifier,extraHeaders:a,...t.extraTokenParams});Object.assign(e,u)}else o.debug("No code to process")}_validateIdTokenAttributes(e,t){var a;const o=this._logger.create("_validateIdTokenAttributes");o.debug("decoding ID Token JWT");const u=Sn.decode((a=e.id_token)!=null?a:"");if(u.sub||o.throw(new Error("ID Token is missing a subject claim")),t){const f=Sn.decode(t);u.sub!==f.sub&&o.throw(new Error("sub in id_token does not match current sub")),u.auth_time&&u.auth_time!==f.auth_time&&o.throw(new Error("auth_time in id_token does not match original auth_time")),u.azp&&u.azp!==f.azp&&o.throw(new Error("azp in id_token does not match original azp")),!u.azp&&f.azp&&o.throw(new Error("azp not in id_token, but present in original id_token"))}e.profile=u}},An=class zl{constructor(t){this.id=t.id||ii.generateUUIDv4(),this.data=t.data,t.created&&t.created>0?this.created=t.created:this.created=Ji.getEpochTime(),this.request_type=t.request_type,this.url_state=t.url_state}toStorageString(){return new $e("State").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type,url_state:this.url_state})}static fromStorageString(t){return $e.createStatic("State","fromStorageString"),Promise.resolve(new zl(JSON.parse(t)))}static async clearStaleState(t,a){const o=$e.createStatic("State","clearStaleState"),u=Ji.getEpochTime()-a,f=await t.getAllKeys();o.debug("got keys",f);for(let g=0;g<f.length;g++){const y=f[g],k=await t.get(y);let A=!1;if(k)try{const M=await zl.fromStorageString(k);o.debug("got item from key:",y,M.created),M.created<=u&&(A=!0)}catch(M){o.error("Error parsing state for key:",y,M),A=!0}else o.debug("no item in storage for key:",y),A=!0;A&&(o.debug("removed item for key:",y),t.remove(y))}}},Pp=class Bl extends An{constructor(t){super(t),this.code_verifier=t.code_verifier,this.code_challenge=t.code_challenge,this.authority=t.authority,this.client_id=t.client_id,this.redirect_uri=t.redirect_uri,this.scope=t.scope,this.client_secret=t.client_secret,this.extraTokenParams=t.extraTokenParams,this.response_mode=t.response_mode,this.skipUserInfo=t.skipUserInfo}static async create(t){const a=t.code_verifier===!0?ii.generateCodeVerifier():t.code_verifier||void 0,o=a?await ii.generateCodeChallenge(a):void 0;return new Bl({...t,code_verifier:a,code_challenge:o})}toStorageString(){return new $e("SigninState").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type,url_state:this.url_state,code_verifier:this.code_verifier,authority:this.authority,client_id:this.client_id,redirect_uri:this.redirect_uri,scope:this.scope,client_secret:this.client_secret,extraTokenParams:this.extraTokenParams,response_mode:this.response_mode,skipUserInfo:this.skipUserInfo})}static fromStorageString(t){$e.createStatic("SigninState","fromStorageString");const a=JSON.parse(t);return Bl.create(a)}},Ip=class _p{constructor(t){this.url=t.url,this.state=t.state}static async create({url:t,authority:a,client_id:o,redirect_uri:u,response_type:f,scope:g,state_data:y,response_mode:k,request_type:A,client_secret:M,nonce:P,url_state:N,resource:H,skipUserInfo:z,extraQueryParams:G,extraTokenParams:Q,disablePKCE:q,dpopJkt:ie,omitScopeWhenRequesting:$,...re}){if(!t)throw this._logger.error("create: No url passed"),new Error("url");if(!o)throw this._logger.error("create: No client_id passed"),new Error("client_id");if(!u)throw this._logger.error("create: No redirect_uri passed"),new Error("redirect_uri");if(!f)throw this._logger.error("create: No response_type passed"),new Error("response_type");if(!g)throw this._logger.error("create: No scope passed"),new Error("scope");if(!a)throw this._logger.error("create: No authority passed"),new Error("authority");const B=await Pp.create({data:y,request_type:A,url_state:N,code_verifier:!q,client_id:o,authority:a,redirect_uri:u,response_mode:k,client_secret:M,scope:g,extraTokenParams:Q,skipUserInfo:z}),de=new URL(t);de.searchParams.append("client_id",o),de.searchParams.append("redirect_uri",u),de.searchParams.append("response_type",f),$||de.searchParams.append("scope",g),P&&de.searchParams.append("nonce",P),ie&&de.searchParams.append("dpop_jkt",ie);let ae=B.id;N&&(ae=`${ae}${Sa}${N}`),de.searchParams.append("state",ae),B.code_challenge&&(de.searchParams.append("code_challenge",B.code_challenge),de.searchParams.append("code_challenge_method","S256")),H&&(Array.isArray(H)?H:[H]).forEach(J=>de.searchParams.append("resource",J));for(const[U,J]of Object.entries({response_mode:k,...re,...G}))J!=null&&de.searchParams.append(U,J.toString());return new _p({url:de.href,state:B})}};Ip._logger=new $e("SigninRequest");var gA=Ip,pA="openid",Fo=class{constructor(e){if(this.access_token="",this.token_type="",this.profile={},this.state=e.get("state"),this.session_state=e.get("session_state"),this.state){const t=decodeURIComponent(this.state).split(Sa);this.state=t[0],t.length>1&&(this.url_state=t.slice(1).join(Sa))}this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri"),this.code=e.get("code")}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-Ji.getEpochTime()}set expires_in(e){typeof e=="string"&&(e=Number(e)),e!==void 0&&e>=0&&(this.expires_at=Math.floor(e)+Ji.getEpochTime())}get isOpenId(){var e;return((e=this.scope)==null?void 0:e.split(" ").includes(pA))||!!this.id_token}},mA=class{constructor({url:e,state_data:t,id_token_hint:a,post_logout_redirect_uri:o,extraQueryParams:u,request_type:f,client_id:g,url_state:y}){if(this._logger=new $e("SignoutRequest"),!e)throw this._logger.error("ctor: No url passed"),new Error("url");const k=new URL(e);if(a&&k.searchParams.append("id_token_hint",a),g&&k.searchParams.append("client_id",g),o&&(k.searchParams.append("post_logout_redirect_uri",o),t||y)){this.state=new An({data:t,request_type:f,url_state:y});let A=this.state.id;y&&(A=`${A}${Sa}${y}`),k.searchParams.append("state",A)}for(const[A,M]of Object.entries({...u}))M!=null&&k.searchParams.append(A,M.toString());this.url=k.href}},vA=class{constructor(e){if(this.state=e.get("state"),this.state){const t=decodeURIComponent(this.state).split(Sa);this.state=t[0],t.length>1&&(this.url_state=t.slice(1).join(Sa))}this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri")}},bA=["nbf","jti","auth_time","nonce","acr","amr","azp","at_hash"],xA=["sub","iss","aud","exp","iat"],yA=class{constructor(e){this._settings=e,this._logger=new $e("ClaimsService")}filterProtocolClaims(e){const t={...e};if(this._settings.filterProtocolClaims){let a;Array.isArray(this._settings.filterProtocolClaims)?a=this._settings.filterProtocolClaims:a=bA;for(const o of a)xA.includes(o)||delete t[o]}return t}mergeClaims(e,t){const a={...e};for(const[o,u]of Object.entries(t))if(a[o]!==u)if(Array.isArray(a[o])||Array.isArray(u))if(this._settings.mergeClaimsStrategy.array=="replace")a[o]=u;else{const f=Array.isArray(a[o])?a[o]:[a[o]];for(const g of Array.isArray(u)?u:[u])f.includes(g)||f.push(g);a[o]=f}else typeof a[o]=="object"&&typeof u=="object"?a[o]=this.mergeClaims(a[o],u):a[o]=u;return a}},Dp=class{constructor(e,t){this.keys=e,this.nonce=t}},wA=class{constructor(e,t){this._logger=new $e("OidcClient"),this.settings=e instanceof Fl?e:new Fl(e),this.metadataService=t??new oA(this.settings),this._claimsService=new yA(this.settings),this._validator=new fA(this.settings,this.metadataService,this._claimsService),this._tokenClient=new Tp(this.settings,this.metadataService)}async createSigninRequest({state:e,request:t,request_uri:a,request_type:o,id_token_hint:u,login_hint:f,skipUserInfo:g,nonce:y,url_state:k,response_type:A=this.settings.response_type,scope:M=this.settings.scope,redirect_uri:P=this.settings.redirect_uri,prompt:N=this.settings.prompt,display:H=this.settings.display,max_age:z=this.settings.max_age,ui_locales:G=this.settings.ui_locales,acr_values:Q=this.settings.acr_values,resource:q=this.settings.resource,response_mode:ie=this.settings.response_mode,extraQueryParams:$=this.settings.extraQueryParams,extraTokenParams:re=this.settings.extraTokenParams,dpopJkt:B,omitScopeWhenRequesting:de=this.settings.omitScopeWhenRequesting}){const ae=this._logger.create("createSigninRequest");if(A!=="code")throw new Error("Only the Authorization Code flow (with PKCE) is supported");const U=await this.metadataService.getAuthorizationEndpoint();ae.debug("Received authorization endpoint",U);const J=await gA.create({url:U,authority:this.settings.authority,client_id:this.settings.client_id,redirect_uri:P,response_type:A,scope:M,state_data:e,url_state:k,prompt:N,display:H,max_age:z,ui_locales:G,id_token_hint:u,login_hint:f,acr_values:Q,dpopJkt:B,resource:q,request:t,request_uri:a,extraQueryParams:$,extraTokenParams:re,request_type:o,response_mode:ie,client_secret:this.settings.client_secret,skipUserInfo:g,nonce:y,disablePKCE:this.settings.disablePKCE,omitScopeWhenRequesting:de});await this.clearStaleState();const fe=J.state;return await this.settings.stateStore.set(fe.id,fe.toStorageString()),J}async readSigninResponseState(e,t=!1){const a=this._logger.create("readSigninResponseState"),o=new Fo(Ol.readParams(e,this.settings.response_mode));if(!o.state)throw a.throw(new Error("No state in response")),null;const u=await this.settings.stateStore[t?"remove":"get"](o.state);if(!u)throw a.throw(new Error("No matching state found in storage")),null;return{state:await Pp.fromStorageString(u),response:o}}async processSigninResponse(e,t,a=!0){const o=this._logger.create("processSigninResponse"),{state:u,response:f}=await this.readSigninResponseState(e,a);if(o.debug("received state from storage; validating response"),this.settings.dpop&&this.settings.dpop.store){const g=await this.getDpopProof(this.settings.dpop.store);t={...t,DPoP:g}}try{await this._validator.validateSigninResponse(f,u,t)}catch(g){if(g instanceof Nl&&this.settings.dpop){const y=await this.getDpopProof(this.settings.dpop.store,g.nonce);t.DPoP=y,await this._validator.validateSigninResponse(f,u,t)}else throw g}return f}async getDpopProof(e,t){let a,o;return(await e.getAllKeys()).includes(this.settings.client_id)?(o=await e.get(this.settings.client_id),o.nonce!==t&&t&&(o.nonce=t,await e.set(this.settings.client_id,o))):(a=await ii.generateDPoPKeys(),o=new Dp(a,t),await e.set(this.settings.client_id,o)),await ii.generateDPoPProof({url:await this.metadataService.getTokenEndpoint(!1),httpMethod:"POST",keyPair:o.keys,nonce:o.nonce})}async processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:a=!1,extraTokenParams:o={}}){const u=await this._tokenClient.exchangeCredentials({username:e,password:t,...o}),f=new Fo(new URLSearchParams);return Object.assign(f,u),await this._validator.validateCredentialsResponse(f,a),f}async useRefreshToken({state:e,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,extraTokenParams:f}){var g;const y=this._logger.create("useRefreshToken");let k;if(this.settings.refreshTokenAllowedScope===void 0)k=e.scope;else{const P=this.settings.refreshTokenAllowedScope.split(" ");k=(((g=e.scope)==null?void 0:g.split(" "))||[]).filter(H=>P.includes(H)).join(" ")}if(this.settings.dpop&&this.settings.dpop.store){const P=await this.getDpopProof(this.settings.dpop.store);u={...u,DPoP:P}}let A;try{A=await this._tokenClient.exchangeRefreshToken({refresh_token:e.refresh_token,scope:k,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,...f})}catch(P){if(P instanceof Nl&&this.settings.dpop)u.DPoP=await this.getDpopProof(this.settings.dpop.store,P.nonce),A=await this._tokenClient.exchangeRefreshToken({refresh_token:e.refresh_token,scope:k,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,...f});else throw P}const M=new Fo(new URLSearchParams);return Object.assign(M,A),y.debug("validating response",M),await this._validator.validateRefreshResponse(M,{...e,scope:k}),M}async createSignoutRequest({state:e,id_token_hint:t,client_id:a,request_type:o,url_state:u,post_logout_redirect_uri:f=this.settings.post_logout_redirect_uri,extraQueryParams:g=this.settings.extraQueryParams}={}){const y=this._logger.create("createSignoutRequest"),k=await this.metadataService.getEndSessionEndpoint();if(!k)throw y.throw(new Error("No end session endpoint")),null;y.debug("Received end session endpoint",k),!a&&f&&!t&&(a=this.settings.client_id);const A=new mA({url:k,id_token_hint:t,client_id:a,post_logout_redirect_uri:f,state_data:e,extraQueryParams:g,request_type:o,url_state:u});await this.clearStaleState();const M=A.state;return M&&(y.debug("Signout request has state to persist"),await this.settings.stateStore.set(M.id,M.toStorageString())),A}async readSignoutResponseState(e,t=!1){const a=this._logger.create("readSignoutResponseState"),o=new vA(Ol.readParams(e,this.settings.response_mode));if(!o.state){if(a.debug("No state in response"),o.error)throw a.warn("Response was error:",o.error),new Gs(o);return{state:void 0,response:o}}const u=await this.settings.stateStore[t?"remove":"get"](o.state);if(!u)throw a.throw(new Error("No matching state found in storage")),null;return{state:await An.fromStorageString(u),response:o}}async processSignoutResponse(e){const t=this._logger.create("processSignoutResponse"),{state:a,response:o}=await this.readSignoutResponseState(e,!0);return a?(t.debug("Received state from storage; validating response"),this._validator.validateSignoutResponse(o,a)):t.debug("No state from storage; skipping response validation"),o}clearStaleState(){return this._logger.create("clearStaleState"),An.clearStaleState(this.settings.stateStore,this.settings.staleStateAgeInSeconds)}async revokeToken(e,t){return this._logger.create("revokeToken"),await this._tokenClient.revoke({token:e,token_type_hint:t})}},kA=class{constructor(e){this._userManager=e,this._logger=new $e("SessionMonitor"),this._start=async t=>{const a=t.session_state;if(!a)return;const o=this._logger.create("_start");if(t.profile?(this._sub=t.profile.sub,o.debug("session_state",a,", sub",this._sub)):(this._sub=void 0,o.debug("session_state",a,", anonymous user")),this._checkSessionIFrame){this._checkSessionIFrame.start(a);return}try{const u=await this._userManager.metadataService.getCheckSessionIframe();if(u){o.debug("initializing check session iframe");const f=this._userManager.settings.client_id,g=this._userManager.settings.checkSessionIntervalInSeconds,y=this._userManager.settings.stopCheckSessionOnError,k=new nA(this._callback,f,u,g,y);await k.load(),this._checkSessionIFrame=k,k.start(a)}else o.warn("no check session iframe found in the metadata")}catch(u){o.error("Error from getCheckSessionIframe:",u instanceof Error?u.message:u)}},this._stop=()=>{const t=this._logger.create("_stop");if(this._sub=void 0,this._checkSessionIFrame&&this._checkSessionIFrame.stop(),this._userManager.settings.monitorAnonymousSession){const a=setInterval(async()=>{clearInterval(a);try{const o=await this._userManager.querySessionStatus();if(o){const u={session_state:o.session_state,profile:o.sub?{sub:o.sub}:null};this._start(u)}}catch(o){t.error("error from querySessionStatus",o instanceof Error?o.message:o)}},1e3)}},this._callback=async()=>{const t=this._logger.create("_callback");try{const a=await this._userManager.querySessionStatus();let o=!0;a&&this._checkSessionIFrame?a.sub===this._sub?(o=!1,this._checkSessionIFrame.start(a.session_state),t.debug("same sub still logged in at OP, session state has changed, restarting check session iframe; session_state",a.session_state),await this._userManager.events._raiseUserSessionChanged()):t.debug("different subject signed into OP",a.sub):t.debug("subject no longer signed into OP"),o?this._sub?await this._userManager.events._raiseUserSignedOut():await this._userManager.events._raiseUserSignedIn():t.debug("no change in session detected, no event to raise")}catch(a){this._sub&&(t.debug("Error calling queryCurrentSigninSession; raising signed out event",a),await this._userManager.events._raiseUserSignedOut())}},e||this._logger.throw(new Error("No user manager passed")),this._userManager.events.addUserLoaded(this._start),this._userManager.events.addUserUnloaded(this._stop),this._init().catch(t=>{this._logger.error(t)})}async _init(){this._logger.create("_init");const e=await this._userManager.getUser();if(e)this._start(e);else if(this._userManager.settings.monitorAnonymousSession){const t=await this._userManager.querySessionStatus();if(t){const a={session_state:t.session_state,profile:t.sub?{sub:t.sub}:null};this._start(a)}}}},zo=class Rp{constructor(t){var a;this.id_token=t.id_token,this.session_state=(a=t.session_state)!=null?a:null,this.access_token=t.access_token,this.refresh_token=t.refresh_token,this.token_type=t.token_type,this.scope=t.scope,this.profile=t.profile,this.expires_at=t.expires_at,this.state=t.userState,this.url_state=t.url_state}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-Ji.getEpochTime()}set expires_in(t){t!==void 0&&(this.expires_at=Math.floor(t)+Ji.getEpochTime())}get expired(){const t=this.expires_in;if(t!==void 0)return t<=0}get scopes(){var t,a;return(a=(t=this.scope)==null?void 0:t.split(" "))!=null?a:[]}toStorageString(){return new $e("User").create("toStorageString"),JSON.stringify({id_token:this.id_token,session_state:this.session_state,access_token:this.access_token,refresh_token:this.refresh_token,token_type:this.token_type,scope:this.scope,profile:this.profile,expires_at:this.expires_at})}static fromStorageString(t){return $e.createStatic("User","fromStorageString"),new Rp(JSON.parse(t))}},Kd="oidc-client",Lp=class{constructor(){this._abort=new fs("Window navigation aborted"),this._disposeHandlers=new Set,this._window=null}async navigate(e){const t=this._logger.create("navigate");if(!this._window)throw new Error("Attempted to navigate on a disposed window");t.debug("setting URL in window"),this._window.location.replace(e.url);const{url:a,keepOpen:o}=await new Promise((u,f)=>{const g=y=>{var k;const A=y.data,M=(k=e.scriptOrigin)!=null?k:window.location.origin;if(!(y.origin!==M||(A==null?void 0:A.source)!==Kd)){try{const P=Ol.readParams(A.url,e.response_mode).get("state");if(P||t.warn("no state found in response url"),y.source!==this._window&&P!==e.state)return}catch{this._dispose(),f(new Error("Invalid response from window"))}u(A)}};window.addEventListener("message",g,!1),this._disposeHandlers.add(()=>window.removeEventListener("message",g,!1)),this._disposeHandlers.add(this._abort.addHandler(y=>{this._dispose(),f(y)}))});return t.debug("got response from window"),this._dispose(),o||this.close(),{url:a}}_dispose(){this._logger.create("_dispose");for(const e of this._disposeHandlers)e();this._disposeHandlers.clear()}static _notifyParent(e,t,a=!1,o=window.location.origin){e.postMessage({source:Kd,url:t,keepOpen:a},o)}},Op={location:!1,toolbar:!1,height:640,closePopupWindowAfterInSeconds:-1},Np="_blank",SA=60,AA=2,Fp=10,CA=class extends Fl{constructor(e){const{popup_redirect_uri:t=e.redirect_uri,popup_post_logout_redirect_uri:a=e.post_logout_redirect_uri,popupWindowFeatures:o=Op,popupWindowTarget:u=Np,redirectMethod:f="assign",redirectTarget:g="self",iframeNotifyParentOrigin:y=e.iframeNotifyParentOrigin,iframeScriptOrigin:k=e.iframeScriptOrigin,requestTimeoutInSeconds:A,silent_redirect_uri:M=e.redirect_uri,silentRequestTimeoutInSeconds:P,automaticSilentRenew:N=!0,validateSubOnSilentRenew:H=!0,includeIdTokenInSilentRenew:z=!1,monitorSession:G=!1,monitorAnonymousSession:Q=!1,checkSessionIntervalInSeconds:q=AA,query_status_response_type:ie="code",stopCheckSessionOnError:$=!0,revokeTokenTypes:re=["access_token","refresh_token"],revokeTokensOnSignout:B=!1,includeIdTokenInSilentSignout:de=!1,accessTokenExpiringNotificationTimeInSeconds:ae=SA,userStore:U}=e;if(super(e),this.popup_redirect_uri=t,this.popup_post_logout_redirect_uri=a,this.popupWindowFeatures=o,this.popupWindowTarget=u,this.redirectMethod=f,this.redirectTarget=g,this.iframeNotifyParentOrigin=y,this.iframeScriptOrigin=k,this.silent_redirect_uri=M,this.silentRequestTimeoutInSeconds=P||A||Fp,this.automaticSilentRenew=N,this.validateSubOnSilentRenew=H,this.includeIdTokenInSilentRenew=z,this.monitorSession=G,this.monitorAnonymousSession=Q,this.checkSessionIntervalInSeconds=q,this.stopCheckSessionOnError=$,this.query_status_response_type=ie,this.revokeTokenTypes=re,this.revokeTokensOnSignout=B,this.includeIdTokenInSilentSignout=de,this.accessTokenExpiringNotificationTimeInSeconds=ae,U)this.userStore=U;else{const J=typeof window<"u"?window.sessionStorage:new Ep;this.userStore=new Mp({store:J})}}},Zd=class zp extends Lp{constructor({silentRequestTimeoutInSeconds:t=Fp}){super(),this._logger=new $e("IFrameWindow"),this._timeoutInSeconds=t,this._frame=zp.createHiddenIframe(),this._window=this._frame.contentWindow}static createHiddenIframe(){const t=window.document.createElement("iframe");return t.style.visibility="hidden",t.style.position="fixed",t.style.left="-1000px",t.style.top="0",t.width="0",t.height="0",window.document.body.appendChild(t),t}async navigate(t){this._logger.debug("navigate: Using timeout of:",this._timeoutInSeconds);const a=setTimeout(()=>void this._abort.raise(new Oc("IFrame timed out without a response")),this._timeoutInSeconds*1e3);return this._disposeHandlers.add(()=>clearTimeout(a)),await super.navigate(t)}close(){var t;this._frame&&(this._frame.parentNode&&(this._frame.addEventListener("load",a=>{var o;const u=a.target;(o=u.parentNode)==null||o.removeChild(u),this._abort.raise(new Error("IFrame removed from DOM"))},!0),(t=this._frame.contentWindow)==null||t.location.replace("about:blank")),this._frame=null),this._window=null}static notifyParent(t,a){return super._notifyParent(window.parent,t,!1,a)}},EA=class{constructor(e){this._settings=e,this._logger=new $e("IFrameNavigator")}async prepare({silentRequestTimeoutInSeconds:e=this._settings.silentRequestTimeoutInSeconds}){return new Zd({silentRequestTimeoutInSeconds:e})}async callback(e){this._logger.create("callback"),Zd.notifyParent(e,this._settings.iframeNotifyParentOrigin)}},MA=500,TA=1e3,Jd=class extends Lp{constructor({popupWindowTarget:e=Np,popupWindowFeatures:t={},popupSignal:a}){super(),this._logger=new $e("PopupWindow");const o=$d.center({...Op,...t});this._window=window.open(void 0,e,$d.serialize(o)),a&&a.addEventListener("abort",()=>{var u;this._abort.raise(new Error((u=a.reason)!=null?u:"Popup aborted"))}),t.closePopupWindowAfterInSeconds&&t.closePopupWindowAfterInSeconds>0&&setTimeout(()=>{if(!this._window||typeof this._window.closed!="boolean"||this._window.closed){this._abort.raise(new Error("Popup blocked by user"));return}this.close()},t.closePopupWindowAfterInSeconds*TA)}async navigate(e){var t;(t=this._window)==null||t.focus();const a=setInterval(()=>{(!this._window||this._window.closed)&&this._abort.raise(new Error("Popup closed by user"))},MA);return this._disposeHandlers.add(()=>clearInterval(a)),await super.navigate(e)}close(){this._window&&(this._window.closed||(this._window.close(),this._abort.raise(new Error("Popup closed")))),this._window=null}static notifyOpener(e,t){if(!window.opener)throw new Error("No window.opener. Can't complete notification.");return super._notifyParent(window.opener,e,t)}},PA=class{constructor(e){this._settings=e,this._logger=new $e("PopupNavigator")}async prepare({popupWindowFeatures:e=this._settings.popupWindowFeatures,popupWindowTarget:t=this._settings.popupWindowTarget,popupSignal:a}){return new Jd({popupWindowFeatures:e,popupWindowTarget:t,popupSignal:a})}async callback(e,{keepOpen:t=!1}){this._logger.create("callback"),Jd.notifyOpener(e,t)}},IA=class{constructor(e){this._settings=e,this._logger=new $e("RedirectNavigator")}async prepare({redirectMethod:e=this._settings.redirectMethod,redirectTarget:t=this._settings.redirectTarget}){var a;this._logger.create("prepare");let o=window.self;t==="top"&&(o=(a=window.top)!=null?a:window.self);const u=o.location[e].bind(o.location);let f;return{navigate:async g=>{this._logger.create("navigate");const y=new Promise((k,A)=>{f=A});return u(g.url),await y},close:()=>{this._logger.create("close"),f==null||f(new Error("Redirect aborted")),o.stop()}}}async callback(){}},_A=class extends rA{constructor(e){super({expiringNotificationTimeInSeconds:e.accessTokenExpiringNotificationTimeInSeconds}),this._logger=new $e("UserManagerEvents"),this._userLoaded=new fs("User loaded"),this._userUnloaded=new fs("User unloaded"),this._silentRenewError=new fs("Silent renew error"),this._userSignedIn=new fs("User signed in"),this._userSignedOut=new fs("User signed out"),this._userSessionChanged=new fs("User session changed")}async load(e,t=!0){await super.load(e),t&&await this._userLoaded.raise(e)}async unload(){await super.unload(),await this._userUnloaded.raise()}addUserLoaded(e){return this._userLoaded.addHandler(e)}removeUserLoaded(e){return this._userLoaded.removeHandler(e)}addUserUnloaded(e){return this._userUnloaded.addHandler(e)}removeUserUnloaded(e){return this._userUnloaded.removeHandler(e)}addSilentRenewError(e){return this._silentRenewError.addHandler(e)}removeSilentRenewError(e){return this._silentRenewError.removeHandler(e)}async _raiseSilentRenewError(e){await this._silentRenewError.raise(e)}addUserSignedIn(e){return this._userSignedIn.addHandler(e)}removeUserSignedIn(e){this._userSignedIn.removeHandler(e)}async _raiseUserSignedIn(){await this._userSignedIn.raise()}addUserSignedOut(e){return this._userSignedOut.addHandler(e)}removeUserSignedOut(e){this._userSignedOut.removeHandler(e)}async _raiseUserSignedOut(){await this._userSignedOut.raise()}addUserSessionChanged(e){return this._userSessionChanged.addHandler(e)}removeUserSessionChanged(e){this._userSessionChanged.removeHandler(e)}async _raiseUserSessionChanged(){await this._userSessionChanged.raise()}},DA=class{constructor(e){this._userManager=e,this._logger=new $e("SilentRenewService"),this._isStarted=!1,this._retryTimer=new Ji("Retry Silent Renew"),this._tokenExpiring=async()=>{const t=this._logger.create("_tokenExpiring");try{await this._userManager.signinSilent(),t.debug("silent token renewal successful")}catch(a){if(a instanceof Oc){t.warn("ErrorTimeout from signinSilent:",a,"retry in 5s"),this._retryTimer.init(5);return}t.error("Error from signinSilent:",a),await this._userManager.events._raiseSilentRenewError(a)}}}async start(){const e=this._logger.create("start");if(!this._isStarted){this._isStarted=!0,this._userManager.events.addAccessTokenExpiring(this._tokenExpiring),this._retryTimer.addHandler(this._tokenExpiring);try{await this._userManager.getUser()}catch(t){e.error("getUser error",t)}}}stop(){this._isStarted&&(this._retryTimer.cancel(),this._retryTimer.removeHandler(this._tokenExpiring),this._userManager.events.removeAccessTokenExpiring(this._tokenExpiring),this._isStarted=!1)}},RA=class{constructor(e){this.refresh_token=e.refresh_token,this.id_token=e.id_token,this.session_state=e.session_state,this.scope=e.scope,this.profile=e.profile,this.data=e.state}},LA=class{constructor(e,t,a,o){this._logger=new $e("UserManager"),this.settings=new CA(e),this._client=new wA(e),this._redirectNavigator=t??new IA(this.settings),this._popupNavigator=a??new PA(this.settings),this._iframeNavigator=o??new EA(this.settings),this._events=new _A(this.settings),this._silentRenewService=new DA(this),this.settings.automaticSilentRenew&&this.startSilentRenew(),this._sessionMonitor=null,this.settings.monitorSession&&(this._sessionMonitor=new kA(this))}get events(){return this._events}get metadataService(){return this._client.metadataService}async getUser(e=!1){const t=this._logger.create("getUser"),a=await this._loadUser();return a?(t.info("user loaded"),await this._events.load(a,e),a):(t.info("user not found in storage"),null)}async removeUser(){const e=this._logger.create("removeUser");await this.storeUser(null),e.info("user removed from storage"),await this._events.unload()}async signinRedirect(e={}){var t;this._logger.create("signinRedirect");const{redirectMethod:a,...o}=e;let u;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(u=await this.generateDPoPJkt(this.settings.dpop));const f=await this._redirectNavigator.prepare({redirectMethod:a});await this._signinStart({request_type:"si:r",dpopJkt:u,...o},f)}async signinRedirectCallback(e=window.location.href){const t=this._logger.create("signinRedirectCallback"),a=await this._signinEnd(e);return a.profile&&a.profile.sub?t.info("success, signed in subject",a.profile.sub):t.info("no subject"),a}async signinResourceOwnerCredentials({username:e,password:t,skipUserInfo:a=!1}){const o=this._logger.create("signinResourceOwnerCredential"),u=await this._client.processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:a,extraTokenParams:this.settings.extraTokenParams});o.debug("got signin response");const f=await this._buildUser(u);return f.profile&&f.profile.sub?o.info("success, signed in subject",f.profile.sub):o.info("no subject"),f}async signinPopup(e={}){var t;const a=this._logger.create("signinPopup");let o;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(o=await this.generateDPoPJkt(this.settings.dpop));const{popupWindowFeatures:u,popupWindowTarget:f,popupSignal:g,...y}=e,k=this.settings.popup_redirect_uri;k||a.throw(new Error("No popup_redirect_uri configured"));const A=await this._popupNavigator.prepare({popupWindowFeatures:u,popupWindowTarget:f,popupSignal:g}),M=await this._signin({request_type:"si:p",redirect_uri:k,display:"popup",dpopJkt:o,...y},A);return M&&(M.profile&&M.profile.sub?a.info("success, signed in subject",M.profile.sub):a.info("no subject")),M}async signinPopupCallback(e=window.location.href,t=!1){const a=this._logger.create("signinPopupCallback");await this._popupNavigator.callback(e,{keepOpen:t}),a.info("success")}async signinSilent(e={}){var t,a;const o=this._logger.create("signinSilent"),{silentRequestTimeoutInSeconds:u,...f}=e;let g=await this._loadUser();if(g!=null&&g.refresh_token){o.debug("using refresh token");const P=new RA(g);return await this._useRefreshToken({state:P,redirect_uri:f.redirect_uri,resource:f.resource,extraTokenParams:f.extraTokenParams,timeoutInSeconds:u})}let y;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(y=await this.generateDPoPJkt(this.settings.dpop));const k=this.settings.silent_redirect_uri;k||o.throw(new Error("No silent_redirect_uri configured"));let A;g&&this.settings.validateSubOnSilentRenew&&(o.debug("subject prior to silent renew:",g.profile.sub),A=g.profile.sub);const M=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:u});return g=await this._signin({request_type:"si:s",redirect_uri:k,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?g==null?void 0:g.id_token:void 0,dpopJkt:y,...f},M,A),g&&((a=g.profile)!=null&&a.sub?o.info("success, signed in subject",g.profile.sub):o.info("no subject")),g}async _useRefreshToken(e){const t=await this._client.useRefreshToken({timeoutInSeconds:this.settings.silentRequestTimeoutInSeconds,...e}),a=new zo({...e.state,...t});return await this.storeUser(a),await this._events.load(a),a}async signinSilentCallback(e=window.location.href){const t=this._logger.create("signinSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async signinCallback(e=window.location.href){const{state:t}=await this._client.readSigninResponseState(e);switch(t.request_type){case"si:r":return await this.signinRedirectCallback(e);case"si:p":await this.signinPopupCallback(e);break;case"si:s":await this.signinSilentCallback(e);break;default:throw new Error("invalid response_type in state")}}async signoutCallback(e=window.location.href,t=!1){const{state:a}=await this._client.readSignoutResponseState(e);if(a)switch(a.request_type){case"so:r":return await this.signoutRedirectCallback(e);case"so:p":await this.signoutPopupCallback(e,t);break;case"so:s":await this.signoutSilentCallback(e);break;default:throw new Error("invalid response_type in state")}}async querySessionStatus(e={}){const t=this._logger.create("querySessionStatus"),{silentRequestTimeoutInSeconds:a,...o}=e,u=this.settings.silent_redirect_uri;u||t.throw(new Error("No silent_redirect_uri configured"));const f=await this._loadUser(),g=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:a}),y=await this._signinStart({request_type:"si:s",redirect_uri:u,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?f==null?void 0:f.id_token:void 0,response_type:this.settings.query_status_response_type,scope:"openid",skipUserInfo:!0,...o},g);try{const k={},A=await this._client.processSigninResponse(y.url,k);return t.debug("got signin response"),A.session_state&&A.profile.sub?(t.info("success for subject",A.profile.sub),{session_state:A.session_state,sub:A.profile.sub}):(t.info("success, user not authenticated"),null)}catch(k){if(this.settings.monitorAnonymousSession&&k instanceof Gs)switch(k.error){case"login_required":case"consent_required":case"interaction_required":case"account_selection_required":return t.info("success for anonymous user"),{session_state:k.session_state}}throw k}}async _signin(e,t,a){const o=await this._signinStart(e,t);return await this._signinEnd(o.url,a)}async _signinStart(e,t){const a=this._logger.create("_signinStart");try{const o=await this._client.createSigninRequest(e);return a.debug("got signin request"),await t.navigate({url:o.url,state:o.state.id,response_mode:o.state.response_mode,scriptOrigin:this.settings.iframeScriptOrigin})}catch(o){throw a.debug("error after preparing navigator, closing navigator window"),t.close(),o}}async _signinEnd(e,t){const a=this._logger.create("_signinEnd"),o={},u=await this._client.processSigninResponse(e,o);return a.debug("got signin response"),await this._buildUser(u,t)}async _buildUser(e,t){const a=this._logger.create("_buildUser"),o=new zo(e);if(t){if(t!==o.profile.sub)throw a.debug("current user does not match user returned from signin. sub from signin:",o.profile.sub),new Gs({...e,error:"login_required"});a.debug("current user matches user returned from signin")}return await this.storeUser(o),a.debug("user stored"),await this._events.load(o),o}async signoutRedirect(e={}){const t=this._logger.create("signoutRedirect"),{redirectMethod:a,...o}=e,u=await this._redirectNavigator.prepare({redirectMethod:a});await this._signoutStart({request_type:"so:r",post_logout_redirect_uri:this.settings.post_logout_redirect_uri,...o},u),t.info("success")}async signoutRedirectCallback(e=window.location.href){const t=this._logger.create("signoutRedirectCallback"),a=await this._signoutEnd(e);return t.info("success"),a}async signoutPopup(e={}){const t=this._logger.create("signoutPopup"),{popupWindowFeatures:a,popupWindowTarget:o,popupSignal:u,...f}=e,g=this.settings.popup_post_logout_redirect_uri,y=await this._popupNavigator.prepare({popupWindowFeatures:a,popupWindowTarget:o,popupSignal:u});await this._signout({request_type:"so:p",post_logout_redirect_uri:g,state:g==null?void 0:{},...f},y),t.info("success")}async signoutPopupCallback(e=window.location.href,t=!1){const a=this._logger.create("signoutPopupCallback");await this._popupNavigator.callback(e,{keepOpen:t}),a.info("success")}async _signout(e,t){const a=await this._signoutStart(e,t);return await this._signoutEnd(a.url)}async _signoutStart(e={},t){var a;const o=this._logger.create("_signoutStart");try{const u=await this._loadUser();o.debug("loaded current user from storage"),this.settings.revokeTokensOnSignout&&await this._revokeInternal(u);const f=e.id_token_hint||u&&u.id_token;f&&(o.debug("setting id_token_hint in signout request"),e.id_token_hint=f),await this.removeUser(),o.debug("user removed, creating signout request");const g=await this._client.createSignoutRequest(e);return o.debug("got signout request"),await t.navigate({url:g.url,state:(a=g.state)==null?void 0:a.id,scriptOrigin:this.settings.iframeScriptOrigin})}catch(u){throw o.debug("error after preparing navigator, closing navigator window"),t.close(),u}}async _signoutEnd(e){const t=this._logger.create("_signoutEnd"),a=await this._client.processSignoutResponse(e);return t.debug("got signout response"),a}async signoutSilent(e={}){var t;const a=this._logger.create("signoutSilent"),{silentRequestTimeoutInSeconds:o,...u}=e,f=this.settings.includeIdTokenInSilentSignout?(t=await this._loadUser())==null?void 0:t.id_token:void 0,g=this.settings.popup_post_logout_redirect_uri,y=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:o});await this._signout({request_type:"so:s",post_logout_redirect_uri:g,id_token_hint:f,...u},y),a.info("success")}async signoutSilentCallback(e=window.location.href){const t=this._logger.create("signoutSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async revokeTokens(e){const t=await this._loadUser();await this._revokeInternal(t,e)}async _revokeInternal(e,t=this.settings.revokeTokenTypes){const a=this._logger.create("_revokeInternal");if(!e)return;const o=t.filter(u=>typeof e[u]=="string");if(!o.length){a.debug("no need to revoke due to no token(s)");return}for(const u of o)await this._client.revokeToken(e[u],u),a.info(`${u} revoked successfully`),u!=="access_token"&&(e[u]=null);await this.storeUser(e),a.debug("user stored"),await this._events.load(e)}startSilentRenew(){this._logger.create("startSilentRenew"),this._silentRenewService.start()}stopSilentRenew(){this._silentRenewService.stop()}get _userStoreKey(){return`user:${this.settings.authority}:${this.settings.client_id}`}async _loadUser(){const e=this._logger.create("_loadUser"),t=await this.settings.userStore.get(this._userStoreKey);return t?(e.debug("user storageString loaded"),zo.fromStorageString(t)):(e.debug("no user storageString"),null)}async storeUser(e){const t=this._logger.create("storeUser");if(e){t.debug("storing user");const a=e.toStorageString();await this.settings.userStore.set(this._userStoreKey,a)}else this._logger.debug("removing user"),await this.settings.userStore.remove(this._userStoreKey),this.settings.dpop&&await this.settings.dpop.store.remove(this.settings.client_id)}async clearStaleState(){await this._client.clearStaleState()}async dpopProof(e,t,a,o){var u,f;const g=await((f=(u=this.settings.dpop)==null?void 0:u.store)==null?void 0:f.get(this.settings.client_id));if(g)return await ii.generateDPoPProof({url:e,accessToken:t==null?void 0:t.access_token,httpMethod:a,keyPair:g.keys,nonce:o})}async generateDPoPJkt(e){let t=await e.store.get(this.settings.client_id);if(!t){const a=await ii.generateDPoPKeys();t=new Dp(a),await e.store.set(this.settings.client_id,t)}return await ii.generateDPoPJkt(t.keys)}};const Ke="account",Bo={getMe(){return Pe.get(`/${Ke}/me/`)},checkPassword(e){return Pe.post(`/${Ke}/me/password/`,{password:e})},setPassword(e){return Pe.post(`/${Ke}/me/password/change/`,e,{ignoreErrors:!0})},verifyTFACode(e){const t={code:e};return Pe.post(`${Ke}/tfa/verify/`,t)},startTFASetup(){return Pe.post(`${Ke}/tfa/setup/`)},getKeyForTFASetup(){return Pe.get(`${Ke}/tfa/setup/key/`)},finalizeTFASetup(e){const t={pin_code:e};return Pe.post(`${Ke}/tfa/setup/check/`,t)},disableTFA(e){return Pe.post(`${Ke}/tfa/disable/`,e)},resetRecoveryCodes(e){return Pe.post(`${Ke}/tfa/reset_codes/`,e)},getForward(){return Pe.get(`${Ke}/forward/`)},setForward(e){return Pe.post(`${Ke}/forward/`,e)},getAPIToken(){return Pe.get(`${Ke}/api_token/`)},createAPIToken(){return Pe.post(`${Ke}/api_token/`)},deleteAPIToken(){return Pe.delete(`${Ke}/api_token/`)},getARMessage(){return Pe.get(`${Ke}/armessage/`)},setARMessage(e){return Pe.put(`${Ke}/armessage/`,e)},getFilterSets(){return Pe.get(`${Ke}/filtersets/`)},downloadFilterSet(e){return Pe.get(`${Ke}/filtersets/${e}/download/`)},createFilterSet(e){return Pe.post(`${Ke}/filtersets/`,e)},activateFilterSet(e){return Pe.post(`${Ke}/filtersets/${e}/activate/`)},deleteFilterSet(e){return Pe.delete(`${Ke}/filtersets/${e}/`)},saveFilterSet(e,t){return Pe.put(`${Ke}/filtersets/${e}/`,t)},getFilterConditionTemplates(){return Pe.get(`${Ke}/filtersets/condition_templates/`)},getFilterActionTemplates(){return Pe.get(`${Ke}/filtersets/action_templates/`)},getFilters(e){return Pe.get(`${Ke}/filtersets/${e}/filters/`)},createFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/`,t)},updateFilter(e,t,a){return Pe.put(`${Ke}/filtersets/${e}/filters/${t}/`,a)},disableFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/disable/`)},moveFilterDown(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/move_down/`)},moveFilterUp(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/move_up/`)},enableFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/enable/`)},deleteFilter(e,t){return Pe.delete(`${Ke}/filtersets/${e}/filters/${t}/`)},getAvailableApplications(){return Pe.get(`${Ke}/available_applications/`)}},Ps="accounts",OA={getAll(e){return Pe.get(`/${Ps}/`,{params:e,paramsSerializer:{indexes:null}})},get(e){return Pe.get(`${Ps}/${e}/`)},getRandomPassword(){return Pe.get(`${Ps}/random_password/`)},validate(e){return Pe.post(`${Ps}/validate/`,e)},create(e){return Pe.post(`${Ps}/`,e)},patch(e,t){return Pe.patch(`${Ps}/${e}/`,t)},delete(e,t){return Pe.post(`${Ps}/${e}/delete/`,t)}},Hr={requestToken(e){return Pe.post("/token/",e)},recoverPassword(e){return Pe.post("/password_reset/",e)},checkSmsTotp(e){return Pe.post("/sms_totp/",e)},changePassword(e){return Pe.post("/reset_confirm/",e)},beginFidoRegistration(){return Pe.post("/fido/registration/begin/")},endFidoRegistration(e){return Pe.post("/fido/registration/end/",e)},getAllFidoRegistred(){return Pe.get("/fido/")},deleteFido(e){return Pe.delete(`/fido/${e}/`)},editFido(e,t){return Pe.put(`/fido/${e}/`,t)}};function Qd(e){return e.startsWith("http")?e:`${location.protocol}//${location.host}${e}`}const so=Jg("auth",()=>{const e=Ym(),t=wt(null),a=wt(!1);let o=Qd(e.OAUTH_REDIRECT_URI),u=Qd(e.OAUTH_POST_REDIRECT_URI);const f=new LA({authority:e.OAUTH_AUTHORITY_URL,client_id:e.OAUTH_CLIENT_ID,redirect_uri:o,post_logout_redirect_uri:u,response_type:"code",scope:"openid read write",automaticSilentRenew:!0,accessTokenExpiringNotificationTime:60,monitorSession:!0,filterProtocolClaims:!0,loadUserInfo:!0}),g=wt([]),y=dt(()=>t.value.mailbox!==null),k=dt(()=>{if(t.value.language.indexOf("-")!==-1){const ae=t.value.language.split("-");return`${ae[0]}_${ae[1].toUpperCase()}`}return t.value.language});async function A(){return Bo.getMe().then(ae=>{t.value=ae.data,Hs.current=k.value,a.value=!0})}async function M(){return Hr.getAllFidoRegistred().then(ae=>(g.value=ae.data,g.value.length>0&&(t.value.tfa_enabled=!0,t.value.webauthn_enabled=!0),ae))}async function P(ae){return Hr.endFidoRegistration(ae).then(U=>(M(),U))}async function N(ae){return Hr.deleteFido(ae).then(U=>{g.value=g.value.filter(J=>J.id!==ae),t.value.tfa_enabled=U.data.tfa_enabled,U.data.tfa_enabled||(t.value.webauthn_enabled=!1)})}async function H(ae,U){return Hr.editFido(ae,U).then(J=>{for(let fe=0;fe<g.value.length;fe++)if(g.value[fe].id===ae){g.value[fe]=J.data;break}return J})}function z(){return f.getUser().then(ae=>ae?ae.access_token:null)}async function G(){return a.value||!await f.getUser()?null:A()}async function Q(){const ae=await f.getUser();return!ae||ae.expired?!1:(Pe.defaults.headers.common.Authorization=`Bearer ${ae.access_token}`,Pe.defaults.headers.post["Content-Type"]="application/json",!0)}async function q(){try{await f.signinRedirect()}catch(ae){console.error("Error logging in:",ae)}}async function ie(ae){try{const U=await f.signinRedirectCallback();a.value=!0;const J=sessionStorage.getItem("previousPage");return J?window.location.href=J:ms.push(ae),U}catch(U){return console.error("Error completing login:",U),ms.push({name:"Dashboard"}),null}}async function $(){delete Pe.defaults.headers.common.Authorization,t.value={},a.value=!1,f.signoutRedirect()}async function re(ae){return OA.patch(t.value.pk,ae).then(U=>{const J={...t.value,...U.data};delete J.password,t.value={...J},k.value in Hs.available&&(Hs.current=k.value)})}async function B(ae){return Bo.setPassword(ae)}function de(ae){return Bo.finalizeTFASetup(ae).then(U=>{const J=Dl.withAttributes({sameSite:"strict"});return J.set("token",U.data.access),J.set("refreshToken",U.data.refresh),A(),U})}return{authUser:t,accountLanguage:k,completeLogin:ie,isAuthenticated:a,userHasMailbox:y,fidoCreds:g,validateAccess:Q,fetchUser:A,getAccessToken:z,getFidoCreds:M,addFidoCred:P,deleteFidoCreds:N,editFidoCred:H,initialize:G,login:q,$reset:$,updateAccount:re,updatePassword:B,finalizeTFASetup:de}}),NA=Jg("bus",()=>{const e=wt({}),t=wt(""),a=wt(1),o=wt(1);async function u(){e.value={},t.value="",a.value=1,o.value=1}function f(y){e.value=y.msg,t.value=y.type?y.type:"success"}function g(){o.value++}return{notification:e,notificationColor:t,displayNotification:f,reloadMailboxCounters:g,dataKey:a,mbCounterKey:o,$reset:u}}),FA=Yw(),zA=1,BA=2,HA="SuperAdmins",WA="Resellers",YA="DomainAdmins",VA="SimpleUsers",Le={ALARM_OPENED:zA,ALARM_CLOSED:BA,SUPER_ADMIN:HA,RESELLER:WA,DOMAIN_ADMIN:YA,USER:VA},XA=[{path:"/login",component:()=>Ue(()=>import("./EmptyLayout-FS-cJHKI.js"),__vite__mapDeps([0,1,2,3,4,5])),children:[{path:"",name:"Login",component:()=>Ue(()=>import("./LoginView-R5FtOIzW.js"),__vite__mapDeps([6,7,2,8,9,10,11]))},{path:"logged",name:"LoginCallback",component:()=>Ue(()=>import("./LoginCallbackView-xSv3LV4_.js"),__vite__mapDeps([12,11,2,8,7,9,10])),props:{redirectUrl:"/admin"}}]},{path:"/admin",component:()=>Ue(()=>import("./AdminLayout-CTbzqJSq.js"),__vite__mapDeps([13,14,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29,30])),meta:{allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"Dashboard",component:()=>Ue(()=>import("./DashboardView-CubvMqxt.js"),__vite__mapDeps([31,17,25,2,19,9,10,20,26,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,14,46,47,7,8,48])),meta:{requiresAuth:!0}},{path:"domains",component:()=>Ue(()=>import("./EmptyLayout-FS-cJHKI.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"DomainList",component:()=>Ue(()=>import("./DomainsView-DzL9wtff.js"),__vite__mapDeps([49,50,51,52,2,34,19,9,10,20,21,4,22,35,25,26,33,23,24,36,37,38,39,40,41,53,54,55,8,14,56,57,46,47,58,59,7,60,61,11,27,28,62,63,64,65,66,44,67,68,69,70,71,72,73,74,32,42,43,45,75,76,77,78,79])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:":id",name:"DomainDetail",meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},component:()=>Ue(()=>import("./DomainView-RmJalGk7.js"),__vite__mapDeps([80,73,50,25,2,19,9,10,20,26,74,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,66,67,7,8,81,46,47,55,27,28,82,83,71,72,57,58,59,84,11,85,52,86,87,88,89,90,60,61,91,92]))},{path:":id/edit",name:"DomainEdit",meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},component:()=>Ue(()=>import("./DomainEditView-DrZ9__pt.js"),__vite__mapDeps([93,63,64,19,2,9,10,20,65,52,34,21,4,22,35,53,37,38,54,66,33,23,24,36,39,40,41,44,67,68,69,84,7,8,11,14,85,50,82,83,94,46,47,95]))}]},{path:"imap_migration",component:()=>Ue(()=>import("./EmptyLayout-FS-cJHKI.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"migrations",name:"MigrationsList",component:()=>Ue(()=>import("./MigrationsView-BHTt1qeH.js"),__vite__mapDeps([96,75,21,19,2,9,10,20,4,22,32,33,34,35,23,24,36,37,38,39,40,41,42,43,44,45,46,47,55,8,25,26,97])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}},{path:"providers",component:()=>Ue(()=>import("./EmptyLayout-FS-cJHKI.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"ProvidersList",component:()=>Ue(()=>import("./ProvidersView-CjKsqSYV.js"),__vite__mapDeps([98,56,57,46,2,19,9,10,20,47,25,26,55,8,58,23,21,4,22,24,59,7,60,61,11,27,28,62,99,50,34,35,66,33,36,37,38,39,40,41,44,67,52,53,54,100,75,32,42,43,45,101])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}},{path:"providers/:id/edit",name:"ProviderEdit",component:()=>Ue(()=>import("./ProviderEditView-d2fBym_r.js"),__vite__mapDeps([102,99,50,34,19,2,9,10,20,21,4,22,35,66,33,23,24,36,37,38,39,40,41,44,67,52,55,8,53,54,100,82,83,7])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}}]}]},{path:"identities",component:()=>Ue(()=>import("./EmptyLayout-FS-cJHKI.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"Identities",component:()=>Ue(()=>import("./IdentitiesView-7nHABB9n.js"),__vite__mapDeps([103,75,21,19,2,9,10,20,4,22,57,46,47,25,26,55,8,58,23,24,59,68,36,37,34,35,38,69,104,105,39,40,106,107,108,32,33,41,42,43,44,45,109,110,94,50,111,52,53,54,112,113,56,7,60,61,11,27,28,62,114,64,65,71,72,70,115,51,76,77,78,116])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"accounts/:id",name:"AccountDetail",component:()=>Ue(()=>import("./AccountView-DegeD2uG.js"),__vite__mapDeps([117,51,14,25,2,19,9,10,20,26,39,40,32,33,34,21,4,22,35,23,24,36,37,38,41,42,43,44,45,7,8,46,47,118])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"accounts/:id/edit",name:"AccountEdit",component:()=>Ue(()=>import("./AccountEditView-BLA0CnKd.js"),__vite__mapDeps([119,114,64,19,2,9,10,20,65,7,8,71,72,52,34,21,4,22,35,70,53,37,38,54,110,94,50,111,39,40,115,85,84,11,14,51,82,83,46,47,120])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"aliases/:id",name:"AliasDetail",component:()=>Ue(()=>import("./AliasView-Cdwd7AvE.js"),__vite__mapDeps([121,25,2,19,9,10,20,26,7,8,104,46,47,122])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"aliases/:id/edit",name:"AliasEdit",component:()=>Ue(()=>import("./AliasEditView-Bu0rnLCQ.js"),__vite__mapDeps([123,109,104,110,34,19,2,9,10,20,21,4,22,35,94,50,111,52,53,37,38,54,33,23,24,36,39,40,41,112,113,84,7,8,11,82,83,46,47,124])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}}]},{path:"parameters/:app",name:"ParametersEdit",component:()=>Ue(()=>import("./ParametersView-Bkw5_CyJ.js"),__vite__mapDeps([125,14,126,127,19,2,9,10,20,21,4,22,128,90,60,61,39,40,23,24,91,11,8,25,26,53,34,35,37,38,54,33,36,41,112,113,129,81,87,27,28,88,130,131,46,47,16,17,30,132])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"alarms",name:"Alarms",component:()=>Ue(()=>import("./AlarmsView-CpIExehE.js"),__vite__mapDeps([133,105,75,21,19,2,9,10,20,4,22,23,24,39,40,46,47,34,35,108,32,33,36,37,38,41,42,43,44,45,25,26,134])),meta:{requiresAuth:!0}},{path:"monitoring/statistics",name:"Statistics",component:()=>Ue(()=>import("./StatisticsView-CABa0tgU.js"),__vite__mapDeps([135,86,19,2,9,10,20,55,8,87,27,28,88,34,21,4,22,35,23,24,46,47,11,7,25,26,89,3,136])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"monitoring/audit_trail",name:"AuditTrail",component:()=>Ue(()=>import("./AuditTrailView-Dn1B2S23.js"),__vite__mapDeps([137,138,105,108,32,19,2,9,10,20,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,46,47,25,26,139])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"monitoring/messages",name:"MessageLog",component:()=>Ue(()=>import("./MessagesView-Dyg8Y4bi.js"),__vite__mapDeps([140,138,105,46,2,19,9,10,20,47,34,21,4,22,35,108,32,33,23,24,36,37,38,39,40,41,42,43,44,45,25,26,141])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.SUPER_ADMIN]}},{path:"information",name:"Information",component:()=>Ue(()=>import("./InformationView-DlwtlpvG.js"),__vite__mapDeps([142,17,46,2,19,9,10,20,47,25,26,71,72,74,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,16,143])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}}]},{path:"/account",component:()=>Ue(()=>import("./AccountLayout-DMwguvdC.js"),__vite__mapDeps([144,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29,14])),meta:{requiresAuth:!0},children:[{path:"filters/:filterset?",name:"AccountFilters",component:()=>Ue(()=>import("./FiltersView-Dq_lXOZQ.js"),__vite__mapDeps([145,52,2,34,19,9,10,20,21,4,22,35,25,26,53,37,38,54,55,8,106,107,33,23,24,36,39,40,41,68,69,75,46,47,32,42,43,44,45,58,59,66,67,112,113])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"parameters/:app",name:"AccountParametersEdit",component:()=>Ue(()=>import("./ParametersView-CyAAGtfU.js"),__vite__mapDeps([146,126,127,19,2,9,10,20,21,4,22,128,90,60,61,39,40,23,24,91,11,8,25,26,53,34,35,37,38,54,33,36,41,112,113,129,81,87,27,28,88,130,131,14,46,47,147])),meta:{requiresAuth:!0}},{path:":tab?",name:"AccountSettings",component:()=>Ue(()=>import("./SettingsView-TStQqZWd.js"),__vite__mapDeps([148,70,52,2,34,19,9,10,20,21,4,22,35,7,8,53,37,38,54,71,72,82,83,66,33,23,24,36,39,40,41,44,67,25,26,42,43,55,58,59,112,113,68,69,57,46,47,74,32,45,90,60,61,91,149])),meta:{requiresAuth:!0}}]},{path:"/user",meta:{requiresAuth:!0},children:[{path:"",name:"UserDashboard",component:()=>Ue(()=>import("./DashboardView-CubvMqxt.js"),__vite__mapDeps([31,17,25,2,19,9,10,20,26,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,14,46,47,7,8,48])),meta:{requiresAuth:!0}},{path:"contacts",component:()=>Ue(()=>import("./UserLayout-C6_Zjp6P.js"),__vite__mapDeps([150,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:":category?",name:"ContactList",component:()=>Ue(()=>import("./AddressBook-CJM-ajGg.js"),__vite__mapDeps([151,152,14,25,2,19,9,10,20,26,71,72,55,8,52,34,21,4,22,35,7,33,23,24,36,37,38,39,40,41,112,113,68,69,75,32,42,43,44,45,46,47,58,59,18])),meta:{requiresAuth:!0}}]},{path:"calendars",component:()=>Ue(()=>import("./UserLayout-C6_Zjp6P.js"),__vite__mapDeps([150,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:"",name:"CalendarView",component:()=>Ue(()=>import("./CalendarView-CV-DAWtd.js"),__vite__mapDeps([153,25,2,19,9,10,20,26,52,34,21,4,22,35,33,23,24,36,37,38,39,40,41,68,69,55,8,42,43,7,129,81,87,27,28,88,130,71,72,57,46,47,58,59,112,113,77,78,18])),meta:{requiresAuth:!0,requiresMailbox:!0}}]},{path:"webmail",component:()=>Ue(()=>import("./WebmailLayout-E3DJFEW2.js"),__vite__mapDeps([154,57,46,2,19,9,10,20,47,25,26,55,8,58,23,21,4,22,24,59,15,11,1,3,5,16,17,18,7,27,28,29,155,52,34,35,156])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:"",name:"MailboxView",component:()=>Ue(()=>import("./MailboxView-esEw0ueS.js"),__vite__mapDeps([157,155,46,2,19,9,10,20,47,68,36,37,34,21,4,22,35,38,69,23,24,55,8,25,26,71,72,158])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"view",name:"EmailView",component:()=>Ue(()=>import("./EmailView-B8eqs4jh.js"),__vite__mapDeps([159,155,152,21,19,2,9,10,20,4,22,25,26,46,47,23,24,55,8,58,59,160])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"compose",name:"ComposeEmailView",component:()=>Ue(()=>import("./ComposeEmailView-B6Tbw3MS.js"),__vite__mapDeps([161,162,105,155,52,2,34,19,9,10,20,21,4,22,35,25,26,77,39,40,78,42,43,55,8,127,128,112,113,152,46,47,7,33,23,24,36,37,38,41,44,58,59,163])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"reply",name:"ReplyEmailView",component:()=>Ue(()=>import("./ReplyEmailView-DcUkD2HR.js"),__vite__mapDeps([164,162,105,155,52,2,34,19,9,10,20,21,4,22,35,25,26,77,39,40,78,42,43,55,8,127,128,112,113,152,46,47,7,33,23,24,36,37,38,41,44,58,59,163])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"forward",name:"ForwardEmailView",component:()=>Ue(()=>import("./ForwardEmailView-Lpw9sqB4.js"),__vite__mapDeps([165,162,105,155,52,2,34,19,9,10,20,21,4,22,35,25,26,77,39,40,78,42,43,55,8,127,128,112,113,152,46,47,7,33,23,24,36,37,38,41,44,58,59,163])),meta:{requiresAuth:!0,requiresMailbox:!0}}]}]},{path:"/:pathMatch(.*)*",name:"NotFound",redirect:{name:"Dashboard",params:{}}}],ms=Hw({history:pw("/"),routes:XA});ms.beforeEach(async(e,t,a)=>{const o=Ym();if(document.title=o.HTML_PAGE_TITLE?o.HTML_PAGE_TITLE:"Welcome to Modoboa",e.meta.requiresAuth!==void 0){const u=window.location.href;sessionStorage.setItem("previousPage",u);const f=so();if(f.authUser||await f.initialize(),await f.validateAccess()){if(e.meta.allowedRoles!==void 0&&e.meta.allowedRoles.indexOf(f.authUser.role)===-1){a({name:"AccountSettings"});return}if(e.meta.requiresMailbox&&!f.authUser.mailbox){a({name:"Dashboard"});return}}else{a({name:"Login"});return}}a()});class qs extends Error{}class UA extends qs{constructor(t){super(`Invalid DateTime: ${t.toMessage()}`)}}class jA extends qs{constructor(t){super(`Invalid Interval: ${t.toMessage()}`)}}class GA extends qs{constructor(t){super(`Invalid Duration: ${t.toMessage()}`)}}class ua extends qs{}class Bp extends qs{constructor(t){super(`Invalid unit ${t}`)}}class zt extends qs{}class rs extends qs{constructor(){super("Zone is an abstract class")}}const we="numeric",Ci="short",ci="long",Cn={year:we,month:we,day:we},Hp={year:we,month:Ci,day:we},qA={year:we,month:Ci,day:we,weekday:Ci},Wp={year:we,month:ci,day:we},Yp={year:we,month:ci,day:we,weekday:ci},Vp={hour:we,minute:we},Xp={hour:we,minute:we,second:we},Up={hour:we,minute:we,second:we,timeZoneName:Ci},jp={hour:we,minute:we,second:we,timeZoneName:ci},Gp={hour:we,minute:we,hourCycle:"h23"},qp={hour:we,minute:we,second:we,hourCycle:"h23"},$p={hour:we,minute:we,second:we,hourCycle:"h23",timeZoneName:Ci},Kp={hour:we,minute:we,second:we,hourCycle:"h23",timeZoneName:ci},Zp={year:we,month:we,day:we,hour:we,minute:we},Jp={year:we,month:we,day:we,hour:we,minute:we,second:we},Qp={year:we,month:Ci,day:we,hour:we,minute:we},em={year:we,month:Ci,day:we,hour:we,minute:we,second:we},$A={year:we,month:Ci,day:we,weekday:Ci,hour:we,minute:we},tm={year:we,month:ci,day:we,hour:we,minute:we,timeZoneName:Ci},im={year:we,month:ci,day:we,hour:we,minute:we,second:we,timeZoneName:Ci},sm={year:we,month:ci,day:we,weekday:ci,hour:we,minute:we,timeZoneName:ci},am={year:we,month:ci,day:we,weekday:ci,hour:we,minute:we,second:we,timeZoneName:ci};class Ar{get type(){throw new rs}get name(){throw new rs}get ianaName(){return this.name}get isUniversal(){throw new rs}offsetName(t,a){throw new rs}formatOffset(t,a){throw new rs}offset(t){throw new rs}equals(t){throw new rs}get isValid(){throw new rs}}let Ho=null;class ao extends Ar{static get instance(){return Ho===null&&(Ho=new ao),Ho}get type(){return"system"}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(t,{format:a,locale:o}){return pm(t,a,o)}formatOffset(t,a){return er(this.offset(t),a)}offset(t){return-new Date(t).getTimezoneOffset()}equals(t){return t.type==="system"}get isValid(){return!0}}const Hl=new Map;function KA(e){let t=Hl.get(e);return t===void 0&&(t=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),Hl.set(e,t)),t}const ZA={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function JA(e,t){const a=e.format(t).replace(/\u200E/g,""),o=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(a),[,u,f,g,y,k,A,M]=o;return[g,u,f,y,k,A,M]}function QA(e,t){const a=e.formatToParts(t),o=[];for(let u=0;u<a.length;u++){const{type:f,value:g}=a[u],y=ZA[f];f==="era"?o[y]=g:Ye(y)||(o[y]=parseInt(g,10))}return o}const Wo=new Map;class Qi extends Ar{static create(t){let a=Wo.get(t);return a===void 0&&Wo.set(t,a=new Qi(t)),a}static resetCache(){Wo.clear(),Hl.clear()}static isValidSpecifier(t){return this.isValidZone(t)}static isValidZone(t){if(!t)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:t}).format(),!0}catch{return!1}}constructor(t){super(),this.zoneName=t,this.valid=Qi.isValidZone(t)}get type(){return"iana"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(t,{format:a,locale:o}){return pm(t,a,o,this.name)}formatOffset(t,a){return er(this.offset(t),a)}offset(t){if(!this.valid)return NaN;const a=new Date(t);if(isNaN(a))return NaN;const o=KA(this.name);let[u,f,g,y,k,A,M]=o.formatToParts?QA(o,a):JA(o,a);y==="BC"&&(u=-Math.abs(u)+1);const N=no({year:u,month:f,day:g,hour:k===24?0:k,minute:A,second:M,millisecond:0});let H=+a;const z=H%1e3;return H-=z>=0?z:1e3+z,(N-H)/(60*1e3)}equals(t){return t.type==="iana"&&t.name===this.name}get isValid(){return this.valid}}let eh={};function eC(e,t={}){const a=JSON.stringify([e,t]);let o=eh[a];return o||(o=new Intl.ListFormat(e,t),eh[a]=o),o}const Wl=new Map;function Yl(e,t={}){const a=JSON.stringify([e,t]);let o=Wl.get(a);return o===void 0&&(o=new Intl.DateTimeFormat(e,t),Wl.set(a,o)),o}const Vl=new Map;function tC(e,t={}){const a=JSON.stringify([e,t]);let o=Vl.get(a);return o===void 0&&(o=new Intl.NumberFormat(e,t),Vl.set(a,o)),o}const Xl=new Map;function iC(e,t={}){const{base:a,...o}=t,u=JSON.stringify([e,o]);let f=Xl.get(u);return f===void 0&&(f=new Intl.RelativeTimeFormat(e,t),Xl.set(u,f)),f}let Ya=null;function sC(){return Ya||(Ya=new Intl.DateTimeFormat().resolvedOptions().locale,Ya)}const Ul=new Map;function rm(e){let t=Ul.get(e);return t===void 0&&(t=new Intl.DateTimeFormat(e).resolvedOptions(),Ul.set(e,t)),t}const jl=new Map;function aC(e){let t=jl.get(e);if(!t){const a=new Intl.Locale(e);t="getWeekInfo"in a?a.getWeekInfo():a.weekInfo,"minimalDays"in t||(t={...nm,...t}),jl.set(e,t)}return t}function rC(e){const t=e.indexOf("-x-");t!==-1&&(e=e.substring(0,t));const a=e.indexOf("-u-");if(a===-1)return[e];{let o,u;try{o=Yl(e).resolvedOptions(),u=e}catch{const k=e.substring(0,a);o=Yl(k).resolvedOptions(),u=k}const{numberingSystem:f,calendar:g}=o;return[u,f,g]}}function nC(e,t,a){return(a||t)&&(e.includes("-u-")||(e+="-u"),a&&(e+=`-ca-${a}`),t&&(e+=`-nu-${t}`)),e}function oC(e){const t=[];for(let a=1;a<=12;a++){const o=Be.utc(2009,a,1);t.push(e(o))}return t}function lC(e){const t=[];for(let a=1;a<=7;a++){const o=Be.utc(2016,11,13+a);t.push(e(o))}return t}function Wr(e,t,a,o){const u=e.listingMode();return u==="error"?null:u==="en"?a(t):o(t)}function cC(e){return e.numberingSystem&&e.numberingSystem!=="latn"?!1:e.numberingSystem==="latn"||!e.locale||e.locale.startsWith("en")||rm(e.locale).numberingSystem==="latn"}class uC{constructor(t,a,o){this.padTo=o.padTo||0,this.floor=o.floor||!1;const{padTo:u,floor:f,...g}=o;if(!a||Object.keys(g).length>0){const y={useGrouping:!1,...o};o.padTo>0&&(y.minimumIntegerDigits=o.padTo),this.inf=tC(t,y)}}format(t){if(this.inf){const a=this.floor?Math.floor(t):t;return this.inf.format(a)}else{const a=this.floor?Math.floor(t):Wc(t,3);return Et(a,this.padTo)}}}class dC{constructor(t,a,o){this.opts=o,this.originalZone=void 0;let u;if(this.opts.timeZone)this.dt=t;else if(t.zone.type==="fixed"){const g=-1*(t.offset/60),y=g>=0?`Etc/GMT+${g}`:`Etc/GMT${g}`;t.offset!==0&&Qi.create(y).valid?(u=y,this.dt=t):(u="UTC",this.dt=t.offset===0?t:t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone)}else t.zone.type==="system"?this.dt=t:t.zone.type==="iana"?(this.dt=t,u=t.zone.name):(u="UTC",this.dt=t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone);const f={...this.opts};f.timeZone=f.timeZone||u,this.dtf=Yl(a,f)}format(){return this.originalZone?this.formatToParts().map(({value:t})=>t).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){const t=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?t.map(a=>{if(a.type==="timeZoneName"){const o=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...a,value:o}}else return a}):t}resolvedOptions(){return this.dtf.resolvedOptions()}}class hC{constructor(t,a,o){this.opts={style:"long",...o},!a&&fm()&&(this.rtf=iC(t,o))}format(t,a){return this.rtf?this.rtf.format(t,a):LC(a,t,this.opts.numeric,this.opts.style!=="long")}formatToParts(t,a){return this.rtf?this.rtf.formatToParts(t,a):[]}}const nm={firstDay:1,minimalDays:4,weekend:[6,7]};class ot{static fromOpts(t){return ot.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,a,o,u,f=!1){const g=t||yt.defaultLocale,y=g||(f?"en-US":sC()),k=a||yt.defaultNumberingSystem,A=o||yt.defaultOutputCalendar,M=ql(u)||yt.defaultWeekSettings;return new ot(y,k,A,M,g)}static resetCache(){Ya=null,Wl.clear(),Vl.clear(),Xl.clear(),Ul.clear(),jl.clear()}static fromObject({locale:t,numberingSystem:a,outputCalendar:o,weekSettings:u}={}){return ot.create(t,a,o,u)}constructor(t,a,o,u,f){const[g,y,k]=rC(t);this.locale=g,this.numberingSystem=a||y||null,this.outputCalendar=o||k||null,this.weekSettings=u,this.intl=nC(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=f,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=cC(this)),this.fastNumbersCached}listingMode(){const t=this.isEnglish(),a=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return t&&a?"en":"intl"}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:ot.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,ql(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(t={}){return this.clone({...t,defaultToEN:!0})}redefaultToSystem(t={}){return this.clone({...t,defaultToEN:!1})}months(t,a=!1){return Wr(this,t,bm,()=>{const o=a?{month:t,day:"numeric"}:{month:t},u=a?"format":"standalone";return this.monthsCache[u][t]||(this.monthsCache[u][t]=oC(f=>this.extract(f,o,"month"))),this.monthsCache[u][t]})}weekdays(t,a=!1){return Wr(this,t,wm,()=>{const o=a?{weekday:t,year:"numeric",month:"long",day:"numeric"}:{weekday:t},u=a?"format":"standalone";return this.weekdaysCache[u][t]||(this.weekdaysCache[u][t]=lC(f=>this.extract(f,o,"weekday"))),this.weekdaysCache[u][t]})}meridiems(){return Wr(this,void 0,()=>km,()=>{if(!this.meridiemCache){const t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[Be.utc(2016,11,13,9),Be.utc(2016,11,13,19)].map(a=>this.extract(a,t,"dayperiod"))}return this.meridiemCache})}eras(t){return Wr(this,t,Sm,()=>{const a={era:t};return this.eraCache[t]||(this.eraCache[t]=[Be.utc(-40,1,1),Be.utc(2017,1,1)].map(o=>this.extract(o,a,"era"))),this.eraCache[t]})}extract(t,a,o){const u=this.dtFormatter(t,a),f=u.formatToParts(),g=f.find(y=>y.type.toLowerCase()===o);return g?g.value:null}numberFormatter(t={}){return new uC(this.intl,t.forceSimple||this.fastNumbers,t)}dtFormatter(t,a={}){return new dC(t,this.intl,a)}relFormatter(t={}){return new hC(this.intl,this.isEnglish(),t)}listFormatter(t={}){return eC(this.intl,t)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||rm(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:gm()?aC(this.locale):nm}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(t){return this.locale===t.locale&&this.numberingSystem===t.numberingSystem&&this.outputCalendar===t.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}}let Yo=null;class $t extends Ar{static get utcInstance(){return Yo===null&&(Yo=new $t(0)),Yo}static instance(t){return t===0?$t.utcInstance:new $t(t)}static parseSpecifier(t){if(t){const a=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(a)return new $t(oo(a[1],a[2]))}return null}constructor(t){super(),this.fixed=t}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${er(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${er(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(t,a){return er(this.fixed,a)}get isUniversal(){return!0}offset(){return this.fixed}equals(t){return t.type==="fixed"&&t.fixed===this.fixed}get isValid(){return!0}}class fC extends Ar{constructor(t){super(),this.zoneName=t}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}}function ps(e,t){if(Ye(e)||e===null)return t;if(e instanceof Ar)return e;if(xC(e)){const a=e.toLowerCase();return a==="default"?t:a==="local"||a==="system"?ao.instance:a==="utc"||a==="gmt"?$t.utcInstance:$t.parseSpecifier(a)||Qi.create(e)}else return bs(e)?$t.instance(e):typeof e=="object"&&"offset"in e&&typeof e.offset=="function"?e:new fC(e)}const Fc={arab:"[٠-٩]",arabext:"[۰-۹]",bali:"[᭐-᭙]",beng:"[০-৯]",deva:"[०-९]",fullwide:"[0-9]",gujr:"[૦-૯]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[០-៩]",knda:"[೦-೯]",laoo:"[໐-໙]",limb:"[᥆-᥏]",mlym:"[൦-൯]",mong:"[᠐-᠙]",mymr:"[၀-၉]",orya:"[୦-୯]",tamldec:"[௦-௯]",telu:"[౦-౯]",thai:"[๐-๙]",tibt:"[༠-༩]",latn:"\\d"},th={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},gC=Fc.hanidec.replace(/[\[|\]]/g,"").split("");function pC(e){let t=parseInt(e,10);if(isNaN(t)){t="";for(let a=0;a<e.length;a++){const o=e.charCodeAt(a);if(e[a].search(Fc.hanidec)!==-1)t+=gC.indexOf(e[a]);else for(const u in th){const[f,g]=th[u];o>=f&&o<=g&&(t+=o-f)}}return parseInt(t,10)}else return t}const Gl=new Map;function mC(){Gl.clear()}function bi({numberingSystem:e},t=""){const a=e||"latn";let o=Gl.get(a);o===void 0&&(o=new Map,Gl.set(a,o));let u=o.get(t);return u===void 0&&(u=new RegExp(`${Fc[a]}${t}`),o.set(t,u)),u}let ih=()=>Date.now(),sh="system",ah=null,rh=null,nh=null,oh=60,lh,ch=null;class yt{static get now(){return ih}static set now(t){ih=t}static set defaultZone(t){sh=t}static get defaultZone(){return ps(sh,ao.instance)}static get defaultLocale(){return ah}static set defaultLocale(t){ah=t}static get defaultNumberingSystem(){return rh}static set defaultNumberingSystem(t){rh=t}static get defaultOutputCalendar(){return nh}static set defaultOutputCalendar(t){nh=t}static get defaultWeekSettings(){return ch}static set defaultWeekSettings(t){ch=ql(t)}static get twoDigitCutoffYear(){return oh}static set twoDigitCutoffYear(t){oh=t%100}static get throwOnInvalid(){return lh}static set throwOnInvalid(t){lh=t}static resetCaches(){ot.resetCache(),Qi.resetCache(),Be.resetCache(),mC()}}class wi{constructor(t,a){this.reason=t,this.explanation=a}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}}const om=[0,31,59,90,120,151,181,212,243,273,304,334],lm=[0,31,60,91,121,152,182,213,244,274,305,335];function pi(e,t){return new wi("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function zc(e,t,a){const o=new Date(Date.UTC(e,t-1,a));e<100&&e>=0&&o.setUTCFullYear(o.getUTCFullYear()-1900);const u=o.getUTCDay();return u===0?7:u}function cm(e,t,a){return a+(Cr(e)?lm:om)[t-1]}function um(e,t){const a=Cr(e)?lm:om,o=a.findIndex(f=>f<t),u=t-a[o];return{month:o+1,day:u}}function Bc(e,t){return(e-t+7)%7+1}function En(e,t=4,a=1){const{year:o,month:u,day:f}=e,g=cm(o,u,f),y=Bc(zc(o,u,f),a);let k=Math.floor((g-y+14-t)/7),A;return k<1?(A=o-1,k=fr(A,t,a)):k>fr(o,t,a)?(A=o+1,k=1):A=o,{weekYear:A,weekNumber:k,weekday:y,...lo(e)}}function uh(e,t=4,a=1){const{weekYear:o,weekNumber:u,weekday:f}=e,g=Bc(zc(o,1,t),a),y=ma(o);let k=u*7+f-g-7+t,A;k<1?(A=o-1,k+=ma(A)):k>y?(A=o+1,k-=ma(o)):A=o;const{month:M,day:P}=um(A,k);return{year:A,month:M,day:P,...lo(e)}}function Vo(e){const{year:t,month:a,day:o}=e,u=cm(t,a,o);return{year:t,ordinal:u,...lo(e)}}function dh(e){const{year:t,ordinal:a}=e,{month:o,day:u}=um(t,a);return{year:t,month:o,day:u,...lo(e)}}function hh(e,t){if(!Ye(e.localWeekday)||!Ye(e.localWeekNumber)||!Ye(e.localWeekYear)){if(!Ye(e.weekday)||!Ye(e.weekNumber)||!Ye(e.weekYear))throw new ua("Cannot mix locale-based week fields with ISO-based week fields");return Ye(e.localWeekday)||(e.weekday=e.localWeekday),Ye(e.localWeekNumber)||(e.weekNumber=e.localWeekNumber),Ye(e.localWeekYear)||(e.weekYear=e.localWeekYear),delete e.localWeekday,delete e.localWeekNumber,delete e.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function vC(e,t=4,a=1){const o=ro(e.weekYear),u=mi(e.weekNumber,1,fr(e.weekYear,t,a)),f=mi(e.weekday,1,7);return o?u?f?!1:pi("weekday",e.weekday):pi("week",e.weekNumber):pi("weekYear",e.weekYear)}function bC(e){const t=ro(e.year),a=mi(e.ordinal,1,ma(e.year));return t?a?!1:pi("ordinal",e.ordinal):pi("year",e.year)}function dm(e){const t=ro(e.year),a=mi(e.month,1,12),o=mi(e.day,1,Mn(e.year,e.month));return t?a?o?!1:pi("day",e.day):pi("month",e.month):pi("year",e.year)}function hm(e){const{hour:t,minute:a,second:o,millisecond:u}=e,f=mi(t,0,23)||t===24&&a===0&&o===0&&u===0,g=mi(a,0,59),y=mi(o,0,59),k=mi(u,0,999);return f?g?y?k?!1:pi("millisecond",u):pi("second",o):pi("minute",a):pi("hour",t)}function Ye(e){return typeof e>"u"}function bs(e){return typeof e=="number"}function ro(e){return typeof e=="number"&&e%1===0}function xC(e){return typeof e=="string"}function yC(e){return Object.prototype.toString.call(e)==="[object Date]"}function fm(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function gm(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function wC(e){return Array.isArray(e)?e:[e]}function fh(e,t,a){if(e.length!==0)return e.reduce((o,u)=>{const f=[t(u),u];return o&&a(o[0],f[0])===o[0]?o:f},null)[1]}function kC(e,t){return t.reduce((a,o)=>(a[o]=e[o],a),{})}function Aa(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ql(e){if(e==null)return null;if(typeof e!="object")throw new zt("Week settings must be an object");if(!mi(e.firstDay,1,7)||!mi(e.minimalDays,1,7)||!Array.isArray(e.weekend)||e.weekend.some(t=>!mi(t,1,7)))throw new zt("Invalid week settings");return{firstDay:e.firstDay,minimalDays:e.minimalDays,weekend:Array.from(e.weekend)}}function mi(e,t,a){return ro(e)&&e>=t&&e<=a}function SC(e,t){return e-t*Math.floor(e/t)}function Et(e,t=2){const a=e<0;let o;return a?o="-"+(""+-e).padStart(t,"0"):o=(""+e).padStart(t,"0"),o}function gs(e){if(!(Ye(e)||e===null||e===""))return parseInt(e,10)}function Is(e){if(!(Ye(e)||e===null||e===""))return parseFloat(e)}function Hc(e){if(!(Ye(e)||e===null||e==="")){const t=parseFloat("0."+e)*1e3;return Math.floor(t)}}function Wc(e,t,a=!1){const o=10**t;return(a?Math.trunc:Math.round)(e*o)/o}function Cr(e){return e%4===0&&(e%100!==0||e%400===0)}function ma(e){return Cr(e)?366:365}function Mn(e,t){const a=SC(t-1,12)+1,o=e+(t-a)/12;return a===2?Cr(o)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][a-1]}function no(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t),t.setUTCFullYear(e.year,e.month-1,e.day)),+t}function gh(e,t,a){return-Bc(zc(e,1,t),a)+t-1}function fr(e,t=4,a=1){const o=gh(e,t,a),u=gh(e+1,t,a);return(ma(e)-o+u)/7}function $l(e){return e>99?e:e>yt.twoDigitCutoffYear?1900+e:2e3+e}function pm(e,t,a,o=null){const u=new Date(e),f={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};o&&(f.timeZone=o);const g={timeZoneName:t,...f},y=new Intl.DateTimeFormat(a,g).formatToParts(u).find(k=>k.type.toLowerCase()==="timezonename");return y?y.value:null}function oo(e,t){let a=parseInt(e,10);Number.isNaN(a)&&(a=0);const o=parseInt(t,10)||0,u=a<0||Object.is(a,-0)?-o:o;return a*60+u}function mm(e){const t=Number(e);if(typeof e=="boolean"||e===""||Number.isNaN(t))throw new zt(`Invalid unit value ${e}`);return t}function Tn(e,t){const a={};for(const o in e)if(Aa(e,o)){const u=e[o];if(u==null)continue;a[t(o)]=mm(u)}return a}function er(e,t){const a=Math.trunc(Math.abs(e/60)),o=Math.trunc(Math.abs(e%60)),u=e>=0?"+":"-";switch(t){case"short":return`${u}${Et(a,2)}:${Et(o,2)}`;case"narrow":return`${u}${a}${o>0?`:${o}`:""}`;case"techie":return`${u}${Et(a,2)}${Et(o,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function lo(e){return kC(e,["hour","minute","second","millisecond"])}const AC=["January","February","March","April","May","June","July","August","September","October","November","December"],vm=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CC=["J","F","M","A","M","J","J","A","S","O","N","D"];function bm(e){switch(e){case"narrow":return[...CC];case"short":return[...vm];case"long":return[...AC];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}const xm=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],ym=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],EC=["M","T","W","T","F","S","S"];function wm(e){switch(e){case"narrow":return[...EC];case"short":return[...ym];case"long":return[...xm];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const km=["AM","PM"],MC=["Before Christ","Anno Domini"],TC=["BC","AD"],PC=["B","A"];function Sm(e){switch(e){case"narrow":return[...PC];case"short":return[...TC];case"long":return[...MC];default:return null}}function IC(e){return km[e.hour<12?0:1]}function _C(e,t){return wm(t)[e.weekday-1]}function DC(e,t){return bm(t)[e.month-1]}function RC(e,t){return Sm(t)[e.year<0?0:1]}function LC(e,t,a="always",o=!1){const u={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},f=["hours","minutes","seconds"].indexOf(e)===-1;if(a==="auto"&&f){const P=e==="days";switch(t){case 1:return P?"tomorrow":`next ${u[e][0]}`;case-1:return P?"yesterday":`last ${u[e][0]}`;case 0:return P?"today":`this ${u[e][0]}`}}const g=Object.is(t,-0)||t<0,y=Math.abs(t),k=y===1,A=u[e],M=o?k?A[1]:A[2]||A[1]:k?u[e][0]:e;return g?`${y} ${M} ago`:`in ${y} ${M}`}function ph(e,t){let a="";for(const o of e)o.literal?a+=o.val:a+=t(o.val);return a}const OC={D:Cn,DD:Hp,DDD:Wp,DDDD:Yp,t:Vp,tt:Xp,ttt:Up,tttt:jp,T:Gp,TT:qp,TTT:$p,TTTT:Kp,f:Zp,ff:Qp,fff:tm,ffff:sm,F:Jp,FF:em,FFF:im,FFFF:am};class Yt{static create(t,a={}){return new Yt(t,a)}static parseFormat(t){let a=null,o="",u=!1;const f=[];for(let g=0;g<t.length;g++){const y=t.charAt(g);y==="'"?(o.length>0&&f.push({literal:u||/^\s+$/.test(o),val:o}),a=null,o="",u=!u):u||y===a?o+=y:(o.length>0&&f.push({literal:/^\s+$/.test(o),val:o}),o=y,a=y)}return o.length>0&&f.push({literal:u||/^\s+$/.test(o),val:o}),f}static macroTokenToFormatOpts(t){return OC[t]}constructor(t,a){this.opts=a,this.loc=t,this.systemLoc=null}formatWithSystemDefault(t,a){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(t,{...this.opts,...a}).format()}dtFormatter(t,a={}){return this.loc.dtFormatter(t,{...this.opts,...a})}formatDateTime(t,a){return this.dtFormatter(t,a).format()}formatDateTimeParts(t,a){return this.dtFormatter(t,a).formatToParts()}formatInterval(t,a){return this.dtFormatter(t.start,a).dtf.formatRange(t.start.toJSDate(),t.end.toJSDate())}resolvedOptions(t,a){return this.dtFormatter(t,a).resolvedOptions()}num(t,a=0){if(this.opts.forceSimple)return Et(t,a);const o={...this.opts};return a>0&&(o.padTo=a),this.loc.numberFormatter(o).format(t)}formatDateTimeFromString(t,a){const o=this.loc.listingMode()==="en",u=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",f=(H,z)=>this.loc.extract(t,H,z),g=H=>t.isOffsetFixed&&t.offset===0&&H.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,H.format):"",y=()=>o?IC(t):f({hour:"numeric",hourCycle:"h12"},"dayperiod"),k=(H,z)=>o?DC(t,H):f(z?{month:H}:{month:H,day:"numeric"},"month"),A=(H,z)=>o?_C(t,H):f(z?{weekday:H}:{weekday:H,month:"long",day:"numeric"},"weekday"),M=H=>{const z=Yt.macroTokenToFormatOpts(H);return z?this.formatWithSystemDefault(t,z):H},P=H=>o?RC(t,H):f({era:H},"era"),N=H=>{switch(H){case"S":return this.num(t.millisecond);case"u":case"SSS":return this.num(t.millisecond,3);case"s":return this.num(t.second);case"ss":return this.num(t.second,2);case"uu":return this.num(Math.floor(t.millisecond/10),2);case"uuu":return this.num(Math.floor(t.millisecond/100));case"m":return this.num(t.minute);case"mm":return this.num(t.minute,2);case"h":return this.num(t.hour%12===0?12:t.hour%12);case"hh":return this.num(t.hour%12===0?12:t.hour%12,2);case"H":return this.num(t.hour);case"HH":return this.num(t.hour,2);case"Z":return g({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return g({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return g({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:this.loc.locale});case"z":return t.zoneName;case"a":return y();case"d":return u?f({day:"numeric"},"day"):this.num(t.day);case"dd":return u?f({day:"2-digit"},"day"):this.num(t.day,2);case"c":return this.num(t.weekday);case"ccc":return A("short",!0);case"cccc":return A("long",!0);case"ccccc":return A("narrow",!0);case"E":return this.num(t.weekday);case"EEE":return A("short",!1);case"EEEE":return A("long",!1);case"EEEEE":return A("narrow",!1);case"L":return u?f({month:"numeric",day:"numeric"},"month"):this.num(t.month);case"LL":return u?f({month:"2-digit",day:"numeric"},"month"):this.num(t.month,2);case"LLL":return k("short",!0);case"LLLL":return k("long",!0);case"LLLLL":return k("narrow",!0);case"M":return u?f({month:"numeric"},"month"):this.num(t.month);case"MM":return u?f({month:"2-digit"},"month"):this.num(t.month,2);case"MMM":return k("short",!1);case"MMMM":return k("long",!1);case"MMMMM":return k("narrow",!1);case"y":return u?f({year:"numeric"},"year"):this.num(t.year);case"yy":return u?f({year:"2-digit"},"year"):this.num(t.year.toString().slice(-2),2);case"yyyy":return u?f({year:"numeric"},"year"):this.num(t.year,4);case"yyyyyy":return u?f({year:"numeric"},"year"):this.num(t.year,6);case"G":return P("short");case"GG":return P("long");case"GGGGG":return P("narrow");case"kk":return this.num(t.weekYear.toString().slice(-2),2);case"kkkk":return this.num(t.weekYear,4);case"W":return this.num(t.weekNumber);case"WW":return this.num(t.weekNumber,2);case"n":return this.num(t.localWeekNumber);case"nn":return this.num(t.localWeekNumber,2);case"ii":return this.num(t.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(t.localWeekYear,4);case"o":return this.num(t.ordinal);case"ooo":return this.num(t.ordinal,3);case"q":return this.num(t.quarter);case"qq":return this.num(t.quarter,2);case"X":return this.num(Math.floor(t.ts/1e3));case"x":return this.num(t.ts);default:return M(H)}};return ph(Yt.parseFormat(a),N)}formatDurationFromString(t,a){const o=k=>{switch(k[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},u=k=>A=>{const M=o(A);return M?this.num(k.get(M),A.length):A},f=Yt.parseFormat(a),g=f.reduce((k,{literal:A,val:M})=>A?k:k.concat(M),[]),y=t.shiftTo(...g.map(o).filter(k=>k));return ph(f,u(y))}}const Am=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function Ta(...e){const t=e.reduce((a,o)=>a+o.source,"");return RegExp(`^${t}$`)}function Pa(...e){return t=>e.reduce(([a,o,u],f)=>{const[g,y,k]=f(t,u);return[{...a,...g},y||o,k]},[{},null,1]).slice(0,2)}function Ia(e,...t){if(e==null)return[null,null];for(const[a,o]of t){const u=a.exec(e);if(u)return o(u)}return[null,null]}function Cm(...e){return(t,a)=>{const o={};let u;for(u=0;u<e.length;u++)o[e[u]]=gs(t[a+u]);return[o,null,a+u]}}const Em=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,NC=`(?:${Em.source}?(?:\\[(${Am.source})\\])?)?`,Yc=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,Mm=RegExp(`${Yc.source}${NC}`),Vc=RegExp(`(?:T${Mm.source})?`),FC=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,zC=/(\d{4})-?W(\d\d)(?:-?(\d))?/,BC=/(\d{4})-?(\d{3})/,HC=Cm("weekYear","weekNumber","weekDay"),WC=Cm("year","ordinal"),YC=/(\d{4})-(\d\d)-(\d\d)/,Tm=RegExp(`${Yc.source} ?(?:${Em.source}|(${Am.source}))?`),VC=RegExp(`(?: ${Tm.source})?`);function va(e,t,a){const o=e[t];return Ye(o)?a:gs(o)}function XC(e,t){return[{year:va(e,t),month:va(e,t+1,1),day:va(e,t+2,1)},null,t+3]}function _a(e,t){return[{hours:va(e,t,0),minutes:va(e,t+1,0),seconds:va(e,t+2,0),milliseconds:Hc(e[t+3])},null,t+4]}function Er(e,t){const a=!e[t]&&!e[t+1],o=oo(e[t+1],e[t+2]),u=a?null:$t.instance(o);return[{},u,t+3]}function Mr(e,t){const a=e[t]?Qi.create(e[t]):null;return[{},a,t+1]}const UC=RegExp(`^T?${Yc.source}$`),jC=/^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/;function GC(e){const[t,a,o,u,f,g,y,k,A]=e,M=t[0]==="-",P=k&&k[0]==="-",N=(H,z=!1)=>H!==void 0&&(z||H&&M)?-H:H;return[{years:N(Is(a)),months:N(Is(o)),weeks:N(Is(u)),days:N(Is(f)),hours:N(Is(g)),minutes:N(Is(y)),seconds:N(Is(k),k==="-0"),milliseconds:N(Hc(A),P)}]}const qC={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Xc(e,t,a,o,u,f,g){const y={year:t.length===2?$l(gs(t)):gs(t),month:vm.indexOf(a)+1,day:gs(o),hour:gs(u),minute:gs(f)};return g&&(y.second=gs(g)),e&&(y.weekday=e.length>3?xm.indexOf(e)+1:ym.indexOf(e)+1),y}const $C=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function KC(e){const[,t,a,o,u,f,g,y,k,A,M,P]=e,N=Xc(t,u,o,a,f,g,y);let H;return k?H=qC[k]:A?H=0:H=oo(M,P),[N,new $t(H)]}function ZC(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}const JC=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,QC=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,e1=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function mh(e){const[,t,a,o,u,f,g,y]=e;return[Xc(t,u,o,a,f,g,y),$t.utcInstance]}function t1(e){const[,t,a,o,u,f,g,y]=e;return[Xc(t,y,a,o,u,f,g),$t.utcInstance]}const i1=Ta(FC,Vc),s1=Ta(zC,Vc),a1=Ta(BC,Vc),r1=Ta(Mm),Pm=Pa(XC,_a,Er,Mr),n1=Pa(HC,_a,Er,Mr),o1=Pa(WC,_a,Er,Mr),l1=Pa(_a,Er,Mr);function c1(e){return Ia(e,[i1,Pm],[s1,n1],[a1,o1],[r1,l1])}function u1(e){return Ia(ZC(e),[$C,KC])}function d1(e){return Ia(e,[JC,mh],[QC,mh],[e1,t1])}function h1(e){return Ia(e,[jC,GC])}const f1=Pa(_a);function g1(e){return Ia(e,[UC,f1])}const p1=Ta(YC,VC),m1=Ta(Tm),v1=Pa(_a,Er,Mr);function b1(e){return Ia(e,[p1,Pm],[m1,v1])}const vh="Invalid Duration",Im={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1e3},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1e3},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},x1={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1e3},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1e3},...Im},fi=146097/400,ia=146097/4800,y1={years:{quarters:4,months:12,weeks:fi/7,days:fi,hours:fi*24,minutes:fi*24*60,seconds:fi*24*60*60,milliseconds:fi*24*60*60*1e3},quarters:{months:3,weeks:fi/28,days:fi/4,hours:fi*24/4,minutes:fi*24*60/4,seconds:fi*24*60*60/4,milliseconds:fi*24*60*60*1e3/4},months:{weeks:ia/7,days:ia,hours:ia*24,minutes:ia*24*60,seconds:ia*24*60*60,milliseconds:ia*24*60*60*1e3},...Im},Ls=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],w1=Ls.slice(0).reverse();function ns(e,t,a=!1){const o={values:a?t.values:{...e.values,...t.values||{}},loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy,matrix:t.matrix||e.matrix};return new Ze(o)}function _m(e,t){let a=t.milliseconds??0;for(const o of w1.slice(1))t[o]&&(a+=t[o]*e[o].milliseconds);return a}function bh(e,t){const a=_m(e,t)<0?-1:1;Ls.reduceRight((o,u)=>{if(Ye(t[u]))return o;if(o){const f=t[o]*a,g=e[u][o],y=Math.floor(f/g);t[u]+=y*a,t[o]-=y*g*a}return u},null),Ls.reduce((o,u)=>{if(Ye(t[u]))return o;if(o){const f=t[o]%1;t[o]-=f,t[u]+=f*e[o][u]}return u},null)}function k1(e){const t={};for(const[a,o]of Object.entries(e))o!==0&&(t[a]=o);return t}class Ze{constructor(t){const a=t.conversionAccuracy==="longterm"||!1;let o=a?y1:x1;t.matrix&&(o=t.matrix),this.values=t.values,this.loc=t.loc||ot.create(),this.conversionAccuracy=a?"longterm":"casual",this.invalid=t.invalid||null,this.matrix=o,this.isLuxonDuration=!0}static fromMillis(t,a){return Ze.fromObject({milliseconds:t},a)}static fromObject(t,a={}){if(t==null||typeof t!="object")throw new zt(`Duration.fromObject: argument expected to be an object, got ${t===null?"null":typeof t}`);return new Ze({values:Tn(t,Ze.normalizeUnit),loc:ot.fromObject(a),conversionAccuracy:a.conversionAccuracy,matrix:a.matrix})}static fromDurationLike(t){if(bs(t))return Ze.fromMillis(t);if(Ze.isDuration(t))return t;if(typeof t=="object")return Ze.fromObject(t);throw new zt(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,a){const[o]=h1(t);return o?Ze.fromObject(o,a):Ze.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,a){const[o]=g1(t);return o?Ze.fromObject(o,a):Ze.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the Duration is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new GA(o);return new Ze({invalid:o})}static normalizeUnit(t){const a={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[t&&t.toLowerCase()];if(!a)throw new Bp(t);return a}static isDuration(t){return t&&t.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(t,a={}){const o={...a,floor:a.round!==!1&&a.floor!==!1};return this.isValid?Yt.create(this.loc,o).formatDurationFromString(this,t):vh}toHuman(t={}){if(!this.isValid)return vh;const a=Ls.map(o=>{const u=this.values[o];return Ye(u)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...t,unit:o.slice(0,-1)}).format(u)}).filter(o=>o);return this.loc.listFormatter({type:"conjunction",style:t.listStyle||"narrow",...t}).format(a)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let t="P";return this.years!==0&&(t+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(t+=this.months+this.quarters*3+"M"),this.weeks!==0&&(t+=this.weeks+"W"),this.days!==0&&(t+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(t+="T"),this.hours!==0&&(t+=this.hours+"H"),this.minutes!==0&&(t+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(t+=Wc(this.seconds+this.milliseconds/1e3,3)+"S"),t==="P"&&(t+="T0S"),t}toISOTime(t={}){if(!this.isValid)return null;const a=this.toMillis();return a<0||a>=864e5?null:(t={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...t,includeOffset:!1},Be.fromMillis(a,{zone:"UTC"}).toISOTime(t))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?_m(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t),o={};for(const u of Ls)(Aa(a.values,u)||Aa(this.values,u))&&(o[u]=a.get(u)+this.get(u));return ns(this,{values:o},!0)}minus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t);return this.plus(a.negate())}mapUnits(t){if(!this.isValid)return this;const a={};for(const o of Object.keys(this.values))a[o]=mm(t(this.values[o],o));return ns(this,{values:a},!0)}get(t){return this[Ze.normalizeUnit(t)]}set(t){if(!this.isValid)return this;const a={...this.values,...Tn(t,Ze.normalizeUnit)};return ns(this,{values:a})}reconfigure({locale:t,numberingSystem:a,conversionAccuracy:o,matrix:u}={}){const g={loc:this.loc.clone({locale:t,numberingSystem:a}),matrix:u,conversionAccuracy:o};return ns(this,g)}as(t){return this.isValid?this.shiftTo(t).get(t):NaN}normalize(){if(!this.isValid)return this;const t=this.toObject();return bh(this.matrix,t),ns(this,{values:t},!0)}rescale(){if(!this.isValid)return this;const t=k1(this.normalize().shiftToAll().toObject());return ns(this,{values:t},!0)}shiftTo(...t){if(!this.isValid)return this;if(t.length===0)return this;t=t.map(g=>Ze.normalizeUnit(g));const a={},o={},u=this.toObject();let f;for(const g of Ls)if(t.indexOf(g)>=0){f=g;let y=0;for(const A in o)y+=this.matrix[A][g]*o[A],o[A]=0;bs(u[g])&&(y+=u[g]);const k=Math.trunc(y);a[g]=k,o[g]=(y*1e3-k*1e3)/1e3}else bs(u[g])&&(o[g]=u[g]);for(const g in o)o[g]!==0&&(a[f]+=g===f?o[g]:o[g]/this.matrix[f][g]);return bh(this.matrix,a),ns(this,{values:a},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;const t={};for(const a of Object.keys(this.values))t[a]=this.values[a]===0?0:-this.values[a];return ns(this,{values:t},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(t){if(!this.isValid||!t.isValid||!this.loc.equals(t.loc))return!1;function a(o,u){return o===void 0||o===0?u===void 0||u===0:o===u}for(const o of Ls)if(!a(this.values[o],t.values[o]))return!1;return!0}}const sa="Invalid Interval";function S1(e,t){return!e||!e.isValid?xt.invalid("missing or invalid start"):!t||!t.isValid?xt.invalid("missing or invalid end"):t<e?xt.invalid("end before start",`The end of an interval must be after its start, but you had start=${e.toISO()} and end=${t.toISO()}`):null}class xt{constructor(t){this.s=t.start,this.e=t.end,this.invalid=t.invalid||null,this.isLuxonInterval=!0}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the Interval is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new jA(o);return new xt({invalid:o})}static fromDateTimes(t,a){const o=Ba(t),u=Ba(a),f=S1(o,u);return f??new xt({start:o,end:u})}static after(t,a){const o=Ze.fromDurationLike(a),u=Ba(t);return xt.fromDateTimes(u,u.plus(o))}static before(t,a){const o=Ze.fromDurationLike(a),u=Ba(t);return xt.fromDateTimes(u.minus(o),u)}static fromISO(t,a){const[o,u]=(t||"").split("/",2);if(o&&u){let f,g;try{f=Be.fromISO(o,a),g=f.isValid}catch{g=!1}let y,k;try{y=Be.fromISO(u,a),k=y.isValid}catch{k=!1}if(g&&k)return xt.fromDateTimes(f,y);if(g){const A=Ze.fromISO(u,a);if(A.isValid)return xt.after(f,A)}else if(k){const A=Ze.fromISO(o,a);if(A.isValid)return xt.before(y,A)}}return xt.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static isInterval(t){return t&&t.isLuxonInterval||!1}get start(){return this.isValid?this.s:null}get end(){return this.isValid?this.e:null}get lastDateTime(){return this.isValid&&this.e?this.e.minus(1):null}get isValid(){return this.invalidReason===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}length(t="milliseconds"){return this.isValid?this.toDuration(t).get(t):NaN}count(t="milliseconds",a){if(!this.isValid)return NaN;const o=this.start.startOf(t,a);let u;return a!=null&&a.useLocaleWeeks?u=this.end.reconfigure({locale:o.locale}):u=this.end,u=u.startOf(t,a),Math.floor(u.diff(o,t).get(t))+(u.valueOf()!==this.end.valueOf())}hasSame(t){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,t):!1}isEmpty(){return this.s.valueOf()===this.e.valueOf()}isAfter(t){return this.isValid?this.s>t:!1}isBefore(t){return this.isValid?this.e<=t:!1}contains(t){return this.isValid?this.s<=t&&this.e>t:!1}set({start:t,end:a}={}){return this.isValid?xt.fromDateTimes(t||this.s,a||this.e):this}splitAt(...t){if(!this.isValid)return[];const a=t.map(Ba).filter(g=>this.contains(g)).sort((g,y)=>g.toMillis()-y.toMillis()),o=[];let{s:u}=this,f=0;for(;u<this.e;){const g=a[f]||this.e,y=+g>+this.e?this.e:g;o.push(xt.fromDateTimes(u,y)),u=y,f+=1}return o}splitBy(t){const a=Ze.fromDurationLike(t);if(!this.isValid||!a.isValid||a.as("milliseconds")===0)return[];let{s:o}=this,u=1,f;const g=[];for(;o<this.e;){const y=this.start.plus(a.mapUnits(k=>k*u));f=+y>+this.e?this.e:y,g.push(xt.fromDateTimes(o,f)),o=f,u+=1}return g}divideEqually(t){return this.isValid?this.splitBy(this.length()/t).slice(0,t):[]}overlaps(t){return this.e>t.s&&this.s<t.e}abutsStart(t){return this.isValid?+this.e==+t.s:!1}abutsEnd(t){return this.isValid?+t.e==+this.s:!1}engulfs(t){return this.isValid?this.s<=t.s&&this.e>=t.e:!1}equals(t){return!this.isValid||!t.isValid?!1:this.s.equals(t.s)&&this.e.equals(t.e)}intersection(t){if(!this.isValid)return this;const a=this.s>t.s?this.s:t.s,o=this.e<t.e?this.e:t.e;return a>=o?null:xt.fromDateTimes(a,o)}union(t){if(!this.isValid)return this;const a=this.s<t.s?this.s:t.s,o=this.e>t.e?this.e:t.e;return xt.fromDateTimes(a,o)}static merge(t){const[a,o]=t.sort((u,f)=>u.s-f.s).reduce(([u,f],g)=>f?f.overlaps(g)||f.abutsStart(g)?[u,f.union(g)]:[u.concat([f]),g]:[u,g],[[],null]);return o&&a.push(o),a}static xor(t){let a=null,o=0;const u=[],f=t.map(k=>[{time:k.s,type:"s"},{time:k.e,type:"e"}]),g=Array.prototype.concat(...f),y=g.sort((k,A)=>k.time-A.time);for(const k of y)o+=k.type==="s"?1:-1,o===1?a=k.time:(a&&+a!=+k.time&&u.push(xt.fromDateTimes(a,k.time)),a=null);return xt.merge(u)}difference(...t){return xt.xor([this].concat(t)).map(a=>this.intersection(a)).filter(a=>a&&!a.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:sa}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(t=Cn,a={}){return this.isValid?Yt.create(this.s.loc.clone(a),t).formatInterval(this):sa}toISO(t){return this.isValid?`${this.s.toISO(t)}/${this.e.toISO(t)}`:sa}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:sa}toISOTime(t){return this.isValid?`${this.s.toISOTime(t)}/${this.e.toISOTime(t)}`:sa}toFormat(t,{separator:a=" – "}={}){return this.isValid?`${this.s.toFormat(t)}${a}${this.e.toFormat(t)}`:sa}toDuration(t,a){return this.isValid?this.e.diff(this.s,t,a):Ze.invalid(this.invalidReason)}mapEndpoints(t){return xt.fromDateTimes(t(this.s),t(this.e))}}class Yr{static hasDST(t=yt.defaultZone){const a=Be.now().setZone(t).set({month:12});return!t.isUniversal&&a.offset!==a.set({month:6}).offset}static isValidIANAZone(t){return Qi.isValidZone(t)}static normalizeZone(t){return ps(t,yt.defaultZone)}static getStartOfWeek({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getWeekendDays().slice()}static months(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null,outputCalendar:f="gregory"}={}){return(u||ot.create(a,o,f)).months(t)}static monthsFormat(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null,outputCalendar:f="gregory"}={}){return(u||ot.create(a,o,f)).months(t,!0)}static weekdays(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null}={}){return(u||ot.create(a,o,null)).weekdays(t)}static weekdaysFormat(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null}={}){return(u||ot.create(a,o,null)).weekdays(t,!0)}static meridiems({locale:t=null}={}){return ot.create(t).meridiems()}static eras(t="short",{locale:a=null}={}){return ot.create(a,null,"gregory").eras(t)}static features(){return{relative:fm(),localeWeek:gm()}}}function xh(e,t){const a=u=>u.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),o=a(t)-a(e);return Math.floor(Ze.fromMillis(o).as("days"))}function A1(e,t,a){const o=[["years",(k,A)=>A.year-k.year],["quarters",(k,A)=>A.quarter-k.quarter+(A.year-k.year)*4],["months",(k,A)=>A.month-k.month+(A.year-k.year)*12],["weeks",(k,A)=>{const M=xh(k,A);return(M-M%7)/7}],["days",xh]],u={},f=e;let g,y;for(const[k,A]of o)a.indexOf(k)>=0&&(g=k,u[k]=A(e,t),y=f.plus(u),y>t?(u[k]--,e=f.plus(u),e>t&&(y=e,u[k]--,e=f.plus(u))):e=y);return[e,u,y,g]}function C1(e,t,a,o){let[u,f,g,y]=A1(e,t,a);const k=t-u,A=a.filter(P=>["hours","minutes","seconds","milliseconds"].indexOf(P)>=0);A.length===0&&(g<t&&(g=u.plus({[y]:1})),g!==u&&(f[y]=(f[y]||0)+k/(g-u)));const M=Ze.fromObject(f,o);return A.length>0?Ze.fromMillis(k,o).shiftTo(...A).plus(M):M}const E1="missing Intl.DateTimeFormat.formatToParts support";function it(e,t=a=>a){return{regex:e,deser:([a])=>t(pC(a))}}const M1=" ",Dm=`[ ${M1}]`,Rm=new RegExp(Dm,"g");function T1(e){return e.replace(/\./g,"\\.?").replace(Rm,Dm)}function yh(e){return e.replace(/\./g,"").replace(Rm," ").toLowerCase()}function xi(e,t){return e===null?null:{regex:RegExp(e.map(T1).join("|")),deser:([a])=>e.findIndex(o=>yh(a)===yh(o))+t}}function wh(e,t){return{regex:e,deser:([,a,o])=>oo(a,o),groups:t}}function Vr(e){return{regex:e,deser:([t])=>t}}function P1(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function I1(e,t){const a=bi(t),o=bi(t,"{2}"),u=bi(t,"{3}"),f=bi(t,"{4}"),g=bi(t,"{6}"),y=bi(t,"{1,2}"),k=bi(t,"{1,3}"),A=bi(t,"{1,6}"),M=bi(t,"{1,9}"),P=bi(t,"{2,4}"),N=bi(t,"{4,6}"),H=Q=>({regex:RegExp(P1(Q.val)),deser:([q])=>q,literal:!0}),G=(Q=>{if(e.literal)return H(Q);switch(Q.val){case"G":return xi(t.eras("short"),0);case"GG":return xi(t.eras("long"),0);case"y":return it(A);case"yy":return it(P,$l);case"yyyy":return it(f);case"yyyyy":return it(N);case"yyyyyy":return it(g);case"M":return it(y);case"MM":return it(o);case"MMM":return xi(t.months("short",!0),1);case"MMMM":return xi(t.months("long",!0),1);case"L":return it(y);case"LL":return it(o);case"LLL":return xi(t.months("short",!1),1);case"LLLL":return xi(t.months("long",!1),1);case"d":return it(y);case"dd":return it(o);case"o":return it(k);case"ooo":return it(u);case"HH":return it(o);case"H":return it(y);case"hh":return it(o);case"h":return it(y);case"mm":return it(o);case"m":return it(y);case"q":return it(y);case"qq":return it(o);case"s":return it(y);case"ss":return it(o);case"S":return it(k);case"SSS":return it(u);case"u":return Vr(M);case"uu":return Vr(y);case"uuu":return it(a);case"a":return xi(t.meridiems(),0);case"kkkk":return it(f);case"kk":return it(P,$l);case"W":return it(y);case"WW":return it(o);case"E":case"c":return it(a);case"EEE":return xi(t.weekdays("short",!1),1);case"EEEE":return xi(t.weekdays("long",!1),1);case"ccc":return xi(t.weekdays("short",!0),1);case"cccc":return xi(t.weekdays("long",!0),1);case"Z":case"ZZ":return wh(new RegExp(`([+-]${y.source})(?::(${o.source}))?`),2);case"ZZZ":return wh(new RegExp(`([+-]${y.source})(${o.source})?`),2);case"z":return Vr(/[a-z_+-/]{1,256}?/i);case" ":return Vr(/[^\S\n\r]/);default:return H(Q)}})(e)||{invalidReason:E1};return G.token=e,G}const _1={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function D1(e,t,a){const{type:o,value:u}=e;if(o==="literal"){const k=/^\s+$/.test(u);return{literal:!k,val:k?" ":u}}const f=t[o];let g=o;o==="hour"&&(t.hour12!=null?g=t.hour12?"hour12":"hour24":t.hourCycle!=null?t.hourCycle==="h11"||t.hourCycle==="h12"?g="hour12":g="hour24":g=a.hour12?"hour12":"hour24");let y=_1[g];if(typeof y=="object"&&(y=y[f]),y)return{literal:!1,val:y}}function R1(e){return[`^${e.map(a=>a.regex).reduce((a,o)=>`${a}(${o.source})`,"")}$`,e]}function L1(e,t,a){const o=e.match(t);if(o){const u={};let f=1;for(const g in a)if(Aa(a,g)){const y=a[g],k=y.groups?y.groups+1:1;!y.literal&&y.token&&(u[y.token.val[0]]=y.deser(o.slice(f,f+k))),f+=k}return[o,u]}else return[o,{}]}function O1(e){const t=f=>{switch(f){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}};let a=null,o;return Ye(e.z)||(a=Qi.create(e.z)),Ye(e.Z)||(a||(a=new $t(e.Z)),o=e.Z),Ye(e.q)||(e.M=(e.q-1)*3+1),Ye(e.h)||(e.h<12&&e.a===1?e.h+=12:e.h===12&&e.a===0&&(e.h=0)),e.G===0&&e.y&&(e.y=-e.y),Ye(e.u)||(e.S=Hc(e.u)),[Object.keys(e).reduce((f,g)=>{const y=t(g);return y&&(f[y]=e[g]),f},{}),a,o]}let Xo=null;function N1(){return Xo||(Xo=Be.fromMillis(1555555555555)),Xo}function F1(e,t){if(e.literal)return e;const a=Yt.macroTokenToFormatOpts(e.val),o=Fm(a,t);return o==null||o.includes(void 0)?e:o}function Lm(e,t){return Array.prototype.concat(...e.map(a=>F1(a,t)))}class Om{constructor(t,a){if(this.locale=t,this.format=a,this.tokens=Lm(Yt.parseFormat(a),t),this.units=this.tokens.map(o=>I1(o,t)),this.disqualifyingUnit=this.units.find(o=>o.invalidReason),!this.disqualifyingUnit){const[o,u]=R1(this.units);this.regex=RegExp(o,"i"),this.handlers=u}}explainFromTokens(t){if(this.isValid){const[a,o]=L1(t,this.regex,this.handlers),[u,f,g]=o?O1(o):[null,null,void 0];if(Aa(o,"a")&&Aa(o,"H"))throw new ua("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:this.tokens,regex:this.regex,rawMatches:a,matches:o,result:u,zone:f,specificOffset:g}}else return{input:t,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}}function Nm(e,t,a){return new Om(e,a).explainFromTokens(t)}function z1(e,t,a){const{result:o,zone:u,specificOffset:f,invalidReason:g}=Nm(e,t,a);return[o,u,f,g]}function Fm(e,t){if(!e)return null;const o=Yt.create(t,e).dtFormatter(N1()),u=o.formatToParts(),f=o.resolvedOptions();return u.map(g=>D1(g,e,f))}const Uo="Invalid DateTime",kh=864e13;function Va(e){return new wi("unsupported zone",`the zone "${e.name}" is not supported`)}function jo(e){return e.weekData===null&&(e.weekData=En(e.c)),e.weekData}function Go(e){return e.localWeekData===null&&(e.localWeekData=En(e.c,e.loc.getMinDaysInFirstWeek(),e.loc.getStartOfWeek())),e.localWeekData}function _s(e,t){const a={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new Be({...a,...t,old:a})}function zm(e,t,a){let o=e-t*60*1e3;const u=a.offset(o);if(t===u)return[o,t];o-=(u-t)*60*1e3;const f=a.offset(o);return u===f?[o,u]:[e-Math.min(u,f)*60*1e3,Math.max(u,f)]}function Xr(e,t){e+=t*60*1e3;const a=new Date(e);return{year:a.getUTCFullYear(),month:a.getUTCMonth()+1,day:a.getUTCDate(),hour:a.getUTCHours(),minute:a.getUTCMinutes(),second:a.getUTCSeconds(),millisecond:a.getUTCMilliseconds()}}function sn(e,t,a){return zm(no(e),t,a)}function Sh(e,t){const a=e.o,o=e.c.year+Math.trunc(t.years),u=e.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,f={...e.c,year:o,month:u,day:Math.min(e.c.day,Mn(o,u))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},g=Ze.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),y=no(f);let[k,A]=zm(y,a,e.zone);return g!==0&&(k+=g,A=e.zone.offset(k)),{ts:k,o:A}}function aa(e,t,a,o,u,f){const{setZone:g,zone:y}=a;if(e&&Object.keys(e).length!==0||t){const k=t||y,A=Be.fromObject(e,{...a,zone:k,specificOffset:f});return g?A:A.setZone(y)}else return Be.invalid(new wi("unparsable",`the input "${u}" can't be parsed as ${o}`))}function Ur(e,t,a=!0){return e.isValid?Yt.create(ot.create("en-US"),{allowZ:a,forceSimple:!0}).formatDateTimeFromString(e,t):null}function qo(e,t){const a=e.c.year>9999||e.c.year<0;let o="";return a&&e.c.year>=0&&(o+="+"),o+=Et(e.c.year,a?6:4),t?(o+="-",o+=Et(e.c.month),o+="-",o+=Et(e.c.day)):(o+=Et(e.c.month),o+=Et(e.c.day)),o}function Ah(e,t,a,o,u,f){let g=Et(e.c.hour);return t?(g+=":",g+=Et(e.c.minute),(e.c.millisecond!==0||e.c.second!==0||!a)&&(g+=":")):g+=Et(e.c.minute),(e.c.millisecond!==0||e.c.second!==0||!a)&&(g+=Et(e.c.second),(e.c.millisecond!==0||!o)&&(g+=".",g+=Et(e.c.millisecond,3))),u&&(e.isOffsetFixed&&e.offset===0&&!f?g+="Z":e.o<0?(g+="-",g+=Et(Math.trunc(-e.o/60)),g+=":",g+=Et(Math.trunc(-e.o%60))):(g+="+",g+=Et(Math.trunc(e.o/60)),g+=":",g+=Et(Math.trunc(e.o%60)))),f&&(g+="["+e.zone.ianaName+"]"),g}const Bm={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},B1={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},H1={ordinal:1,hour:0,minute:0,second:0,millisecond:0},Hm=["year","month","day","hour","minute","second","millisecond"],W1=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],Y1=["year","ordinal","hour","minute","second","millisecond"];function V1(e){const t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[e.toLowerCase()];if(!t)throw new Bp(e);return t}function Ch(e){switch(e.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return V1(e)}}function X1(e){if(Xa===void 0&&(Xa=yt.now()),e.type!=="iana")return e.offset(Xa);const t=e.name;let a=Kl.get(t);return a===void 0&&(a=e.offset(Xa),Kl.set(t,a)),a}function Eh(e,t){const a=ps(t.zone,yt.defaultZone);if(!a.isValid)return Be.invalid(Va(a));const o=ot.fromObject(t);let u,f;if(Ye(e.year))u=yt.now();else{for(const k of Hm)Ye(e[k])&&(e[k]=Bm[k]);const g=dm(e)||hm(e);if(g)return Be.invalid(g);const y=X1(a);[u,f]=sn(e,y,a)}return new Be({ts:u,zone:a,loc:o,o:f})}function Mh(e,t,a){const o=Ye(a.round)?!0:a.round,u=(g,y)=>(g=Wc(g,o||a.calendary?0:2,!0),t.loc.clone(a).relFormatter(a).format(g,y)),f=g=>a.calendary?t.hasSame(e,g)?0:t.startOf(g).diff(e.startOf(g),g).get(g):t.diff(e,g).get(g);if(a.unit)return u(f(a.unit),a.unit);for(const g of a.units){const y=f(g);if(Math.abs(y)>=1)return u(y,g)}return u(e>t?-0:0,a.units[a.units.length-1])}function Th(e){let t={},a;return e.length>0&&typeof e[e.length-1]=="object"?(t=e[e.length-1],a=Array.from(e).slice(0,e.length-1)):a=Array.from(e),[t,a]}let Xa;const Kl=new Map;class Be{constructor(t){const a=t.zone||yt.defaultZone;let o=t.invalid||(Number.isNaN(t.ts)?new wi("invalid input"):null)||(a.isValid?null:Va(a));this.ts=Ye(t.ts)?yt.now():t.ts;let u=null,f=null;if(!o)if(t.old&&t.old.ts===this.ts&&t.old.zone.equals(a))[u,f]=[t.old.c,t.old.o];else{const y=bs(t.o)&&!t.old?t.o:a.offset(this.ts);u=Xr(this.ts,y),o=Number.isNaN(u.year)?new wi("invalid input"):null,u=o?null:u,f=o?null:y}this._zone=a,this.loc=t.loc||ot.create(),this.invalid=o,this.weekData=null,this.localWeekData=null,this.c=u,this.o=f,this.isLuxonDateTime=!0}static now(){return new Be({})}static local(){const[t,a]=Th(arguments),[o,u,f,g,y,k,A]=a;return Eh({year:o,month:u,day:f,hour:g,minute:y,second:k,millisecond:A},t)}static utc(){const[t,a]=Th(arguments),[o,u,f,g,y,k,A]=a;return t.zone=$t.utcInstance,Eh({year:o,month:u,day:f,hour:g,minute:y,second:k,millisecond:A},t)}static fromJSDate(t,a={}){const o=yC(t)?t.valueOf():NaN;if(Number.isNaN(o))return Be.invalid("invalid input");const u=ps(a.zone,yt.defaultZone);return u.isValid?new Be({ts:o,zone:u,loc:ot.fromObject(a)}):Be.invalid(Va(u))}static fromMillis(t,a={}){if(bs(t))return t<-kh||t>kh?Be.invalid("Timestamp out of range"):new Be({ts:t,zone:ps(a.zone,yt.defaultZone),loc:ot.fromObject(a)});throw new zt(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`)}static fromSeconds(t,a={}){if(bs(t))return new Be({ts:t*1e3,zone:ps(a.zone,yt.defaultZone),loc:ot.fromObject(a)});throw new zt("fromSeconds requires a numerical input")}static fromObject(t,a={}){t=t||{};const o=ps(a.zone,yt.defaultZone);if(!o.isValid)return Be.invalid(Va(o));const u=ot.fromObject(a),f=Tn(t,Ch),{minDaysInFirstWeek:g,startOfWeek:y}=hh(f,u),k=yt.now(),A=Ye(a.specificOffset)?o.offset(k):a.specificOffset,M=!Ye(f.ordinal),P=!Ye(f.year),N=!Ye(f.month)||!Ye(f.day),H=P||N,z=f.weekYear||f.weekNumber;if((H||M)&&z)throw new ua("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(N&&M)throw new ua("Can't mix ordinal dates with month/day");const G=z||f.weekday&&!H;let Q,q,ie=Xr(k,A);G?(Q=W1,q=B1,ie=En(ie,g,y)):M?(Q=Y1,q=H1,ie=Vo(ie)):(Q=Hm,q=Bm);let $=!1;for(const fe of Q){const ge=f[fe];Ye(ge)?$?f[fe]=q[fe]:f[fe]=ie[fe]:$=!0}const re=G?vC(f,g,y):M?bC(f):dm(f),B=re||hm(f);if(B)return Be.invalid(B);const de=G?uh(f,g,y):M?dh(f):f,[ae,U]=sn(de,A,o),J=new Be({ts:ae,zone:o,o:U,loc:u});return f.weekday&&H&&t.weekday!==J.weekday?Be.invalid("mismatched weekday",`you can't specify both a weekday of ${f.weekday} and a date of ${J.toISO()}`):J.isValid?J:Be.invalid(J.invalid)}static fromISO(t,a={}){const[o,u]=c1(t);return aa(o,u,a,"ISO 8601",t)}static fromRFC2822(t,a={}){const[o,u]=u1(t);return aa(o,u,a,"RFC 2822",t)}static fromHTTP(t,a={}){const[o,u]=d1(t);return aa(o,u,a,"HTTP",a)}static fromFormat(t,a,o={}){if(Ye(t)||Ye(a))throw new zt("fromFormat requires an input string and a format");const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0}),[y,k,A,M]=z1(g,t,a);return M?Be.invalid(M):aa(y,k,o,`format ${a}`,t,A)}static fromString(t,a,o={}){return Be.fromFormat(t,a,o)}static fromSQL(t,a={}){const[o,u]=b1(t);return aa(o,u,a,"SQL",t)}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the DateTime is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new UA(o);return new Be({invalid:o})}static isDateTime(t){return t&&t.isLuxonDateTime||!1}static parseFormatForOpts(t,a={}){const o=Fm(t,ot.fromObject(a));return o?o.map(u=>u?u.val:null).join(""):null}static expandFormat(t,a={}){return Lm(Yt.parseFormat(t),ot.fromObject(a)).map(u=>u.val).join("")}static resetCache(){Xa=void 0,Kl.clear()}get(t){return this[t]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?jo(this).weekYear:NaN}get weekNumber(){return this.isValid?jo(this).weekNumber:NaN}get weekday(){return this.isValid?jo(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?Go(this).weekday:NaN}get localWeekNumber(){return this.isValid?Go(this).weekNumber:NaN}get localWeekYear(){return this.isValid?Go(this).weekYear:NaN}get ordinal(){return this.isValid?Vo(this.c).ordinal:NaN}get monthShort(){return this.isValid?Yr.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Yr.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Yr.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Yr.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];const t=864e5,a=6e4,o=no(this.c),u=this.zone.offset(o-t),f=this.zone.offset(o+t),g=this.zone.offset(o-u*a),y=this.zone.offset(o-f*a);if(g===y)return[this];const k=o-g*a,A=o-y*a,M=Xr(k,g),P=Xr(A,y);return M.hour===P.hour&&M.minute===P.minute&&M.second===P.second&&M.millisecond===P.millisecond?[_s(this,{ts:k}),_s(this,{ts:A})]:[this]}get isInLeapYear(){return Cr(this.year)}get daysInMonth(){return Mn(this.year,this.month)}get daysInYear(){return this.isValid?ma(this.year):NaN}get weeksInWeekYear(){return this.isValid?fr(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?fr(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(t={}){const{locale:a,numberingSystem:o,calendar:u}=Yt.create(this.loc.clone(t),t).resolvedOptions(this);return{locale:a,numberingSystem:o,outputCalendar:u}}toUTC(t=0,a={}){return this.setZone($t.instance(t),a)}toLocal(){return this.setZone(yt.defaultZone)}setZone(t,{keepLocalTime:a=!1,keepCalendarTime:o=!1}={}){if(t=ps(t,yt.defaultZone),t.equals(this.zone))return this;if(t.isValid){let u=this.ts;if(a||o){const f=t.offset(this.ts),g=this.toObject();[u]=sn(g,f,t)}return _s(this,{ts:u,zone:t})}else return Be.invalid(Va(t))}reconfigure({locale:t,numberingSystem:a,outputCalendar:o}={}){const u=this.loc.clone({locale:t,numberingSystem:a,outputCalendar:o});return _s(this,{loc:u})}setLocale(t){return this.reconfigure({locale:t})}set(t){if(!this.isValid)return this;const a=Tn(t,Ch),{minDaysInFirstWeek:o,startOfWeek:u}=hh(a,this.loc),f=!Ye(a.weekYear)||!Ye(a.weekNumber)||!Ye(a.weekday),g=!Ye(a.ordinal),y=!Ye(a.year),k=!Ye(a.month)||!Ye(a.day),A=y||k,M=a.weekYear||a.weekNumber;if((A||g)&&M)throw new ua("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(k&&g)throw new ua("Can't mix ordinal dates with month/day");let P;f?P=uh({...En(this.c,o,u),...a},o,u):Ye(a.ordinal)?(P={...this.toObject(),...a},Ye(a.day)&&(P.day=Math.min(Mn(P.year,P.month),P.day))):P=dh({...Vo(this.c),...a});const[N,H]=sn(P,this.o,this.zone);return _s(this,{ts:N,o:H})}plus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t);return _s(this,Sh(this,a))}minus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t).negate();return _s(this,Sh(this,a))}startOf(t,{useLocaleWeeks:a=!1}={}){if(!this.isValid)return this;const o={},u=Ze.normalizeUnit(t);switch(u){case"years":o.month=1;case"quarters":case"months":o.day=1;case"weeks":case"days":o.hour=0;case"hours":o.minute=0;case"minutes":o.second=0;case"seconds":o.millisecond=0;break}if(u==="weeks")if(a){const f=this.loc.getStartOfWeek(),{weekday:g}=this;g<f&&(o.weekNumber=this.weekNumber-1),o.weekday=f}else o.weekday=1;if(u==="quarters"){const f=Math.ceil(this.month/3);o.month=(f-1)*3+1}return this.set(o)}endOf(t,a){return this.isValid?this.plus({[t]:1}).startOf(t,a).minus(1):this}toFormat(t,a={}){return this.isValid?Yt.create(this.loc.redefaultToEN(a)).formatDateTimeFromString(this,t):Uo}toLocaleString(t=Cn,a={}){return this.isValid?Yt.create(this.loc.clone(a),t).formatDateTime(this):Uo}toLocaleParts(t={}){return this.isValid?Yt.create(this.loc.clone(t),t).formatDateTimeParts(this):[]}toISO({format:t="extended",suppressSeconds:a=!1,suppressMilliseconds:o=!1,includeOffset:u=!0,extendedZone:f=!1}={}){if(!this.isValid)return null;const g=t==="extended";let y=qo(this,g);return y+="T",y+=Ah(this,g,a,o,u,f),y}toISODate({format:t="extended"}={}){return this.isValid?qo(this,t==="extended"):null}toISOWeekDate(){return Ur(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:t=!1,suppressSeconds:a=!1,includeOffset:o=!0,includePrefix:u=!1,extendedZone:f=!1,format:g="extended"}={}){return this.isValid?(u?"T":"")+Ah(this,g==="extended",a,t,o,f):null}toRFC2822(){return Ur(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return Ur(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?qo(this,!0):null}toSQLTime({includeOffset:t=!0,includeZone:a=!1,includeOffsetSpace:o=!0}={}){let u="HH:mm:ss.SSS";return(a||t)&&(o&&(u+=" "),a?u+="z":t&&(u+="ZZ")),Ur(this,u,!0)}toSQL(t={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(t)}`:null}toString(){return this.isValid?this.toISO():Uo}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(t={}){if(!this.isValid)return{};const a={...this.c};return t.includeConfig&&(a.outputCalendar=this.outputCalendar,a.numberingSystem=this.loc.numberingSystem,a.locale=this.loc.locale),a}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(t,a="milliseconds",o={}){if(!this.isValid||!t.isValid)return Ze.invalid("created by diffing an invalid DateTime");const u={locale:this.locale,numberingSystem:this.numberingSystem,...o},f=wC(a).map(Ze.normalizeUnit),g=t.valueOf()>this.valueOf(),y=g?this:t,k=g?t:this,A=C1(y,k,f,u);return g?A.negate():A}diffNow(t="milliseconds",a={}){return this.diff(Be.now(),t,a)}until(t){return this.isValid?xt.fromDateTimes(this,t):this}hasSame(t,a,o){if(!this.isValid)return!1;const u=t.valueOf(),f=this.setZone(t.zone,{keepLocalTime:!0});return f.startOf(a,o)<=u&&u<=f.endOf(a,o)}equals(t){return this.isValid&&t.isValid&&this.valueOf()===t.valueOf()&&this.zone.equals(t.zone)&&this.loc.equals(t.loc)}toRelative(t={}){if(!this.isValid)return null;const a=t.base||Be.fromObject({},{zone:this.zone}),o=t.padding?this<a?-t.padding:t.padding:0;let u=["years","months","days","hours","minutes","seconds"],f=t.unit;return Array.isArray(t.unit)&&(u=t.unit,f=void 0),Mh(a,this.plus(o),{...t,numeric:"always",units:u,unit:f})}toRelativeCalendar(t={}){return this.isValid?Mh(t.base||Be.fromObject({},{zone:this.zone}),this,{...t,numeric:"auto",units:["years","months","days"],calendary:!0}):null}static min(...t){if(!t.every(Be.isDateTime))throw new zt("min requires all arguments be DateTimes");return fh(t,a=>a.valueOf(),Math.min)}static max(...t){if(!t.every(Be.isDateTime))throw new zt("max requires all arguments be DateTimes");return fh(t,a=>a.valueOf(),Math.max)}static fromFormatExplain(t,a,o={}){const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0});return Nm(g,t,a)}static fromStringExplain(t,a,o={}){return Be.fromFormatExplain(t,a,o)}static buildFormatParser(t,a={}){const{locale:o=null,numberingSystem:u=null}=a,f=ot.fromOpts({locale:o,numberingSystem:u,defaultToEN:!0});return new Om(f,t)}static fromFormatParser(t,a,o={}){if(Ye(t)||Ye(a))throw new zt("fromFormatParser requires an input string and a format parser");const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0});if(!g.equals(a.locale))throw new zt(`fromFormatParser called with a locale of ${g}, but the format parser was created for ${a.locale}`);const{result:y,zone:k,specificOffset:A,invalidReason:M}=a.explainFromTokens(t);return M?Be.invalid(M):aa(y,k,o,`format ${a.format}`,t,A)}static get DATE_SHORT(){return Cn}static get DATE_MED(){return Hp}static get DATE_MED_WITH_WEEKDAY(){return qA}static get DATE_FULL(){return Wp}static get DATE_HUGE(){return Yp}static get TIME_SIMPLE(){return Vp}static get TIME_WITH_SECONDS(){return Xp}static get TIME_WITH_SHORT_OFFSET(){return Up}static get TIME_WITH_LONG_OFFSET(){return jp}static get TIME_24_SIMPLE(){return Gp}static get TIME_24_WITH_SECONDS(){return qp}static get TIME_24_WITH_SHORT_OFFSET(){return $p}static get TIME_24_WITH_LONG_OFFSET(){return Kp}static get DATETIME_SHORT(){return Zp}static get DATETIME_SHORT_WITH_SECONDS(){return Jp}static get DATETIME_MED(){return Qp}static get DATETIME_MED_WITH_SECONDS(){return em}static get DATETIME_MED_WITH_WEEKDAY(){return $A}static get DATETIME_FULL(){return tm}static get DATETIME_FULL_WITH_SECONDS(){return im}static get DATETIME_HUGE(){return sm}static get DATETIME_HUGE_WITH_SECONDS(){return am}}function Ba(e){if(Be.isDateTime(e))return e;if(e&&e.valueOf&&bs(e.valueOf()))return Be.fromJSDate(e);if(e&&typeof e=="object")return Be.fromObject(e);throw new zt(`Unknown datetime argument: ${e}, of type ${typeof e}`)}/**
39
+ `+f):o.stack=f}catch{}}throw o}}_request(t,a){typeof t=="string"?(a=a||{},a.url=t):a=t||{},a=js(this.defaults,a);const{transitional:o,paramsSerializer:u,headers:f}=a;o!==void 0&&en.assertOptions(o,{silentJSONParsing:Pi.transitional(Pi.boolean),forcedJSONParsing:Pi.transitional(Pi.boolean),clarifyTimeoutError:Pi.transitional(Pi.boolean)},!1),u!=null&&(te.isFunction(u)?a.paramsSerializer={serialize:u}:en.assertOptions(u,{encode:Pi.function,serialize:Pi.function},!0)),a.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?a.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:a.allowAbsoluteUrls=!0),en.assertOptions(a,{baseUrl:Pi.spelling("baseURL"),withXsrfToken:Pi.spelling("withXSRFToken")},!0),a.method=(a.method||this.defaults.method||"get").toLowerCase();let g=f&&te.merge(f.common,f[a.method]);f&&te.forEach(["delete","get","head","post","put","patch","common"],z=>{delete f[z]}),a.headers=ti.concat(g,f);const y=[];let k=!0;this.interceptors.request.forEach(function(G){typeof G.runWhen=="function"&&G.runWhen(a)===!1||(k=k&&G.synchronous,y.unshift(G.fulfilled,G.rejected))});const A=[];this.interceptors.response.forEach(function(G){A.push(G.fulfilled,G.rejected)});let M,P=0,N;if(!k){const z=[Yd.bind(this),void 0];for(z.unshift.apply(z,y),z.push.apply(z,A),N=z.length,M=Promise.resolve(a);P<N;)M=M.then(z[P++],z[P++]);return M}N=y.length;let H=a;for(P=0;P<N;){const z=y[P++],G=y[P++];try{H=z(H)}catch(Q){G.call(this,Q);break}}try{M=Yd.call(this,H)}catch(z){return Promise.reject(z)}for(P=0,N=A.length;P<N;)M=M.then(A[P++],A[P++]);return M}getUri(t){t=js(this.defaults,t);const a=mp(t.baseURL,t.url,t.allowAbsoluteUrls);return dp(a,t.params,t.paramsSerializer)}};te.forEach(["delete","get","head","options"],function(t){Bs.prototype[t]=function(a,o){return this.request(js(o||{},{method:t,url:a,data:(o||{}).data}))}});te.forEach(["post","put","patch"],function(t){function a(o){return function(f,g,y){return this.request(js(y||{},{method:t,headers:o?{"Content-Type":"multipart/form-data"}:{},url:f,data:g}))}}Bs.prototype[t]=a(),Bs.prototype[t+"Form"]=a(!0)});let wS=class kp{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let a;this.promise=new Promise(function(f){a=f});const o=this;this.promise.then(u=>{if(!o._listeners)return;let f=o._listeners.length;for(;f-- >0;)o._listeners[f](u);o._listeners=null}),this.promise.then=u=>{let f;const g=new Promise(y=>{o.subscribe(y),f=y}).then(u);return g.cancel=function(){o.unsubscribe(f)},g},t(function(f,g,y){o.reason||(o.reason=new Ma(f,g,y),a(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const a=this._listeners.indexOf(t);a!==-1&&this._listeners.splice(a,1)}toAbortSignal(){const t=new AbortController,a=o=>{t.abort(o)};return this.subscribe(a),t.signal.unsubscribe=()=>this.unsubscribe(a),t.signal}static source(){let t;return{token:new kp(function(u){t=u}),cancel:t}}};function kS(e){return function(a){return e.apply(null,a)}}function SS(e){return te.isObject(e)&&e.isAxiosError===!0}const Il={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Il).forEach(([e,t])=>{Il[t]=e});function Sp(e){const t=new Bs(e),a=Qg(Bs.prototype.request,t);return te.extend(a,Bs.prototype,t,{allOwnKeys:!0}),te.extend(a,t,null,{allOwnKeys:!0}),a.create=function(u){return Sp(js(e,u))},a}const At=Sp(Sr);At.Axios=Bs;At.CanceledError=Ma;At.CancelToken=wS;At.isCancel=gp;At.VERSION=wp;At.toFormData=eo;At.AxiosError=Xe;At.Cancel=At.CanceledError;At.all=function(t){return Promise.all(t)};At.spread=kS;At.isAxiosError=SS;At.mergeConfig=js;At.AxiosHeaders=ti;At.formToJSON=e=>fp(te.isHTMLForm(e)?new FormData(e):e);At.getAdapter=yp.getAdapter;At.HttpStatusCode=Il;At.default=At;const{Axios:YM,AxiosError:VM,CanceledError:XM,isCancel:UM,CancelToken:jM,VERSION:GM,all:qM,Cancel:$M,isAxiosError:KM,spread:ZM,toFormData:JM,AxiosHeaders:QM,HttpStatusCode:eT,formToJSON:tT,getAdapter:iT,mergeConfig:sT}=At;/*! js-cookie v3.0.5 | MIT */function Br(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var o in a)e[o]=a[o]}return e}var AS={read:function(e){return e[0]==='"'&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function _l(e,t){function a(u,f,g){if(!(typeof document>"u")){g=Br({},t,g),typeof g.expires=="number"&&(g.expires=new Date(Date.now()+g.expires*864e5)),g.expires&&(g.expires=g.expires.toUTCString()),u=encodeURIComponent(u).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var y="";for(var k in g)g[k]&&(y+="; "+k,g[k]!==!0&&(y+="="+g[k].split(";")[0]));return document.cookie=u+"="+e.write(f,u)+y}}function o(u){if(!(typeof document>"u"||arguments.length&&!u)){for(var f=document.cookie?document.cookie.split("; "):[],g={},y=0;y<f.length;y++){var k=f[y].split("="),A=k.slice(1).join("=");try{var M=decodeURIComponent(k[0]);if(g[M]=e.read(A,M),u===M)break}catch{}}return u?g[u]:g}}return Object.create({set:a,get:o,remove:function(u,f){a(u,"",Br({},f,{expires:-1}))},withAttributes:function(u){return _l(this.converter,Br({},this.attributes,u))},withConverter:function(u){return _l(Br({},this.converter,u),this.attributes)}},{attributes:{value:Object.freeze(t)},converter:{value:Object.freeze(e)}})}var Dl=_l(AS,{path:"/"});const Pe=At.create();Pe.interceptors.request.use(async function(e){const t=so();if(t.isAuthenticated){const a=await t.getAccessToken();e.headers["Accept-Language"]=t.authUser.language,e.headers.Authorization=`Bearer ${a}`}return e},function(e){return Promise.reject(e)});Pe.interceptors.response.use(function(e){return e},function(e){if(e.response.status===418)return ms.push({name:"TwoFA"}),Promise.reject(e);if(e.response.status===429)return Promise.reject(e);if(e.response.status!==401||ms.currentRoute.name==="Login")return e.response.status!==518&&e.config&&!e.config.ignoreErrors&&NA().displayNotification({msg:e.response.data,type:"error"}),Promise.reject(e);const t=Dl.get("refreshToken"),a=so();return e.config.url.endsWith("/token/refresh/")||!t?(a.$reset(),ms.currentRoute.name!=="Login"&&ms.push({name:"Login"}),Promise.reject(e)):Pe.post("/token/refresh/",{refresh:t}).then(o=>{Dl.set("token",o.data.access,{sameSite:"strict"}),Pe.defaults.headers.common.Authorization=`Bearer ${o.data.access}`;const u=e.config;return u.headers.Authorization=`Bearer ${o.data.access}`,new Promise((f,g)=>{Pe.request(u).then(y=>{f(y)}).catch(y=>{g(y)})})}).catch(o=>{Promise.reject(o)})});function CS(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function ES(e,t){return t!=null&&typeof Symbol<"u"&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function MS(e){for(var t=1;t<arguments.length;t++){var a=arguments[t]!=null?arguments[t]:{},o=Object.keys(a);typeof Object.getOwnPropertySymbols=="function"&&(o=o.concat(Object.getOwnPropertySymbols(a).filter(function(u){return Object.getOwnPropertyDescriptor(a,u).enumerable}))),o.forEach(function(u){CS(e,u,a[u])})}return e}var TS=/[[\].]{1,2}/g,Ap=/%\{((?:.|\n)+?)\}/g,PS=/\{\{((?:.|\n)+?)\}\}/g,Dc=function(e){return function(t){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,u=arguments.length>3?arguments[3]:void 0,f=e.silent;!f&&PS.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use "%{}" instead of "{{}}" in: '.concat(t));var g=t.replace(Ap,function(y,k){var A=function(G,Q){for(var q=Q.split(TS).filter(function(ie){return ie});q.length;)G=G[q.shift()];return G},M=k.trim(),P,N={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function H(z,G,Q){try{P=A(z,G)}catch{}if(P==null){if(Q)return H(Q.ctx,G,Q.parent);console.warn("Cannot evaluate expression: ".concat(G)),P=G}var q=P.toString();return o?q:q.replace(/[&<>"']/g,function(ie){return N[ie]})}return H(a,M,u)});return g}};Dc.INTERPOLATION_RE=Ap;Dc.INTERPOLATION_PREFIX="%{";var Rc=Dc,Xd={getTranslationIndex:function(t,a){switch(a=Number(a),a=typeof a=="number"&&isNaN(a)?1:a,t.length>2&&t!=="pt_BR"&&(t=t.split("_")[0]),t){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return a%10!==1||a%100===11?1:0;case"jv":return a!==0?1:0;case"mk":return a===1||a%10===1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":return a>1?1:0;case"lv":return a%10===1&&a%100!==11?0:a!==0?1:2;case"lt":return a%10===1&&a%100!==11?0:a%10>=2&&(a%100<10||a%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return a%10===1&&a%100!==11?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"mnk":return a===0?0:a===1?1:2;case"ro":return a===1?0:a===0||a%100>0&&a%100<20?1:2;case"pl":return a===1?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"cs":case"sk":return a===1?0:a>=2&&a<=4?1:2;case"csb":return a===1?0:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?1:2;case"sl":return a%100===1?0:a%100===2?1:a%100===3||a%100===4?2:3;case"mt":return a===1?0:a===0||a%100>1&&a%100<11?1:a%100>10&&a%100<20?2:3;case"gd":return a===1||a===11?0:a===2||a===12?1:a>2&&a<20?2:3;case"cy":return a===1?0:a===2?1:a!==8&&a!==11?2:3;case"kw":return a===1?0:a===2?1:a===3?2:3;case"ga":return a===1?0:a===2?1:a>2&&a<7?2:a>6&&a<11?3:4;case"ar":return a===0?0:a===1?1:a===2?2:a%100>=3&&a%100<=10?3:a%100>=11?4:5;default:return a!==1?1:0}}},IS=function(e){return{getTranslation:function(a){var o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:null,g=arguments.length>4?arguments[4]:void 0,y=arguments.length>5?arguments[5]:void 0,k=arguments.length>6&&arguments[6]!==void 0?arguments[6]:!1;g===void 0&&(g=e.current);var A=function($,re){return re?e.interpolate($,re,k):$};if(a=a.trim(),!a)return"";var M=g?e.silent||e.muted.indexOf(g)!==-1:!1,P=g;e.sourceCodeLanguage&&(P=e.sourceCodeLanguage);var N=f&&Xd.getTranslationIndex(P,o)>0?f:a,H=e.translations,z=H[g]||H[g.split("_")[0]];if(!z)return M||console.warn("No translations found for ".concat(g)),A(N,y);var G=function($){var re=Xd.getTranslationIndex(g,o);$.length===1&&o===1&&(re=0);var B=$[re];if(!B){if(B==="")return A(N,y);throw new Error(a+" "+re+" "+e.current+" "+o)}return A(B,y)},Q=function(){if(!M){var $="Untranslated ".concat(g," key found: ").concat(a);u&&($+=" (with context: ".concat(u,")")),console.warn($)}return A(N,y)},q=function($){var re=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;if(ES($,Object)){if(Array.isArray($))return G($);var B=re??"",de=$[B];return q(de)}return re||!$?Q():A($,y)},ie=z[a];return q(ie,u)},gettext:function(a,o){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;return this.getTranslation(a,void 0,void 0,void 0,void 0,o,u)},pgettext:function(a,o,u){var f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;return this.getTranslation(o,1,a,void 0,void 0,u,f)},ngettext:function(a,o,u,f){var g=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!1;return this.getTranslation(a,u,null,o,void 0,f,g)},npgettext:function(a,o,u,f,g){var y=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!1;return this.getTranslation(o,f,a,u,void 0,g,y)}}},Lc=IS,Rl=Symbol("GETTEXT");function _S(e){return e.replace(/\r?\n|\r/,"").replace(/\s\s+/g," ").trim()}function Ud(e){var t={};return Object.keys(e).forEach(function(a){var o=e[a],u={};Object.keys(o).forEach(function(f){u[_S(f)]=o[f]}),t[a]=u}),t}var DS=function(){var e=bt(Rl,null);if(!e)throw new Error("Failed to inject gettext. Make sure vue3-gettext is set up properly.");return e},RS=xr({name:"translate",props:{tag:{type:String,default:"span"},translateN:{type:Number,default:null},translatePlural:{type:String,default:null},translateContext:{type:String,default:null},translateParams:{type:Object,default:null},translateComment:{type:String,default:null}},setup:function(t,a){var o=t.translateN!==void 0&&t.translatePlural!==void 0;if(!o&&(t.translateN||t.translatePlural)){var u,f,g;throw new Error("`translate-n` and `translate-plural` attributes must be used together: ".concat((f=(g=a.slots).default)===null||f===void 0||(u=f.call(g)[0])===null||u===void 0?void 0:u.children,"."))}var y=wt(),k=DS(),A=wt(null);Bn(function(){!A.value&&y.value&&(A.value=y.value.innerHTML.trim())});var M=dt(function(){var P,N=Lc(k).getTranslation(A.value,t.translateN,t.translateContext,o?t.translatePlural:null,k.current);return Rc(k)(N,t.translateParams,void 0,(P=ws())===null||P===void 0?void 0:P.parent)});return function(){return A.value?Xs(t.tag,{ref:y,innerHTML:M.value}):Xs(t.tag,{ref:y},a.slots.default?a.slots.default():"")}}}),jd=RS,LS=function(e,t,a,o){var u=o.props||{},f=t.dataset.msgid,g=u["translate-context"],y=u["translate-n"],k=u["translate-plural"],A=y!==void 0&&k!==void 0,M=u["render-html"]==="true";if(!A&&(y||k))throw new Error("`translate-n` and `translate-plural` attributes must be used together:"+f+".");!e.silent&&u["translate-params"]&&console.warn("`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: ".concat(f));var P=Lc(e).getTranslation(f,y,g,A?k:null,e.current),N,H=Object.assign((N=a.instance)!==null&&N!==void 0?N:{},a.value),z=Rc(e)(P,H,M,null);t.innerHTML=z};function Gd(e){var t=function(a,o,u){a.dataset.currentLanguage=e.current,LS(e,a,o,u)};return{beforeMount:function(o,u,f){o.dataset.msgid||(o.dataset.msgid=o.innerHTML),Rt(e,function(){t(o,u,f)}),t(o,u,f)},updated:function(o,u,f){t(o,u,f)}}}var qd={availableLanguages:{en:"English"},defaultLanguage:"en",sourceCodeLanguage:void 0,mutedLanguages:[],silent:!1,translations:{},setGlobalProperties:!0,globalProperties:{language:["$language"],gettext:["$gettext"],pgettext:["$pgettext"],ngettext:["$ngettext"],npgettext:["$npgettext"],interpolate:["$gettextInterpolate"]},provideDirective:!0,provideComponent:!0};function OS(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Object.keys(e).forEach(function(g){if(Object.keys(qd).indexOf(g)===-1)throw new Error("".concat(g," is an invalid option for the translate plugin."))});var t=MS({},qd,e),a=wt(Ud(t.translations)),o=Bi({available:t.availableLanguages,muted:t.mutedLanguages,silent:t.silent,translations:dt({get:function(){return a.value},set:function(g){a.value=Ud(g)}}),current:t.defaultLanguage,sourceCodeLanguage:t.sourceCodeLanguage,install:function(y){if(y[Rl]=o,y.provide(Rl,o),t.setGlobalProperties){var k=y.config.globalProperties,A=t.globalProperties.gettext||["$gettext"];A.forEach(function(M){k[M]=o.$gettext}),A=t.globalProperties.pgettext||["$pgettext"],A.forEach(function(M){k[M]=o.$pgettext}),A=t.globalProperties.ngettext||["$ngettext"],A.forEach(function(M){k[M]=o.$ngettext}),A=t.globalProperties.npgettext||["$npgettext"],A.forEach(function(M){k[M]=o.$npgettext}),A=t.globalProperties.interpolate||["$gettextInterpolate"],A.forEach(function(M){k[M]=o.interpolate}),A=t.globalProperties.language||["$language"],A.forEach(function(M){k[M]=o})}t.provideDirective&&y.directive("translate",Gd(o)),t.provideComponent&&y.component("translate",jd)}}),u=Lc(o),f=Rc(o);return o.$gettext=u.gettext.bind(u),o.$pgettext=u.pgettext.bind(u),o.$ngettext=u.ngettext.bind(u),o.$npgettext=u.npgettext.bind(u),o.interpolate=f.bind(f),o.directive=Gd(o),o.component=jd,o}const NS={},FS={Account:"Kont",Actions:"Oberioù",Add:"Ouzhpennañ",Address:"Chomlec'h","Address book information":"Chomlec'h titouroù al levr","Administered domains":"Domanioù meret",Administrators:"Merourien",Alias:"Alias",Aliases:"Aliasoù","API access":"API moned",Apply:"Arloañ",Authentication:"O vezañ anavezet","Bind/named format. Click to copy":"Stumm Ereet/anvet",Categories:"Rummadoù","Check this option if passwords contained in your file are not crypted":"Kochit an dibarzh ma ne vez ket kriptet ar gerioù-tremen endalc'het en ho restr",City:"Kêr",Close:"Serriñ",Closed:"Serriñ",Company:"Embregerezh",Confirmation:"Kadarnadur",Contacts:"Darempredoù","Continue on error":"Kenderc'hel war ar fazi",Country:"Bro","Create a domain administrator":"Krouit ur merour domani","Create a mailbox for the administrator.":"Krouiñ ur voest-posteloù evit ar merour.","Create aliases":"Krouiñ aliasoù","Creation date":"Deiziad krouidigezh","Crypt passwords":"Kriptañ ar gerioù-tremen",Dashboard:"Taolenn-stur","Default mailbox quota":"Kota boest-posteloù dre-ziouer","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":`Kota arloet d'ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh "0" a dalvez kota ebet.`,Description:"Deskrivadur",Disabled:"Lazhet","DKIM key":"Alc'hwez DKIM",DNS:"DNS","DNS status":"Statud DNS",Domain:"Domani","Domain administrator":"Merour an domani","Domain created":"Domani krouet",Domains:"Domanioù",Email:"Postel","Email address":"Chomlec'h postel","Enable DKIM signing":"Enaouiñ ar sinadur DKIM","Enable DNS checks":"Enaouiñ ar gwiriañ DNS",Enabled:"Enaouet","Expire at":"Diamzeriet da",Failed:"C'hwitet",Forward:"Treuzkas","Forward messages and store copies into your local mailbox":"Treuzkas kemennadennoù ha stokiñ eiladennoù e-barzh ar voest-posteloù lec'hel","Forward updated":"Treuzkas hizivaet","Full name":"Anv klok",General:"Hollek",Identities:"Identelezhioù",Import:"Emporzhiañ","Import domains":"Emporzhiañ domanioù","Import identities":"Emporzhiañ identelezhioù",Information:"Titouroù","Installed version":"Stumm staliet","Keep local copies":"Mirout eiladennoù lec'hel","Last modification date":"Deiziad aozañ diwezhañ","Last name":"Anv familh",Level:"Live",Logger:"Enroller",Logout:"Digevreañ",Mailbox:"Boest-posteloù",Mailboxes:"Boest-posteloù",Message:"Implij",Modified:"Aozet",More:"Muioc'h",Name:"Anv","New account":"Kont nevez","New alias":"Alias nevez","New domain":"Domani nevez",Next:"Da-heul","Not generated":"Neket ganet",Note:"Notenn","One or more updates are available":"Hegerz ez eus un hizivadenn pe muioc'h",Options:"Dibarzhioù","Partially aligned":"Linennet dre an hanter",Password:"Ger-tremen","Passwords mismatch":"Disklotadurioù gerioù-tremen",Phone:"Pellgomz","Phone number":"Niverenn pellgomz",Profile:"Profil","Profile updated":"Profil hizivaet",Quota:"Kota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Kota evit ar voest-posteloù-mañ. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Termeniñ un dalvoudegezh ispisial pe implijit talvoudegezh an domani. Laoskit goullo evit termeniñ un dalvoudegezh divevenn (berzet evit ar verourien zomani).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":`Kota rannet kenetre ar boestoù-postel. Gellout a ra bezañ ezpleget e Ko, Mo (diouer) pe Go c'hoazh. Un dalvoudegezh "0" a dalvez kota ebet.`,"Random address":"Chomlec'h dre-zegouezh","Random password":"Ger-tremen dre-zegouezh","Recipient(s)":"Resever(ien)",Recipients:"Reseverien",Reseller:"Eilgwerzher",Resources:"Mammennoù","Resources usage":"Implij mammennoù",Role:"Rol",Save:"Enrollañ",Search:"Klask","Secondary email":"Eil chomlec'h postel","Sender addresses":"Chomlec'hioù ar c'haser",Separator:"Skejer",Settings:"Arventennoù","Show key":"Diskouez an alc'hwez","Simple user":"Implijer diazez","State/Province":"Stad/Proviñs",Status:"Statud",Summary:"Berradenn","Super administrator":"Dreist-merour","The credentials are the same than the ones you use to access Modoboa.":"An titouroù anaout a vez ar memes re hag ar re a implijit da dizhout Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Evit tizhoù al levr chomlec'hioù-mañ adalek an diavaez (evel da skouer Mozilla Thunderbird war ho poellgomzer), implijit an URL da-heul:",Total:"Hollad",Transport:"Treuzdougen",Type:"Doare",Unknown:"Dizanv","Unknown sources / Threats":"Mammennoù dizanv/Gourdrouzioù",unlimited:"divevennet",Update:"Hizivaat",Updated:"Hizivaet","Use domain default value":"Implijout un dalvoudegezh domani dre-ziouer",Username:"Anv implier","Welcome to Modoboa":"Degemer mat e-barzh Modoboa","With a mailbox":"Gant ur voest-posteloù"},zS={},BS={Account:"Konto",Actions:"Aktionen",Add:"Hinzufügen",Address:"Adresse","Administered domains":"Administrierte Domains",Administrators:"Administratoren",Alias:"Alias",Aliases:"Aliase","API access":"API Zugriff",Apply:"Antworten",Authentication:"Authentifizierung","Bind/named format. Click to copy":"Gebundenes Format","Check this option if passwords contained in your file are not crypted":"Auswählen, wenn Kennwörter in Datei nicht verschlüsselt sind",Close:"Schließen",Closed:"Schließen",Confirmation:"Bestätigung","Continue on error":"Bei Fehler fortfahren","Create a domain administrator":"Domain-Administrator erstellen","Create a mailbox for the administrator.":"Erzeuge Postfach für den Administrator.","Create aliases":"Aliase erstellen","Creation date":"Erstellungsdatum","Crypt passwords":"Passwörter verschlüsseln",Dashboard:"Dashboard",Date:"Datum",Day:"Tag","Default mailbox quota":"Standard Postfach Kontingent","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Auf Postfächer angewendete Quota. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden.",Description:"Beschreibung","Disable 2FA":"Deaktiviere 2-Faktor-Authentifizierung",Disabled:"Deaktiviert","DKIM key":"DKIM Schlüssel",DNS:"DNS","DNS status":"DNS Status",Domain:"Domain","Domain administrator":"Domain Administrator","Domain created":"Domain erstellt.",Domains:"Domains","Email address":"E-Mail Adresse","Enable DKIM signing":"Aktiviere DKIM Signierung","Enable DNS checks":"Aktiviere DNS Prüfungen",Enabled:"Aktiviert","Expire at":"Läuft ab am",Failed:"Fehlgeschlagen",Forward:"Weiterleiten","Forward messages and store copies into your local mailbox":"Nachricht weiterleiten und Kopie in Mailbox ablegen","Forward updated":"Weiterleitung aktualisiert",From:"Von","Full name":"Vollständiger Name",General:"Allgemein",Identities:"Identitäten",Import:"Import","Import domains":"Domains importieren","Import identities":"Identitäten importieren",Information:"Information","Installed version":"Installierte Version","Keep local copies":"Lokale Kopien behalten","Last modification date":"Datum der letzten Änderung",Level:"Stufe",Logger:"Logger",Logout:"Logout",Mailbox:"Postfächer",Mailboxes:"Mailboxen",Message:"Verwendung",Modified:"Verändert",Month:"Monat",Name:"Name","New account":"Neues Konto","New alias":"Neuer Alias","New domain":"Neue Domain","New recovery codes":"Neue Wiederherstellungscodes",Next:"Weiter","Not generated":"Nicht generiert","One or more updates are available":"Eine oder mehrere Aktualisierungen sind verfügbar",Options:"Optionen","Partially aligned":"Teilweise zugeordnet",Password:"Passwort","Passwords mismatch":"Passwörter stimmen nicht überein","Phone number":"Telefonnummer","Pin code":"Pincode",Profile:"Profil","Profile updated":"Profil aktualisiert","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Quota dieses Postfachs. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. Eigenen Wert eingeben oder Voreinstellung der Domain verwenden lassen. Frei lassen, um Quota auf unlimitiert zu setzen (nur Super-Administratoren).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Von Postfächern gemeinsam genutzte Quota/Speicherplatz. Kann in KB, MB (Voreinstellung) oder GB angegeben werden. 0 eingeben, um keine Quota zu verwenden.","Random address":"Zufällige Adresse","Random password":"Zufälliges Passwort","Recipient(s)":"Empfänger",Recipients:"Empfänger",Register:"Registrieren",Reseller:"Reseller","Reset recovery codes":"Setze Wiederherstellungscodes zurück",Resources:"Ressourcen","Resources usage":"Ressourcen-Verbrauch",Role:"Rolle",Save:"Speichern",Search:"Suchen","Secondary email":"Zweite E-Mail Adresse","Sender addresses":"Ab­sen­der­ad­res­sen ",Separator:"Separator",Settings:"Einstellungen","Show key":"Zeige Schlüssel","Simple user":"Normaler Benutzer",Status:"Status",Summary:"Zusammenfassung","Super administrator":"Super-Administrator",To:"Bis",Total:"Total",Type:"Typ",Unknown:"Unbekannt","Unknown sources / Threats":"Unbekannte Quellen / Bedrohungen",unlimited:"unbegrenzt",Update:"Aktualisieren",Updated:"Aktualisieren","Use domain default value":"Standardwert der Domain verwenden",Username:"Benutzername",Week:"Woche","Welcome to Modoboa":"Willkommen zu Modoboa","With a mailbox":"Mit einem Postfach",Year:"Jahr"},HS={},WS={Account:"Cuenta",Actions:"Acciones",Add:"Agregar",Address:"Dirección","Address book information":"Información del libro de direcciones","Administered domains":"Dominios administrados",Administrators:"Administradores",Alias:"Alias",Aliases:"Alias","API access":"Acceso API",Apply:"Aplicar",Authentication:"Autenticación","Bind/named format. Click to copy":"Formato inválido",Categories:"Categorías","Check this option if passwords contained in your file are not crypted":"Marque esta opción si las contraseñas que contiene su fichero no están cifradas",City:"Ciudad",Close:"Cerrar",Company:"Compañía",Confirmation:"Confirmación",Contacts:"Contactos","Continue on error":"Continúe en error.",Country:"País","Create a domain administrator":"Crear un administrador del dominio","Create a mailbox for the administrator.":"Crear mailbox para el administrador.","Create aliases":"Crear alias","Creation date":"Fecha de creación","Crypt passwords":"Contraseñas cifradas",Dashboard:"Panel de Control",Day:"Día","Default mailbox quota":"Cuota de mailbox por defecto","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite.",Description:"Descripción",Disabled:"Deshabilitado","DNS status":"Estado de DNS",Domain:"Dominio","Domain administrator":"Administrador del dominio","Domain created":"Dominio creado",Domains:"Dominios",Email:"Correo-e","Email address":"Dirección de email","Enable DNS checks":"Activar comprobación de DNS",Enabled:"Activado","Expire at":"Caduca en",Forward:"Siguiente","Forward messages and store copies into your local mailbox":"Reenvía mensajes y guarda copias en su mailbox local","Forward updated":"Reenvío actualizado","Full name":"Nombre completo",General:"General",Identities:"Identidades",Import:"Importar","Import domains":"Importar dominios","Import identities":"Importar identidades",Information:"Información","Installed version":"Versión instalada","Keep local copies":"Mantener copias locales","Last modification date":"Última fecha de modificación","Last name":"Apellidos",Level:"Nivel",Logger:"Logger",Logout:"Salir",Mailbox:"Mailboxes",Mailboxes:"Mailboxes",Message:"Uso",Modified:"Modificado",Month:"Mes",More:"Más",Name:"Nombre","New account":"Nueva cuenta","New alias":"Nuevo alias","New domain":"Nuevo dominio",Next:"Siguiente","Not generated":"Sin definir",Note:"Nota","One or more updates are available":"Una o más actualizaciones están disponibles",Options:"Opciones",Password:"Contraseña","Passwords mismatch":"Las contraseñas no coinciden",Phone:"Teléfono","Phone number":"Número de teléfono","Profile updated":"Perfil actualizado","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Cuota en MB para este mailbox. Defina un valor por defecto o use el del dominio por defecto. Déjelo vacío para definir un valor ilimitado (no permitido para los administradores del dominio)","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite.","Random address":"Dirección aleatoria","Random password":"Dirección aleatoria","Recipient(s)":"Destinatario(s)",Recipients:"Destinatarios",Reseller:"Revendedor",Resources:"Recursos","Resources usage":"Uso de recursos",Role:"Rol",Save:"Guardar",Search:"Buscar","Secondary email":"Email secundario","Sender addresses":"Direcciónes de remitente",Separator:"Separador",Settings:"Configuración","Simple user":"Usuario normal","State/Province":"CC.AA./Provincia",Status:"Estatus",Summary:"Sumario","Super administrator":"Super administrador","The credentials are the same than the ones you use to access Modoboa.":"Las credenciales para acceder a este libro de direcciones son las mismas que usa para acceder a Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acceder remotamente a este libro de direcciones (como con Mozilla Thunderbird o desde su smartphone), use la siguiente URL:",Type:"Tipo",Unknown:"Desconocido",unlimited:"ilimitado",Update:"Actualizar",Updated:"Actualizado","Use domain default value":"Usar el valor por defecto del dominio",Username:"Nombre de usuario",Week:"Semana","Welcome to Modoboa":"Bienvenido a Modoboa","With a mailbox":"Con una mailbox",Year:"Año"},YS=JSON.parse(`{"A documentation of the API is available":"API:n dokumentaatio on saatavilla","A new key will be generated soon. Refresh the page in a moment to see it.":"Uusi avain luodaan pian. Päivitä sivu hetken kuluttua nähdäksesi sen.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Käyttäjä, jolla on kaikki oikeudet, voi tehdä mitä tahansa. Oletusarvoisesti tällaisella käyttäjällä ei ole postilaatikkoa, joten hän ei voi käyttää loppukäyttäjän ominaisuuksia.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Käyttäjä, jolla ei ole oikeuksia mutta jolla on postilaatikko. Hän saa käyttää kaikkia loppukäyttäjän ominaisuuksia: webmail, kalenteri, yhteystiedot, suodattimet.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Käyttäjä, jolla on oikeuksia yhdessä tai useammassa verkkotunnuksessa. Hänellä on oikeus hallinnoida postilaatikoita ja hänellä voi myös olla postilaatikko.","Absolute time range":"Määrämittainen aikaraja","Account":"Tili","Actions":"Toiminnot","Add":"Lisää","Add a new domain alias":"Lisää uusi verkkotunnuksen alias","Add administrator":"Lisää järjestelmänvalvoja","Add sender address":"Lisää lähettäjän osoite","Address":"Osoite","Administered domains":"Hallinnoidut verkkotunnukset","Administrator added":"Järjestelmänvalvoja lisäsi","Administrator name":"Järjestelmänvalvojan nimi","Administrator removed":"Järjestelmänvalvoja poistettu","Administrators":"Ylläpitäjät","Alarms":"Hälytykset","Alias":"Alias","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Tämän postilaatikon alias-nimet. Jos haluat luoda catchall-aliaksen, kirjoita vain verkkotunnus (@domain.tld).","Aliases":"Aliakset","API access":"API-pääsy","API token copied to your clipboard":"API-tunniste kopioitu leikepöydälle","API token created":"API-tunniste luotu","API token deleted":"API-tunniste poistettu","Apply":"Käytä","Audit trail":"Tarkastusketju","Authentication":"Tunnistautuminen","Auto configuration":"Automaattinen asetusten määrittäminen","autoconfig record (Mozilla) not found":"autoconfig-tallennetta (Mozilla) ei löydy","autoconfig record (Mozilla): %{ value }":"autoconfig-tietue (Mozilla): %{ value }","autodiscover record (Microsoft) not found":"autodiscover-tietuetta (Microsoft) ei löydy","autodiscover record (Microsoft): %{ value }":"autodiscover-tietue (Microsoft): %{ value }","Back":"Takaisin","Bind/named format. Click to copy":"Bind/nimetty muoto. Kopioi klikkaamalla","Cancel":"Peruuta","Check this option if passwords contained in your file are not crypted":"Valitse tämä vaihtoehto, jos tiedostosi sisältämiä salasanoja ei ole salakirjoitettu","Choose a domain":"Valitse verkkotunnus","Choose a role":"Valitse käyttäjätyyppisi","Close":"Sulje","Confirm and create":"Vahvista ja luo","Confirmation":"Vahvistus","Continue on error":"Jatka virheestä","Control if this domain will be allowed to send and receive messages":"Määritä, saako tämä verkkotunnus lähettää ja vastaanottaa viestejä","Copy to clipboard":"Kopioi leikepöydälle","Copy token to clipboard":"Kopioi turvatunnus leikepöydälle","Create a domain administrator":"Luo verkkotunnuksen ylläpitäjä","Create a mailbox for the administrator.":"Luo ylläpitäjän postilaatikko.","Create aliases":"Luo aliaksia","Create standard aliases for the domain.":"Luo verkkotunnuksen tavanomaiset aliakset.","Creation date":"Luontipäivä","Crypt passwords":"Salakirjoita salasanat","Current password":"Nykyinen salasana","Daily message sending limit":"Päivittäinen viestien lähetysraja","Daily sending limit":"Päivittäinen lähetysraja","Dashboard":"Työpöytä","Date":"Päivämäärä","Day":"Päivä","Default mailbox quota":"Oletuspostilaatikkokiintiö","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Postilaatikoihin sovellettava oletuskiintiö. Voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Arvo 0 tarkoittaa, ettei kiintiötä ole.","Delete":"Poista","Delete token":"Poista avain","Description":"Kuvaus","Disable 2FA":"Poista kaksivaiheinen tunnistautuminen (2FA) käytöstä","Disabled":"Pois käytöstä","DKIM key":"DKIM-avain","DKIM key length":"DKIM-avaimen pituus","DKIM key selector":"DKIM-avaimen valitsin-tietue","DKIM keys already exist for this domain. Do you want to overwrite them?":"DKIM-avaimet ovat jo olemassa tälle verkkotunnukselle. Haluatko korvata ne?","DKIM public key for":"DKIM julkinen avain tietueelle","DKIM record found":"DKIM-tietue löydetty","DKIM record not found":"DKIM-tietuetta ei löydy","DKIM signing":"DKIM-allekirjoitus","DMARC record found":"DMARC-tietue löydetty","DMARC record not found":"DMARC-tietuetta ei löydy","DNS":"DNS","DNS checks":"DNS-tarkistukset","DNS configuration help":"DNS-määritysapu","DNS status":"DNS-tila","Do not delete account folder":"Älä poista tilikansiota","Do not delete domain folder":"Älä poista verkkotunnuksen kansiota","Domain":"Verkkotunnus","Domain administrator":"Luo verkkotunnuksen ylläpitäjä","Domain alias created":"Verkkotunnuksen alias luotu","Domain alias deleted":"Verkkotunnuksen alias poistettu","Domain alias updated":"Verkkotunnuksen alias päivitetty","Domain created":"Verkkotunnus luotu","Domain default value":"Verkkotunnuksen oletusarvo","Domain name (ex: domain.tld)":"Verkkotunnus (esim. domain.tld)","domain's default value":"verkkotunnuksen oletusarvo","Domains":"Sinulla ei ole oikeutta tuoda verkkotunnuksia","Don't treat duplicated objects as errors":"Älä käsittele päällekkäisiä objekteja virheinä","Edit":"Muokkaa","Edit account":"Muokkaa tiliä","Edit alias":"Muokkaa aliasta","Edit domain":"Muokkaa verkkotunnusta","Edit domain alias":"Muokkaa verkkotunnusta","Email":"Sähköposti","Email address":"Sähköpostiosoite","Empty":"Tyhjä","Enable DKIM signing":"Ota DKIM-allekirjoitus käyttöön","Enable DNS checks":"Ota DNS-tarkistukset käyttöön","Enabled":"Käytössä","Enter a simple username or an email address":"Anna yksinkertainen käyttäjätunnus tai sähköpostiosoite","Enter an email address":"Syötä oikean muotoinen sähköpostiosoite","Ex: 10MB. Leave empty for no limit":"Esim: 10 MB. Jätä tyhjäksi, jos et halua rajoitusta","Expire at":"Vanhenee","Export accounts and aliases to CSV":"Vie tilit ja aliakset CSV-tiedostoon","Export domains and aliases to CSV":"Vie verkkotunnukset ja aliakset CSV-tiedostoon","First name":"Etunimi","Forward":"Välitä","Forward messages and store copies into your local mailbox":"Välitä viestit ja tallenna kopiot paikalliseen postilaatikkoon","Forward updated":"Välitystieto päivitetty","From":"Lähde","Full name":"Koko nimi","General":"Yleiset","General information":"Yleiset tiedot","General settings":"Yleiset asetukset","Generate":"Luo","Generate a new DKIM key":"Luo uusi DKIM-avain","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Tässä on esimerkki DNS-määrityksistä (bind-muodossa). Korvaa [ ]:n välissä olevat arvot sopivilla arvoilla.","Identification":"Tunniste","Identities":"Identiteetit","If you close this form now, your modifications won't be saved. Do you confirm?":"Jos suljet tämän lomakkeen nyt, muutokset eivät tallennu. Vahvistatko?","Import":"Tuonti","Import accounts and aliases from CSV file":"Tuo tilejä ja aliaksia CSV-tiedostosta","Import domains":"Tuo verkkotunnuksia","Import domains and aliases from CSV file":"Tuo verkkotunnukset ja aliakset CSV-tiedostosta","Import identities":"Tuo identiteetit","Indicate one or more recipients separated by a comma (,)":"Ilmoita yksi tai useampi vastaanottaja pilkulla (,) erotettuna","Installed version":"Asennettu versio","Keep local copies":"Säilytä paikallisia kopioita","Language":"Kieli","Last login date":"Viimeisin kirjautumispäivä","Last modification date":"Viimeisin muutospäivä","Last name":"Sukunimi","Leave empty for no limit":"Jätä tyhjäksi, jos rajaa ei ole","Level":"Taso","Limitations":"Rajoitukset","Logger":"Lokikirja","Logout":"Kirjaudu ulos","Mailbox":"Postilaatikko","Mailboxes":"Postilaatikot","Message":"Viesti","Message history":"Viestien historia","Message sending limit":"Viestien lähetysraja","messages":"viestit","Messages":"Viestit","Modified":"Muokattu","Modify":"Muokkaa","Month":"Kuukausi","MX records":"MX-tietueet","Name":"Nimi","Name of the administrator":"Ylläpitäjän nimi","Never logged-in":"Ei koskaan kirjautunut sisään","New":"Uusi","New account":"Uusi tili","New alias":"Uusi alias","New domain":"Uusi verkkotunnus","New recovery codes":"Uudet palautuskoodit","Next":"Seuraava","no":"ei","No":"Ei","No sender address defined for this account":"Tälle tilille ei ole määritelty lähettäjän osoitetta","No sending limit":"Ei lähetysrajaa","Not generated":"Ei luotu","Number of messages this domain can send per day. Leave empty for no limit.":"Viestien määrä, jonka tämä verkkotunnus voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Viestien määrä, jonka tämä postilaatikko voi lähettää päivässä. Jätä tyhjäksi, jos et halua rajoitusta.","OK":"OK","One or more updates are available":"Yksi tai useampi päivitys on saatavilla","Opened alarms":"Avatut hälytykset","Options":"Vaihtoehdot","Parameters updated":"Parametrit päivitetty","Password":"Salasana","Password copied to clipboard":"Salasana kopioitu leikepöydälle","Password updated":"Salasana päivitetty","Passwords mismatch":"Salasanat eivät täsmää","Pending":"Odottaa","Period":"Jakso","Phone number":"Puhelinnumero","Pin code":"Pin-koodi","Problem":"Ongelma","Proceed":"Jatka","Profile":"Profiili","Profile updated":"Profiili päivitetty","Provide a CSV file where lines respect one of the following formats:":"Toimita CSV-tiedosto, jonka rivit ovat jossakin seuraavista muodoista:","Queue ID":"Jonon ID","Quota":"Verkkotunnuksen oletuskiintiö","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Tämän postilaatikon kiintiö, joka voidaan ilmaista kilotavuina, megatavuina (oletus) tai gigatavuina. Määritä oma arvo tai käytä toimialueen oletusarvoa. Jätä tyhjäksi, jos haluat määrittää rajoittamattoman arvon (ei sallittu toimialueen ylläpitäjille).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Postilaatikoiden kesken jaettu kiintiö. Voidaan ilmaista kilotavuina (KB), megatavuina (MB) (oletus) tai gigatavuina (GB). Arvo 0 tarkoittaa, ettei kiintiötä ole.","Random address":"Satunnainen osoite","Random password":"Satunnainen salasana","Raw format. Click to copy":"Raakamuoto. Kopioi napsauttamalla","Recipient(s)":"Vastaanottaja(t)","Recipients":"Vastaanottajat","Register":"Rekisteröidy","Relative time ranges":"Suhteelliset aikavälialueet","Relay":"Välitysrele","Remove this address":"Poista tämä osoite","Remove this administrator":"Poista tämä ylläpitäjä","Reseller":"Jälleenmyyjä","Resources":"Resurssit","Resources usage":"Resurssien käyttö","Role":"Rooli","Save":"Tallenna","Search":"Hae","Secondary email":"Toissijainen sähköpostiosoite","Select an account":"Valitse tili","Select file":"Valitse tiedosto","Sender address added":"Lähettäjän osoite lisätty","Sender address deleted":"Lähettäjän osoite poistettu","Sender addresses":"Lähettäjän osoitteet","Sending limit":"Lähetysraja","Separator":"Erotin","Service":"Palvelu","Settings":"Asetukset","Show key":"Näytä avain","Simple user":"Yksinkertainen käyttäjä","Specify an email address":"Määritä sähköpostiosoite","SPF record found":"SPF-tietue löydetty","SPF record not found":"SPF-tietuetta ei löydy","Start typing a name here...":"Aloita nimen kirjoittaminen tästä...","Status":"Tila","Summary":"Yhteenveto","Super administrator":"Pääylläpitäjä","The first element of each line is mandatory and must be equal to one of the previous values.":"Kunkin rivin ensimmäinen elementti on pakollinen, ja sen on oltava yhtä suuri kuin jokin edellisistä arvoista.","To":"Vastaanottaja","Transport":"Siirto","Type":"Tyyppi","Unknown":"Tuntematon","unlimited":"rajoittamaton","Update":"Päivitä","Update Password":"Vaihda salasana","Update settings":"Päivitä asetukset","Updated":"Päivitetty","Use domain default value":"Käytä verkkotunnuksen oletusarvoa","Username":"Käyttäjätunnus","Username:":"Käyttäjätunnus:","Valid":"Kelvollinen","Warning":"Varoitus","Week":"Viikko","Welcome to Modoboa":"Tervetuloa Modoboaan","With a mailbox":"Postilaatikolla","With mailbox":"Postilaatikolla","Year":"Vuosi","yes":"kyllä","Yes":"Kyllä","You are about to delete your API access token":"Olet poistamassa API-pääsytunnistetta","You can use a different character as separator.":"Voit käyttää erottimena eri merkkiä.","Your API token has not been generated yet.":"API-pääsytunnistetta ei ole vielä luotu.","Your API token is:":"API-pääsytunnisteesi on:"}`),VS=JSON.parse(`{"(the domain will be created locally)":"(Le domaine sera créé automatiquement)","%{ n } event imported":["%{n} évènement importé","%{ n} évènements importés","%{n} évènements importés"],"A documentation of the API is available":"Une documentation de l'API est disponible","A new key will be generated soon. Refresh the page in a moment to see it.":"Une nouvelle clé sera générée bientôt. Actualisez dans un moment la page pour la voir.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Un utilisateur ayant tous les privilège, peut tout faire. Par défaut, il n'a pas de boîte mail et ne peut donc pas accéder aux fonctionnalités d'un utilisateur final.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Un utilisateur sans privilèges mais ayant une boîte mail. Il sera autorisé à utiliser toutes les fonctionnalités de l'utilisateur final : webmail, calendrier, contacts, filtres.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Un utilisateur avec des privilèges sur un ou plusieurs domaines. Il sera autorisé à administrer les boîtes mail et il peut avoir aussi une boîte aux lettres.","Absolute time range":"Plage de temps absolue","Access rules":"Règles d'accès","Account":"Compte","Account deleted":"Compte supprimé","Account settings":"Paramètres du compte","Accounts":"Comptes","Actions":"Actions","Activate filter set":"Activer le jeu de filtre","Activate your auto reply from this date":"Activez votre réponse automatique à partir de cette date","Activate your auto reply until this date":"Activez votre réponse automatique jusqu'à cette date","active":"actif","Active":"Actif","Add":"Ajouter","Add a category":"Ajouter une catégorie","Add a new domain alias":"Ajouter un nouvel alias de domaine","Add action":"Ajouter une action","Add administrator":"Ajouter un administrateur","Add category":"Ajouter une catégorie","Add condition":"Ajouter une condition","Add filter set":"Ajouter un jeu de filtre","Add new filter":"Ajouter un nouveau filtre","Add sender address":"Ajouter l'adresse de l'expéditeur","Add to contacts":"Ajouter aux contacts","Add/Remove from the domain page":"Ajouter/Supprimer depuis la page du domaine","Added On":"Ajouté le","Address":"Adresse","Address (hostname or IP)":"Adresse (nom d'hôte ou IP)","Address book information":"Information du carnet d'adresse","Administered domains":"Domaines administrés","Administrator added":"L'administrateur a ajouté","Administrator name":"Nom de l'administrateur","Administrator removed":"Administrateur supprimé","Administrators":"Administrateurs","Administrators of":"Administrateurs de","Alarm closed":"Alarme fermée","Alarm deleted":"Alarme supprimée","Alarm re-opened":"Alarme ré-ouverte","Alarms":"Alarmes","Alarms deleted":"Alarmes supprimées","Alias":"Alias","Alias already added":"Alias déjà ajouté","Alias already exists, redirecting to edit page":"L'alias existe déjà, redirection vers la page de modification","Alias deleted":"Alias supprimé","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Alias(s) de cette boîte aux lettres. Pour créer un alias fourre-tout, entrer uniquement le nom du domaine (@domain.tld).","Aliases":"Alias","Alignment":"Alignement","All messages":"Tous les messages","All of the following":"Tous les éléments suivants","An intermediate user who has the same privileges than a Domain administrator, plus the possibility to create domains and to assign resources.":"Un utilisateur intermédiaire qui a les mêmes privilèges qu'un administrateur de domaine, et la possibilité de créer des domaines et d'affecter des ressources.","Any of the following":"Un des éléments suivants","API access":"Accès API","API token copied to your clipboard":"Jeton API copié dans votre presse-papier","API token created":"Jeton API créé","API token deleted":"Jeton API supprimé","Apply":"Appliquer","Are you sure you want to delete this alias?":"Voulez-vous réellement supprimer cet alias ?","Are you sure you want to delete this identity ?":"Voulez-vous réellement supprimer cette identité ?","Associated domain":"Domaine associé","Associated domains":"Domaines associés","Attach":"Joindre","Attachments":"Pièce jointes","Attempting to log you in.":"Tentative de connexion.","Attendees":"Participants","Audit trail":"Journal des modifications","Authentication":"Authentification","Auto configuration":"Configuration automatique","Auto-reply message":"Message de réponse automatique","Auto-reply message updated":"Message de réponse automatique mis à jour","autoconfig record (Mozilla) not found":"Enregistrement autoconfig (Mozilla) introuvable","autoconfig record (Mozilla): %{ value }":"Enregistrement autoconfig (Mozilla) : %{ value }","autodiscover record (Microsoft) not found":"Enregistrement autodiscover (Microsoft) non trouvé","autodiscover record (Microsoft): %{ value }":"Enregistrement autodiscover (Microsoft): %{ value }","Back":"Retour","Backup codes":"Codes de récupération","Bcc":"Cci","Bind/named format. Click to copy":"Format bind/named. Cliquez pour copier","Birth date":"Date de naissance","Calendar":"Calendrier","Calendar created":"Calendrier créé","Calendar deleted":"Calendrier supprimé","Calendar information":"Information du calendrier","Calendar sharing":"Partage de calendrier","Calendar updated":"Calendrier mis à jour","Cancel":"Annuler","Categories":"Catégories","Category deleted":"Catégorie supprimée","Cc":"Cc","Change the value of <strong>Default password scheme</strong>":"Changez la valeur de <strong>Méthode de chiffrement par défaut</strong>","Check connection:":"Vérifier la connexion :","Check out the following list to find related components":"Consulter la liste suivante pour trouver des composants associés","Check this option if passwords contained in your file are not crypted":"Cochez cette option si les mots de passe contenus dans votre fichier ne sont pas chiffrés","Choose a domain":"Choisissez un domaine","Choose a header":"Choisissez un entếte","Choose a role":"Choisissez un rôle","Choose an action":"Choisissez une action","Choose an operator":"Choisissez un opérateur","Choose columns to display":"Choisir les colonnes à afficher","City":"Ville","Click here to copy the key":"Cliquer ici pour copier la clé","Close":"Fermer","Close alarm":"Fermer l'alarme","Closed":"Fermé","Color":"Couleur","Company":"Société","Compose":"Ecrire","Compress this mailbox":"Compresser cette boîte aux lettres","Conditions":"Conditions","Confirm and create":"Confirmer et créer","Confirmation":"Confirmation","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Félicitations ! L'authentification à deux facteurs utilisant des mots de passe jetable est désormais active pour votre compte.","Contact added to address book":"Contact ajouté au carnet d'adresse","Contacts":"Contacts","Content":"Contenu","Continue on error":"Continuer en cas d'erreur","Control if this domain will be allowed to send and receive messages":"Contrôler si ce domaine sera autorisé à envoyer et recevoir des messages.","Copy key to clipboard":"Copier la clé dans la presse-papiers","Copy to clipboard":"Copier dans le presse-papiers","Copy token to clipboard":"Copier le jeton dans la presse-papiers","Could not save parameters":"Impossible de sauvegarder les paramètres","Country":"Pays","Create":"Créer","Create a domain administrator":"Créer un administrateur de domaine","Create a mailbox for the administrator.":"Créer une boite aux lettres pour l'administrateur","Create a new filter set":"Créer un nouveau jeu de filtre","Create a new mailbox":"Créer une nouvelle boîte aux lettres","Create aliases":"Créer des alias","Create new mailbox":"Créer une nouvelle boîte aux lettres","Create standard aliases for the domain.":"Créer des aliases standard pour le domaine","Creation date":"Date de création","Creation denied":"Création interdite","Crypt passwords":"Chiffrer les mots de passe","CSV seems to be badly formatted":"Le fichier CSV semble être mal formaté","Current password":"Mot de passe actuel","Customize displayed columns":"Personnaliser les colonnes affichées","Daily message sending limit":"Limite quotidienne d'envoi de messages","Daily sending limit":"Limite d'envoi quotidienne","Dashboard":"Tableau de bord","Date":"Date","Day":"Jour","Default mailbox quota":"Quota par défaut pour une boîte aux lettres","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Quota par défaut appliqué aux boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota.","Delete":"Supprimer","Delete filter set":"Supprimer le jeu de filtre","Delete this mailbox":"Supprimer cette boite aux lettres","Delete this mailbox?":"Supprimer cette boite aux lettres ?","Delete token":"Supprimer le jeton","Description":"Description","Detail":"Détail","Disable":"Desactiver","Disable 2FA":"Désactiver l'authentification à double facteur","Disable links":"Desactiver les liens","Disabled":"Désactivés","Display address book information":"Afficher les informations du carnet d'adresse","Display name":"Nom affiché","Display source":"Afficher la source","DKIM key":"Clé DKIM","DKIM key copied to clipboard":"Clé DKIM copiée dans le presse-papier","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"La génération de la clé DKIM ne semble pas avoir eu lieu ou a échoué. Voulez vous replanifier cette action ?","DKIM key length":"Longeur de clé DKIM","DKIM key selector":"Sélecteur de clé DKIM","DKIM keys already exist for this domain. Do you want to overwrite them?":"Des clés DKIM existent déjà pour ce domaine. Voulez-vous les écraser?","DKIM public key for":"Clé publique DKIM pour ","DKIM record found":"Enregistrement DKIM trouvé","DKIM record not found":"Enregistrement DKIM introuvable","DKIM signing":"Signature DKIM","DMARC":"DMARC","DMARC record found":"Enregistrement DMARC trouvé","DMARC record not found":"Enregistrement DMARC introuvable","DMARC support does not seem to be enabled for this domain.":"La support DMARC ne semble pas actif pour ce domaine.","DNS":"DNS","DNS checks":"Vérifications DNS","DNS configuration for ":"Configuration DNS pour","DNS configuration help":"Aide à la configuration du DNS","DNS status":"Statut DNS","Do not delete account folder":"Ne pas supprimer le dossier du compte","Do not delete domain folder":"Ne pas supprimer le dossier des domaines","Do you really want to delete the domain %{ domain }?":"Voulez-vous réellement supprimer le domaine %{ domaine } ?","Do you really want to delete this calendar?":"Voulez-vous vraiment supprimer ce calendrier ?","Do you really want to delete this WebAuthn device?":"Voulez vous vraiment supprimer ce périphérique Webauthn ?","Domain":"Domaine","Domain administrator":"Administrateur de domaine","Domain alias created":"Alias de domaine créé","Domain alias deleted":"Alias de domaine supprimé","Domain alias updated":"Alias de domaine mise à jour","Domain created":"Domaine créé","Domain default value":"Valeur du domaine par défaut","Domain deleted":"Supprimer le domaine","Domain name (ex: domain.tld)":"Nom de domaine (ex: domaine.tld)","domain's default value":"La valeur par défaut du domaine","Domains":"Domaines","Don't treat duplicated objects as errors":"Ne pas traiter les objets dupliqués comme des erreurs","Download filter set":"Télécharger le jeu de filtre","E-mail":"Courriel","Edit":"Modifier","Edit account":"Modifier le compte","Edit alias":"Modifier l'alias","Edit calendar":"Modifier le calendrier","Edit category":"Modifier la catégorie","Edit contact":"Modifier le contact","Edit domain":"Modifier le domaine","Edit domain alias":"Modifier l'alias de domaine","Edit event":"Modifier l'évènement","Edit filter":"Modifier le filtre","Edit mailbox":"Modifier la boite aux lettres","Edit provider":"Modifier le fournisseur","Edit this mailbox":"Modifier cette boite aux lettres","Edit your device":"Modifier votre périphérique","Edition":"Modification","Email":"E-mail","Email address":"Adresse email","Email providers":"Fournisseurs de messagerie","Email sent":"Message envoyé","Empty":"Vide","Empty mailbox":"Vider la boite aux lettres","Enable":"Activer","Enable DKIM signing":"Activer la signature DKIM","Enable DNS checks":"Activer les tests DNS","Enable links":"Activer les liens","Enabled":"Activé","Enter a name to register a new webauthn device.":"Renseignez un nom pour enregistrer un nouveau périphérique webauthn.","Enter a simple username or an email address":"Entrer un nom d'utilisateur simple ou une adresse e-mail","Enter an email address":"Entrer une adresse e-mail","Event added":"Evènement ajouté","Event deleted":"Evènement supprimé","Event updated":"Evènement mis à jour","Ex: 10MB. Leave empty for no limit":"Ex: 10MB. Laisser vide pour aucune limite","Expire at":"Expire le","Export accounts and aliases to CSV":"Exporter les comptes et les alias au format CSV","Export domains and aliases to CSV":"Exporter les domaines et les alias au format CSV","Failed":"Échoué","Failed to display template. Using raw mode":"Impossible d'afficher le modèle. Utilisation du mode brut","Feel free to improve the translations":"N'hésitez pas à améliorer les traductions","Field is required":"Ce champ est requis","Filter added":"Filtre ajouté","Filter disabled":"Filtre desactivé","Filter enabled":"Filtre activé","Filter removed":"Filtre supprimé","Filter set activated":"Jeu de filtre activé","Filter set created":"Jeu de filtre créé","Filter set removed":"Jeu de filtre supprimé","Filter set updated":"Jeu de filtre mis à jour","Filter updated":"Filtre mis à jour","Filters":"Filtres","First name":"Prénom","Forward":"Transfert","Forward messages and store copies into your local mailbox":"Transférer les messages et stocker des copies dans votre boîte aux lettres locale","Forward updated":"Transfert mise à jour","Forwarded":"Transféré","Forwarders with ARC":"Transporteur avec ARC","From":"De","Full address":"Adresse complète","Full name":"Nom complet","Fully aligned":"Entièrement aligné","General":"Général","General information":"Information générale","General settings":"Paramètres généraux ","Generate":"Générer","Generate a new DKIM key":"Générer une nouvelle clé DKIM","Generated address":"Adresse générée","Go to <strong>Settings > General</strong> section":"Allez dans la section <strong>Paramètres > Général</strong>","here":"ici","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Voici un exemplaire de configuration DNS (format bind). Remplacer les valeurs entre [ ] par les valeurs appropriées.","Identification":"Identification","Identities":"Identités","If you close this form now, your modifications won't be saved. Do you confirm?":"Si vous fermez ce formulaire maintenant, vos modifications ne seront pas sauvegardées. Confirmez-vous ?","If you configured it recently, please wait for the first report to be received and processed.":"Si vous l'avez récemment configuré, veuillez attendre que le premier rapport soit reçu et traité. ","IMAP Migration":"Migration IMAP","IMAP Port":"Port IMAP","Import":"Importer","Import accounts and aliases from CSV file":"Importation de comptes et alias à partir d'un fichier CSV","Import domains":"Importer des domaines","Import domains and aliases from CSV file":"Importation de domaines et alias à partir d'un fichier CSV","Import events":"Importer des évènements","Import identities":"Importer des identités","Important messages":"Messages importants","inactive":"inactif","Indicate one or more recipients separated by a comma (,)":"Indiquer un ou plusieurs destinataires séparés par une virgule (,) ","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informez <strong>TOUS</strong> vos utilisateurs qu'ils doivent se connecter à Modoboa pour compléter cette opération","Information":"Information","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Installez un logiciel d'authentification de jeton comme FreeOTP ou google\\n Authentification depuis votre magasin d'applications et utilisez\\n cette application pour scanner ce QR code.","Installed components":"Composants installés","Installed version":"Version installée","Invalid port number":"Numéro de port incorrect","Is the IMAP connection secured using SSL/TLS or StartTLS":"La connexion IMAP est-elle sécurisée via l'utilisation de SSL/TLS ou StartTLS","Keep local copies":"Conserver des copies locales","Language":"Langage","Language does no exist":"Cette langue n'existe pas","Last login":"Dernière connexion","Last login date":"Date de dernière connexion","Last modification":"Dernière modification","Last modification date":"Date de dernière modification","Last name":"Nom de famille","Last Name":"Nom","Last Used":"Dernière utilisation","Latest news":"Dernières nouvelles","Latest version":"Dernière version","Leave empty for no limit":"Laisser vide pour aucune limite","Less":"Moins","Level":"Niveau","Limitations":"Limites","Local domain (optional)":"Domaine local (optionnel)","Logger":"Logger","Logout":"Déconnexion","Logout / Login with your current account so its password gets updated":"Re-connectez vous avec votre compte courant pour que son mot de passe soit mis à jour","Mailbox":"Boîte aux lettres","Mailbox compressed":"Boite aux lettres compressées","Mailbox created":"Boite aux lettres créée","Mailbox deleted":"Boite aux lettres supprimée","Mailbox renamed":"Boite aux lettres renommée","Mailboxes":"Boîtes aux lettres","Make sure <strong>Update password scheme at login</strong> option is enabled":"Assurez vous que l'option <strong>Mettre à jour la méthode de chiffrement du mot de passe à la connexion</strong> est activée","Mark as followed":"Marquer comme suivi","Mark as read":"Marqué comme lu","Mark as unfollowed":"Marqué comme non suivi","Mark as unread":"Marquer comme non lu","MB":"Mo","Message":"Message","Message deleted":"Marquer comme supprimé","Message filters":"Filtres de messages","Message history":"Historique des messages","Message marked as junk":"Message marqué comme pourriel","Message marked as not junk":"Message marqué comme légitime","Message sending limit":"Limite d'envoi des messages","Message(s) deleted":"Message(s) supprimé(s)","Message(s) flagged":"Message(s) marqué(s)","Message(s) marked as junk":"Message(s) marqués comme pourriel","Message(s) marked as not junk":"Message(s) marqué(s) comme légitime(s)","messages":"messages","Messages":"Messages","Migration deleted":"Migration supprimée","Migrations":"Migrations","Minimum length is %{ length }":"La taille minimale est %{ length }","Modified":"Modifié","Modify":"Modifier","Monitoring":"Supervision","Month":"Mois","More":"Plus","Move down":"Déplacer vers le bas","Move up":"Déplacer vers le haut","Must be a numeric value or empty":"Valeur numérique requise, ou pas de valeur","MX records":"Enregistrements MX","My calendars":"Mes calendriers","name":"nom","Name":"Nom","Name of the administrator":"Nom de l'administrateur","Name of the domain to migrate":"Nom du domaine à migrer","Name:":"Nom :","Name: ":"Nom :","Never":"Jamais","Never logged-in":"Jamais connecté","New":{"":"Nouvelle","male":"Nouveau"},"New account":"Nouveau compte","New alias":"Nouvel alias","New calendar":"Nouveau calendrier","New contact":"Nouveau contact","New device name":"Nom du nouveau périphérique","New domain":"Nouveau domaine","New event":"Nouvel évènement","New filter":"Nouveau filtre","New provider":"Nouveau fournisseur","New recovery codes":"Nouveaux codes de récupération","Next":"Suivant","no":"non","No":"Non","No associated domains":"Aucun domaine associé","No data to export":"Aucune donnée à exporter","No domain managed":"Aucun domaine géré","No message yet in this mailbox":"Aucun message dans cette boite aux lettres","No quota":"Pas de quota","No sender address defined for this account":"Aucune adresse d'expéditeur définie pour ce compte","No sending limit":"Pas de limite d'envoi","No two-factor authentificator is yet set for your account.":"Aucune authentification à deux facteurs n'est encore active pour votre compte.","Not a valid email":"Ce n'est pas un email correct","Not generated":"Non générée","Note":"Note","Number of allowed mailbox aliases:":"Nombre d'alias autorisé :","Number of allowed mailboxes:":"Nombre de boites aux lettres autorisé :","Number of associated alias:":"Nombre d'alias associés :","Number of associated domains:":"Nombre de domaines associés :","Number of messages this domain can send per day. Leave empty for no limit.":"Nombre de messages que ce domaine peut envoyer par jour. Laisser vide pour aucune limite.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Nombre de messages que cette boîte aux lettres peut envoyer par jour. Laisser vide pour aucune limite.","OK":"OK","Old account":"Ancien compte","on":"le","One or more updates are available":"Une ou plusieurs mise à jour sont disponibles","One-time passwords":"Mots de passe jetables","Opened":"Ouvert","Opened alarms":"Alarmes ouvertes","Options":"Options","or suggest a new language":"ou suggérer une nouvelle langue","Parameters updated":"Paramètres mis à jour","Parent mailbox":"Boite aux lettres parent","Partially aligned":"Partiellement aligné","Partially trusted sources / Forwarders":"Sources partiellement fiables / Transitaires","Password":"Mot de passe","Password copied to clipboard":"Mot de passe copié dans la presse-papier","Password mismatch":"Le mot de passe est différent","Password updated":"Mot de passe mis à jour","Passwords mismatch":"Les mots de passe diffèrent","Pending":"En attente","Period":"Période","Phone":"Téléphone","Phone number":"Numéro de téléphone","Pin code":"Code Pin","Please add at least one recipient.":"Veuillez ajouter au moins un destinataire","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Veuillez noter que vous verrez ce message jusqu'à ce que <strong>TOUS</strong> les mots de passe de vos utilisateurs aient été convertis en utilisant la nouvelle méthode.","Port":"Port","Position":"Rôle","Problem":"Problème","Proceed":"Procéder","Profile":"Profil","Profile updated":"Profil mis à jour","Provide a CSV file where lines respect one of the following formats:":"Fournir un fichier CSV dont les lignes respectent l'un des formats suivants:","Provide one or more addresses":"Fournir une ou plusieurs adresses","Provider":"Fournisseur","Provider created":"Fournisseur créé","Provider deleted":"Fournisseur supprimé","Provider name":"Nom du fournisseur","Provider updated":"Fournisseur mis à jour","Providers":"Fournisseurs","Queue ID":"ID de file","Quota":"Quota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Quota pour cette boite. Peut être exprimé en Ko, Mo (défaut) ou Go. Définir une valeur spécifique ou utiliser la valeur par défaut du domaine. Laisser vide pour définir une valeur illimitée (interdit pour les admins. de domaine).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota.","Quota: ":"Quota :","Random address":"Adresse aléatoire","Random password":"Mot de passe aléatoire","Raw format. Click to copy":"Format brut. Cliquer pour copier","Raw mode":"Mode brut","Read":"Lecture","Recipient(s)":"Destinataire(s)","Recipients":"Destinataires","Register":"Enregistrer","Register authenticator":"Enregistrer l'authentificateur","Registered Webauthn devices":"Péréphériques Webauthn enregistrés","Relative time ranges":"Intervalles des temps relatifs","Relay":"Relais","Relay domain":"Domaine relais","Reload":"Recharger","Remove action":"Supprimer l'action","Remove condition":"Supprimer la condition","Remove this address":"Supprimer cette adresse","Remove this administrator":"Supprimer cet administrateur","Reopen alarm":"Ré-ouvrir l'alarme","Reply":"Répondre","Reply all":"Répondre à tous","Reseller":"Revendeur","Reset recovery codes":"Rénitialiser les codes de récupération","Resources":"Ressources","Resources usage":"Utilisation des ressources","Role":"Rôle","Save":"Enregistrer","Save your changes":"Sauvegardez vos changements","Search":"Chercher","Search in messages":"Chercher dans les messages","Secondary email":"E-mail secondaire","Secured":"Sécurisé","Select a filter set":"Sélectionner un jeu de filtre","Select an account":"Sélectionner un compte","Select an ICS file":"Sélectionner un fichier ICS","Select an ICS file to import and click on the Send button":"Sélectionner un fichier ICS à importer et cliquer sur le bouton Envoyer","Select file":"Sélectionner un fichier","Send":"Envoyer","Send only":"Envoi uniquement","Send only account":"Compte limité à l'envoi","Sender address added":"Adresse d'expédition ajoutée","Sender address deleted":"Adresse d'expédition supprimée","Sender addresses":"Adresses d'expédition","Sending limit":"Limite d'envoi","Sending limit: ":"Limite d'envoi :","Separator":"Séparateur","Service":"Service","Service: ":"Service :","Settings":"Paramètres","Setup device":"Configurer le périphérique","Show key":"Afficher la clé","Simple user":"Utilisateur simple","Specify an email address":"Spécifier une adresse e-mail","SPF record found":"Enregistrement SPF trouvé","SPF record not found":"Enregistrement SPF introuvable","Start typing a name here...":"Commencer à saisir un nom ici...","State/Province":"Etat/Région","Statistics":"Statistiques","Status":"Statut","Subject":"Sujet","Summary":"Résumé","Super administrator":"Super administrateur","Synchronization started":"Synchronisation démarée","Synchronize contacts with address book":"Synchroniser les contacts avec le carnet d'adresse","TFA enabled":"TFA activée","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"Le contenu de votre réponse. Vous pouvez utiliser les variables suivantes, qui seront automatiquement remplacées par les valeurs appropriées : %(name)s, %(fromdate)s, %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"Les identifiants sont les mêmes que ceux utilisés pour accéder à Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"Le premier élément de chaque ligne est obligatoire et doit être égal à l'une des valeurs précédentes.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Les codes de récupération suivants peuvent être utilisés une fois chacun pour vous permettre de récupérer un accès à votre compte, au cas où vous perdriez votre téléphone par exemple. Assurez-vous de les conserver dans un lieu sûr, autrement vous ne serez définitivement plus en mesure d'accéder à votre compte.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"La méthode de chiffrement de mot de passe que vous utilisez a été rendue obsolète et sera retirée dans la prochaine version mineure. La procédure de mise à jour vers une méthode plus sûre est la suivante :","there":"ici","Title":"Titre","To":"A","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Pour accéder à ce carnet d'adresse depuis l'extérieur (comme Mozilla Thunderbird ou votre smartphone), utilisez l'URL suivante :","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Pour accéder à ce calendrier depuis l'extérieur (comme Mozilla Thunderbird ou votre smartphone), utilisez l'URL suivante :","Total":"Total","TOTP enabled":"TOTP activé","Transport":"Transport","Triggered":"Déclenché","Trusted sources":"Sources de confiance","Two-factor auth":"Authentification à deux facteurs","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"L'authentification à deux facteurs (2FA) utilisant des mots de passe jetables n'est pas encore activée pour votre compte.","Two-factor authentication using one-time passwords is enabled for your account.":"L'authentification à deux facteurs utilisant des mots de passe jetables est active pour votre compte.","Type":"Type","Type: ":"Type :","Unknown":"Inconnu","Unknown sources / Threats":"Sources inconnues / Menaces","unlimited":"illimité","Unlimited":"illimité","Until":"Jusqu'au","Update":"Mettre à jour","Update auto-reply":"Mettre à jour la réponse automatique","Update contact":"Mettre à jour le contact","Update Password":"Mise à jour du mot de passe","Update settings":"Mise à jour des paramètres","Updated":"Mis à jour","Use count":"Nombre d'utilisations","Use domain default value":"Utiliser la valeur par défaut du domaine","Username":"Nom d'utilisateur","Username:":"Nom d'utilisateur :","Valid":"Valide","Value":"Valeur","Visit the official weblog for more information":"Visitez le weblog officiel pour plus d'information","warning":"Avertissement","Warning":"Avertissement","WebAuthn":"WebAuthn","WebAutn enabled":"WebAuthn activé","Webmail":"Webmail","Week":"Semaine","Welcome to Modoboa":"Bienvenue dans Modoboa","With a mailbox":"Avec une boite aux lettres","With mailbox":"Avec boîte aux lettres","Write":"Ecriture","Year":"Année","yes":"oui","Yes":"Oui","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Vous avez déjà généré des codes de récupération pour ce compte. Si vous ne vous en souvenez plus ou que vous les avez tous utilisés, vous pouvez en générer de nouveaux.","You are about to delete your API access token":"Vous êtes sur le point de supprimer votre jeton d'accès à l'API","You can also share a read-only version of this calendar using the following URL: ":"Vous pouvez aussi partager une version en lecture seule de ce calendrier en utilisant l'URL suivante :","You can update your password from the Account section":"Vous pouvez mettre à jour votre mot de passer depuis la section Mon compte","You can use a different character as separator.":"Vous pouvez utiliser autre caractère comme séparateur","You don't have any WebAuthN device registered as a second authentication method.":"Vous n'avez aucun périphérique WebAuthn enregistré en tant que seconde méthode d'authentification.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Vous devez appliquer cette procédure <strong>AVANT</strong> d'installer une nouvelle version de Modoboa, autrement <strong>vous ne pourrez plus vous connecter à l'interface web</strong>.","You need to bind at least one domain to the provider.":"Vous devez associer au moins un domaine à ce fournisseur.","Your API token has not been generated yet.":"Votre jeton API n'a pas encore été généré.","Your API token is:":"Votre jeton API est :","Your browser does not seem compatible with WebAuthN":"Votre navigateur ne semble pas compatible avec WebAuthN","Zip code":"Code postal"}`),XS={},US={Account:"Account",Actions:"Azioni",Add:"Aggiungi",Address:"Indirizzi","Address book information":"Informazioni di rubrica","Administered domains":"Domini amministrati",Administrators:"Amministratori",Alias:"Alias",Aliases:"Alias","API access":"Accesso API",Apply:"Applica",Authentication:"Autenticazione","Bind/named format. Click to copy":"Formato bind/named",Categories:"Categorie","Check this option if passwords contained in your file are not crypted":"Seleziona questa opzione se le password contenute nel file non sono criptate",City:"Città",Close:"Chiudi",Closed:"Chiudi",Company:"Azienda",Confirmation:"Conferma",Contacts:"Contatti","Continue on error":"Continuare in caso di errore",Country:"Paese","Create a domain administrator":"Crea un amministratore di dominio","Create a mailbox for the administrator.":"Crea una casella di posta per l'amministratore.","Create aliases":"Crea alias","Creation date":"Data di creazione","Crypt passwords":"Cripta le password",Day:"Giorno","Default mailbox quota":"Dimensione massima predefinita per le mailbox","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite.",Description:"Descrizione",Disabled:"Disabilitato","DKIM key":"Chiave DKIM",DNS:"DNS","DNS status":"Stato del DNS",Domain:"Dominio","Domain administrator":"Amministratore di dominio","Domain created":"Dominio creato",Domains:"Domini",Email:"Email","Email address":"Indirizzo email","Enable DKIM signing":"Abilita la firma DKIM","Enable DNS checks":"Abilita i controlli DNS",Enabled:"Abilitato","Expire at":"Scade il",Failed:"Fallito",Forward:"Inoltra","Forward messages and store copies into your local mailbox":"Inoltra i messaggi e memorizza le copie nella tua casella di posta locale","Forward updated":"Inoltro aggiornato","Full name":"Nome completo",General:"Generale",Identities:"Identità",Import:"Importa","Import domains":"Importa domini","Import identities":"Identità di importazione",Information:"Informazioni","Installed version":"Versione installata","Keep local copies":"Mantieni copie locali","Last modification date":"Data dell'ultima modifica","Last name":"Cognome",Level:"Livello",Logger:"Logger",Logout:"Esci",Mailbox:"Caselle di posta",Mailboxes:"Caselle di posta",Message:"Utilizzo",Modified:"Modificato",Month:"Mese",More:"Più informazioni",Name:"Nome","New account":"Nuovo account","New alias":"Nuovo alias","New domain":"Nuovo dominio",Next:"Successivo","Not generated":"Non generata",Note:"Note","One or more updates are available":"Sono disponibili nuovi aggiornamenti",Options:"Opzioni","Partially aligned":"Parzialmente allineato",Password:"Password","Passwords mismatch":"Le password non corrispondono",Phone:"Telefono","Phone number":"Numero di telefono",Profile:"Profilo","Profile updated":"Profilo aggiornato",Quota:"Dimensione massima","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Dimensione massima per questa mailbox, può essere espressa in KB, MB (predefinito) o GB. Definire un valore personalizzato o utilizzare quello predefinito per il dominio. Lasciare vuoto per specificare un valore non limitato (non permesso per amministratori di dominio).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite.","Random address":"Indirizzo casuale","Random password":"Password casuale","Recipient(s)":"Destinatario(i)",Recipients:"Destinatari",Reseller:"Rivenditore",Resources:"Risorse","Resources usage":"Utilizzo risorse",Role:"Ruolo",Save:"Salva",Search:"Cerca","Secondary email":"Email secondaria","Sender addresses":"Indirizzi mittenti",Separator:"Separatore",Settings:"Impostazioni","Show key":"Visualizza chiave","Simple user":"Utente semplice","State/Province":"Provincia",Status:"Stato",Summary:"Sommario","Super administrator":"Super amministratore","The credentials are the same than the ones you use to access Modoboa.":"Le credenziali sono le stesse con cui accedi a Modoboa.","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Per accedere a questa rubrica da applicazioni esterne (es. Mozilla Thunderbird o il tuo smartphone), usa la seguente URL:",Total:"Totale",Transport:"Trasporto",Type:"Tipo",Unknown:"Sconosciuto","Unknown sources / Threats":"Fonti sconosciute / Minaccie",unlimited:"senza limiti",Update:"Aggiorna",Updated:"Aggiornato","Use domain default value":"Usa il valore predefinito",Username:"Nome utente",Week:"Settimana","Welcome to Modoboa":"Benvenuti in Modoboa","With a mailbox":"Con una casella di posta",Year:"Anno"},jS={},GS={},qS=JSON.parse(`{"(the domain will be created locally)":"(o domínio será criado localmente)","%{ n } event imported":["%{ n } evento importado","%{ n } eventos importados","%{ n } eventos importados"],"A documentation of the API is available":"Uma documentação da API está disponível","A new key will be generated soon. Refresh the page in a moment to see it.":"Uma nova chave será gerada em breve. Atualize a página logo mais para vê-la.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Um usuário com todos os privilégios pode fazer qualquer coisa. Por padrão, esse usuário não tem uma caixa de correio, portanto, não pode acessar os recursos do usuário final.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Um usuário sem privilégios, mas com uma caixa de correio. Ele terá permissão para usar todos os recursos do usuário final: webmail, calendário, contatos, filtros.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Um usuário com privilégios em um ou mais domínios. Ele terá permissão para administrar caixas de correio e também poderá ter uma caixa de correio.","Absolute time range":"Intervalo de tempo absoluto","Access rules":"Regras de acesso","Account":"Conta","Account settings":"Configurações de conta","Actions":"Ações","Activate filter set":"Ativar conjunto de filtros","Activate your auto reply from this date":"Ative sua resposta automática a partir desta data","Activate your auto reply until this date":"Ative sua resposta automática até esta data","active":"ativo","Active":"Ativo","Add":"Adicionar","Add a category":"Adicionar uma categoria","Add a new domain alias":"Adicionar um novo apelido de domínio","Add action":"Adicionar ação","Add administrator":"Adicionar administrador","Add category":"Adicionar categoria","Add condition":"Adicionar condição","Add filter set":"Adicionar conjunto de filtros","Add new filter":"Adicionar novo filtro","Add sender address":"Adicionar endereço do remetente","Add/Remove from the domain page":"Adicionar/Remover da página do domínio","Added On":"Adicionado Em","Address":"Endereço","Address (hostname or IP)":"Endereço (hostname ou IP)","Address book information":"Informação do catálogo de endereços","Administered domains":"Domínios administrados","Administrator added":"Administrador adicionado","Administrator name":"Nome do administrador","Administrator removed":"Administrador removido","Administrators":"Administradores","Administrators of":"Administradores de","Alarm closed":"Alarme fechado","Alarm deleted":"Alarme removido","Alarm re-opened":"Alarme reaberto","Alarms":"Alarmes","Alarms deleted":"Alarmes removidos","Alias":"Apelido","Alias already added":"Apelido já adicionado","Alias already exists, redirecting to edit page":"Apelido já existe, redirecionando para a página de edição","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Apelido(s) desta caixa de correio. Para criar um apelido catchall, basta digitar o nome de domínio (@domain.tld).","Aliases":"Apelidos","Alignment":"Alinhamento","All messages":"Todas as mensagens","All of the following":"Todas os seguintes","Any of the following":"Uma dos seguintes","API access":"Acesso à API","API token copied to your clipboard":"Token da API copiado para sua área de transferência","API token created":"Token de API criado","API token deleted":"Token de API removido","Apply":"Aplicar","Are you sure you want to delete this alias?":"Você tem certeza que deseja remover este apelido?","Are you sure you want to delete this identity ?":"Você tem certeza que deseja remover esta identidade ?","Associated domain":"Domínio associado","Associated domains":"Domínios associados","Attempting to log you in.":"Tentando fazer login.","Attendees":"Participantes","Audit trail":"Trilha de auditoria","Authentication":"Autenticação","Auto configuration":"Auto configuração","Auto-reply message":"Mensagem de resposta automática","Auto-reply message updated":"Mensagem de resposta automática atualizada","autoconfig record (Mozilla) not found":"registro de configuração automática (Mozilla) não encontrado.","autoconfig record (Mozilla): %{ value }":"registro de configuração automática (Mozilla): %{ value }","autodiscover record (Microsoft) not found":"registro de descoberta automática (Microsoft) não encontrado.","autodiscover record (Microsoft): %{ value }":"registro de descoberta automática (Microsoft): %{ value }","Back":"Voltar","Backup codes":"Códigos de backup","Bind/named format. Click to copy":"Formato de associação/nomeado. Clique para copiar","Birth date":"Data de nascimento","Calendar":"Calendário","Calendar created":"Calendário criado","Calendar deleted":"Calendário excluído","Calendar information":"Informação do calendário","Calendar sharing":"Compartilhamento de calendário","Calendar updated":"Calendário atualizado","Cancel":"Cancelar","Categories":"Categorias","Category deleted":"Categoria excluída","Change the value of <strong>Default password scheme</strong>":"Alterar o valor do <strong>Esquema de senha padrão</strong>","Check connection:":"Verificar conexão:","Check out the following list to find related components":"Confira a lista a seguir para encontrar componentes relacionados","Check this option if passwords contained in your file are not crypted":"Marque esta opção se as senhas contidas em seu arquivo não estiverem criptografadas","Choose a domain":"Escolha um domínio","Choose a header":"Escolha um cabeçalho","Choose a role":"Escolha um papel","Choose an action":"Escolha uma ação","Choose an operator":"Escolha um operador","City":"Cidade","Click here to copy the key":"Clique aqui para copiar a chave","Close":"Fechar","Close alarm":"Fechar alarme","Closed":"Fechado","Color":"Cor","Company":"Empresa","Conditions":"Condições","Confirm and create":"Confirmar e criar","Confirmation":"Confirmação","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Parabéns! A autenticação de dois fatores usando senhas de uso único agora está habilitada para sua conta.","Contacts":"Contatos","Content":"Conteúdo","Continue on error":"Continuar em caso de erro","Control if this domain will be allowed to send and receive messages":"Controle se este domínio terá permissão para enviar e receber mensagens","Copy key to clipboard":"Copiar chave para a área de transferência","Copy to clipboard":"Copiar para área de transferência","Copy token to clipboard":"Copiar token para a área de transferência","Could not save parameters":"Não é possível salvar os parâmetros","Country":"País","Create":"Criar","Create a domain administrator":"Criar um administrador de domínio","Create a mailbox for the administrator.":"Criar uma caixa de e-mail para o administrador.","Create a new filter set":"Criar um novo conjunto de filtros","Create aliases":"Criar apelidos","Create standard aliases for the domain.":"Criar apelidos padrão para este domínio.","Creation date":"Data de criação","Crypt passwords":"Criptografar senhas","CSV seems to be badly formatted":"CSV parece estar mal formatado","Current password":"Senha atual","Daily message sending limit":"Limite diário de envio de mensagens","Daily sending limit":"Limite diário de envio","Dashboard":"Painel","Date":"Data","Day":"Dia","Default mailbox quota":"Cota padrão da caixa de correio","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cota padrão aplicada para caixas de correio. Pode ser expresso em KB, MB (padrão) ou GB. Um valor 0 significa que não há cota.","Delete":"Remover","Delete filter set":"Remover conjunto de filtros","Delete token":"Remover token","Description":"Descrição","Detail":"Detalhe","Disable":"Desabilitar","Disable 2FA":"Desabilitar 2FA","Disabled":"Desabilitado","Display address book information":"Exibir informações do catálogo de endereços","Display name":"Nome de exibição","DKIM key":"Chave DKIM","DKIM key copied to clipboard":"Chave DKIM copiada para a área de transferência","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"A chave DKIM parece não ter sido gerada ainda ou falhou. Deseja recolocar o trabalho na fila?","DKIM key length":"Comprimento da chave DKIM","DKIM key selector":"Seletor da chave DKIM","DKIM keys already exist for this domain. Do you want to overwrite them?":"Já existem chaves DKIM para este domínio. Deseja sobrescrevê-las?","DKIM public key for":"Chave pública DKIM para","DKIM record found":"Registro DKIM encontrado","DKIM record not found":"Registro DKIM não encontrado","DKIM signing":"Assinatura DKIM","DMARC":"DMARC","DMARC record found":"Registro DMARC encontrado","DMARC record not found":"Registro DMARC não encontrado","DMARC support does not seem to be enabled for this domain.":"Aparentemente o suporte para DMARC não está habilitado para este domínio.","DNS":"DNS","DNS checks":"Verificações de DNS","DNS configuration for ":"Configuração de DNS para ","DNS configuration help":"Ajuda para configuração de DNS","DNS status":"Status do DNS","Do not delete account folder":"Não remover pasta da conta","Do not delete domain folder":"Não remover pasta do domínio","Do you really want to delete the domain %{ domain }?":"Você tem certeza que deseja remover o domínio %{ domain }?","Do you really want to delete this calendar?":"Tem certeza que deseja excluir esse calendário?","Do you really want to delete this WebAuthn device?":"Você tem certeza que deseja remover este dispositivo WebAuthn?","Domain":"Domínio","Domain administrator":"Administrador do domínio","Domain alias created":"Apelido de domínio criado","Domain alias deleted":"Apelido de domínio removido","Domain alias updated":"Apelido de domínio atualizado","Domain created":"Domínio criado","Domain default value":"Valor padrão do domínio","Domain deleted":"Domínio removido","Domain name (ex: domain.tld)":"Nome do domínio (ex: domain.tld)","domain's default value":"Valor padrão do domínio ","Domains":"Domínios","Don't treat duplicated objects as errors":"Não tratar objetos duplicados como erro","Download filter set":"Baixar conjunto de filtros","E-mail":"E-mail","Edit":"Editar","Edit account":"Editar conta","Edit alias":"Editar apelido","Edit calendar":"Editar calendário","Edit category":"Editar categoria","Edit contact":"Editar contato","Edit domain":"Editar domínio","Edit domain alias":"Editar apelido de domínio","Edit event":"Editar evento","Edit filter":"Editar filtro","Edit provider":"Editar provedor","Edit your device":"Editar seu dispositivo","Edition":"Edição","Email":"E-mail","Email address":"Endereço de e-mail","Email providers":"Provedores de e-mail","Empty":"Vazio","Enable":"Habilitar","Enable DKIM signing":"Habilitar assinatura DKIM","Enable DNS checks":"Habilitar verificações de DNS","Enabled":"Habilitado","Enter a name to register a new webauthn device.":"Digite um nome para registrar um novo dispositivo webauthn.","Enter a simple username or an email address":"Digite um simples nome de usuário ou um endereço de e-mail","Enter an email address":"Digite seu endereço de e-mail","Event added":"Evento adicionado","Event updated":"Evento atualizado","Ex: 10MB. Leave empty for no limit":"Ex: 10 MB. Deixe vazio para ilimitado","Expire at":"Expira em","Export accounts and aliases to CSV":"Exportar contas e apelidos para CSV","Export domains and aliases to CSV":"Exportar domínios e apelidos para CSV","Failed":"Falhou","Failed to display template. Using raw mode":"Falha ao exibir o modelo. Usando o modo RAW","Feel free to improve the translations":"Sinta-se livre para melhorar as traduções","Field is required":"Campo obrigatório","Filter added":"Filtro adicionado","Filter disabled":"Filtro desabilitado","Filter enabled":"Filtro habilitado","Filter removed":"Filtro removido","Filter set activated":"Conjuntos de filtros ativado","Filter set created":"Conjunto de filtros criado","Filter set removed":"Conjunto de filtros removido","Filter set updated":"Conjunto de filtros atualizado","Filter updated":"Filtro atualizado","Filters":"Filtros","First name":"Nome","Forward":"Encaminhar","Forward messages and store copies into your local mailbox":"Encaminhar mensagens e armazenar cópias em sua caixa de e-mail local","Forward updated":"Encaminhamento atualizado","Forwarded":"Encaminhado","Forwarders with ARC":"Forwarders com ARC","From":"De","Full address":"Endereço completo","Full name":"Nome completo","Fully aligned":"Completamente alinhado","General":"Geral","General information":"Informação geral","General settings":"Configurações gerais","Generate":"Gerar","Generate a new DKIM key":"Gerar uma nova chave DKIM","Generated address":"Endereço gerado","Go to <strong>Settings > General</strong> section":"Vá para a seção <strong>Configurações > Geral</strong>","here":"aqui","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Aqui está um exemplo de configuração de DNS (formato bind). Substitua os valores entre [ ] pelos apropriados.","Identification":"Identificação","Identities":"Identidades","If you close this form now, your modifications won't be saved. Do you confirm?":"Se você fechar este formulário agora, suas modificações não serão salvas. Você confirma?","If you configured it recently, please wait for the first report to be received and processed.":"Se você o configurou recentemente, aguarde o primeiro relatório ser recebido e processado.","IMAP Migration":"Migração IMAP","IMAP Port":"Porta IMAP","Import":"Importar","Import accounts and aliases from CSV file":"Importar contas e apelidos do arquivo CSV","Import domains":"Importar domínios","Import domains and aliases from CSV file":"Importar domínios e apelidos do arquivo CSV","Import events":"Importar eventos","Import identities":"Importar identidades","Important messages":"Mensagens importantes","inactive":"inativo","Indicate one or more recipients separated by a comma (,)":"Indique um ou mais destinatários separados por vírgula (,)","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informe a <strong>TODOS</strong> os seus usuários que eles devem efetuar login no Modoboa para concluir a operação","Information":"Informação","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Instale um autenticador de token de software como FreeOTP ou Google Authenticator do repositório de aplicativos e use esse aplicativo para escanear esse QR code.","Installed components":"Componentes instalados","Installed version":"Versão instalada","Invalid port number":"Número de porta inválido","Is the IMAP connection secured using SSL/TLS or StartTLS":"A conexão IMAP é protegida usando SSL/TLS ou StartTLS","Keep local copies":"Manter cópias locais","Language":"idioma ","Language does no exist":"Idioma não existe","Last login date":"Data do último login","Last modification date":"Data da última modificação","Last name":"Sobrenome","Last Used":"Último Uso","Latest version":"Última versão","Leave empty for no limit":"Deixe em branco para ilimitado","Less":"Menos","Level":"Nível","Limitations":"Limitações","Local domain (optional)":"Domínio local (opcional)","Logger":"Registrador","Logout":"Sair","Logout / Login with your current account so its password gets updated":"Saia e entre novamente com sua conta atual para que sua senha seja atualizada","Mailbox":"Caixa de e-mail","Mailboxes":"Caixas de e-mail","Make sure <strong>Update password scheme at login</strong> option is enabled":"Certifique-se de que a opção <strong>Atualizar esquema de senha no login</strong> esteja habilitada","MB":"MB","Message":"Mensagem","Message filters":"Filtros de mensagem","Message history":"Histórico de mensagens","Message sending limit":"Limite de envio de mensagens","messages":"mensagens","Messages":"Mensagens","Migration deleted":"Migração removida","Migrations":"MIgrações","Minimum length is %{ length }":"O comprimento mínimo é %{ length }","Modified":"Modificado","Modify":"Modificar","Monitoring":"Monitoramento","Month":"Mês","More":"Mais","Move down":"Mover para baixo","Move up":"Mover para cima","Must be a numeric value or empty":"Deve ser um valor numérico ou vazio","MX records":"Registros MX","My calendars":"Meus calendários","name":"nome","Name":"Nome","Name of the administrator":"Nome do administador","Name of the domain to migrate":"Nome do domínio para migrar","Name:":"Nome:","Name: ":"Nome: ","Never":"Nunca","Never logged-in":"Nunca autenticado","New":"Novo","New account":"Nova conta","New alias":"Novo apelido","New calendar":"Novo calendário","New contact":"Novo contato","New device name":"Novo nome de dispositivo","New domain":"Novo domínio","New event":"Novo evento","New filter":"Novo filtro","New provider":"Novo provedor","New recovery codes":"Novos códigos de recuperação","Next":"Próximo","no":"não","No":"Não","No associated domains":"Nenhum domínios associados","No data to export":"Nenhum dado para exportar","No domain managed":"Nenhum domínio gerenciado","No sender address defined for this account":"Nenhum endereço de remetente definido para esta conta","No sending limit":"Sem limite de envio","No two-factor authentificator is yet set for your account.":"Ainda não existe nenhum autenticador de dois fatores definido para sua conta.","Not a valid email":"Não é um e-mail válido","Not generated":"Não gerado","Note":"Nota","Number of allowed mailbox aliases:":"Número de apelidos de caixa de correio permitidos:","Number of allowed mailboxes:":"Número de caixas de correio permitidas:","Number of associated alias:":"Número de apelidos associados:","Number of associated domains:":"Número de domínios associados:","Number of messages this domain can send per day. Leave empty for no limit.":"Número de mensagens que este domínio pode enviar por dia. Deixe vazio para ilimitado.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Número de mensagens que esta caixa de correio pode enviar por dia. Deixe vazio para ilimitado.","OK":"OK","Old account":"Conta antiga","One or more updates are available":"Uma ou mais atualizações estão disponíveis","One-time passwords":"Senhas de uso único","Opened":"Aberto","Opened alarms":"Alarmes abertos","Options":"Opções","or suggest a new language":"ou sugira um novo idioma","Parameters updated":"Parâmetros atualizados","Partially aligned":"Parcialmente alinhado","Partially trusted sources / Forwarders":"Fontes / encaminhadores parcialmente confiáveis","Password":"Senha","Password copied to clipboard":"Senha copiada para a área de transferência","Password mismatch":"Senha não confere","Password updated":"Senha atualizada","Passwords mismatch":"Senhas não conferem","Pending":"Pendente","Period":"Período","Phone":"Telefone","Phone number":"Número de telefone","Pin code":"Código PIN","Please add at least one recipient.":"Por favor, adicione pelo menos um destinatário.","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Observe que você verá esta mensagem até que <strong>TODAS</strong> as senhas dos usuários tenham sido convertidas usando o novo esquema.","Port":"Porta","Position":"Posição","Problem":"Problema","Proceed":"Proceder","Profile":"Perfil","Profile updated":"Perfil atualizado","Provide a CSV file where lines respect one of the following formats:":"Forneça um arquivo CSV em que as linhas respeitem um dos seguintes formatos:","Provider":"Provedor","Provider created":"Provedor criado","Provider deleted":"Provedor removido","Provider name":"Nome do provedor","Provider updated":"Provedor atualizado","Providers":"Provedores","Queue ID":"ID da fila","Quota":"Cota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"A cota para essa caixa de correio pode ser expressa em KB, MB (padrão) ou GB. Defina um valor personalizado ou use o padrão do domínio. Deixe em branco para definir um valor ilimitado (não permitido para administradores de domínio).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Cota compartilhada entre caixas de correio. Pode ser expresso em KB, MB (padrão) ou GB. Um valor 0 significa que não há cota.","Quota: ":"Cota: ","Random address":"Endereço aleatório","Random password":"Senha randômica","Raw format. Click to copy":"Formato bruto. Clique para copiar","Raw mode":"Modo bruto","Read":"Leitura","Recipient(s)":"Destinatário(s)","Recipients":"Destinatários","Register":"Registrar","Register authenticator":"Autenticador de registro","Registered Webauthn devices":"Dispositivos Webauthn registrados","Relative time ranges":"Intervalos de tempo relativos","Relay":"Relay","Reload":"Recarregar","Remove action":"Remover ação","Remove condition":"Remover condição","Remove this address":"Remover este endereço","Remove this administrator":"Remover este administrador","Reopen alarm":"Reabrir alarme","Reseller":"Revendedor","Reset recovery codes":"Redefinir códigos de recuperação","Resources":"Recursos","Resources usage":"Uso de recursos","Role":"Papel","Save":"Salvar","Save your changes":"Salve suas alterações","Search":"Busca","Secondary email":"E-mail secundário","Secured":"Seguro","Select a filter set":"Selecione um conjunto de filtros","Select an account":"Selecione uma conta","Select an ICS file":"Selecione um arquivo ICS","Select an ICS file to import and click on the Send button":"Selecione um arquivo ICS para importar e clique no botão \\"Enviar\\"","Select file":"Selecionar arquivo","Send":"Enviar","Send only":"Apenas enviar","Send only account":"Apenas enviar conta","Sender address added":"Endereço do remetente adicionado","Sender address deleted":"Endereço do remetente excluído","Sender addresses":"Endereços do remetente","Sending limit":"Limite de envio","Sending limit: ":"Limite de envio: ","Separator":"Separador","Service":"Serviço","Service: ":"Serviço: ","Settings":"Configurações","Setup device":"Configurar dispositivo","Show key":"Mostrar chave","Simple user":"Usuário simples","Specify an email address":"Especifique um endereço de e-mail","SPF record found":"Registro SPF encontrado","SPF record not found":"Registro SPF não encontrado","Start typing a name here...":"Comece a digitar um nome aqui...","State/Province":"Estado/Província","Statistics":"Estatísticas","Status":"Status","Subject":"Assunto","Summary":"Sumário","Super administrator":"Super administrador","Synchronization started":"Sincronização iniciada","Synchronize contacts with address book":"Sincronize seus contatos com o catálogo de endereços","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"O conteúdo da sua resposta. Você pode usar as seguintes variáveis, que serão substituídas automaticamente pelo valor apropriado: %(name)s, %(fromdate)s %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"As credenciais são as mesmas que você usa para acessar o Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"O primeiro elemento de cada linha é obrigatório e deve ser igual a um dos valores anteriores.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Os seguintes códigos de recuperação podem ser usados uma vez cada para permitir que você recupere o acesso à sua conta, caso perca seu telefone, por exemplo. Certifique-se de salvá-los em um local seguro, caso contrário, você não poderá mais acessar sua conta.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"O esquema de senha que você está usando foi descontinuado e será removido na próxima atualização. O procedimento para atualizar para um esquema mais forte é o seguinte:","there":"ali","Title":"Título","To":"Para","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acessar esse catálogo de endereços externamente (como do Mozilla Thunderbird ou de seu celular), use a seguinte URL:","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"Para acessar esta calendário externamente (como do Mozilla Thunderbird ou de seu celular), use a seguinte URL:","Total":"Total","Transport":"Transporte","Triggered":"Provocado","Trusted sources":"Fontes confiáveis","Two-factor auth":"Autenticação de dois fatores","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"A autenticação de dois fatores (2FA) usando senhas de uso único ainda não está ativada para sua conta.","Two-factor authentication using one-time passwords is enabled for your account.":"A autenticação de dois fatores usando senhas de uso único está habilitada para sua conta.","Type":"Tipo","Type: ":"Tipo: ","Unknown":"Desconhecido","Unknown sources / Threats":"Fontes desconhecidas / Ameaças","unlimited":"ilimitado","Unlimited":"Ilimitado","Until":"Até","Update":"Atualizar","Update auto-reply":"Atualizar resposta automática","Update Password":"Atualizar Senha","Update settings":"Atualizar configurações","Updated":"Atualizado","Use count":"Usar contagem","Use domain default value":"Usar valor padrão de domínio","Username":"Nome de usuário","Username:":"Nome de usuário:","Valid":"Válido","Value":"Valor","warning":"atenção","Warning":"Atenção","WebAuthn":"WebAuthn","Week":"Semana","Welcome to Modoboa":"Bem-vindo ao Modoboa","With a mailbox":"Com uma caixa de e-mail","With mailbox":"Com caixa de correio","Write":"Escrita","Year":"Ano","yes":"sim","Yes":"Sim","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Você já gerou códigos de backup para esta conta. Se você não se lembra deles ou já usou todos eles, pode gerar novos.","You are about to delete your API access token":"Você está prestes a excluir seu token de acesso à API","You can also share a read-only version of this calendar using the following URL: ":"Você também pode compartilhar uma versão \\"Somente leitura\\" deste calendário usando a seguinte URL:","You can use a different character as separator.":"Você pode usar um caractere diferente como separador.","You don't have any WebAuthN device registered as a second authentication method.":"Você não tem nenhum dispositivo WebAuthN registrado como um segundo método de autenticação.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Você deve aplicar este procedimento <strong>ANTES</strong> de instalar uma versão mais recente do Modoboa, caso contrário <strong>você não conseguirá mais se conectar à interface web</strong>.","You need to bind at least one domain to the provider.":"Você precisa associar pelo menos um domínio ao provedor.","Your API token has not been generated yet.":"Seu token de API ainda não foi gerado.","Your API token is:":"Seu token de API é:","Your browser does not seem compatible with WebAuthN":"Seu navegador não parece compatível com WebAuthN","Zip code":"CEP"}`),$S={Account:"Добавить аккаунт",Actions:"Действие",Add:"Адрес",Address:"Адрес","Administered domains":"Список квот",Administrators:"Администраторы",Alias:"Синоним",Aliases:"Синоним(ы)",Apply:"Применить",Authentication:"Аутентификация","Bind/named format. Click to copy":"Неверный формат","Check this option if passwords contained in your file are not crypted":"Выберите эту опцию если пароль в вашем файле не зашифрован ",Confirmation:"Подтверждение","Continue on error":"Продолжать при ошибке","Create a domain administrator":"Создание администратора домена","Create a mailbox for the administrator.":"Создание администратора домена","Create aliases":"Создание синонимов","Creation date":"Дата создания","Crypt passwords":"Шифровать пароль",Dashboard:"Приборная панель",Day:"День",Disabled:"Разрешен","DNS status":"Статистика","Domain administrator":"Администратор домена","Domain created":"Домен создан",Domains:"Домены","Email address":"Е-майл адрес",Enabled:"Разрешено",Forward:"Перенаправленые","Forward messages and store copies into your local mailbox":"Перенаправление сообщения, и сохранение копии в вашем локальном почтовом ящике","Forward updated":"Перенаправление обновлено","Full name":"Имя файла",General:"Основные",Identities:"Пользователи",Import:"Импорт","Import domains":"Импорт доменов","Import identities":"Импорт информации о пользователях",Information:"Информация","Installed version":"Установленная версия","Keep local copies":"Сохранить локальную копию","Last modification date":"Дата последней модификации",Level:"Уровень",Logger:"Логгер",Logout:"Завершить сеанс",Mailbox:"Почтовые ящики",Mailboxes:"Почтовые ящики",Message:"использование (%%)",Modified:"Синоним изменен",Month:"Месяц",Name:"Логин","New account":"Новый аккаунт","New alias":"Новый синоним","New domain":"Новый домен",Next:"Следующая","Not generated":"Получатель не определен","One or more updates are available":"Доступны одно или более обновлений.",Options:"Опции",Password:"Пароль","Passwords mismatch":"Пароли не совпадают","Profile updated":"Профиль обновлен","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Квота в мегабайтах для этого почтового ящика. Определите собственное значение или используйте значение по умолчанию для родительского домена. Оставьте пустым для неограниченного значения. (Не разрешено администраторам домена)","Random address":"Ошибочный запрос","Random password":"Ошибочный запрос","Recipient(s)":"Получатели",Recipients:"Получатели",Reseller:"Реселлер",Resources:"Ресурсы","Resources usage":"Использование ресурсов",Role:"Роль",Save:"Сохранить",Search:"Поиск","Sender addresses":"Ошибочный запрос",Separator:"Разделитель",Settings:"Настройки","Simple user":"Обычный пользователь",Status:"Статистика","Super administrator":"Супер администратор",Unknown:"Неизвестное",unlimited:"Не лимитировано",Update:"Обновление",Updated:"Обновление","Use domain default value":"Используются значения домена по умолчанию ",Username:"Логин пользователя",Week:"Неделя","Welcome to Modoboa":"Добро пожаловать в Modoboa!",Year:"Год"},KS=JSON.parse(`{"(the domain will be created locally)":"(domänen kommer att skapas lokalt)","%{ n } event imported":["%{ n } händelse importerad","%{ n } händelser importerade"],"A documentation of the API is available":"En dokumentation av API:et finns tillgänglig","A new key will be generated soon. Refresh the page in a moment to see it.":"En ny nyckel kommer snart att skapas. Ladda om sidan om en stund för att se den.","A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.":"Användare med alla rättigheter som kan göra allt. Som standard har en sån här användare ingen brevlåda så den kan inte komma åt slutanvändarfunktioner.","A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.":"Användare utan privilegier men som har en en brevlåda. Den kommer att kunna använda alla slutanvändarfunktioner: webbmail, kalender, kontakter, filter.","A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.":"Användare med rättigheter på en eller flera domäner. Den kan administrera brevlådor och han kan även ha en brevlåda.","Absolute time range":"Absolut tidsintervall","Access rules":"Åtkomstregler","Account":"Konto","Account settings":"Kontoinställningar","Actions":"Åtgärder","Activate filter set":"Aktivera filteruppsättning","Activate your auto reply from this date":"Aktivera ditt autosvar från detta datum","Activate your auto reply until this date":"Aktivera ditt autosvar fram till detta datum","active":"aktiv","Active":"Aktiv","Add":"Lägg till","Add a category":"Lägg till en kategori","Add a new domain alias":"Lägg till nytt domän alias","Add action":"Lägg till åtgärd","Add administrator":"Lägg till administratör","Add category":"Lägg till kategori","Add condition":"Lägg till villkor","Add filter set":"Lägg till filteruppsättning","Add new filter":"Lägg till nytt filter","Add sender address":"Lägg till avsändaradress","Add to contacts":"Lägg till i kontakter","Add/Remove from the domain page":"Lägg till/ta bort från domänsidan","Added On":"Tillagd på","Address":"Adress","Address (hostname or IP)":"Adress (värdnamn eller IP)","Address book information":"Adressboksinformation","Administered domains":"Administrerade domäner","Administrator added":"Administratör tillagd","Administrator name":"Administratörs namn","Administrator removed":"Administratör raderad","Administrators":"Administratörer","Administrators of":"Administratörer för","Alarm closed":"Larm stängt","Alarm deleted":"Larm raderat","Alarm re-opened":"Larm öppnat på nytt","Alarms":"Larm","Alarms deleted":"Larm raderade","Alias":"Alias","Alias already added":"Alias ​​har redan lagts till","Alias already exists, redirecting to edit page":"Aliaset finns redan, omdirigerar till redigeringssidan","Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld).":"Alias för denna brevlåda. För att skapa ett catchall-alias anger du bara domännamnet (@domain.tld).","Aliases":"Alias","Alignment":"Placering","All messages":"Alla meddelanden","All of the following":"Alla följande","Any of the following":"Något av följande","API access":"API åtkomst","API token copied to your clipboard":"API token kopierat till urklipp","API token created":"API token skapat","API token deleted":"API token raderat","Apply":"Tillämpa","Are you sure you want to delete this alias?":"Är du säker på att du vill ta bort detta alias?","Are you sure you want to delete this identity ?":"Är du säker på att du vill ta bort den här identiteten?","Associated domain":"Associerad domän","Associated domains":"Associerade domäner","Attach":"Bifoga","Attachments":"Bilagor","Attempting to log you in.":"Försöker logga in dig.","Attendees":"Deltagare","Audit trail":"Verifieringskedja","Authentication":"Autentisering","Auto configuration":"Automatisk konfiguration","Auto-reply message":"Automatiskt svarsmeddelande","Auto-reply message updated":"Automatiskt svarsmeddelande uppdaterat","autoconfig record (Mozilla) not found":"autoconfig-posten (Mozilla) hittades inte","autoconfig record (Mozilla): %{ value }":"\\"autoconfig-post (Mozilla): %{ value }\\"","autodiscover record (Microsoft) not found":"autodiscover-post (Microsoft) hittades inte","autodiscover record (Microsoft): %{ value }":"autodiscover-post (Microsoft): %{ value }","Back":"Tillbaka","Backup codes":"Säkerhetskopieringskoder","Bcc":"Bcc","Bind/named format. Click to copy":"Bind/named formatterat. Klicka för att kopiera","Birth date":"Födelsedatum","Calendar":"Kalender","Calendar created":"Kalender skapad","Calendar deleted":"Kalender raderad","Calendar information":"Kalenderinformation","Calendar sharing":"Kalenderdelning","Calendar updated":"Kalender uppdaterad","Cancel":"Avbryt","Categories":"Kategorier","Category deleted":"Kategori raderad","Cc":"Cc","Change the value of <strong>Default password scheme</strong>":"Ändra värdet på <strong>Standard lösenordsschema</strong>","Check connection:":"Kontrollera anslutning:","Check out the following list to find related components":"Kolla in följande lista för att hitta relaterade komponenter","Check this option if passwords contained in your file are not crypted":"Markera det här alternativet om lösenorden i din fil inte är krypterade","Choose a domain":"Välj en domän","Choose a header":"Välj en rubrik","Choose a role":"Välj en roll","Choose an action":"Välj en åtgärd","Choose an operator":"Välj en operatör","City":"Stad","Click here to copy the key":"Klicka här för att kopiera nyckeln","Close":"Stäng","Close alarm":"Stäng alarm","Closed":"Stängd","Color":"Färg","Company":"Företag","Compose":"Författa","Compress this mailbox":"Komprimera denna brevlåda","Conditions":"Villkor","Confirm and create":"Bekräfta och skapa","Confirmation":"Bekräftelse","Congratulations! Two-factor authentication using one-time passwords is now enabled for your account.":"Grattis! Tvåfaktorsautentisering med engångslösenord är nu aktiverad för ditt konto.","Contact added to address book":"Kontakt har lagts till i adressboken","Contacts":"Kontakter","Content":"Innehåll","Continue on error":"Fortsätt vid fel","Control if this domain will be allowed to send and receive messages":"Kontrollera om den här domänen ska tillåtas skicka och ta emot meddelanden","Copy key to clipboard":"Kopiera nyckel till urklipp","Copy to clipboard":"Kopiera till urklipp","Copy token to clipboard":"Kopiera token till urklipp","Could not save parameters":"Kunde inte spara parametrar","Country":"Land","Create":"Skapa","Create a domain administrator":"Skapa en domänadministratör","Create a mailbox for the administrator.":"Skapa en brevlåda för administratören.","Create a new filter set":"Skapa ny filteruppsättning","Create a new mailbox":"Skapa en ny brevlåda","Create aliases":"Skapa alias","Create new mailbox":"Skapa ny brevlåda","Create standard aliases for the domain.":"Skapa standardalias för domänen.","Creation date":"Datum skapad","Crypt passwords":"Kryptera lösenord","CSV seems to be badly formatted":"CSV verkar vara dåligt formaterad","Current password":"Nuvarande lösenord","Daily message sending limit":"Daglig sändningsgräns för meddelanden","Daily sending limit":"Daglig sändningsgräns","Dashboard":"Instrumentbräda","Date":"Datum","Day":"Dag","Default mailbox quota":"Standard brevlådekvota","Default quota applied to mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Standardkvot tillämpas på postlådor. Kan uttryckas i KB, MB (standard) eller GB. Ett värde på 0 betyder ingen kvot.","Delete":"Radera","Delete filter set":"Ta bort filteruppsättning","Delete this mailbox":"Ta bort den här brevlådan","Delete this mailbox?":"Ta bort den här brevlådan?","Delete token":"Radera token","Description":"Beskrivning","Detail":"Detalj","Disable":"Inaktivera","Disable 2FA":"Inaktivear 2FA","Disable links":"Inaktivera länkar","Disabled":"Inaktiverad","Display address book information":"Visa adressboksinformation","Display name":"Display name","Display source":"Visa källa","DKIM key":"DKIM nyckel","DKIM key copied to clipboard":"DKIM-nyckel kopierad till urklipp","DKIM key does not seem to be generated yet or has failed. Do you want to requeue the job?":"DKIM-nyckeln verkar inte ha genererats ännu eller har misslyckats. Vill du köa jobbet?","DKIM key length":"DKIM nyckellängd","DKIM key selector":"DKIM nyckel väljare","DKIM keys already exist for this domain. Do you want to overwrite them?":"DKIM-nycklar finns redan för den här domänen. Vill du skriva över dem?","DKIM public key for":"DKIM publik nyckel för","DKIM record found":"DKIM-post hittades","DKIM record not found":"DKIM-posten hittades inte","DKIM signing":"DKIM signering","DMARC":"DMARC","DMARC record found":"DMARC post hittad","DMARC record not found":"DMARC post ej hittad","DMARC support does not seem to be enabled for this domain.":"DMARC-stöd verkar inte vara aktiverat för den här domänen.","DNS":"DNS","DNS checks":"DNS kontroller","DNS configuration for ":"DNS-konfiguration för","DNS configuration help":"DNS konfigurering hjälp","DNS status":"DNS status","Do not delete account folder":"Ta inte bort kontomappen","Do not delete domain folder":"Ta inte bort domänmappen","Do you really want to delete the domain %{ domain }?":"Vill du verkligen ta bort domänen %{ domain }?","Do you really want to delete this calendar?":"Vill du verkligen ta bort den här kalendern?","Do you really want to delete this WebAuthn device?":"Vill du verkligen ta bort den här WebAuthn-enheten?","Domain":"Domän","Domain administrator":"Domänadministratör","Domain alias created":"Domän alias skapat","Domain alias deleted":"Domänalias raderat","Domain alias updated":"Domänalias uppdaterat","Domain created":"Domän skapad","Domain default value":"Domän standardvärde","Domain deleted":"Domän raderad","Domain name (ex: domain.tld)":"Domännamn (ex: domain.tld)","domain's default value":"domänens standardvärde","Domains":"Domäner","Don't treat duplicated objects as errors":"Behandla inte duplicerade objekt som fel","Download filter set":"Ladda ner filteruppsättning","E-mail":"E-post","Edit":"Redigera","Edit account":"Redigera konto","Edit alias":"Redigera alias","Edit calendar":"Redigera kalender","Edit category":"Redigera kategori","Edit contact":"Redigera kontakt","Edit domain":"Redigera domän","Edit domain alias":"Redigera domänalias","Edit event":"Redigera händelse","Edit filter":"Redigera filter","Edit mailbox":"Redigera brevlåda","Edit provider":"Redigera leverantör","Edit this mailbox":"Redigera den här brevlådan","Edit your device":"Redigera din enhet","Edition":"Utgåva","Email":"E-post","Email address":"E-postadress","Email providers":"E-postleverantörer","Email sent":"E-post skickat","Empty":"Tom","Empty mailbox":"Tom brevlåda","Enable":"Aktivera","Enable DKIM signing":"Aktivera DKIM signering","Enable DNS checks":"Aktivera DNS kontroller","Enable links":"Aktivera länkar","Enabled":"Aktiverad","Enter a name to register a new webauthn device.":"Ange ett namn för att registrera en ny webauthn-enhet.","Enter a simple username or an email address":"Ange ett enkelt användarnamn eller en e-postadress","Enter an email address":"Ange en e-postadress","Event added":"Event added","Event updated":"Händelse uppdaterad","Ex: 10MB. Leave empty for no limit":"Ex: 10MB. Lämna tomt för ingen gräns","Expire at":"Utgår kl","Export accounts and aliases to CSV":"Exportera konton och alias till CSV","Export domains and aliases to CSV":"Exportera domäner och alias till CSV","Failed":"Misslyckades","Failed to display template. Using raw mode":"Det gick inte att visa mallen. Använder råläge","Feel free to improve the translations":"Förbättra gärna översättningarna","Field is required":"Fält är obligatoriskt","Filter added":"Filter har lagts till","Filter disabled":"Filter inaktiverat","Filter enabled":"Filter aktiverat","Filter removed":"Filter borttaget","Filter set activated":"Filterset aktiverat","Filter set created":"Filteruppsättning skapad","Filter set removed":"Filterset har tagits bort","Filter set updated":"Filteruppsättningen uppdaterad","Filter updated":"Filter uppdaterat","Filters":"Filter","First name":"Förnamn","Forward":"Vidarebefordra","Forward messages and store copies into your local mailbox":"Vidarebefordra meddelanden och lagra kopior i din lokala brevlåda","Forward updated":"Vidarebefordring uppdaterad","Forwarded":"Vidarebefordrad","Forwarders with ARC":"Vidarebefordrare med ARC","From":"Från","Full address":"Fullständig adress","Full name":"Komplett namn","Fully aligned":"Helt inriktad","General":"Allmän","General information":"Allmänn information","General settings":"Allmänna inställningar","Generate":"Generera","Generate a new DKIM key":"Generera en ny DKIM nyckel","Generated address":"Genererad adress","Go to <strong>Settings > General</strong> section":"Gå till avsnittet <strong>Inställningar > Allmänt</strong>","here":"här","Here is an example of DNS configuration (bind format). Replace values between [ ] by the appropriate ones.":"Här är ett exempel på DNS-konfiguration (bind-format). Ersätt värdena mellan [ ] med de lämpliga värdena.","Identification":"Identifikation","Identities":"Identiteter","If you close this form now, your modifications won't be saved. Do you confirm?":"Om du stänger formuläret nu kommer dina ändringar inte att sparas. Bekräftar du?","If you configured it recently, please wait for the first report to be received and processed.":"Om du konfigurerade det nyligen, vänta tills den första rapporten tas emot och behandlas.","IMAP Migration":"IMAP migrering","IMAP Port":"IMAP port","Import":"Importera","Import accounts and aliases from CSV file":"Importera konton och alias från CSV-fil","Import domains":"Importera domäner","Import domains and aliases from CSV file":"Importera domäner och alias från CSV-fil","Import events":"Importera händelser","Import identities":"Importera identiteter","Important messages":"Viktiga meddelanden","inactive":"inaktiv","Indicate one or more recipients separated by a comma (,)":"Ange en eller flera mottagare separerade med kommatecken (,)","Inform <strong>ALL</strong> your users that they must login to Modoboa to complete the operation":"Informera <strong>ALLA</strong> dina användare att de måste logga in på Modoboa för att slutföra operationen","Information":"Information","Install a soft token authenticator like FreeOTP or Google Authenticator from your application repository and use that app to scan this QR code.":"Installera en mjuk token-autentisering som FreeOTP eller Google Authenticator från ditt programförråd och använd den appen för att skanna den här QR-koden.","Installed components":"Installerade komponenter","Installed version":"Installerad version","Invalid port number":"Ogiltigt portnummer","Is the IMAP connection secured using SSL/TLS or StartTLS":"Är IMAP-anslutningen säker med SSL/TLS eller StartTLS","Keep local copies":"Behåll lokala kopior","Language":"Språk","Language does no exist":"Språket existerar inte","Last login date":"Senaste inloggning","Last modification date":"Senaste ändrad datum","Last name":"Efternamn","Last Used":"Senast använd","Latest version":"Senaste version","Leave empty for no limit":"Lämna tomt för ingen gräns","Less":"Mindre","Level":"Nivå","Limitations":"Gränser","Local domain (optional)":"Lokal domän (valfritt)§","Logger":"Logger","Logout":"Logga ut","Logout / Login with your current account so its password gets updated":"Logga ut / Logga in med ditt nuvarande konto så att lösenordet uppdateras","Mailbox":"Brevlåda","Mailbox compressed":"Brevlåda komprimerad","Mailbox created":"Brevlåda skapad","Mailbox deleted":"Brevlåda raderad","Mailbox renamed":"Brevlåda omdöpt","Mailboxes":"Brevlådor","Make sure <strong>Update password scheme at login</strong> option is enabled":"Se till att alternativet <strong>Uppdatera lösenordsschema vid inloggning</strong> är aktiverat","Mark as followed":"Markera enligt följande","Mark as read":"Markera som läst","Mark as unfollowed":"Markera som ej följt","Mark as unread":"Markera som oläst","MB":"MB","Message":"Meddelande","Message deleted":"Meddelandet raderat","Message filters":"Meddelandefilter","Message history":"Meddelande historik","Message marked as junk":"Meddelande markerat som skräp","Message marked as not junk":"Meddelandet markerat som inte skräp","Message sending limit":"Begränsning för meddelandesändning","Message(s) deleted":"Meddelande(n) raderade","Message(s) flagged":"Meddelande(n) flaggade","Message(s) marked as junk":"Meddelande(n) markerade som skräp","Message(s) marked as not junk":"Meddelande(n) markerade som inte skräp","messages":"meddelanden","Messages":"Meddelanden","Migration deleted":"Migrering raderad","Migrations":"Migreringar","Minimum length is %{ length }":"Minsta längd är %{ length }","Modified":"Ändrad","Modify":"Ändra","Monitoring":"Monitoring","Month":"Månad","More":"Mer","Move down":"Flytta ner","Move up":"Flytta upp","Must be a numeric value or empty":"Måste vara ett numeriskt värde eller tomt","MX records":"MX poster","My calendars":"Mina kalendrar","name":"namn","Name":"Namn","Name of the administrator":"Namn på administratören","Name of the domain to migrate":"Namn på domänen att migrera","Name:":"Namn:","Name: ":"Namn:","Never":"Aldrig","Never logged-in":"Aldrig inloggad","New":"Ny","New account":"Nytt konto","New alias":"Nytt alias","New calendar":"Ny kalender","New contact":"Ny kontakt","New device name":"Nytt enhetsnamn","New domain":"Ny domän","New event":"Ny händelse","New filter":"Nytt filter","New provider":"Ny leverantör","New recovery codes":"Nya återställningskoder","Next":"Nästa","no":"nej","No":"Nej","No associated domains":"Inga associerade domäner","No data to export":"Ingen data att exportera","No domain managed":"Ingen domän hanterad","No message yet in this mailbox":"Inget meddelande ännu i denna brevlåda","No sender address defined for this account":"Inge avsändaradress agedd för detta konto","No sending limit":"Ingen sändningsbegränsning","No two-factor authentificator is yet set for your account.":"Ingen tvåfaktorsautentisering är ännu inställd för ditt konto.","Not a valid email":"Inte ett giltigt mejl","Not generated":"Ej genererad","Note":"Anteckning","Number of allowed mailbox aliases:":"Antal tillåtna postlådealias:","Number of allowed mailboxes:":"Antal tillåtna brevlådor:","Number of associated alias:":"Antal associerade alias:","Number of associated domains:":"Antal associerade domäner:","Number of messages this domain can send per day. Leave empty for no limit.":"Antal meddelanden som denna domän kan skicka per dag. Lämna tomt för ingen begränsning.","Number of messages this mailbox can send per day. Leave empty for no limit.":"Antal meddelanden som denna brevlåda kan skicka per dag. Lämna tomt för ingen begränsning.","OK":"OK","Old account":"Gammalt konto","on":"på","One or more updates are available":"En eller flera uppdateringar tillgängliga","One-time passwords":"Engångslösenord","Opened":"Öppnad","Opened alarms":"Öppnade alarm","Options":"Alternativ","or suggest a new language":"eller föreslå ett nytt språk","Parameters updated":"Parametrar uppdaterade","Parent mailbox":"Förälders brevlåda","Partially aligned":"Delvis justerad","Partially trusted sources / Forwarders":"Delvis pålitliga källor / speditörer","Password":"Lösenord","Password copied to clipboard":"Lösenord kopierat till urklipp","Password mismatch":"Lösenordet matchar inte","Password updated":"Lösenord uppdaterat","Passwords mismatch":"Lösenord matchar ej","Pending":"Väntande","Period":"Period","Phone":"Telefon","Phone number":"Telefonnummer","Pin code":"Pinkod","Please add at least one recipient.":"Lägg till minst en mottagare.","Please note that you will see this message until <strong>ALL</strong> user passwords have been converted using the new scheme.":"Observera att du kommer att se detta meddelande tills <strong>ALLA</strong> användarlösenord har konverterats med det nya schemat.","Port":"Port","Position":"Plats","Problem":"Problem","Proceed":"Fortsätt","Profile":"Profil","Profile updated":"Profil uppdaterad","Provide a CSV file where lines respect one of the following formats:":"Ange en CSV-fil där raderna respekterar ett av följande format:","Provide one or more addresses":"Ange en eller flera adresser","Provider":"Leverantör","Provider created":"Leverantör skapad","Provider deleted":"Leverantör raderad","Provider name":"Leverantörsnamn","Provider updated":"Leverantör uppdaterad","Providers":"Leverantörer","Queue ID":"Kö ID","Quota":"Kvota","Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators).":"Kvot för denna brevlåda, kan anges i KB, MB (standard) eller GB. Ange ett anpassat värde eller använd domänens standardvärde. Lämna tomt för att ange ett obegränsat värde (inte tillåtet för domänadministratörer).","Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. A value of 0 means no quota.":"Kvot delad mellan brevlådor. Kan anges i KB, MB (standard) eller GB. Ett värde av 0 innebär ingen kvot.","Quota: ":"Kvota:","Random address":"Slumpmässig adress","Random password":"Slumpmässigt lösenord","Raw format. Click to copy":"Råformat. Klicka för att kopiera","Raw mode":"Råläge","Read":"Läs","Recipient(s)":"Mottagare","Recipients":"Mottagare","Register":"Register","Register authenticator":"Registrera autentiseringsverktyg","Registered Webauthn devices":"Registrerade Webauthn-enheter","Relative time ranges":"Relativa tidsintervall","Relay":"Relä","Reload":"Ladda om","Remove action":"Ta bort åtgärd","Remove condition":"Ta bort tillstånd","Remove this address":"Radera denna adress","Remove this administrator":"Radera denna administratör","Reopen alarm":"Återöppna larmet","Reply":"Svara","Reply all":"Svara alla","Reseller":"Återförsäljare","Reset recovery codes":"Återställ återställningskoder","Resources":"Resurser","Resources usage":"Resursanvändning","Role":"Roll","Save":"Spara","Save your changes":"Spara dina ändringar","Search":"Sök","Search in messages":"Sök i meddelanden","Secondary email":"Sekundär e-post","Secured":"Säkrad","Select a filter set":"Välj ett filterset","Select an account":"Välj ett konto","Select an ICS file":"Välj en ICS-fil","Select an ICS file to import and click on the Send button":"Välj en ICS-fil att importera och klicka på knappen Skicka","Select file":"Välj fil","Send":"Skicka","Send only":"Skicka endast","Send only account":"Skicka endast konto","Sender address added":"Avsändaradress tillagd","Sender address deleted":"Avsändaradress raderad","Sender addresses":"Avsändaradresser","Sending limit":"Sändningsgräns","Sending limit: ":"Sändningsgräns:","Separator":"Avgränsare","Service":"Tjänst","Service: ":"Service:","Settings":"Inställningar","Setup device":"Konfigurera enhet","Show key":"Visa nyckel","Simple user":"Enkel användare","Specify an email address":"Ange en e-postadress","SPF record found":"SPF post hittad","SPF record not found":"SPF post saknas","Start typing a name here...":"Börja skriva ett namn här...","State/Province":"Stat/Provins","Statistics":"Statistik","Status":"Status","Subject":"Ämne","Summary":"Sammanfattning","Super administrator":"Superadministratör","Synchronization started":"Synkronisering startade","Synchronize contacts with address book":"Synkronisera kontakter med adressboken","The content of your answer. You can use the following variables, which will be automatically replaced by the appropriate value: %(name)s, %(fromdate)s, %(untildate)s":"Innehållet i ditt svar. Du kan använda följande variabler, som automatiskt ersätts med lämpligt värde: %(name)s, %(fromdate)s, %(untildate)s","The credentials are the same than the ones you use to access Modoboa.":"Inloggningsuppgifterna är desamma som de du använder för att komma åt Modoboa.","The first element of each line is mandatory and must be equal to one of the previous values.":"Det första elementet i varje rad är obligatoriskt och måste vara lika med ett av de tidigare värdena.","The following recovery codes can be used one time each to let you regain access to your account, in case you lose your phone for example. Make sure to save them in a safe place, otherwise you won't be able to access your account anymore.":"Följande återställningskoder kan användas en gång var för att låta dig återfå åtkomst till ditt konto, om du till exempel skulle tappa din telefon. Se till att spara dem på ett säkert ställe, annars kommer du inte att kunna komma åt ditt konto längre.","The password scheme you are using has been deprecated and will be removed in the next minor version. The procedure to upgrade to a stronger scheme is as follows:":"Lösenordsschemat du använder har föråldrats och kommer att tas bort i nästa mindre version. Proceduren för att uppgradera till ett starkare system är som följer:","there":"där","Title":"Titel","To":"Till","To access this address book from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"För att komma åt den här adressboken från utsidan (som Mozilla Thunderbird eller din smartphone), använd följande URL:","To access this calendar from the outside (such as Mozilla Thunderbird or your smartphone), use the following URL:":"För att komma åt den här kalendern från utsidan (som Mozilla Thunderbird eller din smartphone), använd följande URL:","Total":"Totalt","Transport":"Transport","Triggered":"Triggad","Trusted sources":"Pålitliga källor","Two-factor auth":"Tvåfaktorsautentisering","Two-factor authentication (2FA) using one-time passwords is not yet activated for your account.":"Tvåfaktorsautentisering (2FA) med engångslösenord är ännu inte aktiverad för ditt konto.","Two-factor authentication using one-time passwords is enabled for your account.":"Tvåfaktorsautentisering med engångslösenord är aktiverad för ditt konto.","Type":"Typ","Type: ":"Typ: ","Unknown":"Okänd","Unknown sources / Threats":"Okända källor / hot","unlimited":"obegränsat","Unlimited":"Obegränsat","Until":"Tills","Update":"Uppdatera","Update auto-reply":"Uppdatera autosvar","Update contact":"Uppdatera kontakt","Update Password":"Uppdatera lösenord","Update settings":"Uppdatera inställningar","Updated":"Uppdaterad","Use count":"Använd antal","Use domain default value":"Använd domänens standardvärde","Username":"Användarnamn","Username:":"Användarnamn:","Valid":"Giltig","Value":"Värde","warning":"varning","Warning":"Varning","WebAuthn":"WebAuthn","Webmail":"Webmail","Week":"Vecka","Welcome to Modoboa":"Välkommen till Modoboa","With a mailbox":"Med en brevlåda","With mailbox":"Med brevlåda","Write":"Skriv","Year":"År","yes":"ja","Yes":"Ja","You already have generated backup codes for this account. If you don't remember them or have used them all, you can generate new ones.":"Du har redan genererat reservkoder för det här kontot. Om du inte kommer ihåg dem eller har använt dem alla kan du skapa nya.","You are about to delete your API access token":"Du håller på att radera din API-åtkomsttoken","You can also share a read-only version of this calendar using the following URL: ":"Du kan också dela en skrivskyddad version av den här kalendern med följande URL:","You can use a different character as separator.":"Du kan använda ett annat tecken som avgränsare.","You don't have any WebAuthN device registered as a second authentication method.":"Du har ingen WebAuthN-enhet registrerad som en andra autentiseringsmetod.","You must apply this procedure <strong>BEFORE</strong> you install a newest version of Modoboa, otherwise <strong>you will be unable to connect to the web interface anymore</strong>.":"Du måste tillämpa denna procedur <strong>INNAN</strong> du installerar en senaste version av Modoboa, annars <strong> kommer du inte att kunna ansluta till webbgränssnittet längre</strong>.","You need to bind at least one domain to the provider.":"Du måste binda minst en domän till leverantören.","Your API token has not been generated yet.":"Ditt API token har ännu ej genererats.","Your API token is:":"Ditt API token är:","Your browser does not seem compatible with WebAuthN":"Din webbläsare verkar inte vara kompatibel med WebAuthN","Zip code":"Postnummer"}`),ZS={},JS={"API access":"API erişimi",Authentication:"Kimlik Doğrulama",Close:"Kapat",Confirmation:"Onayla",Dashboard:"Gösterge Paneli",Date:"Tarih",Description:"Tanım","Disable 2FA":"2FA'yı devre dışı bırak","Domain administrator":"Alan adı Yöneticisi",From:"Kimden",General:"Genel",Information:"Bilgi","Installed version":"Kurulu sürüm",Level:"Seviye",Logger:"Kayıtçı",Logout:"Çıkış Yapın",Message:"İleti",Name:"İsim","New recovery codes":"Yeni kurtarma kodları",Next:"Sonraki",No:"Hayır","One or more updates are available":"Bir veya daha fazla güncelleme mevcut",Password:"Parola","Passwords mismatch":"Parolalar uyuşmuyor","Phone number":"Telefon numarası","Pin code":"Pin kodu",Profile:"Profil","Profile updated":"Profil güncellendi",Register:"Kayıt ol",Reseller:"Bayii","Reset recovery codes":"Kurtarma kodlarını sıfırla",Role:"Rol",Save:"Kaydet","Secondary email":"İkincil e-posta",Settings:"Ayarlar","Simple user":"Basit kullanıcı",To:"Kime",Unknown:"Bilinmeyen",Update:"Güncelle",Username:"Kullanıcı adı","Welcome to Modoboa":"Modoboa'ya hoş geldiniz",Yes:"Evet"},QS={en:NS,br:FS,cs:zS,de:BS,el:HS,es:WS,fi:YS,fr:VS,ja:XS,it:US,nl:jS,pl:GS,pt_BR:qS,ru:$S,sv:KS,zh:ZS,tr:JS},Hs=OS({availableLanguages:{en:"English",cs:"Czech",de:"German",br:"Breton",el:"Greek",es:"Spain",fi:"Finnish",fr:"French",it:"Italian",ja:"Japanese",nl:"Dutch",pl:"Polish",pt_BR:"Portuguese (BR)",ru:"Russian",sv:"Swedish",tr:"tr",zh:"Chinese"},defaultLanguage:"en",translations:QS,silent:!0});class Wa extends Error{}Wa.prototype.name="InvalidTokenError";function eA(e){return decodeURIComponent(atob(e).replace(/(.)/g,(t,a)=>{let o=a.charCodeAt(0).toString(16).toUpperCase();return o.length<2&&(o="0"+o),"%"+o}))}function tA(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw new Error("base64 string is not of the correct length")}try{return eA(t)}catch{return atob(t)}}function iA(e,t){if(typeof e!="string")throw new Wa("Invalid token specified: must be a string");t||(t={});const a=t.header===!0?0:1,o=e.split(".")[a];if(typeof o!="string")throw new Wa(`Invalid token specified: missing part #${a+1}`);let u;try{u=tA(o)}catch(f){throw new Wa(`Invalid token specified: invalid base64 for part #${a+1} (${f.message})`)}try{return JSON.parse(u)}catch(f){throw new Wa(`Invalid token specified: invalid json for part #${a+1} (${f.message})`)}}var sA={debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}},Li,Oi,kn=(e=>(e[e.NONE=0]="NONE",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(kn||{});(e=>{function t(){Li=3,Oi=sA}e.reset=t;function a(u){if(!(0<=u&&u<=4))throw new Error("Invalid log level");Li=u}e.setLevel=a;function o(u){Oi=u}e.setLogger=o})(kn||(kn={}));var $e=class _i{constructor(t){this._name=t}debug(...t){Li>=4&&Oi.debug(_i._format(this._name,this._method),...t)}info(...t){Li>=3&&Oi.info(_i._format(this._name,this._method),...t)}warn(...t){Li>=2&&Oi.warn(_i._format(this._name,this._method),...t)}error(...t){Li>=1&&Oi.error(_i._format(this._name,this._method),...t)}throw(t){throw this.error(t),t}create(t){const a=Object.create(this);return a._method=t,a.debug("begin"),a}static createStatic(t,a){const o=new _i(`${t}.${a}`);return o.debug("begin"),o}static _format(t,a){const o=`[${t}]`;return a?`${o} ${a}:`:o}static debug(t,...a){Li>=4&&Oi.debug(_i._format(t),...a)}static info(t,...a){Li>=3&&Oi.info(_i._format(t),...a)}static warn(t,...a){Li>=2&&Oi.warn(_i._format(t),...a)}static error(t,...a){Li>=1&&Oi.error(_i._format(t),...a)}};kn.reset();var Sn=class{static decode(e){try{return iA(e)}catch(t){throw $e.error("JwtUtils.decode",t),t}}static async generateSignedJwt(e,t,a){const o=ii.encodeBase64Url(new TextEncoder().encode(JSON.stringify(e))),u=ii.encodeBase64Url(new TextEncoder().encode(JSON.stringify(t))),f=`${o}.${u}`,g=await window.crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},a,new TextEncoder().encode(f)),y=ii.encodeBase64Url(new Uint8Array(g));return`${f}.${y}`}},aA="10000000-1000-4000-8000-100000000000",Ll=e=>btoa([...new Uint8Array(e)].map(t=>String.fromCharCode(t)).join("")),Cp=class Di{static _randomWord(){const t=new Uint32Array(1);return crypto.getRandomValues(t),t[0]}static generateUUIDv4(){return aA.replace(/[018]/g,a=>(+a^Di._randomWord()&15>>+a/4).toString(16)).replace(/-/g,"")}static generateCodeVerifier(){return Di.generateUUIDv4()+Di.generateUUIDv4()+Di.generateUUIDv4()}static async generateCodeChallenge(t){if(!crypto.subtle)throw new Error("Crypto.subtle is available only in secure contexts (HTTPS).");try{const o=new TextEncoder().encode(t),u=await crypto.subtle.digest("SHA-256",o);return Ll(u).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}catch(a){throw $e.error("CryptoUtils.generateCodeChallenge",a),a}}static generateBasicAuth(t,a){const u=new TextEncoder().encode([t,a].join(":"));return Ll(u)}static async hash(t,a){const o=new TextEncoder().encode(a),u=await crypto.subtle.digest(t,o);return new Uint8Array(u)}static async customCalculateJwkThumbprint(t){let a;switch(t.kty){case"RSA":a={e:t.e,kty:t.kty,n:t.n};break;case"EC":a={crv:t.crv,kty:t.kty,x:t.x,y:t.y};break;case"OKP":a={crv:t.crv,kty:t.kty,x:t.x};break;case"oct":a={crv:t.k,kty:t.kty};break;default:throw new Error("Unknown jwk type")}const o=await Di.hash("SHA-256",JSON.stringify(a));return Di.encodeBase64Url(o)}static async generateDPoPProof({url:t,accessToken:a,httpMethod:o,keyPair:u,nonce:f}){let g,y;const k={jti:window.crypto.randomUUID(),htm:o??"GET",htu:t,iat:Math.floor(Date.now()/1e3)};a&&(g=await Di.hash("SHA-256",a),y=Di.encodeBase64Url(g),k.ath=y),f&&(k.nonce=f);try{const A=await crypto.subtle.exportKey("jwk",u.publicKey),M={alg:"ES256",typ:"dpop+jwt",jwk:{crv:A.crv,kty:A.kty,x:A.x,y:A.y}};return await Sn.generateSignedJwt(M,k,u.privateKey)}catch(A){throw A instanceof TypeError?new Error(`Error exporting dpop public key: ${A.message}`):A}}static async generateDPoPJkt(t){try{const a=await crypto.subtle.exportKey("jwk",t.publicKey);return await Di.customCalculateJwkThumbprint(a)}catch(a){throw a instanceof TypeError?new Error(`Could not retrieve dpop keys from storage: ${a.message}`):a}}static async generateDPoPKeys(){return await window.crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!1,["sign","verify"])}};Cp.encodeBase64Url=e=>Ll(e).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_");var ii=Cp,fs=class{constructor(t){this._name=t,this._callbacks=[],this._logger=new $e(`Event('${this._name}')`)}addHandler(t){return this._callbacks.push(t),()=>this.removeHandler(t)}removeHandler(t){const a=this._callbacks.lastIndexOf(t);a>=0&&this._callbacks.splice(a,1)}async raise(...t){this._logger.debug("raise:",...t);for(const a of this._callbacks)await a(...t)}},$d=class{static center({...e}){var t,a,o;return e.width==null&&(e.width=(t=[800,720,600,480].find(u=>u<=window.outerWidth/1.618))!=null?t:360),(a=e.left)!=null||(e.left=Math.max(0,Math.round(window.screenX+(window.outerWidth-e.width)/2))),e.height!=null&&((o=e.top)!=null||(e.top=Math.max(0,Math.round(window.screenY+(window.outerHeight-e.height)/2)))),e}static serialize(e){return Object.entries(e).filter(([,t])=>t!=null).map(([t,a])=>`${t}=${typeof a!="boolean"?a:a?"yes":"no"}`).join(",")}},Ji=class tn extends fs{constructor(){super(...arguments),this._logger=new $e(`Timer('${this._name}')`),this._timerHandle=null,this._expiration=0,this._callback=()=>{const t=this._expiration-tn.getEpochTime();this._logger.debug("timer completes in",t),this._expiration<=tn.getEpochTime()&&(this.cancel(),super.raise())}}static getEpochTime(){return Math.floor(Date.now()/1e3)}init(t){const a=this._logger.create("init");t=Math.max(Math.floor(t),1);const o=tn.getEpochTime()+t;if(this.expiration===o&&this._timerHandle){a.debug("skipping since already initialized for expiration at",this.expiration);return}this.cancel(),a.debug("using duration",t),this._expiration=o;const u=Math.min(t,5);this._timerHandle=setInterval(this._callback,u*1e3)}get expiration(){return this._expiration}cancel(){this._logger.create("cancel"),this._timerHandle&&(clearInterval(this._timerHandle),this._timerHandle=null)}},Ol=class{static readParams(e,t="query"){if(!e)throw new TypeError("Invalid URL");const o=new URL(e,"http://127.0.0.1")[t==="fragment"?"hash":"search"];return new URLSearchParams(o.slice(1))}},Sa=";",Gs=class extends Error{constructor(e,t){var a,o,u;if(super(e.error_description||e.error||""),this.form=t,this.name="ErrorResponse",!e.error)throw $e.error("ErrorResponse","No error passed"),new Error("No error passed");this.error=e.error,this.error_description=(a=e.error_description)!=null?a:null,this.error_uri=(o=e.error_uri)!=null?o:null,this.state=e.userState,this.session_state=(u=e.session_state)!=null?u:null,this.url_state=e.url_state}},Oc=class extends Error{constructor(e){super(e),this.name="ErrorTimeout"}},rA=class{constructor(e){this._logger=new $e("AccessTokenEvents"),this._expiringTimer=new Ji("Access token expiring"),this._expiredTimer=new Ji("Access token expired"),this._expiringNotificationTimeInSeconds=e.expiringNotificationTimeInSeconds}async load(e){const t=this._logger.create("load");if(e.access_token&&e.expires_in!==void 0){const a=e.expires_in;if(t.debug("access token present, remaining duration:",a),a>0){let u=a-this._expiringNotificationTimeInSeconds;u<=0&&(u=1),t.debug("registering expiring timer, raising in",u,"seconds"),this._expiringTimer.init(u)}else t.debug("canceling existing expiring timer because we're past expiration."),this._expiringTimer.cancel();const o=a+1;t.debug("registering expired timer, raising in",o,"seconds"),this._expiredTimer.init(o)}else this._expiringTimer.cancel(),this._expiredTimer.cancel()}async unload(){this._logger.debug("unload: canceling existing access token timers"),this._expiringTimer.cancel(),this._expiredTimer.cancel()}addAccessTokenExpiring(e){return this._expiringTimer.addHandler(e)}removeAccessTokenExpiring(e){this._expiringTimer.removeHandler(e)}addAccessTokenExpired(e){return this._expiredTimer.addHandler(e)}removeAccessTokenExpired(e){this._expiredTimer.removeHandler(e)}},nA=class{constructor(e,t,a,o,u){this._callback=e,this._client_id=t,this._intervalInSeconds=o,this._stopOnError=u,this._logger=new $e("CheckSessionIFrame"),this._timer=null,this._session_state=null,this._message=g=>{g.origin===this._frame_origin&&g.source===this._frame.contentWindow&&(g.data==="error"?(this._logger.error("error message from check session op iframe"),this._stopOnError&&this.stop()):g.data==="changed"?(this._logger.debug("changed message from check session op iframe"),this.stop(),this._callback()):this._logger.debug(g.data+" message from check session op iframe"))};const f=new URL(a);this._frame_origin=f.origin,this._frame=window.document.createElement("iframe"),this._frame.style.visibility="hidden",this._frame.style.position="fixed",this._frame.style.left="-1000px",this._frame.style.top="0",this._frame.width="0",this._frame.height="0",this._frame.src=f.href}load(){return new Promise(e=>{this._frame.onload=()=>{e()},window.document.body.appendChild(this._frame),window.addEventListener("message",this._message,!1)})}start(e){if(this._session_state===e)return;this._logger.create("start"),this.stop(),this._session_state=e;const t=()=>{!this._frame.contentWindow||!this._session_state||this._frame.contentWindow.postMessage(this._client_id+" "+this._session_state,this._frame_origin)};t(),this._timer=setInterval(t,this._intervalInSeconds*1e3)}stop(){this._logger.create("stop"),this._session_state=null,this._timer&&(clearInterval(this._timer),this._timer=null)}},Ep=class{constructor(){this._logger=new $e("InMemoryWebStorage"),this._data={}}clear(){this._logger.create("clear"),this._data={}}getItem(e){return this._logger.create(`getItem('${e}')`),this._data[e]}setItem(e,t){this._logger.create(`setItem('${e}')`),this._data[e]=t}removeItem(e){this._logger.create(`removeItem('${e}')`),delete this._data[e]}get length(){return Object.getOwnPropertyNames(this._data).length}key(e){return Object.getOwnPropertyNames(this._data)[e]}},Nl=class extends Error{constructor(e,t){super(t),this.name="ErrorDPoPNonce",this.nonce=e}},Nc=class{constructor(e=[],t=null,a={}){this._jwtHandler=t,this._extraHeaders=a,this._logger=new $e("JsonService"),this._contentTypes=[],this._contentTypes.push(...e,"application/json"),t&&this._contentTypes.push("application/jwt")}async fetchWithTimeout(e,t={}){const{timeoutInSeconds:a,...o}=t;if(!a)return await fetch(e,o);const u=new AbortController,f=setTimeout(()=>u.abort(),a*1e3);try{return await fetch(e,{...t,signal:u.signal})}catch(g){throw g instanceof DOMException&&g.name==="AbortError"?new Oc("Network timed out"):g}finally{clearTimeout(f)}}async getJson(e,{token:t,credentials:a,timeoutInSeconds:o}={}){const u=this._logger.create("getJson"),f={Accept:this._contentTypes.join(", ")};t&&(u.debug("token passed, setting Authorization header"),f.Authorization="Bearer "+t),this._appendExtraHeaders(f);let g;try{u.debug("url:",e),g=await this.fetchWithTimeout(e,{method:"GET",headers:f,timeoutInSeconds:o,credentials:a})}catch(A){throw u.error("Network Error"),A}u.debug("HTTP response received, status",g.status);const y=g.headers.get("Content-Type");if(y&&!this._contentTypes.find(A=>y.startsWith(A))&&u.throw(new Error(`Invalid response Content-Type: ${y??"undefined"}, from URL: ${e}`)),g.ok&&this._jwtHandler&&(y!=null&&y.startsWith("application/jwt")))return await this._jwtHandler(await g.text());let k;try{k=await g.json()}catch(A){throw u.error("Error parsing JSON response",A),g.ok?A:new Error(`${g.statusText} (${g.status})`)}if(!g.ok)throw u.error("Error from server:",k),k.error?new Gs(k):new Error(`${g.statusText} (${g.status}): ${JSON.stringify(k)}`);return k}async postForm(e,{body:t,basicAuth:a,timeoutInSeconds:o,initCredentials:u,extraHeaders:f}){const g=this._logger.create("postForm"),y={Accept:this._contentTypes.join(", "),"Content-Type":"application/x-www-form-urlencoded",...f};a!==void 0&&(y.Authorization="Basic "+a),this._appendExtraHeaders(y);let k;try{g.debug("url:",e),k=await this.fetchWithTimeout(e,{method:"POST",headers:y,body:t,timeoutInSeconds:o,credentials:u})}catch(N){throw g.error("Network error"),N}g.debug("HTTP response received, status",k.status);const A=k.headers.get("Content-Type");if(A&&!this._contentTypes.find(N=>A.startsWith(N)))throw new Error(`Invalid response Content-Type: ${A??"undefined"}, from URL: ${e}`);const M=await k.text();let P={};if(M)try{P=JSON.parse(M)}catch(N){throw g.error("Error parsing JSON response",N),k.ok?N:new Error(`${k.statusText} (${k.status})`)}if(!k.ok){if(g.error("Error from server:",P),k.headers.has("dpop-nonce")){const N=k.headers.get("dpop-nonce");throw new Nl(N,`${JSON.stringify(P)}`)}throw P.error?new Gs(P,t):new Error(`${k.statusText} (${k.status}): ${JSON.stringify(P)}`)}return P}_appendExtraHeaders(e){const t=this._logger.create("appendExtraHeaders"),a=Object.keys(this._extraHeaders),o=["accept","content-type"],u=["authorization"];a.length!==0&&a.forEach(f=>{if(o.includes(f.toLocaleLowerCase())){t.warn("Protected header could not be set",f,o);return}if(u.includes(f.toLocaleLowerCase())&&Object.keys(e).includes(f)){t.warn("Header could not be overridden",f,u);return}const g=typeof this._extraHeaders[f]=="function"?this._extraHeaders[f]():this._extraHeaders[f];g&&g!==""&&(e[f]=g)})}},oA=class{constructor(e){this._settings=e,this._logger=new $e("MetadataService"),this._signingKeys=null,this._metadata=null,this._metadataUrl=this._settings.metadataUrl,this._jsonService=new Nc(["application/jwk-set+json"],null,this._settings.extraHeaders),this._settings.signingKeys&&(this._logger.debug("using signingKeys from settings"),this._signingKeys=this._settings.signingKeys),this._settings.metadata&&(this._logger.debug("using metadata from settings"),this._metadata=this._settings.metadata),this._settings.fetchRequestCredentials&&(this._logger.debug("using fetchRequestCredentials from settings"),this._fetchRequestCredentials=this._settings.fetchRequestCredentials)}resetSigningKeys(){this._signingKeys=null}async getMetadata(){const e=this._logger.create("getMetadata");if(this._metadata)return e.debug("using cached values"),this._metadata;if(!this._metadataUrl)throw e.throw(new Error("No authority or metadataUrl configured on settings")),null;e.debug("getting metadata from",this._metadataUrl);const t=await this._jsonService.getJson(this._metadataUrl,{credentials:this._fetchRequestCredentials,timeoutInSeconds:this._settings.requestTimeoutInSeconds});return e.debug("merging remote JSON with seed metadata"),this._metadata=Object.assign({},t,this._settings.metadataSeed),this._metadata}getIssuer(){return this._getMetadataProperty("issuer")}getAuthorizationEndpoint(){return this._getMetadataProperty("authorization_endpoint")}getUserInfoEndpoint(){return this._getMetadataProperty("userinfo_endpoint")}getTokenEndpoint(e=!0){return this._getMetadataProperty("token_endpoint",e)}getCheckSessionIframe(){return this._getMetadataProperty("check_session_iframe",!0)}getEndSessionEndpoint(){return this._getMetadataProperty("end_session_endpoint",!0)}getRevocationEndpoint(e=!0){return this._getMetadataProperty("revocation_endpoint",e)}getKeysEndpoint(e=!0){return this._getMetadataProperty("jwks_uri",e)}async _getMetadataProperty(e,t=!1){const a=this._logger.create(`_getMetadataProperty('${e}')`),o=await this.getMetadata();if(a.debug("resolved"),o[e]===void 0){if(t===!0){a.warn("Metadata does not contain optional property");return}a.throw(new Error("Metadata does not contain property "+e))}return o[e]}async getSigningKeys(){const e=this._logger.create("getSigningKeys");if(this._signingKeys)return e.debug("returning signingKeys from cache"),this._signingKeys;const t=await this.getKeysEndpoint(!1);e.debug("got jwks_uri",t);const a=await this._jsonService.getJson(t,{timeoutInSeconds:this._settings.requestTimeoutInSeconds});if(e.debug("got key set",a),!Array.isArray(a.keys))throw e.throw(new Error("Missing keys on keyset")),null;return this._signingKeys=a.keys,this._signingKeys}},Mp=class{constructor({prefix:e="oidc.",store:t=localStorage}={}){this._logger=new $e("WebStorageStateStore"),this._store=t,this._prefix=e}async set(e,t){this._logger.create(`set('${e}')`),e=this._prefix+e,await this._store.setItem(e,t)}async get(e){return this._logger.create(`get('${e}')`),e=this._prefix+e,await this._store.getItem(e)}async remove(e){this._logger.create(`remove('${e}')`),e=this._prefix+e;const t=await this._store.getItem(e);return await this._store.removeItem(e),t}async getAllKeys(){this._logger.create("getAllKeys");const e=await this._store.length,t=[];for(let a=0;a<e;a++){const o=await this._store.key(a);o&&o.indexOf(this._prefix)===0&&t.push(o.substr(this._prefix.length))}return t}},lA="code",cA="openid",uA="client_secret_post",dA=60*15,Fl=class{constructor({authority:e,metadataUrl:t,metadata:a,signingKeys:o,metadataSeed:u,client_id:f,client_secret:g,response_type:y=lA,scope:k=cA,redirect_uri:A,post_logout_redirect_uri:M,client_authentication:P=uA,prompt:N,display:H,max_age:z,ui_locales:G,acr_values:Q,resource:q,response_mode:ie,filterProtocolClaims:$=!0,loadUserInfo:re=!1,requestTimeoutInSeconds:B,staleStateAgeInSeconds:de=dA,mergeClaimsStrategy:ae={array:"replace"},disablePKCE:U=!1,stateStore:J,revokeTokenAdditionalContentTypes:fe,fetchRequestCredentials:ge,refreshTokenAllowedScope:se,extraQueryParams:Me={},extraTokenParams:Te={},extraHeaders:Je={},dpop:He,omitScopeWhenRequesting:_e=!1}){var Ve;if(this.authority=e,t?this.metadataUrl=t:(this.metadataUrl=e,e&&(this.metadataUrl.endsWith("/")||(this.metadataUrl+="/"),this.metadataUrl+=".well-known/openid-configuration")),this.metadata=a,this.metadataSeed=u,this.signingKeys=o,this.client_id=f,this.client_secret=g,this.response_type=y,this.scope=k,this.redirect_uri=A,this.post_logout_redirect_uri=M,this.client_authentication=P,this.prompt=N,this.display=H,this.max_age=z,this.ui_locales=G,this.acr_values=Q,this.resource=q,this.response_mode=ie,this.filterProtocolClaims=$??!0,this.loadUserInfo=!!re,this.staleStateAgeInSeconds=de,this.mergeClaimsStrategy=ae,this.omitScopeWhenRequesting=_e,this.disablePKCE=!!U,this.revokeTokenAdditionalContentTypes=fe,this.fetchRequestCredentials=ge||"same-origin",this.requestTimeoutInSeconds=B,J)this.stateStore=J;else{const ai=typeof window<"u"?window.localStorage:new Ep;this.stateStore=new Mp({store:ai})}if(this.refreshTokenAllowedScope=se,this.extraQueryParams=Me,this.extraTokenParams=Te,this.extraHeaders=Je,this.dpop=He,this.dpop&&!((Ve=this.dpop)!=null&&Ve.store))throw new Error("A DPoPStore is required when dpop is enabled")}},hA=class{constructor(e,t){this._settings=e,this._metadataService=t,this._logger=new $e("UserInfoService"),this._getClaimsFromJwt=async a=>{const o=this._logger.create("_getClaimsFromJwt");try{const u=Sn.decode(a);return o.debug("JWT decoding successful"),u}catch(u){throw o.error("Error parsing JWT response"),u}},this._jsonService=new Nc(void 0,this._getClaimsFromJwt,this._settings.extraHeaders)}async getClaims(e){const t=this._logger.create("getClaims");e||this._logger.throw(new Error("No token passed"));const a=await this._metadataService.getUserInfoEndpoint();t.debug("got userinfo url",a);const o=await this._jsonService.getJson(a,{token:e,credentials:this._settings.fetchRequestCredentials,timeoutInSeconds:this._settings.requestTimeoutInSeconds});return t.debug("got claims",o),o}},Tp=class{constructor(e,t){this._settings=e,this._metadataService=t,this._logger=new $e("TokenClient"),this._jsonService=new Nc(this._settings.revokeTokenAdditionalContentTypes,null,this._settings.extraHeaders)}async exchangeCode({grant_type:e="authorization_code",redirect_uri:t=this._settings.redirect_uri,client_id:a=this._settings.client_id,client_secret:o=this._settings.client_secret,extraHeaders:u,...f}){const g=this._logger.create("exchangeCode");a||g.throw(new Error("A client_id is required")),t||g.throw(new Error("A redirect_uri is required")),f.code||g.throw(new Error("A code is required"));const y=new URLSearchParams({grant_type:e,redirect_uri:t});for(const[P,N]of Object.entries(f))N!=null&&y.set(P,N);let k;switch(this._settings.client_authentication){case"client_secret_basic":if(o==null)throw g.throw(new Error("A client_secret is required")),null;k=ii.generateBasicAuth(a,o);break;case"client_secret_post":y.append("client_id",a),o&&y.append("client_secret",o);break}const A=await this._metadataService.getTokenEndpoint(!1);g.debug("got token endpoint");const M=await this._jsonService.postForm(A,{body:y,basicAuth:k,timeoutInSeconds:this._settings.requestTimeoutInSeconds,initCredentials:this._settings.fetchRequestCredentials,extraHeaders:u});return g.debug("got response"),M}async exchangeCredentials({grant_type:e="password",client_id:t=this._settings.client_id,client_secret:a=this._settings.client_secret,scope:o=this._settings.scope,...u}){const f=this._logger.create("exchangeCredentials");t||f.throw(new Error("A client_id is required"));const g=new URLSearchParams({grant_type:e});this._settings.omitScopeWhenRequesting||g.set("scope",o);for(const[M,P]of Object.entries(u))P!=null&&g.set(M,P);let y;switch(this._settings.client_authentication){case"client_secret_basic":if(a==null)throw f.throw(new Error("A client_secret is required")),null;y=ii.generateBasicAuth(t,a);break;case"client_secret_post":g.append("client_id",t),a&&g.append("client_secret",a);break}const k=await this._metadataService.getTokenEndpoint(!1);f.debug("got token endpoint");const A=await this._jsonService.postForm(k,{body:g,basicAuth:y,timeoutInSeconds:this._settings.requestTimeoutInSeconds,initCredentials:this._settings.fetchRequestCredentials});return f.debug("got response"),A}async exchangeRefreshToken({grant_type:e="refresh_token",client_id:t=this._settings.client_id,client_secret:a=this._settings.client_secret,timeoutInSeconds:o,extraHeaders:u,...f}){const g=this._logger.create("exchangeRefreshToken");t||g.throw(new Error("A client_id is required")),f.refresh_token||g.throw(new Error("A refresh_token is required"));const y=new URLSearchParams({grant_type:e});for(const[P,N]of Object.entries(f))Array.isArray(N)?N.forEach(H=>y.append(P,H)):N!=null&&y.set(P,N);let k;switch(this._settings.client_authentication){case"client_secret_basic":if(a==null)throw g.throw(new Error("A client_secret is required")),null;k=ii.generateBasicAuth(t,a);break;case"client_secret_post":y.append("client_id",t),a&&y.append("client_secret",a);break}const A=await this._metadataService.getTokenEndpoint(!1);g.debug("got token endpoint");const M=await this._jsonService.postForm(A,{body:y,basicAuth:k,timeoutInSeconds:o,initCredentials:this._settings.fetchRequestCredentials,extraHeaders:u});return g.debug("got response"),M}async revoke(e){var t;const a=this._logger.create("revoke");e.token||a.throw(new Error("A token is required"));const o=await this._metadataService.getRevocationEndpoint(!1);a.debug(`got revocation endpoint, revoking ${(t=e.token_type_hint)!=null?t:"default token type"}`);const u=new URLSearchParams;for(const[f,g]of Object.entries(e))g!=null&&u.set(f,g);u.set("client_id",this._settings.client_id),this._settings.client_secret&&u.set("client_secret",this._settings.client_secret),await this._jsonService.postForm(o,{body:u,timeoutInSeconds:this._settings.requestTimeoutInSeconds}),a.debug("got response")}},fA=class{constructor(e,t,a){this._settings=e,this._metadataService=t,this._claimsService=a,this._logger=new $e("ResponseValidator"),this._userInfoService=new hA(this._settings,this._metadataService),this._tokenClient=new Tp(this._settings,this._metadataService)}async validateSigninResponse(e,t,a){const o=this._logger.create("validateSigninResponse");this._processSigninState(e,t),o.debug("state processed"),await this._processCode(e,t,a),o.debug("code processed"),e.isOpenId&&this._validateIdTokenAttributes(e),o.debug("tokens validated"),await this._processClaims(e,t==null?void 0:t.skipUserInfo,e.isOpenId),o.debug("claims processed")}async validateCredentialsResponse(e,t){const a=this._logger.create("validateCredentialsResponse"),o=e.isOpenId&&!!e.id_token;o&&this._validateIdTokenAttributes(e),a.debug("tokens validated"),await this._processClaims(e,t,o),a.debug("claims processed")}async validateRefreshResponse(e,t){var a,o;const u=this._logger.create("validateRefreshResponse");e.userState=t.data,(a=e.session_state)!=null||(e.session_state=t.session_state),(o=e.scope)!=null||(e.scope=t.scope),e.isOpenId&&e.id_token&&(this._validateIdTokenAttributes(e,t.id_token),u.debug("ID Token validated")),e.id_token||(e.id_token=t.id_token,e.profile=t.profile);const f=e.isOpenId&&!!e.id_token;await this._processClaims(e,!1,f),u.debug("claims processed")}validateSignoutResponse(e,t){const a=this._logger.create("validateSignoutResponse");if(t.id!==e.state&&a.throw(new Error("State does not match")),a.debug("state validated"),e.userState=t.data,e.error)throw a.warn("Response was error",e.error),new Gs(e)}_processSigninState(e,t){var a;const o=this._logger.create("_processSigninState");if(t.id!==e.state&&o.throw(new Error("State does not match")),t.client_id||o.throw(new Error("No client_id on state")),t.authority||o.throw(new Error("No authority on state")),this._settings.authority!==t.authority&&o.throw(new Error("authority mismatch on settings vs. signin state")),this._settings.client_id&&this._settings.client_id!==t.client_id&&o.throw(new Error("client_id mismatch on settings vs. signin state")),o.debug("state validated"),e.userState=t.data,e.url_state=t.url_state,(a=e.scope)!=null||(e.scope=t.scope),e.error)throw o.warn("Response was error",e.error),new Gs(e);t.code_verifier&&!e.code&&o.throw(new Error("Expected code in response"))}async _processClaims(e,t=!1,a=!0){const o=this._logger.create("_processClaims");if(e.profile=this._claimsService.filterProtocolClaims(e.profile),t||!this._settings.loadUserInfo||!e.access_token){o.debug("not loading user info");return}o.debug("loading user info");const u=await this._userInfoService.getClaims(e.access_token);o.debug("user info claims received from user info endpoint"),a&&u.sub!==e.profile.sub&&o.throw(new Error("subject from UserInfo response does not match subject in ID Token")),e.profile=this._claimsService.mergeClaims(e.profile,this._claimsService.filterProtocolClaims(u)),o.debug("user info claims received, updated profile:",e.profile)}async _processCode(e,t,a){const o=this._logger.create("_processCode");if(e.code){o.debug("Validating code");const u=await this._tokenClient.exchangeCode({client_id:t.client_id,client_secret:t.client_secret,code:e.code,redirect_uri:t.redirect_uri,code_verifier:t.code_verifier,extraHeaders:a,...t.extraTokenParams});Object.assign(e,u)}else o.debug("No code to process")}_validateIdTokenAttributes(e,t){var a;const o=this._logger.create("_validateIdTokenAttributes");o.debug("decoding ID Token JWT");const u=Sn.decode((a=e.id_token)!=null?a:"");if(u.sub||o.throw(new Error("ID Token is missing a subject claim")),t){const f=Sn.decode(t);u.sub!==f.sub&&o.throw(new Error("sub in id_token does not match current sub")),u.auth_time&&u.auth_time!==f.auth_time&&o.throw(new Error("auth_time in id_token does not match original auth_time")),u.azp&&u.azp!==f.azp&&o.throw(new Error("azp in id_token does not match original azp")),!u.azp&&f.azp&&o.throw(new Error("azp not in id_token, but present in original id_token"))}e.profile=u}},An=class zl{constructor(t){this.id=t.id||ii.generateUUIDv4(),this.data=t.data,t.created&&t.created>0?this.created=t.created:this.created=Ji.getEpochTime(),this.request_type=t.request_type,this.url_state=t.url_state}toStorageString(){return new $e("State").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type,url_state:this.url_state})}static fromStorageString(t){return $e.createStatic("State","fromStorageString"),Promise.resolve(new zl(JSON.parse(t)))}static async clearStaleState(t,a){const o=$e.createStatic("State","clearStaleState"),u=Ji.getEpochTime()-a,f=await t.getAllKeys();o.debug("got keys",f);for(let g=0;g<f.length;g++){const y=f[g],k=await t.get(y);let A=!1;if(k)try{const M=await zl.fromStorageString(k);o.debug("got item from key:",y,M.created),M.created<=u&&(A=!0)}catch(M){o.error("Error parsing state for key:",y,M),A=!0}else o.debug("no item in storage for key:",y),A=!0;A&&(o.debug("removed item for key:",y),t.remove(y))}}},Pp=class Bl extends An{constructor(t){super(t),this.code_verifier=t.code_verifier,this.code_challenge=t.code_challenge,this.authority=t.authority,this.client_id=t.client_id,this.redirect_uri=t.redirect_uri,this.scope=t.scope,this.client_secret=t.client_secret,this.extraTokenParams=t.extraTokenParams,this.response_mode=t.response_mode,this.skipUserInfo=t.skipUserInfo}static async create(t){const a=t.code_verifier===!0?ii.generateCodeVerifier():t.code_verifier||void 0,o=a?await ii.generateCodeChallenge(a):void 0;return new Bl({...t,code_verifier:a,code_challenge:o})}toStorageString(){return new $e("SigninState").create("toStorageString"),JSON.stringify({id:this.id,data:this.data,created:this.created,request_type:this.request_type,url_state:this.url_state,code_verifier:this.code_verifier,authority:this.authority,client_id:this.client_id,redirect_uri:this.redirect_uri,scope:this.scope,client_secret:this.client_secret,extraTokenParams:this.extraTokenParams,response_mode:this.response_mode,skipUserInfo:this.skipUserInfo})}static fromStorageString(t){$e.createStatic("SigninState","fromStorageString");const a=JSON.parse(t);return Bl.create(a)}},Ip=class _p{constructor(t){this.url=t.url,this.state=t.state}static async create({url:t,authority:a,client_id:o,redirect_uri:u,response_type:f,scope:g,state_data:y,response_mode:k,request_type:A,client_secret:M,nonce:P,url_state:N,resource:H,skipUserInfo:z,extraQueryParams:G,extraTokenParams:Q,disablePKCE:q,dpopJkt:ie,omitScopeWhenRequesting:$,...re}){if(!t)throw this._logger.error("create: No url passed"),new Error("url");if(!o)throw this._logger.error("create: No client_id passed"),new Error("client_id");if(!u)throw this._logger.error("create: No redirect_uri passed"),new Error("redirect_uri");if(!f)throw this._logger.error("create: No response_type passed"),new Error("response_type");if(!g)throw this._logger.error("create: No scope passed"),new Error("scope");if(!a)throw this._logger.error("create: No authority passed"),new Error("authority");const B=await Pp.create({data:y,request_type:A,url_state:N,code_verifier:!q,client_id:o,authority:a,redirect_uri:u,response_mode:k,client_secret:M,scope:g,extraTokenParams:Q,skipUserInfo:z}),de=new URL(t);de.searchParams.append("client_id",o),de.searchParams.append("redirect_uri",u),de.searchParams.append("response_type",f),$||de.searchParams.append("scope",g),P&&de.searchParams.append("nonce",P),ie&&de.searchParams.append("dpop_jkt",ie);let ae=B.id;N&&(ae=`${ae}${Sa}${N}`),de.searchParams.append("state",ae),B.code_challenge&&(de.searchParams.append("code_challenge",B.code_challenge),de.searchParams.append("code_challenge_method","S256")),H&&(Array.isArray(H)?H:[H]).forEach(J=>de.searchParams.append("resource",J));for(const[U,J]of Object.entries({response_mode:k,...re,...G}))J!=null&&de.searchParams.append(U,J.toString());return new _p({url:de.href,state:B})}};Ip._logger=new $e("SigninRequest");var gA=Ip,pA="openid",Fo=class{constructor(e){if(this.access_token="",this.token_type="",this.profile={},this.state=e.get("state"),this.session_state=e.get("session_state"),this.state){const t=decodeURIComponent(this.state).split(Sa);this.state=t[0],t.length>1&&(this.url_state=t.slice(1).join(Sa))}this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri"),this.code=e.get("code")}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-Ji.getEpochTime()}set expires_in(e){typeof e=="string"&&(e=Number(e)),e!==void 0&&e>=0&&(this.expires_at=Math.floor(e)+Ji.getEpochTime())}get isOpenId(){var e;return((e=this.scope)==null?void 0:e.split(" ").includes(pA))||!!this.id_token}},mA=class{constructor({url:e,state_data:t,id_token_hint:a,post_logout_redirect_uri:o,extraQueryParams:u,request_type:f,client_id:g,url_state:y}){if(this._logger=new $e("SignoutRequest"),!e)throw this._logger.error("ctor: No url passed"),new Error("url");const k=new URL(e);if(a&&k.searchParams.append("id_token_hint",a),g&&k.searchParams.append("client_id",g),o&&(k.searchParams.append("post_logout_redirect_uri",o),t||y)){this.state=new An({data:t,request_type:f,url_state:y});let A=this.state.id;y&&(A=`${A}${Sa}${y}`),k.searchParams.append("state",A)}for(const[A,M]of Object.entries({...u}))M!=null&&k.searchParams.append(A,M.toString());this.url=k.href}},vA=class{constructor(e){if(this.state=e.get("state"),this.state){const t=decodeURIComponent(this.state).split(Sa);this.state=t[0],t.length>1&&(this.url_state=t.slice(1).join(Sa))}this.error=e.get("error"),this.error_description=e.get("error_description"),this.error_uri=e.get("error_uri")}},bA=["nbf","jti","auth_time","nonce","acr","amr","azp","at_hash"],xA=["sub","iss","aud","exp","iat"],yA=class{constructor(e){this._settings=e,this._logger=new $e("ClaimsService")}filterProtocolClaims(e){const t={...e};if(this._settings.filterProtocolClaims){let a;Array.isArray(this._settings.filterProtocolClaims)?a=this._settings.filterProtocolClaims:a=bA;for(const o of a)xA.includes(o)||delete t[o]}return t}mergeClaims(e,t){const a={...e};for(const[o,u]of Object.entries(t))if(a[o]!==u)if(Array.isArray(a[o])||Array.isArray(u))if(this._settings.mergeClaimsStrategy.array=="replace")a[o]=u;else{const f=Array.isArray(a[o])?a[o]:[a[o]];for(const g of Array.isArray(u)?u:[u])f.includes(g)||f.push(g);a[o]=f}else typeof a[o]=="object"&&typeof u=="object"?a[o]=this.mergeClaims(a[o],u):a[o]=u;return a}},Dp=class{constructor(e,t){this.keys=e,this.nonce=t}},wA=class{constructor(e,t){this._logger=new $e("OidcClient"),this.settings=e instanceof Fl?e:new Fl(e),this.metadataService=t??new oA(this.settings),this._claimsService=new yA(this.settings),this._validator=new fA(this.settings,this.metadataService,this._claimsService),this._tokenClient=new Tp(this.settings,this.metadataService)}async createSigninRequest({state:e,request:t,request_uri:a,request_type:o,id_token_hint:u,login_hint:f,skipUserInfo:g,nonce:y,url_state:k,response_type:A=this.settings.response_type,scope:M=this.settings.scope,redirect_uri:P=this.settings.redirect_uri,prompt:N=this.settings.prompt,display:H=this.settings.display,max_age:z=this.settings.max_age,ui_locales:G=this.settings.ui_locales,acr_values:Q=this.settings.acr_values,resource:q=this.settings.resource,response_mode:ie=this.settings.response_mode,extraQueryParams:$=this.settings.extraQueryParams,extraTokenParams:re=this.settings.extraTokenParams,dpopJkt:B,omitScopeWhenRequesting:de=this.settings.omitScopeWhenRequesting}){const ae=this._logger.create("createSigninRequest");if(A!=="code")throw new Error("Only the Authorization Code flow (with PKCE) is supported");const U=await this.metadataService.getAuthorizationEndpoint();ae.debug("Received authorization endpoint",U);const J=await gA.create({url:U,authority:this.settings.authority,client_id:this.settings.client_id,redirect_uri:P,response_type:A,scope:M,state_data:e,url_state:k,prompt:N,display:H,max_age:z,ui_locales:G,id_token_hint:u,login_hint:f,acr_values:Q,dpopJkt:B,resource:q,request:t,request_uri:a,extraQueryParams:$,extraTokenParams:re,request_type:o,response_mode:ie,client_secret:this.settings.client_secret,skipUserInfo:g,nonce:y,disablePKCE:this.settings.disablePKCE,omitScopeWhenRequesting:de});await this.clearStaleState();const fe=J.state;return await this.settings.stateStore.set(fe.id,fe.toStorageString()),J}async readSigninResponseState(e,t=!1){const a=this._logger.create("readSigninResponseState"),o=new Fo(Ol.readParams(e,this.settings.response_mode));if(!o.state)throw a.throw(new Error("No state in response")),null;const u=await this.settings.stateStore[t?"remove":"get"](o.state);if(!u)throw a.throw(new Error("No matching state found in storage")),null;return{state:await Pp.fromStorageString(u),response:o}}async processSigninResponse(e,t,a=!0){const o=this._logger.create("processSigninResponse"),{state:u,response:f}=await this.readSigninResponseState(e,a);if(o.debug("received state from storage; validating response"),this.settings.dpop&&this.settings.dpop.store){const g=await this.getDpopProof(this.settings.dpop.store);t={...t,DPoP:g}}try{await this._validator.validateSigninResponse(f,u,t)}catch(g){if(g instanceof Nl&&this.settings.dpop){const y=await this.getDpopProof(this.settings.dpop.store,g.nonce);t.DPoP=y,await this._validator.validateSigninResponse(f,u,t)}else throw g}return f}async getDpopProof(e,t){let a,o;return(await e.getAllKeys()).includes(this.settings.client_id)?(o=await e.get(this.settings.client_id),o.nonce!==t&&t&&(o.nonce=t,await e.set(this.settings.client_id,o))):(a=await ii.generateDPoPKeys(),o=new Dp(a,t),await e.set(this.settings.client_id,o)),await ii.generateDPoPProof({url:await this.metadataService.getTokenEndpoint(!1),httpMethod:"POST",keyPair:o.keys,nonce:o.nonce})}async processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:a=!1,extraTokenParams:o={}}){const u=await this._tokenClient.exchangeCredentials({username:e,password:t,...o}),f=new Fo(new URLSearchParams);return Object.assign(f,u),await this._validator.validateCredentialsResponse(f,a),f}async useRefreshToken({state:e,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,extraTokenParams:f}){var g;const y=this._logger.create("useRefreshToken");let k;if(this.settings.refreshTokenAllowedScope===void 0)k=e.scope;else{const P=this.settings.refreshTokenAllowedScope.split(" ");k=(((g=e.scope)==null?void 0:g.split(" "))||[]).filter(H=>P.includes(H)).join(" ")}if(this.settings.dpop&&this.settings.dpop.store){const P=await this.getDpopProof(this.settings.dpop.store);u={...u,DPoP:P}}let A;try{A=await this._tokenClient.exchangeRefreshToken({refresh_token:e.refresh_token,scope:k,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,...f})}catch(P){if(P instanceof Nl&&this.settings.dpop)u.DPoP=await this.getDpopProof(this.settings.dpop.store,P.nonce),A=await this._tokenClient.exchangeRefreshToken({refresh_token:e.refresh_token,scope:k,redirect_uri:t,resource:a,timeoutInSeconds:o,extraHeaders:u,...f});else throw P}const M=new Fo(new URLSearchParams);return Object.assign(M,A),y.debug("validating response",M),await this._validator.validateRefreshResponse(M,{...e,scope:k}),M}async createSignoutRequest({state:e,id_token_hint:t,client_id:a,request_type:o,url_state:u,post_logout_redirect_uri:f=this.settings.post_logout_redirect_uri,extraQueryParams:g=this.settings.extraQueryParams}={}){const y=this._logger.create("createSignoutRequest"),k=await this.metadataService.getEndSessionEndpoint();if(!k)throw y.throw(new Error("No end session endpoint")),null;y.debug("Received end session endpoint",k),!a&&f&&!t&&(a=this.settings.client_id);const A=new mA({url:k,id_token_hint:t,client_id:a,post_logout_redirect_uri:f,state_data:e,extraQueryParams:g,request_type:o,url_state:u});await this.clearStaleState();const M=A.state;return M&&(y.debug("Signout request has state to persist"),await this.settings.stateStore.set(M.id,M.toStorageString())),A}async readSignoutResponseState(e,t=!1){const a=this._logger.create("readSignoutResponseState"),o=new vA(Ol.readParams(e,this.settings.response_mode));if(!o.state){if(a.debug("No state in response"),o.error)throw a.warn("Response was error:",o.error),new Gs(o);return{state:void 0,response:o}}const u=await this.settings.stateStore[t?"remove":"get"](o.state);if(!u)throw a.throw(new Error("No matching state found in storage")),null;return{state:await An.fromStorageString(u),response:o}}async processSignoutResponse(e){const t=this._logger.create("processSignoutResponse"),{state:a,response:o}=await this.readSignoutResponseState(e,!0);return a?(t.debug("Received state from storage; validating response"),this._validator.validateSignoutResponse(o,a)):t.debug("No state from storage; skipping response validation"),o}clearStaleState(){return this._logger.create("clearStaleState"),An.clearStaleState(this.settings.stateStore,this.settings.staleStateAgeInSeconds)}async revokeToken(e,t){return this._logger.create("revokeToken"),await this._tokenClient.revoke({token:e,token_type_hint:t})}},kA=class{constructor(e){this._userManager=e,this._logger=new $e("SessionMonitor"),this._start=async t=>{const a=t.session_state;if(!a)return;const o=this._logger.create("_start");if(t.profile?(this._sub=t.profile.sub,o.debug("session_state",a,", sub",this._sub)):(this._sub=void 0,o.debug("session_state",a,", anonymous user")),this._checkSessionIFrame){this._checkSessionIFrame.start(a);return}try{const u=await this._userManager.metadataService.getCheckSessionIframe();if(u){o.debug("initializing check session iframe");const f=this._userManager.settings.client_id,g=this._userManager.settings.checkSessionIntervalInSeconds,y=this._userManager.settings.stopCheckSessionOnError,k=new nA(this._callback,f,u,g,y);await k.load(),this._checkSessionIFrame=k,k.start(a)}else o.warn("no check session iframe found in the metadata")}catch(u){o.error("Error from getCheckSessionIframe:",u instanceof Error?u.message:u)}},this._stop=()=>{const t=this._logger.create("_stop");if(this._sub=void 0,this._checkSessionIFrame&&this._checkSessionIFrame.stop(),this._userManager.settings.monitorAnonymousSession){const a=setInterval(async()=>{clearInterval(a);try{const o=await this._userManager.querySessionStatus();if(o){const u={session_state:o.session_state,profile:o.sub?{sub:o.sub}:null};this._start(u)}}catch(o){t.error("error from querySessionStatus",o instanceof Error?o.message:o)}},1e3)}},this._callback=async()=>{const t=this._logger.create("_callback");try{const a=await this._userManager.querySessionStatus();let o=!0;a&&this._checkSessionIFrame?a.sub===this._sub?(o=!1,this._checkSessionIFrame.start(a.session_state),t.debug("same sub still logged in at OP, session state has changed, restarting check session iframe; session_state",a.session_state),await this._userManager.events._raiseUserSessionChanged()):t.debug("different subject signed into OP",a.sub):t.debug("subject no longer signed into OP"),o?this._sub?await this._userManager.events._raiseUserSignedOut():await this._userManager.events._raiseUserSignedIn():t.debug("no change in session detected, no event to raise")}catch(a){this._sub&&(t.debug("Error calling queryCurrentSigninSession; raising signed out event",a),await this._userManager.events._raiseUserSignedOut())}},e||this._logger.throw(new Error("No user manager passed")),this._userManager.events.addUserLoaded(this._start),this._userManager.events.addUserUnloaded(this._stop),this._init().catch(t=>{this._logger.error(t)})}async _init(){this._logger.create("_init");const e=await this._userManager.getUser();if(e)this._start(e);else if(this._userManager.settings.monitorAnonymousSession){const t=await this._userManager.querySessionStatus();if(t){const a={session_state:t.session_state,profile:t.sub?{sub:t.sub}:null};this._start(a)}}}},zo=class Rp{constructor(t){var a;this.id_token=t.id_token,this.session_state=(a=t.session_state)!=null?a:null,this.access_token=t.access_token,this.refresh_token=t.refresh_token,this.token_type=t.token_type,this.scope=t.scope,this.profile=t.profile,this.expires_at=t.expires_at,this.state=t.userState,this.url_state=t.url_state}get expires_in(){if(this.expires_at!==void 0)return this.expires_at-Ji.getEpochTime()}set expires_in(t){t!==void 0&&(this.expires_at=Math.floor(t)+Ji.getEpochTime())}get expired(){const t=this.expires_in;if(t!==void 0)return t<=0}get scopes(){var t,a;return(a=(t=this.scope)==null?void 0:t.split(" "))!=null?a:[]}toStorageString(){return new $e("User").create("toStorageString"),JSON.stringify({id_token:this.id_token,session_state:this.session_state,access_token:this.access_token,refresh_token:this.refresh_token,token_type:this.token_type,scope:this.scope,profile:this.profile,expires_at:this.expires_at})}static fromStorageString(t){return $e.createStatic("User","fromStorageString"),new Rp(JSON.parse(t))}},Kd="oidc-client",Lp=class{constructor(){this._abort=new fs("Window navigation aborted"),this._disposeHandlers=new Set,this._window=null}async navigate(e){const t=this._logger.create("navigate");if(!this._window)throw new Error("Attempted to navigate on a disposed window");t.debug("setting URL in window"),this._window.location.replace(e.url);const{url:a,keepOpen:o}=await new Promise((u,f)=>{const g=y=>{var k;const A=y.data,M=(k=e.scriptOrigin)!=null?k:window.location.origin;if(!(y.origin!==M||(A==null?void 0:A.source)!==Kd)){try{const P=Ol.readParams(A.url,e.response_mode).get("state");if(P||t.warn("no state found in response url"),y.source!==this._window&&P!==e.state)return}catch{this._dispose(),f(new Error("Invalid response from window"))}u(A)}};window.addEventListener("message",g,!1),this._disposeHandlers.add(()=>window.removeEventListener("message",g,!1)),this._disposeHandlers.add(this._abort.addHandler(y=>{this._dispose(),f(y)}))});return t.debug("got response from window"),this._dispose(),o||this.close(),{url:a}}_dispose(){this._logger.create("_dispose");for(const e of this._disposeHandlers)e();this._disposeHandlers.clear()}static _notifyParent(e,t,a=!1,o=window.location.origin){e.postMessage({source:Kd,url:t,keepOpen:a},o)}},Op={location:!1,toolbar:!1,height:640,closePopupWindowAfterInSeconds:-1},Np="_blank",SA=60,AA=2,Fp=10,CA=class extends Fl{constructor(e){const{popup_redirect_uri:t=e.redirect_uri,popup_post_logout_redirect_uri:a=e.post_logout_redirect_uri,popupWindowFeatures:o=Op,popupWindowTarget:u=Np,redirectMethod:f="assign",redirectTarget:g="self",iframeNotifyParentOrigin:y=e.iframeNotifyParentOrigin,iframeScriptOrigin:k=e.iframeScriptOrigin,requestTimeoutInSeconds:A,silent_redirect_uri:M=e.redirect_uri,silentRequestTimeoutInSeconds:P,automaticSilentRenew:N=!0,validateSubOnSilentRenew:H=!0,includeIdTokenInSilentRenew:z=!1,monitorSession:G=!1,monitorAnonymousSession:Q=!1,checkSessionIntervalInSeconds:q=AA,query_status_response_type:ie="code",stopCheckSessionOnError:$=!0,revokeTokenTypes:re=["access_token","refresh_token"],revokeTokensOnSignout:B=!1,includeIdTokenInSilentSignout:de=!1,accessTokenExpiringNotificationTimeInSeconds:ae=SA,userStore:U}=e;if(super(e),this.popup_redirect_uri=t,this.popup_post_logout_redirect_uri=a,this.popupWindowFeatures=o,this.popupWindowTarget=u,this.redirectMethod=f,this.redirectTarget=g,this.iframeNotifyParentOrigin=y,this.iframeScriptOrigin=k,this.silent_redirect_uri=M,this.silentRequestTimeoutInSeconds=P||A||Fp,this.automaticSilentRenew=N,this.validateSubOnSilentRenew=H,this.includeIdTokenInSilentRenew=z,this.monitorSession=G,this.monitorAnonymousSession=Q,this.checkSessionIntervalInSeconds=q,this.stopCheckSessionOnError=$,this.query_status_response_type=ie,this.revokeTokenTypes=re,this.revokeTokensOnSignout=B,this.includeIdTokenInSilentSignout=de,this.accessTokenExpiringNotificationTimeInSeconds=ae,U)this.userStore=U;else{const J=typeof window<"u"?window.sessionStorage:new Ep;this.userStore=new Mp({store:J})}}},Zd=class zp extends Lp{constructor({silentRequestTimeoutInSeconds:t=Fp}){super(),this._logger=new $e("IFrameWindow"),this._timeoutInSeconds=t,this._frame=zp.createHiddenIframe(),this._window=this._frame.contentWindow}static createHiddenIframe(){const t=window.document.createElement("iframe");return t.style.visibility="hidden",t.style.position="fixed",t.style.left="-1000px",t.style.top="0",t.width="0",t.height="0",window.document.body.appendChild(t),t}async navigate(t){this._logger.debug("navigate: Using timeout of:",this._timeoutInSeconds);const a=setTimeout(()=>void this._abort.raise(new Oc("IFrame timed out without a response")),this._timeoutInSeconds*1e3);return this._disposeHandlers.add(()=>clearTimeout(a)),await super.navigate(t)}close(){var t;this._frame&&(this._frame.parentNode&&(this._frame.addEventListener("load",a=>{var o;const u=a.target;(o=u.parentNode)==null||o.removeChild(u),this._abort.raise(new Error("IFrame removed from DOM"))},!0),(t=this._frame.contentWindow)==null||t.location.replace("about:blank")),this._frame=null),this._window=null}static notifyParent(t,a){return super._notifyParent(window.parent,t,!1,a)}},EA=class{constructor(e){this._settings=e,this._logger=new $e("IFrameNavigator")}async prepare({silentRequestTimeoutInSeconds:e=this._settings.silentRequestTimeoutInSeconds}){return new Zd({silentRequestTimeoutInSeconds:e})}async callback(e){this._logger.create("callback"),Zd.notifyParent(e,this._settings.iframeNotifyParentOrigin)}},MA=500,TA=1e3,Jd=class extends Lp{constructor({popupWindowTarget:e=Np,popupWindowFeatures:t={},popupSignal:a}){super(),this._logger=new $e("PopupWindow");const o=$d.center({...Op,...t});this._window=window.open(void 0,e,$d.serialize(o)),a&&a.addEventListener("abort",()=>{var u;this._abort.raise(new Error((u=a.reason)!=null?u:"Popup aborted"))}),t.closePopupWindowAfterInSeconds&&t.closePopupWindowAfterInSeconds>0&&setTimeout(()=>{if(!this._window||typeof this._window.closed!="boolean"||this._window.closed){this._abort.raise(new Error("Popup blocked by user"));return}this.close()},t.closePopupWindowAfterInSeconds*TA)}async navigate(e){var t;(t=this._window)==null||t.focus();const a=setInterval(()=>{(!this._window||this._window.closed)&&this._abort.raise(new Error("Popup closed by user"))},MA);return this._disposeHandlers.add(()=>clearInterval(a)),await super.navigate(e)}close(){this._window&&(this._window.closed||(this._window.close(),this._abort.raise(new Error("Popup closed")))),this._window=null}static notifyOpener(e,t){if(!window.opener)throw new Error("No window.opener. Can't complete notification.");return super._notifyParent(window.opener,e,t)}},PA=class{constructor(e){this._settings=e,this._logger=new $e("PopupNavigator")}async prepare({popupWindowFeatures:e=this._settings.popupWindowFeatures,popupWindowTarget:t=this._settings.popupWindowTarget,popupSignal:a}){return new Jd({popupWindowFeatures:e,popupWindowTarget:t,popupSignal:a})}async callback(e,{keepOpen:t=!1}){this._logger.create("callback"),Jd.notifyOpener(e,t)}},IA=class{constructor(e){this._settings=e,this._logger=new $e("RedirectNavigator")}async prepare({redirectMethod:e=this._settings.redirectMethod,redirectTarget:t=this._settings.redirectTarget}){var a;this._logger.create("prepare");let o=window.self;t==="top"&&(o=(a=window.top)!=null?a:window.self);const u=o.location[e].bind(o.location);let f;return{navigate:async g=>{this._logger.create("navigate");const y=new Promise((k,A)=>{f=A});return u(g.url),await y},close:()=>{this._logger.create("close"),f==null||f(new Error("Redirect aborted")),o.stop()}}}async callback(){}},_A=class extends rA{constructor(e){super({expiringNotificationTimeInSeconds:e.accessTokenExpiringNotificationTimeInSeconds}),this._logger=new $e("UserManagerEvents"),this._userLoaded=new fs("User loaded"),this._userUnloaded=new fs("User unloaded"),this._silentRenewError=new fs("Silent renew error"),this._userSignedIn=new fs("User signed in"),this._userSignedOut=new fs("User signed out"),this._userSessionChanged=new fs("User session changed")}async load(e,t=!0){await super.load(e),t&&await this._userLoaded.raise(e)}async unload(){await super.unload(),await this._userUnloaded.raise()}addUserLoaded(e){return this._userLoaded.addHandler(e)}removeUserLoaded(e){return this._userLoaded.removeHandler(e)}addUserUnloaded(e){return this._userUnloaded.addHandler(e)}removeUserUnloaded(e){return this._userUnloaded.removeHandler(e)}addSilentRenewError(e){return this._silentRenewError.addHandler(e)}removeSilentRenewError(e){return this._silentRenewError.removeHandler(e)}async _raiseSilentRenewError(e){await this._silentRenewError.raise(e)}addUserSignedIn(e){return this._userSignedIn.addHandler(e)}removeUserSignedIn(e){this._userSignedIn.removeHandler(e)}async _raiseUserSignedIn(){await this._userSignedIn.raise()}addUserSignedOut(e){return this._userSignedOut.addHandler(e)}removeUserSignedOut(e){this._userSignedOut.removeHandler(e)}async _raiseUserSignedOut(){await this._userSignedOut.raise()}addUserSessionChanged(e){return this._userSessionChanged.addHandler(e)}removeUserSessionChanged(e){this._userSessionChanged.removeHandler(e)}async _raiseUserSessionChanged(){await this._userSessionChanged.raise()}},DA=class{constructor(e){this._userManager=e,this._logger=new $e("SilentRenewService"),this._isStarted=!1,this._retryTimer=new Ji("Retry Silent Renew"),this._tokenExpiring=async()=>{const t=this._logger.create("_tokenExpiring");try{await this._userManager.signinSilent(),t.debug("silent token renewal successful")}catch(a){if(a instanceof Oc){t.warn("ErrorTimeout from signinSilent:",a,"retry in 5s"),this._retryTimer.init(5);return}t.error("Error from signinSilent:",a),await this._userManager.events._raiseSilentRenewError(a)}}}async start(){const e=this._logger.create("start");if(!this._isStarted){this._isStarted=!0,this._userManager.events.addAccessTokenExpiring(this._tokenExpiring),this._retryTimer.addHandler(this._tokenExpiring);try{await this._userManager.getUser()}catch(t){e.error("getUser error",t)}}}stop(){this._isStarted&&(this._retryTimer.cancel(),this._retryTimer.removeHandler(this._tokenExpiring),this._userManager.events.removeAccessTokenExpiring(this._tokenExpiring),this._isStarted=!1)}},RA=class{constructor(e){this.refresh_token=e.refresh_token,this.id_token=e.id_token,this.session_state=e.session_state,this.scope=e.scope,this.profile=e.profile,this.data=e.state}},LA=class{constructor(e,t,a,o){this._logger=new $e("UserManager"),this.settings=new CA(e),this._client=new wA(e),this._redirectNavigator=t??new IA(this.settings),this._popupNavigator=a??new PA(this.settings),this._iframeNavigator=o??new EA(this.settings),this._events=new _A(this.settings),this._silentRenewService=new DA(this),this.settings.automaticSilentRenew&&this.startSilentRenew(),this._sessionMonitor=null,this.settings.monitorSession&&(this._sessionMonitor=new kA(this))}get events(){return this._events}get metadataService(){return this._client.metadataService}async getUser(e=!1){const t=this._logger.create("getUser"),a=await this._loadUser();return a?(t.info("user loaded"),await this._events.load(a,e),a):(t.info("user not found in storage"),null)}async removeUser(){const e=this._logger.create("removeUser");await this.storeUser(null),e.info("user removed from storage"),await this._events.unload()}async signinRedirect(e={}){var t;this._logger.create("signinRedirect");const{redirectMethod:a,...o}=e;let u;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(u=await this.generateDPoPJkt(this.settings.dpop));const f=await this._redirectNavigator.prepare({redirectMethod:a});await this._signinStart({request_type:"si:r",dpopJkt:u,...o},f)}async signinRedirectCallback(e=window.location.href){const t=this._logger.create("signinRedirectCallback"),a=await this._signinEnd(e);return a.profile&&a.profile.sub?t.info("success, signed in subject",a.profile.sub):t.info("no subject"),a}async signinResourceOwnerCredentials({username:e,password:t,skipUserInfo:a=!1}){const o=this._logger.create("signinResourceOwnerCredential"),u=await this._client.processResourceOwnerPasswordCredentials({username:e,password:t,skipUserInfo:a,extraTokenParams:this.settings.extraTokenParams});o.debug("got signin response");const f=await this._buildUser(u);return f.profile&&f.profile.sub?o.info("success, signed in subject",f.profile.sub):o.info("no subject"),f}async signinPopup(e={}){var t;const a=this._logger.create("signinPopup");let o;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(o=await this.generateDPoPJkt(this.settings.dpop));const{popupWindowFeatures:u,popupWindowTarget:f,popupSignal:g,...y}=e,k=this.settings.popup_redirect_uri;k||a.throw(new Error("No popup_redirect_uri configured"));const A=await this._popupNavigator.prepare({popupWindowFeatures:u,popupWindowTarget:f,popupSignal:g}),M=await this._signin({request_type:"si:p",redirect_uri:k,display:"popup",dpopJkt:o,...y},A);return M&&(M.profile&&M.profile.sub?a.info("success, signed in subject",M.profile.sub):a.info("no subject")),M}async signinPopupCallback(e=window.location.href,t=!1){const a=this._logger.create("signinPopupCallback");await this._popupNavigator.callback(e,{keepOpen:t}),a.info("success")}async signinSilent(e={}){var t,a;const o=this._logger.create("signinSilent"),{silentRequestTimeoutInSeconds:u,...f}=e;let g=await this._loadUser();if(g!=null&&g.refresh_token){o.debug("using refresh token");const P=new RA(g);return await this._useRefreshToken({state:P,redirect_uri:f.redirect_uri,resource:f.resource,extraTokenParams:f.extraTokenParams,timeoutInSeconds:u})}let y;(t=this.settings.dpop)!=null&&t.bind_authorization_code&&(y=await this.generateDPoPJkt(this.settings.dpop));const k=this.settings.silent_redirect_uri;k||o.throw(new Error("No silent_redirect_uri configured"));let A;g&&this.settings.validateSubOnSilentRenew&&(o.debug("subject prior to silent renew:",g.profile.sub),A=g.profile.sub);const M=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:u});return g=await this._signin({request_type:"si:s",redirect_uri:k,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?g==null?void 0:g.id_token:void 0,dpopJkt:y,...f},M,A),g&&((a=g.profile)!=null&&a.sub?o.info("success, signed in subject",g.profile.sub):o.info("no subject")),g}async _useRefreshToken(e){const t=await this._client.useRefreshToken({timeoutInSeconds:this.settings.silentRequestTimeoutInSeconds,...e}),a=new zo({...e.state,...t});return await this.storeUser(a),await this._events.load(a),a}async signinSilentCallback(e=window.location.href){const t=this._logger.create("signinSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async signinCallback(e=window.location.href){const{state:t}=await this._client.readSigninResponseState(e);switch(t.request_type){case"si:r":return await this.signinRedirectCallback(e);case"si:p":await this.signinPopupCallback(e);break;case"si:s":await this.signinSilentCallback(e);break;default:throw new Error("invalid response_type in state")}}async signoutCallback(e=window.location.href,t=!1){const{state:a}=await this._client.readSignoutResponseState(e);if(a)switch(a.request_type){case"so:r":return await this.signoutRedirectCallback(e);case"so:p":await this.signoutPopupCallback(e,t);break;case"so:s":await this.signoutSilentCallback(e);break;default:throw new Error("invalid response_type in state")}}async querySessionStatus(e={}){const t=this._logger.create("querySessionStatus"),{silentRequestTimeoutInSeconds:a,...o}=e,u=this.settings.silent_redirect_uri;u||t.throw(new Error("No silent_redirect_uri configured"));const f=await this._loadUser(),g=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:a}),y=await this._signinStart({request_type:"si:s",redirect_uri:u,prompt:"none",id_token_hint:this.settings.includeIdTokenInSilentRenew?f==null?void 0:f.id_token:void 0,response_type:this.settings.query_status_response_type,scope:"openid",skipUserInfo:!0,...o},g);try{const k={},A=await this._client.processSigninResponse(y.url,k);return t.debug("got signin response"),A.session_state&&A.profile.sub?(t.info("success for subject",A.profile.sub),{session_state:A.session_state,sub:A.profile.sub}):(t.info("success, user not authenticated"),null)}catch(k){if(this.settings.monitorAnonymousSession&&k instanceof Gs)switch(k.error){case"login_required":case"consent_required":case"interaction_required":case"account_selection_required":return t.info("success for anonymous user"),{session_state:k.session_state}}throw k}}async _signin(e,t,a){const o=await this._signinStart(e,t);return await this._signinEnd(o.url,a)}async _signinStart(e,t){const a=this._logger.create("_signinStart");try{const o=await this._client.createSigninRequest(e);return a.debug("got signin request"),await t.navigate({url:o.url,state:o.state.id,response_mode:o.state.response_mode,scriptOrigin:this.settings.iframeScriptOrigin})}catch(o){throw a.debug("error after preparing navigator, closing navigator window"),t.close(),o}}async _signinEnd(e,t){const a=this._logger.create("_signinEnd"),o={},u=await this._client.processSigninResponse(e,o);return a.debug("got signin response"),await this._buildUser(u,t)}async _buildUser(e,t){const a=this._logger.create("_buildUser"),o=new zo(e);if(t){if(t!==o.profile.sub)throw a.debug("current user does not match user returned from signin. sub from signin:",o.profile.sub),new Gs({...e,error:"login_required"});a.debug("current user matches user returned from signin")}return await this.storeUser(o),a.debug("user stored"),await this._events.load(o),o}async signoutRedirect(e={}){const t=this._logger.create("signoutRedirect"),{redirectMethod:a,...o}=e,u=await this._redirectNavigator.prepare({redirectMethod:a});await this._signoutStart({request_type:"so:r",post_logout_redirect_uri:this.settings.post_logout_redirect_uri,...o},u),t.info("success")}async signoutRedirectCallback(e=window.location.href){const t=this._logger.create("signoutRedirectCallback"),a=await this._signoutEnd(e);return t.info("success"),a}async signoutPopup(e={}){const t=this._logger.create("signoutPopup"),{popupWindowFeatures:a,popupWindowTarget:o,popupSignal:u,...f}=e,g=this.settings.popup_post_logout_redirect_uri,y=await this._popupNavigator.prepare({popupWindowFeatures:a,popupWindowTarget:o,popupSignal:u});await this._signout({request_type:"so:p",post_logout_redirect_uri:g,state:g==null?void 0:{},...f},y),t.info("success")}async signoutPopupCallback(e=window.location.href,t=!1){const a=this._logger.create("signoutPopupCallback");await this._popupNavigator.callback(e,{keepOpen:t}),a.info("success")}async _signout(e,t){const a=await this._signoutStart(e,t);return await this._signoutEnd(a.url)}async _signoutStart(e={},t){var a;const o=this._logger.create("_signoutStart");try{const u=await this._loadUser();o.debug("loaded current user from storage"),this.settings.revokeTokensOnSignout&&await this._revokeInternal(u);const f=e.id_token_hint||u&&u.id_token;f&&(o.debug("setting id_token_hint in signout request"),e.id_token_hint=f),await this.removeUser(),o.debug("user removed, creating signout request");const g=await this._client.createSignoutRequest(e);return o.debug("got signout request"),await t.navigate({url:g.url,state:(a=g.state)==null?void 0:a.id,scriptOrigin:this.settings.iframeScriptOrigin})}catch(u){throw o.debug("error after preparing navigator, closing navigator window"),t.close(),u}}async _signoutEnd(e){const t=this._logger.create("_signoutEnd"),a=await this._client.processSignoutResponse(e);return t.debug("got signout response"),a}async signoutSilent(e={}){var t;const a=this._logger.create("signoutSilent"),{silentRequestTimeoutInSeconds:o,...u}=e,f=this.settings.includeIdTokenInSilentSignout?(t=await this._loadUser())==null?void 0:t.id_token:void 0,g=this.settings.popup_post_logout_redirect_uri,y=await this._iframeNavigator.prepare({silentRequestTimeoutInSeconds:o});await this._signout({request_type:"so:s",post_logout_redirect_uri:g,id_token_hint:f,...u},y),a.info("success")}async signoutSilentCallback(e=window.location.href){const t=this._logger.create("signoutSilentCallback");await this._iframeNavigator.callback(e),t.info("success")}async revokeTokens(e){const t=await this._loadUser();await this._revokeInternal(t,e)}async _revokeInternal(e,t=this.settings.revokeTokenTypes){const a=this._logger.create("_revokeInternal");if(!e)return;const o=t.filter(u=>typeof e[u]=="string");if(!o.length){a.debug("no need to revoke due to no token(s)");return}for(const u of o)await this._client.revokeToken(e[u],u),a.info(`${u} revoked successfully`),u!=="access_token"&&(e[u]=null);await this.storeUser(e),a.debug("user stored"),await this._events.load(e)}startSilentRenew(){this._logger.create("startSilentRenew"),this._silentRenewService.start()}stopSilentRenew(){this._silentRenewService.stop()}get _userStoreKey(){return`user:${this.settings.authority}:${this.settings.client_id}`}async _loadUser(){const e=this._logger.create("_loadUser"),t=await this.settings.userStore.get(this._userStoreKey);return t?(e.debug("user storageString loaded"),zo.fromStorageString(t)):(e.debug("no user storageString"),null)}async storeUser(e){const t=this._logger.create("storeUser");if(e){t.debug("storing user");const a=e.toStorageString();await this.settings.userStore.set(this._userStoreKey,a)}else this._logger.debug("removing user"),await this.settings.userStore.remove(this._userStoreKey),this.settings.dpop&&await this.settings.dpop.store.remove(this.settings.client_id)}async clearStaleState(){await this._client.clearStaleState()}async dpopProof(e,t,a,o){var u,f;const g=await((f=(u=this.settings.dpop)==null?void 0:u.store)==null?void 0:f.get(this.settings.client_id));if(g)return await ii.generateDPoPProof({url:e,accessToken:t==null?void 0:t.access_token,httpMethod:a,keyPair:g.keys,nonce:o})}async generateDPoPJkt(e){let t=await e.store.get(this.settings.client_id);if(!t){const a=await ii.generateDPoPKeys();t=new Dp(a),await e.store.set(this.settings.client_id,t)}return await ii.generateDPoPJkt(t.keys)}};const Ke="account",Bo={getMe(){return Pe.get(`/${Ke}/me/`)},checkPassword(e){return Pe.post(`/${Ke}/me/password/`,{password:e})},setPassword(e){return Pe.post(`/${Ke}/me/password/change/`,e,{ignoreErrors:!0})},verifyTFACode(e){const t={code:e};return Pe.post(`${Ke}/tfa/verify/`,t)},startTFASetup(){return Pe.post(`${Ke}/tfa/setup/`)},getKeyForTFASetup(){return Pe.get(`${Ke}/tfa/setup/key/`)},finalizeTFASetup(e){const t={pin_code:e};return Pe.post(`${Ke}/tfa/setup/check/`,t)},disableTFA(e){return Pe.post(`${Ke}/tfa/disable/`,e)},resetRecoveryCodes(e){return Pe.post(`${Ke}/tfa/reset_codes/`,e)},getForward(){return Pe.get(`${Ke}/forward/`)},setForward(e){return Pe.post(`${Ke}/forward/`,e)},getAPIToken(){return Pe.get(`${Ke}/api_token/`)},createAPIToken(){return Pe.post(`${Ke}/api_token/`)},deleteAPIToken(){return Pe.delete(`${Ke}/api_token/`)},getARMessage(){return Pe.get(`${Ke}/armessage/`)},setARMessage(e){return Pe.put(`${Ke}/armessage/`,e)},getFilterSets(){return Pe.get(`${Ke}/filtersets/`)},downloadFilterSet(e){return Pe.get(`${Ke}/filtersets/${e}/download/`)},createFilterSet(e){return Pe.post(`${Ke}/filtersets/`,e)},activateFilterSet(e){return Pe.post(`${Ke}/filtersets/${e}/activate/`)},deleteFilterSet(e){return Pe.delete(`${Ke}/filtersets/${e}/`)},saveFilterSet(e,t){return Pe.put(`${Ke}/filtersets/${e}/`,t)},getFilterConditionTemplates(){return Pe.get(`${Ke}/filtersets/condition_templates/`)},getFilterActionTemplates(){return Pe.get(`${Ke}/filtersets/action_templates/`)},getFilters(e){return Pe.get(`${Ke}/filtersets/${e}/filters/`)},createFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/`,t)},updateFilter(e,t,a){return Pe.put(`${Ke}/filtersets/${e}/filters/${t}/`,a)},disableFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/disable/`)},moveFilterDown(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/move_down/`)},moveFilterUp(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/move_up/`)},enableFilter(e,t){return Pe.post(`${Ke}/filtersets/${e}/filters/${t}/enable/`)},deleteFilter(e,t){return Pe.delete(`${Ke}/filtersets/${e}/filters/${t}/`)},getAvailableApplications(){return Pe.get(`${Ke}/available_applications/`)}},Ps="accounts",OA={getAll(e){return Pe.get(`/${Ps}/`,{params:e,paramsSerializer:{indexes:null}})},get(e){return Pe.get(`${Ps}/${e}/`)},getRandomPassword(){return Pe.get(`${Ps}/random_password/`)},getCredentials(e){return Pe.get(`credentials/${e}/`,{responseType:"blob"})},validate(e){return Pe.post(`${Ps}/validate/`,e)},create(e){return Pe.post(`${Ps}/`,e)},patch(e,t){return Pe.patch(`${Ps}/${e}/`,t)},delete(e,t){return Pe.post(`${Ps}/${e}/delete/`,t)}},Hr={requestToken(e){return Pe.post("/token/",e)},recoverPassword(e){return Pe.post("/password_reset/",e)},checkSmsTotp(e){return Pe.post("/sms_totp/",e)},changePassword(e){return Pe.post("/reset_confirm/",e)},beginFidoRegistration(){return Pe.post("/fido/registration/begin/")},endFidoRegistration(e){return Pe.post("/fido/registration/end/",e)},getAllFidoRegistred(){return Pe.get("/fido/")},deleteFido(e){return Pe.delete(`/fido/${e}/`)},editFido(e,t){return Pe.put(`/fido/${e}/`,t)}};function Qd(e){return e.startsWith("http")?e:`${location.protocol}//${location.host}${e}`}const so=Jg("auth",()=>{const e=Ym(),t=wt(null),a=wt(!1);let o=Qd(e.OAUTH_REDIRECT_URI),u=Qd(e.OAUTH_POST_REDIRECT_URI);const f=new LA({authority:e.OAUTH_AUTHORITY_URL,client_id:e.OAUTH_CLIENT_ID,redirect_uri:o,post_logout_redirect_uri:u,response_type:"code",scope:"openid read write",automaticSilentRenew:!0,accessTokenExpiringNotificationTime:60,monitorSession:!0,filterProtocolClaims:!0,loadUserInfo:!0}),g=wt([]),y=dt(()=>t.value.mailbox!==null),k=dt(()=>{if(t.value.language.indexOf("-")!==-1){const ae=t.value.language.split("-");return`${ae[0]}_${ae[1].toUpperCase()}`}return t.value.language});async function A(){return Bo.getMe().then(ae=>{t.value=ae.data,Hs.current=k.value,a.value=!0})}async function M(){return Hr.getAllFidoRegistred().then(ae=>(g.value=ae.data,g.value.length>0&&(t.value.tfa_enabled=!0,t.value.webauthn_enabled=!0),ae))}async function P(ae){return Hr.endFidoRegistration(ae).then(U=>(M(),U))}async function N(ae){return Hr.deleteFido(ae).then(U=>{g.value=g.value.filter(J=>J.id!==ae),t.value.tfa_enabled=U.data.tfa_enabled,U.data.tfa_enabled||(t.value.webauthn_enabled=!1)})}async function H(ae,U){return Hr.editFido(ae,U).then(J=>{for(let fe=0;fe<g.value.length;fe++)if(g.value[fe].id===ae){g.value[fe]=J.data;break}return J})}function z(){return f.getUser().then(ae=>ae?ae.access_token:null)}async function G(){return a.value||!await f.getUser()?null:A()}async function Q(){const ae=await f.getUser();return!ae||ae.expired?!1:(Pe.defaults.headers.common.Authorization=`Bearer ${ae.access_token}`,Pe.defaults.headers.post["Content-Type"]="application/json",!0)}async function q(){try{await f.signinRedirect()}catch(ae){console.error("Error logging in:",ae)}}async function ie(ae){try{const U=await f.signinRedirectCallback();a.value=!0;const J=sessionStorage.getItem("previousPage");return J?window.location.href=J:ms.push(ae),U}catch(U){return console.error("Error completing login:",U),ms.push({name:"Dashboard"}),null}}async function $(){delete Pe.defaults.headers.common.Authorization,t.value={},a.value=!1,f.signoutRedirect()}async function re(ae){return OA.patch(t.value.pk,ae).then(U=>{const J={...t.value,...U.data};delete J.password,t.value={...J},k.value in Hs.available&&(Hs.current=k.value)})}async function B(ae){return Bo.setPassword(ae)}function de(ae){return Bo.finalizeTFASetup(ae).then(U=>{const J=Dl.withAttributes({sameSite:"strict"});return J.set("token",U.data.access),J.set("refreshToken",U.data.refresh),A(),U})}return{authUser:t,accountLanguage:k,completeLogin:ie,isAuthenticated:a,userHasMailbox:y,fidoCreds:g,validateAccess:Q,fetchUser:A,getAccessToken:z,getFidoCreds:M,addFidoCred:P,deleteFidoCreds:N,editFidoCred:H,initialize:G,login:q,$reset:$,updateAccount:re,updatePassword:B,finalizeTFASetup:de}}),NA=Jg("bus",()=>{const e=wt({}),t=wt(""),a=wt(1),o=wt(1);async function u(){e.value={},t.value="",a.value=1,o.value=1}function f(y){e.value=y.msg,t.value=y.type?y.type:"success"}function g(){o.value++}return{notification:e,notificationColor:t,displayNotification:f,reloadMailboxCounters:g,dataKey:a,mbCounterKey:o,$reset:u}}),FA=Yw(),zA=1,BA=2,HA="SuperAdmins",WA="Resellers",YA="DomainAdmins",VA="SimpleUsers",Le={ALARM_OPENED:zA,ALARM_CLOSED:BA,SUPER_ADMIN:HA,RESELLER:WA,DOMAIN_ADMIN:YA,USER:VA},XA=[{path:"/login",component:()=>Ue(()=>import("./EmptyLayout-BzPFOeLU.js"),__vite__mapDeps([0,1,2,3,4,5])),children:[{path:"",name:"Login",component:()=>Ue(()=>import("./LoginView-wmN73W0f.js"),__vite__mapDeps([6,7,2,8,9,10,11]))},{path:"logged",name:"LoginCallback",component:()=>Ue(()=>import("./LoginCallbackView-sWzBke1g.js"),__vite__mapDeps([12,11,2,8,7,9,10])),props:{redirectUrl:"/admin"}}]},{path:"/admin",component:()=>Ue(()=>import("./AdminLayout-CWfn8zaQ.js"),__vite__mapDeps([13,14,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29,30])),meta:{allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"Dashboard",component:()=>Ue(()=>import("./DashboardView-Cw-gIcuB.js"),__vite__mapDeps([31,17,25,2,19,9,10,20,26,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,14,46,47,7,8,48])),meta:{requiresAuth:!0}},{path:"domains",component:()=>Ue(()=>import("./EmptyLayout-BzPFOeLU.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"DomainList",component:()=>Ue(()=>import("./DomainsView-B-Lxru7P.js"),__vite__mapDeps([49,50,51,52,2,34,19,9,10,20,21,4,22,35,25,26,33,23,24,36,37,38,39,40,41,53,54,55,8,14,56,57,46,47,58,59,7,60,61,11,27,28,62,63,64,65,66,67,44,68,69,70,71,72,73,74,75,32,42,43,45,76,77,78,79,80])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:":id",name:"DomainDetail",meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},component:()=>Ue(()=>import("./DomainView-Djc_0PsF.js"),__vite__mapDeps([81,74,50,25,2,19,9,10,20,26,75,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,67,68,7,8,82,46,47,55,27,28,83,84,72,73,57,58,59,66,85,11,86,52,87,88,89,90,91,60,61,92,93]))},{path:":id/edit",name:"DomainEdit",meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},component:()=>Ue(()=>import("./DomainEditView-DocxeOeW.js"),__vite__mapDeps([94,63,64,19,2,9,10,20,65,52,34,21,4,22,35,53,37,38,54,66,67,33,23,24,36,39,40,41,44,68,69,70,85,7,8,11,14,86,50,83,84,95,46,47,96]))}]},{path:"imap_migration",component:()=>Ue(()=>import("./EmptyLayout-BzPFOeLU.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"migrations",name:"MigrationsList",component:()=>Ue(()=>import("./MigrationsView-7kjqPyYU.js"),__vite__mapDeps([97,76,21,19,2,9,10,20,4,22,32,33,34,35,23,24,36,37,38,39,40,41,42,43,44,45,46,47,55,8,25,26,98])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}},{path:"providers",component:()=>Ue(()=>import("./EmptyLayout-BzPFOeLU.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"ProvidersList",component:()=>Ue(()=>import("./ProvidersView-C99UD0WB.js"),__vite__mapDeps([99,56,57,46,2,19,9,10,20,47,25,26,55,8,58,23,21,4,22,24,59,7,60,61,11,27,28,62,100,50,34,35,67,33,36,37,38,39,40,41,44,68,52,53,54,101,76,32,42,43,45,102])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}},{path:"providers/:id/edit",name:"ProviderEdit",component:()=>Ue(()=>import("./ProviderEditView-DDLMOylC.js"),__vite__mapDeps([103,100,50,34,19,2,9,10,20,21,4,22,35,67,33,23,24,36,37,38,39,40,41,44,68,52,55,8,53,54,101,83,84,7])),meta:{requiresAuth:!0,allowedRoles:[Le.RESELLER,Le.SUPER_ADMIN]}}]}]},{path:"identities",component:()=>Ue(()=>import("./EmptyLayout-BzPFOeLU.js"),__vite__mapDeps([0,1,2,3,4,5])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]},children:[{path:"",name:"Identities",component:()=>Ue(()=>import("./IdentitiesView-BqjD9Lue.js"),__vite__mapDeps([104,76,21,19,2,9,10,20,4,22,57,46,47,25,26,55,8,58,23,24,59,69,36,37,34,35,38,70,105,106,39,40,107,108,109,32,33,41,42,43,44,45,110,111,95,50,112,52,53,54,113,114,56,7,60,61,11,27,28,62,115,64,65,72,73,71,116,51,77,78,79,117])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"accounts/:id",name:"AccountDetail",component:()=>Ue(()=>import("./AccountView-DsxYqr3k.js"),__vite__mapDeps([118,51,14,25,2,19,9,10,20,26,39,40,32,33,34,21,4,22,35,23,24,36,37,38,41,42,43,44,45,7,8,46,47,119])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"accounts/:id/edit",name:"AccountEdit",component:()=>Ue(()=>import("./AccountEditView-DmvQjxpx.js"),__vite__mapDeps([120,115,64,19,2,9,10,20,65,7,8,72,73,52,34,21,4,22,35,71,53,37,38,54,111,95,50,112,39,40,116,86,85,11,14,51,83,84,46,47,121])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"aliases/:id",name:"AliasDetail",component:()=>Ue(()=>import("./AliasView-Cyvc5vMb.js"),__vite__mapDeps([122,25,2,19,9,10,20,26,7,8,105,46,47,123])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}},{path:"aliases/:id/edit",name:"AliasEdit",component:()=>Ue(()=>import("./AliasEditView-C15eUZ11.js"),__vite__mapDeps([124,110,105,111,34,19,2,9,10,20,21,4,22,35,95,50,112,52,53,37,38,54,33,23,24,36,39,40,41,113,114,85,7,8,11,83,84,46,47,125])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.RESELLER,Le.SUPER_ADMIN]}}]},{path:"parameters/:app",name:"ParametersEdit",component:()=>Ue(()=>import("./ParametersView-DspBxVMV.js"),__vite__mapDeps([126,14,127,128,19,2,9,10,20,21,4,22,129,91,60,61,39,40,23,24,92,11,8,25,26,53,34,35,37,38,54,33,36,41,113,114,130,82,88,27,28,89,131,132,46,47,16,17,30,133])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"alarms",name:"Alarms",component:()=>Ue(()=>import("./AlarmsView-D3Mh8ntf.js"),__vite__mapDeps([134,106,76,21,19,2,9,10,20,4,22,23,24,39,40,46,47,34,35,109,32,33,36,37,38,41,42,43,44,45,25,26,135])),meta:{requiresAuth:!0}},{path:"monitoring/statistics",name:"Statistics",component:()=>Ue(()=>import("./StatisticsView-CM__Eqku.js"),__vite__mapDeps([136,87,19,2,9,10,20,55,8,88,27,28,89,34,21,4,22,35,23,24,46,47,11,7,25,26,90,3,137])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"monitoring/audit_trail",name:"AuditTrail",component:()=>Ue(()=>import("./AuditTrailView-LI2XuLLn.js"),__vite__mapDeps([138,139,106,109,32,19,2,9,10,20,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,46,47,25,26,140])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}},{path:"monitoring/messages",name:"MessageLog",component:()=>Ue(()=>import("./MessagesView-Cerv3xsy.js"),__vite__mapDeps([141,139,106,46,2,19,9,10,20,47,34,21,4,22,35,109,32,33,23,24,36,37,38,39,40,41,42,43,44,45,25,26,142])),meta:{requiresAuth:!0,allowedRoles:[Le.DOMAIN_ADMIN,Le.SUPER_ADMIN]}},{path:"information",name:"Information",component:()=>Ue(()=>import("./InformationView-CghcvPn2.js"),__vite__mapDeps([143,17,46,2,19,9,10,20,47,25,26,72,73,75,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,16,144])),meta:{requiresAuth:!0,allowedRoles:[Le.SUPER_ADMIN]}}]},{path:"/account",component:()=>Ue(()=>import("./AccountLayout-OGtZvlHR.js"),__vite__mapDeps([145,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29,14])),meta:{requiresAuth:!0},children:[{path:"filters/:filterset?",name:"AccountFilters",component:()=>Ue(()=>import("./FiltersView-5rmpC5cC.js"),__vite__mapDeps([146,52,2,34,19,9,10,20,21,4,22,35,25,26,53,37,38,54,55,8,107,108,33,23,24,36,39,40,41,69,70,76,46,47,32,42,43,44,45,58,59,67,68,113,114])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"parameters/:app",name:"AccountParametersEdit",component:()=>Ue(()=>import("./ParametersView-Dy0H5ep1.js"),__vite__mapDeps([147,127,128,19,2,9,10,20,21,4,22,129,91,60,61,39,40,23,24,92,11,8,25,26,53,34,35,37,38,54,33,36,41,113,114,130,82,88,27,28,89,131,132,14,46,47,148])),meta:{requiresAuth:!0}},{path:":tab?",name:"AccountSettings",component:()=>Ue(()=>import("./SettingsView-OxDo9wNd.js"),__vite__mapDeps([149,71,52,2,34,19,9,10,20,21,4,22,35,7,8,53,37,38,54,72,73,83,84,67,33,23,24,36,39,40,41,44,68,25,26,42,43,55,58,59,113,114,69,70,57,46,47,75,32,45,91,60,61,92,150])),meta:{requiresAuth:!0}}]},{path:"/user",meta:{requiresAuth:!0},children:[{path:"",name:"UserDashboard",component:()=>Ue(()=>import("./DashboardView-Cw-gIcuB.js"),__vite__mapDeps([31,17,25,2,19,9,10,20,26,32,33,34,21,4,22,35,23,24,36,37,38,39,40,41,42,43,44,45,14,46,47,7,8,48])),meta:{requiresAuth:!0}},{path:"contacts",component:()=>Ue(()=>import("./UserLayout-CckCGnPS.js"),__vite__mapDeps([151,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:":category?",name:"ContactList",component:()=>Ue(()=>import("./AddressBook-3RoKiKon.js"),__vite__mapDeps([152,153,14,25,2,19,9,10,20,26,72,73,55,8,52,34,21,4,22,35,7,33,23,24,36,37,38,39,40,41,113,114,69,70,76,32,42,43,44,45,46,47,58,59,18])),meta:{requiresAuth:!0}}]},{path:"calendars",component:()=>Ue(()=>import("./UserLayout-CckCGnPS.js"),__vite__mapDeps([151,15,11,2,8,1,3,4,5,16,17,18,19,9,10,20,21,22,23,24,25,26,7,27,28,29])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:"",name:"CalendarView",component:()=>Ue(()=>import("./CalendarView-BpOlPh3f.js"),__vite__mapDeps([154,25,2,19,9,10,20,26,52,34,21,4,22,35,33,23,24,36,37,38,39,40,41,69,70,55,8,42,43,7,130,82,88,27,28,89,131,72,73,57,46,47,58,59,113,114,78,79,18])),meta:{requiresAuth:!0,requiresMailbox:!0}}]},{path:"webmail",component:()=>Ue(()=>import("./WebmailLayout-DsYThBrz.js"),__vite__mapDeps([155,57,46,2,19,9,10,20,47,25,26,55,8,58,23,21,4,22,24,59,15,11,1,3,5,16,17,18,7,27,28,29,156,52,34,35,157])),meta:{requiresAuth:!0,requiresMailbox:!0},children:[{path:"",name:"MailboxView",component:()=>Ue(()=>import("./MailboxView-T_p-_ZtJ.js"),__vite__mapDeps([158,156,46,2,19,9,10,20,47,69,36,37,34,21,4,22,35,38,70,23,24,55,8,25,26,72,73,159])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"view",name:"EmailView",component:()=>Ue(()=>import("./EmailView-BsR1Wes5.js"),__vite__mapDeps([160,156,153,21,19,2,9,10,20,4,22,25,26,46,47,23,24,55,8,58,59,161])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"compose",name:"ComposeEmailView",component:()=>Ue(()=>import("./ComposeEmailView-B866Xsrc.js"),__vite__mapDeps([162,163,106,156,52,2,34,19,9,10,20,21,4,22,35,25,26,78,39,40,79,42,43,55,8,128,129,113,114,153,46,47,7,33,23,24,36,37,38,41,44,58,59,164])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"reply",name:"ReplyEmailView",component:()=>Ue(()=>import("./ReplyEmailView-DAPBHldd.js"),__vite__mapDeps([165,163,106,156,52,2,34,19,9,10,20,21,4,22,35,25,26,78,39,40,79,42,43,55,8,128,129,113,114,153,46,47,7,33,23,24,36,37,38,41,44,58,59,164])),meta:{requiresAuth:!0,requiresMailbox:!0}},{path:"forward",name:"ForwardEmailView",component:()=>Ue(()=>import("./ForwardEmailView-D7MbetcT.js"),__vite__mapDeps([166,163,106,156,52,2,34,19,9,10,20,21,4,22,35,25,26,78,39,40,79,42,43,55,8,128,129,113,114,153,46,47,7,33,23,24,36,37,38,41,44,58,59,164])),meta:{requiresAuth:!0,requiresMailbox:!0}}]}]},{path:"/:pathMatch(.*)*",name:"NotFound",redirect:{name:"Dashboard",params:{}}}],ms=Hw({history:pw("/"),routes:XA});ms.beforeEach(async(e,t,a)=>{const o=Ym();if(document.title=o.HTML_PAGE_TITLE?o.HTML_PAGE_TITLE:"Welcome to Modoboa",e.meta.requiresAuth!==void 0){const u=window.location.href;sessionStorage.setItem("previousPage",u);const f=so();if(f.authUser||await f.initialize(),await f.validateAccess()){if(e.meta.allowedRoles!==void 0&&e.meta.allowedRoles.indexOf(f.authUser.role)===-1){a({name:"AccountSettings"});return}if(e.meta.requiresMailbox&&!f.authUser.mailbox){a({name:"Dashboard"});return}}else{a({name:"Login"});return}}a()});class qs extends Error{}class UA extends qs{constructor(t){super(`Invalid DateTime: ${t.toMessage()}`)}}class jA extends qs{constructor(t){super(`Invalid Interval: ${t.toMessage()}`)}}class GA extends qs{constructor(t){super(`Invalid Duration: ${t.toMessage()}`)}}class ua extends qs{}class Bp extends qs{constructor(t){super(`Invalid unit ${t}`)}}class zt extends qs{}class rs extends qs{constructor(){super("Zone is an abstract class")}}const we="numeric",Ci="short",ci="long",Cn={year:we,month:we,day:we},Hp={year:we,month:Ci,day:we},qA={year:we,month:Ci,day:we,weekday:Ci},Wp={year:we,month:ci,day:we},Yp={year:we,month:ci,day:we,weekday:ci},Vp={hour:we,minute:we},Xp={hour:we,minute:we,second:we},Up={hour:we,minute:we,second:we,timeZoneName:Ci},jp={hour:we,minute:we,second:we,timeZoneName:ci},Gp={hour:we,minute:we,hourCycle:"h23"},qp={hour:we,minute:we,second:we,hourCycle:"h23"},$p={hour:we,minute:we,second:we,hourCycle:"h23",timeZoneName:Ci},Kp={hour:we,minute:we,second:we,hourCycle:"h23",timeZoneName:ci},Zp={year:we,month:we,day:we,hour:we,minute:we},Jp={year:we,month:we,day:we,hour:we,minute:we,second:we},Qp={year:we,month:Ci,day:we,hour:we,minute:we},em={year:we,month:Ci,day:we,hour:we,minute:we,second:we},$A={year:we,month:Ci,day:we,weekday:Ci,hour:we,minute:we},tm={year:we,month:ci,day:we,hour:we,minute:we,timeZoneName:Ci},im={year:we,month:ci,day:we,hour:we,minute:we,second:we,timeZoneName:Ci},sm={year:we,month:ci,day:we,weekday:ci,hour:we,minute:we,timeZoneName:ci},am={year:we,month:ci,day:we,weekday:ci,hour:we,minute:we,second:we,timeZoneName:ci};class Ar{get type(){throw new rs}get name(){throw new rs}get ianaName(){return this.name}get isUniversal(){throw new rs}offsetName(t,a){throw new rs}formatOffset(t,a){throw new rs}offset(t){throw new rs}equals(t){throw new rs}get isValid(){throw new rs}}let Ho=null;class ao extends Ar{static get instance(){return Ho===null&&(Ho=new ao),Ho}get type(){return"system"}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(t,{format:a,locale:o}){return pm(t,a,o)}formatOffset(t,a){return er(this.offset(t),a)}offset(t){return-new Date(t).getTimezoneOffset()}equals(t){return t.type==="system"}get isValid(){return!0}}const Hl=new Map;function KA(e){let t=Hl.get(e);return t===void 0&&(t=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:e,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),Hl.set(e,t)),t}const ZA={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function JA(e,t){const a=e.format(t).replace(/\u200E/g,""),o=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(a),[,u,f,g,y,k,A,M]=o;return[g,u,f,y,k,A,M]}function QA(e,t){const a=e.formatToParts(t),o=[];for(let u=0;u<a.length;u++){const{type:f,value:g}=a[u],y=ZA[f];f==="era"?o[y]=g:Ye(y)||(o[y]=parseInt(g,10))}return o}const Wo=new Map;class Qi extends Ar{static create(t){let a=Wo.get(t);return a===void 0&&Wo.set(t,a=new Qi(t)),a}static resetCache(){Wo.clear(),Hl.clear()}static isValidSpecifier(t){return this.isValidZone(t)}static isValidZone(t){if(!t)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:t}).format(),!0}catch{return!1}}constructor(t){super(),this.zoneName=t,this.valid=Qi.isValidZone(t)}get type(){return"iana"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(t,{format:a,locale:o}){return pm(t,a,o,this.name)}formatOffset(t,a){return er(this.offset(t),a)}offset(t){if(!this.valid)return NaN;const a=new Date(t);if(isNaN(a))return NaN;const o=KA(this.name);let[u,f,g,y,k,A,M]=o.formatToParts?QA(o,a):JA(o,a);y==="BC"&&(u=-Math.abs(u)+1);const N=no({year:u,month:f,day:g,hour:k===24?0:k,minute:A,second:M,millisecond:0});let H=+a;const z=H%1e3;return H-=z>=0?z:1e3+z,(N-H)/(60*1e3)}equals(t){return t.type==="iana"&&t.name===this.name}get isValid(){return this.valid}}let eh={};function eC(e,t={}){const a=JSON.stringify([e,t]);let o=eh[a];return o||(o=new Intl.ListFormat(e,t),eh[a]=o),o}const Wl=new Map;function Yl(e,t={}){const a=JSON.stringify([e,t]);let o=Wl.get(a);return o===void 0&&(o=new Intl.DateTimeFormat(e,t),Wl.set(a,o)),o}const Vl=new Map;function tC(e,t={}){const a=JSON.stringify([e,t]);let o=Vl.get(a);return o===void 0&&(o=new Intl.NumberFormat(e,t),Vl.set(a,o)),o}const Xl=new Map;function iC(e,t={}){const{base:a,...o}=t,u=JSON.stringify([e,o]);let f=Xl.get(u);return f===void 0&&(f=new Intl.RelativeTimeFormat(e,t),Xl.set(u,f)),f}let Ya=null;function sC(){return Ya||(Ya=new Intl.DateTimeFormat().resolvedOptions().locale,Ya)}const Ul=new Map;function rm(e){let t=Ul.get(e);return t===void 0&&(t=new Intl.DateTimeFormat(e).resolvedOptions(),Ul.set(e,t)),t}const jl=new Map;function aC(e){let t=jl.get(e);if(!t){const a=new Intl.Locale(e);t="getWeekInfo"in a?a.getWeekInfo():a.weekInfo,"minimalDays"in t||(t={...nm,...t}),jl.set(e,t)}return t}function rC(e){const t=e.indexOf("-x-");t!==-1&&(e=e.substring(0,t));const a=e.indexOf("-u-");if(a===-1)return[e];{let o,u;try{o=Yl(e).resolvedOptions(),u=e}catch{const k=e.substring(0,a);o=Yl(k).resolvedOptions(),u=k}const{numberingSystem:f,calendar:g}=o;return[u,f,g]}}function nC(e,t,a){return(a||t)&&(e.includes("-u-")||(e+="-u"),a&&(e+=`-ca-${a}`),t&&(e+=`-nu-${t}`)),e}function oC(e){const t=[];for(let a=1;a<=12;a++){const o=Be.utc(2009,a,1);t.push(e(o))}return t}function lC(e){const t=[];for(let a=1;a<=7;a++){const o=Be.utc(2016,11,13+a);t.push(e(o))}return t}function Wr(e,t,a,o){const u=e.listingMode();return u==="error"?null:u==="en"?a(t):o(t)}function cC(e){return e.numberingSystem&&e.numberingSystem!=="latn"?!1:e.numberingSystem==="latn"||!e.locale||e.locale.startsWith("en")||rm(e.locale).numberingSystem==="latn"}class uC{constructor(t,a,o){this.padTo=o.padTo||0,this.floor=o.floor||!1;const{padTo:u,floor:f,...g}=o;if(!a||Object.keys(g).length>0){const y={useGrouping:!1,...o};o.padTo>0&&(y.minimumIntegerDigits=o.padTo),this.inf=tC(t,y)}}format(t){if(this.inf){const a=this.floor?Math.floor(t):t;return this.inf.format(a)}else{const a=this.floor?Math.floor(t):Wc(t,3);return Et(a,this.padTo)}}}class dC{constructor(t,a,o){this.opts=o,this.originalZone=void 0;let u;if(this.opts.timeZone)this.dt=t;else if(t.zone.type==="fixed"){const g=-1*(t.offset/60),y=g>=0?`Etc/GMT+${g}`:`Etc/GMT${g}`;t.offset!==0&&Qi.create(y).valid?(u=y,this.dt=t):(u="UTC",this.dt=t.offset===0?t:t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone)}else t.zone.type==="system"?this.dt=t:t.zone.type==="iana"?(this.dt=t,u=t.zone.name):(u="UTC",this.dt=t.setZone("UTC").plus({minutes:t.offset}),this.originalZone=t.zone);const f={...this.opts};f.timeZone=f.timeZone||u,this.dtf=Yl(a,f)}format(){return this.originalZone?this.formatToParts().map(({value:t})=>t).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){const t=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?t.map(a=>{if(a.type==="timeZoneName"){const o=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...a,value:o}}else return a}):t}resolvedOptions(){return this.dtf.resolvedOptions()}}class hC{constructor(t,a,o){this.opts={style:"long",...o},!a&&fm()&&(this.rtf=iC(t,o))}format(t,a){return this.rtf?this.rtf.format(t,a):LC(a,t,this.opts.numeric,this.opts.style!=="long")}formatToParts(t,a){return this.rtf?this.rtf.formatToParts(t,a):[]}}const nm={firstDay:1,minimalDays:4,weekend:[6,7]};class ot{static fromOpts(t){return ot.create(t.locale,t.numberingSystem,t.outputCalendar,t.weekSettings,t.defaultToEN)}static create(t,a,o,u,f=!1){const g=t||yt.defaultLocale,y=g||(f?"en-US":sC()),k=a||yt.defaultNumberingSystem,A=o||yt.defaultOutputCalendar,M=ql(u)||yt.defaultWeekSettings;return new ot(y,k,A,M,g)}static resetCache(){Ya=null,Wl.clear(),Vl.clear(),Xl.clear(),Ul.clear(),jl.clear()}static fromObject({locale:t,numberingSystem:a,outputCalendar:o,weekSettings:u}={}){return ot.create(t,a,o,u)}constructor(t,a,o,u,f){const[g,y,k]=rC(t);this.locale=g,this.numberingSystem=a||y||null,this.outputCalendar=o||k||null,this.weekSettings=u,this.intl=nC(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=f,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=cC(this)),this.fastNumbersCached}listingMode(){const t=this.isEnglish(),a=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return t&&a?"en":"intl"}clone(t){return!t||Object.getOwnPropertyNames(t).length===0?this:ot.create(t.locale||this.specifiedLocale,t.numberingSystem||this.numberingSystem,t.outputCalendar||this.outputCalendar,ql(t.weekSettings)||this.weekSettings,t.defaultToEN||!1)}redefaultToEN(t={}){return this.clone({...t,defaultToEN:!0})}redefaultToSystem(t={}){return this.clone({...t,defaultToEN:!1})}months(t,a=!1){return Wr(this,t,bm,()=>{const o=a?{month:t,day:"numeric"}:{month:t},u=a?"format":"standalone";return this.monthsCache[u][t]||(this.monthsCache[u][t]=oC(f=>this.extract(f,o,"month"))),this.monthsCache[u][t]})}weekdays(t,a=!1){return Wr(this,t,wm,()=>{const o=a?{weekday:t,year:"numeric",month:"long",day:"numeric"}:{weekday:t},u=a?"format":"standalone";return this.weekdaysCache[u][t]||(this.weekdaysCache[u][t]=lC(f=>this.extract(f,o,"weekday"))),this.weekdaysCache[u][t]})}meridiems(){return Wr(this,void 0,()=>km,()=>{if(!this.meridiemCache){const t={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[Be.utc(2016,11,13,9),Be.utc(2016,11,13,19)].map(a=>this.extract(a,t,"dayperiod"))}return this.meridiemCache})}eras(t){return Wr(this,t,Sm,()=>{const a={era:t};return this.eraCache[t]||(this.eraCache[t]=[Be.utc(-40,1,1),Be.utc(2017,1,1)].map(o=>this.extract(o,a,"era"))),this.eraCache[t]})}extract(t,a,o){const u=this.dtFormatter(t,a),f=u.formatToParts(),g=f.find(y=>y.type.toLowerCase()===o);return g?g.value:null}numberFormatter(t={}){return new uC(this.intl,t.forceSimple||this.fastNumbers,t)}dtFormatter(t,a={}){return new dC(t,this.intl,a)}relFormatter(t={}){return new hC(this.intl,this.isEnglish(),t)}listFormatter(t={}){return eC(this.intl,t)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||rm(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:gm()?aC(this.locale):nm}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(t){return this.locale===t.locale&&this.numberingSystem===t.numberingSystem&&this.outputCalendar===t.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}}let Yo=null;class $t extends Ar{static get utcInstance(){return Yo===null&&(Yo=new $t(0)),Yo}static instance(t){return t===0?$t.utcInstance:new $t(t)}static parseSpecifier(t){if(t){const a=t.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(a)return new $t(oo(a[1],a[2]))}return null}constructor(t){super(),this.fixed=t}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${er(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${er(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(t,a){return er(this.fixed,a)}get isUniversal(){return!0}offset(){return this.fixed}equals(t){return t.type==="fixed"&&t.fixed===this.fixed}get isValid(){return!0}}class fC extends Ar{constructor(t){super(),this.zoneName=t}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}}function ps(e,t){if(Ye(e)||e===null)return t;if(e instanceof Ar)return e;if(xC(e)){const a=e.toLowerCase();return a==="default"?t:a==="local"||a==="system"?ao.instance:a==="utc"||a==="gmt"?$t.utcInstance:$t.parseSpecifier(a)||Qi.create(e)}else return bs(e)?$t.instance(e):typeof e=="object"&&"offset"in e&&typeof e.offset=="function"?e:new fC(e)}const Fc={arab:"[٠-٩]",arabext:"[۰-۹]",bali:"[᭐-᭙]",beng:"[০-৯]",deva:"[०-९]",fullwide:"[0-9]",gujr:"[૦-૯]",hanidec:"[〇|一|二|三|四|五|六|七|八|九]",khmr:"[០-៩]",knda:"[೦-೯]",laoo:"[໐-໙]",limb:"[᥆-᥏]",mlym:"[൦-൯]",mong:"[᠐-᠙]",mymr:"[၀-၉]",orya:"[୦-୯]",tamldec:"[௦-௯]",telu:"[౦-౯]",thai:"[๐-๙]",tibt:"[༠-༩]",latn:"\\d"},th={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},gC=Fc.hanidec.replace(/[\[|\]]/g,"").split("");function pC(e){let t=parseInt(e,10);if(isNaN(t)){t="";for(let a=0;a<e.length;a++){const o=e.charCodeAt(a);if(e[a].search(Fc.hanidec)!==-1)t+=gC.indexOf(e[a]);else for(const u in th){const[f,g]=th[u];o>=f&&o<=g&&(t+=o-f)}}return parseInt(t,10)}else return t}const Gl=new Map;function mC(){Gl.clear()}function bi({numberingSystem:e},t=""){const a=e||"latn";let o=Gl.get(a);o===void 0&&(o=new Map,Gl.set(a,o));let u=o.get(t);return u===void 0&&(u=new RegExp(`${Fc[a]}${t}`),o.set(t,u)),u}let ih=()=>Date.now(),sh="system",ah=null,rh=null,nh=null,oh=60,lh,ch=null;class yt{static get now(){return ih}static set now(t){ih=t}static set defaultZone(t){sh=t}static get defaultZone(){return ps(sh,ao.instance)}static get defaultLocale(){return ah}static set defaultLocale(t){ah=t}static get defaultNumberingSystem(){return rh}static set defaultNumberingSystem(t){rh=t}static get defaultOutputCalendar(){return nh}static set defaultOutputCalendar(t){nh=t}static get defaultWeekSettings(){return ch}static set defaultWeekSettings(t){ch=ql(t)}static get twoDigitCutoffYear(){return oh}static set twoDigitCutoffYear(t){oh=t%100}static get throwOnInvalid(){return lh}static set throwOnInvalid(t){lh=t}static resetCaches(){ot.resetCache(),Qi.resetCache(),Be.resetCache(),mC()}}class wi{constructor(t,a){this.reason=t,this.explanation=a}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}}const om=[0,31,59,90,120,151,181,212,243,273,304,334],lm=[0,31,60,91,121,152,182,213,244,274,305,335];function pi(e,t){return new wi("unit out of range",`you specified ${t} (of type ${typeof t}) as a ${e}, which is invalid`)}function zc(e,t,a){const o=new Date(Date.UTC(e,t-1,a));e<100&&e>=0&&o.setUTCFullYear(o.getUTCFullYear()-1900);const u=o.getUTCDay();return u===0?7:u}function cm(e,t,a){return a+(Cr(e)?lm:om)[t-1]}function um(e,t){const a=Cr(e)?lm:om,o=a.findIndex(f=>f<t),u=t-a[o];return{month:o+1,day:u}}function Bc(e,t){return(e-t+7)%7+1}function En(e,t=4,a=1){const{year:o,month:u,day:f}=e,g=cm(o,u,f),y=Bc(zc(o,u,f),a);let k=Math.floor((g-y+14-t)/7),A;return k<1?(A=o-1,k=fr(A,t,a)):k>fr(o,t,a)?(A=o+1,k=1):A=o,{weekYear:A,weekNumber:k,weekday:y,...lo(e)}}function uh(e,t=4,a=1){const{weekYear:o,weekNumber:u,weekday:f}=e,g=Bc(zc(o,1,t),a),y=ma(o);let k=u*7+f-g-7+t,A;k<1?(A=o-1,k+=ma(A)):k>y?(A=o+1,k-=ma(o)):A=o;const{month:M,day:P}=um(A,k);return{year:A,month:M,day:P,...lo(e)}}function Vo(e){const{year:t,month:a,day:o}=e,u=cm(t,a,o);return{year:t,ordinal:u,...lo(e)}}function dh(e){const{year:t,ordinal:a}=e,{month:o,day:u}=um(t,a);return{year:t,month:o,day:u,...lo(e)}}function hh(e,t){if(!Ye(e.localWeekday)||!Ye(e.localWeekNumber)||!Ye(e.localWeekYear)){if(!Ye(e.weekday)||!Ye(e.weekNumber)||!Ye(e.weekYear))throw new ua("Cannot mix locale-based week fields with ISO-based week fields");return Ye(e.localWeekday)||(e.weekday=e.localWeekday),Ye(e.localWeekNumber)||(e.weekNumber=e.localWeekNumber),Ye(e.localWeekYear)||(e.weekYear=e.localWeekYear),delete e.localWeekday,delete e.localWeekNumber,delete e.localWeekYear,{minDaysInFirstWeek:t.getMinDaysInFirstWeek(),startOfWeek:t.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function vC(e,t=4,a=1){const o=ro(e.weekYear),u=mi(e.weekNumber,1,fr(e.weekYear,t,a)),f=mi(e.weekday,1,7);return o?u?f?!1:pi("weekday",e.weekday):pi("week",e.weekNumber):pi("weekYear",e.weekYear)}function bC(e){const t=ro(e.year),a=mi(e.ordinal,1,ma(e.year));return t?a?!1:pi("ordinal",e.ordinal):pi("year",e.year)}function dm(e){const t=ro(e.year),a=mi(e.month,1,12),o=mi(e.day,1,Mn(e.year,e.month));return t?a?o?!1:pi("day",e.day):pi("month",e.month):pi("year",e.year)}function hm(e){const{hour:t,minute:a,second:o,millisecond:u}=e,f=mi(t,0,23)||t===24&&a===0&&o===0&&u===0,g=mi(a,0,59),y=mi(o,0,59),k=mi(u,0,999);return f?g?y?k?!1:pi("millisecond",u):pi("second",o):pi("minute",a):pi("hour",t)}function Ye(e){return typeof e>"u"}function bs(e){return typeof e=="number"}function ro(e){return typeof e=="number"&&e%1===0}function xC(e){return typeof e=="string"}function yC(e){return Object.prototype.toString.call(e)==="[object Date]"}function fm(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function gm(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function wC(e){return Array.isArray(e)?e:[e]}function fh(e,t,a){if(e.length!==0)return e.reduce((o,u)=>{const f=[t(u),u];return o&&a(o[0],f[0])===o[0]?o:f},null)[1]}function kC(e,t){return t.reduce((a,o)=>(a[o]=e[o],a),{})}function Aa(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function ql(e){if(e==null)return null;if(typeof e!="object")throw new zt("Week settings must be an object");if(!mi(e.firstDay,1,7)||!mi(e.minimalDays,1,7)||!Array.isArray(e.weekend)||e.weekend.some(t=>!mi(t,1,7)))throw new zt("Invalid week settings");return{firstDay:e.firstDay,minimalDays:e.minimalDays,weekend:Array.from(e.weekend)}}function mi(e,t,a){return ro(e)&&e>=t&&e<=a}function SC(e,t){return e-t*Math.floor(e/t)}function Et(e,t=2){const a=e<0;let o;return a?o="-"+(""+-e).padStart(t,"0"):o=(""+e).padStart(t,"0"),o}function gs(e){if(!(Ye(e)||e===null||e===""))return parseInt(e,10)}function Is(e){if(!(Ye(e)||e===null||e===""))return parseFloat(e)}function Hc(e){if(!(Ye(e)||e===null||e==="")){const t=parseFloat("0."+e)*1e3;return Math.floor(t)}}function Wc(e,t,a=!1){const o=10**t;return(a?Math.trunc:Math.round)(e*o)/o}function Cr(e){return e%4===0&&(e%100!==0||e%400===0)}function ma(e){return Cr(e)?366:365}function Mn(e,t){const a=SC(t-1,12)+1,o=e+(t-a)/12;return a===2?Cr(o)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][a-1]}function no(e){let t=Date.UTC(e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond);return e.year<100&&e.year>=0&&(t=new Date(t),t.setUTCFullYear(e.year,e.month-1,e.day)),+t}function gh(e,t,a){return-Bc(zc(e,1,t),a)+t-1}function fr(e,t=4,a=1){const o=gh(e,t,a),u=gh(e+1,t,a);return(ma(e)-o+u)/7}function $l(e){return e>99?e:e>yt.twoDigitCutoffYear?1900+e:2e3+e}function pm(e,t,a,o=null){const u=new Date(e),f={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};o&&(f.timeZone=o);const g={timeZoneName:t,...f},y=new Intl.DateTimeFormat(a,g).formatToParts(u).find(k=>k.type.toLowerCase()==="timezonename");return y?y.value:null}function oo(e,t){let a=parseInt(e,10);Number.isNaN(a)&&(a=0);const o=parseInt(t,10)||0,u=a<0||Object.is(a,-0)?-o:o;return a*60+u}function mm(e){const t=Number(e);if(typeof e=="boolean"||e===""||Number.isNaN(t))throw new zt(`Invalid unit value ${e}`);return t}function Tn(e,t){const a={};for(const o in e)if(Aa(e,o)){const u=e[o];if(u==null)continue;a[t(o)]=mm(u)}return a}function er(e,t){const a=Math.trunc(Math.abs(e/60)),o=Math.trunc(Math.abs(e%60)),u=e>=0?"+":"-";switch(t){case"short":return`${u}${Et(a,2)}:${Et(o,2)}`;case"narrow":return`${u}${a}${o>0?`:${o}`:""}`;case"techie":return`${u}${Et(a,2)}${Et(o,2)}`;default:throw new RangeError(`Value format ${t} is out of range for property format`)}}function lo(e){return kC(e,["hour","minute","second","millisecond"])}const AC=["January","February","March","April","May","June","July","August","September","October","November","December"],vm=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CC=["J","F","M","A","M","J","J","A","S","O","N","D"];function bm(e){switch(e){case"narrow":return[...CC];case"short":return[...vm];case"long":return[...AC];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}const xm=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],ym=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],EC=["M","T","W","T","F","S","S"];function wm(e){switch(e){case"narrow":return[...EC];case"short":return[...ym];case"long":return[...xm];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}const km=["AM","PM"],MC=["Before Christ","Anno Domini"],TC=["BC","AD"],PC=["B","A"];function Sm(e){switch(e){case"narrow":return[...PC];case"short":return[...TC];case"long":return[...MC];default:return null}}function IC(e){return km[e.hour<12?0:1]}function _C(e,t){return wm(t)[e.weekday-1]}function DC(e,t){return bm(t)[e.month-1]}function RC(e,t){return Sm(t)[e.year<0?0:1]}function LC(e,t,a="always",o=!1){const u={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},f=["hours","minutes","seconds"].indexOf(e)===-1;if(a==="auto"&&f){const P=e==="days";switch(t){case 1:return P?"tomorrow":`next ${u[e][0]}`;case-1:return P?"yesterday":`last ${u[e][0]}`;case 0:return P?"today":`this ${u[e][0]}`}}const g=Object.is(t,-0)||t<0,y=Math.abs(t),k=y===1,A=u[e],M=o?k?A[1]:A[2]||A[1]:k?u[e][0]:e;return g?`${y} ${M} ago`:`in ${y} ${M}`}function ph(e,t){let a="";for(const o of e)o.literal?a+=o.val:a+=t(o.val);return a}const OC={D:Cn,DD:Hp,DDD:Wp,DDDD:Yp,t:Vp,tt:Xp,ttt:Up,tttt:jp,T:Gp,TT:qp,TTT:$p,TTTT:Kp,f:Zp,ff:Qp,fff:tm,ffff:sm,F:Jp,FF:em,FFF:im,FFFF:am};class Yt{static create(t,a={}){return new Yt(t,a)}static parseFormat(t){let a=null,o="",u=!1;const f=[];for(let g=0;g<t.length;g++){const y=t.charAt(g);y==="'"?(o.length>0&&f.push({literal:u||/^\s+$/.test(o),val:o}),a=null,o="",u=!u):u||y===a?o+=y:(o.length>0&&f.push({literal:/^\s+$/.test(o),val:o}),o=y,a=y)}return o.length>0&&f.push({literal:u||/^\s+$/.test(o),val:o}),f}static macroTokenToFormatOpts(t){return OC[t]}constructor(t,a){this.opts=a,this.loc=t,this.systemLoc=null}formatWithSystemDefault(t,a){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(t,{...this.opts,...a}).format()}dtFormatter(t,a={}){return this.loc.dtFormatter(t,{...this.opts,...a})}formatDateTime(t,a){return this.dtFormatter(t,a).format()}formatDateTimeParts(t,a){return this.dtFormatter(t,a).formatToParts()}formatInterval(t,a){return this.dtFormatter(t.start,a).dtf.formatRange(t.start.toJSDate(),t.end.toJSDate())}resolvedOptions(t,a){return this.dtFormatter(t,a).resolvedOptions()}num(t,a=0){if(this.opts.forceSimple)return Et(t,a);const o={...this.opts};return a>0&&(o.padTo=a),this.loc.numberFormatter(o).format(t)}formatDateTimeFromString(t,a){const o=this.loc.listingMode()==="en",u=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",f=(H,z)=>this.loc.extract(t,H,z),g=H=>t.isOffsetFixed&&t.offset===0&&H.allowZ?"Z":t.isValid?t.zone.formatOffset(t.ts,H.format):"",y=()=>o?IC(t):f({hour:"numeric",hourCycle:"h12"},"dayperiod"),k=(H,z)=>o?DC(t,H):f(z?{month:H}:{month:H,day:"numeric"},"month"),A=(H,z)=>o?_C(t,H):f(z?{weekday:H}:{weekday:H,month:"long",day:"numeric"},"weekday"),M=H=>{const z=Yt.macroTokenToFormatOpts(H);return z?this.formatWithSystemDefault(t,z):H},P=H=>o?RC(t,H):f({era:H},"era"),N=H=>{switch(H){case"S":return this.num(t.millisecond);case"u":case"SSS":return this.num(t.millisecond,3);case"s":return this.num(t.second);case"ss":return this.num(t.second,2);case"uu":return this.num(Math.floor(t.millisecond/10),2);case"uuu":return this.num(Math.floor(t.millisecond/100));case"m":return this.num(t.minute);case"mm":return this.num(t.minute,2);case"h":return this.num(t.hour%12===0?12:t.hour%12);case"hh":return this.num(t.hour%12===0?12:t.hour%12,2);case"H":return this.num(t.hour);case"HH":return this.num(t.hour,2);case"Z":return g({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return g({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return g({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return t.zone.offsetName(t.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return t.zone.offsetName(t.ts,{format:"long",locale:this.loc.locale});case"z":return t.zoneName;case"a":return y();case"d":return u?f({day:"numeric"},"day"):this.num(t.day);case"dd":return u?f({day:"2-digit"},"day"):this.num(t.day,2);case"c":return this.num(t.weekday);case"ccc":return A("short",!0);case"cccc":return A("long",!0);case"ccccc":return A("narrow",!0);case"E":return this.num(t.weekday);case"EEE":return A("short",!1);case"EEEE":return A("long",!1);case"EEEEE":return A("narrow",!1);case"L":return u?f({month:"numeric",day:"numeric"},"month"):this.num(t.month);case"LL":return u?f({month:"2-digit",day:"numeric"},"month"):this.num(t.month,2);case"LLL":return k("short",!0);case"LLLL":return k("long",!0);case"LLLLL":return k("narrow",!0);case"M":return u?f({month:"numeric"},"month"):this.num(t.month);case"MM":return u?f({month:"2-digit"},"month"):this.num(t.month,2);case"MMM":return k("short",!1);case"MMMM":return k("long",!1);case"MMMMM":return k("narrow",!1);case"y":return u?f({year:"numeric"},"year"):this.num(t.year);case"yy":return u?f({year:"2-digit"},"year"):this.num(t.year.toString().slice(-2),2);case"yyyy":return u?f({year:"numeric"},"year"):this.num(t.year,4);case"yyyyyy":return u?f({year:"numeric"},"year"):this.num(t.year,6);case"G":return P("short");case"GG":return P("long");case"GGGGG":return P("narrow");case"kk":return this.num(t.weekYear.toString().slice(-2),2);case"kkkk":return this.num(t.weekYear,4);case"W":return this.num(t.weekNumber);case"WW":return this.num(t.weekNumber,2);case"n":return this.num(t.localWeekNumber);case"nn":return this.num(t.localWeekNumber,2);case"ii":return this.num(t.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(t.localWeekYear,4);case"o":return this.num(t.ordinal);case"ooo":return this.num(t.ordinal,3);case"q":return this.num(t.quarter);case"qq":return this.num(t.quarter,2);case"X":return this.num(Math.floor(t.ts/1e3));case"x":return this.num(t.ts);default:return M(H)}};return ph(Yt.parseFormat(a),N)}formatDurationFromString(t,a){const o=k=>{switch(k[0]){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":return"hour";case"d":return"day";case"w":return"week";case"M":return"month";case"y":return"year";default:return null}},u=k=>A=>{const M=o(A);return M?this.num(k.get(M),A.length):A},f=Yt.parseFormat(a),g=f.reduce((k,{literal:A,val:M})=>A?k:k.concat(M),[]),y=t.shiftTo(...g.map(o).filter(k=>k));return ph(f,u(y))}}const Am=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function Ta(...e){const t=e.reduce((a,o)=>a+o.source,"");return RegExp(`^${t}$`)}function Pa(...e){return t=>e.reduce(([a,o,u],f)=>{const[g,y,k]=f(t,u);return[{...a,...g},y||o,k]},[{},null,1]).slice(0,2)}function Ia(e,...t){if(e==null)return[null,null];for(const[a,o]of t){const u=a.exec(e);if(u)return o(u)}return[null,null]}function Cm(...e){return(t,a)=>{const o={};let u;for(u=0;u<e.length;u++)o[e[u]]=gs(t[a+u]);return[o,null,a+u]}}const Em=/(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/,NC=`(?:${Em.source}?(?:\\[(${Am.source})\\])?)?`,Yc=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,Mm=RegExp(`${Yc.source}${NC}`),Vc=RegExp(`(?:T${Mm.source})?`),FC=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,zC=/(\d{4})-?W(\d\d)(?:-?(\d))?/,BC=/(\d{4})-?(\d{3})/,HC=Cm("weekYear","weekNumber","weekDay"),WC=Cm("year","ordinal"),YC=/(\d{4})-(\d\d)-(\d\d)/,Tm=RegExp(`${Yc.source} ?(?:${Em.source}|(${Am.source}))?`),VC=RegExp(`(?: ${Tm.source})?`);function va(e,t,a){const o=e[t];return Ye(o)?a:gs(o)}function XC(e,t){return[{year:va(e,t),month:va(e,t+1,1),day:va(e,t+2,1)},null,t+3]}function _a(e,t){return[{hours:va(e,t,0),minutes:va(e,t+1,0),seconds:va(e,t+2,0),milliseconds:Hc(e[t+3])},null,t+4]}function Er(e,t){const a=!e[t]&&!e[t+1],o=oo(e[t+1],e[t+2]),u=a?null:$t.instance(o);return[{},u,t+3]}function Mr(e,t){const a=e[t]?Qi.create(e[t]):null;return[{},a,t+1]}const UC=RegExp(`^T?${Yc.source}$`),jC=/^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/;function GC(e){const[t,a,o,u,f,g,y,k,A]=e,M=t[0]==="-",P=k&&k[0]==="-",N=(H,z=!1)=>H!==void 0&&(z||H&&M)?-H:H;return[{years:N(Is(a)),months:N(Is(o)),weeks:N(Is(u)),days:N(Is(f)),hours:N(Is(g)),minutes:N(Is(y)),seconds:N(Is(k),k==="-0"),milliseconds:N(Hc(A),P)}]}const qC={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Xc(e,t,a,o,u,f,g){const y={year:t.length===2?$l(gs(t)):gs(t),month:vm.indexOf(a)+1,day:gs(o),hour:gs(u),minute:gs(f)};return g&&(y.second=gs(g)),e&&(y.weekday=e.length>3?xm.indexOf(e)+1:ym.indexOf(e)+1),y}const $C=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function KC(e){const[,t,a,o,u,f,g,y,k,A,M,P]=e,N=Xc(t,u,o,a,f,g,y);let H;return k?H=qC[k]:A?H=0:H=oo(M,P),[N,new $t(H)]}function ZC(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}const JC=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,QC=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,e1=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function mh(e){const[,t,a,o,u,f,g,y]=e;return[Xc(t,u,o,a,f,g,y),$t.utcInstance]}function t1(e){const[,t,a,o,u,f,g,y]=e;return[Xc(t,y,a,o,u,f,g),$t.utcInstance]}const i1=Ta(FC,Vc),s1=Ta(zC,Vc),a1=Ta(BC,Vc),r1=Ta(Mm),Pm=Pa(XC,_a,Er,Mr),n1=Pa(HC,_a,Er,Mr),o1=Pa(WC,_a,Er,Mr),l1=Pa(_a,Er,Mr);function c1(e){return Ia(e,[i1,Pm],[s1,n1],[a1,o1],[r1,l1])}function u1(e){return Ia(ZC(e),[$C,KC])}function d1(e){return Ia(e,[JC,mh],[QC,mh],[e1,t1])}function h1(e){return Ia(e,[jC,GC])}const f1=Pa(_a);function g1(e){return Ia(e,[UC,f1])}const p1=Ta(YC,VC),m1=Ta(Tm),v1=Pa(_a,Er,Mr);function b1(e){return Ia(e,[p1,Pm],[m1,v1])}const vh="Invalid Duration",Im={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1e3},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1e3},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},x1={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1e3},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1e3},...Im},fi=146097/400,ia=146097/4800,y1={years:{quarters:4,months:12,weeks:fi/7,days:fi,hours:fi*24,minutes:fi*24*60,seconds:fi*24*60*60,milliseconds:fi*24*60*60*1e3},quarters:{months:3,weeks:fi/28,days:fi/4,hours:fi*24/4,minutes:fi*24*60/4,seconds:fi*24*60*60/4,milliseconds:fi*24*60*60*1e3/4},months:{weeks:ia/7,days:ia,hours:ia*24,minutes:ia*24*60,seconds:ia*24*60*60,milliseconds:ia*24*60*60*1e3},...Im},Ls=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],w1=Ls.slice(0).reverse();function ns(e,t,a=!1){const o={values:a?t.values:{...e.values,...t.values||{}},loc:e.loc.clone(t.loc),conversionAccuracy:t.conversionAccuracy||e.conversionAccuracy,matrix:t.matrix||e.matrix};return new Ze(o)}function _m(e,t){let a=t.milliseconds??0;for(const o of w1.slice(1))t[o]&&(a+=t[o]*e[o].milliseconds);return a}function bh(e,t){const a=_m(e,t)<0?-1:1;Ls.reduceRight((o,u)=>{if(Ye(t[u]))return o;if(o){const f=t[o]*a,g=e[u][o],y=Math.floor(f/g);t[u]+=y*a,t[o]-=y*g*a}return u},null),Ls.reduce((o,u)=>{if(Ye(t[u]))return o;if(o){const f=t[o]%1;t[o]-=f,t[u]+=f*e[o][u]}return u},null)}function k1(e){const t={};for(const[a,o]of Object.entries(e))o!==0&&(t[a]=o);return t}class Ze{constructor(t){const a=t.conversionAccuracy==="longterm"||!1;let o=a?y1:x1;t.matrix&&(o=t.matrix),this.values=t.values,this.loc=t.loc||ot.create(),this.conversionAccuracy=a?"longterm":"casual",this.invalid=t.invalid||null,this.matrix=o,this.isLuxonDuration=!0}static fromMillis(t,a){return Ze.fromObject({milliseconds:t},a)}static fromObject(t,a={}){if(t==null||typeof t!="object")throw new zt(`Duration.fromObject: argument expected to be an object, got ${t===null?"null":typeof t}`);return new Ze({values:Tn(t,Ze.normalizeUnit),loc:ot.fromObject(a),conversionAccuracy:a.conversionAccuracy,matrix:a.matrix})}static fromDurationLike(t){if(bs(t))return Ze.fromMillis(t);if(Ze.isDuration(t))return t;if(typeof t=="object")return Ze.fromObject(t);throw new zt(`Unknown duration argument ${t} of type ${typeof t}`)}static fromISO(t,a){const[o]=h1(t);return o?Ze.fromObject(o,a):Ze.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static fromISOTime(t,a){const[o]=g1(t);return o?Ze.fromObject(o,a):Ze.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the Duration is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new GA(o);return new Ze({invalid:o})}static normalizeUnit(t){const a={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[t&&t.toLowerCase()];if(!a)throw new Bp(t);return a}static isDuration(t){return t&&t.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(t,a={}){const o={...a,floor:a.round!==!1&&a.floor!==!1};return this.isValid?Yt.create(this.loc,o).formatDurationFromString(this,t):vh}toHuman(t={}){if(!this.isValid)return vh;const a=Ls.map(o=>{const u=this.values[o];return Ye(u)?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...t,unit:o.slice(0,-1)}).format(u)}).filter(o=>o);return this.loc.listFormatter({type:"conjunction",style:t.listStyle||"narrow",...t}).format(a)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let t="P";return this.years!==0&&(t+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(t+=this.months+this.quarters*3+"M"),this.weeks!==0&&(t+=this.weeks+"W"),this.days!==0&&(t+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(t+="T"),this.hours!==0&&(t+=this.hours+"H"),this.minutes!==0&&(t+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(t+=Wc(this.seconds+this.milliseconds/1e3,3)+"S"),t==="P"&&(t+="T0S"),t}toISOTime(t={}){if(!this.isValid)return null;const a=this.toMillis();return a<0||a>=864e5?null:(t={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...t,includeOffset:!1},Be.fromMillis(a,{zone:"UTC"}).toISOTime(t))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?_m(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t),o={};for(const u of Ls)(Aa(a.values,u)||Aa(this.values,u))&&(o[u]=a.get(u)+this.get(u));return ns(this,{values:o},!0)}minus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t);return this.plus(a.negate())}mapUnits(t){if(!this.isValid)return this;const a={};for(const o of Object.keys(this.values))a[o]=mm(t(this.values[o],o));return ns(this,{values:a},!0)}get(t){return this[Ze.normalizeUnit(t)]}set(t){if(!this.isValid)return this;const a={...this.values,...Tn(t,Ze.normalizeUnit)};return ns(this,{values:a})}reconfigure({locale:t,numberingSystem:a,conversionAccuracy:o,matrix:u}={}){const g={loc:this.loc.clone({locale:t,numberingSystem:a}),matrix:u,conversionAccuracy:o};return ns(this,g)}as(t){return this.isValid?this.shiftTo(t).get(t):NaN}normalize(){if(!this.isValid)return this;const t=this.toObject();return bh(this.matrix,t),ns(this,{values:t},!0)}rescale(){if(!this.isValid)return this;const t=k1(this.normalize().shiftToAll().toObject());return ns(this,{values:t},!0)}shiftTo(...t){if(!this.isValid)return this;if(t.length===0)return this;t=t.map(g=>Ze.normalizeUnit(g));const a={},o={},u=this.toObject();let f;for(const g of Ls)if(t.indexOf(g)>=0){f=g;let y=0;for(const A in o)y+=this.matrix[A][g]*o[A],o[A]=0;bs(u[g])&&(y+=u[g]);const k=Math.trunc(y);a[g]=k,o[g]=(y*1e3-k*1e3)/1e3}else bs(u[g])&&(o[g]=u[g]);for(const g in o)o[g]!==0&&(a[f]+=g===f?o[g]:o[g]/this.matrix[f][g]);return bh(this.matrix,a),ns(this,{values:a},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;const t={};for(const a of Object.keys(this.values))t[a]=this.values[a]===0?0:-this.values[a];return ns(this,{values:t},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(t){if(!this.isValid||!t.isValid||!this.loc.equals(t.loc))return!1;function a(o,u){return o===void 0||o===0?u===void 0||u===0:o===u}for(const o of Ls)if(!a(this.values[o],t.values[o]))return!1;return!0}}const sa="Invalid Interval";function S1(e,t){return!e||!e.isValid?xt.invalid("missing or invalid start"):!t||!t.isValid?xt.invalid("missing or invalid end"):t<e?xt.invalid("end before start",`The end of an interval must be after its start, but you had start=${e.toISO()} and end=${t.toISO()}`):null}class xt{constructor(t){this.s=t.start,this.e=t.end,this.invalid=t.invalid||null,this.isLuxonInterval=!0}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the Interval is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new jA(o);return new xt({invalid:o})}static fromDateTimes(t,a){const o=Ba(t),u=Ba(a),f=S1(o,u);return f??new xt({start:o,end:u})}static after(t,a){const o=Ze.fromDurationLike(a),u=Ba(t);return xt.fromDateTimes(u,u.plus(o))}static before(t,a){const o=Ze.fromDurationLike(a),u=Ba(t);return xt.fromDateTimes(u.minus(o),u)}static fromISO(t,a){const[o,u]=(t||"").split("/",2);if(o&&u){let f,g;try{f=Be.fromISO(o,a),g=f.isValid}catch{g=!1}let y,k;try{y=Be.fromISO(u,a),k=y.isValid}catch{k=!1}if(g&&k)return xt.fromDateTimes(f,y);if(g){const A=Ze.fromISO(u,a);if(A.isValid)return xt.after(f,A)}else if(k){const A=Ze.fromISO(o,a);if(A.isValid)return xt.before(y,A)}}return xt.invalid("unparsable",`the input "${t}" can't be parsed as ISO 8601`)}static isInterval(t){return t&&t.isLuxonInterval||!1}get start(){return this.isValid?this.s:null}get end(){return this.isValid?this.e:null}get lastDateTime(){return this.isValid&&this.e?this.e.minus(1):null}get isValid(){return this.invalidReason===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}length(t="milliseconds"){return this.isValid?this.toDuration(t).get(t):NaN}count(t="milliseconds",a){if(!this.isValid)return NaN;const o=this.start.startOf(t,a);let u;return a!=null&&a.useLocaleWeeks?u=this.end.reconfigure({locale:o.locale}):u=this.end,u=u.startOf(t,a),Math.floor(u.diff(o,t).get(t))+(u.valueOf()!==this.end.valueOf())}hasSame(t){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,t):!1}isEmpty(){return this.s.valueOf()===this.e.valueOf()}isAfter(t){return this.isValid?this.s>t:!1}isBefore(t){return this.isValid?this.e<=t:!1}contains(t){return this.isValid?this.s<=t&&this.e>t:!1}set({start:t,end:a}={}){return this.isValid?xt.fromDateTimes(t||this.s,a||this.e):this}splitAt(...t){if(!this.isValid)return[];const a=t.map(Ba).filter(g=>this.contains(g)).sort((g,y)=>g.toMillis()-y.toMillis()),o=[];let{s:u}=this,f=0;for(;u<this.e;){const g=a[f]||this.e,y=+g>+this.e?this.e:g;o.push(xt.fromDateTimes(u,y)),u=y,f+=1}return o}splitBy(t){const a=Ze.fromDurationLike(t);if(!this.isValid||!a.isValid||a.as("milliseconds")===0)return[];let{s:o}=this,u=1,f;const g=[];for(;o<this.e;){const y=this.start.plus(a.mapUnits(k=>k*u));f=+y>+this.e?this.e:y,g.push(xt.fromDateTimes(o,f)),o=f,u+=1}return g}divideEqually(t){return this.isValid?this.splitBy(this.length()/t).slice(0,t):[]}overlaps(t){return this.e>t.s&&this.s<t.e}abutsStart(t){return this.isValid?+this.e==+t.s:!1}abutsEnd(t){return this.isValid?+t.e==+this.s:!1}engulfs(t){return this.isValid?this.s<=t.s&&this.e>=t.e:!1}equals(t){return!this.isValid||!t.isValid?!1:this.s.equals(t.s)&&this.e.equals(t.e)}intersection(t){if(!this.isValid)return this;const a=this.s>t.s?this.s:t.s,o=this.e<t.e?this.e:t.e;return a>=o?null:xt.fromDateTimes(a,o)}union(t){if(!this.isValid)return this;const a=this.s<t.s?this.s:t.s,o=this.e>t.e?this.e:t.e;return xt.fromDateTimes(a,o)}static merge(t){const[a,o]=t.sort((u,f)=>u.s-f.s).reduce(([u,f],g)=>f?f.overlaps(g)||f.abutsStart(g)?[u,f.union(g)]:[u.concat([f]),g]:[u,g],[[],null]);return o&&a.push(o),a}static xor(t){let a=null,o=0;const u=[],f=t.map(k=>[{time:k.s,type:"s"},{time:k.e,type:"e"}]),g=Array.prototype.concat(...f),y=g.sort((k,A)=>k.time-A.time);for(const k of y)o+=k.type==="s"?1:-1,o===1?a=k.time:(a&&+a!=+k.time&&u.push(xt.fromDateTimes(a,k.time)),a=null);return xt.merge(u)}difference(...t){return xt.xor([this].concat(t)).map(a=>this.intersection(a)).filter(a=>a&&!a.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} – ${this.e.toISO()})`:sa}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(t=Cn,a={}){return this.isValid?Yt.create(this.s.loc.clone(a),t).formatInterval(this):sa}toISO(t){return this.isValid?`${this.s.toISO(t)}/${this.e.toISO(t)}`:sa}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:sa}toISOTime(t){return this.isValid?`${this.s.toISOTime(t)}/${this.e.toISOTime(t)}`:sa}toFormat(t,{separator:a=" – "}={}){return this.isValid?`${this.s.toFormat(t)}${a}${this.e.toFormat(t)}`:sa}toDuration(t,a){return this.isValid?this.e.diff(this.s,t,a):Ze.invalid(this.invalidReason)}mapEndpoints(t){return xt.fromDateTimes(t(this.s),t(this.e))}}class Yr{static hasDST(t=yt.defaultZone){const a=Be.now().setZone(t).set({month:12});return!t.isUniversal&&a.offset!==a.set({month:6}).offset}static isValidIANAZone(t){return Qi.isValidZone(t)}static normalizeZone(t){return ps(t,yt.defaultZone)}static getStartOfWeek({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale:t=null,locObj:a=null}={}){return(a||ot.create(t)).getWeekendDays().slice()}static months(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null,outputCalendar:f="gregory"}={}){return(u||ot.create(a,o,f)).months(t)}static monthsFormat(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null,outputCalendar:f="gregory"}={}){return(u||ot.create(a,o,f)).months(t,!0)}static weekdays(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null}={}){return(u||ot.create(a,o,null)).weekdays(t)}static weekdaysFormat(t="long",{locale:a=null,numberingSystem:o=null,locObj:u=null}={}){return(u||ot.create(a,o,null)).weekdays(t,!0)}static meridiems({locale:t=null}={}){return ot.create(t).meridiems()}static eras(t="short",{locale:a=null}={}){return ot.create(a,null,"gregory").eras(t)}static features(){return{relative:fm(),localeWeek:gm()}}}function xh(e,t){const a=u=>u.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),o=a(t)-a(e);return Math.floor(Ze.fromMillis(o).as("days"))}function A1(e,t,a){const o=[["years",(k,A)=>A.year-k.year],["quarters",(k,A)=>A.quarter-k.quarter+(A.year-k.year)*4],["months",(k,A)=>A.month-k.month+(A.year-k.year)*12],["weeks",(k,A)=>{const M=xh(k,A);return(M-M%7)/7}],["days",xh]],u={},f=e;let g,y;for(const[k,A]of o)a.indexOf(k)>=0&&(g=k,u[k]=A(e,t),y=f.plus(u),y>t?(u[k]--,e=f.plus(u),e>t&&(y=e,u[k]--,e=f.plus(u))):e=y);return[e,u,y,g]}function C1(e,t,a,o){let[u,f,g,y]=A1(e,t,a);const k=t-u,A=a.filter(P=>["hours","minutes","seconds","milliseconds"].indexOf(P)>=0);A.length===0&&(g<t&&(g=u.plus({[y]:1})),g!==u&&(f[y]=(f[y]||0)+k/(g-u)));const M=Ze.fromObject(f,o);return A.length>0?Ze.fromMillis(k,o).shiftTo(...A).plus(M):M}const E1="missing Intl.DateTimeFormat.formatToParts support";function it(e,t=a=>a){return{regex:e,deser:([a])=>t(pC(a))}}const M1=" ",Dm=`[ ${M1}]`,Rm=new RegExp(Dm,"g");function T1(e){return e.replace(/\./g,"\\.?").replace(Rm,Dm)}function yh(e){return e.replace(/\./g,"").replace(Rm," ").toLowerCase()}function xi(e,t){return e===null?null:{regex:RegExp(e.map(T1).join("|")),deser:([a])=>e.findIndex(o=>yh(a)===yh(o))+t}}function wh(e,t){return{regex:e,deser:([,a,o])=>oo(a,o),groups:t}}function Vr(e){return{regex:e,deser:([t])=>t}}function P1(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function I1(e,t){const a=bi(t),o=bi(t,"{2}"),u=bi(t,"{3}"),f=bi(t,"{4}"),g=bi(t,"{6}"),y=bi(t,"{1,2}"),k=bi(t,"{1,3}"),A=bi(t,"{1,6}"),M=bi(t,"{1,9}"),P=bi(t,"{2,4}"),N=bi(t,"{4,6}"),H=Q=>({regex:RegExp(P1(Q.val)),deser:([q])=>q,literal:!0}),G=(Q=>{if(e.literal)return H(Q);switch(Q.val){case"G":return xi(t.eras("short"),0);case"GG":return xi(t.eras("long"),0);case"y":return it(A);case"yy":return it(P,$l);case"yyyy":return it(f);case"yyyyy":return it(N);case"yyyyyy":return it(g);case"M":return it(y);case"MM":return it(o);case"MMM":return xi(t.months("short",!0),1);case"MMMM":return xi(t.months("long",!0),1);case"L":return it(y);case"LL":return it(o);case"LLL":return xi(t.months("short",!1),1);case"LLLL":return xi(t.months("long",!1),1);case"d":return it(y);case"dd":return it(o);case"o":return it(k);case"ooo":return it(u);case"HH":return it(o);case"H":return it(y);case"hh":return it(o);case"h":return it(y);case"mm":return it(o);case"m":return it(y);case"q":return it(y);case"qq":return it(o);case"s":return it(y);case"ss":return it(o);case"S":return it(k);case"SSS":return it(u);case"u":return Vr(M);case"uu":return Vr(y);case"uuu":return it(a);case"a":return xi(t.meridiems(),0);case"kkkk":return it(f);case"kk":return it(P,$l);case"W":return it(y);case"WW":return it(o);case"E":case"c":return it(a);case"EEE":return xi(t.weekdays("short",!1),1);case"EEEE":return xi(t.weekdays("long",!1),1);case"ccc":return xi(t.weekdays("short",!0),1);case"cccc":return xi(t.weekdays("long",!0),1);case"Z":case"ZZ":return wh(new RegExp(`([+-]${y.source})(?::(${o.source}))?`),2);case"ZZZ":return wh(new RegExp(`([+-]${y.source})(${o.source})?`),2);case"z":return Vr(/[a-z_+-/]{1,256}?/i);case" ":return Vr(/[^\S\n\r]/);default:return H(Q)}})(e)||{invalidReason:E1};return G.token=e,G}const _1={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function D1(e,t,a){const{type:o,value:u}=e;if(o==="literal"){const k=/^\s+$/.test(u);return{literal:!k,val:k?" ":u}}const f=t[o];let g=o;o==="hour"&&(t.hour12!=null?g=t.hour12?"hour12":"hour24":t.hourCycle!=null?t.hourCycle==="h11"||t.hourCycle==="h12"?g="hour12":g="hour24":g=a.hour12?"hour12":"hour24");let y=_1[g];if(typeof y=="object"&&(y=y[f]),y)return{literal:!1,val:y}}function R1(e){return[`^${e.map(a=>a.regex).reduce((a,o)=>`${a}(${o.source})`,"")}$`,e]}function L1(e,t,a){const o=e.match(t);if(o){const u={};let f=1;for(const g in a)if(Aa(a,g)){const y=a[g],k=y.groups?y.groups+1:1;!y.literal&&y.token&&(u[y.token.val[0]]=y.deser(o.slice(f,f+k))),f+=k}return[o,u]}else return[o,{}]}function O1(e){const t=f=>{switch(f){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}};let a=null,o;return Ye(e.z)||(a=Qi.create(e.z)),Ye(e.Z)||(a||(a=new $t(e.Z)),o=e.Z),Ye(e.q)||(e.M=(e.q-1)*3+1),Ye(e.h)||(e.h<12&&e.a===1?e.h+=12:e.h===12&&e.a===0&&(e.h=0)),e.G===0&&e.y&&(e.y=-e.y),Ye(e.u)||(e.S=Hc(e.u)),[Object.keys(e).reduce((f,g)=>{const y=t(g);return y&&(f[y]=e[g]),f},{}),a,o]}let Xo=null;function N1(){return Xo||(Xo=Be.fromMillis(1555555555555)),Xo}function F1(e,t){if(e.literal)return e;const a=Yt.macroTokenToFormatOpts(e.val),o=Fm(a,t);return o==null||o.includes(void 0)?e:o}function Lm(e,t){return Array.prototype.concat(...e.map(a=>F1(a,t)))}class Om{constructor(t,a){if(this.locale=t,this.format=a,this.tokens=Lm(Yt.parseFormat(a),t),this.units=this.tokens.map(o=>I1(o,t)),this.disqualifyingUnit=this.units.find(o=>o.invalidReason),!this.disqualifyingUnit){const[o,u]=R1(this.units);this.regex=RegExp(o,"i"),this.handlers=u}}explainFromTokens(t){if(this.isValid){const[a,o]=L1(t,this.regex,this.handlers),[u,f,g]=o?O1(o):[null,null,void 0];if(Aa(o,"a")&&Aa(o,"H"))throw new ua("Can't include meridiem when specifying 24-hour format");return{input:t,tokens:this.tokens,regex:this.regex,rawMatches:a,matches:o,result:u,zone:f,specificOffset:g}}else return{input:t,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}}function Nm(e,t,a){return new Om(e,a).explainFromTokens(t)}function z1(e,t,a){const{result:o,zone:u,specificOffset:f,invalidReason:g}=Nm(e,t,a);return[o,u,f,g]}function Fm(e,t){if(!e)return null;const o=Yt.create(t,e).dtFormatter(N1()),u=o.formatToParts(),f=o.resolvedOptions();return u.map(g=>D1(g,e,f))}const Uo="Invalid DateTime",kh=864e13;function Va(e){return new wi("unsupported zone",`the zone "${e.name}" is not supported`)}function jo(e){return e.weekData===null&&(e.weekData=En(e.c)),e.weekData}function Go(e){return e.localWeekData===null&&(e.localWeekData=En(e.c,e.loc.getMinDaysInFirstWeek(),e.loc.getStartOfWeek())),e.localWeekData}function _s(e,t){const a={ts:e.ts,zone:e.zone,c:e.c,o:e.o,loc:e.loc,invalid:e.invalid};return new Be({...a,...t,old:a})}function zm(e,t,a){let o=e-t*60*1e3;const u=a.offset(o);if(t===u)return[o,t];o-=(u-t)*60*1e3;const f=a.offset(o);return u===f?[o,u]:[e-Math.min(u,f)*60*1e3,Math.max(u,f)]}function Xr(e,t){e+=t*60*1e3;const a=new Date(e);return{year:a.getUTCFullYear(),month:a.getUTCMonth()+1,day:a.getUTCDate(),hour:a.getUTCHours(),minute:a.getUTCMinutes(),second:a.getUTCSeconds(),millisecond:a.getUTCMilliseconds()}}function sn(e,t,a){return zm(no(e),t,a)}function Sh(e,t){const a=e.o,o=e.c.year+Math.trunc(t.years),u=e.c.month+Math.trunc(t.months)+Math.trunc(t.quarters)*3,f={...e.c,year:o,month:u,day:Math.min(e.c.day,Mn(o,u))+Math.trunc(t.days)+Math.trunc(t.weeks)*7},g=Ze.fromObject({years:t.years-Math.trunc(t.years),quarters:t.quarters-Math.trunc(t.quarters),months:t.months-Math.trunc(t.months),weeks:t.weeks-Math.trunc(t.weeks),days:t.days-Math.trunc(t.days),hours:t.hours,minutes:t.minutes,seconds:t.seconds,milliseconds:t.milliseconds}).as("milliseconds"),y=no(f);let[k,A]=zm(y,a,e.zone);return g!==0&&(k+=g,A=e.zone.offset(k)),{ts:k,o:A}}function aa(e,t,a,o,u,f){const{setZone:g,zone:y}=a;if(e&&Object.keys(e).length!==0||t){const k=t||y,A=Be.fromObject(e,{...a,zone:k,specificOffset:f});return g?A:A.setZone(y)}else return Be.invalid(new wi("unparsable",`the input "${u}" can't be parsed as ${o}`))}function Ur(e,t,a=!0){return e.isValid?Yt.create(ot.create("en-US"),{allowZ:a,forceSimple:!0}).formatDateTimeFromString(e,t):null}function qo(e,t){const a=e.c.year>9999||e.c.year<0;let o="";return a&&e.c.year>=0&&(o+="+"),o+=Et(e.c.year,a?6:4),t?(o+="-",o+=Et(e.c.month),o+="-",o+=Et(e.c.day)):(o+=Et(e.c.month),o+=Et(e.c.day)),o}function Ah(e,t,a,o,u,f){let g=Et(e.c.hour);return t?(g+=":",g+=Et(e.c.minute),(e.c.millisecond!==0||e.c.second!==0||!a)&&(g+=":")):g+=Et(e.c.minute),(e.c.millisecond!==0||e.c.second!==0||!a)&&(g+=Et(e.c.second),(e.c.millisecond!==0||!o)&&(g+=".",g+=Et(e.c.millisecond,3))),u&&(e.isOffsetFixed&&e.offset===0&&!f?g+="Z":e.o<0?(g+="-",g+=Et(Math.trunc(-e.o/60)),g+=":",g+=Et(Math.trunc(-e.o%60))):(g+="+",g+=Et(Math.trunc(e.o/60)),g+=":",g+=Et(Math.trunc(e.o%60)))),f&&(g+="["+e.zone.ianaName+"]"),g}const Bm={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},B1={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},H1={ordinal:1,hour:0,minute:0,second:0,millisecond:0},Hm=["year","month","day","hour","minute","second","millisecond"],W1=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],Y1=["year","ordinal","hour","minute","second","millisecond"];function V1(e){const t={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[e.toLowerCase()];if(!t)throw new Bp(e);return t}function Ch(e){switch(e.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return V1(e)}}function X1(e){if(Xa===void 0&&(Xa=yt.now()),e.type!=="iana")return e.offset(Xa);const t=e.name;let a=Kl.get(t);return a===void 0&&(a=e.offset(Xa),Kl.set(t,a)),a}function Eh(e,t){const a=ps(t.zone,yt.defaultZone);if(!a.isValid)return Be.invalid(Va(a));const o=ot.fromObject(t);let u,f;if(Ye(e.year))u=yt.now();else{for(const k of Hm)Ye(e[k])&&(e[k]=Bm[k]);const g=dm(e)||hm(e);if(g)return Be.invalid(g);const y=X1(a);[u,f]=sn(e,y,a)}return new Be({ts:u,zone:a,loc:o,o:f})}function Mh(e,t,a){const o=Ye(a.round)?!0:a.round,u=(g,y)=>(g=Wc(g,o||a.calendary?0:2,!0),t.loc.clone(a).relFormatter(a).format(g,y)),f=g=>a.calendary?t.hasSame(e,g)?0:t.startOf(g).diff(e.startOf(g),g).get(g):t.diff(e,g).get(g);if(a.unit)return u(f(a.unit),a.unit);for(const g of a.units){const y=f(g);if(Math.abs(y)>=1)return u(y,g)}return u(e>t?-0:0,a.units[a.units.length-1])}function Th(e){let t={},a;return e.length>0&&typeof e[e.length-1]=="object"?(t=e[e.length-1],a=Array.from(e).slice(0,e.length-1)):a=Array.from(e),[t,a]}let Xa;const Kl=new Map;class Be{constructor(t){const a=t.zone||yt.defaultZone;let o=t.invalid||(Number.isNaN(t.ts)?new wi("invalid input"):null)||(a.isValid?null:Va(a));this.ts=Ye(t.ts)?yt.now():t.ts;let u=null,f=null;if(!o)if(t.old&&t.old.ts===this.ts&&t.old.zone.equals(a))[u,f]=[t.old.c,t.old.o];else{const y=bs(t.o)&&!t.old?t.o:a.offset(this.ts);u=Xr(this.ts,y),o=Number.isNaN(u.year)?new wi("invalid input"):null,u=o?null:u,f=o?null:y}this._zone=a,this.loc=t.loc||ot.create(),this.invalid=o,this.weekData=null,this.localWeekData=null,this.c=u,this.o=f,this.isLuxonDateTime=!0}static now(){return new Be({})}static local(){const[t,a]=Th(arguments),[o,u,f,g,y,k,A]=a;return Eh({year:o,month:u,day:f,hour:g,minute:y,second:k,millisecond:A},t)}static utc(){const[t,a]=Th(arguments),[o,u,f,g,y,k,A]=a;return t.zone=$t.utcInstance,Eh({year:o,month:u,day:f,hour:g,minute:y,second:k,millisecond:A},t)}static fromJSDate(t,a={}){const o=yC(t)?t.valueOf():NaN;if(Number.isNaN(o))return Be.invalid("invalid input");const u=ps(a.zone,yt.defaultZone);return u.isValid?new Be({ts:o,zone:u,loc:ot.fromObject(a)}):Be.invalid(Va(u))}static fromMillis(t,a={}){if(bs(t))return t<-kh||t>kh?Be.invalid("Timestamp out of range"):new Be({ts:t,zone:ps(a.zone,yt.defaultZone),loc:ot.fromObject(a)});throw new zt(`fromMillis requires a numerical input, but received a ${typeof t} with value ${t}`)}static fromSeconds(t,a={}){if(bs(t))return new Be({ts:t*1e3,zone:ps(a.zone,yt.defaultZone),loc:ot.fromObject(a)});throw new zt("fromSeconds requires a numerical input")}static fromObject(t,a={}){t=t||{};const o=ps(a.zone,yt.defaultZone);if(!o.isValid)return Be.invalid(Va(o));const u=ot.fromObject(a),f=Tn(t,Ch),{minDaysInFirstWeek:g,startOfWeek:y}=hh(f,u),k=yt.now(),A=Ye(a.specificOffset)?o.offset(k):a.specificOffset,M=!Ye(f.ordinal),P=!Ye(f.year),N=!Ye(f.month)||!Ye(f.day),H=P||N,z=f.weekYear||f.weekNumber;if((H||M)&&z)throw new ua("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(N&&M)throw new ua("Can't mix ordinal dates with month/day");const G=z||f.weekday&&!H;let Q,q,ie=Xr(k,A);G?(Q=W1,q=B1,ie=En(ie,g,y)):M?(Q=Y1,q=H1,ie=Vo(ie)):(Q=Hm,q=Bm);let $=!1;for(const fe of Q){const ge=f[fe];Ye(ge)?$?f[fe]=q[fe]:f[fe]=ie[fe]:$=!0}const re=G?vC(f,g,y):M?bC(f):dm(f),B=re||hm(f);if(B)return Be.invalid(B);const de=G?uh(f,g,y):M?dh(f):f,[ae,U]=sn(de,A,o),J=new Be({ts:ae,zone:o,o:U,loc:u});return f.weekday&&H&&t.weekday!==J.weekday?Be.invalid("mismatched weekday",`you can't specify both a weekday of ${f.weekday} and a date of ${J.toISO()}`):J.isValid?J:Be.invalid(J.invalid)}static fromISO(t,a={}){const[o,u]=c1(t);return aa(o,u,a,"ISO 8601",t)}static fromRFC2822(t,a={}){const[o,u]=u1(t);return aa(o,u,a,"RFC 2822",t)}static fromHTTP(t,a={}){const[o,u]=d1(t);return aa(o,u,a,"HTTP",a)}static fromFormat(t,a,o={}){if(Ye(t)||Ye(a))throw new zt("fromFormat requires an input string and a format");const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0}),[y,k,A,M]=z1(g,t,a);return M?Be.invalid(M):aa(y,k,o,`format ${a}`,t,A)}static fromString(t,a,o={}){return Be.fromFormat(t,a,o)}static fromSQL(t,a={}){const[o,u]=b1(t);return aa(o,u,a,"SQL",t)}static invalid(t,a=null){if(!t)throw new zt("need to specify a reason the DateTime is invalid");const o=t instanceof wi?t:new wi(t,a);if(yt.throwOnInvalid)throw new UA(o);return new Be({invalid:o})}static isDateTime(t){return t&&t.isLuxonDateTime||!1}static parseFormatForOpts(t,a={}){const o=Fm(t,ot.fromObject(a));return o?o.map(u=>u?u.val:null).join(""):null}static expandFormat(t,a={}){return Lm(Yt.parseFormat(t),ot.fromObject(a)).map(u=>u.val).join("")}static resetCache(){Xa=void 0,Kl.clear()}get(t){return this[t]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?jo(this).weekYear:NaN}get weekNumber(){return this.isValid?jo(this).weekNumber:NaN}get weekday(){return this.isValid?jo(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?Go(this).weekday:NaN}get localWeekNumber(){return this.isValid?Go(this).weekNumber:NaN}get localWeekYear(){return this.isValid?Go(this).weekYear:NaN}get ordinal(){return this.isValid?Vo(this.c).ordinal:NaN}get monthShort(){return this.isValid?Yr.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Yr.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Yr.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Yr.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];const t=864e5,a=6e4,o=no(this.c),u=this.zone.offset(o-t),f=this.zone.offset(o+t),g=this.zone.offset(o-u*a),y=this.zone.offset(o-f*a);if(g===y)return[this];const k=o-g*a,A=o-y*a,M=Xr(k,g),P=Xr(A,y);return M.hour===P.hour&&M.minute===P.minute&&M.second===P.second&&M.millisecond===P.millisecond?[_s(this,{ts:k}),_s(this,{ts:A})]:[this]}get isInLeapYear(){return Cr(this.year)}get daysInMonth(){return Mn(this.year,this.month)}get daysInYear(){return this.isValid?ma(this.year):NaN}get weeksInWeekYear(){return this.isValid?fr(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?fr(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(t={}){const{locale:a,numberingSystem:o,calendar:u}=Yt.create(this.loc.clone(t),t).resolvedOptions(this);return{locale:a,numberingSystem:o,outputCalendar:u}}toUTC(t=0,a={}){return this.setZone($t.instance(t),a)}toLocal(){return this.setZone(yt.defaultZone)}setZone(t,{keepLocalTime:a=!1,keepCalendarTime:o=!1}={}){if(t=ps(t,yt.defaultZone),t.equals(this.zone))return this;if(t.isValid){let u=this.ts;if(a||o){const f=t.offset(this.ts),g=this.toObject();[u]=sn(g,f,t)}return _s(this,{ts:u,zone:t})}else return Be.invalid(Va(t))}reconfigure({locale:t,numberingSystem:a,outputCalendar:o}={}){const u=this.loc.clone({locale:t,numberingSystem:a,outputCalendar:o});return _s(this,{loc:u})}setLocale(t){return this.reconfigure({locale:t})}set(t){if(!this.isValid)return this;const a=Tn(t,Ch),{minDaysInFirstWeek:o,startOfWeek:u}=hh(a,this.loc),f=!Ye(a.weekYear)||!Ye(a.weekNumber)||!Ye(a.weekday),g=!Ye(a.ordinal),y=!Ye(a.year),k=!Ye(a.month)||!Ye(a.day),A=y||k,M=a.weekYear||a.weekNumber;if((A||g)&&M)throw new ua("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(k&&g)throw new ua("Can't mix ordinal dates with month/day");let P;f?P=uh({...En(this.c,o,u),...a},o,u):Ye(a.ordinal)?(P={...this.toObject(),...a},Ye(a.day)&&(P.day=Math.min(Mn(P.year,P.month),P.day))):P=dh({...Vo(this.c),...a});const[N,H]=sn(P,this.o,this.zone);return _s(this,{ts:N,o:H})}plus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t);return _s(this,Sh(this,a))}minus(t){if(!this.isValid)return this;const a=Ze.fromDurationLike(t).negate();return _s(this,Sh(this,a))}startOf(t,{useLocaleWeeks:a=!1}={}){if(!this.isValid)return this;const o={},u=Ze.normalizeUnit(t);switch(u){case"years":o.month=1;case"quarters":case"months":o.day=1;case"weeks":case"days":o.hour=0;case"hours":o.minute=0;case"minutes":o.second=0;case"seconds":o.millisecond=0;break}if(u==="weeks")if(a){const f=this.loc.getStartOfWeek(),{weekday:g}=this;g<f&&(o.weekNumber=this.weekNumber-1),o.weekday=f}else o.weekday=1;if(u==="quarters"){const f=Math.ceil(this.month/3);o.month=(f-1)*3+1}return this.set(o)}endOf(t,a){return this.isValid?this.plus({[t]:1}).startOf(t,a).minus(1):this}toFormat(t,a={}){return this.isValid?Yt.create(this.loc.redefaultToEN(a)).formatDateTimeFromString(this,t):Uo}toLocaleString(t=Cn,a={}){return this.isValid?Yt.create(this.loc.clone(a),t).formatDateTime(this):Uo}toLocaleParts(t={}){return this.isValid?Yt.create(this.loc.clone(t),t).formatDateTimeParts(this):[]}toISO({format:t="extended",suppressSeconds:a=!1,suppressMilliseconds:o=!1,includeOffset:u=!0,extendedZone:f=!1}={}){if(!this.isValid)return null;const g=t==="extended";let y=qo(this,g);return y+="T",y+=Ah(this,g,a,o,u,f),y}toISODate({format:t="extended"}={}){return this.isValid?qo(this,t==="extended"):null}toISOWeekDate(){return Ur(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds:t=!1,suppressSeconds:a=!1,includeOffset:o=!0,includePrefix:u=!1,extendedZone:f=!1,format:g="extended"}={}){return this.isValid?(u?"T":"")+Ah(this,g==="extended",a,t,o,f):null}toRFC2822(){return Ur(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return Ur(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?qo(this,!0):null}toSQLTime({includeOffset:t=!0,includeZone:a=!1,includeOffsetSpace:o=!0}={}){let u="HH:mm:ss.SSS";return(a||t)&&(o&&(u+=" "),a?u+="z":t&&(u+="ZZ")),Ur(this,u,!0)}toSQL(t={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(t)}`:null}toString(){return this.isValid?this.toISO():Uo}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(t={}){if(!this.isValid)return{};const a={...this.c};return t.includeConfig&&(a.outputCalendar=this.outputCalendar,a.numberingSystem=this.loc.numberingSystem,a.locale=this.loc.locale),a}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(t,a="milliseconds",o={}){if(!this.isValid||!t.isValid)return Ze.invalid("created by diffing an invalid DateTime");const u={locale:this.locale,numberingSystem:this.numberingSystem,...o},f=wC(a).map(Ze.normalizeUnit),g=t.valueOf()>this.valueOf(),y=g?this:t,k=g?t:this,A=C1(y,k,f,u);return g?A.negate():A}diffNow(t="milliseconds",a={}){return this.diff(Be.now(),t,a)}until(t){return this.isValid?xt.fromDateTimes(this,t):this}hasSame(t,a,o){if(!this.isValid)return!1;const u=t.valueOf(),f=this.setZone(t.zone,{keepLocalTime:!0});return f.startOf(a,o)<=u&&u<=f.endOf(a,o)}equals(t){return this.isValid&&t.isValid&&this.valueOf()===t.valueOf()&&this.zone.equals(t.zone)&&this.loc.equals(t.loc)}toRelative(t={}){if(!this.isValid)return null;const a=t.base||Be.fromObject({},{zone:this.zone}),o=t.padding?this<a?-t.padding:t.padding:0;let u=["years","months","days","hours","minutes","seconds"],f=t.unit;return Array.isArray(t.unit)&&(u=t.unit,f=void 0),Mh(a,this.plus(o),{...t,numeric:"always",units:u,unit:f})}toRelativeCalendar(t={}){return this.isValid?Mh(t.base||Be.fromObject({},{zone:this.zone}),this,{...t,numeric:"auto",units:["years","months","days"],calendary:!0}):null}static min(...t){if(!t.every(Be.isDateTime))throw new zt("min requires all arguments be DateTimes");return fh(t,a=>a.valueOf(),Math.min)}static max(...t){if(!t.every(Be.isDateTime))throw new zt("max requires all arguments be DateTimes");return fh(t,a=>a.valueOf(),Math.max)}static fromFormatExplain(t,a,o={}){const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0});return Nm(g,t,a)}static fromStringExplain(t,a,o={}){return Be.fromFormatExplain(t,a,o)}static buildFormatParser(t,a={}){const{locale:o=null,numberingSystem:u=null}=a,f=ot.fromOpts({locale:o,numberingSystem:u,defaultToEN:!0});return new Om(f,t)}static fromFormatParser(t,a,o={}){if(Ye(t)||Ye(a))throw new zt("fromFormatParser requires an input string and a format parser");const{locale:u=null,numberingSystem:f=null}=o,g=ot.fromOpts({locale:u,numberingSystem:f,defaultToEN:!0});if(!g.equals(a.locale))throw new zt(`fromFormatParser called with a locale of ${g}, but the format parser was created for ${a.locale}`);const{result:y,zone:k,specificOffset:A,invalidReason:M}=a.explainFromTokens(t);return M?Be.invalid(M):aa(y,k,o,`format ${a.format}`,t,A)}static get DATE_SHORT(){return Cn}static get DATE_MED(){return Hp}static get DATE_MED_WITH_WEEKDAY(){return qA}static get DATE_FULL(){return Wp}static get DATE_HUGE(){return Yp}static get TIME_SIMPLE(){return Vp}static get TIME_WITH_SECONDS(){return Xp}static get TIME_WITH_SHORT_OFFSET(){return Up}static get TIME_WITH_LONG_OFFSET(){return jp}static get TIME_24_SIMPLE(){return Gp}static get TIME_24_WITH_SECONDS(){return qp}static get TIME_24_WITH_SHORT_OFFSET(){return $p}static get TIME_24_WITH_LONG_OFFSET(){return Kp}static get DATETIME_SHORT(){return Zp}static get DATETIME_SHORT_WITH_SECONDS(){return Jp}static get DATETIME_MED(){return Qp}static get DATETIME_MED_WITH_SECONDS(){return em}static get DATETIME_MED_WITH_WEEKDAY(){return $A}static get DATETIME_FULL(){return tm}static get DATETIME_FULL_WITH_SECONDS(){return im}static get DATETIME_HUGE(){return sm}static get DATETIME_HUGE_WITH_SECONDS(){return am}}function Ba(e){if(Be.isDateTime(e))return e;if(e&&e.valueOf&&bs(e.valueOf()))return Be.fromJSDate(e);if(e&&typeof e=="object")return Be.fromObject(e);throw new zt(`Unknown datetime argument: ${e}, of type ${typeof e}`)}/**
40
40
  * filesize
41
41
  *
42
42
  * @copyright 2024 Jason Mulligan <jason.mulligan@avoidwork.com>