From 8fabf77b2a7720a357c63817c07035a9908818a0 Mon Sep 17 00:00:00 2001
From: Gitea
Date: Wed, 10 Nov 2021 17:53:50 +0100
Subject: Update
---
Neutron-trunk/resources/.htaccess | 4 -
Neutron-trunk/resources/css/admin.css | 725 ----------
Neutron-trunk/resources/css/admin_v2/chromium.css | 8 -
Neutron-trunk/resources/css/admin_v2/iframe.css | 17 -
Neutron-trunk/resources/css/admin_v2/inner.css | 90 --
Neutron-trunk/resources/css/admin_v2/main.css | 23 -
.../resources/css/admin_v2/navigation.css | 131 --
Neutron-trunk/resources/css/admin_widgets.css | 62 -
Neutron-trunk/resources/css/ajax.css | 77 --
Neutron-trunk/resources/css/alerts.css | 116 --
Neutron-trunk/resources/css/codename.css | 5 -
Neutron-trunk/resources/css/error.css | 16 -
Neutron-trunk/resources/css/fonts-import.css | 36 -
Neutron-trunk/resources/css/main.css | 485 -------
Neutron-trunk/resources/css/polymer/content.css | 150 --
Neutron-trunk/resources/css/polymer/dark.css | 26 -
Neutron-trunk/resources/css/polymer/fonts.css | 103 --
Neutron-trunk/resources/css/polymer/gallery.css | 37 -
Neutron-trunk/resources/css/polymer/menubar.css | 44 -
Neutron-trunk/resources/css/polymer/responsive.css | 123 --
Neutron-trunk/resources/css/polymer/scrollbars.css | 24 -
Neutron-trunk/resources/css/polymer/warnings.css | 115 --
Neutron-trunk/resources/css/preview.css | 150 --
Neutron-trunk/resources/css/ready.css | 52 -
Neutron-trunk/resources/css/setup.css | 102 --
Neutron-trunk/resources/css/spotlight.css | 245 ----
Neutron-trunk/resources/css/themes/blue-auto.css | 3 -
Neutron-trunk/resources/css/themes/blue-dark.css | 13 -
Neutron-trunk/resources/css/themes/blue-light.css | 11 -
Neutron-trunk/resources/css/themes/brown-auto.css | 3 -
Neutron-trunk/resources/css/themes/brown-dark.css | 13 -
Neutron-trunk/resources/css/themes/brown-light.css | 11 -
Neutron-trunk/resources/css/themes/green-auto.css | 3 -
Neutron-trunk/resources/css/themes/green-dark.css | 13 -
Neutron-trunk/resources/css/themes/green-light.css | 11 -
Neutron-trunk/resources/css/themes/orange-auto.css | 3 -
Neutron-trunk/resources/css/themes/orange-dark.css | 13 -
.../resources/css/themes/orange-light.css | 11 -
Neutron-trunk/resources/css/themes/purple-auto.css | 3 -
Neutron-trunk/resources/css/themes/purple-dark.css | 13 -
.../resources/css/themes/purple-light.css | 11 -
Neutron-trunk/resources/css/themes/red-auto.css | 3 -
Neutron-trunk/resources/css/themes/red-dark.css | 13 -
Neutron-trunk/resources/css/themes/red-light.css | 11 -
Neutron-trunk/resources/css/themes/white-auto.css | 3 -
Neutron-trunk/resources/css/themes/white-dark.css | 13 -
Neutron-trunk/resources/css/themes/white-light.css | 11 -
Neutron-trunk/resources/css/ui.css | 166 ---
.../resources/fonts/body/Roboto-Black.ttf | Bin 171072 -> 0 bytes
.../resources/fonts/body/Roboto-BlackItalic.ttf | Bin 177120 -> 0 bytes
Neutron-trunk/resources/fonts/body/Roboto-Bold.ttf | Bin 170348 -> 0 bytes
.../resources/fonts/body/Roboto-BoldItalic.ttf | Bin 174520 -> 0 bytes
.../resources/fonts/body/Roboto-Italic.ttf | Bin 173516 -> 0 bytes
.../resources/fonts/body/Roboto-Light.ttf | Bin 170012 -> 0 bytes
.../resources/fonts/body/Roboto-LightItalic.ttf | Bin 176184 -> 0 bytes
.../resources/fonts/body/Roboto-Medium.ttf | Bin 171656 -> 0 bytes
.../resources/fonts/body/Roboto-MediumItalic.ttf | Bin 176428 -> 0 bytes
.../resources/fonts/body/Roboto-Regular.ttf | Bin 171272 -> 0 bytes
Neutron-trunk/resources/fonts/body/Roboto-Thin.ttf | Bin 171500 -> 0 bytes
.../resources/fonts/body/Roboto-ThinItalic.ttf | Bin 175872 -> 0 bytes
Neutron-trunk/resources/fonts/font-bold-italic.ttf | Bin 95504 -> 0 bytes
Neutron-trunk/resources/fonts/font-bold.ttf | Bin 92096 -> 0 bytes
Neutron-trunk/resources/fonts/font-italic.ttf | Bin 95744 -> 0 bytes
Neutron-trunk/resources/fonts/font-regular.ttf | Bin 109128 -> 0 bytes
Neutron-trunk/resources/i18n/en/$metadata.json | 7 -
Neutron-trunk/resources/i18n/en/admin-about.json | 71 -
.../resources/i18n/en/admin-advanced-dev.json | 7 -
.../resources/i18n/en/admin-advanced-home.json | 8 -
.../resources/i18n/en/admin-appearance.json | 35 -
.../resources/i18n/en/admin-calendar.json | 59 -
.../resources/i18n/en/admin-customization.json | 31 -
Neutron-trunk/resources/i18n/en/admin-errors.json | 14 -
Neutron-trunk/resources/i18n/en/admin-flags.json | 3 -
Neutron-trunk/resources/i18n/en/admin-gallery.json | 47 -
Neutron-trunk/resources/i18n/en/admin-home.json | 94 --
.../resources/i18n/en/admin-housekeeping.json | 24 -
Neutron-trunk/resources/i18n/en/admin-login.json | 12 -
Neutron-trunk/resources/i18n/en/admin-logs.json | 6 -
Neutron-trunk/resources/i18n/en/admin-pages.json | 42 -
Neutron-trunk/resources/i18n/en/admin-plugins.json | 18 -
Neutron-trunk/resources/i18n/en/admin-stats.json | 42 -
Neutron-trunk/resources/i18n/en/admin-titles.json | 151 ---
Neutron-trunk/resources/i18n/en/admin-v2.json | 77 --
Neutron-trunk/resources/i18n/en/api.json | 97 --
Neutron-trunk/resources/i18n/en/calendar.json | 12 -
Neutron-trunk/resources/i18n/en/editor.json | 7 -
Neutron-trunk/resources/i18n/en/error.json | 10 -
Neutron-trunk/resources/i18n/en/gallery.json | 23 -
Neutron-trunk/resources/i18n/en/header.json | 21 -
Neutron-trunk/resources/i18n/en/login.json | 17 -
Neutron-trunk/resources/i18n/en/menu.json | 10 -
Neutron-trunk/resources/i18n/en/setup.json | 84 --
Neutron-trunk/resources/i18n/en/sizes.json | 13 -
Neutron-trunk/resources/i18n/en/spotlight.json | 3 -
Neutron-trunk/resources/i18n/en/version.json | 27 -
Neutron-trunk/resources/i18n/en/viewer.json | 22 -
Neutron-trunk/resources/i18n/en/widgets.json | 51 -
Neutron-trunk/resources/i18n/fr/$metadata.json | 7 -
Neutron-trunk/resources/i18n/fr/admin-about.json | 71 -
.../resources/i18n/fr/admin-advanced-dev.json | 7 -
.../resources/i18n/fr/admin-advanced-home.json | 8 -
.../resources/i18n/fr/admin-appearance.json | 35 -
.../resources/i18n/fr/admin-calendar.json | 59 -
.../resources/i18n/fr/admin-customization.json | 31 -
Neutron-trunk/resources/i18n/fr/admin-errors.json | 14 -
Neutron-trunk/resources/i18n/fr/admin-flags.json | 3 -
Neutron-trunk/resources/i18n/fr/admin-gallery.json | 47 -
Neutron-trunk/resources/i18n/fr/admin-home.json | 94 --
.../resources/i18n/fr/admin-housekeeping.json | 24 -
Neutron-trunk/resources/i18n/fr/admin-login.json | 12 -
Neutron-trunk/resources/i18n/fr/admin-logs.json | 6 -
Neutron-trunk/resources/i18n/fr/admin-pages.json | 42 -
Neutron-trunk/resources/i18n/fr/admin-plugins.json | 18 -
Neutron-trunk/resources/i18n/fr/admin-stats.json | 42 -
Neutron-trunk/resources/i18n/fr/admin-titles.json | 151 ---
Neutron-trunk/resources/i18n/fr/admin-v2.json | 77 --
Neutron-trunk/resources/i18n/fr/api.json | 97 --
Neutron-trunk/resources/i18n/fr/calendar.json | 12 -
Neutron-trunk/resources/i18n/fr/editor.json | 7 -
Neutron-trunk/resources/i18n/fr/error.json | 10 -
Neutron-trunk/resources/i18n/fr/gallery.json | 23 -
Neutron-trunk/resources/i18n/fr/header.json | 21 -
Neutron-trunk/resources/i18n/fr/login.json | 17 -
Neutron-trunk/resources/i18n/fr/menu.json | 10 -
Neutron-trunk/resources/i18n/fr/setup.json | 84 --
Neutron-trunk/resources/i18n/fr/sizes.json | 13 -
Neutron-trunk/resources/i18n/fr/spotlight.json | 3 -
Neutron-trunk/resources/i18n/fr/version.json | 27 -
Neutron-trunk/resources/i18n/fr/viewer.json | 22 -
Neutron-trunk/resources/i18n/fr/widgets.json | 51 -
Neutron-trunk/resources/image/admin.svg | 1 -
Neutron-trunk/resources/image/admin2/about.png | Bin 2673 -> 0 bytes
Neutron-trunk/resources/image/admin2/accounts.png | Bin 7796 -> 0 bytes
Neutron-trunk/resources/image/admin2/advanced.png | Bin 2386 -> 0 bytes
Neutron-trunk/resources/image/admin2/audit.png | Bin 1665 -> 0 bytes
Neutron-trunk/resources/image/admin2/branding.png | Bin 1923 -> 0 bytes
Neutron-trunk/resources/image/admin2/calendar.png | Bin 1610 -> 0 bytes
Neutron-trunk/resources/image/admin2/cloud.png | Bin 4001 -> 0 bytes
Neutron-trunk/resources/image/admin2/colour.png | Bin 2180 -> 0 bytes
Neutron-trunk/resources/image/admin2/content.png | Bin 3876 -> 0 bytes
Neutron-trunk/resources/image/admin2/electrode.png | Bin 2492 -> 0 bytes
Neutron-trunk/resources/image/admin2/enter.png | Bin 565 -> 0 bytes
Neutron-trunk/resources/image/admin2/features.png | Bin 6451 -> 0 bytes
Neutron-trunk/resources/image/admin2/flag.png | Bin 963 -> 0 bytes
Neutron-trunk/resources/image/admin2/footer.png | Bin 1998 -> 0 bytes
Neutron-trunk/resources/image/admin2/gallery.png | Bin 2914 -> 0 bytes
Neutron-trunk/resources/image/admin2/home.png | Bin 1526 -> 0 bytes
Neutron-trunk/resources/image/admin2/install.png | Bin 1552 -> 0 bytes
Neutron-trunk/resources/image/admin2/language.png | Bin 3693 -> 0 bytes
Neutron-trunk/resources/image/admin2/locale.png | Bin 3212 -> 0 bytes
Neutron-trunk/resources/image/admin2/logoff.png | Bin 5021 -> 0 bytes
.../resources/image/admin2/maintenance.png | Bin 4622 -> 0 bytes
.../resources/image/admin2/minteck-admin.png | Bin 7047 -> 0 bytes
Neutron-trunk/resources/image/admin2/optional.png | Bin 1498 -> 0 bytes
Neutron-trunk/resources/image/admin2/pages.png | Bin 1149 -> 0 bytes
Neutron-trunk/resources/image/admin2/password.png | Bin 1721 -> 0 bytes
.../resources/image/admin2/personalization.png | Bin 3264 -> 0 bytes
Neutron-trunk/resources/image/admin2/reset.png | Bin 2197 -> 0 bytes
Neutron-trunk/resources/image/admin2/security.png | Bin 4832 -> 0 bytes
Neutron-trunk/resources/image/admin2/selected.png | Bin 631 -> 0 bytes
Neutron-trunk/resources/image/admin2/stats.png | Bin 3205 -> 0 bytes
Neutron-trunk/resources/image/admin2/system.png | Bin 4034 -> 0 bytes
Neutron-trunk/resources/image/close.svg | 1 -
Neutron-trunk/resources/image/codename.jpg | Bin 756250 -> 0 bytes
Neutron-trunk/resources/image/config.jpg | Bin 465655 -> 0 bytes
Neutron-trunk/resources/image/config_back.svg | 1 -
Neutron-trunk/resources/image/config_explore.svg | 1 -
.../resources/image/config_file_import.svg | 1 -
.../resources/image/config_file_replace.svg | 1 -
Neutron-trunk/resources/image/config_finish.svg | 1 -
Neutron-trunk/resources/image/config_next.svg | 1 -
Neutron-trunk/resources/image/config_restart.svg | 1 -
Neutron-trunk/resources/image/contact_address.svg | 1 -
Neutron-trunk/resources/image/contact_email.svg | 1 -
Neutron-trunk/resources/image/contact_phone.svg | 1 -
Neutron-trunk/resources/image/contact_priority.svg | 1 -
Neutron-trunk/resources/image/default.jpg | Bin 631115 -> 0 bytes
Neutron-trunk/resources/image/demos/color-blue.jpg | Bin 2053 -> 0 bytes
.../resources/image/demos/color-brown.jpg | Bin 2024 -> 0 bytes
.../resources/image/demos/color-green.jpg | Bin 2058 -> 0 bytes
.../resources/image/demos/color-orange.jpg | Bin 2095 -> 0 bytes
.../resources/image/demos/color-purple.jpg | Bin 2086 -> 0 bytes
Neutron-trunk/resources/image/demos/color-red.jpg | Bin 2089 -> 0 bytes
.../resources/image/demos/color-white.jpg | Bin 1598 -> 0 bytes
Neutron-trunk/resources/image/demos/theme-auto.jpg | Bin 54971 -> 0 bytes
Neutron-trunk/resources/image/demos/theme-dark.jpg | Bin 37186 -> 0 bytes
.../resources/image/demos/theme-light.jpg | Bin 40395 -> 0 bytes
Neutron-trunk/resources/image/display.svg | 1 -
Neutron-trunk/resources/image/error.jpg | Bin 565587 -> 0 bytes
Neutron-trunk/resources/image/ext-remove.svg | 1 -
Neutron-trunk/resources/image/ext-settings.svg | 1 -
Neutron-trunk/resources/image/ext-store.svg | 1 -
.../resources/image/gallery-zoom-minus.svg | 1 -
.../resources/image/gallery-zoom-plus.svg | 1 -
Neutron-trunk/resources/image/getimage.png | Bin 208 -> 0 bytes
Neutron-trunk/resources/image/loader.svg | 1 -
Neutron-trunk/resources/image/login.jpg | Bin 25666 -> 0 bytes
Neutron-trunk/resources/image/menu.svg | 1 -
Neutron-trunk/resources/image/message_error.svg | 1 -
Neutron-trunk/resources/image/message_info.svg | 1 -
Neutron-trunk/resources/image/message_warning.svg | 1 -
Neutron-trunk/resources/image/oobe.svg | 1434 --------------------
Neutron-trunk/resources/image/oobe/check.png | Bin 4620 -> 0 bytes
Neutron-trunk/resources/image/oobe/error.png | Bin 6877 -> 0 bytes
Neutron-trunk/resources/image/oobe/finish.png | Bin 6483 -> 0 bytes
Neutron-trunk/resources/image/oobe/icon.png | Bin 12170 -> 0 bytes
Neutron-trunk/resources/image/oobe/init.png | Bin 16120 -> 0 bytes
Neutron-trunk/resources/image/oobe/installing.png | Bin 12081 -> 0 bytes
Neutron-trunk/resources/image/oobe/language.png | Bin 8340 -> 0 bytes
Neutron-trunk/resources/image/oobe/name.png | Bin 4081 -> 0 bytes
Neutron-trunk/resources/image/oobe/ready.png | Bin 13400 -> 0 bytes
.../resources/image/oobe/software-license.png | Bin 16904 -> 0 bytes
Neutron-trunk/resources/image/oobe/welcome.png | Bin 20924 -> 0 bytes
Neutron-trunk/resources/image/ready.jpg | Bin 10820 -> 0 bytes
Neutron-trunk/resources/image/regedit/backup.png | Bin 1733 -> 0 bytes
Neutron-trunk/resources/image/regedit/data.png | Bin 1615 -> 0 bytes
Neutron-trunk/resources/image/regedit/folder.png | Bin 2418 -> 0 bytes
Neutron-trunk/resources/image/regedit/icon.png | Bin 2044 -> 0 bytes
Neutron-trunk/resources/image/regedit/image.png | Bin 2631 -> 0 bytes
Neutron-trunk/resources/image/regedit/json.png | Bin 1827 -> 0 bytes
Neutron-trunk/resources/image/regedit/keys.png | Bin 1912 -> 0 bytes
Neutron-trunk/resources/image/regedit/old/data.svg | 203 ---
.../resources/image/regedit/old/folder.svg | 24 -
Neutron-trunk/resources/image/regedit/old/icon.svg | 163 ---
.../resources/image/regedit/old/image.svg | 26 -
Neutron-trunk/resources/image/regedit/old/json.svg | 137 --
Neutron-trunk/resources/image/regedit/old/keys.svg | 24 -
Neutron-trunk/resources/image/regedit/old/page.svg | 26 -
.../resources/image/regedit/old/special.svg | 198 ---
.../resources/image/regedit/old/token.svg | 27 -
Neutron-trunk/resources/image/regedit/page.png | Bin 1724 -> 0 bytes
Neutron-trunk/resources/image/regedit/special.png | Bin 1699 -> 0 bytes
Neutron-trunk/resources/image/regedit/token.png | Bin 1864 -> 0 bytes
Neutron-trunk/resources/image/resetted.png | Bin 24787 -> 0 bytes
Neutron-trunk/resources/image/siteicon.png | Bin 3063 -> 0 bytes
Neutron-trunk/resources/image/storeloader.svg | 41 -
Neutron-trunk/resources/image/tools.svg | 1 -
Neutron-trunk/resources/js/admin_v2.js | 14 -
Neutron-trunk/resources/js/ckeditor5/ckeditor.js | 6 -
.../resources/js/ckeditor5/ckeditor.js.map | 1 -
.../resources/js/ckeditor5/translations/af.js | 1 -
.../resources/js/ckeditor5/translations/ar.js | 1 -
.../resources/js/ckeditor5/translations/ast.js | 1 -
.../resources/js/ckeditor5/translations/az.js | 1 -
.../resources/js/ckeditor5/translations/bg.js | 1 -
.../resources/js/ckeditor5/translations/ca.js | 1 -
.../resources/js/ckeditor5/translations/cs.js | 1 -
.../resources/js/ckeditor5/translations/da.js | 1 -
.../resources/js/ckeditor5/translations/de-ch.js | 1 -
.../resources/js/ckeditor5/translations/de.js | 1 -
.../resources/js/ckeditor5/translations/el.js | 1 -
.../resources/js/ckeditor5/translations/en-au.js | 1 -
.../resources/js/ckeditor5/translations/en-gb.js | 1 -
.../resources/js/ckeditor5/translations/eo.js | 1 -
.../resources/js/ckeditor5/translations/es.js | 1 -
.../resources/js/ckeditor5/translations/et.js | 1 -
.../resources/js/ckeditor5/translations/eu.js | 1 -
.../resources/js/ckeditor5/translations/fa.js | 1 -
.../resources/js/ckeditor5/translations/fi.js | 1 -
.../resources/js/ckeditor5/translations/fr.js | 1 -
.../resources/js/ckeditor5/translations/gl.js | 1 -
.../resources/js/ckeditor5/translations/gu.js | 1 -
.../resources/js/ckeditor5/translations/he.js | 1 -
.../resources/js/ckeditor5/translations/hr.js | 1 -
.../resources/js/ckeditor5/translations/hu.js | 1 -
.../resources/js/ckeditor5/translations/id.js | 1 -
.../resources/js/ckeditor5/translations/it.js | 1 -
.../resources/js/ckeditor5/translations/ja.js | 1 -
.../resources/js/ckeditor5/translations/km.js | 1 -
.../resources/js/ckeditor5/translations/kn.js | 1 -
.../resources/js/ckeditor5/translations/ko.js | 1 -
.../resources/js/ckeditor5/translations/ku.js | 1 -
.../resources/js/ckeditor5/translations/lt.js | 1 -
.../resources/js/ckeditor5/translations/lv.js | 1 -
.../resources/js/ckeditor5/translations/ms.js | 1 -
.../resources/js/ckeditor5/translations/nb.js | 1 -
.../resources/js/ckeditor5/translations/ne.js | 1 -
.../resources/js/ckeditor5/translations/nl.js | 1 -
.../resources/js/ckeditor5/translations/no.js | 1 -
.../resources/js/ckeditor5/translations/oc.js | 1 -
.../resources/js/ckeditor5/translations/pl.js | 1 -
.../resources/js/ckeditor5/translations/pt-br.js | 1 -
.../resources/js/ckeditor5/translations/pt.js | 1 -
.../resources/js/ckeditor5/translations/ro.js | 1 -
.../resources/js/ckeditor5/translations/ru.js | 1 -
.../resources/js/ckeditor5/translations/si.js | 1 -
.../resources/js/ckeditor5/translations/sk.js | 1 -
.../resources/js/ckeditor5/translations/sl.js | 1 -
.../resources/js/ckeditor5/translations/sq.js | 1 -
.../resources/js/ckeditor5/translations/sr-latn.js | 1 -
.../resources/js/ckeditor5/translations/sr.js | 1 -
.../resources/js/ckeditor5/translations/sv.js | 1 -
.../resources/js/ckeditor5/translations/th.js | 1 -
.../resources/js/ckeditor5/translations/tr.js | 1 -
.../resources/js/ckeditor5/translations/tt.js | 1 -
.../resources/js/ckeditor5/translations/ug.js | 1 -
.../resources/js/ckeditor5/translations/uk.js | 1 -
.../resources/js/ckeditor5/translations/vi.js | 1 -
.../resources/js/ckeditor5/translations/zh-cn.js | 1 -
.../resources/js/ckeditor5/translations/zh.js | 1 -
Neutron-trunk/resources/js/jquery.js | 2 -
Neutron-trunk/resources/js/setup-ui.js.php | 171 ---
Neutron-trunk/resources/js/spotlight.js | 239 ----
Neutron-trunk/resources/js/sticky.js | 17 -
Neutron-trunk/resources/lib/license.html | 694 ----------
Neutron-trunk/resources/lib/material/iconfont.css | 41 -
.../resources/lib/material/material-classic.woff2 | Bin 79448 -> 0 bytes
.../lib/material/material-components-web.min.css | 10 -
.../material/material-components-web.min.css.map | 1 -
.../lib/material/material-components-web.min.js | 1 -
.../resources/lib/material/material-outlined.woff2 | Bin 91208 -> 0 bytes
.../resources/lib/pushbar.js/library-info.json | 7 -
Neutron-trunk/resources/lib/pushbar.js/library.css | 74 -
Neutron-trunk/resources/lib/pushbar.js/library.js | 79 --
Neutron-trunk/resources/logo.png | Bin 4554 -> 0 bytes
Neutron-trunk/resources/logo.svg | 27 -
Neutron-trunk/resources/private/.htaccess | 1 -
Neutron-trunk/resources/private/CodeEditor$2.php | 39 -
Neutron-trunk/resources/private/CodeEditor$3.php | 39 -
Neutron-trunk/resources/private/CodeEditor.php | 44 -
Neutron-trunk/resources/private/VisualEditor$2.php | 410 ------
Neutron-trunk/resources/private/VisualEditor.php | 416 ------
Neutron-trunk/resources/private/debug.php | 190 ---
.../resources/private/global.js._/index.php | 95 --
Neutron-trunk/resources/private/header.php | 5 -
.../resources/private/headers/csettings-base.json | 8 -
.../resources/private/headers/documentbody.php | 12 -
.../resources/private/headers/documenthead.php | 139 --
.../resources/private/headers/preprocessor.php | 226 ---
Neutron-trunk/resources/private/license | 15 -
Neutron-trunk/resources/private/relative.php | 35 -
331 files changed, 11057 deletions(-)
delete mode 100644 Neutron-trunk/resources/.htaccess
delete mode 100644 Neutron-trunk/resources/css/admin.css
delete mode 100644 Neutron-trunk/resources/css/admin_v2/chromium.css
delete mode 100644 Neutron-trunk/resources/css/admin_v2/iframe.css
delete mode 100644 Neutron-trunk/resources/css/admin_v2/inner.css
delete mode 100644 Neutron-trunk/resources/css/admin_v2/main.css
delete mode 100644 Neutron-trunk/resources/css/admin_v2/navigation.css
delete mode 100644 Neutron-trunk/resources/css/admin_widgets.css
delete mode 100644 Neutron-trunk/resources/css/ajax.css
delete mode 100644 Neutron-trunk/resources/css/alerts.css
delete mode 100644 Neutron-trunk/resources/css/codename.css
delete mode 100644 Neutron-trunk/resources/css/error.css
delete mode 100644 Neutron-trunk/resources/css/fonts-import.css
delete mode 100644 Neutron-trunk/resources/css/main.css
delete mode 100644 Neutron-trunk/resources/css/polymer/content.css
delete mode 100644 Neutron-trunk/resources/css/polymer/dark.css
delete mode 100644 Neutron-trunk/resources/css/polymer/fonts.css
delete mode 100644 Neutron-trunk/resources/css/polymer/gallery.css
delete mode 100644 Neutron-trunk/resources/css/polymer/menubar.css
delete mode 100644 Neutron-trunk/resources/css/polymer/responsive.css
delete mode 100644 Neutron-trunk/resources/css/polymer/scrollbars.css
delete mode 100644 Neutron-trunk/resources/css/polymer/warnings.css
delete mode 100644 Neutron-trunk/resources/css/preview.css
delete mode 100644 Neutron-trunk/resources/css/ready.css
delete mode 100644 Neutron-trunk/resources/css/setup.css
delete mode 100644 Neutron-trunk/resources/css/spotlight.css
delete mode 100644 Neutron-trunk/resources/css/themes/blue-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/blue-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/blue-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/brown-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/brown-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/brown-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/green-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/green-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/green-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/orange-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/orange-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/orange-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/purple-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/purple-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/purple-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/red-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/red-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/red-light.css
delete mode 100644 Neutron-trunk/resources/css/themes/white-auto.css
delete mode 100644 Neutron-trunk/resources/css/themes/white-dark.css
delete mode 100644 Neutron-trunk/resources/css/themes/white-light.css
delete mode 100644 Neutron-trunk/resources/css/ui.css
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Black.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-BlackItalic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Bold.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-BoldItalic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Italic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Light.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-LightItalic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Medium.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-MediumItalic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Regular.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-Thin.ttf
delete mode 100644 Neutron-trunk/resources/fonts/body/Roboto-ThinItalic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/font-bold-italic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/font-bold.ttf
delete mode 100644 Neutron-trunk/resources/fonts/font-italic.ttf
delete mode 100644 Neutron-trunk/resources/fonts/font-regular.ttf
delete mode 100644 Neutron-trunk/resources/i18n/en/$metadata.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-about.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-advanced-dev.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-advanced-home.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-appearance.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-calendar.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-customization.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-errors.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-flags.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-gallery.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-home.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-housekeeping.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-login.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-logs.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-pages.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-plugins.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-stats.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-titles.json
delete mode 100644 Neutron-trunk/resources/i18n/en/admin-v2.json
delete mode 100644 Neutron-trunk/resources/i18n/en/api.json
delete mode 100644 Neutron-trunk/resources/i18n/en/calendar.json
delete mode 100644 Neutron-trunk/resources/i18n/en/editor.json
delete mode 100644 Neutron-trunk/resources/i18n/en/error.json
delete mode 100644 Neutron-trunk/resources/i18n/en/gallery.json
delete mode 100644 Neutron-trunk/resources/i18n/en/header.json
delete mode 100644 Neutron-trunk/resources/i18n/en/login.json
delete mode 100644 Neutron-trunk/resources/i18n/en/menu.json
delete mode 100644 Neutron-trunk/resources/i18n/en/setup.json
delete mode 100644 Neutron-trunk/resources/i18n/en/sizes.json
delete mode 100644 Neutron-trunk/resources/i18n/en/spotlight.json
delete mode 100644 Neutron-trunk/resources/i18n/en/version.json
delete mode 100644 Neutron-trunk/resources/i18n/en/viewer.json
delete mode 100644 Neutron-trunk/resources/i18n/en/widgets.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/$metadata.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-about.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-advanced-dev.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-advanced-home.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-appearance.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-calendar.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-customization.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-errors.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-flags.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-gallery.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-home.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-housekeeping.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-login.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-logs.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-pages.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-plugins.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-stats.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-titles.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/admin-v2.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/api.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/calendar.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/editor.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/error.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/gallery.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/header.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/login.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/menu.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/setup.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/sizes.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/spotlight.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/version.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/viewer.json
delete mode 100644 Neutron-trunk/resources/i18n/fr/widgets.json
delete mode 100644 Neutron-trunk/resources/image/admin.svg
delete mode 100644 Neutron-trunk/resources/image/admin2/about.png
delete mode 100644 Neutron-trunk/resources/image/admin2/accounts.png
delete mode 100644 Neutron-trunk/resources/image/admin2/advanced.png
delete mode 100644 Neutron-trunk/resources/image/admin2/audit.png
delete mode 100644 Neutron-trunk/resources/image/admin2/branding.png
delete mode 100644 Neutron-trunk/resources/image/admin2/calendar.png
delete mode 100644 Neutron-trunk/resources/image/admin2/cloud.png
delete mode 100644 Neutron-trunk/resources/image/admin2/colour.png
delete mode 100644 Neutron-trunk/resources/image/admin2/content.png
delete mode 100644 Neutron-trunk/resources/image/admin2/electrode.png
delete mode 100644 Neutron-trunk/resources/image/admin2/enter.png
delete mode 100644 Neutron-trunk/resources/image/admin2/features.png
delete mode 100644 Neutron-trunk/resources/image/admin2/flag.png
delete mode 100644 Neutron-trunk/resources/image/admin2/footer.png
delete mode 100644 Neutron-trunk/resources/image/admin2/gallery.png
delete mode 100644 Neutron-trunk/resources/image/admin2/home.png
delete mode 100644 Neutron-trunk/resources/image/admin2/install.png
delete mode 100644 Neutron-trunk/resources/image/admin2/language.png
delete mode 100644 Neutron-trunk/resources/image/admin2/locale.png
delete mode 100644 Neutron-trunk/resources/image/admin2/logoff.png
delete mode 100644 Neutron-trunk/resources/image/admin2/maintenance.png
delete mode 100644 Neutron-trunk/resources/image/admin2/minteck-admin.png
delete mode 100644 Neutron-trunk/resources/image/admin2/optional.png
delete mode 100644 Neutron-trunk/resources/image/admin2/pages.png
delete mode 100644 Neutron-trunk/resources/image/admin2/password.png
delete mode 100644 Neutron-trunk/resources/image/admin2/personalization.png
delete mode 100644 Neutron-trunk/resources/image/admin2/reset.png
delete mode 100644 Neutron-trunk/resources/image/admin2/security.png
delete mode 100644 Neutron-trunk/resources/image/admin2/selected.png
delete mode 100644 Neutron-trunk/resources/image/admin2/stats.png
delete mode 100644 Neutron-trunk/resources/image/admin2/system.png
delete mode 100644 Neutron-trunk/resources/image/close.svg
delete mode 100644 Neutron-trunk/resources/image/codename.jpg
delete mode 100644 Neutron-trunk/resources/image/config.jpg
delete mode 100644 Neutron-trunk/resources/image/config_back.svg
delete mode 100644 Neutron-trunk/resources/image/config_explore.svg
delete mode 100644 Neutron-trunk/resources/image/config_file_import.svg
delete mode 100644 Neutron-trunk/resources/image/config_file_replace.svg
delete mode 100644 Neutron-trunk/resources/image/config_finish.svg
delete mode 100644 Neutron-trunk/resources/image/config_next.svg
delete mode 100644 Neutron-trunk/resources/image/config_restart.svg
delete mode 100644 Neutron-trunk/resources/image/contact_address.svg
delete mode 100644 Neutron-trunk/resources/image/contact_email.svg
delete mode 100644 Neutron-trunk/resources/image/contact_phone.svg
delete mode 100644 Neutron-trunk/resources/image/contact_priority.svg
delete mode 100644 Neutron-trunk/resources/image/default.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-blue.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-brown.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-green.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-orange.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-purple.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-red.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/color-white.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/theme-auto.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/theme-dark.jpg
delete mode 100644 Neutron-trunk/resources/image/demos/theme-light.jpg
delete mode 100644 Neutron-trunk/resources/image/display.svg
delete mode 100644 Neutron-trunk/resources/image/error.jpg
delete mode 100644 Neutron-trunk/resources/image/ext-remove.svg
delete mode 100644 Neutron-trunk/resources/image/ext-settings.svg
delete mode 100644 Neutron-trunk/resources/image/ext-store.svg
delete mode 100644 Neutron-trunk/resources/image/gallery-zoom-minus.svg
delete mode 100644 Neutron-trunk/resources/image/gallery-zoom-plus.svg
delete mode 100644 Neutron-trunk/resources/image/getimage.png
delete mode 100644 Neutron-trunk/resources/image/loader.svg
delete mode 100644 Neutron-trunk/resources/image/login.jpg
delete mode 100644 Neutron-trunk/resources/image/menu.svg
delete mode 100644 Neutron-trunk/resources/image/message_error.svg
delete mode 100644 Neutron-trunk/resources/image/message_info.svg
delete mode 100644 Neutron-trunk/resources/image/message_warning.svg
delete mode 100644 Neutron-trunk/resources/image/oobe.svg
delete mode 100644 Neutron-trunk/resources/image/oobe/check.png
delete mode 100644 Neutron-trunk/resources/image/oobe/error.png
delete mode 100644 Neutron-trunk/resources/image/oobe/finish.png
delete mode 100644 Neutron-trunk/resources/image/oobe/icon.png
delete mode 100644 Neutron-trunk/resources/image/oobe/init.png
delete mode 100644 Neutron-trunk/resources/image/oobe/installing.png
delete mode 100644 Neutron-trunk/resources/image/oobe/language.png
delete mode 100644 Neutron-trunk/resources/image/oobe/name.png
delete mode 100644 Neutron-trunk/resources/image/oobe/ready.png
delete mode 100644 Neutron-trunk/resources/image/oobe/software-license.png
delete mode 100644 Neutron-trunk/resources/image/oobe/welcome.png
delete mode 100644 Neutron-trunk/resources/image/ready.jpg
delete mode 100644 Neutron-trunk/resources/image/regedit/backup.png
delete mode 100644 Neutron-trunk/resources/image/regedit/data.png
delete mode 100644 Neutron-trunk/resources/image/regedit/folder.png
delete mode 100644 Neutron-trunk/resources/image/regedit/icon.png
delete mode 100644 Neutron-trunk/resources/image/regedit/image.png
delete mode 100644 Neutron-trunk/resources/image/regedit/json.png
delete mode 100644 Neutron-trunk/resources/image/regedit/keys.png
delete mode 100644 Neutron-trunk/resources/image/regedit/old/data.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/folder.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/icon.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/image.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/json.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/keys.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/page.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/special.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/old/token.svg
delete mode 100644 Neutron-trunk/resources/image/regedit/page.png
delete mode 100644 Neutron-trunk/resources/image/regedit/special.png
delete mode 100644 Neutron-trunk/resources/image/regedit/token.png
delete mode 100644 Neutron-trunk/resources/image/resetted.png
delete mode 100644 Neutron-trunk/resources/image/siteicon.png
delete mode 100644 Neutron-trunk/resources/image/storeloader.svg
delete mode 100644 Neutron-trunk/resources/image/tools.svg
delete mode 100644 Neutron-trunk/resources/js/admin_v2.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/ckeditor.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/ckeditor.js.map
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/af.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ar.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ast.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/az.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/bg.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ca.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/cs.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/da.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/de-ch.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/de.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/el.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/en-au.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/en-gb.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/eo.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/es.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/et.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/eu.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/fa.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/fi.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/fr.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/gl.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/gu.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/he.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/hr.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/hu.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/id.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/it.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ja.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/km.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/kn.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ko.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ku.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/lt.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/lv.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ms.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/nb.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ne.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/nl.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/no.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/oc.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/pl.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/pt-br.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/pt.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ro.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ru.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/si.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sk.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sl.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sq.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sr-latn.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sr.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/sv.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/th.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/tr.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/tt.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/ug.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/uk.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/vi.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/zh-cn.js
delete mode 100644 Neutron-trunk/resources/js/ckeditor5/translations/zh.js
delete mode 100644 Neutron-trunk/resources/js/jquery.js
delete mode 100644 Neutron-trunk/resources/js/setup-ui.js.php
delete mode 100644 Neutron-trunk/resources/js/spotlight.js
delete mode 100644 Neutron-trunk/resources/js/sticky.js
delete mode 100644 Neutron-trunk/resources/lib/license.html
delete mode 100644 Neutron-trunk/resources/lib/material/iconfont.css
delete mode 100644 Neutron-trunk/resources/lib/material/material-classic.woff2
delete mode 100644 Neutron-trunk/resources/lib/material/material-components-web.min.css
delete mode 100644 Neutron-trunk/resources/lib/material/material-components-web.min.css.map
delete mode 100644 Neutron-trunk/resources/lib/material/material-components-web.min.js
delete mode 100644 Neutron-trunk/resources/lib/material/material-outlined.woff2
delete mode 100644 Neutron-trunk/resources/lib/pushbar.js/library-info.json
delete mode 100644 Neutron-trunk/resources/lib/pushbar.js/library.css
delete mode 100644 Neutron-trunk/resources/lib/pushbar.js/library.js
delete mode 100644 Neutron-trunk/resources/logo.png
delete mode 100644 Neutron-trunk/resources/logo.svg
delete mode 100644 Neutron-trunk/resources/private/.htaccess
delete mode 100644 Neutron-trunk/resources/private/CodeEditor$2.php
delete mode 100644 Neutron-trunk/resources/private/CodeEditor$3.php
delete mode 100644 Neutron-trunk/resources/private/CodeEditor.php
delete mode 100644 Neutron-trunk/resources/private/VisualEditor$2.php
delete mode 100644 Neutron-trunk/resources/private/VisualEditor.php
delete mode 100644 Neutron-trunk/resources/private/debug.php
delete mode 100644 Neutron-trunk/resources/private/global.js._/index.php
delete mode 100644 Neutron-trunk/resources/private/header.php
delete mode 100644 Neutron-trunk/resources/private/headers/csettings-base.json
delete mode 100644 Neutron-trunk/resources/private/headers/documentbody.php
delete mode 100644 Neutron-trunk/resources/private/headers/documenthead.php
delete mode 100644 Neutron-trunk/resources/private/headers/preprocessor.php
delete mode 100644 Neutron-trunk/resources/private/license
delete mode 100644 Neutron-trunk/resources/private/relative.php
(limited to 'Neutron-trunk/resources')
diff --git a/Neutron-trunk/resources/.htaccess b/Neutron-trunk/resources/.htaccess
deleted file mode 100644
index bc839cb..0000000
--- a/Neutron-trunk/resources/.htaccess
+++ /dev/null
@@ -1,4 +0,0 @@
-ErrorDocument 401 /cms-special/error/?id=401&description=Accès%20refusé
-ErrorDocument 403 /cms-special/error/?id=403&description=Accès%20interdit
-ErrorDocument 404 /cms-special/error/?id=404&description=Ressource%20introuvable
-ErrorDocument 500 /cms-special/error/?id=500&description=Erreur%20interne
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin.css b/Neutron-trunk/resources/css/admin.css
deleted file mode 100644
index 452fc9b..0000000
--- a/Neutron-trunk/resources/css/admin.css
+++ /dev/null
@@ -1,725 +0,0 @@
-@import "./admin_widgets.css";
-
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-@keyframes blink {
- 0% { opacity: 1; }
- 50% { opacity: 0; }
- 100% { opacity: 1; }
-}
-
-.blk1 {
- animation-name: blink;
- animation-duration: 2s;
- animation-delay: 0ms;
- animation-iteration-count: infinite;
-}
-
-.blk2 {
- animation-name: blink;
- animation-duration: 2s;
- animation-delay: 400ms;
- animation-iteration-count: infinite;
-}
-
-.blk3 {
- animation-name: blink;
- animation-duration: 2s;
- animation-delay: 800ms;
- animation-iteration-count: infinite;
-}
-
-.blk4 {
- animation-name: blink;
- animation-duration: 2s;
- animation-delay: 1200ms;
- animation-iteration-count: infinite;
-}
-
-.blk5 {
- animation-name: blink;
- animation-duration: 2s;
- animation-delay: 1600ms;
- animation-iteration-count: infinite;
-}
-
-.intro-element {
- width: 128px;
- height: 128px;
-}
-
-.intro {
- vertical-align: middle;
-}
-
-#error {
- background: rgb(123, 4, 4);
- text-align: center;
- margin: auto;
- padding: 10px;
- box-shadow: 1px 1px 2px rgb(123, 4, 4);
- color: white;
- width: 50%;
- text-align: center;
- margin-bottom: 10px;
- margin-top: 10px;
- border-radius: 10px;
-}
-
-body {
- margin: 0;
- padding: 0;
- overflow-x: hidden;
-}
-
-.setting {
- width: calc(100% - 20px);
- padding: 10px;
- cursor: pointer;
- background-color: transparent;
- transition: background-color 200ms;
- left: 0;
- position: relative;
- border-radius: 10px;
-}
-
-.setting:hover {
- background-color: rgb(180, 180, 180);
-}
-
-.setting:hover > table > tbody > tr > td > .setting-img {
- width: 36px;
- height: 36px;
- margin-right: 0;
- transition: width 200ms, height 200ms, margin-right 200ms;
-}
-
-.setting-img {
- width: 32px;
- height: 32px;
- vertical-align: middle;
- margin-right: 4px;
- transition: width 200ms, height 200ms, margin-right 200ms;
-}
-
-.setting-name {
- vertical-align: middle;
- margin-left: 10px;
-}
-
-#settings > a {
- color: black;
- text-decoration: none;
-}
-
-.place-bar {
- margin-left: 10px;
-}
-
-.sblink {
- color: black;
- text-decoration: none;
- cursor: pointer;
-}
-
-.sblink:hover {
- color: black;
- text-decoration-color: black;
- text-decoration-style: solid;
- text-decoration-line: underline;
-}
-
-.sblink:active {
- color: rgb(65, 65, 65);
- text-decoration-color: rgb(65, 65, 65);
- text-decoration-style: solid;
- text-decoration-line: underline;
-}
-
-.tip-red {
- color: rgb(255, 75, 75);
-}
-
-.tip-green {
- color: rgb(132, 255, 75);
-}
-
-.tip-orange {
- color: rgb(255, 132, 75);
-}
-
-.loader {
- width: 20%;
- height: 20%;
-}
-
-#pages-list {
- margin: 10px;
-}
-
-#pages-list > tbody > tr > td, #pages-list > tbody {
- border-width: 1px;
- border-style: solid;
- border-color: black;
- padding: 5px 10px;
-}
-
-.pages-list-header {
- font-weight: bold;
-}
-
-#codeeditor {
- width: 100%;
- height: 150px;
- font-family: 'Ubuntu Mono', 'Roboto Mono', 'Liberation Mono', 'Monospace', 'Courier New', 'Courier', 'Lucida Console', monospace;
- font-size: 12px;
-}
-
-.reset-option {
- border-color: black;
- border-width: 1px;
- border-style: solid;
- margin: 20px;
- padding: 10px;
- padding-bottom: 0px;
- max-width: 80%;
- cursor: pointer;
- background: transparent;
-}
-
-.widget {
- border-color: rgba(0, 0, 0, 0.5);
- border-width: 1px;
- border-style: solid;
- margin: 20px;
- padding: 10px;
- padding-bottom: 0px;
- max-width: 80%;
- background: transparent;
- border-radius: 10px;
-}
-
-.reset-option:hover {
- background: rgb(219, 219, 219);
-}
-
-.reset-option:active {
- background: rgb(177, 177, 177);
-}
-
-#resetbox-placeholder {
- position: fixed;
- width: 100%;
- height: 100%;
- left: 0;
- top: 0;
- background-color: rgba(0, 0, 0, .75)
-}
-
-#settings.blurred {
- filter: blur(5px);
-}
-
-#resetbox {
- width: 60% !important;
- border-radius: 10px;
- box-shadow: 1px 1px 10px rgb(235, 235, 235);
- padding: 20px;
- background-color: rgb(235, 235, 235);
-}
-
-.widget-header {
- margin: -10px;
- padding: 5px;
- background: rgba(209, 209, 209, 0.3);
- transition: background 200ms;
- border-top-left-radius: 10px;
- border-top-right-radius: 10px;
-}
-
-.widget-header.disabled {
- background: rgba(255, 115, 115, 0.3);
- transition: background 200ms;
-}
-
-.widget-header.enabled {
- background: rgba(155, 255, 115, 0.3);
- transition: background 200ms;
-}
-
-.chart--container {
- height: 450px;
- width: 100%;
- min-height: 150px;
-}
-
-#visits {
- overflow: hidden;
- position: relative;
- top: -80px;
- z-index: -1;
-}
-
-#afterchart {
- position: relative;
- top: -90px;
-}
-
-#logs {
- font-family: monospace !important;
- font-size: 16px;
- margin: 0px 20px;
- padding: 10px;
- background: #151515;
- border-radius: 5px;
- border-color: black;
- border-width: 2px;
- border-style: solid;
- color: white;
-}
-
-#protect {
- margin: 0px 20%;
- text-align: center;
- padding: 10px;
- background: rgb(224, 224, 224);
- border-radius: 5px;
-}
-
-#protect.s2 {
- background: rgba(135, 255, 135, .5);
-}
-
-#protect.s1 {
- background: rgba(255, 189, 135, .5);
-}
-
-#protect.s0 {
- background: rgba(255, 135, 135, .5);
-}
-
-#banner {
- padding: 40px 50px;
- background-position: center;
- background-size: 100%;
-}
-
-@media (min-width: 500px) {
- #store-info {
- display: block;
- margin: 30px 20%;
- border-radius: 20px;
- box-shadow: 1px 1px 12px gray;
- padding: 20px;
- }
-}
-
-@media (max-width: 500px) {
- .home-wrapper {
- grid-template-columns: 1fr !important;
- grid-column-gap: 0 !important;
- grid-row-gap: 0 !important;
- }
- .setting {
- border-radius: 0 !important;
- }
- #banner {
- padding: 20px 25px;
- }
- #banner-logo {
- width: 36px !important;
- height: 36px !important;
- }
- #loginnotice {
- display: none;
- }
-}
-
-@media (max-height: 380px) {
- #loginnotice {
- display: none;
- }
-}
-
-#banner-name {
- font-weight: lighter;
- font-size: 20px;
- color: white;
- margin-top: 15px;
-}
-
-.banner-black {
- color: black !important;
-}
-
-#banner-logo {
- width: 48px;
- height: 48px;
- vertical-align: middle;
- margin-right: 20px;
- border-radius: 999px;
- border-color: white;
- border-width: 2px;
- border-style: solid;
-}
-
-#adminb {
- text-align: center;
- color: white;
-}
-
-.setting-info {
- position: absolute;
- height: 0px;
- width: 100%;
- opacity: 0;
- display: inline-block;
- transition: position 200ms, height 200ms, width 200ms, opacity 200ms;
- text-align: center;
-}
-
-.setting:hover > span.setting-info {
- position: initial;
- height: auto;
- opacity: 1;
-}
-
-#navigation {
- padding: 8px;
- background: #bbb;
- border-bottom-style: solid;
- border-bottom-color: gray;
- border-bottom-width: 1px;
-}
-
-.step {
- font-size: 24px;
- vertical-align: middle;
- font-weight: bold;
- margin-right: 7.5px;
-}
-
-.storelist {
- border-width: 1px;
- border-color: gray;
- border-style: solid;
- margin: 0;
-}
-
-.store-info-details-sep {
- color: lightgray;
-}
-
-.store-info-details-el {
- border-radius: 999px;
- padding: 20px 10px;
- background: rgb(0, 162, 255);
- color: white;
-}
-
-#store-info-details {
- margin: 30px 0;
-}
-
-#store-info-summary, #store-info-permissions {
- text-align: left;
-}
-
-#store-info-summary-title, #store-info-permissions-title {
- color: rgb(0, 162, 255);
- vertical-align: middle;
-}
-
-#store-info-summary-icon, #store-info-permissions-icon {
- vertical-align: middle;
- width: 20px;
- height: 20px;
- fill: rgb(0, 162, 255);
-}
-
-#store-info-verified {
- color: rgb(0, 162, 255);
-}
-
-#store-info-verified-icon {
- vertical-align: middle;
- width: 18px;
- height: 18px;
- fill: rgb(0, 162, 255);
- margin-left: 10px;
-}
-
-.specialperm {
- color: rgb(180, 117, 0);
-}
-
-.criticalperm {
- color: rgb(180, 0, 0);
-}
-
-#store-install {
- background-color: rgb(0, 162, 255);
- color: white;
- padding: 10px 20px;
- border-radius: 5px;
- transition: box-shadow 200ms;
- cursor: pointer;
- text-decoration: none;
-}
-
-#store-install:hover {
- box-shadow: rgb(127, 208, 255) 1px 1px 5px;
-}
-
-#store-more {
- text-decoration: none;
- background-color: white;
- color: rgb(0, 162, 255);
- padding: 10px 20px;
- border-radius: 5px;
- border-width: 1px;
- border-style: solid;
- border-color: rgb(0, 162, 255);
- transition: box-shadow 200ms;
- cursor: pointer;
-}
-
-#store-more:hover {
- box-shadow: rgb(127, 208, 255) 1px 1px 5px;
-}
-
-#editor *, .ace_editor * {
- font: 11px/normal 'Console' ,'Cousine' ,'Monaco' ,'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important;
- direction: ltr !important;
- text-align: left !important;
- font-weight: 400 !important;
- letter-spacing: 0 !important;
- word-spacing: 0px !important;
-}
-
-.ace_editor, .ace_text-input, .ace_editor div {
- font-size: 11px !important;
- font: 11px/normal 'Georgia' ,'Console' ,'Cousine' ,'Monaco' ,'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace !important;
- font-variant-ligatures: none !important;
- font-weight: 400 !important;
- letter-spacing: 0 !important;
- word-spacing: 0px !important;
-}
-
-#editor {
- height: 200px;
- border: #cacaca solid 1px;
-}
-
-html {
- word-spacing: 1px;
- -ms-text-size-adjust: 100%;
- -webkit-text-size-adjust: 100%;
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
-}
-
-.message_img {
- width: 36px;
- height: 36px;
-}
-
-.message_warning {
- background: rgba(255, 255, 116, 0.31);
- margin: 10px;
- border-radius: 10px;
- padding: 5px 10px;
- z-index: -2;
-}
-
-.message_info {
- background: rgba(116, 227, 255, 0.31);
- margin: 10px;
- border-radius: 10px;
- padding: 5px 10px;
- z-index: -2;
-}
-
-.message_error {
- background: rgba(255, 117, 117, 0.31);
- margin: 10px;
- border-radius: 10px;
- padding: 5px 10px;
- z-index: -2;
-}
-
-.message_warning > tbody > tr > td {
- width: 36px;
-}
-
-.indication {
- cursor: help;
- text-decoration-style: dotted;
- text-decoration-color: inherit;
- text-decoration-line: underline;
- color: inherit;
-}
-
-#stats {
- padding: 5px;
- margin: 10px;
- border-radius: 10px;
- background: rgba(6, 6, 6, 0.2);
- padding-bottom: 20px;
-}
-
-.info-sep {
- opacity: .8;
- font-size: 10px;
-}
-
-.home-wrapper {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-column-gap: 20px;
- grid-row-gap: 20px;
-}
-
-.home-wrapper a {
- text-decoration: none;
- color: inherit;
-}
-
-.configure_ext, .store_ext, .remove_ext {
- float: right;
- position: relative;
- height: 24px;
- cursor: pointer;
- transition: rotate 200ms, opacity 200ms;
-}
-
-.configure_ext:hover {
- rotate: 90deg;
- opacity: .75;
-}
-
-.store_ext:hover {
- rotate: 360deg;
- opacity: .75;
-}
-
-.remove_ext:hover {
- rotate: 180deg;
- opacity: .75;
-}
-
-.widget-header-info {
- width: 100%;
-}
-
-#main-content {
- overflow-x: hidden;
-}
-
-.clink {
- color: black;
- text-decoration: underline;
-}
-
-.clink:hover {
- text-decoration: none;
-}
-
-.clink:active, .clink:focus {
- opacity: .75;
-}
-
-#onlyold {
- background-color: rgba(255, 166, 0, 0.5);
- border-radius: 10px;
- display: inline-block;
- padding: 5px;
-}
-
-.oldopts {
- transition: background-color 200ms, border-radius 200ms, padding 200ms;
- display: inline-block;
-}
-
-.lggrid {
- display: grid;
- grid-template-columns: 25% 1fr;
- height: 100%;
-}
-
-.lggrid-inner-p1 {
- background: black;
-}
-
-#login #main-content, #login #admin {
- padding: 0;
- border-radius: 0;
- width: 100%;
- height: 100%;
-}
-
-#login, #login * {
- overflow: hidden !important;
-}
-
-#login .inner {
- text-align: center;
-}
-
-#login .content {
- background-image: url("/resources/image/login.jpg");
- background-position: center;
- background-size: cover;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 10;
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: center;
-}
-
-.mdc-card--selected {
- border-color: var(--mdc-theme-primary);
- opacity: .75;
-}
-
-.mdc-card--selected .mdc-card__primary-action {
- cursor: default;
-}
-
-.hidden {
- display: none !important;
- visibility: hidden !important;
- top: 0 !important;
- bottom: 0 !important;
- left: 0 !important;
- right: 0 !important;
- position: fixed !important;
-}
-
-#logs {
- background: #15151573;
- border-radius: 2px;
- border-color: #00000038;
-}
-
-.mdc-card {
- border-color: #e0e0e014;
- background-color: rgba(44, 44, 44, .58);
-}
-
-.reset-option {
- border-color: #00000038;
- border-radius: 5px;
- background: #0000004a;
-}
-
-.reset-option:hover {
- background: rgba(0, 0, 0, 0.56);
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_v2/chromium.css b/Neutron-trunk/resources/css/admin_v2/chromium.css
deleted file mode 100644
index 95a694e..0000000
--- a/Neutron-trunk/resources/css/admin_v2/chromium.css
+++ /dev/null
@@ -1,8 +0,0 @@
-main {
- background-color: rgba(17, 17, 17, .65);
- backdrop-filter: blur(10px);
-}
-
-.bg {
- background-image: url("../../../resources/image/codename.jpg");
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_v2/iframe.css b/Neutron-trunk/resources/css/admin_v2/iframe.css
deleted file mode 100644
index de31677..0000000
--- a/Neutron-trunk/resources/css/admin_v2/iframe.css
+++ /dev/null
@@ -1,17 +0,0 @@
-#main-iframe {
- border: none;
-}
-
-#main-content {
- position: fixed;
- margin: 50px 70px;
- left: 300px;
- top: 0;
- bottom: 0;
- right: 80px;
-}
-
-#main-title {
- font-size: 30px;
- font-weight: bold;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_v2/inner.css b/Neutron-trunk/resources/css/admin_v2/inner.css
deleted file mode 100644
index 7fad334..0000000
--- a/Neutron-trunk/resources/css/admin_v2/inner.css
+++ /dev/null
@@ -1,90 +0,0 @@
-body {
- margin: 30px 0 0;
-}
-
-#system-head {
- display: grid;
- grid-template-columns: 160px 1fr;
- margin-bottom: 30px;
-}
-
-#system-head-banner {
- background: #000;
- width: 150px;
- height: 80px;
- padding: 5px;
- border-radius: 10px;
-}
-
-#system-head-banner-image {
- background-image: var(--mpcms-banner);
- width: 100%;
- height: 100%;
- background-size: cover;
- background-position: center;
-}
-
-#system-head-version {
- display: flex;
- align-items: center;
- margin-left: 20px;
-}
-
-.inner-item {
- background-color: rgba(0, 0, 0, .5);
- border-radius: 10px;
- padding: 10px 20px;
- margin-bottom: 10px;
- display: grid;
- cursor: default;
- grid-template-columns: 32px 1fr 32px;
-}
-
-.inner-item:hover {
- background-color: rgba(0, 0, 0, .75);
-}
-
-.inner-item:active, .inner-item:focus {
- background-color: rgba(0, 0, 0, 1);
-}
-
-.inner-item-image-outer {
- vertical-align: middle;
- display: flex;
- align-items: center;
- width: 32px;
-}
-
-.inner-item-image {
- vertical-align: middle;
- filter: invert(1);
- width: 32px;
-}
-
-.inner-item-enter-outer {
- vertical-align: middle;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- width: 32px;
-}
-
-.inner-item-enter {
- text-align: center;
- vertical-align: middle;
- filter: invert(1);
- width: 24px;
-}
-
-.inner-item-text {
- margin-left: 15px;
- display: flex;
- margin-top: 5px;
- margin-bottom: 5px;
- align-items: center;
-}
-
-.inner-item-description {
- opacity: .5;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_v2/main.css b/Neutron-trunk/resources/css/admin_v2/main.css
deleted file mode 100644
index de75268..0000000
--- a/Neutron-trunk/resources/css/admin_v2/main.css
+++ /dev/null
@@ -1,23 +0,0 @@
-main {
- position: fixed;
- inset: 0;
- z-index: 10;
- background: #111
-}
-
-.bg {
- position: fixed;
- inset: 0;
- z-index: 2;
-}
-
-aside {
- height: 100%;
- width: 300px;
- display: inline-block;
-}
-
-* {
- color: white;
- font-family: "Noto Sans", "Segoe UI", "CMS", sans-serif;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_v2/navigation.css b/Neutron-trunk/resources/css/admin_v2/navigation.css
deleted file mode 100644
index e45e54f..0000000
--- a/Neutron-trunk/resources/css/admin_v2/navigation.css
+++ /dev/null
@@ -1,131 +0,0 @@
-#nav-header {
- display: grid;
- grid-template-columns: 64px 1fr;
- margin: 30px 20px;
- cursor: default;
-}
-
-#nav-header-icon {
- background: rgba(17, 17, 17, .5);
- width: 64px;
- height: 64px;
- border-radius: 999px;
-}
-
-#nav-header-names-outer {
- margin-left: 15px;
- display: flex;
- align-items: center;
-}
-
-.nav-item-icon {
- vertical-align: middle;
- width: 24px;
- margin-left: 10px;
-}
-
-.nav-item-name {
- vertical-align: middle;
- margin-left: 5px;
-}
-
-.nav-item {
- padding: 7px 0;
- border-left: 3px solid transparent;
- border-radius: 5px;
- margin-left: 5px;
- cursor: default;
-}
-
-.nav-item.selected {
- background: rgba(200, 200, 200, .25);
- border-left: 3px solid var(--codename-light);
-}
-
-.nav-item:not(.selected):hover {
- background: rgba(200, 200, 200, .1);
-}
-
-.nav-item:not(.selected):focus, .nav-item:not(.selected):active {
- background: rgba(200, 200, 200, .25);
-}
-
-.main-title-home {
- top: -6px;
- filter: invert(1);
- width: 24px;
- display: inline-block;
- left: 2px;
- position: relative;
-}
-
-.main-title-home-outer {
- display: none;
- height: 28px;
- display: inline-block;
- padding: 2px;
- width: 28px;
- position: relative;
- top: 8px;
- border-radius: 5px;
-}
-
-.main-title-home-outer:hover {
- background: rgba(0, 0, 0, .5);
-}
-
-.main-title-home-outer:active, .main-title-home-outer:focus {
- background: rgba(0, 0, 0, .75);
-}
-
-#nav-header {
- border-radius: 5px;
- margin: 20px 20px;
- text-decoration: none;
- padding: 10px 10px;
- cursor: default;
-}
-
-#nav-header:focus, #nav-header:active {
- background: rgba(200, 200, 200, .25) !important;
-}
-
-#nav-header:hover {
- background: rgba(200, 200, 200, .1);
-}
-
-@media (max-width: 700px) {
- #nav-header-names-outer {
- display: none !important;
- }
-
- aside {
- width: 64px !important;
- }
-
- .nav-item-name {
- display: none !important;
- }
-
- .nav-item {
- width: 45px !important;
- }
-
- #main-content {
- left: 64px !important;
- top: 0 !important;
- bottom: 0 !important;
- right: 0 !important;
- margin: 30px 20px !important;
- }
-
- #nav-header-icon {
- width: 32px !important;
- height: 32px !important;
- }
-
- #nav-header {
- grid-template-columns: 32px 1fr !important;
- margin: 5px 5px !important;
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/admin_widgets.css b/Neutron-trunk/resources/css/admin_widgets.css
deleted file mode 100644
index 17b5719..0000000
--- a/Neutron-trunk/resources/css/admin_widgets.css
+++ /dev/null
@@ -1,62 +0,0 @@
-.switch {
- position: relative;
- display: inline-block;
- width: 30px;
- height: 17px;
- vertical-align: middle;
- }
-
- .switch input {
- opacity: 0;
- width: 0;
- height: 0;
- vertical-align: middle;
- }
-
- .slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: #ccc;
- -webkit-transition: .2s;
- transition: .2s;
- vertical-align: middle;
- }
-
- .slider:before {
- position: absolute;
- content: "";
- height: 13px;
- width: 13px;
- left: 2px;
- bottom: 2px;
- background-color: white;
- -webkit-transition: .2s;
- transition: .2s;
- }
-
- input:checked + .slider {
- background-color: #2196F3;
- }
-
- input:focus + .slider {
- box-shadow: 0 0 1px #2196F3;
- }
-
- input:checked + .slider:before {
- -webkit-transform: translateX(13px);
- -ms-transform: translateX(13px);
- transform: translateX(13px);
- }
-
- /* Rounded sliders */
- .slider.round {
- border-radius: 34px;
- }
-
- .slider.round:before {
- border-radius: 50%;
- }
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/ajax.css b/Neutron-trunk/resources/css/ajax.css
deleted file mode 100644
index 1546df1..0000000
--- a/Neutron-trunk/resources/css/ajax.css
+++ /dev/null
@@ -1,77 +0,0 @@
-@import "./codename.css";
-
-html, body {
- height: 100%;
- width: 100%;
- margin: 0;
- overflow: hidden;
-}
-
-iframe {
- height: 100%;
- width: 100%;
-}
-
-#loader {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, .5);
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.spinner {
- animation: rotator 1.4s linear infinite;
-}
-
-@keyframes rotator {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(270deg);
- }
-}
-
-.path {
- stroke-dasharray: 187;
- stroke-dashoffset: 0;
- transform-origin: center;
- animation: dash 1.4s ease-in-out infinite, colors 5.6s ease-in-out infinite;
-}
-
-@keyframes colors {
- 0% {
- stroke: var(--codename-theme);
- }
- 25% {
- stroke: var(--codename-secondary);
- }
- 50% {
- stroke: var(--codename-light);
- }
- 75% {
- stroke: var(--codename-theme);
- }
- 100% {
- stroke: var(--codename-secondary);
- }
-}
-
-@keyframes dash {
- 0% {
- stroke-dashoffset: 187;
- }
- 50% {
- stroke-dashoffset: 46.75;
- transform: rotate(135deg);
- }
- 100% {
- stroke-dashoffset: 187;
- transform: rotate(450deg);
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/alerts.css b/Neutron-trunk/resources/css/alerts.css
deleted file mode 100644
index 12dc0fd..0000000
--- a/Neutron-trunk/resources/css/alerts.css
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Toast message */
-#snackbar {
- visibility: hidden;
- min-width: 250px;
- background-color: #333;
- color: #fff;
- text-align: center;
- padding: 16px;
- position: fixed;
- z-index: 99999999999999999999;
- left: 0;
- bottom: 0;
- width: 100%;
- width: calc(100% - 32px);
-}
-
-#snackbar.snackbar_show {
- visibility: visible;
- -webkit-animation: fadein 0.5s, fadeout 0.5s 4.5s;
- animation: fadein 0.5s, fadeout 0.5s 4.5s;
-}
-
-@-webkit-keyframes fadein {
- from {bottom: -30px; opacity: 0;}
- to {bottom: 0px; opacity: 1;}
-}
-
-@keyframes fadein {
- from {bottom: -30px; opacity: 0;}
- to {bottom: 0px; opacity: 1;}
-}
-
-@-webkit-keyframes fadeout {
- from {bottom: 0px; opacity: 1;}
- to {bottom: -30px; opacity: 0;}
-}
-
-@keyframes fadeout {
- from {bottom: 0px; opacity: 1;}
- to {bottom: -30px; opacity: 0;}
-}
-
-/* Legacy dialogs */
-pjse-placeholder {
- z-index: 99999999999999999999;
- display: block;
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, .5);
- filter: blur(0);
-}
-
-pjse-window {
- margin: 0;
- position: absolute;
- top: 50%;
- -ms-transform: translateY(-50%);
- transform: translateY(-50%);
- text-align: center;
- width: 100%;
- display: block;
-}
-
-pjse-window-inner {
- background: white;
- color: black;
- padding: 10px 15px;
- border-radius: 10px;
- display: inline-block;
- text-align: left;
- padding-bottom: 20px;
- box-shadow: 1px 1px 12px black;
-}
-
-pjse-title {
- color: black;
- display: block;
- margin: 10px 0px;
- font-size: 16px;
- font-weight: bold;
-}
-
-pjse-message {
- color: black;
-}
-
-pjse-close {
- display: block;
- text-align: right;
-}
-
-pjse-close > span {
- text-align: right;
- color: #0bc7e8;
- font-weight: bold;
- padding: 10px;
- border-radius: 5px;
- background: transparent;
- transition: background 200ms;
- cursor: pointer;
-}
-
-pjse-close > span:hover {
- background: #0be1e83b;
-}
-
-pjse-close > span:active {
- background: #0bb4e862;
-}
-
-.pjse-blurry {
- filter: blur(5px);
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/codename.css b/Neutron-trunk/resources/css/codename.css
deleted file mode 100644
index 5d28175..0000000
--- a/Neutron-trunk/resources/css/codename.css
+++ /dev/null
@@ -1,5 +0,0 @@
-:root {
- --codename-theme: #32818b;
- --codename-secondary: #0e4a52;
- --codename-light: #a2e2e8;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/error.css b/Neutron-trunk/resources/css/error.css
deleted file mode 100644
index 19cabbc..0000000
--- a/Neutron-trunk/resources/css/error.css
+++ /dev/null
@@ -1,16 +0,0 @@
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-body {
- background-image: url("../image/error.jpg");
- background-size: 100%;
- background-repeat: no-repeat;
- background-position: initial;
- overflow: hidden;
-}
-
-.discover {
- color: black;
- max-width: 40%;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/fonts-import.css b/Neutron-trunk/resources/css/fonts-import.css
deleted file mode 100644
index ca69eac..0000000
--- a/Neutron-trunk/resources/css/fonts-import.css
+++ /dev/null
@@ -1,36 +0,0 @@
-@font-face {
- font-family: CMS;
- src: url('../fonts/font-regular.ttf');
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: CMS;
- src: url('../fonts/font-italic.ttf');
- font-weight: normal;
- font-style: italic;
-}
-
-@font-face {
- font-family: CMS;
- src: url('../fonts/font-bold.ttf');
- font-weight: bold;
- font-style: normal;
-}
-
-@font-face {
- font-family: CMS;
- src: url('../fonts/font-bold-italic.ttf');
- font-weight: bold;
- font-style: italic;
-}
-
-.centered {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- text-align: center;
- width: 100%;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/main.css b/Neutron-trunk/resources/css/main.css
deleted file mode 100644
index e6047b6..0000000
--- a/Neutron-trunk/resources/css/main.css
+++ /dev/null
@@ -1,485 +0,0 @@
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-html {
- height: 100%;
-}
-
-body {
- margin: 0;
- height: auto;
-}
-
-#siteadmin {
- background: black;
- color: white;
- padding: 4px 32px;
- font-size: 10px;
- height: 12px;
-}
-
-#siteadmin-button {
- float: right;
- cursor: pointer;
- background: transparent;
- transition: background 100ms;
- margin: -4px;
- padding: 4px;
- padding-bottom: 0;
- color: white;
- text-decoration: none;
-}
-
-#siteadmin-button:hover {
- background: rgb(41, 41, 41);
-}
-
-.sab {
- cursor: pointer;
- background: transparent;
- transition: background 100ms;
- margin: -4px;
- padding: 4px;
- padding-bottom: 3px;
- color: white;
- text-decoration: none;
-}
-
-.sab:hover {
- background: rgb(41, 41, 41);
-}
-
-#siteadmin-img {
- filter: invert(100%);
- width: 16px;
- height: 16px;
- vertical-align: middle;
-}
-
-#banner {
- padding: 40px 50px;
- background-position: center;
- background-size: cover;
- padding-top: 60px;
-}
-
-#banner-menu {
- padding: 20px 50px;
- background-position: center;
- background-size: cover;
-}
-
-@media (max-width: 500px) {
- .branding-mobile {
- display: initial;
- }
- .branding-desktop {
- display: none;
- }
- #banner {
- padding: 20px 25px;
- padding-top: 81px;
- }
- .menubar-link-text {
- display: none;
- }
- #banner-logo {
- width: 36px !important;
- height: 36px !important;
- }
-}
-
-@media (min-width: 500px) {
- .branding-mobile {
- display: none;
- }
- .branding-desktop {
- display: initial;
- }
-}
-
-#banner-name {
- font-weight: lighter;
- font-size: 20px;
- color: white;
- margin-top: 15px;
-}
-
-#banner-menu-name {
- font-weight: lighter;
- font-size: 14px;
- color: white;
- margin-top: 15px;
-}
-
-.banner-black {
- color: black !important;
-}
-
-#banner-logo {
- width: 48px;
- height: 48px;
- vertical-align: middle;
- margin-right: 20px;
- border-radius: 999px;
- border-color: white;
- border-width: 2px;
- border-style: solid;
-}
-
-#banner-menu-logo {
- width: 24px;
- height: 24px;
- vertical-align: middle;
- margin-right: 20px;
- border-radius: 999px;
- border-color: white;
- border-width: 2px;
- border-style: solid;
-}
-
-#always-on-top {
- position: fixed;
- width: 100%;
-}
-
-#menubar {
- padding: 10px 20px;
- background: rgb(66, 66, 66);
- box-shadow: 1px 10px 12px rgba(0, 0, 0, .5);
-}
-
-.menubar-link {
- color: white;
- text-decoration: none;
- cursor: pointer;
-}
-
-.menubar-img {
- filter: invert(100%);
- vertical-align: middle;
- padding-right: 5px;
- width: 20px;
- height: 20px;
-}
-
-#menubar-link-tools {
- float: right;
-}
-
-#menubar-close {
- filter: invert(100%);
- top: 0;
- position: fixed;
- cursor: pointer;
- right: 0;
- padding: 5px;
-}
-
-#sidebar-close {
- top: 0;
- position: fixed;
- cursor: pointer;
- left: 0;
- padding: 5px;
-}
-
-#sidebar-title {
- top: 7.5px;
- position: fixed;
- right: 30%;
- font-weight: bold;
-}
-
-#sidebar-separator {
- margin-top: 7.5px;
- border-bottom-color: black;
- border-bottom-width: 1px;
- border-bottom-style: solid;
- position: fixed;
- top: 25px;
- width: 100%;
-}
-
-#sidebar-widgets {
- top: 32px;
- position: relative;
-}
-
-.menu-link {
- text-align: center;
- display: block;
- width: 100%;
- padding: 5px;
- color: black;
-}
-
-.menu-link:hover {
- color: rgb(77, 77, 77);
-}
-
-.pushbar {
- overflow-x: hidden;
-}
-
-#page-content {
- padding: 8px;
- background: white;
-}
-
-#page-content h1 {
- border-bottom-style: solid;
- border-bottom-width: 1px;
- border-bottom-color: #a4a4a4;
-}
-
-#page-content h2 {
- border-bottom-style: solid;
- border-bottom-width: 1px;
- border-bottom-color: #a4a4a4;
-}
-
-#page-placeholder, body {
- background: rgb(66, 66, 66);
-}
-
-#page-footer {
- color: white;
- padding: 20px;
-}
-
-#widget-space {
- border-bottom-color: rgb(179, 179, 179);
- border-bottom-style: solid;
- border-bottom-width: 1px;
- padding: 10px;
-}
-
-#widget-space h1, #widget-space h2, #widget-space h3, #widget-space h4, #widget-space h5, #widget-space h6 {
- margin-top: 0;
-}
-
-#galery_thumbnails {
- margin: 0% 15%;
-}
-
-.photo {
- width: 30%;
- margin: 10px;
- background: #c8c8c8;
- padding: 15px 5px;
- box-shadow: #c8c8c8 1px 1px 12px;
- display: inline-block;
- border-radius: 7.5px;
- border: #716f6f 1px solid;
-}
-
-.photo_image {
- cursor: pointer;
- border-width: 1px;
- border-style: solid;
- border-color: black;
- width: 90%;
- filter: blur(5px);
- transition: filter 200ms;
- border-radius: 5px;
-}
-
-.photo_image.loaded {
- filter: none !important;
-}
-
-@media (max-width: 500px) {
- .menubar-mobile {
- display: initial;
- }
- .menulink-desktop {
- display: none;
- }
- .menubar-desktop {
- display: none;
- }
-}
-
-@media (min-width: 500px) {
- .menubar-mobile {
- display: none;
- }
- .menulink-desktop {
- display: initial;
- }
- .menubar-desktop {
- display: initial;
- }
-}
-
-.menulink-desktop {
- color: white;
- padding: 10px 20px;
- cursor: pointer;
- margin: -10px 0;
- transition: background 200ms;
- text-decoration: none;
-}
-
-.menulink-desktop:hover {
- background: #626262;
-}
-
-.menulink-desktop:active {
- background: #1d1d1d;
-}
-
-.pushbar_overlay {
- background: #2f2f2f;
-}
-
-[data-pushbar-id].opened {
- box-shadow: 1px 1px 12px gray;
- z-index: 999999999 !important;
- margin-top: 20px;
-}
-
-.menubar-link {
- margin: -10px;
- padding: 10px;
- padding-bottom: 8px;
- transition: background 200ms;
-}
-
-.menubar-link:hover {
- background: #626262;
-}
-
-.menubar-link:active {
- background: #1d1d1d;
-}
-
-.message_img {
- width: 36px;
- height: 36px;
- z-index: -1;
-}
-
-.message_info {
- background: rgba(116, 227, 255, 0.31);
- margin: 10px;
- border-radius: 10px;
- padding: 5px 10px;
- z-index: -2;
-}
-
-.message_error {
- background: rgba(255, 117, 117, 0.31);
- margin: 10px;
- border-radius: 10px;
- padding: 5px 10px;
- z-index: -2;
- color: white;
-}
-
-blockquote {
- margin-left: 0;
- margin-right: 0;
- border-left: 5px solid #ccc;
- padding: 0px 1.5em;
- font-style: italic;
-}
-
-blockquote p {
- margin: 0;
- padding: 16px 0px;
-}
-
-a:not([class]), a[class=""] {
- color: inherit;
-}
-
-a:not([class]):hover, a[class=""]:hover {
- text-decoration: none;
-}
-
-a:not([class]):not([id]):active, a[class=""][id=""]:active {
- text-decoration: none;
- opacity: 75%;
-}
-
-.photo_label {
- color: black;
- padding: 10px 0;
- display: block;
- margin-bottom: -15px;
-}
-
-.sticky {
- position: fixed;
- top: 20px;
- width: 97%;
-}
-
-/* Add some top padding to the page content to prevent sudden quick movement (as the header gets a new position at the top of the page (position:fixed and top:0) */
-.sticky ~ #page-placeholder {
- padding-top: 39px;
- /* padding-top: 191px; */
-}
-
-#always-on-top, #menubar {
- z-index: 99999999;
-}
-
-@media (min-width: 700px) {
- #sidebar {
- height: calc(100% - 152px) !important;
- position: absolute;
- right: 0;
- background: rgb(66, 66, 66);
- top: 152px;
- overflow-y: hidden;
- width: 256px !important;
- max-width: initial !important;
- transform: initial !important;
- color: white !important;
- }
- #menubar {
- z-index: initial;
- }
- #sidebar-widgets {
- top: initial !important;
- padding-top: 30px;
- display: block;
- }
- #sidebar-separator, #sidebar-title, #sidebar-close {
- opacity: 0;
- cursor: default;
- }
- #menubar-link-tools {
- display: none;
- }
- #page-placeholder {
- margin-right: 256px;
- }
-}
-
-.hint {
- text-decoration: dotted underline;
- cursor: help;
-}
-
-#sidebar-widgets img {
- filter: invert(100%);
-}
-
-.image.image_resized > img {
- width:100%;
-}
-
-.noeffects {
- filter: none !important;
-}
-
-figure.image.image_resized {
- text-align: center;
- margin-left: auto;
- margin-right: auto;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/content.css b/Neutron-trunk/resources/css/polymer/content.css
deleted file mode 100644
index 7bdc471..0000000
--- a/Neutron-trunk/resources/css/polymer/content.css
+++ /dev/null
@@ -1,150 +0,0 @@
-#page-elements {
- display: grid;
- grid-template-columns: 1fr 256px;
- column-gap: 38px;
- margin-top: -96px;
-}
-
-.mdc-drawer-app-content {
- padding-top: 56px;
-}
-
-body {
- background-color: var(--mdc-theme-background);
-}
-
-#page-elements #page-content-inner, #page-elements #page-content-widgets-desktop, #page-elements #page-content-widgets-mobile {
- background: whitesmoke;
- padding: 15px 25px;
- border-radius: 8px;
- box-shadow: #80808042 0px 1px 10px;
-}
-
-#page-elements #page-content-inner {
- margin-left: 38px;
-}
-
-#page-elements #page-content-widgets-desktop {
- margin-right: 38px;
-}
-
-#page-content-colorbar {
- background: linear-gradient(to bottom, var(--mdc-theme-primary) 0%, var(--mdc-theme-primary) 50%,transparent 50.999%,transparent 100%);
- border-top-left-radius: 8px;
- border-top-right-radius: 8px;
- height: 28px;
- margin-top: -15px;
- margin-left: -25px;
- margin-right: -25px;
- display: block;
-}
-
-#page-footer-colorbar {
- background: linear-gradient(to top, var(--mdc-theme-primary) 0%, var(--mdc-theme-primary) 50%,transparent 50.999%,transparent 100%);
- height: 28px;
- display: block;
- margin-top: 20px;
- transform: rotate(180deg);
- box-shadow: 0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);
-}
-
-#page-banner {
- background-image: linear-gradient(to bottom, transparent 70%, var(--mdc-theme-background)), var(--mpcms-banner);
- background-position: center;
- background-size: cover;
- height: calc(20vw + 64px);
-}
-
-.widgets-header {
- margin-top: 5px;
- margin-bottom: 5px;
- color: gray;
- letter-spacing: .0892857143em;
- letter-spacing: var(--mdc-typography-button-letter-spacing, 0.0892857143em);
- text-transform: uppercase;
- text-transform: var(--mdc-typography-button-text-transform, uppercase);
-}
-
-#page-elements a {
- color: black;
- text-decoration: underline;
- opacity: 1;
- transition: opacity 200ms;
-}
-
-#page-footer-content a, #page-footer-links a {
- color: white;
- text-decoration: underline;
- opacity: 1;
- transition: opacity 200ms;
-}
-
-#page-elements a:hover, #page-footer-content a:hover, #page-footer-links a:hover {
- opacity: .75;
-}
-
-#page-elements a:active, #page-footer-content a:active, #page-footer-links a:active {
- opacity: .5;
-}
-
-html, body {
- width: 100%;
- height: 100%;
- overflow-x: hidden;
-}
-
-figure img {
- width: 100%;
-}
-
-figure.image.image_resized {
- text-align: center;
- margin-left: auto;
- margin-right: auto;
-}
-
-#page-footer {
- margin-top: -15px;
- background: var(--cms-extra-superdark, #0f0024);
- z-index: 99;
- position: relative;
- color: white;
- padding: 25px 50px;
-}
-
-#page-footer-title-top-button, #page-footer-title-settings-button {
- color: white;
-}
-
-#page-footer-title-settings-button-inner {
- border: 1px white solid;
- border-radius: 999px;
-}
-
-#page-footer-title {
- display: grid;
- grid-template-columns: 1fr 100px;
-}
-
-#page-footer-title-inner {
- display: flex;
- align-items: center;
- font-size: 22px;
-}
-
-#page-footer-links {
- font-size: 12px;
- margin-top: 15px;
-}
-
-#page-footer-title-inner {
- max-width: 256px;
- width: 256px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
-}
-
-h1 {
- font-size: 32px;
-}
diff --git a/Neutron-trunk/resources/css/polymer/dark.css b/Neutron-trunk/resources/css/polymer/dark.css
deleted file mode 100644
index de1f9a7..0000000
--- a/Neutron-trunk/resources/css/polymer/dark.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.widget_cuc {
- filter: invert(100%);
-}
-
-#page-banner {
- background-image: linear-gradient(to bottom, rgba(0, 0, 0, .5) 70%, var(--mdc-theme-background)), var(--mpcms-banner) !important;
-}
-
-#page-elements #page-content-inner, #page-elements #page-content-widgets-desktop, #page-elements #page-content-widgets-mobile {
- background: #171717 !important;
- box-shadow: #1a1a1a42 0px 1px 10px !important;
- color: white !important;
-}
-
-#page-elements a {
- color: whitesmoke !important;
-}
-
-[data-pushbar-id] {
- background: #1e1e1e !important;
- color: white !important;
-}
-
-.mdc-list-item:not(.mdc-list-item--activated), .mdc-list-item:not(.mdc-list-item--activated) .material-icons-outlined {
- color: white !important;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/fonts.css b/Neutron-trunk/resources/css/polymer/fonts.css
deleted file mode 100644
index 98057ed..0000000
--- a/Neutron-trunk/resources/css/polymer/fonts.css
+++ /dev/null
@@ -1,103 +0,0 @@
-@font-face {
- font-family: "Google Sans";
- src: url('../../fonts/font-regular.ttf');
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Google Sans";
- src: url('../../fonts/font-italic.ttf');
- font-weight: normal;
- font-style: italic;
-}
-
-@font-face {
- font-family: "Google Sans";
- src: url('../../fonts/font-bold.ttf');
- font-weight: bold;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Google Sans";
- src: url('../../fonts/font-bold-italic.ttf');
- font-weight: bold;
- font-style: italic;
-}
-
-@font-face {
- font-family: "Roboto";
- src: url('../../fonts/body/Roboto-Regular.ttf');
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Roboto";
- src: url('../../fonts/body/Roboto-Italic.ttf');
- font-weight: normal;
- font-style: italic;
-}
-
-@font-face {
- font-family: "Roboto";
- src: url('../../fonts/body/Roboto-Bold.ttf');
- font-weight: bold;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Roboto";
- src: url('../../fonts/body/Roboto-BoldItalic.ttf');
- font-weight: bold;
- font-style: italic;
-}
-
-.centered {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- text-align: center;
- width: 100%;
-}
-
-center { /* Polyfill in case HTML5 drops the support */
- text-align: center;
-}
-
-* {
- font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', "Noto Sans", Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif
-}
-
-h1, h2, h3, h4, h5, h6, .title, #snackbar, pjse-title {
- font-family: "Google Sans", Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', "Noto Sans", Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
- font-weight: 400;
-}
-
-.hide {
- display: none;
-}
-
-html, body {
- margin: 0;
-}
-
-.menubutton {
- font-variant: normal;
- color: white;
- letter-spacing: 0;
- text-transform: none;
-}
-
-#menuitems {
- vertical-align: middle;
- display: flex;
- align-content: center;
-}
-
-.menuitem {
- width: max-content;
- font-size: inherit;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/gallery.css b/Neutron-trunk/resources/css/polymer/gallery.css
deleted file mode 100644
index d4dccac..0000000
--- a/Neutron-trunk/resources/css/polymer/gallery.css
+++ /dev/null
@@ -1,37 +0,0 @@
-#galery_thumbnails {
- margin: 0% 15%;
-}
-
-.photo_image {
- filter: blur(5px);
- width: 40%;
- max-width: 480px;
- border-radius: 10px;
-}
-
-.photo_image.loaded {
- filter: none !important;
-}
-
-.photo a {
- opacity: 1 !important;
-}
-
-.photo {
- background: #2d2d2d;
- display: inline;
- border-radius: 10px;
-}
-
-.photo a:hover {
- transition: filter 200ms;
- filter: none !important;
-}
-
-.photo a:hover img {
- filter: brightness(125%) !important;
-}
-
-.photo a:active img, .photo a:focus img {
- filter: brightness(150%) !important;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/menubar.css b/Neutron-trunk/resources/css/polymer/menubar.css
deleted file mode 100644
index ba291fa..0000000
--- a/Neutron-trunk/resources/css/polymer/menubar.css
+++ /dev/null
@@ -1,44 +0,0 @@
-.mdc-top-app-bar, .mdc-top-app-bar__row, .mdc-top-app-bar__section--align-start {
- height: 56px;
-}
-
-.mdc-top-app-bar__section--align-start {
- padding-top: 0;
- padding-bottom: 0;
-}
-
-.mdc-top-app-bar {
- background-color: rgb(8, 8, 8);
- box-shadow: 0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);
-}
-
-#menubar-logo {
- border-radius: 999px;
- position: relative;
- width: 36px;
- height: 36px;
- background-color: rgb(46, 46, 46);
- background-image: url("../../upload/siteicon.png");
- background-size: 100%;
-}
-
-#menubar-home-link {
- display: inherit;
- color: inherit;
- text-decoration: inherit;
- cursor: pointer;
-}
-
-.mdc-top-app-bar__title {
- max-width: 256px;
-}
-
-.menubutton {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-#menuitems {
- justify-content: right;
-}
diff --git a/Neutron-trunk/resources/css/polymer/responsive.css b/Neutron-trunk/resources/css/polymer/responsive.css
deleted file mode 100644
index 2c4535b..0000000
--- a/Neutron-trunk/resources/css/polymer/responsive.css
+++ /dev/null
@@ -1,123 +0,0 @@
-@media (min-width: 500px) {
- .rsp-mobileonly {
- display: none;
- }
-}
-
-@media (max-width: 500px) {
- .rsp-desktoponly {
- display: none;
- }
-}
-
-.mdc-drawer .mdc-list-item--activated, .mdc-drawer .mdc-list-item--activated * {
- color: var(--mdc-theme-primary) !important;
-}
-
-#menuitems .mdc-button .menubutton {
- max-width: 124px;
-}
-
-@media (max-width: 1070px) {
- #menuitems .mdc-button:nth-child(8) {
- display: none;
- }
-}
-
-@media (max-width: 986px) {
- #menuitems .mdc-button:nth-child(7) {
- display: none;
- }
-}
-
-@media (max-width: 915px) {
- #menuitems .mdc-button:nth-child(6) {
- display: none;
- }
-}
-
-@media (max-width: 874px) {
- #menuitems .mdc-button:nth-child(5) {
- display: none;
- }
-}
-
-@media (max-width: 832px) {
- #menuitems .mdc-button:nth-child(4) {
- display: none;
- }
-}
-
-@media (max-width: 748px) {
- #menuitems .mdc-button:nth-child(3) {
- display: none;
- }
-}
-
-@media (max-width: 674px) {
- #menuitems .mdc-button:nth-child(2) {
- display: none;
- }
-}
-
-@media (max-width: 566px) {
- #menuitems .mdc-button:nth-child(1) {
- display: none;
- }
-}
-
-@media (max-width: 860px) {
- .rsp-widgetbar {
- display: initial;
- }
-
- #page-elements #page-content-widgets-desktop {
- display: none;
- }
-
- #page-elements #page-content-widgets-mobile {
- border-radius: 0 !important;
- margin: 0 !important;
- }
-
- #page-elements {
- grid-template-columns: 1fr;
- }
-
- #page-elements #page-content-inner {
- margin: 0;
- border-radius: 0
- }
-
- #page-content-colorbar {
- border-radius: 0;
- }
-
- #footer-container {
- margin-top: -20px;
- }
-
- #page-footer {
- padding: 15px 25px;
- }
-
- #page-banner {
- height: 75px;
- }
-
- #page-content-colorbar {
- margin-top: 0;
- }
-}
-
-@media (min-width: 860px) {
- .rsp-simplifiedonly {
- display: none;
- }
-}
-
-@media (max-width: 400px) {
- #page-footer-title-inner {
- display: none;
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/scrollbars.css b/Neutron-trunk/resources/css/polymer/scrollbars.css
deleted file mode 100644
index 522cfd5..0000000
--- a/Neutron-trunk/resources/css/polymer/scrollbars.css
+++ /dev/null
@@ -1,24 +0,0 @@
-::-webkit-scrollbar {
- width: 10px;
-}
-
-/* Track */
-::-webkit-scrollbar-track {
- background-color: rgba(0, 0, 0, .25);
-}
-
-/* Handle */
-::-webkit-scrollbar-thumb {
- background-color: rgba(0, 0, 0, 0.5);
- border-radius: 999px;
-}
-
-/* Handle on hover */
-::-webkit-scrollbar-thumb:hover {
- background-color: rgba(0, 0, 0, 0.7);
-}
-
-/* Handle on hold */
-::-webkit-scrollbar-thumb:active {
- background-color: rgb(0, 0, 0) !important;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/polymer/warnings.css b/Neutron-trunk/resources/css/polymer/warnings.css
deleted file mode 100644
index 05b25b6..0000000
--- a/Neutron-trunk/resources/css/polymer/warnings.css
+++ /dev/null
@@ -1,115 +0,0 @@
-#snackbar {
- visibility: hidden;
- min-width: 250px;
- background-color: #333;
- color: #fff;
- text-align: center;
- padding: 16px;
- position: fixed;
- z-index: 99999999999999999999;
- left: 0;
- bottom: 0;
- width: 100%;
- width: calc(100% - 32px);
-}
-
-#snackbar.snackbar_show {
- visibility: visible;
- -webkit-animation: fadein 0.5s, fadeout 0.5s 4.5s;
- animation: fadein 0.5s, fadeout 0.5s 4.5s;
-}
-
-@-webkit-keyframes fadein {
- from {bottom: -30px; opacity: 0;}
- to {bottom: 0px; opacity: 1;}
-}
-
-@keyframes fadein {
- from {bottom: -30px; opacity: 0;}
- to {bottom: 0px; opacity: 1;}
-}
-
-@-webkit-keyframes fadeout {
- from {bottom: 0px; opacity: 1;}
- to {bottom: -30px; opacity: 0;}
-}
-
-@keyframes fadeout {
- from {bottom: 0px; opacity: 1;}
- to {bottom: -30px; opacity: 0;}
-}
-
-/* Legacy dialogs */
-pjse-placeholder {
- z-index: 99999999999999999999;
- display: block;
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, .5);
- filter: blur(0);
-}
-
-pjse-window {
- margin: 0;
- position: absolute;
- top: 50%;
- -ms-transform: translateY(-50%);
- transform: translateY(-50%);
- text-align: center;
- width: 100%;
- display: block;
-}
-
-pjse-window-inner {
- background: white;
- color: black;
- padding: 10px 15px;
- border-radius: 10px;
- display: inline-block;
- text-align: left;
- padding-bottom: 20px;
- box-shadow: 1px 1px 12px black;
-}
-
-pjse-title {
- color: black;
- display: block;
- margin: 10px 0px;
- font-size: 16px;
- font-weight: bold;
-}
-
-pjse-message {
- color: black;
-}
-
-pjse-close {
- display: block;
- text-align: right;
-}
-
-pjse-close > span {
- text-align: right;
- color: #0bc7e8;
- font-weight: bold;
- padding: 10px;
- border-radius: 5px;
- background: transparent;
- transition: background 200ms;
- cursor: pointer;
-}
-
-pjse-close > span:hover {
- background: #0be1e83b;
-}
-
-pjse-close > span:active {
- background: #0bb4e862;
-}
-
-.pjse-blurry {
- filter: blur(5px);
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/preview.css b/Neutron-trunk/resources/css/preview.css
deleted file mode 100644
index 91ab1aa..0000000
--- a/Neutron-trunk/resources/css/preview.css
+++ /dev/null
@@ -1,150 +0,0 @@
-@import "./fonts-import.css";
-
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-.icon {
- filter: invert(100%);
- top: 5px;
- left: 5px;
- margin: 5px;
- width: 36px;
- cursor: pointer;
-}
-
-.loaded {
- filter: none !important;
-}
-
-.ppreview {
- filter: blur(10px);
- transition: filter 200ms;
-}
-
-.download, .zoom {
- position: fixed;
- bottom: 10px;
- background: rgb(51, 51, 51);
- padding: 5px 10px;
- left: 10px;
- border-radius: 999px;
- opacity: .25;
- cursor: pointer;
- transition: opacity 200ms;
- color: initial;
- text-decoration: none;
- color: white;
- padding-left: 29px;
- background-image: url("../image/getimage.png");
- background-size: 24px;
- background-repeat: no-repeat;
- background-position-x: 5px;
- background-position-y: 2.5px;
-}
-
-.download {
- left: 90px !important;
-}
-
-.zoomin {
- background-image: url("../image/gallery-zoom-plus.svg");
- height: 24px;
- width: 24px;
- background-size: 24px;
- filter: invert(100%);
- display: inline-block;
- opacity: .5;
- transition: opacity 200ms;
- box-shadow: none !important;
- background-position: center;
-}
-
-.zoomout {
- background-image: url("../image/gallery-zoom-minus.svg");
- height: 24px;
- width: 24px;
- background-size: 24px;
- filter: invert(100%);
- display: inline-block;
- opacity: .5;
- transition: opacity 200ms;
- box-shadow: none !important;
- background-position: center;
-}
-
-.image, .container {
- cursor: move;
-}
-
-.zoom {
- display: flex;
- align-items: center;
- padding-top: 0;
- background: rgba(51, 51, 51, 1);
- padding-bottom: 0;
- padding-left: 10px;
- height: 29px;
- width: 48px;
- background-image: none;
-}
-
-.zoom:hover {
- opacity: 1;
- box-shadow: 1px 1px 2px rgb(51, 51, 51);
-}
-
-.download:hover, .zoomin:hover, .zoomout:hover {
- opacity: .75;
- box-shadow: 1px 1px 2px rgb(51, 51, 51);
-}
-
-.download:active, .zoomin:active, .zoomout:active {
- opacity: 1;
- box-shadow: 1px 1px 2px rgb(51, 51, 51);
-}
-
-.image {
- height: 100%;
- -webkit-user-drag: none;
- -khtml-user-drag: none;
- -moz-user-drag: none;
- -o-user-drag: none;
- cursor: move;
- pointer-events: none;
-}
-
-.container {
- height: 100%;
- text-align: center;
-}
-
-input[type=checkbox] {
- display: none;
-}
-
-body, * {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.close {
- position: fixed;
- top: 0;
- opacity: 1;
- transition: opacity 200ms;
-}
-
-.close:hover {
- position: fixed;
- top: 0;
- opacity: .75;
-}
-
-.close:active, .close:focus {
- opacity: .5;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/ready.css b/Neutron-trunk/resources/css/ready.css
deleted file mode 100644
index df489ba..0000000
--- a/Neutron-trunk/resources/css/ready.css
+++ /dev/null
@@ -1,52 +0,0 @@
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-body {
- background-image: url("../image/oobe.jpg");
- background-size: 100%;
- background-repeat: no-repeat;
- background-position: initial;
-}
-
-.discover {
- max-width: 40%;
-}
-
-a img {
- vertical-align: middle;
- padding-right: 5px;
-}
-
-a {
- padding: 10px;
- border-radius: 5px;
- border-style: solid;
- border-color: black;
- border-width: 1px;
- text-decoration: none;
- color: black;
- transition: border-color 200ms, color 200ms;
-}
-
-a:hover {
- border-color: rgb(43, 43, 43);
- color: rgb(43, 43, 43);
-}
-
-a:active {
- border-color: rgb(77, 77, 77);
- color: rgb(77, 77, 77);
-}
-
-hr {
- width: 64px;
- border-color: black;
- border-style: solid;
- border-width: 1px;
- border-bottom: none;
-}
-
-a:hover > img {
- filter: opacity(75%);
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/setup.css b/Neutron-trunk/resources/css/setup.css
deleted file mode 100644
index bc63787..0000000
--- a/Neutron-trunk/resources/css/setup.css
+++ /dev/null
@@ -1,102 +0,0 @@
-* {
- font-family: CMS, Arial, Calibri, Ubuntu, Roboto, Liberation Sans, Helvetica, sans-serif;
-}
-
-body {
- background-image: url("../../resources/image/config.jpg") !important;
- background-size: 100%;
- background-repeat: no-repeat;
- background-position: initial;
-}
-
-.box {
- width: 60% !important;
- border-radius: 5px;
- box-shadow: 1px 1px 2px gray;
- padding: 20px;
- background-color: rgb(235, 235, 235);
-}
-
-h1, h2, h3, h4, h5, h6 {
- font-weight: normal;
-}
-
-.loader {
- width: 56px;
- height: 56px;
- filter: brightness(0%);
-}
-
-.tip-red {
- color: rgb(255, 75, 75);
-}
-
-.tip-green {
- color: rgb(132, 255, 75);
-}
-
-.tip-orange {
- color: rgb(255, 132, 75);
-}
-
-.termsbox {
- background: white;
- border: none;
- border-color: black;
- border-style: solid;
- border-width: 1px;
- border-radius: 5px;
- padding: 5px;
- box-shadow: 1px 1px 2px black;
-}
-
-@keyframes blink {
- 0% { opacity: 1; }
- 50% { opacity: 0; }
- 100% { opacity: 1; }
-}
-
-.finisher {
- width: 256px;
- height: 256px;
- filter: brightness(0%);
-}
-
-.update-cancel {
- padding: 5px 10px;
- border: 1px solid lightgray;
- border-radius: 5px;
- border-bottom-width: 2px;
- background: white;
- cursor: pointer;
- transition: background 200ms, border-color 200ms;
-}
-
-.update-cancel:hover {
- background: lightgray;
- border-color: gray;
-}
-
-.update-cancel:active {
- background: gray;
- border-color: black;
-}
-
-.box {
- display: block;
- box-shadow: none;
- backdrop-filter: blur(10px);
- background: rgba(0, 0, 0, .5);
- color: white;
-}
-
-.loader, .finisher {
- filter: none;
-}
-
-.termsbox {
- background: rgba(0, 0, 0, .5);
- border: none;
- border-radius: 5px;
- box-shadow: none;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/spotlight.css b/Neutron-trunk/resources/css/spotlight.css
deleted file mode 100644
index ca72fd6..0000000
--- a/Neutron-trunk/resources/css/spotlight.css
+++ /dev/null
@@ -1,245 +0,0 @@
-/* Spotlight theming */
-:root {
- --spotlight-glass: rgba(0, 0, 0, 0.75);
- --spotlight-shadow: rgba(0, 0, 0, .75);
- --spotlight-background: var(--mpc-menu-background, #ffffff);
- --spotlight-text: var(--mdc-theme-on-surface, #000000);
- --spotlight-border: var(--mdc-theme-primary, gray);
- --spotlight-hover: var(--mpc-slse-hover1, rgba(0, 0, 0, 0.1));
- --spotlight-superhover: var(--mpc-slse-hover1, rgba(0, 0, 0, 0.25));
-
- --spotlight-pages-text: rgb(25, 118, 210);
- --spotlight-pages-background-heavy: rgba(25, 118, 210, .25);
- --spotlight-pages-background-light: rgba(25, 118, 210, .1);
- --spotlight-gallery-text: rgb(211, 47, 47);
- --spotlight-gallery-background-heavy: rgba(211, 47, 47, .25);
- --spotlight-gallery-background-light: rgba(211, 47, 47, .1);
- --spotlight-calendar-text: rgb(56, 142, 60);
- --spotlight-calendar-background-heavy: rgba(56, 142, 60, .25);
- --spotlight-calendar-background-light: rgba(56, 142, 60, .1);
- --spotlight-plugins-text: rgb(251, 127, 45);
- --spotlight-plugins-background-heavy: rgba(251, 127, 45, .25);
- --spotlight-plugins-background-light: rgba(251, 127, 45, .1);
- --spotlight-technical-text: rgb(81, 45, 168);
- --spotlight-technical-background-heavy: rgba(81, 45, 168, .25);
- --spotlight-technical-background-light: rgba(81, 45, 168, .1);
- --spotlight-data-text: rgb(0, 121, 107);
- --spotlight-data-background-heavy: rgba(0, 121, 107, .25);
- --spotlight-data-background-light: rgba(0, 121, 107, .1);
- --spotlight-updates-text: rgb(0, 121, 81);
- --spotlight-updates-background-heavy: rgba(0, 121, 81, .25);
- --spotlight-updates-background-light: rgba(0, 121, 81, .1);
- --spotlight-apparence-text: rgb(251, 192, 45);
- --spotlight-apparence-background-heavy: rgba(251, 192, 45, .25);
- --spotlight-apparence-background-light: rgba(251, 192, 45, .1);
-}
-
-.spotlight * {
- box-sizing: border-box;
-}
-
-.spotlight {
- opacity: 0;
- pointer-events: none;
- position: fixed;
- top: 0;
- z-index: 99999999999999999999999999;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: var(--spotlight-glass);
- display: flex;
- justify-content: center;
- color: var(--spotlight-text);
-}
-
-.spotlight.active {
- opacity: 1;
- pointer-events: auto;
-}
-
-.spotlight-bar {
- width: 50%;
- top: 0;
- position: fixed;
- background: var(--spotlight-background);
- border-bottom-left-radius: 5px;
- border-bottom-right-radius: 5px;
- border: none;
- padding: 10px;
- box-shadow: 1px 2px 5px var(--spotlight-glass);
-}
-
-.spotlight-bar input {
- width: 100%;
- padding: 10px 20px;
- border: none;
- background: none;
-}
-
-.spotlight-suggestions {
- border-top: 1px solid var(--spotlight-border);
- position: absolute;
- top: 100%;
- background: var(--spotlight-background);
- left: 0;
- right: 0;
- margin: -5px 0 0 0;
- padding: 5px;
- border-bottom-left-radius: 5px;
- border-bottom-right-radius: 5px;
-}
-
-.spotlight-suggestions li {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-.spotlight-suggestions a {
- display: block;
- text-decoration: none;
- padding: 10px 25px;
- color: inherit;
- border-radius: 5px;
- white-space: nowrap;
- overflow: hidden !important;
- text-overflow: ellipsis;
-}
-
-.spotlight-suggestions li.active a:hover, .spotlight-suggestions li a:hover {
- background-color: var(--spotlight-superhover);
-}
-
-.spotlight-suggestions li.active a {
- background-color: var(--spotlight-hover);
-}
-
-.spotlight-suggestions mark {
- opacity: .3;
- background: none;
- color: inherit;
-}
-
-.spotlight-icon {
- vertical-align: middle;
- margin-right: 10px;
-}
-
-.spotlight-suggestions span {
- vertical-align: middle;
-}
-
-.spotlight-elements {
- display: none;
-}
-
-.spotlight-link__pages:hover, li.active .spotlight-link__pages {
- color: var(--spotlight-pages-text);
-}
-
-.spotlight-link__gallery:hover, li.active .spotlight-link__gallery {
- color: var(--spotlight-gallery-text);
-}
-
-.spotlight-link__calendar:hover, li.active .spotlight-link__calendar {
- color: var(--spotlight-calendar-text);
-}
-
-.spotlight-link__plugins:hover, li.active .spotlight-link__plugins {
- color: var(--spotlight-plugins-text);
-}
-
-.spotlight-link__technical:hover, li.active .spotlight-link__technical {
- color: var(--spotlight-technical-text);
-}
-
-.spotlight-link__data:hover, li.active .spotlight-link__data {
- color: var(--spotlight-data-text);
-}
-
-.spotlight-link__updates:hover, li.active .spotlight-link__updates {
- color: var(--spotlight-updates-text);
-}
-
-.spotlight-link__apparence:hover, li.active .spotlight-link__apparence {
- color: var(--spotlight-apparence-text);
-}
-
-li a.spotlight-link__pages:hover {
- background-color: var(--spotlight-pages-background-heavy) !important;
-}
-
-li.active a.spotlight-link__pages {
- background-color: var(--spotlight-pages-background-light);
-}
-
-li a.spotlight-link__gallery:hover {
- background-color: var(--spotlight-gallery-background-heavy) !important;
-}
-
-li.active a.spotlight-link__gallery {
- background-color: var(--spotlight-gallery-background-light);
-}
-
-li a.spotlight-link__calendar:hover {
- background-color: var(--spotlight-calendar-background-heavy) !important;
-}
-
-li.active a.spotlight-link__calendar {
- background-color: var(--spotlight-calendar-background-light);
-}
-
-li a.spotlight-link__plugins:hover {
- background-color: var(--spotlight-plugins-background-heavy) !important;
-}
-
-li.active a.spotlight-link__plugins {
- background-color: var(--spotlight-plugins-background-light);
-}
-
-li a.spotlight-link__technical:hover {
- background-color: var(--spotlight-technical-background-heavy) !important;
-}
-
-li.active a.spotlight-link__technical {
- background-color: var(--spotlight-technical-background-light);
-}
-
-li a.spotlight-link__data:hover {
- background-color: var(--spotlight-data-background-heavy) !important;
-}
-
-li.active a.spotlight-link__data {
- background-color: var(--spotlight-data-background-light);
-}
-
-li a.spotlight-link__updates:hover {
- background-color: var(--spotlight-updates-background-heavy) !important;
-}
-
-li.active a.spotlight-link__updates {
- background-color: var(--spotlight-updates-background-light);
-}
-
-li a.spotlight-link__apparence:hover {
- background-color: var(--spotlight-apparence-background-heavy) !important;
-}
-
-li.active a.spotlight-link__apparence {
- background-color: var(--spotlight-apparence-background-light);
-}
-
-.spotlight-input {
- outline: none;
- color: var(--spotlight-text);
-}
-
-.spotlight-link {
- cursor: pointer;
-}
-
-#admin.spotlight-blur {
- filter: blur(10px);
- pointer-events: none;
-}
diff --git a/Neutron-trunk/resources/css/themes/blue-auto.css b/Neutron-trunk/resources/css/themes/blue-auto.css
deleted file mode 100644
index 05864eb..0000000
--- a/Neutron-trunk/resources/css/themes/blue-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./blue-light.css") only screen and (prefers-color-scheme: light);
-@import url("./blue-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./blue-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/blue-dark.css b/Neutron-trunk/resources/css/themes/blue-dark.css
deleted file mode 100644
index 7285ad4..0000000
--- a/Neutron-trunk/resources/css/themes/blue-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #b5c9ff;
- --mdc-theme-secondary: #ffebb4;
- --mdc-theme-background: #3a4053;
- --mdc-theme-surface: #b5c9ff;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: white;
-
- --cms-extra-superdark: #040a1a;
-}
diff --git a/Neutron-trunk/resources/css/themes/blue-light.css b/Neutron-trunk/resources/css/themes/blue-light.css
deleted file mode 100644
index b8ff9d7..0000000
--- a/Neutron-trunk/resources/css/themes/blue-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #2962ff;
- --mdc-theme-secondary: #ffc629;
- --mdc-theme-background: #cedbff;
- --mdc-theme-surface: #2962ff;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #040a1a;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/brown-auto.css b/Neutron-trunk/resources/css/themes/brown-auto.css
deleted file mode 100644
index 65ed947..0000000
--- a/Neutron-trunk/resources/css/themes/brown-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./brown-light.css") only screen and (prefers-color-scheme: light);
-@import url("./brown-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./brown-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/brown-dark.css b/Neutron-trunk/resources/css/themes/brown-dark.css
deleted file mode 100644
index baaa3a9..0000000
--- a/Neutron-trunk/resources/css/themes/brown-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #d4c49b;
- --mdc-theme-secondary: #a5b0ce;
- --mdc-theme-background: #6d644e;
- --mdc-theme-surface: #cfc3a2;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #271c00;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/brown-light.css b/Neutron-trunk/resources/css/themes/brown-light.css
deleted file mode 100644
index 4c83cb4..0000000
--- a/Neutron-trunk/resources/css/themes/brown-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #d29600;
- --mdc-theme-secondary: #003cd2;
- --mdc-theme-background: #cfc099;
- --mdc-theme-surface: #d29600;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #271c00;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/green-auto.css b/Neutron-trunk/resources/css/themes/green-auto.css
deleted file mode 100644
index ea9a940..0000000
--- a/Neutron-trunk/resources/css/themes/green-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./green-light.css") only screen and (prefers-color-scheme: light);
-@import url("./green-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./green-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/green-dark.css b/Neutron-trunk/resources/css/themes/green-dark.css
deleted file mode 100644
index b245c67..0000000
--- a/Neutron-trunk/resources/css/themes/green-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #90c59a;
- --mdc-theme-secondary: #c78fbd;
- --mdc-theme-background: #2d4131;
- --mdc-theme-surface: #90c59a;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: white;
-
- --cms-extra-superdark: #002507;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/green-light.css b/Neutron-trunk/resources/css/themes/green-light.css
deleted file mode 100644
index 2aeba7c..0000000
--- a/Neutron-trunk/resources/css/themes/green-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #00c924;
- --mdc-theme-secondary: #c900a4;
- --mdc-theme-background: #cbffd4;
- --mdc-theme-surface: #00c924;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #002507;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/orange-auto.css b/Neutron-trunk/resources/css/themes/orange-auto.css
deleted file mode 100644
index 59196ff..0000000
--- a/Neutron-trunk/resources/css/themes/orange-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./orange-light.css") only screen and (prefers-color-scheme: light);
-@import url("./orange-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./orange-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/orange-dark.css b/Neutron-trunk/resources/css/themes/orange-dark.css
deleted file mode 100644
index 454e2f7..0000000
--- a/Neutron-trunk/resources/css/themes/orange-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #ffd6c1;
- --mdc-theme-secondary: #bde8ff;
- --mdc-theme-background: #493c35;
- --mdc-theme-surface: #ffdbc7;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #270e00;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/orange-light.css b/Neutron-trunk/resources/css/themes/orange-light.css
deleted file mode 100644
index 8242e1b..0000000
--- a/Neutron-trunk/resources/css/themes/orange-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #ff5b00;
- --mdc-theme-secondary: #00a6ff;
- --mdc-theme-background: #ffd9c4;
- --mdc-theme-surface: #ff5b00;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #270e00;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/purple-auto.css b/Neutron-trunk/resources/css/themes/purple-auto.css
deleted file mode 100644
index b0e5dea..0000000
--- a/Neutron-trunk/resources/css/themes/purple-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./purple-light.css") only screen and (prefers-color-scheme: light);
-@import url("./purple-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./purple-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/purple-dark.css b/Neutron-trunk/resources/css/themes/purple-dark.css
deleted file mode 100644
index 454e2f7..0000000
--- a/Neutron-trunk/resources/css/themes/purple-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #ffd6c1;
- --mdc-theme-secondary: #bde8ff;
- --mdc-theme-background: #493c35;
- --mdc-theme-surface: #ffdbc7;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #270e00;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/purple-light.css b/Neutron-trunk/resources/css/themes/purple-light.css
deleted file mode 100644
index 09e4633..0000000
--- a/Neutron-trunk/resources/css/themes/purple-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #7f00a9;
- --mdc-theme-secondary: #2aa900;
- --mdc-theme-background: #b99fc2;
- --mdc-theme-surface: #7f00a9;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #240030;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/red-auto.css b/Neutron-trunk/resources/css/themes/red-auto.css
deleted file mode 100644
index 8419949..0000000
--- a/Neutron-trunk/resources/css/themes/red-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./red-light.css") only screen and (prefers-color-scheme: light);
-@import url("./red-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./red-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/red-dark.css b/Neutron-trunk/resources/css/themes/red-dark.css
deleted file mode 100644
index 824bd8f..0000000
--- a/Neutron-trunk/resources/css/themes/red-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #cc9595;
- --mdc-theme-secondary: #93c9c9;
- --mdc-theme-background: #694646;
- --mdc-theme-surface: #cc9595;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: white;
-
- --cms-extra-superdark: #300000;
-}
diff --git a/Neutron-trunk/resources/css/themes/red-light.css b/Neutron-trunk/resources/css/themes/red-light.css
deleted file mode 100644
index 1c260ae..0000000
--- a/Neutron-trunk/resources/css/themes/red-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #c90000;
- --mdc-theme-secondary: #00c9c9;
- --mdc-theme-background: #c99898;
- --mdc-theme-surface: #c90000;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #300000;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/white-auto.css b/Neutron-trunk/resources/css/themes/white-auto.css
deleted file mode 100644
index 954a4f2..0000000
--- a/Neutron-trunk/resources/css/themes/white-auto.css
+++ /dev/null
@@ -1,3 +0,0 @@
-@import url("./white-light.css") only screen and (prefers-color-scheme: light);
-@import url("./white-light.css") only screen and (prefers-color-scheme: no-preference);
-@import url("./white-dark.css") only screen and (prefers-color-scheme: dark);
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/white-dark.css b/Neutron-trunk/resources/css/themes/white-dark.css
deleted file mode 100644
index ed8daa9..0000000
--- a/Neutron-trunk/resources/css/themes/white-dark.css
+++ /dev/null
@@ -1,13 +0,0 @@
-@import url("../polymer/dark.css");
-
-:root {
- --mdc-theme-primary: #acacac;
- --mdc-theme-secondary: #c9c9c9;
- --mdc-theme-background: #acacac;
- --mdc-theme-surface: #acacac;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #2b2b2b;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/themes/white-light.css b/Neutron-trunk/resources/css/themes/white-light.css
deleted file mode 100644
index abfd7e3..0000000
--- a/Neutron-trunk/resources/css/themes/white-light.css
+++ /dev/null
@@ -1,11 +0,0 @@
-:root {
- --mdc-theme-primary: #d6d6d6;
- --mdc-theme-secondary: #919191;
- --mdc-theme-background: #f3f3f3;
- --mdc-theme-surface: #d6d6d6;
- --mdc-theme-on-surface: white;
- --mdc-theme-on-primary: white;
- --mdc-theme-on-secondary: black;
-
- --cms-extra-superdark: #2b2b2b;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/css/ui.css b/Neutron-trunk/resources/css/ui.css
deleted file mode 100644
index 0fc04a7..0000000
--- a/Neutron-trunk/resources/css/ui.css
+++ /dev/null
@@ -1,166 +0,0 @@
-@import "./alerts.css";
-
-.button {
- cursor: pointer;
- text-decoration: none;
- color: white;
- padding: 10px 20px;
- background: rgb(39, 39, 39);
- border-radius: 5px;
- border-style: solid;
- border-width: 0px;
- border-width: 3px;
- border-color: transparent;
- transition: border-color 100ms;
- box-shadow: 1px 1px 5px rgb(65, 65, 65);
-}
-
-.button-dangerous {
- cursor: pointer;
- text-decoration: none;
- color: white;
- padding: 10px 20px;
- background: rgb(182, 19, 19);
- border-radius: 5px;
- border-style: solid;
- border-width: 3px;
- border-color: transparent;
- transition: border-color 100ms;
- box-shadow: 1px 1px 5px rgb(173, 56, 56);
-}
-
-.button:hover {
- color: white;
- border-color: rgb(65, 65, 65);
-}
-
-.button-dangerous:hover {
- color: white;
- border-color: rgb(173, 56, 56);
-}
-
-.icon_button {
- cursor: pointer;
- text-decoration: none;
- padding: 5px;
- border-radius: 999px;
- box-shadow: none;
- transition: box-shadow 200ms;
- background: whitesmoke;
-}
-
-.icon_button:hover {
- box-shadow: 1px 1px 10px rgb(168, 168, 168);
-}
-
-.hide {
- display: none;
-}
-
-input[type="text"]:not(.easycss-input-value):not(.spotlight-input), input[type="password"] {
- border: none;
- padding: 5px 10px;
- border-radius: 5px;
- border-color: black;
- border-style: solid;
- border-width: 1px;
- text-align: center;
-}
-
-input[type="text"]:hover:not(.easycss-input-value):not(.spotlight-input), input[type="password"]:hover {
- border-color: rgb(75, 75, 75);
-}
-
-button.button {
- font-size: 16px;
-}
-
-input[type="button"].button {
- font-size: 16px;
-}
-
-input[type="submit"].button {
- font-size: 16px;
-}
-
-center {
- text-align: center;
-}
-
-.php-internal-error {
- display: block;
- margin: -8px;
- padding: 14px;
- text-align: center;
- background: red;
- color: white;
-}
-
-code {
- font-family: monospace;
- font-size: 14px;
-}
-
-#errorbox-wrapper {
- z-index: 99999;
- background-color: rgba(0, 0, 0, 0.75);
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-#errorbox-frame {
- margin: 0 25%;
- padding: 30px;
- border-radius: 10px;
- background: #eaeaea;
- box-shadow: 0px 0px 8px #eaeaea;
- color: black;
-}
-
-#errorbox-bottom {
- margin-bottom: -30px;
- margin-left: -30px;
- margin-right: -30px;
- border-bottom-right-radius: 10px;
- border-bottom-left-radius: 10px;
- background: #5487ff;
- padding: 5px;
- margin-top: 30px;
- box-shadow: 1px 5px 8px #5487ff;
- cursor: pointer;
- transition: box-shadow 200ms, background 200ms;
-}
-
-#errorbox-bottom:hover {
- background: #417aff;
- box-shadow: 1px 5px 8px #417aff;
-}
-
-#errorbox-bottom:active {
- background: #195eff;
- box-shadow: 1px 5px 8px #195eff;
-}
-
-@media (max-width: 500px) {
- #errorbox-frame {
- padding: 10px;
- }
- #errorbox-bottom {
- margin-bottom: -10px;
- margin-left: -10px;
- margin-right: -10px;
- margin-top: 10px;
- }
- #errorbox-logo {
- width: 24px;
- height: 24px;
- }
-}
-
-#errorbox-logo {
- width: 48px;
- height: 48px;
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Black.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Black.ttf
deleted file mode 100644
index 2d45238..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Black.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-BlackItalic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-BlackItalic.ttf
deleted file mode 100644
index 29a4359..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-BlackItalic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Bold.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Bold.ttf
deleted file mode 100644
index d998cf5..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Bold.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-BoldItalic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-BoldItalic.ttf
deleted file mode 100644
index b4e2210..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-BoldItalic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Italic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Italic.ttf
deleted file mode 100644
index 5b390ff..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Italic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Light.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Light.ttf
deleted file mode 100644
index 3526798..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Light.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-LightItalic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-LightItalic.ttf
deleted file mode 100644
index 46e9bf7..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-LightItalic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Medium.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Medium.ttf
deleted file mode 100644
index f714a51..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Medium.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-MediumItalic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-MediumItalic.ttf
deleted file mode 100644
index 5dc6a2d..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-MediumItalic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Regular.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Regular.ttf
deleted file mode 100644
index 2b6392f..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Regular.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-Thin.ttf b/Neutron-trunk/resources/fonts/body/Roboto-Thin.ttf
deleted file mode 100644
index 4e797cf..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-Thin.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/body/Roboto-ThinItalic.ttf b/Neutron-trunk/resources/fonts/body/Roboto-ThinItalic.ttf
deleted file mode 100644
index eea836f..0000000
Binary files a/Neutron-trunk/resources/fonts/body/Roboto-ThinItalic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/font-bold-italic.ttf b/Neutron-trunk/resources/fonts/font-bold-italic.ttf
deleted file mode 100644
index bdd22b0..0000000
Binary files a/Neutron-trunk/resources/fonts/font-bold-italic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/font-bold.ttf b/Neutron-trunk/resources/fonts/font-bold.ttf
deleted file mode 100644
index 96619df..0000000
Binary files a/Neutron-trunk/resources/fonts/font-bold.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/font-italic.ttf b/Neutron-trunk/resources/fonts/font-italic.ttf
deleted file mode 100644
index 5b44037..0000000
Binary files a/Neutron-trunk/resources/fonts/font-italic.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/fonts/font-regular.ttf b/Neutron-trunk/resources/fonts/font-regular.ttf
deleted file mode 100644
index e2c69c3..0000000
Binary files a/Neutron-trunk/resources/fonts/font-regular.ttf and /dev/null differ
diff --git a/Neutron-trunk/resources/i18n/en/$metadata.json b/Neutron-trunk/resources/i18n/en/$metadata.json
deleted file mode 100644
index 9954d47..0000000
--- a/Neutron-trunk/resources/i18n/en/$metadata.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "id": "en",
- "name": "English",
- "localized_name": "English",
- "encoding": "utf_8",
- "alphabet": "latin"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-about.json b/Neutron-trunk/resources/i18n/en/admin-about.json
deleted file mode 100644
index 34fed00..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-about.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "updates": {
- "beta": [
- "Your site is potentially vulnerable",
- "You are using a Neutron prerelease"
- ],
- "ltsend": [
- "Your site is not protected",
- "The long term support for your version has ended, it is highly recommended that you update to the latest long term support release"
- ],
- "ltsnew": [
- "Your site is protected",
- "A new long term support version is available, but your installed one is still supported"
- ],
- "ltsuptodate": [
- "Your site is protected",
- "Neutron is up to date, you use a version with long term support"
- ],
- "uptodate": [
- "Your site is protected",
- "Neutron is up to date"
- ],
- "newversion": [
- "Your site is not protected",
- "A new Neutron update is available"
- ]
- },
- "version": {
- "prefix": "Your server is running Neutron",
- "update": ", and the latest available version is",
- "beta": ", and the current stable version is",
- "prerel": [
- " (",
- " prerelease) "
- ],
- "channel": "You are on this update channel:",
- "distrib": "→ Distribution information",
- "updates": "→ Updates manager"
- },
- "diskspace": [
- "Your site is using",
- "of disk space"
- ],
- "info": "Informations",
- "disk": "Disk space",
- "changes": "Changes",
- "current": "Current version",
- "nolog": "No info is available about this version of Neutron",
- "stable": "Latest stable version",
- "beta": "Current stable version",
- "exp": "Target version",
- "categories": {
- "system": "System files",
- "config": "Contents and configuration",
- "resources": "Photos and other resources",
- "misc": "Miscellaneous files"
- },
- "new": {
- "overview": "Overview",
- "version": "Neutron Versions",
- "system": "System Versions",
- "types": [
- "Neutron Cloud, security and reliability assured, in a safe and simple environment",
- "Neutron On-Premises, keep full control over your infrastructure"
- ],
- "renderer": [
- "Rendering engine version:",
- "Render backwards compatibility layer version:"
- ]
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-advanced-dev.json b/Neutron-trunk/resources/i18n/en/admin-advanced-dev.json
deleted file mode 100644
index f1ca4a3..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-advanced-dev.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "warning": "Edit these settings carefully, as any wrong change can prevent your site from working.",
- "remove": [
- "If your site stops working after the change, ask your system administrator to delete the",
- "file. The software will generate a new one without errors."
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-advanced-home.json b/Neutron-trunk/resources/i18n/en/admin-advanced-home.json
deleted file mode 100644
index 1b664e4..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-advanced-home.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "dev": "Developer options",
- "regedit": "Registry editor",
- "placeholders": {
- "dev": "Change the advanced developer options JSON configuration file",
- "regedit": "Explore the registry base of the site"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-appearance.json b/Neutron-trunk/resources/i18n/en/admin-appearance.json
deleted file mode 100644
index 757af82..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-appearance.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "error": "Unknwon error",
- "site": "Site name:",
- "name": [
- "The site name cannot be empty",
- "The site name contains invalid characters",
- "The site name is too long",
- "Longer name recommended",
- "Shorter name recommended",
- "This name looks great"
- ],
- "icon": "Change the icon",
- "banner": "Change the banner",
- "alwaysmenu": "Use the drawer even on desktop UI",
- "save": "Save",
- "footer": "Change page footer",
- "fdesc": "This page footer shows on every visitor page of your site",
- "publish": "Publish",
- "fdisc": [
- "What you see is not forcibly what you'll get.",
- "The page footer may look different on the final site, depending on your settings and browser. Basic format settings will anyway appear as selected there on your site."
- ],
- "password": "Change password",
- "oldpass": "Old password:",
- "newpass": "New password:",
- "passrep": "Repeat password:",
- "secure": "Use a safe password",
- "change": "Change password",
- "pages": [
- "Show ",
- " pages in the menu bar"
- ],
- "old": "Use the old page interface",
- "oldopts": "These settings only apply if you use the old UI:"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-calendar.json b/Neutron-trunk/resources/i18n/en/admin-calendar.json
deleted file mode 100644
index 1578d19..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-calendar.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "show": [
- "Show the",
- "next events in the widget."
- ],
- "events": "Events",
- "manage": "Manage",
- "manageph": "Manage/delete event",
- "corrupt": [
- "Important:",
- "The calendar database seems corrupted. If you didn't do any particular action recently, this may come from disk corruption or server intruders.",
- "Contact your system administrator as soon as possible"
- ],
- "nothing": "No event in the calendar right now",
- "add": "Add a new event",
- "addph": "Add a new event on the calendar",
- "info": "Event information",
- "deleteask": "Delete the event?",
- "deleteyes": "Yes",
- "deleteyesph": "Delete the selected event",
- "deleteno": "No",
- "deletenoph": "Don't delete the selected event",
- "create": {
- "date": "Date",
- "day": "Day:",
- "month": "Month:",
- "trimesters": [
- "1st trimester",
- "2nd trimester",
- "3rd trimester",
- "4th trimester"
- ],
- "months": [
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"
- ],
- "year": "Year:",
- "info": "Information",
- "name": "Event name:",
- "nameph": "Event name",
- "mandatory": "optional",
- "desc": "Description:",
- "descph": "Description",
- "web": "Website URL:",
- "webph": "External like",
- "notice": "The event description will fully show on the « Upcoming events » widget, we recommend not writing a long description",
- "complete": "Add event"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-customization.json b/Neutron-trunk/resources/i18n/en/admin-customization.json
deleted file mode 100644
index c89cfb3..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-customization.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "color": "Color scheme",
- "theme": "Theme",
- "dark": "Dark",
- "light": "Light",
- "auto": "Use visitor's device option",
- "auto2": "Auto",
- "colors": [
- "Blue",
- "Green",
- "Red",
- "Orange",
- "Violet",
- "Brown",
- "Gray"
- ],
- "colors2": [
- "Water",
- "Leaf",
- "Tomato",
- "Orange",
- "Purple",
- "Dirt",
- "Smoke"
- ],
- "descriptions": [
- "Use the option on the visitor's device, if supported by their browser",
- "Let the darkness get out and calm visitor's eyes",
- "Prefer seeing the day light and keep a professional appearance"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-errors.json b/Neutron-trunk/resources/i18n/en/admin-errors.json
deleted file mode 100644
index 4b46b7d..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-errors.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "errorprefix": "Error: ",
- "connerror": "Communication error",
- "housekeeping": [
- "Your website may have been damaged",
- "No changes were made to your site"
- ],
- "common": {
- "title": "An error occurred",
- "message": "Oops, Neutron didn't work as intended...",
- "report": "Report a bug",
- "home": "Admin home"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-flags.json b/Neutron-trunk/resources/i18n/en/admin-flags.json
deleted file mode 100644
index cd30666..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-flags.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "notice": "These are experimental features that shouldn't be enabled on a mission-critical website. They weren't sufficiently tested to be enabled by default and are available here."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-gallery.json b/Neutron-trunk/resources/i18n/en/admin-gallery.json
deleted file mode 100644
index dee3f09..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-gallery.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "general": {
- "title": "Overview",
- "label": "Label"
- },
- "none": "None",
- "lists": {
- "categories": "category",
- "picture": " photo"
- },
- "categories": {
- "add": "Create a new category",
- "title": "Categories",
- "edit": "To edit a category, delete it and re-create it.",
- "delete": "Delete"
- },
- "pictures": {
- "title": "Photos",
- "none": "There is no photo in the photo gallery.",
- "add": "Publish a new photo",
- "download": "Download",
- "delete": "Delete"
- },
- "delete": {
- "title": [
- "You are about to delete and unpublish this picture from the site.",
- "This cannot be undone and the picture cannot be recovered..."
- ],
- "removing": "Deleting picture...",
- "category": "You are about to delete this category, this cannot be undone. All images in this category will be uncategorized.",
- "catrm": "Deleting category..."
- },
- "label": "Enter a new label for this picture",
- "labelling": "Labeling picture...",
- "addcat": {
- "placeholder": "Category name",
- "same": "If a category with the same name already exists, nothing will happen",
- "confirm": "Create category"
- },
- "publish": {
- "category": "Category:",
- "default": "Uncategorized",
- "file": "Photo file:",
- "max": "Maximum size:",
- "publish": "Publish photo"
- }
-}
diff --git a/Neutron-trunk/resources/i18n/en/admin-home.json b/Neutron-trunk/resources/i18n/en/admin-home.json
deleted file mode 100644
index 2ad5cce..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-home.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "greeting": "Welcome! How can we help you?",
- "language": "Change language",
- "home": "Home",
- "updates": [
- "Updates are ready to install",
- "→ Install now"
- ],
- "items": [
- "Pages",
- "Calendar",
- "Gallery",
- "Appearance",
- "Data",
- "Maintenance",
- "All settings",
- "Back",
- "Sign out",
- "Go back to site"
- ],
- "appearance": {
- "greeting": "Change your website's global look ...",
- "items": [
- "General",
- "Theme",
- "Visual designer",
- "Region and language",
- "Optional features",
- "Features flags"
- ]
- },
- "data": {
- "greeting": "View the data collected by your site ...",
- "items": [
- "Statistics",
- "Activity log",
- "Renderer system trace"
- ]
- },
- "housekeeping": {
- "greeting": "Clean up your site so that it still runs fine ...",
- "items": [
- "Reset options",
- "About the software",
- "Software update"
- ]
- },
- "search": "Search settings",
- "find": "Search a setting...",
- "all": "All settings",
- "categories": [
- "Pages",
- "Photo Gallery",
- "Calendar",
- "Optional Features",
- "Technical Configuration",
- "Data",
- "Updates and info",
- "Visual look and feel"
- ],
- "allitems": [
- "Manage all pages",
- "Create a new page",
- "Manage gallery images",
- "Publish a new gallery image",
- "Create a new gallery category",
- "View the visitor gallery",
- "Manage calendar events",
- "Add a new calendar event",
- "View the visitor calendar",
- "Manage optional features",
- "Manage contact info",
- "Manage notes contents",
- "All technical configurations",
- "Change extended configuration",
- "Inspect system configuration",
- "Website reset options",
- "View statistics info",
- "Read website access log",
- "View renderer stack trace",
- "View info about software versions",
- "View info about software updates",
- "Download and install updates",
- "Change the general appearance of the website",
- "Change color scheme and brightness theme",
- "Go to the customization studio homepage",
- "Change customized stylesheets with the EasyCSS software",
- "Change the language of the whole site",
- "Change features flags"
- ],
- "nofound": "No result",
- "one": "1 result",
- "multiple": " results"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-housekeeping.json b/Neutron-trunk/resources/i18n/en/admin-housekeeping.json
deleted file mode 100644
index a21ed94..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-housekeeping.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "reset": "Reset website",
- "resetph": "Delete all data about your website and restore Neutron to default values",
- "disclaimer": [
- "This will delete:",
- "all pages on your website",
- "all images on the gallery",
- "the icon and banner image",
- "informations about the website name and footer"
- ],
- "confirm": "Enter the name of your website is this field to reset it:",
- "confirmboxph": "Name of your website",
- "confirmbutton": "Reset",
- "select": [
- "Select how we should reset your website:",
- "This cannot be undone and deleted data will be deleted forever",
- "Keep content",
- "Resets your website configuration but keep content you have inserted. Useful if you have configuration issues or you need additional disk space.",
- "Delete everything",
- "Delete all your website's data and redirects you to the first setup utility. Useful if you need to rebuild your website from scratch, or an update caused issues.",
- "Your website is resetting...",
- "Don't quit this page"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-login.json b/Neutron-trunk/resources/i18n/en/admin-login.json
deleted file mode 100644
index ffd896d..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-login.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "modes": [
- "Password",
- "Private key"
- ],
- "password": "Password",
- "key": "Authentication private key",
- "confirm": "Login",
- "back": "back to website",
- "report": "report a bug",
- "branding": "powered by Neutron"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-logs.json b/Neutron-trunk/resources/i18n/en/admin-logs.json
deleted file mode 100644
index 6267f82..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-logs.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "nothing": [
- "Nothing seems to be recorded",
- "This looks strange, check your server's access permissions and PHP configuration"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-pages.json b/Neutron-trunk/resources/i18n/en/admin-pages.json
deleted file mode 100644
index 7960631..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-pages.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "home": "Home",
- "alore": "Add a new page to your website",
- "create": "Create a page",
- "edit": "Edit",
- "editl": "Edit the contents of this page",
- "renamel": "Rename and change this page's URL",
- "rename": "Rename",
- "deletel": "Delete this page forever",
- "delete": "Delete",
- "pagename": "Page name",
- "editors": [
- "Visual editor",
- "HTML editor"
- ],
- "editordescs": [
- "Edit the page as if it was a word processor document",
- "Write the code yourself for more customization"
- ],
- "quitwarn": "By leaving this page, you lose any non-saved change.",
- "saved": "The page has been saved successfully",
- "deletec": [
- "Do you really want to delete the « ",
- " » page? This cannot be undone and may lead to undesirable side effects.",
- "You can't delete your site's homepage."
- ],
- "deleteyl": "Delete the selected page",
- "deletey": "Yes",
- "deletenl": "Cancel deletion of this page",
- "deleten": "No",
- "renamew": [
- "You are renaming the « ",
- " » page, this may lead to undesirable side effects. Moreover, no redirect will be created.",
- "You can't rename your site's homepage."
- ],
- "oname": "Old name",
- "onamep": "# Error #",
- "nname": "New name",
- "renamel2": "Rename page",
- "rename2": "Rename",
- "editcode": "Change the page's source code"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-plugins.json b/Neutron-trunk/resources/i18n/en/admin-plugins.json
deleted file mode 100644
index ab53970..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-plugins.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "newnotice": "Enable or disable optional features to adapt your site to your needs.",
- "builtin": "built-in extension",
- "config": "Manage this feature's settings",
- "store": "View this extension in the CMS Store",
- "remove": "Uninstall extension",
- "tip": [
- "Pro tip:",
- " You can install new extensions from the ",
- ", a library for all Neutron extensions"
- ],
- "saved": "Changes successfully saved",
- "widgetconf": {
- "saveph": "Save extension configuration",
- "save": "Save",
- "textedit": "Enter the text that will be shown in the widget bar. Only inline editing is supported (no titles, tables, etc...)."
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-stats.json b/Neutron-trunk/resources/i18n/en/admin-stats.json
deleted file mode 100644
index 2d0d9b5..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-stats.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "thisMonth": "Views this month",
- "disclaimer": "Some info may not be accurate",
- "year": "Total views this year",
- "last": "Total views last year",
- "last2": "Total views in ",
- "months": [
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"
- ],
- "monthslc": [
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"
- ],
- "separator": ":",
- "visits": "views(s)",
- "visit1": "view",
- "visits2": "views",
- "new": "New statistics system",
- "old": "Old statistics system",
- "notice": "This website was using Neutron 8 Beta 3 or older. Starting with Neutron 8, the statistics system has been rewritten to count the same person only one time even if they view multiple pages. We suggest that you don't take into account the old statistics, these are shown only for informational purposes."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/admin-titles.json b/Neutron-trunk/resources/i18n/en/admin-titles.json
deleted file mode 100644
index b958c23..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-titles.json
+++ /dev/null
@@ -1,151 +0,0 @@
-{
- "$notice": "Please keep this file AS CLEAN as possible, because it is automatically parsed by the precontent.php file in the admin system. Values names MUST BE admin pages names (except for fallback value) !",
-
- "suffix": "Admin",
- "fallback": "Untitled page",
- "fallback-subpages": "Untitled subpage",
- "home": {
- "dom": "Home",
- "header": "Your site",
- "subpages": {
- "appearance": {
- "dom": "Appearance",
- "header": "Appearance options"
- },
- "data": {
- "dom": "Data",
- "header": "Statistics and other data"
- },
- "housekeeping": {
- "dom": "Maintenance",
- "header": "Maintenance options"
- },
- "all": {
- "dom": "All",
- "header": "All settings"
- }
- }
- },
- "$error": {
- "dom": "Error",
- "header": "Error"
- },
- "pages": {
- "dom": "Pages",
- "header": "Website pages",
- "subpages": {
- "manage": {
- "dom": "Manage page",
- "header": "Page options"
- },
- "edit": {
- "dom": "Edit page",
- "header": "Editing page"
- },
- "delete": {
- "dom": "Delete page",
- "header": "Deleting page"
- },
- "rename": {
- "dom": "Rename page",
- "header": "Renaming page"
- },
- "add": {
- "dom": "New page",
- "header": "Create a page"
- }
- }
- },
- "gallery": {
- "dom": "Photo gallery",
- "header": "Photo gallery",
- "subpages": {
- "addcategory": {
- "dom": "New category",
- "header": "Create a new category"
- },
- "publish": {
- "dom": "New photo",
- "header": "Add a new photo"
- }
- }
- },
- "calendar": {
- "dom": "Calendar",
- "header": "Events",
- "subpages": {
- "add": {
- "dom": "New event",
- "header": "Add a new event"
- },
- "manage": {
- "dom": "Manage event",
- "header": "Event settings"
- }
- }
- },
- "language": {
- "dom": "Region and language",
- "header": "Website region settings"
- },
- "renderer": {
- "dom": "Rendering engine",
- "header": "Renderer system trace"
- },
- "flags": {
- "dom": "Flags",
- "header": "Feature flags"
- },
- "plugins": {
- "dom": "Optional features",
- "header": "Optional features",
- "subpages": {
- "widget-contact-configure": {
- "dom": "Settings",
- "header": "Feature settings"
- },
- "widget-notes-configure": {
- "dom": "Settings",
- "header": "Feature settings"
- }
- }
- },
- "advanced": {
- "dom": "Advanced settings",
- "header": "Advanced website settings",
- "subpages": {
- "jsonconf": {
- "dom": "Developer options",
- "header": "Development settings"
- }
- }
- },
- "housekeeping": {
- "dom": "Maintenance",
- "header": "Maintenance settings"
- },
- "reset": {
- "dom": "Reset options",
- "header": "Reset your website"
- },
- "about": {
- "dom": "À propos de Neutron",
- "header": "À propos du logiciel"
- },
- "appearance": {
- "dom": "Appearance",
- "header": "Your website's appearance"
- },
- "customization": {
- "dom": "Customization",
- "header": "Website's look and feel"
- },
- "logs": {
- "dom": "Activity log",
- "header": "Last activity on your website"
- },
- "stats": {
- "dom": "Statistics",
- "header": "Website's statistics"
- }
-}
diff --git a/Neutron-trunk/resources/i18n/en/admin-v2.json b/Neutron-trunk/resources/i18n/en/admin-v2.json
deleted file mode 100644
index defe253..0000000
--- a/Neutron-trunk/resources/i18n/en/admin-v2.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "on-premises": "On-Premises",
- "drawer": [
- "System",
- "Content",
- "Personalization",
- "Features",
- "Accounts",
- "Region & language",
- "Data & security",
- "Advanced options",
- "Neutron Cloud",
- "Electrode Server"
- ],
- "system_items": [
- "About Neutron",
- "Audit Logs",
- "Manage Version",
- "Logout"
- ],
- "system_descriptions": [
- "View Neutron software versions and data usage",
- "View the list of accesses to pages and administration",
- "Re-download Neutron to install a newer or older version",
- "Safely and simply log out of the administration panel"
- ],
- "content_items": [
- "Pages",
- "Gallery",
- "Calendar"
- ],
- "content_descriptions": [
- "Create, edit, rename and delete your website's pages",
- "Upload, categorize and delete your website's gallery photos",
- "Create, change or delete calendar events"
- ],
- "personalization_items": [
- "Branding",
- "Colour",
- "Footer & legal"
- ],
- "personalization_descriptions": [
- "Logo, banner and website name",
- "Switch between light and dark theme, and change the general theme",
- "Place your website's legal notices in the footer"
- ],
- "features_items": [
- "Optional features",
- "Experimental settings"
- ],
- "features_descriptions": [
- "Enable additional features that extend what you can do with Neutron",
- "Settings that are experimental and that may make your website unstable"
- ],
- "accounts_items": [
- "Password",
- "Administrator Access"
- ],
- "accounts_descriptions": [
- "Change the password you use to login to this website",
- "See how and what system administrators can see from your website"
- ],
- "security_items": [
- "Extended configuration",
- "Statistics"
- ],
- "security_descriptions": [
- "Website hardening and advanced customization options",
- "Informations about the number of view to your website"
- ],
- "maintenance_items": [
- "Reset options"
- ],
- "maintenance_descriptions": [
- "Reset your website to the defaults or repair it"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/api.json b/Neutron-trunk/resources/i18n/en/api.json
deleted file mode 100644
index 41631af..0000000
--- a/Neutron-trunk/resources/i18n/en/api.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
- "token": "Invalid authentication token",
- "select": "No element selected",
- "value": "No value specified",
- "incorrect": "Incorrect value",
- "param": "No content passed as parameter",
- "missing": "Missing information",
- "invchar": "One or more fields have values containing invalid characters",
- "advsyntax": "The file syntax is incorrect. Check for errors at the code editor and fix these, or refresh this page to cancel changes.",
- "pageselect": "No page selected",
- "inforec": "No information received by the server",
- "pgnameempty": "The new name cannot be empty",
- "pgnameinternal": "You cannot use a name internally reserved by the software",
- "pgnameexists": "A page with the same name already exists",
- "pgnamelong": "The new page name is too long",
- "pgnamenone": "No new name specified",
- "pgnotfound": "The page doesn't exist",
- "pgnone": "No page specified",
- "fieldinvalid": "Some fields are missing, empty, or contains only spaces",
- "passoldinvalid": "The old password is incorrect",
- "passaddmore": [
- "For your security, passwords needs to be at least 8 characters long. Add",
- "more for your password to be at least 8 characters long."
- ],
- "passnewnomatch": "The two new passwords doesn't match",
- "keyinvalid": "Incorrect private key",
- "keynone": "No private key",
- "lgpassinvalid": "Incorrect password",
- "lgpassnone": "No password specified",
- "nostate": "No state specified",
- "catinvalid": "Invalid category",
- "catnone": "No category",
- "filesize": "The size of the photo is higher than the maximum size supported by the server",
- "fileform": "The maximum size of the form file has been exceeded",
- "fileincomplete": "The photo is incomplete (hasn't been entirely transmitted)",
- "filenotfound": "The server knows about the photo, but it hasn't been sent",
- "filenotempdir": "No temporary folder on the server",
- "filewriterror": "Unable to write to the disk",
- "fileint": "Another program interrupted sending the file",
- "filemime": "This file type is not supported. Please use a PNG, JPEG, or GIF image, and not a file of this type:",
- "filemime2": "This file type is not supported",
- "fileimgnotfound": "Image not found",
- "filenoid": "No identifier",
- "filemdcorrupt": [
- "The image metadata",
- "are corrupted, please delete the link in /data/webcontent/galery/pictures"
- ],
- "filecatnotfound": [
- "An image",
- "reference a category that doesn't exist anymore, please delete or change the link in /data/webcontent/galery/pictures"
- ],
- "mkcatnoname": "No name given",
- "mkcatexists": "A category with the same or a similar name already exists",
- "notheme": "No theme",
- "nocolor": "No color",
- "pgnotype": "No page type defined",
- "pgnotitle": "No title defined",
- "pgnocontent": "No content has been specified",
- "pgtitleempty": "The title cannot be empty",
- "pgtypenone": "This page type is unknown",
- "valueinv": "Invalid value",
- "valuenone": "No value",
- "calnoname": "No name",
- "calnodesc": "No description",
- "calnolink": "No link",
- "calnoday": "No day",
- "calnomonth": "No month",
- "calnoyear": "No year",
- "calinvalidday": "Invalid day compared to the selected month",
- "calpast": "Unable to create an event in the past",
- "calnamelong": "This event's name is too long. If you want to add more detials, add these in the description",
- "calnamenone": "The event name cannot be empty",
- "calsameday": "An event already exists this day",
- "calerror": "Unable to initialize the database",
- "calminmonths": [
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "May",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Oct",
- "Nov",
- "Dec"
- ],
- "calordinal": "1st",
- "sitenamenone": "The website name cannot be empty",
- "sitenameinvalid": "The website name contains invalid characters",
- "sitenamelong": "The website name is too long",
- "sitenamerecv": "No name received",
- "awmnone": "No AlwaysMenu passed",
- "olrnone": "No OldRenderer passed",
- "swpnone": "No ShowPages passed"
-}
diff --git a/Neutron-trunk/resources/i18n/en/calendar.json b/Neutron-trunk/resources/i18n/en/calendar.json
deleted file mode 100644
index 4077f5a..0000000
--- a/Neutron-trunk/resources/i18n/en/calendar.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "title": "Calendar",
- "corrupted": "Corrupted database",
- "past": "No past event",
- "newtab": "Open the website associated with this event in a new tab",
- "more": "Learn more (external website)",
- "today": "Today",
- "pasth": "Past events",
- "future": "No upcoming events",
- "pastp": "Past event",
- "futureh": "Upcoming events"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/editor.json b/Neutron-trunk/resources/i18n/en/editor.json
deleted file mode 100644
index 410fbaf..0000000
--- a/Neutron-trunk/resources/i18n/en/editor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "wrap": "Automatic word wrap",
- "save": "Save",
- "publish": "Publish",
- "publishnoback": "Publish and continue editing",
- "exit": "By quitting this page, all changes made will not be saved."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/error.json b/Neutron-trunk/resources/i18n/en/error.json
deleted file mode 100644
index 8af2850..0000000
--- a/Neutron-trunk/resources/i18n/en/error.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "title": "An error occurred",
- "message": [
- "We are sorry, but an error occurred while loading this page.",
- "If you clicked on a link, it may not be valid anymore, or another error type occurred."
- ],
- "direction": "Website home",
- "code": "Error",
- "other": "Internal error"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/gallery.json b/Neutron-trunk/resources/i18n/en/gallery.json
deleted file mode 100644
index 4bd2a58..0000000
--- a/Neutron-trunk/resources/i18n/en/gallery.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "title": "Photo gallery",
- "unclassed": "Uncategorized",
- "disabled": [
- "The ",
- "photo gallery",
- " is not enabled on this site"
- ],
- "nothing": "No photo in this category",
- "deleted": "Photo not found or incorrectly deleted, please contact the website admin",
- "preview": {
- "title": "Image preview",
- "invalid": "Invalid image URL",
- "notfound": "Image not found",
- "none": "No image",
- "close": "Close this image preview",
- "download": "Download image",
- "placeholder": [
- "Download the image as",
- "— you will be redirected to an external website if the image is situated on an external server"
- ]
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/header.json b/Neutron-trunk/resources/i18n/en/header.json
deleted file mode 100644
index 6ae91d5..0000000
--- a/Neutron-trunk/resources/i18n/en/header.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "internalError": [
- "Internal error",
- "The advanced settings file is in a known syntax, but doesn't includes required settings. The page stopped loading here.",
- "If you contact your system administrator, ask them to delete the ",
- " file, Neutron will generate a new one for you.",
- "The advanced settings file is in an unknown syntax, the page stopped loading here."
- ],
- "phpError": [
- "An error occurred while loading this page, detailed information has been saved in the log files.",
- "The error message in the log files generally starts with",
- "Please contact the website system administrator. If you are the system administrator, we suggest you investigate and fix the issue."
- ],
- "pjseDefault": [
- "Warning",
- "An internal and unknown system error occurred",
- "Close"
- ],
- "snackbarDefault": "Internal error",
- "errorError": "An error occurred while loading the error message"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/login.json b/Neutron-trunk/resources/i18n/en/login.json
deleted file mode 100644
index 0e8a847..0000000
--- a/Neutron-trunk/resources/i18n/en/login.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "title": "Website admin",
- "login": "Login",
- "password": "Password",
- "invalid": "Incorrect password",
- "uauth": "Login with authentication key",
- "auth": "Use authentication key",
- "pass": "Use administrator password",
- "upass": "Login with the administrator password",
- "authph": "Authentication key",
- "nokey": [
- "Loging in with an authentication key is not possible on the old login system version. Please go",
- "to the new system",
- "to use an authentication key."
- ],
- "redirect": "You have been redirected to the old login page because an error occured. Click {here} to retry."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/menu.json b/Neutron-trunk/resources/i18n/en/menu.json
deleted file mode 100644
index 567558e..0000000
--- a/Neutron-trunk/resources/i18n/en/menu.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "manage": "Manage this page",
- "widgets": "Show details",
- "back": "Back",
- "forward": "Forward",
- "refresh": "Refresh",
- "home": "Go back home",
- "admin": "Manage the website",
- "info": "Information"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/setup.json b/Neutron-trunk/resources/i18n/en/setup.json
deleted file mode 100644
index 05f9c4c..0000000
--- a/Neutron-trunk/resources/i18n/en/setup.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "ititle": "Configuration",
- "steps": [
- "Checking",
- "Error",
- "Welcome",
- "Graphic identity",
- "Saving",
- "Done",
- "Loading",
- "Your website",
- "License agreement",
- "Confirmation"
- ],
- "sitename": [
- "The name cannot be empty",
- "The name contains invalid characters",
- "The name is too long",
- "Longer name recommended",
- "Shorter name recommended",
- "This name seems perfect"
- ],
- "errors": [
- "Unable to finish setting up",
- "Communication error",
- "The connection with the distant server has been unexpectedly terminated during the process"
- ],
- "done": [
- "Done",
- "Your website is now correctly configured, and is ready to be seen by the entire world.",
- "To change its content and/or settings, you need to login to the admin interface. The default password is ",
- ". Don't forget to change it or your website could be vulnerable!"
- ],
- "links": [
- "Explore",
- "Finish",
- "I agree",
- "Next",
- "Start"
- ],
- "defaulterr": [
- "An error occurred",
- "Unknown error",
- "Restart setup"
- ],
- "sections": [
- "Preparing",
- "Checking your environment",
- "Welcome!",
- "Your website",
- "Graphic identity",
- "License agreement",
- "Confirmation"
- ],
- "upload": [
- "Checking information",
- "Sending information",
- "Checking integrity",
- "Checking server"
- ],
- "warning": [
- "Do not quit this page",
- "This may take several minutes"
- ],
- "confirm": [
- "You have now finished the basic setup of Neutron, the server will now create the website according to your settings.",
- "This action wouldn't be cancellable, and may take several minutes depending on your server's speed. This includes checking your settings, your website's configuration, and checking the server."
- ],
- "license": "You need to accept this license agreement before you can use Neutron:",
- "logo": [
- "Import a logo for your website, we suggest that you use a square image (1:1 ratio) to prevent your logo from being stretched.",
- "You may not import a logo, which will show the default logo",
- "Import file"
- ],
- "name": [
- "Choose a name for your website.",
- "If you don't know what to choose, choose a short name, easy to remember, and that defines best the content you plan to publish on your website"
- ],
- "welcome": [
- "Thanks for choosing Neutron for your website, we appreciate your support.",
- "You will first need to configure it by selecting settings according to your choosing, such as the name, the logo and more. These settings are changeable later in the admin interface of your website.",
- "If you want to go back to the start of the setup or made an error, reload the page (using the « Reload » button on your browser). Unless you click on « Finish », nothing is being sent to the server."
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/sizes.json b/Neutron-trunk/resources/i18n/en/sizes.json
deleted file mode 100644
index 675ff7d..0000000
--- a/Neutron-trunk/resources/i18n/en/sizes.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "byte": "byte",
- "bytes": "bytes",
- "kib": "KiB",
- "mib": "MiB",
- "gib": "GiB",
- "tib": "TiB",
- "kibibytes": "kibibytes",
- "mebibytes": "mebibytes",
- "gibibytes": "gibibytes",
- "tebibytes": "tebibytes",
- "separator": "."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/spotlight.json b/Neutron-trunk/resources/i18n/en/spotlight.json
deleted file mode 100644
index 2f9ff0b..0000000
--- a/Neutron-trunk/resources/i18n/en/spotlight.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "search": "Search in Neutron administration interface..."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/version.json b/Neutron-trunk/resources/i18n/en/version.json
deleted file mode 100644
index 002ba1e..0000000
--- a/Neutron-trunk/resources/i18n/en/version.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "title": "Software version",
- "workswith": "This software is powered by ",
- "providedby": ", a software made by ",
- "description": " so that you can easily create websites, without any Web development or Web management knowledge.",
- "renderer": [
- " with the ",
- " rendering engine version "
- ],
- "freesoftware": [
- "This program is free software: you can redistribute it and/or modify it under the terms of the ",
- "GNU General Public License as published by the Free Software Foundation",
- ", either ",
- "version 3 ",
- "of the License, or (at your option) any later version."
- ],
- "warranty": [
- "This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ",
- "GNU General Public License ",
- "for more details."
- ],
- "resources": "Important resources",
- "support": "Software technical support/Feature requests",
- "mprj": "View on Minteck Projects' website",
- "minteck": "View on Minteck's space",
- "changelog": "Ask for a change in the update notes"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/viewer.json b/Neutron-trunk/resources/i18n/en/viewer.json
deleted file mode 100644
index bcbca5d..0000000
--- a/Neutron-trunk/resources/i18n/en/viewer.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "powered": "powered by",
- "manage": "Manage website",
- "home": "Home",
- "gallery": "Photo gallery",
- "close": "Close menu",
- "menutitle": "Open menu",
- "menudesktop": "More...",
- "menu": "Menu",
- "widgets": "Details",
- "widgetspane": "Website details",
- "widgets2": "Information",
- "logout": [
- "You are still logged in to your website's admin interface, click ",
- "here ",
- "to log out"
- ],
- "toc": "Table of contents",
- "bugs": "Report a bug",
- "system": "System informations",
- "galery": "Photo gallery"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/en/widgets.json b/Neutron-trunk/resources/i18n/en/widgets.json
deleted file mode 100644
index ce372dc..0000000
--- a/Neutron-trunk/resources/i18n/en/widgets.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "calendar": {
- "today": "Today",
- "nothing": "No upcoming event",
- "corrupt": "Calendar database corrupted",
- "more": "View all..."
- },
- "clock": {
- "ordinal": "1st",
- "days": [
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday",
- "Sunday"
- ],
- "months": [
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December"
- ]
- },
- "unconfigured": "The widget hasn't been configured yet",
- "test": {
- "welcome": "Welcome",
- "success": "Neutron has been successfully installed.",
- "admin": "Go to your admin interface to customize your website."
- },
- "views": {
- "intro": "You are the",
- "ordinals": {
- "1": "st",
- "2": "nd",
- "3": "rd",
- "4": "th"
- },
- "error": "error",
- "outro": "person to view this website today"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/$metadata.json b/Neutron-trunk/resources/i18n/fr/$metadata.json
deleted file mode 100644
index 40c2d7d..0000000
--- a/Neutron-trunk/resources/i18n/fr/$metadata.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "id": "fr",
- "name": "French",
- "localized_name": "Français",
- "encoding": "utf_8",
- "alphabet": "latin"
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-about.json b/Neutron-trunk/resources/i18n/fr/admin-about.json
deleted file mode 100644
index ba1520b..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-about.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "updates": {
- "beta": [
- "Votre site est potentiellement vulnérable",
- "Vous utilisez une préversion de Neutron"
- ],
- "ltsend": [
- "Votre site n'est pas protégé",
- "Le support à long terme de votre version est terminé, il vous est fortement recommandé de mettre à jour votre site vers la dernière version disposant du support à long terme"
- ],
- "ltsnew": [
- "Votre site est protégé",
- "Une nouvelle version sans support à long terme est disponible, mais vous utilisez une version disposant du support à long terme"
- ],
- "ltsuptodate": [
- "Votre site est protégé",
- "Neutron est à jour, vous exécutez une version disposant du support à long terme"
- ],
- "uptodate": [
- "Votre site est protégé",
- "Neutron est à jour"
- ],
- "newversion": [
- "Votre site n'est pas protégé",
- "Une mise à jour pour Neutron est disponible"
- ]
- },
- "version": {
- "prefix": "Votre serveur exécute Neutron version",
- "update": ", et la dernière version disponible est la version",
- "beta": ", et la dernière version stable en circulation est la version",
- "prerel": [
- " (préversion de ",
- ") "
- ],
- "channel": "Vous êtes sur le canal de mise à jour",
- "distrib": "→ Informations sur la distribution",
- "updates": "→ Gestionnaire de mises à jour"
- },
- "diskspace": [
- "Votre site utilise",
- "d'espace disque"
- ],
- "info": "Informations",
- "disk": "Espace disque",
- "changes": "Changements",
- "current": "Version actuelle",
- "nolog": "Aucune information concernant cette version de Neutron",
- "stable": "Dernière version stable",
- "beta": "Version stable en circulation",
- "exp": "Version de destination",
- "categories": {
- "system": "Fichiers système",
- "config": "Contenu et configuration",
- "resources": "Photos et autres ressources",
- "misc": "Fichiers inconnus"
- },
- "new": {
- "overview": "Vue d'ensemble",
- "version": "Versions de Neutron",
- "system": "Versions système",
- "types": [
- "Neutron Cloud, sécurité et fiabilité assurés, dans un environnement simple d'utilisation",
- "Neutron Auto-hébergé, gardez le contrôle sur votre infrastructure"
- ],
- "renderer": [
- "Version du moteur de rendu :",
- "Version de la couche de rétro-compatibilité de rendu :"
- ]
- }
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-advanced-dev.json b/Neutron-trunk/resources/i18n/fr/admin-advanced-dev.json
deleted file mode 100644
index a824a7e..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-advanced-dev.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "warning": "Modifiez ces paramètres avec les plus grandes précautions, car toute modification erronée peut empêcher votre site de fonctionner.",
- "remove": [
- "Si votre site ne fonctionne plus après une modification, demandez à votre administrateur système de supprimer le fichier",
- "Le logiciel se chargera de regénérer un nouveau fichier de paramètres avancés sans erreurs."
- ]
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-advanced-home.json b/Neutron-trunk/resources/i18n/fr/admin-advanced-home.json
deleted file mode 100644
index 80c84df..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-advanced-home.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "dev": "Préférences de développement",
- "regedit": "Explorateur de registre",
- "placeholders": {
- "dev": "Modifiez le fichier JSON des préférences de développement avancées",
- "regedit": "Explorez la base de registre de votre site"
- }
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-appearance.json b/Neutron-trunk/resources/i18n/fr/admin-appearance.json
deleted file mode 100644
index 34945ca..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-appearance.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "error": "Erreur inconnue",
- "site": "Nom du site :",
- "name": [
- "Le nom ne peut pas être vide",
- "Le nom contient des caractères invalides",
- "Le nom est trop long",
- "Nom plus long recommandé",
- "Nom plus court recommandé",
- "Ce nom semble parfait"
- ],
- "icon": "Modifier l'îcone",
- "banner": "Modifier la bannière",
- "alwaysmenu": "Afficher le lanceur même sur l'interface de bureau",
- "save": "Sauvegarder",
- "footer": "Modifier le pied de page",
- "fdesc": "Ce pied de page s'affiche sur toutes les pages de votre site",
- "publish": "Publier",
- "fdisc": [
- "Ce que vous voyez n'est pas forcément à ce que vous aurez.",
- "Le pied de page peut apparaître différement sur votre site final, selon votre configuration et votre navigateur. Le formattage de base apparaîtra tout de même exactement comme ci-dessus sur votre site."
- ],
- "password": "Modifier le mot de passe",
- "oldpass": "Ancien mot de passe :",
- "newpass": "Nouveau mot de passe :",
- "passrep": "Répéter le mot de passe :",
- "secure": "Utilisez un mot de passe sûr",
- "change": "Changer le mot de passe",
- "pages": [
- "Afficher ",
- " pages dans la barre de menu"
- ],
- "old": "Utiliser l'ancienne interface des pages",
- "oldopts": "Ces options ne s'appliquent que si vous utilisez l'ancienne interface :"
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-calendar.json b/Neutron-trunk/resources/i18n/fr/admin-calendar.json
deleted file mode 100644
index f9a19de..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-calendar.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "show": [
- "Afficher les",
- "prochains événements dans le widget."
- ],
- "events": "Événements",
- "manage": "Gérer",
- "manageph": "Gérer/supprimer l'événement",
- "corrupt": [
- "Important :",
- "La base de données du calendrier semble corrompue. Si vous n'avez pas effectué d'actions particulières récemment, cela peut venir de corruption du disque ou d'une intrusion dans votre serveur.",
- "Contactez votre administrateur système immédiatement"
- ],
- "nothing": "Aucun événement dans le calendrier pour le moment",
- "add": "Ajouter un nouvel événement",
- "addph": "Ajouter un nouvel événement au calendrier",
- "info": "Informations sur l'événement",
- "deleteask": "Supprimer l'événement ?",
- "deleteyes": "Oui",
- "deleteyesph": "Supprimer l'événement sélectionné",
- "deleteno": "Non",
- "deletenoph": "Ne pas supprimer l'événement sélectionné",
- "create": {
- "date": "Date",
- "day": "Jour :",
- "month": "Mois :",
- "trimesters": [
- "1er trimestre",
- "2nd trimestre",
- "3ème trimestre",
- "4ème trimestre"
- ],
- "months": [
- "Janvier",
- "Février",
- "Mars",
- "Avril",
- "Mai",
- "Juin",
- "Juillet",
- "Août",
- "Septembre",
- "Octobre",
- "Novembre",
- "Décembre"
- ],
- "year": "Année :",
- "info": "Informations",
- "name": "Nom de l'événement :",
- "nameph": "Nom de l'événement",
- "mandatory": "facultatif",
- "desc": "Description :",
- "descph": "Description",
- "web": "URL du site Internet :",
- "webph": "Lien externe",
- "notice": "La description de l'événement s'affichera entièrement sur le widget « Prochains événements », nous vous conseillons donc de ne pas écrire une description trop longue",
- "complete": "Ajouter l'événement"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-customization.json b/Neutron-trunk/resources/i18n/fr/admin-customization.json
deleted file mode 100644
index f0991b7..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-customization.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "color": "Couleur d'ambiance",
- "theme": "Thème",
- "dark": "Sombre",
- "light": "Clair",
- "auto": "Suivre l'option sur l'ordinateur du visiteur",
- "auto2": "Automatique",
- "colors": [
- "Bleu",
- "Vert",
- "Rouge",
- "Orange",
- "Violet",
- "Marron",
- "Gris"
- ],
- "colors2": [
- "Eau",
- "Feuille",
- "Tomate",
- "Orange",
- "Pourpre",
- "Boue",
- "Fumée"
- ],
- "descriptions": [
- "Utiliser l'option de l'ordinateur du visiteur, si supporté par le navigateur",
- "Laissez l'obscurité ressortir et apaiser les yeux des visiteurs",
- "Préférez voir la lumière du jour et garder une apparence professionnelle"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-errors.json b/Neutron-trunk/resources/i18n/fr/admin-errors.json
deleted file mode 100644
index 33bb009..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-errors.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "errorprefix": "Erreur : ",
- "connerror": "Erreur de communication",
- "housekeeping": [
- "Votre site risque d'être endommagé",
- "Aucune modification n'a été apportée sur votre site"
- ],
- "common": {
- "title": "Une erreur s'est produite",
- "message": "Oups, Neutron n'a pas fonctionné comme prévu...",
- "report": "Signaler un bogue",
- "home": "Accueil de l'administration"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-flags.json b/Neutron-trunk/resources/i18n/fr/admin-flags.json
deleted file mode 100644
index 7de7b03..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-flags.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "notice": "Il s'agit de fonctionnalités expérimentales qui ne devraient pas être activées sur un site où la fiabilité est importante. Elles n'ont pas été suffisament testées pour être activées par défaut et sont disponibles ici."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-gallery.json b/Neutron-trunk/resources/i18n/fr/admin-gallery.json
deleted file mode 100644
index e46abf8..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-gallery.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "general": {
- "title": "Aperçu global",
- "label": "Étiquetter"
- },
- "none": "Aucune",
- "lists": {
- "categories": "catégorie",
- "picture": " photo"
- },
- "categories": {
- "add": "Créer une nouvelle catégorie",
- "title": "Catégories",
- "edit": "Pour modifier une catégorie, supprimez-la et recréez la.",
- "delete": "Supprimer"
- },
- "pictures": {
- "title": "Photos",
- "none": "Aucune photo n'a été ajoutée à la galerie de photos.",
- "add": "Publier une nouvelle photo",
- "download": "Télécharger",
- "delete": "Supprimer"
- },
- "delete": {
- "title": [
- "Vous allez supprimer cette image et la dépublier du site.",
- "Cette action est irréversible et l'image ne pourra pas être récupérée..."
- ],
- "removing": "Suppression de l'image...",
- "category": "Vous allez supprimer cette catégorie, cette action est irréversible. Toutes les images dans cette catégorie seront déclassées.",
- "catrm": "Suppression de la catégorie..."
- },
- "label": "Entrez la nouvelle étiquette pour cette image",
- "labelling": "Étiquetage de l'image...",
- "addcat": {
- "placeholder": "Nom de la catégorie",
- "same": "Si une catégorie du même nom existe déjà, rien ne se passera",
- "confirm": "Créer la catégorie"
- },
- "publish": {
- "category": "Catégorie :",
- "default": "Non classé",
- "file": "Fichier de la photo :",
- "max": "Taille maximale :",
- "publish": "Publier la photo"
- }
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-home.json b/Neutron-trunk/resources/i18n/fr/admin-home.json
deleted file mode 100644
index 80a0095..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-home.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "greeting": "Bienvenue ! En quoi pouvons-nous vous aider ?",
- "language": "Changer de langue",
- "home": "Accueil",
- "updates": [
- "Des mises à jour sont prêtes à être installées",
- "→ Installer maintenant"
- ],
- "items": [
- "Pages",
- "Calendrier",
- "Galerie",
- "Apparence",
- "Données",
- "Maintenance",
- "Tous les paramètres",
- "Précédent",
- "Déconnexion",
- "Retourner au site"
- ],
- "appearance": {
- "greeting": "Modifiez l'aspect visuel de votre site ...",
- "items": [
- "Général",
- "Thème",
- "Construction visuelle",
- "Langue et région",
- "Fonctionnalités optionnelles",
- "Drapeaux de fonctionnalité"
- ]
- },
- "data": {
- "greeting": "Consultez les données collectées par votre site ...",
- "items": [
- "Statistiques",
- "Historique d'activité",
- "Trace du moteur de rendu"
- ]
- },
- "housekeeping": {
- "greeting": "Nettoyez votre site afin qu'il conserve son efficacité ...",
- "items": [
- "Réinitialisation",
- "À propos du logiciel",
- "Mise à jour du logiciel"
- ]
- },
- "search": "Rechercher des paramètres",
- "find": "Trouver un paramètre...",
- "all": "Tous les paramètres",
- "categories": [
- "Pages",
- "Galerie de photos",
- "Calendrier",
- "Fonctionnalités optionnelles",
- "Configuration technique",
- "Données",
- "Mises à jour et informations",
- "Apparence visuel et comportement"
- ],
- "allitems": [
- "Gérer toutes les pages",
- "Créer une nouvelle page",
- "Gérer les images de la galerie",
- "Importer une nouvelle photo dans la galerie",
- "Ajouter une nouvelle catégorie de la galerie",
- "Consulter la galerie dans l'espace visiteur",
- "Gérer les événements du calendrier",
- "Ajouter un nouvel événement dans le calendrier",
- "Consulter le calendrier dans l'espace visiteur",
- "Gérer les fonctionnalités optionnelles",
- "Configurer les informations de contact",
- "Modifier le contenu des notes",
- "Toutes les configurations techniques",
- "Modifier la configuration étendue",
- "Inspecter la configuration système",
- "Options de réinitialisation du site",
- "Consulter les informations de statistiques",
- "Lire les fichiers journaux des accès au site",
- "Voir la trace de la pile du moteur de rendu",
- "Consulter des informations sur la version du logiciel",
- "Obtenir des informations sur les mises à jour",
- "Télécharger et installer des mises à jour",
- "Modifier l'apparence générale du site",
- "Adapter le thème de couleur et la luminosité du site",
- "Accéder à la page d'accueil du studio de personnalisation",
- "Modifier la feuille de styles personnalisées avec le logiciel EasyCSS",
- "Changer la langue d'affichage de tout le site",
- "Modifier les drapeaux de fonctionnalité (Features Flags)"
- ],
- "nofound": "Aucun résultat",
- "one": "1 résultat",
- "multiple": " résultats"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-housekeeping.json b/Neutron-trunk/resources/i18n/fr/admin-housekeeping.json
deleted file mode 100644
index 8c4c7ee..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-housekeeping.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "reset": "Réinitialiser le site",
- "resetph": "Supprimer toutes les données concernant votre site et restaurer Neutron aux valeurs d'usines",
- "disclaimer": [
- "Cette action aura pour effet de supprimer :",
- "toutes les pages de votre site",
- "toutes les images des galeries de photo",
- "les images de l'icône et de la bannière",
- "les informations du nom de votre site, et le pied de page"
- ],
- "confirm": "Entrez le nom de votre site dans le champ suivant pour pouvoir le réinitialiser :",
- "confirmboxph": "Nom de votre site",
- "confirmbutton": "Réinitialiser",
- "select": [
- "Sélectionnez comment nous devons réinitialiser votre site :",
- "Cette action est irréversible et les données supprimées ou modifiées le seront irrémédiablement",
- "Conserver le contenu",
- "Réinitialise la configuration de votre site et conserve le contenu que vous y avez inséré. Utile si vous rencontrez des problèmes avec votre site ou que vous avez besoin d'espace disque supplémentaire.",
- "Tout supprimer",
- "Supprimer toutes les données de votre site et vous redirige vers l'utilitaire de première configuration. Utile si vous souhaitez recréer votre site depuis le début, ou qu'une mise à jour a causé des problèmes.",
- "La réinitialisation de votre site est en cours...",
- "Ne quittez pas cette page"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-login.json b/Neutron-trunk/resources/i18n/fr/admin-login.json
deleted file mode 100644
index 5e3193a..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-login.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "modes": [
- "Mot de passe",
- "Clé privée"
- ],
- "password": "Mot de passe",
- "key": "Clé privée d'authentification",
- "confirm": "Se connecter",
- "back": "retourner au site",
- "report": "signaler un bug",
- "branding": "fonctionne avec Neutron"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-logs.json b/Neutron-trunk/resources/i18n/fr/admin-logs.json
deleted file mode 100644
index c812da8..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-logs.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "nothing": [
- "Aucun événement n'a encore été enregistré",
- "Cela semble étrange, vérifiez les droits d'accès de votre serveur et la configuration de PHP"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-pages.json b/Neutron-trunk/resources/i18n/fr/admin-pages.json
deleted file mode 100644
index d9cc761..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-pages.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "home": "Accueil",
- "alore": "Ajouter une nouvelle page à votre site",
- "create": "Créer une page",
- "edit": "Modifier",
- "editl": "Modifier le contenu de la page sélectionnée",
- "renamel": "Renommer et modifier l'URL de cette page",
- "rename": "Renommer",
- "deletel": "Supprimer définitivement la page sélectionnée",
- "delete": "Supprimer",
- "pagename": "Nom de la page",
- "editors": [
- "Éditeur visuel",
- "Éditeur HTML"
- ],
- "editordescs": [
- "Modifiez la page comme s'il s'agissait d'un document sur un logiciel de traitement de texte",
- "Écrivez vous-même le code source de la page pour plus de liberté et de personnalisation"
- ],
- "quitwarn": "En quittant cette page, vous perdrez les modifications non enregistrées.",
- "saved": "La page a bien été sauvegardée",
- "deletec": [
- "Voulez-vous vraiment supprimer la page « ",
- " » ? Cette action est irréversible et peut entraîner des effets indésirables.",
- "Vous ne pouvez pas supprimer la page d'accueil de votre site"
- ],
- "deleteyl": "Supprimer la page sélectionnée",
- "deletey": "Oui",
- "deletenl": "Annuler la suppression de la page sélectionnée",
- "deleten": "Non",
- "renamew": [
- "Vous allez renommer la page « ",
- " », cela peut entraîner des effets indésirables, d'autant qu'aucune redirection ne sera créée.",
- "Vous ne pouvez pas renommer la page d'accueil de votre site"
- ],
- "oname": "Ancien nom",
- "onamep": "# Erreur #",
- "nname": "Nouveau nom",
- "renamel2": "Renommer la page",
- "rename2": "Renommer",
- "editcode": "Modifier le code de cette page"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-plugins.json b/Neutron-trunk/resources/i18n/fr/admin-plugins.json
deleted file mode 100644
index 838e175..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-plugins.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "newnotice": "Activez ou désactivez des fonctionnalités optionnelles pour ajuster votre site selon vos envies.",
- "builtin": "extension préinstallée",
- "config": "Modifier les paramètres de cette fonctionnalité",
- "store": "Voir cette extension sur le CMS Store",
- "remove": "Désinstaller l'extension",
- "tip": [
- "Conseil :",
- " Vous pouvez installer de nouvelles extensions depuis le ",
- ", une bibliothèque de toutes les extensions pour Neutron"
- ],
- "saved": "Modifications sauvegardées avec succès",
- "widgetconf": {
- "saveph": "Sauvegarder la configuration de l'extension",
- "save": "Sauvegarder",
- "textedit": "Entrez le texte qui devra être affiché dans la barre des widgets. L'édition \"inline\" uniquement est supportée (pas de titres, tableaux, etc...)."
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-stats.json b/Neutron-trunk/resources/i18n/fr/admin-stats.json
deleted file mode 100644
index f19887c..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-stats.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "thisMonth": "Visites du site ce mois",
- "disclaimer": "Certaines informations peuvent être inexactes",
- "year": "Visites totales cette année",
- "last": "Visites totales l'année dernière",
- "last2": "Visites totales en ",
- "months": [
- "Janvier",
- "Février",
- "Mars",
- "Avril",
- "Mai",
- "Juin",
- "Juillet",
- "Août",
- "Septembre",
- "Octobre",
- "Novembre",
- "Décembre"
- ],
- "monthslc": [
- "janvier",
- "février",
- "mars",
- "avril",
- "mai",
- "juin",
- "juillet",
- "août",
- "septembre",
- "octobre",
- "novembre",
- "décembre"
- ],
- "separator": " :",
- "visits": "visite(s)",
- "visit1": "visiteur",
- "visits2": "visiteurs",
- "new": "Nouveau système de statistiques",
- "old": "Ancien système de statistiques",
- "notice": "Ce site était anciennement sous Neutron 8 Beta 3 ou précédent. À partir de Neutron 8, le système de statistiques a été réécrit de façon à ne compter qu'une seule fois une personne même si elle visite plusieurs pages du site. Nous vous conseillons donc de ne pas tenir compte des anciennes statistiques, elles ne sont affichées qu'à titre d'information."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/admin-titles.json b/Neutron-trunk/resources/i18n/fr/admin-titles.json
deleted file mode 100644
index cdffb8f..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-titles.json
+++ /dev/null
@@ -1,151 +0,0 @@
-{
- "$notice": "Please keep this file AS CLEAN as possible, because it is automatically parsed by the precontent.php file in the admin system. Values names MUST BE admin pages names (except for fallback value) !",
-
- "suffix": "Administration",
- "fallback": "Page sans titre",
- "fallback-subpages": "Sous-page sans titre",
- "home": {
- "dom": "Accueil",
- "header": "Votre site",
- "subpages": {
- "appearance": {
- "dom": "Apparance",
- "header": "Options d'apparance"
- },
- "data": {
- "dom": "Données",
- "header": "Statistiques et autres données"
- },
- "housekeeping": {
- "dom": "Maintenance",
- "header": "Options de maintenance"
- },
- "all": {
- "dom": "Tout",
- "header": "Tous les paramètres"
- }
- }
- },
- "$error": {
- "dom": "Erreur",
- "header": "Erreur"
- },
- "pages": {
- "dom": "Pages",
- "header": "Pages du site",
- "subpages": {
- "manage": {
- "dom": "Gérer la page",
- "header": "Options de la page"
- },
- "edit": {
- "dom": "Modifier la page",
- "header": "Modification de la page"
- },
- "delete": {
- "dom": "Supprimer la page",
- "header": "Suppression de la page"
- },
- "rename": {
- "dom": "Renommer la page",
- "header": "Renommage de la page"
- },
- "add": {
- "dom": "Nouvelle page",
- "header": "Créer une page"
- }
- }
- },
- "gallery": {
- "dom": "Galerie de photos",
- "header": "Galerie de photos",
- "subpages": {
- "addcategory": {
- "dom": "Nouvelle catégorie",
- "header": "Créer une nouvelle catégorie"
- },
- "publish": {
- "dom": "Nouvelle photo",
- "header": "Ajouter une nouvelle photo"
- }
- }
- },
- "calendar": {
- "dom": "Calendrier",
- "header": "Événements",
- "subpages": {
- "add": {
- "dom": "Nouvel événement",
- "header": "Ajouter un nouvel événement"
- },
- "manage": {
- "dom": "Gérer l'événement",
- "header": "Paramètres de l'événement"
- }
- }
- },
- "language": {
- "dom": "Langue et région",
- "header": "Paramètres régionaux du site"
- },
- "renderer": {
- "dom": "Moteur de rendu",
- "header": "Trace du moteur de rendu"
- },
- "flags": {
- "dom": "Drapeaux",
- "header": "Drapeaux de fonctionnalités"
- },
- "plugins": {
- "dom": "Fonctionnalités optionnelles",
- "header": "Fonctionnalités optionnelles",
- "subpages": {
- "widget-contact-configure": {
- "dom": "Options",
- "header": "Configuration de la fonctionnalité"
- },
- "widget-notes-configure": {
- "dom": "Options",
- "header": "Configuration de la fonctionnalité"
- }
- }
- },
- "advanced": {
- "dom": "Options avancés",
- "header": "Paramètres avancés du site",
- "subpages": {
- "jsonconf": {
- "dom": "Options pour les développeurs",
- "header": "Préférences de développement"
- }
- }
- },
- "housekeeping": {
- "dom": "Maintenance",
- "header": "Options de maintenance"
- },
- "reset": {
- "dom": "Réinitialisation",
- "header": "Réinitialisez votre site"
- },
- "about": {
- "dom": "À propos de Neutron",
- "header": "À propos du logiciel"
- },
- "appearance": {
- "dom": "Apparence",
- "header": "Apparence de votre site"
- },
- "customization": {
- "dom": "Personnalisation",
- "header": "Identité visuelle de votre site"
- },
- "logs": {
- "dom": "Historique d'activité",
- "header": "Dernières activités sur votre site"
- },
- "stats": {
- "dom": "Statistiques",
- "header": "Statistiques sur votre site"
- }
-}
diff --git a/Neutron-trunk/resources/i18n/fr/admin-v2.json b/Neutron-trunk/resources/i18n/fr/admin-v2.json
deleted file mode 100644
index afa7bae..0000000
--- a/Neutron-trunk/resources/i18n/fr/admin-v2.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "on-premises": "Auto-hébergé",
- "drawer": [
- "Système",
- "Contenu",
- "Personalisation",
- "Fonctionnalités",
- "Comptes",
- "Région & langue",
- "Données & sécurité",
- "Options avancées",
- "Neutron Cloud",
- "Serveur Web Electrode"
- ],
- "system_items": [
- "À propos de Neutron",
- "Journal d'audit",
- "Gérer la version",
- "Fermer la session"
- ],
- "system_descriptions": [
- "Afficher la version de Neutron et l'utilisation d'espace disque",
- "Voir la liste des accès aux pages et à l'administration",
- "Re-téléchargez Neutron pour installer une version plus récente",
- "Déconnectez-vous de manière sécurisée de l'administration du site"
- ],
- "content_items": [
- "Pages",
- "Galerie",
- "Calendrier"
- ],
- "content_descriptions": [
- "Créer, modifiez, déplacez et supprimez les pages de votre site",
- "Téléversez, catégorisez et supprimez les photos de la galerie de votre site",
- "Créez, changez ou supprimez des événements du calendrier"
- ],
- "personalization_items": [
- "Image de marque",
- "Couleur",
- "Pied de page & légal"
- ],
- "personalization_descriptions": [
- "Logo, bannière et nom du site",
- "Changez entre le thème clair ou sombre, ou changez le thème général",
- "Placer les mentions légales de votre site dans le pied de page"
- ],
- "features_items": [
- "Fonctionnalités optionnelles",
- "Paramètres expérimentaux"
- ],
- "features_descriptions": [
- "Activez des fonctionnalités supplémentaires qui étendent Neutron",
- "Paramètres expérimentaux qui pourraient rendre votre site instable"
- ],
- "accounts_items": [
- "Mot de passe",
- "Accès aux administrateurs"
- ],
- "accounts_descriptions": [
- "Changez le mot de passe que vous utilisez pour vous connecter à ce site",
- "Découvrez comment et ce que les administrateurs système voient"
- ],
- "security_items": [
- "Configuration étendue",
- "Statistiques"
- ],
- "security_descriptions": [
- "Options de durcissement et options de personnalisation avancées",
- "Informations sur le nombre de vues sur votre site"
- ],
- "maintenance_items": [
- "Options de réinitialisation"
- ],
- "maintenance_descriptions": [
- "Réinitialisez votre site aux paramètres d'usine ou réparez-le"
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/api.json b/Neutron-trunk/resources/i18n/fr/api.json
deleted file mode 100644
index 594fd5a..0000000
--- a/Neutron-trunk/resources/i18n/fr/api.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
- "token": "Jeton d'authentification invalide",
- "select": "Aucun élément sélectionné",
- "value": "Aucune valeur spécifiée",
- "incorrect": "La valeur est incorrecte",
- "param": "Pas de contenu passé comme paramètre",
- "missing": "Informations manquantes",
- "invchar": "Un ou plusieurs champs ont des valeurs contenants des caractères invalides",
- "advsyntax": "La syntaxe du fichier est incorrecte. Vérifiez les erreurs de l'éditeur de code et corrigez les, ou actualisez la page pour annuler les modifications apportées.",
- "pageselect": "Aucune page sélectionnée",
- "inforec": "Aucune information reçue par le serveur",
- "pgnameempty": "Le nouveau nom ne peut pas être vide",
- "pgnameinternal": "Vous ne pouvez pas utiliser un nom réservé en interne par le logiciel",
- "pgnameexists": "Une page du même nom existe déjà",
- "pgnamelong": "Le nouveau nom de la page est trop long",
- "pgnamenone": "Aucun nouveau nom spécifié",
- "pgnotfound": "La page n'existe pas",
- "pgnone": "Aucune page spécifiée",
- "fieldinvalid": "Certains champs sont manquants, vides, ou ne contiennent que des espaces",
- "passoldinvalid": "L'ancien mot de passe est incorrect",
- "passaddmore": [
- "Pour votre sécurité, les mots de passes doivent être long d'au moins 8 caractères. Ajoutez en encore",
- "pour que votre mot de passe ait 8 caractères"
- ],
- "passnewnomatch": "Les deux nouveaux mots de passes ne correspondent pas",
- "keyinvalid": "Clé privée incorrecte",
- "keynone": "Pas de clé privée",
- "lgpassinvalid": "Mot de passe incorrect",
- "lgpassnone": "Pas de mot de passe spécifié",
- "nostate": "Aucun état spécifié",
- "catinvalid": "Catégorie inexistante",
- "catnone": "Pas de catégorie",
- "filesize": "La taille du fichier de la photo dépasse la taille maximale imposée par le serveur",
- "fileform": "La taille maximale du fichier de formulaire à été dépassée",
- "fileincomplete": "La photo est incomplète (n'a pas été transmise entièrement)",
- "filenotfound": "La photo est renseignée au serveur, mais elle n'a pas été transmise",
- "filenotempdir": "Aucun dossier temporaire présent sur le serveur",
- "filewriterror": "Impossible d'écrire sur le disque",
- "fileint": "Un autre programme à interrompu la transmission du fichier",
- "filemime": "Le type de fichier de la photo n'est pas supporté. Merci d'utiliser une image PNG, JPEG, ou GIF, et non une image du type",
- "filemime2": "Le type de fichier de la photo n'est pas supporté",
- "fileimgnotfound": "Image introuvable",
- "filenoid": "Pas d'identifiant",
- "filemdcorrupt": [
- "Les métadonnées d'une image",
- "sont corrompues, veuillez supprimer le lien dans /data/webcontent/galery/pictures"
- ],
- "filecatnotfound": [
- "Une image",
- "fait référence à une catégorie qui n'existe pas, veuillez supprimer ou modifier le lien dans /data/webcontent/galery/pictures"
- ],
- "mkcatnoname": "Pas de nom donné",
- "mkcatexists": "Une catégorie du même nom ou d'un nom similaire existe déjà",
- "notheme": "Pas de thème",
- "nocolor": "Pas de couleur",
- "pgnotype": "Aucun type de page défini",
- "pgnotitle": "Aucun titre défini",
- "pgnocontent": "Aucun contenu n'a été spécifié",
- "pgtitleempty": "Le titre ne peut pas être vide",
- "pgtypenone": "Le type de page est inconnu",
- "valueinv": "Valeur invalide",
- "valuenone": "Aucune valeur",
- "calnoname": "Pas de nom",
- "calnodesc": "Pas de description",
- "calnolink": "Pas de lien",
- "calnoday": "Pas de jour",
- "calnomonth": "Pas de mois",
- "calnoyear": "Pas d'année",
- "calinvalidday": "Jour sélectionné invalide par rapport au mois sélectionné",
- "calpast": "Impossible de créer un événement dans le passé",
- "calnamelong": "Le nom de l'événement est trop long. Si vous avez des informations à ajouter, ajoutez les dans la description",
- "calnamenone": "Le nom de l'événement ne peut pas être vide",
- "calsameday": "Un événement existe déjà ce jour là",
- "calerror": "Impossible d'initialiser la base de données",
- "calminmonths": [
- "janv.",
- "févr.",
- "mars",
- "avr.",
- "mai",
- "juin",
- "juil.",
- "août",
- "sept.",
- "oct.",
- "nov.",
- "déc."
- ],
- "calordinal": "1er",
- "sitenamenone": "Le nom du site ne peut pas être vide",
- "sitenameinvalid": "Le nom du site contient des caractères invalides",
- "sitenamelong": "Le nom du site est trop long",
- "sitenamerecv": "Aucun nom n'a été reçu",
- "awmnone": "Pas d'AlwaysMenu passé",
- "olrnone": "Pas d'OldRenderer passé",
- "swpnone": "Pas de ShowPages passé"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/calendar.json b/Neutron-trunk/resources/i18n/fr/calendar.json
deleted file mode 100644
index 0de6389..0000000
--- a/Neutron-trunk/resources/i18n/fr/calendar.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "title": "Calendrier",
- "corrupted": "Base de données corrompue",
- "past": "Aucun événement passé",
- "newtab": "Ouvrir un site associé à cet événement dans un nouvel onglet",
- "more": "En savoir plus (site externe)",
- "today": "Aujourd'hui",
- "pasth": "Événements passés",
- "future": "Aucun événement à venir",
- "pastp": "Événement passé",
- "futureh": "Événements à venir"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/editor.json b/Neutron-trunk/resources/i18n/fr/editor.json
deleted file mode 100644
index 8eb734e..0000000
--- a/Neutron-trunk/resources/i18n/fr/editor.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "wrap": "Retour automatique à la ligne",
- "save": "Sauvegarder",
- "publish": "Publier",
- "publishnoback": "Publier et continuer à modifier",
- "exit": "En quittant cette page, vous perdrez les modifications non enregistrées sur cette page."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/error.json b/Neutron-trunk/resources/i18n/fr/error.json
deleted file mode 100644
index 79a35e9..0000000
--- a/Neutron-trunk/resources/i18n/fr/error.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "title": "Une erreur s'est produite",
- "message": [
- "Nous sommes désolés, mais une erreur s'est produite lors du chargement de la page.",
- "Si vous avez cliqué sur un lien, celui-ci n'est peut-être plus valide, ou alors un autre type d'erreur s'est produit."
- ],
- "direction": "Accueil du site",
- "code": "Erreur",
- "other": "Erreur interne"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/gallery.json b/Neutron-trunk/resources/i18n/fr/gallery.json
deleted file mode 100644
index d5035d4..0000000
--- a/Neutron-trunk/resources/i18n/fr/gallery.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "title": "Galerie de photos",
- "unclassed": "Non classé",
- "disabled": [
- "La ",
- "galerie de photos",
- " n'est pas activée sur ce site"
- ],
- "nothing": "Aucune photo dans cette catégorie",
- "deleted": "Photo introuvable ou supprimée incorrectement, veuillez contacter l'administrateur du site",
- "preview": {
- "title": "Prévisualisation de l'image",
- "invalid": "URL de l'image invalide",
- "notfound": "Image inexistante",
- "none": "Pas d'image",
- "close": "Fermer la prévisualisation de l'image",
- "download": "Télécharger l'image",
- "placeholder": [
- "Télécharger l'image au format",
- "— vous serez redirigé vers un site externe si l'image se trouve sur un serveur externe"
- ]
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/header.json b/Neutron-trunk/resources/i18n/fr/header.json
deleted file mode 100644
index 0557e53..0000000
--- a/Neutron-trunk/resources/i18n/fr/header.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "internalError": [
- "Erreur interne",
- "Le fichier des paramètres avancés est dans une syntaxe reconnue, mais ne contient pas certains paramètres requis. Le chargement de la page s'est arrêté ici.",
- "Si vous contactez votre administrateur système, demandez lui de supprimer le fichier ",
- ", Neutron se chargera d'en générer un nouveau pour vous.",
- "Le fichier des paramètres avancés n'est pas dans une syntaxe reconnue, le chargement de la page s'est arrêté ici."
- ],
- "phpError": [
- "Une erreur s'est produite lors du chargement de cette page, des informations détaillées ont été inscrites dans les fichiers journaux.",
- "Le message d'erreur dans les fichiers journaux commence généralement par",
- "Merci de contacter l'administrateur système du site. Si vous êtes l'administrateur système, nous vous conseillons d'analyser et de corriger cette erreur."
- ],
- "pjseDefault": [
- "Avertissement",
- "Une erreur interne de raison inconnue s'est produite",
- "Fermer"
- ],
- "snackbarDefault": "Erreur interne",
- "errorError": "Une erreur s'est produite lors du chargement du message d'erreur"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/login.json b/Neutron-trunk/resources/i18n/fr/login.json
deleted file mode 100644
index 0011e71..0000000
--- a/Neutron-trunk/resources/i18n/fr/login.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "title": "Administration du site",
- "login": "Connexion",
- "password": "Mot de passe",
- "invalid": "Le mot de passe est incorrect",
- "uauth": "Connexion avec la clé d'authentification",
- "auth": "Utiliser la clé d'authentification",
- "pass": "Utiliser le mot de passe d'administration",
- "upass": "Connexion avec le mot de passe d'administration",
- "authph": "Clé d'authentification",
- "nokey": [
- "La connexion à partir d'une clé d'authentification n'est plus disponible sur l'ancienne version du système de connexion. Veuillez",
- "accéder au nouveau système",
- "pour utiliser votre clé d'authentification."
- ],
- "redirect": "Vous avez été redirigé vers l'ancienne page de connexion car une erreur s'est produite. Cliquez {ici} pour réessayer."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/menu.json b/Neutron-trunk/resources/i18n/fr/menu.json
deleted file mode 100644
index 00ff3de..0000000
--- a/Neutron-trunk/resources/i18n/fr/menu.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "manage": "Gérer cette page",
- "widgets": "Afficher les détails",
- "back": "Précédent",
- "forward": "Suivant",
- "refresh": "Actualiser",
- "home": "Retourner à l'accueil",
- "admin": "Gérer le site",
- "info": "Informations"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/setup.json b/Neutron-trunk/resources/i18n/fr/setup.json
deleted file mode 100644
index ad3292d..0000000
--- a/Neutron-trunk/resources/i18n/fr/setup.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "ititle": "Configuration",
- "steps": [
- "Vérification",
- "Erreur",
- "Bienvenue",
- "Identité graphique",
- "Sauvegarde",
- "Terminé",
- "Chargement",
- "Votre site",
- "Contrat de licence",
- "Confirmation"
- ],
- "sitename": [
- "Le nom ne peut pas être vide",
- "Le nom contient des caractères invalides",
- "Le nom est trop long",
- "Nom plus long recommandé",
- "Nom plus court recommandé",
- "Ce nom semble parfait"
- ],
- "errors": [
- "Impossible de terminer la configuration",
- "Erreur de communication",
- "La connexion avec le serveur distant a été intérrompue inopinément pendant la transmission des données"
- ],
- "done": [
- "Terminé",
- "Votre site est maintenant correctement configuré, et est prêt à être visité par le monde entier.",
- "Pour modifier son contenu et/ou ses paramètres, vous devez vous connecter à l'interface d'administration. Le mot de passe est ",
- ". Pensez à le modifier ou votre site pourrait être vulnérable !"
- ],
- "links": [
- "Explorer",
- "Terminer",
- "J'accepte",
- "Suivant",
- "Commencer"
- ],
- "defaulterr": [
- "Une erreur s'est produite",
- "Erreur inconnue",
- "Relancer la configuration"
- ],
- "sections": [
- "Préparation",
- "Vérification de votre environnement",
- "Bienvenue !",
- "Votre site",
- "Identité graphique",
- "Contrat de licence",
- "Confirmation"
- ],
- "upload": [
- "Vérification des informations",
- "Envoi des informations",
- "Vérification de l'intégrité",
- "Vérification du serveur"
- ],
- "warning": [
- "Ne quittez pas cette page",
- "Cela peut prendre plusieurs minutes"
- ],
- "confirm": [
- "Vous avez terminé la configuration basique de Neutron, le serveur va maintenant créer le site selon vos paramètres.",
- "Cette action ne pourra pas être annulée, et peut prendre plusieurs minutes selon la vitesse de votre serveur. Cela inclut une vérification de vos paramètres, la configuration de votre site, et la vérification de votre serveur."
- ],
- "license": "Vous devez accepter le suivant contrat de licence avant de commencer à utiliser Neutron :",
- "logo": [
- "Importez un logo pour votre site, nous vous conseillons d'utiliser une image carrée (ratio 1:1) afin d'éviter que le logo soit étiré.",
- "Vous pouvez ne pas importer de logo, ce qui affichera le logo par défaut",
- "Importer un fichier"
- ],
- "name": [
- "Choisissez un nom pour votre site.",
- "Si vous ne savez pas quoi choisir, choisissez un nom court, facile à retenir, et qui définit bien le contenu que vous allez poster sur votre site"
- ],
- "welcome": [
- "Merci d'avoir choisi Neutron pour votre site Web, nous apprécions votre soutien.",
- "Vous allez d'abord devoir le configurer en choisissant certains paramètres selon ce que vous voulez, tels que le nom, le logo et autre. Ces paramètres pourront être modifiés plus tard dans l'espace d'administration de votre site.",
- "Si vous voulez revenir au début de la configuration ou que vous avez fait une erreur, rechargez la page (en utilisant le bouton « Actualiser » sur votre navigateur). Tant que vous ne cliquez pas sur « Terminer », aucune communication n'est effectuée vers le serveur."
- ]
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/sizes.json b/Neutron-trunk/resources/i18n/fr/sizes.json
deleted file mode 100644
index 846bb81..0000000
--- a/Neutron-trunk/resources/i18n/fr/sizes.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "byte": "octet",
- "bytes": "octets",
- "kib": "Kio",
- "mib": "Mio",
- "gib": "Gio",
- "tib": "Tio",
- "kibibytes": "kibioctets",
- "mebibytes": "mébioctets",
- "gibibytes": "gibioctets",
- "tebibytes": "tébioctets",
- "separator": ","
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/spotlight.json b/Neutron-trunk/resources/i18n/fr/spotlight.json
deleted file mode 100644
index a4e0dbd..0000000
--- a/Neutron-trunk/resources/i18n/fr/spotlight.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "search": "Trouver dans l'administration de Neutron..."
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/version.json b/Neutron-trunk/resources/i18n/fr/version.json
deleted file mode 100644
index 21e80f3..0000000
--- a/Neutron-trunk/resources/i18n/fr/version.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "title": "Version du logiciel",
- "workswith": "Ce site fonctionne en utilisant ",
- "providedby": ", un logiciel fourni par ",
- "description": " pour créer des sites Web facilement et rapidement, et sans même avoir une quelconque connaissance en développement Web ou en gestion de sites Web.",
- "renderer": [
- " avec le moteur de rendu ",
- " version "
- ],
- "freesoftware": [
- "Ce logiciel est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier sous les termes de la ",
- "licence publique générale GNU comme publiée par la Free Software Foundation",
- ", soit la ",
- "version 3 ",
- "de la Licence, soit (selon votre choix) n'importe quelle version supérieure."
- ],
- "warranty": [
- "Ce logiciel est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; même pas la garantie implicite de VALEUR MARCHANDE ou d'APTITUDE À UNE UTILISATION SPÉCIFIQUE. Consultez la ",
- "licence publique générale GNU ",
- "pour plus de détails."
- ],
- "resources": "Ressources importantes",
- "support": "Support technique du logiciel/Suggestions de fonctionnalités",
- "mprj": "Voir sur le site de Minteck Projects",
- "minteck": "Voir sur l'espace de Minteck",
- "changelog": "Demander un changement dans les notes de mise à jour"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/viewer.json b/Neutron-trunk/resources/i18n/fr/viewer.json
deleted file mode 100644
index 02412fc..0000000
--- a/Neutron-trunk/resources/i18n/fr/viewer.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "powered": "fonctionne sur",
- "manage": "Gérer le site",
- "home": "Accueil",
- "gallery": "Galerie de photos",
- "close": "Fermer le menu",
- "menutitle": "Ouvrir le menu",
- "menudesktop": "Plus...",
- "menu": "Menu",
- "widgets": "Détails",
- "widgetspane": "Détails du site",
- "widgets2": "Informations",
- "logout": [
- "Vous êtes encore connecté à l'administration de votre site, cliquez ",
- "ici ",
- "pour vous déconnecter"
- ],
- "toc": "Table des matières",
- "bugs": "Signaler un bug",
- "system": "Informations système",
- "galery": "Galerie de photos"
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/i18n/fr/widgets.json b/Neutron-trunk/resources/i18n/fr/widgets.json
deleted file mode 100644
index f4ff8a0..0000000
--- a/Neutron-trunk/resources/i18n/fr/widgets.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "calendar": {
- "today": "Aujourd'hui",
- "nothing": "Aucun événement à venir",
- "corrupt": "Base de données du calendrier corrompue",
- "more": "Tout voir..."
- },
- "clock": {
- "ordinal": "1er",
- "days": [
- "lundi",
- "mardi",
- "mercredi",
- "jeudi",
- "vendredi",
- "samedi",
- "dimanche"
- ],
- "months": [
- "janvier",
- "février",
- "mars",
- "avril",
- "mai",
- "juin",
- "juillet",
- "août",
- "septembre",
- "octobre",
- "novembre",
- "décembre"
- ]
- },
- "unconfigured": "Le widget n'a pas été configuré",
- "test": {
- "welcome": "Bienvenue",
- "success": "Votre installation de Neutron s'est déroulée correctement.",
- "admin": "Accédez à l'administration pour personnaliser votre site."
- },
- "views": {
- "intro": "Vous êtes la",
- "ordinals": {
- "1": "ère",
- "2": "nde",
- "3": "ème",
- "4": "ème"
- },
- "error": "erreur",
- "outro": "personne à visiter ce site aujourd'hui"
- }
-}
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/admin.svg b/Neutron-trunk/resources/image/admin.svg
deleted file mode 100644
index 8ce4765..0000000
--- a/Neutron-trunk/resources/image/admin.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/admin2/about.png b/Neutron-trunk/resources/image/admin2/about.png
deleted file mode 100644
index 80c5733..0000000
Binary files a/Neutron-trunk/resources/image/admin2/about.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/accounts.png b/Neutron-trunk/resources/image/admin2/accounts.png
deleted file mode 100644
index 0d33522..0000000
Binary files a/Neutron-trunk/resources/image/admin2/accounts.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/advanced.png b/Neutron-trunk/resources/image/admin2/advanced.png
deleted file mode 100644
index 8d78638..0000000
Binary files a/Neutron-trunk/resources/image/admin2/advanced.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/audit.png b/Neutron-trunk/resources/image/admin2/audit.png
deleted file mode 100644
index 9a61de1..0000000
Binary files a/Neutron-trunk/resources/image/admin2/audit.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/branding.png b/Neutron-trunk/resources/image/admin2/branding.png
deleted file mode 100644
index dc43ca4..0000000
Binary files a/Neutron-trunk/resources/image/admin2/branding.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/calendar.png b/Neutron-trunk/resources/image/admin2/calendar.png
deleted file mode 100644
index bf4944c..0000000
Binary files a/Neutron-trunk/resources/image/admin2/calendar.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/cloud.png b/Neutron-trunk/resources/image/admin2/cloud.png
deleted file mode 100644
index d942e7e..0000000
Binary files a/Neutron-trunk/resources/image/admin2/cloud.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/colour.png b/Neutron-trunk/resources/image/admin2/colour.png
deleted file mode 100644
index 3f2c452..0000000
Binary files a/Neutron-trunk/resources/image/admin2/colour.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/content.png b/Neutron-trunk/resources/image/admin2/content.png
deleted file mode 100644
index dd12b3e..0000000
Binary files a/Neutron-trunk/resources/image/admin2/content.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/electrode.png b/Neutron-trunk/resources/image/admin2/electrode.png
deleted file mode 100644
index 6211e78..0000000
Binary files a/Neutron-trunk/resources/image/admin2/electrode.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/enter.png b/Neutron-trunk/resources/image/admin2/enter.png
deleted file mode 100644
index 679adc7..0000000
Binary files a/Neutron-trunk/resources/image/admin2/enter.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/features.png b/Neutron-trunk/resources/image/admin2/features.png
deleted file mode 100644
index 10a7045..0000000
Binary files a/Neutron-trunk/resources/image/admin2/features.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/flag.png b/Neutron-trunk/resources/image/admin2/flag.png
deleted file mode 100644
index 3ea37f6..0000000
Binary files a/Neutron-trunk/resources/image/admin2/flag.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/footer.png b/Neutron-trunk/resources/image/admin2/footer.png
deleted file mode 100644
index 7d042da..0000000
Binary files a/Neutron-trunk/resources/image/admin2/footer.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/gallery.png b/Neutron-trunk/resources/image/admin2/gallery.png
deleted file mode 100644
index aae2b38..0000000
Binary files a/Neutron-trunk/resources/image/admin2/gallery.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/home.png b/Neutron-trunk/resources/image/admin2/home.png
deleted file mode 100644
index 05f2f1f..0000000
Binary files a/Neutron-trunk/resources/image/admin2/home.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/install.png b/Neutron-trunk/resources/image/admin2/install.png
deleted file mode 100644
index 6d81ebf..0000000
Binary files a/Neutron-trunk/resources/image/admin2/install.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/language.png b/Neutron-trunk/resources/image/admin2/language.png
deleted file mode 100644
index e460fa1..0000000
Binary files a/Neutron-trunk/resources/image/admin2/language.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/locale.png b/Neutron-trunk/resources/image/admin2/locale.png
deleted file mode 100644
index 256a9d7..0000000
Binary files a/Neutron-trunk/resources/image/admin2/locale.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/logoff.png b/Neutron-trunk/resources/image/admin2/logoff.png
deleted file mode 100644
index a01434b..0000000
Binary files a/Neutron-trunk/resources/image/admin2/logoff.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/maintenance.png b/Neutron-trunk/resources/image/admin2/maintenance.png
deleted file mode 100644
index 6e53b11..0000000
Binary files a/Neutron-trunk/resources/image/admin2/maintenance.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/minteck-admin.png b/Neutron-trunk/resources/image/admin2/minteck-admin.png
deleted file mode 100644
index 258446e..0000000
Binary files a/Neutron-trunk/resources/image/admin2/minteck-admin.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/optional.png b/Neutron-trunk/resources/image/admin2/optional.png
deleted file mode 100644
index 7f67ea0..0000000
Binary files a/Neutron-trunk/resources/image/admin2/optional.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/pages.png b/Neutron-trunk/resources/image/admin2/pages.png
deleted file mode 100644
index 1b832ea..0000000
Binary files a/Neutron-trunk/resources/image/admin2/pages.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/password.png b/Neutron-trunk/resources/image/admin2/password.png
deleted file mode 100644
index 45cb0d7..0000000
Binary files a/Neutron-trunk/resources/image/admin2/password.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/personalization.png b/Neutron-trunk/resources/image/admin2/personalization.png
deleted file mode 100644
index a3f44a7..0000000
Binary files a/Neutron-trunk/resources/image/admin2/personalization.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/reset.png b/Neutron-trunk/resources/image/admin2/reset.png
deleted file mode 100644
index 5c488f8..0000000
Binary files a/Neutron-trunk/resources/image/admin2/reset.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/security.png b/Neutron-trunk/resources/image/admin2/security.png
deleted file mode 100644
index c1359de..0000000
Binary files a/Neutron-trunk/resources/image/admin2/security.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/selected.png b/Neutron-trunk/resources/image/admin2/selected.png
deleted file mode 100644
index 4716244..0000000
Binary files a/Neutron-trunk/resources/image/admin2/selected.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/stats.png b/Neutron-trunk/resources/image/admin2/stats.png
deleted file mode 100644
index 9eff0d9..0000000
Binary files a/Neutron-trunk/resources/image/admin2/stats.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/admin2/system.png b/Neutron-trunk/resources/image/admin2/system.png
deleted file mode 100644
index c3947c0..0000000
Binary files a/Neutron-trunk/resources/image/admin2/system.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/close.svg b/Neutron-trunk/resources/image/close.svg
deleted file mode 100644
index e7261bc..0000000
--- a/Neutron-trunk/resources/image/close.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/codename.jpg b/Neutron-trunk/resources/image/codename.jpg
deleted file mode 100644
index 76ead71..0000000
Binary files a/Neutron-trunk/resources/image/codename.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/config.jpg b/Neutron-trunk/resources/image/config.jpg
deleted file mode 100644
index b8c1854..0000000
Binary files a/Neutron-trunk/resources/image/config.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/config_back.svg b/Neutron-trunk/resources/image/config_back.svg
deleted file mode 100644
index 5ca0d1e..0000000
--- a/Neutron-trunk/resources/image/config_back.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_explore.svg b/Neutron-trunk/resources/image/config_explore.svg
deleted file mode 100644
index 6d0452c..0000000
--- a/Neutron-trunk/resources/image/config_explore.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_file_import.svg b/Neutron-trunk/resources/image/config_file_import.svg
deleted file mode 100644
index 131f1c3..0000000
--- a/Neutron-trunk/resources/image/config_file_import.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_file_replace.svg b/Neutron-trunk/resources/image/config_file_replace.svg
deleted file mode 100644
index 9d7486d..0000000
--- a/Neutron-trunk/resources/image/config_file_replace.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_finish.svg b/Neutron-trunk/resources/image/config_finish.svg
deleted file mode 100644
index 8f8bf11..0000000
--- a/Neutron-trunk/resources/image/config_finish.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_next.svg b/Neutron-trunk/resources/image/config_next.svg
deleted file mode 100644
index 892f4bd..0000000
--- a/Neutron-trunk/resources/image/config_next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/config_restart.svg b/Neutron-trunk/resources/image/config_restart.svg
deleted file mode 100644
index c2dea82..0000000
--- a/Neutron-trunk/resources/image/config_restart.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/contact_address.svg b/Neutron-trunk/resources/image/contact_address.svg
deleted file mode 100644
index 130799a..0000000
--- a/Neutron-trunk/resources/image/contact_address.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/contact_email.svg b/Neutron-trunk/resources/image/contact_email.svg
deleted file mode 100644
index 1ed4686..0000000
--- a/Neutron-trunk/resources/image/contact_email.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/contact_phone.svg b/Neutron-trunk/resources/image/contact_phone.svg
deleted file mode 100644
index 6b09749..0000000
--- a/Neutron-trunk/resources/image/contact_phone.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/contact_priority.svg b/Neutron-trunk/resources/image/contact_priority.svg
deleted file mode 100644
index 40f94ce..0000000
--- a/Neutron-trunk/resources/image/contact_priority.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/default.jpg b/Neutron-trunk/resources/image/default.jpg
deleted file mode 100644
index 74c1918..0000000
Binary files a/Neutron-trunk/resources/image/default.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-blue.jpg b/Neutron-trunk/resources/image/demos/color-blue.jpg
deleted file mode 100644
index 156bbc2..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-blue.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-brown.jpg b/Neutron-trunk/resources/image/demos/color-brown.jpg
deleted file mode 100644
index 5ef73fa..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-brown.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-green.jpg b/Neutron-trunk/resources/image/demos/color-green.jpg
deleted file mode 100644
index efd9a9b..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-green.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-orange.jpg b/Neutron-trunk/resources/image/demos/color-orange.jpg
deleted file mode 100644
index d682b77..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-orange.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-purple.jpg b/Neutron-trunk/resources/image/demos/color-purple.jpg
deleted file mode 100644
index 0000975..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-purple.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-red.jpg b/Neutron-trunk/resources/image/demos/color-red.jpg
deleted file mode 100644
index 00905e9..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-red.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/color-white.jpg b/Neutron-trunk/resources/image/demos/color-white.jpg
deleted file mode 100644
index 8dc1192..0000000
Binary files a/Neutron-trunk/resources/image/demos/color-white.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/theme-auto.jpg b/Neutron-trunk/resources/image/demos/theme-auto.jpg
deleted file mode 100644
index 89ec238..0000000
Binary files a/Neutron-trunk/resources/image/demos/theme-auto.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/theme-dark.jpg b/Neutron-trunk/resources/image/demos/theme-dark.jpg
deleted file mode 100644
index 2652232..0000000
Binary files a/Neutron-trunk/resources/image/demos/theme-dark.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/demos/theme-light.jpg b/Neutron-trunk/resources/image/demos/theme-light.jpg
deleted file mode 100644
index 3c4f73c..0000000
Binary files a/Neutron-trunk/resources/image/demos/theme-light.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/display.svg b/Neutron-trunk/resources/image/display.svg
deleted file mode 100644
index 15caec1..0000000
--- a/Neutron-trunk/resources/image/display.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/error.jpg b/Neutron-trunk/resources/image/error.jpg
deleted file mode 100644
index 5b1fb17..0000000
Binary files a/Neutron-trunk/resources/image/error.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/ext-remove.svg b/Neutron-trunk/resources/image/ext-remove.svg
deleted file mode 100644
index bb3db74..0000000
--- a/Neutron-trunk/resources/image/ext-remove.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/ext-settings.svg b/Neutron-trunk/resources/image/ext-settings.svg
deleted file mode 100644
index 015006b..0000000
--- a/Neutron-trunk/resources/image/ext-settings.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Neutron-trunk/resources/image/ext-store.svg b/Neutron-trunk/resources/image/ext-store.svg
deleted file mode 100644
index 4451e77..0000000
--- a/Neutron-trunk/resources/image/ext-store.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/gallery-zoom-minus.svg b/Neutron-trunk/resources/image/gallery-zoom-minus.svg
deleted file mode 100644
index d6c04d3..0000000
--- a/Neutron-trunk/resources/image/gallery-zoom-minus.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/gallery-zoom-plus.svg b/Neutron-trunk/resources/image/gallery-zoom-plus.svg
deleted file mode 100644
index a807622..0000000
--- a/Neutron-trunk/resources/image/gallery-zoom-plus.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/getimage.png b/Neutron-trunk/resources/image/getimage.png
deleted file mode 100644
index 221786b..0000000
Binary files a/Neutron-trunk/resources/image/getimage.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/loader.svg b/Neutron-trunk/resources/image/loader.svg
deleted file mode 100644
index 1ab478b..0000000
--- a/Neutron-trunk/resources/image/loader.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/login.jpg b/Neutron-trunk/resources/image/login.jpg
deleted file mode 100644
index 1c67c0a..0000000
Binary files a/Neutron-trunk/resources/image/login.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/menu.svg b/Neutron-trunk/resources/image/menu.svg
deleted file mode 100644
index a2d03a4..0000000
--- a/Neutron-trunk/resources/image/menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/message_error.svg b/Neutron-trunk/resources/image/message_error.svg
deleted file mode 100644
index 04e2223..0000000
--- a/Neutron-trunk/resources/image/message_error.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/message_info.svg b/Neutron-trunk/resources/image/message_info.svg
deleted file mode 100644
index ab9cff7..0000000
--- a/Neutron-trunk/resources/image/message_info.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/message_warning.svg b/Neutron-trunk/resources/image/message_warning.svg
deleted file mode 100644
index dfcf997..0000000
--- a/Neutron-trunk/resources/image/message_warning.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/oobe.svg b/Neutron-trunk/resources/image/oobe.svg
deleted file mode 100644
index 30842c1..0000000
--- a/Neutron-trunk/resources/image/oobe.svg
+++ /dev/null
@@ -1,1434 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <date/time>
-
-
-
-
-
-
- <number>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/oobe/check.png b/Neutron-trunk/resources/image/oobe/check.png
deleted file mode 100644
index 4a844d6..0000000
Binary files a/Neutron-trunk/resources/image/oobe/check.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/error.png b/Neutron-trunk/resources/image/oobe/error.png
deleted file mode 100644
index 8c34385..0000000
Binary files a/Neutron-trunk/resources/image/oobe/error.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/finish.png b/Neutron-trunk/resources/image/oobe/finish.png
deleted file mode 100644
index c401bd4..0000000
Binary files a/Neutron-trunk/resources/image/oobe/finish.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/icon.png b/Neutron-trunk/resources/image/oobe/icon.png
deleted file mode 100644
index 5060593..0000000
Binary files a/Neutron-trunk/resources/image/oobe/icon.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/init.png b/Neutron-trunk/resources/image/oobe/init.png
deleted file mode 100644
index 28207c9..0000000
Binary files a/Neutron-trunk/resources/image/oobe/init.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/installing.png b/Neutron-trunk/resources/image/oobe/installing.png
deleted file mode 100644
index 0a37935..0000000
Binary files a/Neutron-trunk/resources/image/oobe/installing.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/language.png b/Neutron-trunk/resources/image/oobe/language.png
deleted file mode 100644
index 6f4cdb0..0000000
Binary files a/Neutron-trunk/resources/image/oobe/language.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/name.png b/Neutron-trunk/resources/image/oobe/name.png
deleted file mode 100644
index dc301cf..0000000
Binary files a/Neutron-trunk/resources/image/oobe/name.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/ready.png b/Neutron-trunk/resources/image/oobe/ready.png
deleted file mode 100644
index 94ef9cc..0000000
Binary files a/Neutron-trunk/resources/image/oobe/ready.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/software-license.png b/Neutron-trunk/resources/image/oobe/software-license.png
deleted file mode 100644
index 192aa50..0000000
Binary files a/Neutron-trunk/resources/image/oobe/software-license.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/oobe/welcome.png b/Neutron-trunk/resources/image/oobe/welcome.png
deleted file mode 100644
index 759333a..0000000
Binary files a/Neutron-trunk/resources/image/oobe/welcome.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/ready.jpg b/Neutron-trunk/resources/image/ready.jpg
deleted file mode 100644
index c64d4dc..0000000
Binary files a/Neutron-trunk/resources/image/ready.jpg and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/backup.png b/Neutron-trunk/resources/image/regedit/backup.png
deleted file mode 100644
index f15a9c2..0000000
Binary files a/Neutron-trunk/resources/image/regedit/backup.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/data.png b/Neutron-trunk/resources/image/regedit/data.png
deleted file mode 100644
index f68559e..0000000
Binary files a/Neutron-trunk/resources/image/regedit/data.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/folder.png b/Neutron-trunk/resources/image/regedit/folder.png
deleted file mode 100644
index adc73eb..0000000
Binary files a/Neutron-trunk/resources/image/regedit/folder.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/icon.png b/Neutron-trunk/resources/image/regedit/icon.png
deleted file mode 100644
index d8b489d..0000000
Binary files a/Neutron-trunk/resources/image/regedit/icon.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/image.png b/Neutron-trunk/resources/image/regedit/image.png
deleted file mode 100644
index ef5f20a..0000000
Binary files a/Neutron-trunk/resources/image/regedit/image.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/json.png b/Neutron-trunk/resources/image/regedit/json.png
deleted file mode 100644
index 9cc9b21..0000000
Binary files a/Neutron-trunk/resources/image/regedit/json.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/keys.png b/Neutron-trunk/resources/image/regedit/keys.png
deleted file mode 100644
index 1bf414b..0000000
Binary files a/Neutron-trunk/resources/image/regedit/keys.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/old/data.svg b/Neutron-trunk/resources/image/regedit/old/data.svg
deleted file mode 100644
index 35c07bc..0000000
--- a/Neutron-trunk/resources/image/regedit/old/data.svg
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/folder.svg b/Neutron-trunk/resources/image/regedit/old/folder.svg
deleted file mode 100644
index 3299634..0000000
--- a/Neutron-trunk/resources/image/regedit/old/folder.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/icon.svg b/Neutron-trunk/resources/image/regedit/old/icon.svg
deleted file mode 100644
index 5db1576..0000000
--- a/Neutron-trunk/resources/image/regedit/old/icon.svg
+++ /dev/null
@@ -1,163 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/image.svg b/Neutron-trunk/resources/image/regedit/old/image.svg
deleted file mode 100644
index 4a01018..0000000
--- a/Neutron-trunk/resources/image/regedit/old/image.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/json.svg b/Neutron-trunk/resources/image/regedit/old/json.svg
deleted file mode 100644
index 84d17c9..0000000
--- a/Neutron-trunk/resources/image/regedit/old/json.svg
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/keys.svg b/Neutron-trunk/resources/image/regedit/old/keys.svg
deleted file mode 100644
index d7538a9..0000000
--- a/Neutron-trunk/resources/image/regedit/old/keys.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/page.svg b/Neutron-trunk/resources/image/regedit/old/page.svg
deleted file mode 100644
index 7370d4b..0000000
--- a/Neutron-trunk/resources/image/regedit/old/page.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/special.svg b/Neutron-trunk/resources/image/regedit/old/special.svg
deleted file mode 100644
index bdc1a71..0000000
--- a/Neutron-trunk/resources/image/regedit/old/special.svg
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/old/token.svg b/Neutron-trunk/resources/image/regedit/old/token.svg
deleted file mode 100644
index 42e852a..0000000
--- a/Neutron-trunk/resources/image/regedit/old/token.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Neutron-trunk/resources/image/regedit/page.png b/Neutron-trunk/resources/image/regedit/page.png
deleted file mode 100644
index 413c08b..0000000
Binary files a/Neutron-trunk/resources/image/regedit/page.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/special.png b/Neutron-trunk/resources/image/regedit/special.png
deleted file mode 100644
index df3c490..0000000
Binary files a/Neutron-trunk/resources/image/regedit/special.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/regedit/token.png b/Neutron-trunk/resources/image/regedit/token.png
deleted file mode 100644
index 5c8a635..0000000
Binary files a/Neutron-trunk/resources/image/regedit/token.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/resetted.png b/Neutron-trunk/resources/image/resetted.png
deleted file mode 100644
index 9499ad4..0000000
Binary files a/Neutron-trunk/resources/image/resetted.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/siteicon.png b/Neutron-trunk/resources/image/siteicon.png
deleted file mode 100644
index 5e2e85f..0000000
Binary files a/Neutron-trunk/resources/image/siteicon.png and /dev/null differ
diff --git a/Neutron-trunk/resources/image/storeloader.svg b/Neutron-trunk/resources/image/storeloader.svg
deleted file mode 100644
index 6212559..0000000
--- a/Neutron-trunk/resources/image/storeloader.svg
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/image/tools.svg b/Neutron-trunk/resources/image/tools.svg
deleted file mode 100644
index 8443703..0000000
--- a/Neutron-trunk/resources/image/tools.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Neutron-trunk/resources/js/admin_v2.js b/Neutron-trunk/resources/js/admin_v2.js
deleted file mode 100644
index ab7249d..0000000
--- a/Neutron-trunk/resources/js/admin_v2.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// noinspection JSUnresolvedFunction
-
-Array.from(document.getElementsByClassName("inner-item")).forEach((item) => {
- item.onclick = () => {
- if (item.getAttribute("data-item-href").startsWith("parent://")) {
- window.open("https://" + item.getAttribute("data-item-href").substr("parent://".length));
- } else if (item.getAttribute("data-item-href").startsWith("top://")) {
- window.parent.location.href = item.getAttribute("data-item-href").substr("top://".length);
- } else {
- $(document.body).fadeOut(75);
- location.href = item.getAttribute("data-item-href")
- }
- }
-})
\ No newline at end of file
diff --git a/Neutron-trunk/resources/js/ckeditor5/ckeditor.js b/Neutron-trunk/resources/js/ckeditor5/ckeditor.js
deleted file mode 100644
index ca2af1e..0000000
--- a/Neutron-trunk/resources/js/ckeditor5/ckeditor.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-!function(t){t.en=Object.assign(t.en||{},{a:"Cannot upload file:",b:"Image toolbar",c:"Table toolbar",d:"Italic",e:"Strikethrough",f:"Underline",g:"Bold",h:"Subscript",i:"Code",j:"Superscript",k:"Block quote",l:"Choose heading",m:"Heading",n:"Full size image",o:"Side image",p:"Left aligned image",q:"Centered image",r:"Right aligned image",s:"image widget",t:"Insert image or file",u:"Increase indent",v:"Decrease indent",w:"Numbered List",x:"Bulleted List",y:"Insert image",z:"Enter image caption",aa:"Align left",ab:"Align right",ac:"Align center",ad:"Justify",ae:"Text alignment",af:"Text alignment toolbar",ag:"Upload failed",ah:"media widget",ai:"Upload in progress",aj:"Widget toolbar",ak:"Horizontal line",al:"Insert media",am:"The URL must not be empty.",an:"This media URL is not supported.",ao:"Remove Format",ap:"Insert table",aq:"Header column",ar:"Insert column left",as:"Insert column right",at:"Delete column",au:"Column",av:"Header row",aw:"Insert row below",ax:"Insert row above",ay:"Delete row",az:"Row",ba:"Merge cell up",bb:"Merge cell right",bc:"Merge cell down",bd:"Merge cell left",be:"Split cell vertically",bf:"Split cell horizontally",bg:"Merge cells",bh:"Link",bi:"Change image text alternative",bj:"Could not obtain resized image URL.",bk:"Selecting resized image failed",bl:"Could not insert image at the current position.",bm:"Inserting image failed",bn:"Rich Text Editor",bo:"Rich Text Editor, %0",bp:"Font Background Color",bq:"Font Color",br:"Font Family",bs:"Default",bt:"Font Size",bu:"Tiny",bv:"Small",bw:"Big",bx:"Huge",by:"Editor toolbar",bz:"Show more items",ca:"Dropdown toolbar",cb:"Unlink",cc:"Edit link",cd:"Open link in new tab",ce:"This link has no URL",cf:"Save",cg:"Cancel",ch:"Paste the media URL in the input.",ci:"Tip: Paste the URL into the content to embed faster.",cj:"Media URL",ck:"Link URL",cl:"Text alternative",cm:"%0 of %1",cn:"Previous",co:"Next",cp:"Remove color",cq:"Document colors",cr:"Black",cs:"Dim grey",ct:"Grey",cu:"Light grey",cv:"White",cw:"Red",cx:"Orange",cy:"Yellow",cz:"Light green",da:"Green",db:"Aquamarine",dc:"Turquoise",dd:"Light blue",de:"Blue",df:"Purple",dg:"Open in a new tab",dh:"Downloadable",di:"Undo",dj:"Redo",dk:"Paragraph",dl:"Heading 1",dm:"Heading 2",dn:"Heading 3",do:"Heading 4",dp:"Heading 5",dq:"Heading 6"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(window,(function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)i.d(n,o,function(e){return t[e]}.bind(null,o));return n},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=104)}([function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return o}));class n extends Error{constructor(t,e,i){t=o(t),i&&(t+=" "+JSON.stringify(i)),super(t),this.name="CKEditorError",this.context=e,this.data=i}is(t){return"CKEditorError"===t}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError"))throw t;const i=new n(t.message,e);throw i.stack=t.stack,i}}function o(t){const e=t.match(/^([^:]+):/);return e?t+` Read more: https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/error-codes.html#error-${e[1]}\n`:t}},function(t,e,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},s=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),r=[];function a(t){for(var e=-1,i=0;i:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-base-foreground)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-base-foreground)}"},function(t,e,i){var n=i(1),o=i(21);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}"},function(t,e,i){var n=i(1),o=i(23);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{z-index:var(--ck-z-modal);position:fixed;top:0}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{top:auto;position:absolute}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{box-shadow:var(--ck-drop-shadow),0 0;border-width:0 1px 1px;border-top-left-radius:0;border-top-right-radius:0}"},function(t,e,i){var n=i(1),o=i(25);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on .ck-tooltip{display:none}.ck.ck-dropdown .ck-dropdown__panel{-webkit-backface-visibility:hidden;display:none;z-index:var(--ck-z-modal);position:absolute}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{top:100%;bottom:auto}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}:root{--ck-dropdown-arrow-size:calc(0.5*var(--ck-icon-size))}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{width:7em;overflow:hidden;text-overflow:ellipsis}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown__panel{box-shadow:var(--ck-drop-shadow),0 0;border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;min-width:100%}"},function(t,e,i){var n=i(1),o=i(27);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{width:var(--ck-icon-size);height:var(--ck-icon-size);font-size:.8333350694em;will-change:transform}.ck.ck-icon,.ck.ck-icon *{color:inherit;cursor:inherit}.ck.ck-icon :not([fill]){fill:currentColor}"},function(t,e,i){var n=i(1),o=i(29);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports='.ck.ck-tooltip,.ck.ck-tooltip .ck-tooltip__text:after{position:absolute;pointer-events:none;-webkit-backface-visibility:hidden}.ck.ck-tooltip{visibility:hidden;opacity:0;display:none;z-index:var(--ck-z-modal)}.ck.ck-tooltip .ck-tooltip__text{display:inline-block}.ck.ck-tooltip .ck-tooltip__text:after{content:"";width:0;height:0}:root{--ck-tooltip-arrow-size:5px}.ck.ck-tooltip{left:50%;top:0;transition:opacity .2s ease-in-out .2s}.ck.ck-tooltip .ck-tooltip__text{border-radius:0}.ck-rounded-corners .ck.ck-tooltip .ck-tooltip__text,.ck.ck-tooltip .ck-tooltip__text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-tooltip .ck-tooltip__text{font-size:.9em;line-height:1.5;color:var(--ck-color-tooltip-text);padding:var(--ck-spacing-small) var(--ck-spacing-medium);background:var(--ck-color-tooltip-background);position:relative;left:-50%}.ck.ck-tooltip .ck-tooltip__text:after{transition:opacity .2s ease-in-out .2s;border-style:solid;left:50%}.ck.ck-tooltip.ck-tooltip_s{bottom:calc(-1*var(--ck-tooltip-arrow-size));transform:translateY(100%)}.ck.ck-tooltip.ck-tooltip_s .ck-tooltip__text:after{top:calc(-1*var(--ck-tooltip-arrow-size));transform:translateX(-50%);border-left-color:transparent;border-bottom-color:var(--ck-color-tooltip-background);border-right-color:transparent;border-top-color:transparent;border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:var(--ck-tooltip-arrow-size);border-right-width:var(--ck-tooltip-arrow-size);border-top-width:0}.ck.ck-tooltip.ck-tooltip_n{top:calc(-1*var(--ck-tooltip-arrow-size));transform:translateY(-100%)}.ck.ck-tooltip.ck-tooltip_n .ck-tooltip__text:after{bottom:calc(-1*var(--ck-tooltip-arrow-size));transform:translateX(-50%);border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent;border-top-color:var(--ck-color-tooltip-background);border-left-width:var(--ck-tooltip-arrow-size);border-bottom-width:0;border-right-width:var(--ck-tooltip-arrow-size);border-top-width:var(--ck-tooltip-arrow-size)}'},function(t,e,i){var n=i(1),o=i(31);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-button,a.ck.ck-button{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:block}@media (hover:none){.ck.ck-button .ck-tooltip,a.ck.ck-button .ck-tooltip{display:none}}.ck.ck-button,a.ck.ck-button{position:relative;display:inline-flex;align-items:center;justify-content:left}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button:hover .ck-tooltip,a.ck.ck-button:hover .ck-tooltip{visibility:visible;opacity:1}.ck.ck-button:focus:not(:hover) .ck-tooltip,a.ck.ck-button:focus:not(:hover) .ck-tooltip{display:none}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-default-active-shadow)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{white-space:nowrap;cursor:default;vertical-align:middle;padding:var(--ck-spacing-tiny);text-align:center;min-width:var(--ck-ui-component-min-height);min-height:var(--ck-ui-component-min-height);line-height:1;font-size:inherit;border:1px solid transparent;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;-webkit-appearance:none}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{font-size:inherit;font-weight:inherit;color:inherit;cursor:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{font-weight:700;opacity:.7}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__icon{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(-1*var(--ck-spacing-small));margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-right:calc(-1*var(--ck-spacing-small));margin-left:var(--ck-spacing-small)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-on-active-shadow)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background);box-shadow:inset 0 2px 2px var(--ck-color-button-action-active-shadow)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}"},function(t,e,i){var n=i(1),o=i(33);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-list{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{list-style-type:none;background:var(--ck-color-list-background)}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item .ck-button{min-height:unset;width:100%;text-align:left;border-radius:0;padding:calc(0.2*var(--ck-line-height-base)*var(--ck-font-size-base)) calc(0.4*var(--ck-line-height-base)*var(--ck-font-size-base))}.ck.ck-list__item .ck-button .ck-button__label{line-height:calc(1.2*var(--ck-line-height-base)*var(--ck-font-size-base))}.ck.ck-list__item .ck-button:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item .ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item .ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item .ck-button.ck-on:focus:not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item .ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item .ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item .ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck.ck-list__separator{height:1px;width:100%;background:var(--ck-color-base-border)}"},function(t,e,i){var n=i(1),o=i(35);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:1.0769230769em;--ck-switch-button-toggle-spacing:1px;--ck-switch-button-translation:1.3846153847em}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(2*var(--ck-spacing-large))}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(2*var(--ck-spacing-large))}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{transition:background .4s ease;width:var(--ck-switch-button-toggle-width);background:var(--ck-color-switch-button-off-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(0.5*var(--ck-border-radius))}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{margin:var(--ck-switch-button-toggle-spacing);width:var(--ck-switch-button-toggle-inner-size);height:var(--ck-switch-button-toggle-inner-size);background:var(--ck-color-switch-button-inner-background);transition:all .3s ease}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var(--ck-switch-button-translation))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(-1*var(--ck-switch-button-translation)))}"},function(t,e,i){var n=i(1),o=i(37);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-toolbar-dropdown .ck.ck-toolbar .ck.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar-dropdown .ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}"},function(t,e,i){var n=i(1),o=i(39);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-dropdown .ck-dropdown__panel .ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list,.ck.ck-dropdown .ck-dropdown__panel .ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:first-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button,.ck.ck-dropdown .ck-dropdown__panel .ck-list .ck-list__item:last-child .ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}"},function(t,e,i){var n=i(1),o=i(41);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-toolbar{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-flow:row nowrap;align-items:center}.ck.ck-toolbar>.ck-toolbar__items{display:flex;flex-flow:row wrap;align-items:center;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);padding:0 var(--ck-spacing-small);border:1px solid var(--ck-color-toolbar-border)}.ck.ck-toolbar>.ck-toolbar__items>*{margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{width:100%;margin:0;border-radius:0;border:0}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact .ck-toolbar__items>.ck{margin:0}.ck.ck-toolbar.ck-toolbar_compact .ck-toolbar__items>.ck:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ck.ck-toolbar.ck-toolbar_compact .ck-toolbar__items>.ck:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ck.ck-toolbar.ck-toolbar_compact .ck-toolbar__items>.ck:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck-toolbar__items>*,.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;width:1px;min-width:1px;margin-top:0;margin-bottom:0;background:var(--ck-color-toolbar-border)}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__grouped-dropdown,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{padding-right:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__items>*,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__items>*{margin-left:var(--ck-spacing-small);margin-right:0}.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__items>:last-child,[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__items>:last-child{margin-left:0}.ck.ck-toolbar[dir=rtl].ck-toolbar_grouping>.ck-toolbar__items,[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__grouped-dropdown,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{padding-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__items>:last-child,[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__items>:last-child{margin-right:0}.ck.ck-toolbar[dir=ltr].ck-toolbar_grouping>.ck-toolbar__items,[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{margin-right:var(--ck-spacing-small)}"},function(t,e,i){var n=i(1),o=i(43);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-modal)}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-bottom-width:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar{border-bottom-width:1px;border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content_sticky .ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}"},function(t,e,i){var n=i(1),o=i(45);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content blockquote{overflow:hidden;padding-right:1.5em;padding-left:1.5em;margin-left:0;margin-right:0;font-style:italic;border-left:5px solid #ccc}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}"},function(t,e,i){var n=i(1),o=i(47);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}"},function(t,e,i){var n=i(1),o=i(49);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-resizer-size:10px;--ck-resizer-border-width:1px;--ck-resizer-border-radius:2px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-tooltip-offset:10px;--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2}.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);color:var(--ck-color-resizer-tooltip-text);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);font-size:var(--ck-font-size-tiny);display:block;padding:var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{top:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{top:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-width:var(--ck-widget-outline-thickness);outline-style:solid;outline-color:transparent;transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;background-color:var(--ck-color-widget-editable-focus-background)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{padding:4px;box-sizing:border-box;background-color:transparent;opacity:0;transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;transform:translateY(-100%);left:calc(0px - var(--ck-widget-outline-thickness))}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{width:var(--ck-widget-handler-icon-size);height:var(--ck-widget-handler-icon-size);color:var(--ck-color-widget-drag-handler-icon-color)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle{opacity:1;background-color:var(--ck-color-focus-border)}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child,.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle .ck-widget__selection-handle:hover,.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck-editor__editable.ck-read-only .ck-widget{--ck-widget-outline-thickness:0}"},function(t,e,i){var n=i(1),o=i(51);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-labeled-input .ck-labeled-input__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-input .ck-labeled-input__status_error{color:var(--ck-color-base-error)}"},function(t,e,i){var n=i(1),o=i(53);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=":root{--ck-input-text-width:18em}.ck.ck-input-text{border-radius:0}.ck-rounded-corners .ck.ck-input-text,.ck.ck-input-text.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-text{box-shadow:var(--ck-inner-shadow),0 0;background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);min-width:var(--ck-input-text-width);min-height:var(--ck-ui-component-min-height);transition:box-shadow .2s ease-in-out,border .2s ease-in-out}.ck.ck-input-text:focus{outline:none;border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),var(--ck-inner-shadow)}.ck.ck-input-text[readonly]{border:1px solid var(--ck-color-input-disabled-border);background:var(--ck-color-input-disabled-background);color:var(--ck-color-input-disabled-text)}.ck.ck-input-text[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),var(--ck-inner-shadow)}.ck.ck-input-text.ck-error{border-color:var(--ck-color-input-error-border);animation:ck-text-input-shake .3s ease both}.ck.ck-input-text.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),var(--ck-inner-shadow)}@keyframes ck-text-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}"},function(t,e,i){var n=i(1),o=i(55);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-input{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-input{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}.ck.ck-text-alternative-form{padding:var(--ck-spacing-standard)}.ck.ck-text-alternative-form:focus{outline:none}[dir=ltr] .ck.ck-text-alternative-form>:not(:first-child),[dir=rtl] .ck.ck-text-alternative-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-text-alternative-form{padding:0;width:calc(0.8*var(--ck-input-text-width))}.ck.ck-text-alternative-form .ck-labeled-input{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-text-alternative-form .ck-labeled-input .ck-input-text{min-width:0;width:100%}.ck.ck-text-alternative-form .ck-button{padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-standard);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-text-alternative-form .ck-button{margin-left:0}[dir=ltr] .ck.ck-text-alternative-form .ck-button:first-of-type{border-right:1px solid var(--ck-color-base-border)}[dir=rtl] .ck.ck-text-alternative-form .ck-button{margin-left:0}[dir=rtl] .ck.ck-text-alternative-form .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}}"},function(t,e,i){var n=i(1),o=i(57);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-modal)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{width:0;height:0;border-style:solid}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:var(--ck-balloon-arrow-height);border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:0}.ck.ck-balloon-panel[class*=arrow_n]:before{border-bottom-color:var(--ck-color-panel-border)}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-left-color:transparent;border-right-color:transparent;border-top-color:transparent}.ck.ck-balloon-panel[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background);margin-top:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-width:var(--ck-balloon-arrow-half-width);border-bottom-width:0;border-right-width:var(--ck-balloon-arrow-half-width);border-top-width:var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-top-color:var(--ck-color-panel-border)}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-left-color:transparent;border-bottom-color:transparent;border-right-color:transparent}.ck.ck-balloon-panel[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background);margin-bottom:var(--ck-balloon-arrow-offset)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(-1*var(--ck-balloon-arrow-half-width));top:calc(-1*var(--ck-balloon-arrow-height))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(2*var(--ck-balloon-arrow-half-width));top:calc(-1*var(--ck-balloon-arrow-height))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(2*var(--ck-balloon-arrow-half-width));top:calc(-1*var(--ck-balloon-arrow-height))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{left:50%;margin-left:calc(-1*var(--ck-balloon-arrow-half-width));bottom:calc(-1*var(--ck-balloon-arrow-height))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{left:calc(2*var(--ck-balloon-arrow-half-width));bottom:calc(-1*var(--ck-balloon-arrow-height))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{right:calc(2*var(--ck-balloon-arrow-half-width));bottom:calc(-1*var(--ck-balloon-arrow-height))}'},function(t,e,i){var n=i(1),o=i(59);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-balloon-rotator__navigation{display:flex;align-items:center;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);margin-bottom:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-right:var(--ck-spacing-standard);margin-left:var(--ck-spacing-small)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}"},function(t,e,i){var n=i(1),o=i(61);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-modal) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{box-shadow:var(--ck-drop-shadow),0 0;min-height:15px;background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);width:100%;height:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}"},function(t,e,i){var n=i(1),o=i(63);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content .image{display:table;clear:both;text-align:center;margin:1em auto}.ck-content .image>img{display:block;margin:0 auto;max-width:100%;min-width:50px}"},function(t,e,i){var n=i(1),o=i(65);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-editor__editable .image{position:relative}.ck.ck-editor__editable .image .ck-progress-bar{position:absolute;top:0;left:0}.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar{height:2px;width:0;background:var(--ck-color-upload-bar-background);transition:width .1s}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}"},function(t,e,i){var n=i(1),o=i(67);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports='.ck-image-upload-complete-icon{display:block;position:absolute;top:10px;right:10px;border-radius:50%}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20px;--ck-image-upload-icon-width:2px}.ck-image-upload-complete-icon{width:var(--ck-image-upload-icon-size);height:var(--ck-image-upload-icon-size);opacity:0;background:var(--ck-color-image-upload-icon-background);animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;animation-fill-mode:forwards,forwards;animation-duration:.5s,.5s;font-size:var(--ck-image-upload-icon-size);animation-delay:0ms,3s}.ck-image-upload-complete-icon:after{left:25%;top:50%;opacity:0;height:0;width:0;transform:scaleX(-1) rotate(135deg);transform-origin:left top;border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);animation-name:ck-upload-complete-icon-check;animation-duration:.5s;animation-delay:.5s;animation-fill-mode:forwards;box-sizing:border-box}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{opacity:1;width:0;height:0}33%{width:.3em;height:0}to{opacity:1;width:.3em;height:.45em}}'},function(t,e,i){var n=i(1),o=i(69);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports='.ck .ck-upload-placeholder-loader{position:absolute;display:flex;align-items:center;justify-content:center;top:0;left:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px}.ck .ck-image-upload-placeholder{width:100%;margin:0}.ck .ck-upload-placeholder-loader{width:100%;height:100%}.ck .ck-upload-placeholder-loader:before{width:var(--ck-upload-placeholder-loader-size);height:var(--ck-upload-placeholder-loader-size);border-radius:50%;border-top:3px solid var(--ck-color-upload-placeholder-loader);border-right:2px solid transparent;animation:ck-upload-placeholder-loader 1s linear infinite}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}'},function(t,e){t.exports=".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}"},function(t,e,i){var n=i(1),o=i(72);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content .image>figcaption{display:table-caption;caption-side:bottom;word-break:break-word;color:#333;background-color:#f7f7f7;padding:.6em;font-size:.75em;outline-offset:-1px}"},function(t,e,i){var n=i(1),o=i(74);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=":root{--ck-image-style-spacing:1.5em}.ck-content .image-style-align-center,.ck-content .image-style-align-left,.ck-content .image-style-align-right,.ck-content .image-style-side{max-width:50%}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}"},function(t,e,i){var n=i(1),o=i(76);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-input{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form{padding:var(--ck-spacing-standard)}.ck.ck-link-form:focus{outline:none}[dir=ltr] .ck.ck-link-form>:not(:first-child),[dir=rtl] .ck.ck-link-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-form{padding:0;width:calc(0.8*var(--ck-input-text-width))}.ck.ck-link-form .ck-labeled-input{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-form .ck-labeled-input .ck-input-text{min-width:0;width:100%}.ck.ck-link-form .ck-button{padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-standard);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-form .ck-button{margin-left:0}[dir=ltr] .ck.ck-link-form .ck-button:first-of-type{border-right:1px solid var(--ck-color-base-border)}[dir=rtl] .ck.ck-link-form .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}}.ck.ck-link-form_layout-vertical{padding:0;min-width:var(--ck-input-text-width)}.ck.ck-link-form_layout-vertical .ck-labeled-input{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-input .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical .ck-button{padding:var(--ck-spacing-standard);margin:0;border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border);width:50%}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=ltr] .ck.ck-link-form_layout-vertical .ck-button:first-of-type{border-right:1px solid var(--ck-color-base-border)}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin-left:0}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{border:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}"},function(t,e,i){var n=i(1),o=i(78);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions{padding:var(--ck-spacing-standard)}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{padding:0 var(--ck-spacing-medium);color:var(--ck-color-link-default);text-overflow:ellipsis;cursor:pointer;max-width:var(--ck-input-text-width);min-width:3em;text-align:center}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}.ck.ck-link-actions:focus{outline:none}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions{padding:0;width:calc(0.8*var(--ck-input-text-width))}.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{min-width:0;max-width:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-standard);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview):first-of-type{border-right:1px solid var(--ck-color-base-border)}[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview):last-of-type{border-right:1px solid var(--ck-color-base-border)}}"},function(t,e,i){var n=i(1),o=i(80);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports='.ck-media__wrapper .ck-media__placeholder{display:flex;flex-direction:column;align-items:center}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-tooltip{display:block}@media (hover:none){.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-tooltip{display:none}}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url{max-width:100%;position:relative}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url:hover .ck-tooltip{visibility:visible;opacity:1}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-media__placeholder__url__text{overflow:hidden;display:block}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck-media__placeholder__icon *{display:none}.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper>:not(.ck-media__placeholder),.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder{pointer-events:none}:root{--ck-media-embed-placeholder-icon-size:3em;--ck-color-media-embed-placeholder-url-text:#757575;--ck-color-media-embed-placeholder-url-text-hover:var(--ck-color-base-text)}.ck-media__wrapper{margin:0 auto}.ck-media__wrapper .ck-media__placeholder{padding:calc(3*var(--ck-spacing-standard));background:var(--ck-color-base-foreground)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon{min-width:var(--ck-media-embed-placeholder-icon-size);height:var(--ck-media-embed-placeholder-icon-size);margin-bottom:var(--ck-spacing-large);background-position:50%;background-size:cover}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon .ck-icon{width:100%;height:100%}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text{color:var(--ck-color-media-embed-placeholder-url-text);white-space:nowrap;text-align:center;font-style:italic;text-overflow:ellipsis}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:var(--ck-color-media-embed-placeholder-url-text-hover);cursor:pointer;text-decoration:underline}.ck-media__wrapper[data-oembed-url*="open.spotify.com"]{max-width:300px;max-height:380px}.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0yMDYuNDc3IDI2MC45bC0yOC45ODcgMjguOTg3YTUuMjE4IDUuMjE4IDAgMDAzLjc4IDEuNjFoNDkuNjIxYzEuNjk0IDAgMy4xOS0uNzk4IDQuMTQ2LTIuMDM3eiIgZmlsbD0iIzVjODhjNSIvPjxwYXRoIGQ9Ik0yMjYuNzQyIDIyMi45ODhjLTkuMjY2IDAtMTYuNzc3IDcuMTctMTYuNzc3IDE2LjAxNC4wMDcgMi43NjIuNjYzIDUuNDc0IDIuMDkzIDcuODc1LjQzLjcwMy44MyAxLjQwOCAxLjE5IDIuMTA3LjMzMy41MDIuNjUgMS4wMDUuOTUgMS41MDguMzQzLjQ3Ny42NzMuOTU3Ljk4OCAxLjQ0IDEuMzEgMS43NjkgMi41IDMuNTAyIDMuNjM3IDUuMTY4Ljc5MyAxLjI3NSAxLjY4MyAyLjY0IDIuNDY2IDMuOTkgMi4zNjMgNC4wOTQgNC4wMDcgOC4wOTIgNC42IDEzLjkxNHYuMDEyYy4xODIuNDEyLjUxNi42NjYuODc5LjY2Ny40MDMtLjAwMS43NjgtLjMxNC45My0uNzk5LjYwMy01Ljc1NiAyLjIzOC05LjcyOSA0LjU4NS0xMy43OTQuNzgyLTEuMzUgMS42NzMtMi43MTUgMi40NjUtMy45OSAxLjEzNy0xLjY2NiAyLjMyOC0zLjQgMy42MzgtNS4xNjkuMzE1LS40ODIuNjQ1LS45NjIuOTg4LTEuNDM5LjMtLjUwMy42MTctMS4wMDYuOTUtMS41MDguMzU5LS43Ljc2LTEuNDA0IDEuMTktMi4xMDcgMS40MjYtMi40MDIgMi01LjExNCAyLjAwNC03Ljg3NSAwLTguODQ0LTcuNTExLTE2LjAxNC0xNi43NzYtMTYuMDE0eiIgZmlsbD0iI2RkNGIzZSIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48ZWxsaXBzZSByeT0iNS41NjQiIHJ4PSI1LjgyOCIgY3k9IjIzOS4wMDIiIGN4PSIyMjYuNzQyIiBmaWxsPSIjODAyZDI3IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0xOTAuMzAxIDIzNy4yODNjLTQuNjcgMC04LjQ1NyAzLjg1My04LjQ1NyA4LjYwNnMzLjc4NiA4LjYwNyA4LjQ1NyA4LjYwN2MzLjA0MyAwIDQuODA2LS45NTggNi4zMzctMi41MTYgMS41My0xLjU1NyAyLjA4Ny0zLjkxMyAyLjA4Ny02LjI5IDAtLjM2Mi0uMDIzLS43MjItLjA2NC0xLjA3OWgtOC4yNTd2My4wNDNoNC44NWMtLjE5Ny43NTktLjUzMSAxLjQ1LTEuMDU4IDEuOTg2LS45NDIuOTU4LTIuMDI4IDEuNTQ4LTMuOTAxIDEuNTQ4LTIuODc2IDAtNS4yMDgtMi4zNzItNS4yMDgtNS4yOTkgMC0yLjkyNiAyLjMzMi01LjI5OSA1LjIwOC01LjI5OSAxLjM5OSAwIDIuNjE4LjQwNyAzLjU4NCAxLjI5M2wyLjM4MS0yLjM4YzAtLjAwMi0uMDAzLS4wMDQtLjAwNC0uMDA1LTEuNTg4LTEuNTI0LTMuNjItMi4yMTUtNS45NTUtMi4yMTV6bTQuNDMgNS42NmwuMDAzLjAwNnYtLjAwM3oiIGZpbGw9IiNmZmYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTIxNS4xODQgMjUxLjkyOWwtNy45OCA3Ljk3OSAyOC40NzcgMjguNDc1YTUuMjMzIDUuMjMzIDAgMDAuNDQ5LTIuMTIzdi0zMS4xNjVjLS40NjkuNjc1LS45MzQgMS4zNDktMS4zODIgMi4wMDUtLjc5MiAxLjI3NS0xLjY4MiAyLjY0LTIuNDY1IDMuOTktMi4zNDcgNC4wNjUtMy45ODIgOC4wMzgtNC41ODUgMTMuNzk0LS4xNjIuNDg1LS41MjcuNzk4LS45My43OTktLjM2My0uMDAxLS42OTctLjI1NS0uODc5LS42Njd2LS4wMTJjLS41OTMtNS44MjItMi4yMzctOS44Mi00LjYtMTMuOTE0LS43ODMtMS4zNS0xLjY3My0yLjcxNS0yLjQ2Ni0zLjk5LTEuMTM3LTEuNjY2LTIuMzI3LTMuNC0zLjYzNy01LjE2OWwtLjAwMi0uMDAzeiIgZmlsbD0iI2MzYzNjMyIvPjxwYXRoIGQ9Ik0yMTIuOTgzIDI0OC40OTVsLTM2Ljk1MiAzNi45NTN2LjgxMmE1LjIyNyA1LjIyNyAwIDAwNS4yMzggNS4yMzhoMS4wMTVsMzUuNjY2LTM1LjY2NmExMzYuMjc1IDEzNi4yNzUgMCAwMC0yLjc2NC0zLjkgMzcuNTc1IDM3LjU3NSAwIDAwLS45ODktMS40NCAzNS4xMjcgMzUuMTI3IDAgMDAtLjk1LTEuNTA4Yy0uMDgzLS4xNjItLjE3Ni0uMzI2LS4yNjQtLjQ4OXoiIGZpbGw9IiNmZGRjNGYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTIxMS45OTggMjYxLjA4M2wtNi4xNTIgNi4xNTEgMjQuMjY0IDI0LjI2NGguNzgxYTUuMjI3IDUuMjI3IDAgMDA1LjIzOS01LjIzOHYtMS4wNDV6IiBmaWxsPSIjZmZmIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjwvZz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder{background:#4268b3}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NjcuNDg0IDBINTYuNTE3QzI1LjMwNCAwIDAgMjUuMzA0IDAgNTYuNTE3djkxMC45NjZDMCA5OTguNjk0IDI1LjI5NyAxMDI0IDU2LjUyMiAxMDI0SDU0N1Y2MjhINDE0VjQ3M2gxMzNWMzU5LjAyOWMwLTEzMi4yNjIgODAuNzczLTIwNC4yODIgMTk4Ljc1Ni0yMDQuMjgyIDU2LjUxMyAwIDEwNS4wODYgNC4yMDggMTE5LjI0NCA2LjA4OVYyOTlsLTgxLjYxNi4wMzdjLTYzLjk5MyAwLTc2LjM4NCAzMC40OTItNzYuMzg0IDc1LjIzNlY0NzNoMTUzLjQ4N2wtMTkuOTg2IDE1NUg3MDd2Mzk2aDI2MC40ODRjMzEuMjEzIDAgNTYuNTE2LTI1LjMwMyA1Ni41MTYtNTYuNTE2VjU2LjUxNUMxMDI0IDI1LjMwMyA5OTguNjk3IDAgOTY3LjQ4NCAwIiBmaWxsPSIjRkZGRkZFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#cdf}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder{background:linear-gradient(-135deg,#1400c8,#b900b4,#f50000)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTA0IiBoZWlnaHQ9IjUwNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIC4xNTloNTAzLjg0MVY1MDMuOTRIMHoiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48cGF0aCBkPSJNMjUxLjkyMS4xNTljLTY4LjQxOCAwLTc2Ljk5Ny4yOS0xMDMuODY3IDEuNTE2LTI2LjgxNCAxLjIyMy00NS4xMjcgNS40ODItNjEuMTUxIDExLjcxLTE2LjU2NiA2LjQzNy0zMC42MTUgMTUuMDUxLTQ0LjYyMSAyOS4wNTYtMTQuMDA1IDE0LjAwNi0yMi42MTkgMjguMDU1LTI5LjA1NiA0NC42MjEtNi4yMjggMTYuMDI0LTEwLjQ4NyAzNC4zMzctMTEuNzEgNjEuMTUxQy4yOSAxNzUuMDgzIDAgMTgzLjY2MiAwIDI1Mi4wOGMwIDY4LjQxNy4yOSA3Ni45OTYgMS41MTYgMTAzLjg2NiAxLjIyMyAyNi44MTQgNS40ODIgNDUuMTI3IDExLjcxIDYxLjE1MSA2LjQzNyAxNi41NjYgMTUuMDUxIDMwLjYxNSAyOS4wNTYgNDQuNjIxIDE0LjAwNiAxNC4wMDUgMjguMDU1IDIyLjYxOSA0NC42MjEgMjkuMDU3IDE2LjAyNCA2LjIyNyAzNC4zMzcgMTAuNDg2IDYxLjE1MSAxMS43MDkgMjYuODcgMS4yMjYgMzUuNDQ5IDEuNTE2IDEwMy44NjcgMS41MTYgNjguNDE3IDAgNzYuOTk2LS4yOSAxMDMuODY2LTEuNTE2IDI2LjgxNC0xLjIyMyA0NS4xMjctNS40ODIgNjEuMTUxLTExLjcwOSAxNi41NjYtNi40MzggMzAuNjE1LTE1LjA1MiA0NC42MjEtMjkuMDU3IDE0LjAwNS0xNC4wMDYgMjIuNjE5LTI4LjA1NSAyOS4wNTctNDQuNjIxIDYuMjI3LTE2LjAyNCAxMC40ODYtMzQuMzM3IDExLjcwOS02MS4xNTEgMS4yMjYtMjYuODcgMS41MTYtMzUuNDQ5IDEuNTE2LTEwMy44NjYgMC02OC40MTgtLjI5LTc2Ljk5Ny0xLjUxNi0xMDMuODY3LTEuMjIzLTI2LjgxNC01LjQ4Mi00NS4xMjctMTEuNzA5LTYxLjE1MS02LjQzOC0xNi41NjYtMTUuMDUyLTMwLjYxNS0yOS4wNTctNDQuNjIxLTE0LjAwNi0xNC4wMDUtMjguMDU1LTIyLjYxOS00NC42MjEtMjkuMDU2LTE2LjAyNC02LjIyOC0zNC4zMzctMTAuNDg3LTYxLjE1MS0xMS43MUMzMjguOTE3LjQ0OSAzMjAuMzM4LjE1OSAyNTEuOTIxLjE1OXptMCA0NS4zOTFjNjcuMjY1IDAgNzUuMjMzLjI1NyAxMDEuNzk3IDEuNDY5IDI0LjU2MiAxLjEyIDM3LjkwMSA1LjIyNCA0Ni43NzggOC42NzQgMTEuNzU5IDQuNTcgMjAuMTUxIDEwLjAyOSAyOC45NjYgMTguODQ1IDguODE2IDguODE1IDE0LjI3NSAxNy4yMDcgMTguODQ1IDI4Ljk2NiAzLjQ1IDguODc3IDcuNTU0IDIyLjIxNiA4LjY3NCA0Ni43NzggMS4yMTIgMjYuNTY0IDEuNDY5IDM0LjUzMiAxLjQ2OSAxMDEuNzk4IDAgNjcuMjY1LS4yNTcgNzUuMjMzLTEuNDY5IDEwMS43OTctMS4xMiAyNC41NjItNS4yMjQgMzcuOTAxLTguNjc0IDQ2Ljc3OC00LjU3IDExLjc1OS0xMC4wMjkgMjAuMTUxLTE4Ljg0NSAyOC45NjYtOC44MTUgOC44MTYtMTcuMjA3IDE0LjI3NS0yOC45NjYgMTguODQ1LTguODc3IDMuNDUtMjIuMjE2IDcuNTU0LTQ2Ljc3OCA4LjY3NC0yNi41NiAxLjIxMi0zNC41MjcgMS40NjktMTAxLjc5NyAxLjQ2OS02Ny4yNzEgMC03NS4yMzctLjI1Ny0xMDEuNzk4LTEuNDY5LTI0LjU2Mi0xLjEyLTM3LjkwMS01LjIyNC00Ni43NzgtOC42NzQtMTEuNzU5LTQuNTctMjAuMTUxLTEwLjAyOS0yOC45NjYtMTguODQ1LTguODE1LTguODE1LTE0LjI3NS0xNy4yMDctMTguODQ1LTI4Ljk2Ni0zLjQ1LTguODc3LTcuNTU0LTIyLjIxNi04LjY3NC00Ni43NzgtMS4yMTItMjYuNTY0LTEuNDY5LTM0LjUzMi0xLjQ2OS0xMDEuNzk3IDAtNjcuMjY2LjI1Ny03NS4yMzQgMS40NjktMTAxLjc5OCAxLjEyLTI0LjU2MiA1LjIyNC0zNy45MDEgOC42NzQtNDYuNzc4IDQuNTctMTEuNzU5IDEwLjAyOS0yMC4xNTEgMTguODQ1LTI4Ljk2NiA4LjgxNS04LjgxNiAxNy4yMDctMTQuMjc1IDI4Ljk2Ni0xOC44NDUgOC44NzctMy40NSAyMi4yMTYtNy41NTQgNDYuNzc4LTguNjc0IDI2LjU2NC0xLjIxMiAzNC41MzItMS40NjkgMTAxLjc5OC0xLjQ2OXoiIGZpbGw9IiNGRkYiIG1hc2s9InVybCgjYikiLz48cGF0aCBkPSJNMjUxLjkyMSAzMzYuMDUzYy00Ni4zNzggMC04My45NzQtMzcuNTk2LTgzLjk3NC04My45NzMgMC00Ni4zNzggMzcuNTk2LTgzLjk3NCA4My45NzQtODMuOTc0IDQ2LjM3NyAwIDgzLjk3MyAzNy41OTYgODMuOTczIDgzLjk3NCAwIDQ2LjM3Ny0zNy41OTYgODMuOTczLTgzLjk3MyA4My45NzN6bTAtMjEzLjMzOGMtNzEuNDQ3IDAtMTI5LjM2NSA1Ny45MTgtMTI5LjM2NSAxMjkuMzY1IDAgNzEuNDQ2IDU3LjkxOCAxMjkuMzY0IDEyOS4zNjUgMTI5LjM2NCA3MS40NDYgMCAxMjkuMzY0LTU3LjkxOCAxMjkuMzY0LTEyOS4zNjQgMC03MS40NDctNTcuOTE4LTEyOS4zNjUtMTI5LjM2NC0xMjkuMzY1ek00MTYuNjI3IDExNy42MDRjMCAxNi42OTYtMTMuNTM1IDMwLjIzLTMwLjIzMSAzMC4yMy0xNi42OTUgMC0zMC4yMy0xMy41MzQtMzAuMjMtMzAuMjMgMC0xNi42OTYgMTMuNTM1LTMwLjIzMSAzMC4yMy0zMC4yMzEgMTYuNjk2IDAgMzAuMjMxIDEzLjUzNSAzMC4yMzEgMzAuMjMxIiBmaWxsPSIjRkZGIi8+PC9nPjwvc3ZnPg==)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#ffe0fe}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder{background:linear-gradient(90deg,#71c6f4,#0d70a5)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIj48cGF0aCBkPSJNNDAwIDIwMGMwIDExMC41LTg5LjUgMjAwLTIwMCAyMDBTMCAzMTAuNSAwIDIwMCA4OS41IDAgMjAwIDBzMjAwIDg5LjUgMjAwIDIwMHpNMTYzLjQgMzA1LjVjODguNyAwIDEzNy4yLTczLjUgMTM3LjItMTM3LjIgMC0yLjEgMC00LjItLjEtNi4yIDkuNC02LjggMTcuNi0xNS4zIDI0LjEtMjUtOC42IDMuOC0xNy45IDYuNC0yNy43IDcuNiAxMC02IDE3LjYtMTUuNCAyMS4yLTI2LjctOS4zIDUuNS0xOS42IDkuNS0zMC42IDExLjctOC44LTkuNC0yMS4zLTE1LjItMzUuMi0xNS4yLTI2LjYgMC00OC4yIDIxLjYtNDguMiA0OC4yIDAgMy44LjQgNy41IDEuMyAxMS00MC4xLTItNzUuNi0yMS4yLTk5LjQtNTAuNC00LjEgNy4xLTYuNSAxNS40LTYuNSAyNC4yIDAgMTYuNyA4LjUgMzEuNSAyMS41IDQwLjEtNy45LS4yLTE1LjMtMi40LTIxLjgtNnYuNmMwIDIzLjQgMTYuNiA0Mi44IDM4LjcgNDcuMy00IDEuMS04LjMgMS43LTEyLjcgMS43LTMuMSAwLTYuMS0uMy05LjEtLjkgNi4xIDE5LjIgMjMuOSAzMy4xIDQ1IDMzLjUtMTYuNSAxMi45LTM3LjMgMjAuNi01OS45IDIwLjYtMy45IDAtNy43LS4yLTExLjUtLjcgMjEuMSAxMy44IDQ2LjUgMjEuOCA3My43IDIxLjgiIGZpbGw9IiNmZmYiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text{color:#b8e6ff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}'},function(t,e,i){var n=i(1),o=i(82);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-media-form{display:flex;align-items:flex-start;flex-direction:row;flex-wrap:nowrap}.ck.ck-media-form .ck-labeled-input{display:inline-block}.ck.ck-media-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-media-form{flex-wrap:wrap}.ck.ck-media-form .ck-labeled-input{flex-basis:100%}.ck.ck-media-form .ck-button{flex-basis:50%}}.ck.ck-media-form{padding:var(--ck-spacing-standard)}.ck.ck-media-form:focus{outline:none}[dir=ltr] .ck.ck-media-form>:not(:first-child),[dir=rtl] .ck.ck-media-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-media-form{padding:0;width:calc(0.8*var(--ck-input-text-width))}.ck.ck-media-form .ck-labeled-input{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-media-form .ck-labeled-input .ck-input-text{min-width:0;width:100%}.ck.ck-media-form .ck-labeled-input .ck-labeled-input__error{white-space:normal}.ck.ck-media-form .ck-button{padding:var(--ck-spacing-standard);margin-top:var(--ck-spacing-standard);border-radius:0;border:0;border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-media-form .ck-button{margin-left:0}[dir=ltr] .ck.ck-media-form .ck-button:first-of-type{border-right:1px solid var(--ck-color-base-border)}[dir=rtl] .ck.ck-media-form .ck-button{margin-left:0}[dir=rtl] .ck.ck-media-form .ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}}"},function(t,e,i){var n=i(1),o=i(84);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content .media{clear:both;margin:1em 0;display:block;min-width:15em}"},function(t,e,i){var n=i(1),o=i(86);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=":root{--ck-color-table-focused-cell-background:#f5fafe}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused{background:var(--ck-color-table-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}"},function(t,e,i){var n=i(1),o=i(88);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2);padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0}.ck .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{width:var(--ck-insert-table-dropdown-box-width);height:var(--ck-insert-table-dropdown-box-height);margin:var(--ck-insert-table-dropdown-box-margin);border:1px solid var(--ck-color-base-border);border-radius:1px}.ck .ck-insert-table-dropdown-grid-box.ck-on{border-color:var(--ck-color-focus-border);background:var(--ck-color-focus-outer-shadow)}"},function(t,e,i){var n=i(1),o=i(90);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content .table{margin:1em auto;display:table}.ck-content .table table{border-collapse:collapse;border-spacing:0;width:100%;height:100%;border:1px double #b3b3b3}.ck-content .table table td,.ck-content .table table th{min-width:2em;padding:.4em;border-color:#d9d9d9}.ck-content .table table th{font-weight:700;background:#fafafa}"},function(t,e){t.exports=".ck-content code{background-color:hsla(0,0%,78%,.3);padding:.15em;border-radius:2px}"},function(t,e,i){var n=i(1),o=i(93);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-editor__editable .ck-horizontal-line{overflow:hidden}.ck-content hr{border:solid #5e5e5e;border-width:1px 0 0;margin:0}.ck-editor__editable .ck-horizontal-line{padding:5px 0}"},function(t,e,i){var n=i(1),o=i(95);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;position:absolute;pointer-events:none;left:0;top:0;outline:1px solid var(--ck-color-resizer)}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{position:absolute;pointer-events:all;width:var(--ck-resizer-size);height:var(--ck-resizer-size);background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{top:var(--ck-resizer-offset);left:var(--ck-resizer-offset);cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{top:var(--ck-resizer-offset);right:var(--ck-resizer-offset);cursor:nesw-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset);cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset);cursor:nesw-resize}"},function(t,e,i){var n=i(1),o=i(97);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck-content .image.image_resized{max-width:100%;display:block;box-sizing:border-box}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}"},function(t,e,i){var n=i(1),o=i(99);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#000}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{width:var(--ck-color-grid-tile-size);height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;border:0}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-table__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{display:none;color:var(--ck-color-color-grid-check-icon)}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}"},function(t,e,i){var n=i(1),o=i(101);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".ck .ck-button.ck-color-table__remove-color{display:flex;align-items:center;width:100%}label.ck.ck-color-grid__label{font-weight:unset}.ck .ck-button.ck-color-table__remove-color{padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck .ck-button.ck-color-table__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-base-border)}[dir=ltr] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck .ck-button.ck-color-table__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard)}"},function(t,e,i){var n=i(1),o=i(103);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[t.i,o,""]]);var s={injectType:"singletonStyleTag",insert:"head",singleton:!0},r=(n(o,s),o.locals?o.locals:{});t.exports=r},function(t,e){t.exports=".text-tiny{font-size:.7em}.text-small{font-size:.85em}.text-big{font-size:1.4em}.text-huge{font-size:1.8em}"},function(t,e,i){"use strict";i.r(e);var n=i(3),o=n.a.Symbol,s=Object.prototype,r=s.hasOwnProperty,a=s.toString,c=o?o.toStringTag:void 0;var l=function(t){var e=r.call(t,c),i=t[c];try{t[c]=void 0;var n=!0}catch(t){}var o=a.call(t);return n&&(e?t[c]=i:delete t[c]),o},d=Object.prototype.toString;var h=function(t){return d.call(t)},u=o?o.toStringTag:void 0;var f=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":u&&u in Object(t)?l(t):h(t)};var m=function(t,e){return function(i){return t(e(i))}},g=m(Object.getPrototypeOf,Object);var p=function(t){return null!=t&&"object"==typeof t},b=Function.prototype,w=Object.prototype,k=b.toString,_=w.hasOwnProperty,v=k.call(Object);var y=function(t){if(!p(t)||"[object Object]"!=f(t))return!1;var e=g(t);if(null===e)return!0;var i=_.call(e,"constructor")&&e.constructor;return"function"==typeof i&&i instanceof i&&k.call(i)==v};var x=function(){this.__data__=[],this.size=0};var A=function(t,e){return t===e||t!=t&&e!=e};var C=function(t,e){for(var i=t.length;i--;)if(A(t[i][0],e))return i;return-1},T=Array.prototype.splice;var P=function(t){var e=this.__data__,i=C(e,t);return!(i<0)&&(i==e.length-1?e.pop():T.call(e,i,1),--this.size,!0)};var S=function(t){var e=this.__data__,i=C(e,t);return i<0?void 0:e[i][1]};var E=function(t){return C(this.__data__,t)>-1};var M=function(t,e){var i=this.__data__,n=C(i,t);return n<0?(++this.size,i.push([t,e])):i[n][1]=e,this};function I(t){var e=-1,i=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991},Bt={};Bt["[object Float32Array]"]=Bt["[object Float64Array]"]=Bt["[object Int8Array]"]=Bt["[object Int16Array]"]=Bt["[object Int32Array]"]=Bt["[object Uint8Array]"]=Bt["[object Uint8ClampedArray]"]=Bt["[object Uint16Array]"]=Bt["[object Uint32Array]"]=!0,Bt["[object Arguments]"]=Bt["[object Array]"]=Bt["[object ArrayBuffer]"]=Bt["[object Boolean]"]=Bt["[object DataView]"]=Bt["[object Date]"]=Bt["[object Error]"]=Bt["[object Function]"]=Bt["[object Map]"]=Bt["[object Number]"]=Bt["[object Object]"]=Bt["[object RegExp]"]=Bt["[object Set]"]=Bt["[object String]"]=Bt["[object WeakMap]"]=!1;var Ft=function(t){return p(t)&&Vt(t.length)&&!!Bt[f(t)]};var Ht=function(t){return function(e){return t(e)}},Ut=i(5),Wt=Ut.a&&Ut.a.isTypedArray,qt=Wt?Ht(Wt):Ft,$t=Object.prototype.hasOwnProperty;var Yt=function(t,e){var i=Lt(t),n=!i&&Rt(t),o=!i&&!n&&Object(Dt.a)(t),s=!i&&!n&&!o&&qt(t),r=i||n||o||s,a=r?Et(t.length,String):[],c=a.length;for(var l in t)!e&&!$t.call(t,l)||r&&("length"==l||o&&("offset"==l||"parent"==l)||s&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||jt(l,c))||a.push(l);return a},Gt=Object.prototype;var Qt=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||Gt)},Kt=m(Object.keys,Object),Jt=Object.prototype.hasOwnProperty;var Zt=function(t){if(!Qt(t))return Kt(t);var e=[];for(var i in Object(t))Jt.call(t,i)&&"constructor"!=i&&e.push(i);return e};var Xt=function(t){return null!=t&&Vt(t.length)&&!V(t)};var te=function(t){return Xt(t)?Yt(t):Zt(t)};var ee=function(t,e){return t&&St(e,te(e),t)};var ie=function(t){var e=[];if(null!=t)for(var i in Object(t))e.push(i);return e},ne=Object.prototype.hasOwnProperty;var oe=function(t){if(!z(t))return ie(t);var e=Qt(t),i=[];for(var n in t)("constructor"!=n||!e&&ne.call(t,n))&&i.push(n);return i};var se=function(t){return Xt(t)?Yt(t,!0):oe(t)};var re=function(t,e){return t&&St(e,se(e),t)},ae=i(8);var ce=function(t,e){var i=-1,n=t.length;for(e||(e=Array(n));++i{this._setToTarget(t,n,e[n],i)})}}function oi(t){return ei(t,si)}function si(t){return ii(t)?t:void 0}var ri=function(){return function t(){t.called=!0}};class ai{constructor(t,e){this.source=t,this.name=e,this.path=[],this.stop=ri(),this.off=ri()}}const ci=new Array(256).fill().map((t,e)=>("0"+e.toString(16)).slice(-2));function li(){const t=4294967296*Math.random()>>>0,e=4294967296*Math.random()>>>0,i=4294967296*Math.random()>>>0,n=4294967296*Math.random()>>>0;return"e"+ci[t>>0&255]+ci[t>>8&255]+ci[t>>16&255]+ci[t>>24&255]+ci[e>>0&255]+ci[e>>8&255]+ci[e>>16&255]+ci[e>>24&255]+ci[i>>0&255]+ci[i>>8&255]+ci[i>>16&255]+ci[i>>24&255]+ci[n>>0&255]+ci[n>>8&255]+ci[n>>16&255]+ci[n>>24&255]}var di={get(t){return"number"!=typeof t?this[t]||this.normal:t},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5},hi=(i(6),i(0));const ui=Symbol("listeningTo"),fi=Symbol("emitterId");var mi={on(t,e,i={}){this.listenTo(this,t,e,i)},once(t,e,i){let n=!1;this.listenTo(this,t,(function(t,...i){n||(n=!0,t.off(),e.call(this,t,...i))}),i)},off(t,e){this.stopListening(this,t,e)},listenTo(t,e,i,n={}){let o,s;this[ui]||(this[ui]={});const r=this[ui];pi(t)||gi(t);const a=pi(t);(o=r[a])||(o=r[a]={emitter:t,callbacks:{}}),(s=o.callbacks[e])||(s=o.callbacks[e]=[]),s.push(i),function(t,e){const i=bi(t);if(i[e])return;let n=e,o=null;const s=[];for(;""!==n&&!i[n];)i[n]={callbacks:[],childEvents:[]},s.push(i[n]),o&&i[n].childEvents.push(o),o=n,n=n.substr(0,n.lastIndexOf(":"));if(""!==n){for(const t of s)t.callbacks=i[n].callbacks.slice();i[n].childEvents.push(o)}}(t,e);const c=wi(t,e),l=di.get(n.priority),d={callback:i,priority:l};for(const t of c){let e=!1;for(let i=0;i-1?t(e,i.substr(0,i.lastIndexOf(":"))):null;return n.callbacks}(this,n);if(i.path.push(this),o){const t=[i,...e];o=Array.from(o);for(let e=0;e{this._delegations||(this._delegations=new Map),t.forEach(t=>{const n=this._delegations.get(t);n?n.set(e,i):this._delegations.set(t,new Map([[e,i]]))})}}},stopDelegating(t,e){if(this._delegations)if(t)if(e){const i=this._delegations.get(t);i&&i.delete(e)}else this._delegations.delete(t);else this._delegations.clear()}};function gi(t,e){t[fi]||(t[fi]=e||li())}function pi(t){return t[fi]}function bi(t){return t._events||Object.defineProperty(t,"_events",{value:{}}),t._events}function wi(t,e){const i=bi(t)[e];if(!i)return[];let n=[i.callbacks];for(let e=0;e{Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e)).forEach(i=>{if(i in t.prototype)return;const n=Object.getOwnPropertyDescriptor(e,i);n.enumerable=!1,Object.defineProperty(t.prototype,i,n)})})}class yi{constructor(t={}){this._items=[],this._itemMap=new Map,this._idProperty=t.idProperty||"id",this._bindToExternalToInternalMap=new WeakMap,this._bindToInternalToExternalMap=new WeakMap,this._skippedIndexesFromExternal=[]}get length(){return this._items.length}get first(){return this._items[0]||null}get last(){return this._items[this.length-1]||null}add(t,e){let i;const n=this._idProperty;if(n in t){if(i=t[n],"string"!=typeof i)throw new hi.b("collection-add-invalid-id",this);if(this.get(i))throw new hi.b("collection-add-item-already-exists",this)}else t[n]=i=li();if(void 0===e)e=this._items.length;else if(e>this._items.length||e<0)throw new hi.b("collection-add-item-invalid-index",this);return this._items.splice(e,0,t),this._itemMap.set(i,t),this.fire("add",t,e),this}get(t){let e;if("string"==typeof t)e=this._itemMap.get(t);else{if("number"!=typeof t)throw new hi.b("collection-get-invalid-arg: Index or id must be given.",this);e=this._items[t]}return e||null}has(t){if("string"==typeof t)return this._itemMap.has(t);{const e=t[this._idProperty];return this._itemMap.has(e)}}getIndex(t){let e;return e="string"==typeof t?this._itemMap.get(t):t,this._items.indexOf(e)}remove(t){let e,i,n,o=!1;const s=this._idProperty;if("string"==typeof t?(i=t,n=this._itemMap.get(i),o=!n,n&&(e=this._items.indexOf(n))):"number"==typeof t?(e=t,n=this._items[e],o=!n,n&&(i=n[s])):(n=t,i=n[s],e=this._items.indexOf(n),o=-1==e||!this._itemMap.get(i)),o)throw new hi.b("collection-remove-404: Item not found.",this);this._items.splice(e,1),this._itemMap.delete(i);const r=this._bindToInternalToExternalMap.get(n);return this._bindToInternalToExternalMap.delete(n),this._bindToExternalToInternalMap.delete(r),this.fire("remove",n,e),n}map(t,e){return this._items.map(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){for(this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);this.length;)this.remove(0)}bindTo(t){if(this._bindToCollection)throw new hi.b("collection-bind-to-rebind: The collection cannot be bound more than once.",this);return this._bindToCollection=t,{as:t=>{this._setUpBindToBinding(e=>new t(e))},using:t=>{"function"==typeof t?this._setUpBindToBinding(e=>t(e)):this._setUpBindToBinding(e=>e[t])}}}_setUpBindToBinding(t){const e=this._bindToCollection,i=(i,n,o)=>{const s=e._bindToCollection==this,r=e._bindToInternalToExternalMap.get(n);if(s&&r)this._bindToExternalToInternalMap.set(n,r),this._bindToInternalToExternalMap.set(r,n);else{const i=t(n);if(!i)return void this._skippedIndexesFromExternal.push(o);let s=o;for(const t of this._skippedIndexesFromExternal)o>t&&s--;for(const t of e._skippedIndexesFromExternal)s>=t&&s++;this._bindToExternalToInternalMap.set(n,i),this._bindToInternalToExternalMap.set(i,n),this.add(i,s);for(let t=0;t{const n=this._bindToExternalToInternalMap.get(e);n&&this.remove(n),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce((t,e)=>(ie&&t.push(e),t),[])})}[Symbol.iterator](){return this._items[Symbol.iterator]()}}vi(yi,mi);class xi{constructor(t,e=[],i=[]){this._context=t,this._plugins=new Map,this._availablePlugins=new Map;for(const t of e)t.pluginName&&this._availablePlugins.set(t.pluginName,t);this._contextPlugins=new Map;for(const[t,e]of i)this._contextPlugins.set(t,e),this._contextPlugins.set(e,t),t.pluginName&&this._availablePlugins.set(t.pluginName,t)}*[Symbol.iterator](){for(const t of this._plugins)"function"==typeof t[0]&&(yield t)}get(t){const e=this._plugins.get(t);if(!e){const e="plugincollection-plugin-not-loaded: The requested plugin is not loaded.";let i=t;throw"function"==typeof t&&(i=t.pluginName||t.name),new hi.b(e,this._context,{plugin:i})}return e}has(t){return this._plugins.has(t)}init(t,e=[]){const i=this,n=this._context,o=new Set,s=[],r=u(t),a=u(e),c=function(t){const e=[];for(const i of t)h(i)||e.push(i);return e.length?e:null}(t);if(c){const t="plugincollection-plugin-not-found: Some plugins are not available and could not be loaded.";return console.error(Object(hi.a)(t),{plugins:c}),Promise.reject(new hi.b(t,n,{plugins:c}))}return Promise.all(r.map(l)).then(()=>d(s,"init")).then(()=>d(s,"afterInit")).then(()=>s);function l(t){if(!a.includes(t)&&!i._plugins.has(t)&&!o.has(t))return function(t){return new Promise(r=>{o.add(t),t.requires&&t.requires.forEach(i=>{const o=h(i);if(t.isContextPlugin&&!o.isContextPlugin)throw new hi.b("plugincollection-context-required: Context plugin can not require plugin which is not a context plugin",null,{plugin:o.name,requiredBy:t.name});if(e.includes(o))throw new hi.b("plugincollection-required: Cannot load a plugin because one of its dependencies is listed inthe `removePlugins` option.",n,{plugin:o.name,requiredBy:t.name});l(o)});const a=i._contextPlugins.get(t)||new t(n);i._add(t,a),s.push(a),r()})}(t).catch(e=>{throw console.error(Object(hi.a)("plugincollection-load: It was not possible to load the plugin."),{plugin:t}),e})}function d(t,e){return t.reduce((t,n)=>n[e]?i._contextPlugins.has(n)?t:t.then(n[e].bind(n)):t,Promise.resolve())}function h(t){return"function"==typeof t?t:i._availablePlugins.get(t)}function u(t){return t.map(t=>h(t)).filter(t=>!!t)}}destroy(){const t=[];for(const[,e]of this)"function"!=typeof e.destroy||this._contextPlugins.has(e)||t.push(e.destroy());return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const i=t.pluginName;if(i){if(this._plugins.has(i))throw new hi.b("plugincollection-plugin-name-conflict: Two plugins with the same name were loaded.",null,{pluginName:i,plugin1:this._plugins.get(i).constructor,plugin2:t});this._plugins.set(i,e)}}}function Ai(t,e){const i=Object.keys(window.CKEDITOR_TRANSLATIONS).length;return 1===i&&(t=Object.keys(window.CKEDITOR_TRANSLATIONS)[0]),0!==i&&function(t,e){return t in window.CKEDITOR_TRANSLATIONS&&e in window.CKEDITOR_TRANSLATIONS[t]}(t,e)?window.CKEDITOR_TRANSLATIONS[t][e].replace(/ \[context: [^\]]+\]$/,""):e.replace(/ \[context: [^\]]+\]$/,"")}vi(xi,mi),window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={});const Ci=["ar","fa","he","ku","ug"];class Ti{constructor(t={}){this.uiLanguage=t.uiLanguage||"en",this.contentLanguage=t.contentLanguage||this.uiLanguage,this.uiLanguageDirection=Pi(this.uiLanguage),this.contentLanguageDirection=Pi(this.contentLanguage),this.t=(...t)=>this._t(...t)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(t,e){let i=Ai(this.uiLanguage,t);return e&&(i=i.replace(/%(\d+)/g,(t,i)=>it.destroy())).then(()=>this.plugins.destroy())}_addEditor(t,e){if(this._contextOwner)throw new hi.b("context-addEditor-private-context: Cannot add multiple editors to the context which is created by the editor.");this.editors.add(t),e&&(this._contextOwner=t)}_removeEditor(t){return this.editors.has(t)&&this.editors.remove(t),this._contextOwner===t?this.destroy():Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names())["plugins","removePlugins","extraPlugins"].includes(e)||(t[e]=this.config.get(e));return t}static create(t){return new Promise(e=>{const i=new this(t);e(i.initPlugins().then(()=>i))})}}function Ei(t,e){const i=Math.min(t.length,e.length);for(let n=0;nt.data.length)throw new hi.b("view-textproxy-wrong-offsetintext: Given offsetInText value is incorrect.",this);if(i<0||e+i>t.data.length)throw new hi.b("view-textproxy-wrong-length: Given length value is incorrect.",this);this.data=t.data.substring(e,e+i),this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(t){return"textProxy"==t||"view:textProxy"==t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let i=t.includeSelf?this.textNode:this.parent;for(;null!==i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}}function Ri(t){return!(!t||!t[Symbol.iterator])}function Li(t){return Ri(t)?new Map(t):function(t){const e=new Map;for(const i in t)e.set(i,t[i]);return e}(t)}class Di{constructor(...t){this._patterns=[],this.add(...t)}add(...t){for(let e of t)("string"==typeof e||e instanceof RegExp)&&(e={name:e}),e.classes&&("string"==typeof e.classes||e.classes instanceof RegExp)&&(e.classes=[e.classes]),this._patterns.push(e)}match(...t){for(const e of t)for(const t of this._patterns){const i=zi(e,t);if(i)return{element:e,pattern:t,match:i}}return null}matchAll(...t){const e=[];for(const i of t)for(const t of this._patterns){const n=zi(i,t);n&&e.push({element:i,pattern:t,match:n})}return e.length>0?e:null}getElementName(){if(1!==this._patterns.length)return null;const t=this._patterns[0],e=t.name;return"function"==typeof t||!e||e instanceof RegExp?null:e}}function zi(t,e){if("function"==typeof e)return e(t);const i={};return e.name&&(i.name=function(t,e){if(t instanceof RegExp)return t.test(e);return t===e}(e.name,t.name),!i.name)||e.attributes&&(i.attributes=function(t,e){const i=[];for(const n in t){const o=t[n];if(!e.hasAttribute(n))return null;{const t=e.getAttribute(n);if(!0===o)i.push(n);else if(o instanceof RegExp){if(!o.test(t))return null;i.push(n)}else{if(t!==o)return null;i.push(n)}}}return i}(e.attributes,t),!i.attributes)?null:!(e.classes&&(i.classes=function(t,e){const i=[];for(const n of t)if(n instanceof RegExp){const t=e.getClassNames();for(const e of t)n.test(e)&&i.push(e);if(0===i.length)return null}else{if(!e.hasClass(n))return null;i.push(n)}return i}(e.classes,t),!i.classes))&&(!(e.styles&&(i.styles=function(t,e){const i=[];for(const n in t){const o=t[n];if(!e.hasStyle(n))return null;{const t=e.getStyle(n);if(o instanceof RegExp){if(!o.test(t))return null;i.push(n)}else{if(t!==o)return null;i.push(n)}}}return i}(e.styles,t),!i.styles))&&i)}var ji=function(t){return"symbol"==typeof t||p(t)&&"[object Symbol]"==f(t)},Vi=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Bi=/^\w*$/;var Fi=function(t,e){if(Lt(t))return!1;var i=typeof t;return!("number"!=i&&"symbol"!=i&&"boolean"!=i&&null!=t&&!ji(t))||(Bi.test(t)||!Vi.test(t)||null!=e&&t in Object(e))};function Hi(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var i=function(){var n=arguments,o=e?e.apply(this,n):n[0],s=i.cache;if(s.has(o))return s.get(o);var r=t.apply(this,n);return i.cache=s.set(o,r)||s,r};return i.cache=new(Hi.Cache||kt),i}Hi.Cache=kt;var Ui=Hi;var Wi=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,qi=/\\(\\)?/g,$i=function(t){var e=Ui(t,(function(t){return 500===i.size&&i.clear(),t})),i=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(Wi,(function(t,i,n,o){e.push(n?o.replace(qi,"$1"):i||t)})),e}));var Yi=function(t,e){for(var i=-1,n=null==t?0:t.length,o=Array(n);++io?0:o+e),(i=i>o?o:i)<0&&(i+=o),o=e>i?0:i-e>>>0,e>>>=0;for(var s=Array(o);++n0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(_n);var xn=function(t,e){return yn(wn(t,e,gn),t+"")};var An=function(t,e,i){if(!z(i))return!1;var n=typeof e;return!!("number"==n?Xt(i)&&jt(e,i.length):"string"==n&&e in i)&&A(i[e],t)};var Cn=function(t){return xn((function(e,i){var n=-1,o=i.length,s=o>1?i[o-1]:void 0,r=o>2?i[2]:void 0;for(s=t.length>3&&"function"==typeof s?(o--,s):void 0,r&&An(i[0],i[1],r)&&(s=o<3?void 0:s,o=1),e=Object(e);++nEn._styleProcessor,enumerable:!1})}get isEmpty(){const t=Object.entries(this._styles);return!Array.from(t).length}get size(){return this.isEmpty?0:this.getStyleNames().length}setTo(t){this.clear();const e=Array.from(function(t){let e=null,i=0,n=0,o=null;const s=new Map;if(""===t)return s;";"!=t.charAt(t.length-1)&&(t+=";");for(let r=0;re===t);return Array.isArray(e)}set(t,e){if(z(t))for(const[e,i]of Object.entries(t))this._styleProcessor.toNormalizedForm(e,i,this._styles);else this._styleProcessor.toNormalizedForm(t,e,this._styles)}remove(t){const e=In(t);rn(this._styles,e),delete this._styles[t],this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){return this.isEmpty?"":this._getStylesEntries().map(t=>t.join(":")).sort().join(";")+";"}getAsString(t){if(this.isEmpty)return;if(this._styles[t]&&!z(this._styles[t]))return this._styles[t];const e=this._styleProcessor.getReducedForm(t,this._styles).find(([e])=>e===t);return Array.isArray(e)?e[1]:void 0}getStyleNames(){if(this.isEmpty)return[];return this._getStylesEntries().map(([t])=>t)}clear(){this._styles={}}static getRelatedStyles(t){return this._styleProcessor.getRelatedStyles(t)}_getStylesEntries(){const t=[],e=Object.keys(this._styles);for(const i of e)t.push(...this._styleProcessor.getReducedForm(i,this._styles));return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");if(!(e.length>1))return;const i=e.splice(0,e.length-1).join("."),n=an(this._styles,i);n&&!Array.from(Object.keys(n)).length&&this.remove(i)}static get _styleProcessor(){return this._processor||(this._processor=new Mn),this._processor}static _setProcessor(t){this._processor=t}}class Mn{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(t,e,i){if(z(e))Nn(i,In(t),e);else if(this._normalizers.has(t)){const n=this._normalizers.get(t),{path:o,value:s}=n(e);Nn(i,o,s)}else Nn(i,t,e)}getNormalized(t,e){if(!t)return Tn({},e);if(void 0!==e[t])return e[t];if(this._extractors.has(t)){const i=this._extractors.get(t);if("string"==typeof i)return an(e,i);const n=i(t,e);if(n)return n}return an(e,In(t))}getReducedForm(t,e){const i=this.getNormalized(t,e);if(void 0===i)return[];if(this._reducers.has(t)){return this._reducers.get(t)(i)}return[[t,i]]}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const i of e)this._mapStyleNames(i,[t])}_mapStyleNames(t,e){this._consumables.has(t)||this._consumables.set(t,[]),this._consumables.get(t).push(...e)}}function In(t){return t.replace("-",".")}function Nn(t,e,i){let n=i;z(i)&&(n=Tn({},an(t,e),i)),Sn(t,e,n)}class On extends Ii{constructor(t,e,i){if(super(),this.name=t,this._attrs=function(t){t=Li(t);for(const[e,i]of t)null===i?t.delete(e):"string"!=typeof i&&t.set(e,String(i));return t}(e),this._children=[],i&&this._insertChild(0,i),this._classes=new Set,this._attrs.has("class")){const t=this._attrs.get("class");Rn(this._classes,t),this._attrs.delete("class")}this._styles=new En,this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style")),this._customProperties=new Map}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}is(t,e=null){const i=t.replace(/^view:/,"");return e?"element"==i&&e==this.name:"element"==i||i==this.name||super.is(t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(t){if("class"==t)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==t){const t=this._styles.toString();return""==t?void 0:t}return this._attrs.get(t)}hasAttribute(t){return"class"==t?this._classes.size>0:"style"==t?!this._styles.isEmpty:this._attrs.has(t)}isSimilar(t){if(!(t instanceof On))return!1;if(this===t)return!0;if(this.name!=t.name)return!1;if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size)return!1;for(const[e,i]of this._attrs)if(!t._attrs.has(e)||t._attrs.get(e)!==i)return!1;for(const e of this._classes)if(!t._classes.has(e))return!1;for(const e of this._styles.getStyleNames())if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e))return!1;return!0}hasClass(...t){for(const e of t)if(!this._classes.has(e))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(){return this._styles.getStyleNames()}hasStyle(...t){for(const e of t)if(!this._styles.has(e))return!1;return!0}findAncestor(...t){const e=new Di(...t);let i=this.parent;for(;i;){if(e.match(i))return i;i=i.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(","),e=this._styles.toString(),i=Array.from(this._attrs).map(t=>`${t[0]}="${t[1]}"`).sort().join(" ");return this.name+(""==t?"":` class="${t}"`)+(e?` style="${e}"`:"")+(""==i?"":` ${i}`)}_clone(t=!1){const e=[];if(t)for(const i of this.getChildren())e.push(i._clone(t));const i=new this.constructor(this.name,this._attrs,e);return i._classes=new Set(this._classes),i._styles.set(this._styles.getNormalized()),i._customProperties=new Map(this._customProperties),i.getFillerOffset=this.getFillerOffset,i}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let i=0;const n=function(t){if("string"==typeof t)return[new Ni(t)];Ri(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new Ni(t):t instanceof Oi?new Ni(t.data):t)}(e);for(const e of n)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,i++;return i}_removeChildren(t,e=1){this._fireChange("children",this);for(let i=t;i0&&(this._classes.clear(),!0):"style"==t?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this),(t=Array.isArray(t)?t:[t]).forEach(t=>this._classes.add(t))}_removeClass(t){this._fireChange("attributes",this),(t=Array.isArray(t)?t:[t]).forEach(t=>this._classes.delete(t))}_setStyle(t,e){this._fireChange("attributes",this),this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this),(t=Array.isArray(t)?t:[t]).forEach(t=>this._styles.remove(t))}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function Rn(t,e){const i=e.split(/\s+/);t.clear(),i.forEach(e=>t.add(e))}class Ln extends On{constructor(t,e,i){super(t,e,i),this.getFillerOffset=Dn}is(t,e=null){const i=t&&t.replace(/^view:/,"");return e?"containerElement"==i&&e==this.name||super.is(t,e):"containerElement"==i||super.is(t)}}function Dn(){const t=[...this.getChildren()],e=t[this.childCount-1];if(e&&e.is("element","br"))return this.childCount;for(const e of t)if(!e.is("uiElement"))return null;return this.childCount}var zn=Cn((function(t,e){St(e,se(e),t)}));const jn=Symbol("observableProperties"),Vn=Symbol("boundObservables"),Bn=Symbol("boundProperties"),Fn={set(t,e){if(z(t))return void Object.keys(t).forEach(e=>{this.set(e,t[e])},this);Un(this);const i=this[jn];if(t in this&&!i.has(t))throw new hi.b("observable-set-cannot-override: Cannot override an existing property.",this);Object.defineProperty(this,t,{enumerable:!0,configurable:!0,get:()=>i.get(t),set(e){const n=i.get(t);let o=this.fire("set:"+t,t,e,n);void 0===o&&(o=e),n===o&&i.has(t)||(i.set(t,o),this.fire("change:"+t,t,o,n))}}),this[t]=e},bind(...t){if(!t.length||!$n(t))throw new hi.b("observable-bind-wrong-properties: All properties must be strings.",this);if(new Set(t).size!==t.length)throw new hi.b("observable-bind-duplicate-properties: Properties must be unique.",this);Un(this);const e=this[Bn];t.forEach(t=>{if(e.has(t))throw new hi.b("observable-bind-rebind: Cannot bind the same property more than once.",this)});const i=new Map;return t.forEach(t=>{const n={property:t,to:[]};e.set(t,n),i.set(t,n)}),{to:Wn,toMany:qn,_observable:this,_bindProperties:t,_to:[],_bindings:i}},unbind(...t){if(!(jn in this))return;const e=this[Bn],i=this[Vn];if(t.length){if(!$n(t))throw new hi.b("observable-unbind-wrong-properties: Properties must be strings.",this);t.forEach(t=>{const n=e.get(t);if(!n)return;let o,s,r,a;n.to.forEach(t=>{o=t[0],s=t[1],r=i.get(o),a=r[s],a.delete(n),a.size||delete r[s],Object.keys(r).length||(i.delete(o),this.stopListening(o,"change"))}),e.delete(t)})}else i.forEach((t,e)=>{this.stopListening(e,"change")}),i.clear(),e.clear()},decorate(t){const e=this[t];if(!e)throw new hi.b("observablemixin-cannot-decorate-undefined: Cannot decorate an undefined method.",this,{object:this,methodName:t});this.on(t,(t,i)=>{t.return=e.apply(this,i)}),this[t]=function(...e){return this.fire(t,e)}}};zn(Fn,mi);var Hn=Fn;function Un(t){jn in t||(Object.defineProperty(t,jn,{value:new Map}),Object.defineProperty(t,Vn,{value:new Map}),Object.defineProperty(t,Bn,{value:new Map}))}function Wn(...t){const e=function(...t){if(!t.length)throw new hi.b("observable-bind-to-parse-error: Invalid argument syntax in `to()`.",null);const e={to:[]};let i;"function"==typeof t[t.length-1]&&(e.callback=t.pop());return t.forEach(t=>{if("string"==typeof t)i.properties.push(t);else{if("object"!=typeof t)throw new hi.b("observable-bind-to-parse-error: Invalid argument syntax in `to()`.",null);i={observable:t,properties:[]},e.to.push(i)}}),e}(...t),i=Array.from(this._bindings.keys()),n=i.length;if(!e.callback&&e.to.length>1)throw new hi.b("observable-bind-to-no-callback: Binding multiple observables only possible with callback.",this);if(n>1&&e.callback)throw new hi.b("observable-bind-to-extra-callback: Cannot bind multiple properties and use a callback in one binding.",this);var o;e.to.forEach(t=>{if(t.properties.length&&t.properties.length!==n)throw new hi.b("observable-bind-to-properties-length: The number of properties must match.",this);t.properties.length||(t.properties=this._bindProperties)}),this._to=e.to,e.callback&&(this._bindings.get(i[0]).callback=e.callback),o=this._observable,this._to.forEach(t=>{const e=o[Vn];let i;e.get(t.observable)||o.listenTo(t.observable,"change",(n,s)=>{i=e.get(t.observable)[s],i&&i.forEach(t=>{Yn(o,t.property)})})}),function(t){let e;t._bindings.forEach((i,n)=>{t._to.forEach(o=>{e=o.properties[i.callback?0:t._bindProperties.indexOf(n)],i.to.push([o.observable,e]),function(t,e,i,n){const o=t[Vn],s=o.get(i),r=s||{};r[n]||(r[n]=new Set);r[n].add(e),s||o.set(i,r)}(t._observable,i,o.observable,e)})})}(this),this._bindProperties.forEach(t=>{Yn(this._observable,t)})}function qn(t,e,i){if(this._bindings.size>1)throw new hi.b("observable-bind-to-many-not-one-binding: Cannot bind multiple properties with toMany().",this);this.to(...function(t,e){const i=t.map(t=>[t,e]);return Array.prototype.concat.apply([],i)}(t,e),i)}function $n(t){return t.every(t=>"string"==typeof t)}function Yn(t,e){const i=t[Bn].get(e);let n;i.callback?n=i.callback.apply(t,i.to.map(t=>t[0][t[1]])):(n=i.to[0],n=n[0][n[1]]),t.hasOwnProperty(e)?t[e]=n:t.set(e,n)}const Gn=Symbol("document");class Qn extends Ln{constructor(t,e,i){super(t,e,i),this.set("isReadOnly",!1),this.set("isFocused",!1)}is(t,e=null){const i=t&&t.replace(/^view:/,"");return e?"editableElement"==i&&e==this.name||super.is(t,e):"editableElement"==i||super.is(t)}destroy(){this.stopListening()}get document(){return this.getCustomProperty(Gn)}set _document(t){if(this.getCustomProperty(Gn))throw new hi.b("view-editableelement-document-already-set: View document is already set.",this);this._setCustomProperty(Gn,t),this.bind("isReadOnly").to(t),this.bind("isFocused").to(t,"isFocused",e=>e&&t.selection.editableElement==this),this.listenTo(t.selection,"change",()=>{this.isFocused=t.isFocused&&t.selection.editableElement==this})}}vi(Qn,Hn);const Kn=Symbol("rootName");class Jn extends Qn{constructor(t){super(t),this.rootName="main"}is(t,e=null){const i=t.replace(/^view:/,"");return e?"rootElement"==i&&e==this.name||super.is(t,e):"rootElement"==i||super.is(t)}get rootName(){return this.getCustomProperty(Kn)}set rootName(t){this._setCustomProperty(Kn,t)}set _name(t){this.name=t}}class Zn{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new hi.b("view-tree-walker-no-start-position: Neither boundaries nor starting position have been defined.",null);if(t.direction&&"forward"!=t.direction&&"backward"!=t.direction)throw new hi.b("view-tree-walker-unknown-direction: Only `backward` and `forward` direction allowed.",t.startPosition,{direction:t.direction});this.boundaries=t.boundaries||null,t.startPosition?this.position=Xn._createAt(t.startPosition):this.position=Xn._createAt(t.boundaries["backward"==t.direction?"end":"start"]),this.direction=t.direction||"forward",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}skip(t){let e,i,n;do{n=this.position,({done:e,value:i}=this.next())}while(!e&&t(i));e||(this.position=n)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let t=this.position.clone();const e=this.position,i=t.parent;if(null===i.parent&&t.offset===i.childCount)return{done:!0};if(i===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0};let n;if(i instanceof Ni){if(t.isAtEnd)return this.position=Xn._createAfter(i),this._next();n=i.data[t.offset]}else n=i.getChild(t.offset);if(n instanceof On)return this.shallow?t.offset++:t=new Xn(n,0),this.position=t,this._formatReturnValue("elementStart",n,e,t,1);if(n instanceof Ni){if(this.singleCharacters)return t=new Xn(n,0),this.position=t,this._next();{let i,o=n.data.length;return n==this._boundaryEndParent?(o=this.boundaries.end.offset,i=new Oi(n,0,o),t=Xn._createAfter(i)):(i=new Oi(n,0,n.data.length),t.offset++),this.position=t,this._formatReturnValue("text",i,e,t,o)}}if("string"==typeof n){let n;if(this.singleCharacters)n=1;else{n=(i===this._boundaryEndParent?this.boundaries.end.offset:i.data.length)-t.offset}const o=new Oi(i,t.offset,n);return t.offset+=n,this.position=t,this._formatReturnValue("text",o,e,t,n)}return t=Xn._createAfter(i),this.position=t,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",i,e,t)}_previous(){let t=this.position.clone();const e=this.position,i=t.parent;if(null===i.parent&&0===t.offset)return{done:!0};if(i==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0};let n;if(i instanceof Ni){if(t.isAtStart)return this.position=Xn._createBefore(i),this._previous();n=i.data[t.offset-1]}else n=i.getChild(t.offset-1);if(n instanceof On)return this.shallow?(t.offset--,this.position=t,this._formatReturnValue("elementStart",n,e,t,1)):(t=new Xn(n,n.childCount),this.position=t,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",n,e,t));if(n instanceof Ni){if(this.singleCharacters)return t=new Xn(n,n.data.length),this.position=t,this._previous();{let i,o=n.data.length;if(n==this._boundaryStartParent){const e=this.boundaries.start.offset;i=new Oi(n,e,n.data.length-e),o=i.data.length,t=Xn._createBefore(i)}else i=new Oi(n,0,n.data.length),t.offset--;return this.position=t,this._formatReturnValue("text",i,e,t,o)}}if("string"==typeof n){let n;if(this.singleCharacters)n=1;else{const e=i===this._boundaryStartParent?this.boundaries.start.offset:0;n=t.offset-e}t.offset-=n;const o=new Oi(i,t.offset,n);return this.position=t,this._formatReturnValue("text",o,e,t,n)}return t=Xn._createBefore(i),this.position=t,this._formatReturnValue("elementStart",i,e,t,1)}_formatReturnValue(t,e,i,n,o){return e instanceof Oi&&(e.offsetInText+e.data.length==e.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?i=Xn._createAfter(e.textNode):(n=Xn._createAfter(e.textNode),this.position=n)),0===e.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?i=Xn._createBefore(e.textNode):(n=Xn._createBefore(e.textNode),this.position=n))),{done:!1,value:{type:t,item:e,previousPosition:i,nextPosition:n,length:o}}}}class Xn{constructor(t,e){this.parent=t,this.offset=e}get nodeAfter(){return this.parent.is("text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const t=this.parent.is("text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;for(;!(t instanceof Qn);){if(!t.parent)return null;t=t.parent}return t}getShiftedBy(t){const e=Xn._createAt(this),i=e.offset+t;return e.offset=i<0?0:i,e}getLastMatchingPosition(t,e={}){e.startPosition=this;const i=new Zn(e);return i.skip(t),i.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(t){const e=this.getAncestors(),i=t.getAncestors();let n=0;for(;e[n]==i[n]&&e[n];)n++;return 0===n?null:e[n-1]}is(t){return"position"==t||"view:position"==t}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return"before"==this.compareWith(t)}isAfter(t){return"after"==this.compareWith(t)}compareWith(t){if(this.root!==t.root)return"different";if(this.isEqual(t))return"same";const e=this.parent.is("node")?this.parent.getPath():[],i=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset),i.push(t.offset);const n=Ei(e,i);switch(n){case"prefix":return"before";case"extension":return"after";default:return e[n]0?new this(i,n):new this(n,i)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(Xn._createBefore(t),e)}}function eo(t){return!(!t.item.is("attributeElement")&&!t.item.is("uiElement"))}function io(t){let e=0;for(const i of t)e++;return e}class no{constructor(t=null,e,i){this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",this.setTo(t,e,i)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.end:t.start).clone()}get focus(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.start:t.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const t of this._ranges)yield t.clone()}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel)return!1;if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let i=!1;for(const n of t._ranges)if(e.isEqual(n)){i=!0;break}if(!i)return!1}return!0}isSimilar(t){if(this.isBackward!=t.isBackward)return!1;const e=io(this.getRanges());if(e!=io(t.getRanges()))return!1;if(0==e)return!0;for(let e of this.getRanges()){e=e.getTrimmed();let i=!1;for(let n of t.getRanges())if(n=n.getTrimmed(),e.start.isEqual(n.start)&&e.end.isEqual(n.end)){i=!0;break}if(!i)return!1}return!0}getSelectedElement(){if(1!==this.rangeCount)return null;const t=this.getFirstRange();let e=t.start.nodeAfter,i=t.end.nodeBefore;return t.start.parent.is("text")&&t.start.isAtEnd&&t.start.parent.nextSibling&&(e=t.start.parent.nextSibling),t.end.parent.is("text")&&t.end.isAtStart&&t.end.parent.previousSibling&&(i=t.end.parent.previousSibling),e instanceof On&&e==i?e:null}setTo(t,e,i){if(null===t)this._setRanges([]),this._setFakeOptions(e);else if(t instanceof no||t instanceof oo)this._setRanges(t.getRanges(),t.isBackward),this._setFakeOptions({fake:t.isFake,label:t.fakeSelectionLabel});else if(t instanceof to)this._setRanges([t],e&&e.backward),this._setFakeOptions(e);else if(t instanceof Xn)this._setRanges([new to(t)]),this._setFakeOptions(e);else if(t instanceof Ii){const n=!!i&&!!i.backward;let o;if(void 0===e)throw new hi.b("view-selection-setTo-required-second-parameter: selection.setTo requires the second parameter when the first parameter is a node.",this);o="in"==e?to._createIn(t):"on"==e?to._createOn(t):new to(Xn._createAt(t,e)),this._setRanges([o],n),this._setFakeOptions(i)}else{if(!Ri(t))throw new hi.b("view-selection-setTo-not-selectable: Cannot set selection to given place.",this);this._setRanges(t,e&&e.backward),this._setFakeOptions(e)}this.fire("change")}setFocus(t,e){if(null===this.anchor)throw new hi.b("view-selection-setFocus-no-ranges: Cannot set selection focus if there are no ranges in selection.",this);const i=Xn._createAt(t,e);if("same"==i.compareWith(this.focus))return;const n=this.anchor;this._ranges.pop(),"before"==i.compareWith(n)?this._addRange(new to(i,n),!0):this._addRange(new to(n,i)),this.fire("change")}is(t){return"selection"==t||"view:selection"==t}_setRanges(t,e=!1){t=Array.from(t),this._ranges=[];for(const e of t)this._addRange(e);this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake,this._fakeSelectionLabel=t.fake&&t.label||""}_addRange(t,e=!1){if(!(t instanceof to))throw new hi.b("view-selection-add-range-not-range: Selection range set to an object that is not an instance of view.Range",this);this._pushRange(t),this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges)if(t.isIntersecting(e))throw new hi.b("view-selection-range-intersects: Trying to add a range that intersects with another range from selection.",this,{addedRange:t,intersectingRange:e});this._ranges.push(new to(t.start,t.end))}}vi(no,mi);class oo{constructor(t=null,e,i){this._selection=new no,this._selection.delegate("change").to(this),this._selection.setTo(t,e,i)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}is(t){return"selection"==t||"documentSelection"==t||"view:selection"==t||"view:documentSelection"==t}_setTo(t,e,i){this._selection.setTo(t,e,i)}_setFocus(t,e){this._selection.setFocus(t,e)}}vi(oo,mi);class so{constructor(){this.selection=new oo,this.roots=new yi({idProperty:"rootName"}),this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isComposing",!1),this._postFixers=new Set}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.map(t=>t.destroy()),this.stopListening()}addStyleProcessorRules(t){t(En._styleProcessor)}_callPostFixers(t){let e=!1;do{for(const i of this._postFixers)if(e=i(t),e)break}while(e)}}vi(so,Hn);class ro extends On{constructor(t,e,i){super(t,e,i),this.getFillerOffset=ao,this._priority=10,this._id=null,this._clonesGroup=null}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new hi.b("attribute-element-get-elements-with-same-id-no-id: Cannot get elements with the same id for an attribute element without id.",this);return new Set(this._clonesGroup)}is(t,e=null){const i=t&&t.replace(/^view:/,"");return e?"attributeElement"==i&&e==this.name||super.is(t,e):"attributeElement"==i||super.is(t)}isSimilar(t){return null!==this.id||null!==t.id?this.id===t.id:super.isSimilar(t)&&this.priority==t.priority}_clone(t){const e=super._clone(t);return e._priority=this._priority,e._id=this._id,e}}function ao(){if(co(this))return null;let t=this.parent;for(;t&&t.is("attributeElement");){if(co(t)>1)return null;t=t.parent}return!t||co(t)>1?null:this.childCount}function co(t){return Array.from(t.getChildren()).filter(t=>!t.is("uiElement")).length}ro.DEFAULT_PRIORITY=10;class lo extends On{constructor(t,e,i){super(t,e,i),this.getFillerOffset=ho}is(t,e=null){const i=t.replace(/^view:/,"");return e?"emptyElement"==i&&e==this.name||super.is(t,e):"emptyElement"==i||super.is(t)}_insertChild(t,e){if(e&&(e instanceof Ii||Array.from(e).length>0))throw new hi.b("view-emptyelement-cannot-add: Cannot add child nodes to EmptyElement instance.",[this,e])}}function ho(){return null}const uo=navigator.userAgent.toLowerCase();var fo={isMac:function(t){return t.indexOf("macintosh")>-1}(uo),isEdge:function(t){return!!t.match(/edge\/(\d+.?\d*)/)}(uo),isGecko:function(t){return!!t.match(/gecko\/\d+/)}(uo),isSafari:function(t){return t.indexOf(" applewebkit/")>-1&&-1===t.indexOf("chrome")}(uo),isAndroid:function(t){return t.indexOf("android")>-1}(uo),features:{isRegExpUnicodePropertySupported:function(){let t=!1;try{t=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(t){}return t}()}};const mo={"⌘":"ctrl","⇧":"shift","⌥":"alt"},go={ctrl:"⌘",shift:"⇧",alt:"⌥"},po=function(){const t={arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,cmd:1114112,shift:2228224,alt:4456448};for(let e=65;e<=90;e++){const i=String.fromCharCode(e);t[i.toLowerCase()]=e}for(let e=48;e<=57;e++)t[e-48]=e;for(let e=112;e<=123;e++)t["f"+(e-111)]=e;return t}();function bo(t){let e;if("string"==typeof t){if(e=po[t.toLowerCase()],!e)throw new hi.b("keyboard-unknown-key: Unknown key name.",null,{key:t})}else e=t.keyCode+(t.altKey?po.alt:0)+(t.ctrlKey?po.ctrl:0)+(t.shiftKey?po.shift:0);return e}function wo(t){return"string"==typeof t&&(t=_o(t)),t.map(t=>"string"==typeof t?bo(t):t).reduce((t,e)=>e+t,0)}function ko(t){return fo.isMac?_o(t).map(t=>go[t.toLowerCase()]||t).reduce((t,e)=>t.slice(-1)in mo?t+e:t+"+"+e):t}function _o(t){return t.split(/\s*\+\s*/)}class vo extends On{constructor(t,e,i){super(t,e,i),this.getFillerOffset=xo}is(t,e=null){const i=t.replace(/^view:/,"");return e?"uiElement"==i&&e==this.name||super.is(t,e):"uiElement"==i||super.is(t)}_insertChild(t,e){if(e&&(e instanceof Ii||Array.from(e).length>0))throw new hi.b("view-uielement-cannot-add: Cannot add child nodes to UIElement instance.",this)}render(t){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys())e.setAttribute(t,this.getAttribute(t));return e}}function yo(t){t.document.on("keydown",(e,i)=>function(t,e,i){if(e.keyCode==po.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection(),n=1==t.rangeCount&&t.getRangeAt(0).collapsed;if(n||e.shiftKey){const e=t.focusNode,o=t.focusOffset,s=i.domPositionToView(e,o);if(null===s)return;let r=!1;const a=s.getLastMatchingPosition(t=>(t.item.is("uiElement")&&(r=!0),!(!t.item.is("uiElement")&&!t.item.is("attributeElement"))));if(r){const e=i.viewPositionToDom(a);n?t.collapse(e.parent,e.offset):t.extend(e.parent,e.offset)}}}}(0,i,t.domConverter))}function xo(){return null}class Ao{constructor(t){this._children=[],t&&this._insertChild(0,t)}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(t){return"documentFragment"==t||"view:documentFragment"==t}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let i=0;const n=function(t){if("string"==typeof t)return[new Ni(t)];Ri(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new Ni(t):t instanceof Oi?new Ni(t.data):t)}(e);for(const e of n)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,i++;return i}_removeChildren(t,e=1){this._fireChange("children",this);for(let i=t;in instanceof t))throw new hi.b("view-writer-insert-invalid-node",i);n.is("text")||t(n.getChildren(),i)}})(e=Ri(e)?[...e]:[e],this.document);const i=To(t);if(!i)throw new hi.b("view-writer-invalid-position-container",this.document);const n=this._breakAttributes(t,!0),o=i._insertChild(n.offset,e);for(const t of e)this._addToClonedElementsGroup(t);const s=n.getShiftedBy(o),r=this.mergeAttributes(n);if(0===o)return new to(r,r);{r.isEqual(n)||s.offset--;const t=this.mergeAttributes(s);return new to(r,t)}}remove(t){const e=t instanceof to?t:to._createOn(t);if(Oo(e,this.document),e.isCollapsed)return new Ao;const{start:i,end:n}=this._breakAttributesRange(e,!0),o=i.parent,s=n.offset-i.offset,r=o._removeChildren(i.offset,s);for(const t of r)this._removeFromClonedElementsGroup(t);const a=this.mergeAttributes(i);return e.start=a,e.end=a.clone(),new Ao(r)}clear(t,e){Oo(t,this.document);const i=t.getWalker({direction:"backward",ignoreElementEnd:!0});for(const n of i){const i=n.item;let o;if(i.is("element")&&e.isSimilar(i))o=to._createOn(i);else if(!n.nextPosition.isAfter(t.start)&&i.is("textProxy")){const t=i.getAncestors().find(t=>t.is("element")&&e.isSimilar(t));t&&(o=to._createIn(t))}o&&(o.end.isAfter(t.end)&&(o.end=t.end),o.start.isBefore(t.start)&&(o.start=t.start),this.remove(o))}}move(t,e){let i;if(e.isAfter(t.end)){const n=(e=this._breakAttributes(e,!0)).parent,o=n.childCount;t=this._breakAttributesRange(t,!0),i=this.remove(t),e.offset+=n.childCount-o}else i=this.remove(t);return this.insert(e,i)}wrap(t,e){if(!(e instanceof ro))throw new hi.b("view-writer-wrap-invalid-attribute",this.document);if(Oo(t,this.document),t.isCollapsed){let n=t.start;n.parent.is("element")&&(i=n.parent,!Array.from(i.getChildren()).some(t=>!t.is("uiElement")))&&(n=n.getLastMatchingPosition(t=>t.item.is("uiElement"))),n=this._wrapPosition(n,e);const o=this.document.selection;return o.isCollapsed&&o.getFirstPosition().isEqual(t.start)&&this.setSelection(n),new to(n)}return this._wrapRange(t,e);var i}unwrap(t,e){if(!(e instanceof ro))throw new hi.b("view-writer-unwrap-invalid-attribute",this.document);if(Oo(t,this.document),t.isCollapsed)return t;const{start:i,end:n}=this._breakAttributesRange(t,!0),o=i.parent,s=this._unwrapChildren(o,i.offset,n.offset,e),r=this.mergeAttributes(s.start);r.isEqual(s.start)||s.end.offset--;const a=this.mergeAttributes(s.end);return new to(r,a)}rename(t,e){const i=new Ln(t,e.getAttributes());return this.insert(Xn._createAfter(e),i),this.move(to._createIn(e),Xn._createAt(i,0)),this.remove(to._createOn(e)),i}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return Xn._createAt(t,e)}createPositionAfter(t){return Xn._createAfter(t)}createPositionBefore(t){return Xn._createBefore(t)}createRange(t,e){return new to(t,e)}createRangeOn(t){return to._createOn(t)}createRangeIn(t){return to._createIn(t)}createSelection(t,e,i){return new no(t,e,i)}_wrapChildren(t,e,i,n){let o=e;const s=[];for(;o!1,t.parent._insertChild(t.offset,i);const n=new to(t,t.getShiftedBy(1));this.wrap(n,e);const o=new Xn(i.parent,i.index);i._remove();const s=o.nodeBefore,r=o.nodeAfter;return s instanceof Ni&&r instanceof Ni?Mo(s,r):So(o)}_wrapAttributeElement(t,e){if(!Ro(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const i of t.getAttributeKeys())if("class"!==i&&"style"!==i&&e.hasAttribute(i)&&e.getAttribute(i)!==t.getAttribute(i))return!1;for(const i of t.getStyleNames())if(e.hasStyle(i)&&e.getStyle(i)!==t.getStyle(i))return!1;for(const i of t.getAttributeKeys())"class"!==i&&"style"!==i&&(e.hasAttribute(i)||this.setAttribute(i,t.getAttribute(i),e));for(const i of t.getStyleNames())e.hasStyle(i)||this.setStyle(i,t.getStyle(i),e);for(const i of t.getClassNames())e.hasClass(i)||this.addClass(i,e);return!0}_unwrapAttributeElement(t,e){if(!Ro(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const i of t.getAttributeKeys())if("class"!==i&&"style"!==i&&(!e.hasAttribute(i)||e.getAttribute(i)!==t.getAttribute(i)))return!1;if(!e.hasClass(...t.getClassNames()))return!1;for(const i of t.getStyleNames())if(!e.hasStyle(i)||e.getStyle(i)!==t.getStyle(i))return!1;for(const i of t.getAttributeKeys())"class"!==i&&"style"!==i&&this.removeAttribute(i,e);return this.removeClass(Array.from(t.getClassNames()),e),this.removeStyle(Array.from(t.getStyleNames()),e),!0}_breakAttributesRange(t,e=!1){const i=t.start,n=t.end;if(Oo(t,this.document),t.isCollapsed){const i=this._breakAttributes(t.start,e);return new to(i,i)}const o=this._breakAttributes(n,e),s=o.parent.childCount,r=this._breakAttributes(i,e);return o.offset+=o.parent.childCount-s,new to(r,o)}_breakAttributes(t,e=!1){const i=t.offset,n=t.parent;if(t.parent.is("emptyElement"))throw new hi.b("view-writer-cannot-break-empty-element",this.document);if(t.parent.is("uiElement"))throw new hi.b("view-writer-cannot-break-ui-element",this.document);if(!e&&n.is("text")&&No(n.parent))return t.clone();if(No(n))return t.clone();if(n.is("text"))return this._breakAttributes(Eo(t),e);if(i==n.childCount){const t=new Xn(n.parent,n.index+1);return this._breakAttributes(t,e)}if(0===i){const t=new Xn(n.parent,n.index);return this._breakAttributes(t,e)}{const t=n.index+1,o=n._clone();n.parent._insertChild(t,o),this._addToClonedElementsGroup(o);const s=n.childCount-i,r=n._removeChildren(i,s);o._appendChild(r);const a=new Xn(n.parent,t);return this._breakAttributes(a,e)}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement"))return;if(t.is("element"))for(const e of t.getChildren())this._addToClonedElementsGroup(e);const e=t.id;if(!e)return;let i=this._cloneGroups.get(e);i||(i=new Set,this._cloneGroups.set(e,i)),i.add(t),t._clonesGroup=i}_removeFromClonedElementsGroup(t){if(t.is("element"))for(const e of t.getChildren())this._removeFromClonedElementsGroup(e);const e=t.id;if(!e)return;const i=this._cloneGroups.get(e);i&&i.delete(t)}}function To(t){let e=t.parent;for(;!No(e);){if(!e)return;e=e.parent}return e}function Po(t,e){return t.prioritye.priority)&&t.getIdentity()t.createTextNode(" "),zo=t=>{const e=t.createElement("br");return e.dataset.ckeFiller=!0,e},jo=(()=>{let t="";for(let e=0;e<7;e++)t+="";return t})();function Vo(t){return Lo(t)&&t.data.substr(0,7)===jo}function Bo(t){return 7==t.data.length&&Vo(t)}function Fo(t){return Vo(t)?t.data.slice(7):t.data}function Ho(t,e){if(e.keyCode==po.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(1==t.rangeCount&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer,i=t.getRangeAt(0).startOffset;Vo(e)&&i<=7&&t.collapse(e,0)}}}function Uo(t,e,i,n=!1){i=i||function(t,e){return t===e},Array.isArray(t)||(t=Array.from(t)),Array.isArray(e)||(e=Array.from(e));const o=function(t,e,i){const n=Wo(t,e,i);if(-1===n)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const o=qo(t,n),s=qo(e,n),r=Wo(o,s,i),a=t.length-r,c=e.length-r;return{firstIndex:n,lastIndexOld:a,lastIndexNew:c}}(t,e,i);return n?function(t,e){const{firstIndex:i,lastIndexOld:n,lastIndexNew:o}=t;if(-1===i)return Array(e).fill("equal");let s=[];i>0&&(s=s.concat(Array(i).fill("equal")));o-i>0&&(s=s.concat(Array(o-i).fill("insert")));n-i>0&&(s=s.concat(Array(n-i).fill("delete")));o0&&i.push({index:n,type:"insert",values:t.slice(n,s)});o-n>0&&i.push({index:n+(s-n),type:"delete",howMany:o-n});return i}(e,o)}function Wo(t,e,i){for(let n=0;n200||o>200||n+o>300)return $o.fastDiff(t,e,i,!0);let s,r;if(ol?-1:1;d[n+u]&&(d[n]=d[n+u].slice(0)),d[n]||(d[n]=[]),d[n].push(o>l?s:r);let f=Math.max(o,l),m=f-n;for(;ml;f--)h[f]=u(f);h[l]=u(l),m++}while(h[l]!==c);return d[l].slice(1)}function Yo(t,e,i){t.insertBefore(i,t.childNodes[e]||null)}function Go(t){const e=t.parentNode;e&&e.removeChild(t)}function Qo(t){if(t){if(t.defaultView)return t instanceof t.defaultView.Document;if(t.ownerDocument&&t.ownerDocument.defaultView)return t instanceof t.ownerDocument.defaultView.Node}return!1}$o.fastDiff=Uo;class Ko{constructor(t,e){this.domDocuments=new Set,this.domConverter=t,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this.selection=e,this.isFocused=!1,this._inlineFiller=null,this._fakeSelectionContainer=null}markToSync(t,e){if("text"===t)this.domConverter.mapViewToDom(e.parent)&&this.markedTexts.add(e);else{if(!this.domConverter.mapViewToDom(e))return;if("attributes"===t)this.markedAttributes.add(e);else{if("children"!==t)throw new hi.b("view-engine-cyclic-unknown-type: Unknown type passed to Renderer.markToSync.",this);this.markedChildren.add(e)}}}render(){let t;for(const t of this.markedChildren)this._updateChildrenMappings(t);this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?t=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(t=this.selection.getFirstPosition(),this.markedChildren.add(t.parent));for(const t of this.markedAttributes)this._updateAttrs(t);for(const e of this.markedChildren)this._updateChildren(e,{inlineFillerPosition:t});for(const e of this.markedTexts)!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)&&this._updateText(e,{inlineFillerPosition:t});if(t){const e=this.domConverter.viewPositionToDom(t),i=e.parent.ownerDocument;Vo(e.parent)?this._inlineFiller=e.parent:this._inlineFiller=Jo(i,e.parent,e.offset)}else this._inlineFiller=null;this._updateSelection(),this._updateFocus(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const i=this.domConverter.mapViewToDom(t).childNodes,n=Array.from(this.domConverter.viewChildrenToDom(t,e.ownerDocument,{withChildren:!1})),o=this._diffNodeLists(i,n),s=this._findReplaceActions(o,i,n);if(-1!==s.indexOf("replace")){const e={equal:0,insert:0,delete:0};for(const o of s)if("replace"===o){const o=e.equal+e.insert,s=e.equal+e.delete,r=t.getChild(o);r&&!r.is("uiElement")&&this._updateElementMappings(r,i[s]),Go(n[o]),e.equal++}else e[o]++}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e),this.domConverter.bindElements(e,t),this.markedChildren.add(t),this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();return t.parent.is("text")?Xn._createBefore(this.selection.getFirstPosition().parent):t}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=this.domConverter.viewPositionToDom(t);return!!(e&&Lo(e.parent)&&Vo(e.parent))}_removeInlineFiller(){const t=this._inlineFiller;if(!Vo(t))throw new hi.b("view-engine-cyclic-filler-was-lost: The inline filler node was lost.",this);Bo(t)?t.parentNode.removeChild(t):t.data=t.data.substr(7),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=t.parent,i=t.offset;if(!this.domConverter.mapViewToDom(e.root))return!1;if(!e.is("element"))return!1;if(!function(t){if("false"==t.getAttribute("contenteditable"))return!1;const e=t.findAncestor(t=>t.hasAttribute("contenteditable"));return!e||"true"==e.getAttribute("contenteditable")}(e))return!1;if(i===e.getFillerOffset())return!1;const n=t.nodeBefore,o=t.nodeAfter;return!(n instanceof Ni||o instanceof Ni)}_updateText(t,e){const i=this.domConverter.findCorrespondingDomText(t),n=this.domConverter.viewToDom(t,i.ownerDocument),o=i.data;let s=n.data;const r=e.inlineFillerPosition;if(r&&r.parent==t.parent&&r.offset==t.index&&(s=jo+s),o!=s){const t=Uo(o,s);for(const e of t)"insert"===e.type?i.insertData(e.index,e.values.join("")):i.deleteData(e.index,e.howMany)}}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const i=Array.from(e.attributes).map(t=>t.name),n=t.getAttributeKeys();for(const i of n)e.setAttribute(i,t.getAttribute(i));for(const n of i)t.hasAttribute(n)||e.removeAttribute(n)}_updateChildren(t,e){const i=this.domConverter.mapViewToDom(t);if(!i)return;const n=e.inlineFillerPosition,o=this.domConverter.mapViewToDom(t).childNodes,s=Array.from(this.domConverter.viewChildrenToDom(t,i.ownerDocument,{bind:!0,inlineFillerPosition:n}));n&&n.parent===t&&Jo(i.ownerDocument,s,n.offset);const r=this._diffNodeLists(o,s);let a=0;const c=new Set;for(const t of r)"insert"===t?(Yo(i,a,s[a]),a++):"delete"===t?(c.add(o[a]),Go(o[a])):(this._markDescendantTextToSync(this.domConverter.domToView(s[a])),a++);for(const t of c)t.parentNode||this.domConverter.unbindDomElement(t)}_diffNodeLists(t,e){return $o(t=function(t,e){const i=Array.from(t);if(0==i.length||!e)return i;i[i.length-1]==e&&i.pop();return i}(t,this._fakeSelectionContainer),e,Xo.bind(null,this.domConverter))}_findReplaceActions(t,e,i){if(-1===t.indexOf("insert")||-1===t.indexOf("delete"))return t;let n=[],o=[],s=[];const r={equal:0,insert:0,delete:0};for(const a of t)"insert"===a?s.push(i[r.equal+r.insert]):"delete"===a?o.push(e[r.equal+r.delete]):(n=n.concat($o(o,s,Zo).map(t=>"equal"===t?"replace":t)),n.push("equal"),o=[],s=[]),r[a]++;return n.concat($o(o,s,Zo).map(t=>"equal"===t?"replace":t))}_markDescendantTextToSync(t){if(t)if(t.is("text"))this.markedTexts.add(t);else if(t.is("element"))for(const e of t.getChildren())this._markDescendantTextToSync(e)}_updateSelection(){if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const t=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&t&&(this.selection.isFake?this._updateFakeSelection(t):(this._removeFakeSelection(),this._updateDomSelection(t)))}_updateFakeSelection(t){const e=t.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(t){const e=t.createElement("div");return Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),e.textContent=" ",e}(e));const i=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(i,this.selection),!this._fakeSelectionNeedsUpdate(t))return;i.parentElement&&i.parentElement==t||t.appendChild(i),i.textContent=this.selection.fakeSelectionLabel||" ";const n=e.getSelection(),o=e.createRange();n.removeAllRanges(),o.selectNodeContents(i),n.addRange(o)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e))return;const i=this.domConverter.viewPositionToDom(this.selection.anchor),n=this.domConverter.viewPositionToDom(this.selection.focus);t.focus(),e.collapse(i.parent,i.offset),e.extend(n.parent,n.offset),fo.isGecko&&function(t,e){const i=t.parent;if(i.nodeType!=Node.ELEMENT_NODE||t.offset!=i.childNodes.length-1)return;const n=i.childNodes[t.offset];n&&"BR"==n.tagName&&e.addRange(e.getRangeAt(0))}(n,e)}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t))return!0;const e=t&&this.domConverter.domSelectionToView(t);return(!e||!this.selection.isEqual(e))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(e))}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer,i=t.ownerDocument.getSelection();return!e||e.parentElement!==t||(i.anchorNode!==e&&!e.contains(i.anchorNode)||e.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const t of this.domDocuments){if(t.getSelection().rangeCount){const e=t.activeElement,i=this.domConverter.mapDomToView(e);e&&i&&t.getSelection().removeAllRanges()}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;t&&t.remove()}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;t&&this.domConverter.focus(t)}}}function Jo(t,e,i){const n=e instanceof Array?e:e.childNodes,o=n[i];if(Lo(o))return o.data=jo+o.data,o;{const o=t.createTextNode(jo);return Array.isArray(e)?n.splice(i,0,o):Yo(e,i,o),o}}function Zo(t,e){return Qo(t)&&Qo(e)&&!Lo(t)&&!Lo(e)&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function Xo(t,e,i){return e===i||(Lo(e)&&Lo(i)?e.data===i.data:!(!t.isBlockFiller(e)||!t.isBlockFiller(i)))}vi(Ko,Hn);var ts={window:window,document:document};function es(t){let e=0;for(;t.previousSibling;)t=t.previousSibling,e++;return e}function is(t){const e=[];for(;t&&t.nodeType!=Node.DOCUMENT_NODE;)e.unshift(t),t=t.parentNode;return e}const ns=zo(document);class os{constructor(t={}){this.blockFillerMode=t.blockFillerMode||"br",this.preElements=["pre"],this.blockElements=["p","div","h1","h2","h3","h4","h5","h6","li","dd","dt","figcaption"],this._blockFiller="br"==this.blockFillerMode?zo:Do,this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new no(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t),this._viewToDomMapping.delete(e);for(const e of Array.from(t.childNodes))this.unbindDomElement(e)}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}viewToDom(t,e,i={}){if(t.is("text")){const i=this._processDataFromViewText(t);return e.createTextNode(i)}{if(this.mapViewToDom(t))return this.mapViewToDom(t);let n;if(t.is("documentFragment"))n=e.createDocumentFragment(),i.bind&&this.bindDocumentFragments(n,t);else{if(t.is("uiElement"))return n=t.render(e),i.bind&&this.bindElements(n,t),n;n=t.hasAttribute("xmlns")?e.createElementNS(t.getAttribute("xmlns"),t.name):e.createElement(t.name),i.bind&&this.bindElements(n,t);for(const e of t.getAttributeKeys())n.setAttribute(e,t.getAttribute(e))}if(i.withChildren||void 0===i.withChildren)for(const o of this.viewChildrenToDom(t,e,i))n.appendChild(o);return n}}*viewChildrenToDom(t,e,i={}){const n=t.getFillerOffset&&t.getFillerOffset();let o=0;for(const s of t.getChildren())n===o&&(yield this._blockFiller(e)),yield this.viewToDom(s,e,i),o++;n===o&&(yield this._blockFiller(e))}viewRangeToDom(t){const e=this.viewPositionToDom(t.start),i=this.viewPositionToDom(t.end),n=document.createRange();return n.setStart(e.parent,e.offset),n.setEnd(i.parent,i.offset),n}viewPositionToDom(t){const e=t.parent;if(e.is("text")){const i=this.findCorrespondingDomText(e);if(!i)return null;let n=t.offset;return Vo(i)&&(n+=7),{parent:i,offset:n}}{let i,n,o;if(0===t.offset){if(i=this.mapViewToDom(e),!i)return null;o=i.childNodes[0]}else{const e=t.nodeBefore;if(n=e.is("text")?this.findCorrespondingDomText(e):this.mapViewToDom(t.nodeBefore),!n)return null;i=n.parentNode,o=n.nextSibling}if(Lo(o)&&Vo(o))return{parent:o,offset:7};return{parent:i,offset:n?es(n)+1:0}}}domToView(t,e={}){if(this.isBlockFiller(t,this.blockFillerMode))return null;const i=this.getParentUIElement(t,this._domToViewMapping);if(i)return i;if(Lo(t)){if(Bo(t))return null;{const e=this._processDataFromDomText(t);return""===e?null:new Ni(e)}}if(this.isComment(t))return null;{if(this.mapDomToView(t))return this.mapDomToView(t);let i;if(this.isDocumentFragment(t))i=new Ao,e.bind&&this.bindDocumentFragments(t,i);else{const n=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();i=new On(n),e.bind&&this.bindElements(t,i);const o=t.attributes;for(let t=o.length-1;t>=0;t--)i._setAttribute(o[t].name,o[t].value)}if(e.withChildren||void 0===e.withChildren)for(const n of this.domChildrenToView(t,e))i._appendChild(n);return i}}*domChildrenToView(t,e={}){for(let i=0;i{const{scrollLeft:e,scrollTop:i}=t;n.push([e,i])}),e.focus(),rs(e,t=>{const[e,i]=n.shift();t.scrollLeft=e,t.scrollTop=i}),ts.window.scrollTo(t,i)}}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isComment(t){return t&&t.nodeType==Node.COMMENT_NODE}isBlockFiller(t){return"br"==this.blockFillerMode?t.isEqualNode(ns):!("BR"!==t.tagName||!as(t,this.blockElements)||1!==t.parentNode.childNodes.length)||function(t,e){return Lo(t)&&" "==t.data&&as(t,e)&&1===t.parentNode.childNodes.length}(t,this.blockElements)}isDomSelectionBackward(t){if(t.isCollapsed)return!1;const e=document.createRange();e.setStart(t.anchorNode,t.anchorOffset),e.setEnd(t.focusNode,t.focusOffset);const i=e.collapsed;return e.detach(),i}getParentUIElement(t){const e=is(t);for(e.pop();e.length;){const t=e.pop(),i=this._domToViewMapping.get(t);if(i&&i.is("uiElement"))return i}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}_isDomSelectionPositionCorrect(t,e){if(Lo(t)&&Vo(t)&&e<7)return!1;if(this.isElement(t)&&Vo(t.childNodes[e]))return!1;const i=this.mapDomToView(t);return!i||!i.is("uiElement")}_processDataFromViewText(t){let e=t.data;if(t.getAncestors().some(t=>this.preElements.includes(t.name)))return e;if(" "==e.charAt(0)){const i=this._getTouchingViewTextNode(t,!1);!(i&&this._nodeEndsWithSpace(i))&&i||(e=" "+e.substr(1))}if(" "==e.charAt(e.length-1)){const i=this._getTouchingViewTextNode(t,!0);" "!=e.charAt(e.length-2)&&i&&" "!=i.data.charAt(0)||(e=e.substr(0,e.length-1)+" ")}return e.replace(/ {2}/g," ")}_nodeEndsWithSpace(t){if(t.getAncestors().some(t=>this.preElements.includes(t.name)))return!1;const e=this._processDataFromViewText(t);return" "==e.charAt(e.length-1)}_processDataFromDomText(t){let e=t.data;if(ss(t,this.preElements))return Fo(t);e=e.replace(/[ \n\t\r]{1,}/g," ");const i=this._getTouchingInlineDomNode(t,!1),n=this._getTouchingInlineDomNode(t,!0),o=this._checkShouldLeftTrimDomText(i),s=this._checkShouldRightTrimDomText(t,n);return o&&(e=e.replace(/^ /,"")),s&&(e=e.replace(/ $/,"")),e=Fo(new Text(e)),e=e.replace(/ \u00A0/g," "),(/( |\u00A0)\u00A0$/.test(e)||!n||n.data&&" "==n.data.charAt(0))&&(e=e.replace(/\u00A0$/," ")),o&&(e=e.replace(/^\u00A0/," ")),e}_checkShouldLeftTrimDomText(t){return!t||(!!ii(t)||/[^\S\u00A0]/.test(t.data.charAt(t.data.length-1)))}_checkShouldRightTrimDomText(t,e){return!e&&!Vo(t)}_getTouchingViewTextNode(t,e){const i=new Zn({startPosition:e?Xn._createAfter(t):Xn._createBefore(t),direction:e?"forward":"backward"});for(const t of i){if(t.item.is("containerElement"))return null;if(t.item.is("br"))return null;if(t.item.is("textProxy"))return t.item}return null}_getTouchingInlineDomNode(t,e){if(!t.parentNode)return null;const i=e?"nextNode":"previousNode",n=t.ownerDocument,o=is(t)[0],s=n.createTreeWalker(o,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_ELEMENT,{acceptNode:t=>Lo(t)||"BR"==t.tagName?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});s.currentNode=t;const r=s[i]();if(null!==r){const e=function(t,e){const i=is(t),n=is(e);let o=0;for(;i[o]==n[o]&&i[o];)o++;return 0===o?null:i[o-1]}(t,r);if(e&&!ss(t,this.blockElements,e)&&!ss(r,this.blockElements,e))return r}return null}}function ss(t,e,i){let n=is(t);return i&&(n=n.slice(n.indexOf(i)+1)),n.some(t=>t.tagName&&e.includes(t.tagName.toLowerCase()))}function rs(t,e){for(;t&&t!=ts.document;)e(t),t=t.parentNode}function as(t,e){const i=t.parentNode;return i&&i.tagName&&e.includes(i.tagName.toLowerCase())}function cs(t){const e=Object.prototype.toString.apply(t);return"[object Window]"==e||"[object global]"==e}var ls=zn({},mi,{listenTo(t,...e){if(Qo(t)||cs(t)){const i=this._getProxyEmitter(t)||new ds(t);i.attach(...e),t=i}mi.listenTo.call(this,t,...e)},stopListening(t,e,i){if(Qo(t)||cs(t)){const e=this._getProxyEmitter(t);if(!e)return;t=e}mi.stopListening.call(this,t,e,i),t instanceof ds&&t.detach(e)},_getProxyEmitter(t){return e=this,i=hs(t),e[ui]&&e[ui][i]?e[ui][i].emitter:null;var e,i}});class ds{constructor(t){gi(this,hs(t)),this._domNode=t}}function hs(t){return t["data-ck-expando"]||(t["data-ck-expando"]=li())}zn(ds.prototype,mi,{attach(t,e,i={}){if(this._domListeners&&this._domListeners[t])return;const n=this._createDomListener(t,!!i.useCapture);this._domNode.addEventListener(t,n,!!i.useCapture),this._domListeners||(this._domListeners={}),this._domListeners[t]=n},detach(t){let e;!this._domListeners[t]||(e=this._events[t])&&e.callbacks.length||this._domListeners[t].removeListener()},_createDomListener(t,e){const i=e=>{this.fire(t,e)};return i.removeListener=()=>{this._domNode.removeEventListener(t,i,e),delete this._domListeners[t]},i}});class us{constructor(t){this.view=t,this.document=t.document,this.isEnabled=!1}enable(){this.isEnabled=!0}disable(){this.isEnabled=!1}destroy(){this.disable(),this.stopListening()}}vi(us,ls);var fs=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};var ms=function(t){return this.__data__.has(t)};function gs(t){var e=-1,i=null==t?0:t.length;for(this.__data__=new kt;++ea))return!1;var l=s.get(t);if(l&&s.get(e))return l==e;var d=-1,h=!0,u=2&i?new ps:void 0;for(s.set(t,e),s.set(e,t);++d{this.listenTo(t,e,(t,e)=>{this.isEnabled&&this.onDomEvent(e)},{useCapture:this.useCapture})})}fire(t,e,i){this.isEnabled&&this.document.fire(t,new Ns(this.view,e,i))}}class Rs extends Os{constructor(t){super(t),this.domEventType=["keydown","keyup"]}onDomEvent(t){this.fire(t.type,t,{keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey||t.metaKey,shiftKey:t.shiftKey,get keystroke(){return bo(this)}})}}var Ls=function(){return n.a.Date.now()},Ds=/^\s+|\s+$/g,zs=/^[-+]0x[0-9a-f]+$/i,js=/^0b[01]+$/i,Vs=/^0o[0-7]+$/i,Bs=parseInt;var Fs=function(t){if("number"==typeof t)return t;if(ji(t))return NaN;if(z(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=z(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Ds,"");var i=js.test(t);return i||Vs.test(t)?Bs(t.slice(2),i?2:8):zs.test(t)?NaN:+t},Hs=Math.max,Us=Math.min;var Ws=function(t,e,i){var n,o,s,r,a,c,l=0,d=!1,h=!1,u=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function f(e){var i=n,s=o;return n=o=void 0,l=e,r=t.apply(s,i)}function m(t){return l=t,a=setTimeout(p,e),d?f(t):r}function g(t){var i=t-c;return void 0===c||i>=e||i<0||h&&t-l>=s}function p(){var t=Ls();if(g(t))return b(t);a=setTimeout(p,function(t){var i=e-(t-c);return h?Us(i,s-(t-l)):i}(t))}function b(t){return a=void 0,u&&n?f(t):(n=o=void 0,r)}function w(){var t=Ls(),i=g(t);if(n=arguments,o=this,c=t,i){if(void 0===a)return m(c);if(h)return clearTimeout(a),a=setTimeout(p,e),f(c)}return void 0===a&&(a=setTimeout(p,e)),r}return e=Fs(e)||0,z(i)&&(d=!!i.leading,s=(h="maxWait"in i)?Hs(Fs(i.maxWait)||0,e):s,u="trailing"in i?!!i.trailing:u),w.cancel=function(){void 0!==a&&clearTimeout(a),l=0,n=c=o=a=void 0},w.flush=function(){return void 0===a?r:b(Ls())},w};class qs extends us{constructor(t){super(t),this._fireSelectionChangeDoneDebounced=Ws(t=>this.document.fire("selectionChangeDone",t),200)}observe(){const t=this.document;t.on("keydown",(e,i)=>{var n;t.selection.isFake&&((n=i.keyCode)==po.arrowright||n==po.arrowleft||n==po.arrowup||n==po.arrowdown)&&this.isEnabled&&(i.preventDefault(),this._handleSelectionMove(i.keyCode))},{priority:"lowest"})}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection,i=new no(e.getRanges(),{backward:e.isBackward,fake:!1});t!=po.arrowleft&&t!=po.arrowup||i.setTo(i.getFirstPosition()),t!=po.arrowright&&t!=po.arrowdown||i.setTo(i.getLastPosition());const n={oldSelection:e,newSelection:i,domSelection:null};this.document.fire("selectionChange",n),this._fireSelectionChangeDoneDebounced(n)}}class $s extends us{constructor(t){super(t),this.mutationObserver=t.getObserver(Is),this.selection=this.document.selection,this.domConverter=t.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=Ws(t=>this.document.fire("selectionChangeDone",t),200),this._clearInfiniteLoopInterval=setInterval(()=>this._clearInfiniteLoop(),1e3),this._loopbackCounter=0}observe(t){const e=t.ownerDocument;this._documents.has(e)||(this.listenTo(e,"selectionchange",()=>{this._handleSelectionChange(e)}),this._documents.add(e))}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionChange(t){if(!this.isEnabled)return;this.mutationObserver.flush();const e=t.defaultView.getSelection(),i=this.domConverter.domSelectionToView(e);if(0!=i.rangeCount&&!(this.selection.isEqual(i)&&this.domConverter.isDomSelectionCorrect(e)||++this._loopbackCounter>60))if(this.selection.isSimilar(i))this.view.forceRender();else{const t={oldSelection:this.selection,newSelection:i,domSelection:e};this.document.fire("selectionChange",t),this._fireSelectionChangeDoneDebounced(t)}}_clearInfiniteLoop(){this._loopbackCounter=0}}class Ys extends Os{constructor(t){super(t),this.domEventType=["focus","blur"],this.useCapture=!0;const e=this.document;e.on("focus",()=>{e.isFocused=!0,this._renderTimeoutId=setTimeout(()=>t.forceRender(),50)}),e.on("blur",(i,n)=>{const o=e.selection.editableElement;null!==o&&o!==n.target||(e.isFocused=!1,t.forceRender())})}onDomEvent(t){this.fire(t.type,t)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class Gs extends Os{constructor(t){super(t),this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",()=>{e.isComposing=!0}),e.on("compositionend",()=>{e.isComposing=!1})}onDomEvent(t){this.fire(t.type,t)}}class Qs extends Os{constructor(t){super(t),this.domEventType=["beforeinput"]}onDomEvent(t){this.fire(t.type,t)}}function Ks(t){return"[object Range]"==Object.prototype.toString.apply(t)}function Js(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}const Zs=["top","right","bottom","left","width","height"];class Xs{constructor(t){const e=Ks(t);if(Object.defineProperty(this,"_source",{value:t._source||t,writable:!0,enumerable:!1}),ii(t)||e)tr(this,e?Xs.getDomRangeRects(t)[0]:t.getBoundingClientRect());else if(cs(t)){const{innerWidth:e,innerHeight:i}=t;tr(this,{top:0,right:e,bottom:i,left:0,width:e,height:i})}else tr(this,t)}clone(){return new Xs(this)}moveTo(t,e){return this.top=e,this.right=t+this.width,this.bottom=e+this.height,this.left=t,this}moveBy(t,e){return this.top+=e,this.right+=t,this.left+=t,this.bottom+=e,this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left)};return e.width=e.right-e.left,e.height=e.bottom-e.top,e.width<0||e.height<0?null:new Xs(e)}getIntersectionArea(t){const e=this.getIntersection(t);return e?e.getArea():0}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(!er(t)){let i=t.parentNode||t.commonAncestorContainer;for(;i&&!er(i);){const t=new Xs(i),n=e.getIntersection(t);if(!n)return null;n.getArea()hr(t,n));const r=hr(t,n);if(nr(n,r,e),n.parent!=n){if(o=n.frameElement,n=n.parent,!o)return}else n=null}}function nr(t,e,i){const n=e.clone().moveBy(0,i),o=e.clone().moveBy(0,-i),s=new Xs(t).excludeScrollbarsAndBorders();if(![o,n].every(t=>s.contains(t))){let{scrollX:r,scrollY:a}=t;rr(o,s)?a-=s.top-e.top+i:sr(n,s)&&(a+=e.bottom-s.bottom+i),ar(e,s)?r-=s.left-e.left+i:cr(e,s)&&(r+=e.right-s.right+i),t.scrollTo(r,a)}}function or(t,e){const i=lr(t);let n,o;for(;t!=i.document.body;)o=e(),n=new Xs(t).excludeScrollbarsAndBorders(),n.contains(o)||(rr(o,n)?t.scrollTop-=n.top-o.top:sr(o,n)&&(t.scrollTop+=o.bottom-n.bottom),ar(o,n)?t.scrollLeft-=n.left-o.left:cr(o,n)&&(t.scrollLeft+=o.right-n.right)),t=t.parentNode}function sr(t,e){return t.bottom>e.bottom}function rr(t,e){return t.tope.right}function lr(t){return Ks(t)?t.startContainer.ownerDocument.defaultView:t.ownerDocument.defaultView}function dr(t){if(Ks(t)){let e=t.commonAncestorContainer;return Lo(e)&&(e=e.parentNode),e}return t.parentNode}function hr(t,e){const i=lr(t),n=new Xs(t);if(i===e)return n;{let t=i;for(;t!=e;){const e=t.frameElement,i=new Xs(e).excludeScrollbarsAndBorders();n.moveBy(i.left,i.top),t=t.parent}}return n}Object.assign({},{scrollViewportToShowTarget:ir,scrollAncestorsToShowTarget:function(t){or(dr(t),()=>new Xs(t))}});class ur{constructor(){this.document=new so,this.domConverter=new os,this.domRoots=new Map,this.set("isRenderingInProgress",!1),this._renderer=new Ko(this.domConverter,this.document.selection),this._renderer.bind("isFocused").to(this.document),this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this._writer=new Co(this.document),this.addObserver(Is),this.addObserver($s),this.addObserver(Ys),this.addObserver(Rs),this.addObserver(qs),this.addObserver(Gs),fo.isAndroid&&this.addObserver(Qs),this.document.on("keydown",Ho),yo(this),this.on("render",()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1}),this.listenTo(this.document.selection,"change",()=>{this._hasChangedSinceTheLastRendering=!0})}attachDomRoot(t,e="main"){const i=this.document.getRoot(e);i._name=t.tagName.toLowerCase();const n={};for(const{name:e,value:o}of Array.from(t.attributes))n[e]=o,"class"===e?this._writer.addClass(o.split(" "),i):this._writer.setAttribute(e,o,i);this._initialDomRootAttributes.set(t,n);const o=()=>{this._writer.setAttribute("contenteditable",!i.isReadOnly,i),i.isReadOnly?this._writer.addClass("ck-read-only",i):this._writer.removeClass("ck-read-only",i)};o(),this.domRoots.set(e,t),this.domConverter.bindElements(t,i),this._renderer.markToSync("children",i),this._renderer.markToSync("attributes",i),this._renderer.domDocuments.add(t.ownerDocument),i.on("change:children",(t,e)=>this._renderer.markToSync("children",e)),i.on("change:attributes",(t,e)=>this._renderer.markToSync("attributes",e)),i.on("change:text",(t,e)=>this._renderer.markToSync("text",e)),i.on("change:isReadOnly",()=>this.change(o)),i.on("change",()=>{this._hasChangedSinceTheLastRendering=!0});for(const i of this._observers.values())i.observe(t,e)}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach(({name:t})=>e.removeAttribute(t));const i=this._initialDomRootAttributes.get(e);for(const t in i)e.setAttribute(t,i[t]);this.domRoots.delete(t),this.domConverter.unbindDomElement(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e)return e;e=new t(this),this._observers.set(t,e);for(const[t,i]of this.domRoots)e.observe(i,t);return e.enable(),e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values())t.disable()}enableObservers(){for(const t of this._observers.values())t.enable()}scrollToTheSelection(){const t=this.document.selection.getFirstRange();t&&ir({target:this.domConverter.viewRangeToDom(t),viewportOffset:20})}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;t&&(this.domConverter.focus(t),this.forceRender())}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress)throw new hi.b("cannot-change-view-tree: Attempting to make changes to the view when it is in an incorrect state: rendering or post-fixers are in progress. This may cause some unexpected behavior and inconsistency between the DOM and the view.",this);try{if(this._ongoingChange)return t(this._writer);this._ongoingChange=!0;const e=t(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),e}catch(t){hi.b.rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.change(()=>{})}destroy(){for(const t of this._observers.values())t.destroy();this.document.destroy(),this.stopListening()}createPositionAt(t,e){return Xn._createAt(t,e)}createPositionAfter(t){return Xn._createAfter(t)}createPositionBefore(t){return Xn._createBefore(t)}createRange(t,e){return new to(t,e)}createRangeOn(t){return to._createOn(t)}createRangeIn(t){return to._createIn(t)}createSelection(t,e,i){return new no(t,e,i)}_disableRendering(t){this._renderingDisabled=t,0==t&&this.change(()=>{})}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}vi(ur,Hn);class fr{constructor(t){this.parent=null,this._attrs=Li(t)}get index(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildIndex(this)))throw new hi.b("model-node-not-found-in-parent: The node's parent does not contain this node.",this);return t}get startOffset(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildStartOffset(this)))throw new hi.b("model-node-not-found-in-parent: The node's parent does not contain this node.",this);return t}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}get document(){return this.root==this?null:this.root.document||null}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.startOffset),e=e.parent;return t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let i=t.includeSelf?this:this.parent;for(;i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}getCommonAncestor(t,e={}){const i=this.getAncestors(e),n=t.getAncestors(e);let o=0;for(;i[o]==n[o]&&i[o];)o++;return 0===o?null:i[o-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),i=t.getPath(),n=Ei(e,i);switch(n){case"prefix":return!0;case"extension":return!1;default:return e[n](t[e[0]]=e[1],t),{})),t}is(t){return"node"==t||"model:node"==t}_clone(){return new fr(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=Li(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}class mr extends fr{constructor(t,e){super(e),this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}is(t){return"text"==t||"model:text"==t||super.is(t)}toJSON(){const t=super.toJSON();return t.data=this.data,t}_clone(){return new mr(this.data,this.getAttributes())}static fromJSON(t){return new mr(t.data,t.attributes)}}class gr{constructor(t,e,i){if(this.textNode=t,e<0||e>t.offsetSize)throw new hi.b("model-textproxy-wrong-offsetintext: Given offsetInText value is incorrect.",this);if(i<0||e+i>t.offsetSize)throw new hi.b("model-textproxy-wrong-length: Given length value is incorrect.",this);this.data=t.data.substring(e,e+i),this.offsetInText=e}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}is(t){return"textProxy"==t||"model:textProxy"==t}getPath(){const t=this.textNode.getPath();return t.length>0&&(t[t.length-1]+=this.offsetInText),t}getAncestors(t={includeSelf:!1,parentFirst:!1}){const e=[];let i=t.includeSelf?this:this.parent;for(;i;)e[t.parentFirst?"push":"unshift"](i),i=i.parent;return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}class pr{constructor(t){this._nodes=[],t&&this._insertNodes(0,t)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce((t,e)=>t+e.offsetSize,0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return-1==e?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return null===e?null:this._nodes.slice(0,e).reduce((t,e)=>t+e.offsetSize,0)}indexToOffset(t){if(t==this._nodes.length)return this.maxOffset;const e=this._nodes[t];if(!e)throw new hi.b("model-nodelist-index-out-of-bounds: Given index cannot be found in the node list.",this);return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const i of this._nodes){if(t>=e&&tt.toJSON())}}class br extends fr{constructor(t,e,i){super(e),this.name=t,this._children=new pr,i&&this._insertChild(0,i)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}is(t,e=null){const i=t.replace(/^model:/,"");return e?"element"==i&&e==this.name:"element"==i||i==this.name||super.is(t)}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const i of t)e=e.getChild(e.offsetToIndex(i));return e}toJSON(){const t=super.toJSON();if(t.name=this.name,this._children.length>0){t.children=[];for(const e of this._children)t.children.push(e.toJSON())}return t}_clone(t=!1){const e=t?Array.from(this._children).map(t=>t._clone(!0)):null;return new br(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const i=function(t){if("string"==typeof t)return[new mr(t)];Ri(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new mr(t):t instanceof gr?new mr(t.data,t.getAttributes()):t)}(e);for(const t of i)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,i)}_removeChildren(t,e=1){const i=this._children._removeNodes(t,e);for(const t of i)t.parent=null;return i}static fromJSON(t){let e=null;if(t.children){e=[];for(const i of t.children)i.name?e.push(br.fromJSON(i)):e.push(mr.fromJSON(i))}return new br(t.name,t.attributes,e)}}class wr{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new hi.b("model-tree-walker-no-start-position: Neither boundaries nor starting position have been defined.",null);const e=t.direction||"forward";if("forward"!=e&&"backward"!=e)throw new hi.b("model-tree-walker-unknown-direction: Only `backward` and `forward` direction allowed.",t,{direction:e});this.direction=e,this.boundaries=t.boundaries||null,t.startPosition?this.position=t.startPosition.clone():this.position=_r._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}skip(t){let e,i,n,o;do{n=this.position,o=this._visitedParent,({done:e,value:i}=this.next())}while(!e&&t(i));e||(this.position=n,this._visitedParent=o)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const t=this.position,e=this.position.clone(),i=this._visitedParent;if(null===i.parent&&e.offset===i.maxOffset)return{done:!0};if(i===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0};const n=e.textNode?e.textNode:e.nodeAfter;if(n instanceof br)return this.shallow?e.offset++:(e.path.push(0),this._visitedParent=n),this.position=e,kr("elementStart",n,t,e,1);if(n instanceof mr){let o;if(this.singleCharacters)o=1;else{let t=n.endOffset;this._boundaryEndParent==i&&this.boundaries.end.offsett&&(t=this.boundaries.start.offset),o=e.offset-t}const s=e.offset-n.startOffset,r=new gr(n,s-o,o);return e.offset-=o,this.position=e,kr("text",r,t,e,o)}return e.path.pop(),this.position=e,this._visitedParent=i.parent,kr("elementStart",i,t,e,1)}}function kr(t,e,i,n,o){return{done:!1,value:{type:t,item:e,previousPosition:i,nextPosition:n,length:o}}}class _r{constructor(t,e,i="toNone"){if(!t.is("element")&&!t.is("documentFragment"))throw new hi.b("model-position-root-invalid: Position root invalid.",t);if(!(e instanceof Array)||0===e.length)throw new hi.b("model-position-path-incorrect-format: Position path must be an array with at least one item.",t,{path:e});e=t.getPath().concat(e),t=t.root,this.root=t,this.path=e,this.stickiness=i}get offset(){return Xi(this.path)}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;ei.path.length){if(e.offset!==n.maxOffset)return!1;e.path=e.path.slice(0,-1),n=n.parent,e.offset++}else{if(0!==i.offset)return!1;i.path=i.path.slice(0,-1)}}}is(t){return"position"==t||"model:position"==t}hasSameParentAs(t){if(this.root!==t.root)return!1;return"same"==Ei(this.getParentPath(),t.getParentPath())}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=_r._createAt(this)}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;return e.containsPosition(this)||e.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(t.splitPosition,t.moveTargetPosition):t.graveyardPosition?this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1):this._getTransformedByInsertion(t.insertionPosition,1)}_getTransformedByMergeOperation(t){const e=t.movedRange;let i;return e.containsPosition(this)||e.start.isEqual(this)?(i=this._getCombined(t.sourcePosition,t.targetPosition),t.sourcePosition.isBefore(t.targetPosition)&&(i=i._getTransformedByDeletion(t.deletionPosition,1))):i=this.isEqual(t.deletionPosition)?_r._createAt(t.deletionPosition):this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1),i}_getTransformedByDeletion(t,e){const i=_r._createAt(this);if(this.root!=t.root)return i;if("same"==Ei(t.getParentPath(),this.getParentPath())){if(t.offsetthis.offset)return null;i.offset-=e}}else if("prefix"==Ei(t.getParentPath(),this.getParentPath())){const n=t.path.length-1;if(t.offset<=this.path[n]){if(t.offset+e>this.path[n])return null;i.path[n]-=e}}return i}_getTransformedByInsertion(t,e){const i=_r._createAt(this);if(this.root!=t.root)return i;if("same"==Ei(t.getParentPath(),this.getParentPath()))(t.offsete+1;){const e=n.maxOffset-i.offset;0!==e&&t.push(new vr(i,i.getShiftedBy(e))),i.path=i.path.slice(0,-1),i.offset++,n=n.parent}for(;i.path.length<=this.end.path.length;){const e=this.end.path[i.path.length-1],n=e-i.offset;0!==n&&t.push(new vr(i,i.getShiftedBy(n))),i.offset=e,i.path.push(0)}return t}getWalker(t={}){return t.boundaries=this,new wr(t)}*getItems(t={}){t.boundaries=this,t.ignoreElementEnd=!0;const e=new wr(t);for(const t of e)yield t.item}*getPositions(t={}){t.boundaries=this;const e=new wr(t);yield e.position;for(const t of e)yield t.nextPosition}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new vr(this.start,this.end)]}getTransformedByOperations(t){const e=[new vr(this.start,this.end)];for(const i of t)for(let t=0;t0?new this(i,n):new this(n,i)}static _createIn(t){return new this(_r._createAt(t,0),_r._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(_r._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(0===t.length)throw new hi.b("range-create-from-ranges-empty-array: At least one range has to be passed.",null);if(1==t.length)return t[0].clone();const e=t[0];t.sort((t,e)=>t.start.isAfter(e.start)?1:-1);const i=t.indexOf(e),n=new this(e.start,e.end);if(i>0)for(let e=i-1;t[e].end.isEqual(n.start);e++)n.start=_r._createAt(t[e].start);for(let e=i+1;e{if(e.viewPosition)return;const i=this._modelToViewMapping.get(e.modelPosition.parent);e.viewPosition=this._findPositionIn(i,e.modelPosition.offset)},{priority:"low"}),this.on("viewToModelPosition",(t,e)=>{if(e.modelPosition)return;const i=this.findMappedViewAncestor(e.viewPosition),n=this._viewToModelMapping.get(i),o=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,i);e.modelPosition=_r._createAt(n,o)},{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e),this._viewToModelMapping.set(e,t)}unbindViewElement(t){const e=this.toModelElement(t);if(this._viewToModelMapping.delete(t),this._elementToMarkerNames.has(t))for(const e of this._elementToMarkerNames.get(t))this._unboundMarkerNames.add(e);this._modelToViewMapping.get(e)==t&&this._modelToViewMapping.delete(e)}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t),this._viewToModelMapping.get(e)==t&&this._viewToModelMapping.delete(e)}bindElementToMarker(t,e){const i=this._markerNameToElements.get(e)||new Set;i.add(t);const n=this._elementToMarkerNames.get(t)||new Set;n.add(e),this._markerNameToElements.set(e,i),this._elementToMarkerNames.set(t,n)}unbindElementFromMarkerName(t,e){const i=this._markerNameToElements.get(e);i&&(i.delete(t),0==i.size&&this._markerNameToElements.delete(e));const n=this._elementToMarkerNames.get(t);n&&(n.delete(e),0==n.size&&this._elementToMarkerNames.delete(t))}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),t}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new vr(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new to(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};return this.fire("viewToModelPosition",e),e.modelPosition}toViewPosition(t,e={isPhantom:!1}){const i={modelPosition:t,mapper:this,isPhantom:e.isPhantom};return this.fire("modelToViewPosition",i),i.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e)return null;const i=new Set;for(const t of e)if(t.is("attributeElement"))for(const e of t.getElementsWithSameId())i.add(e);else i.add(t);return i}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;for(;!this._viewToModelMapping.has(e);)e=e.parent;return e}_toModelOffset(t,e,i){if(i!=t){return this._toModelOffset(t.parent,t.index,i)+this._toModelOffset(t,e,t)}if(t.is("text"))return e;let n=0;for(let i=0;i1?e[0]+":"+e[1]:e[0]}class Cr{constructor(t){this.conversionApi=zn({dispatcher:this},t)}convertChanges(t,e,i){for(const e of t.getMarkersToRemove())this.convertMarkerRemove(e.name,e.range,i);for(const e of t.getChanges())"insert"==e.type?this.convertInsert(vr._createFromPositionAndShift(e.position,e.length),i):"remove"==e.type?this.convertRemove(e.position,e.length,e.name,i):this.convertAttribute(e.range,e.attributeKey,e.attributeOldValue,e.attributeNewValue,i);for(const t of this.conversionApi.mapper.flushUnboundMarkerNames()){const n=e.get(t).getRange();this.convertMarkerRemove(t,n,i),this.convertMarkerAdd(t,n,i)}for(const e of t.getMarkersToAdd())this.convertMarkerAdd(e.name,e.range,i)}convertInsert(t,e){this.conversionApi.writer=e,this.conversionApi.consumable=this._createInsertConsumable(t);for(const e of t){const t=e.item,i={item:t,range:vr._createFromPositionAndShift(e.previousPosition,e.length)};this._testAndFire("insert",i);for(const e of t.getAttributeKeys())i.attributeKey=e,i.attributeOldValue=null,i.attributeNewValue=t.getAttribute(e),this._testAndFire(`attribute:${e}`,i)}this._clearConversionApi()}convertRemove(t,e,i,n){this.conversionApi.writer=n,this.fire("remove:"+i,{position:t,length:e},this.conversionApi),this._clearConversionApi()}convertAttribute(t,e,i,n,o){this.conversionApi.writer=o,this.conversionApi.consumable=this._createConsumableForRange(t,`attribute:${e}`);for(const o of t){const t={item:o.item,range:vr._createFromPositionAndShift(o.previousPosition,o.length),attributeKey:e,attributeOldValue:i,attributeNewValue:n};this._testAndFire(`attribute:${e}`,t)}this._clearConversionApi()}convertSelection(t,e,i){const n=Array.from(e.getMarkersAtPosition(t.getFirstPosition()));if(this.conversionApi.writer=i,this.conversionApi.consumable=this._createSelectionConsumable(t,n),this.fire("selection",{selection:t},this.conversionApi),t.isCollapsed){for(const e of n){const i=e.getRange();if(!Tr(t.getFirstPosition(),e,this.conversionApi.mapper))continue;const n={item:t,markerName:e.name,markerRange:i};this.conversionApi.consumable.test(t,"addMarker:"+e.name)&&this.fire("addMarker:"+e.name,n,this.conversionApi)}for(const e of t.getAttributeKeys()){const i={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};this.conversionApi.consumable.test(t,"attribute:"+i.attributeKey)&&this.fire("attribute:"+i.attributeKey+":$text",i,this.conversionApi)}this._clearConversionApi()}}convertMarkerAdd(t,e,i){if(!e.root.document||"$graveyard"==e.root.rootName)return;this.conversionApi.writer=i;const n="addMarker:"+t,o=new xr;if(o.add(e,n),this.conversionApi.consumable=o,this.fire(n,{markerName:t,markerRange:e},this.conversionApi),o.test(e,n)){this.conversionApi.consumable=this._createConsumableForRange(e,n);for(const i of e.getItems()){if(!this.conversionApi.consumable.test(i,n))continue;const o={item:i,range:vr._createOn(i),markerName:t,markerRange:e};this.fire(n,o,this.conversionApi)}this._clearConversionApi()}}convertMarkerRemove(t,e,i){e.root.document&&"$graveyard"!=e.root.rootName&&(this.conversionApi.writer=i,this.fire("removeMarker:"+t,{markerName:t,markerRange:e},this.conversionApi),this._clearConversionApi())}_createInsertConsumable(t){const e=new xr;for(const i of t){const t=i.item;e.add(t,"insert");for(const i of t.getAttributeKeys())e.add(t,"attribute:"+i)}return e}_createConsumableForRange(t,e){const i=new xr;for(const n of t.getItems())i.add(n,e);return i}_createSelectionConsumable(t,e){const i=new xr;i.add(t,"selection");for(const n of e)i.add(t,"addMarker:"+n.name);for(const e of t.getAttributeKeys())i.add(t,"attribute:"+e);return i}_testAndFire(t,e){if(!this.conversionApi.consumable.test(e.item,t))return;const i=e.item.name||"$text";this.fire(t+":"+i,e,this.conversionApi)}_clearConversionApi(){delete this.conversionApi.writer,delete this.conversionApi.consumable}}function Tr(t,e,i){const n=e.getRange(),o=Array.from(t.getAncestors());return o.shift(),o.reverse(),!o.some(t=>{if(n.containsItem(t)){return!!i.toViewElement(t).getCustomProperty("addHighlight")}})}vi(Cr,mi);class Pr{constructor(t,e,i){this._lastRangeBackward=!1,this._ranges=[],this._attrs=new Map,t&&this.setTo(t,e,i)}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let i=!1;for(const n of t._ranges)if(e.isEqual(n)){i=!0;break}if(!i)return!1}return!0}*getRanges(){for(const t of this._ranges)yield new vr(t.start,t.end)}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?new vr(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?new vr(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(t,e,i){if(null===t)this._setRanges([]);else if(t instanceof Pr)this._setRanges(t.getRanges(),t.isBackward);else if(t&&"function"==typeof t.getRanges)this._setRanges(t.getRanges(),t.isBackward);else if(t instanceof vr)this._setRanges([t],!!e&&!!e.backward);else if(t instanceof _r)this._setRanges([new vr(t)]);else if(t instanceof fr){const n=!!i&&!!i.backward;let o;if("in"==e)o=vr._createIn(t);else if("on"==e)o=vr._createOn(t);else{if(void 0===e)throw new hi.b("model-selection-setTo-required-second-parameter: selection.setTo requires the second parameter when the first parameter is a node.",[this,t]);o=new vr(_r._createAt(t,e))}this._setRanges([o],n)}else{if(!Ri(t))throw new hi.b("model-selection-setTo-not-selectable: Cannot set the selection to the given place.",[this,t]);this._setRanges(t,e&&!!e.backward)}}_setRanges(t,e=!1){const i=(t=Array.from(t)).some(e=>{if(!(e instanceof vr))throw new hi.b("model-selection-set-ranges-not-range: Selection range set to an object that is not an instance of model.Range.",[this,t]);return this._ranges.every(t=>!t.isEqual(e))});if(t.length!==this._ranges.length||i){this._removeAllRanges();for(const e of t)this._pushRange(e);this._lastRangeBackward=!!e,this.fire("change:range",{directChange:!0})}}setFocus(t,e){if(null===this.anchor)throw new hi.b("model-selection-setFocus-no-ranges: Cannot set selection focus if there are no ranges in selection.",[this,t]);const i=_r._createAt(t,e);if("same"==i.compareWith(this.focus))return;const n=this.anchor;this._ranges.length&&this._popRange(),"before"==i.compareWith(n)?(this._pushRange(new vr(i,n)),this._lastRangeBackward=!0):(this._pushRange(new vr(n,i)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){this.hasAttribute(t)&&(this._attrs.delete(t),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}setAttribute(t,e){this.getAttribute(t)!==e&&(this._attrs.set(t,e),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}getSelectedElement(){if(1!==this.rangeCount)return null;const t=this.getFirstRange(),e=t.start.nodeAfter,i=t.end.nodeBefore;return e instanceof br&&e==i?e:null}is(t){return"selection"==t||"model:selection"==t}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const i=Mr(e.start,t);i&&Ir(i,e)&&(yield i);for(const i of e.getWalker()){const n=i.item;"elementEnd"==i.type&&Er(n,t,e)&&(yield n)}const n=Mr(e.end,t);n&&!e.end.isTouching(_r._createAt(n,0))&&Ir(n,e)&&(yield n)}}containsEntireContent(t=this.anchor.root){const e=_r._createAt(t,0),i=_r._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&i.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t),this._ranges.push(new vr(t.start,t.end))}_checkRange(t){for(let e=0;e0;)this._popRange()}_popRange(){this._ranges.pop()}}function Sr(t,e){return!e.has(t)&&(e.add(t),t.document.model.schema.isBlock(t)&&t.parent)}function Er(t,e,i){return Sr(t,e)&&Ir(t,i)}function Mr(t,e){const i=t.parent.document.model.schema,n=t.parent.getAncestors({parentFirst:!0,includeSelf:!0});let o=!1;const s=n.find(t=>!o&&(o=i.isLimit(t),!o&&Sr(t,e)));return n.forEach(t=>e.add(t)),s}function Ir(t,e){const i=function(t){const e=t.document.model.schema;let i=t.parent;for(;i;){if(e.isBlock(i))return i;i=i.parent}}(t);return!i||!e.containsRange(vr._createOn(i),!0)}vi(Pr,mi);class Nr extends vr{constructor(t,e){super(t,e),Or.call(this)}detach(){this.stopListening()}is(t){return"liveRange"==t||"model:liveRange"==t||super.is(t)}toRange(){return new vr(this.start,this.end)}static fromRange(t){return new Nr(t.start,t.end)}}function Or(){this.listenTo(this.root.document.model,"applyOperation",(t,e)=>{const i=e[0];i.isDocumentOperation&&Rr.call(this,i)},{priority:"low"})}function Rr(t){const e=this.getTransformedByOperation(t),i=vr._createFromRanges(e),n=!i.isEqual(this),o=function(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return!1}(this,t);let s=null;if(n){"$graveyard"==i.root.rootName&&(s="remove"==t.type?t.sourcePosition:t.deletionPosition);const e=this.toRange();this.start=i.start,this.end=i.end,this.fire("change:range",e,{deletionPosition:s})}else o&&this.fire("change:content",this.toRange(),{deletionPosition:s})}vi(Nr,mi);class Lr{constructor(t){this._selection=new Dr(t),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection._updateMarkers(),this._selection._updateAttributes(!1)}is(t){return"selection"==t||"model:selection"==t||"documentSelection"==t||"model:documentSelection"==t}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(t,e,i){this._selection.setTo(t,e,i)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection._getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return"selection:"+t}static _isStoreAttributeKey(t){return t.startsWith("selection:")}}vi(Lr,mi);class Dr extends Pr{constructor(t){super(),this.markers=new yi({idProperty:"name"}),this._model=t.model,this._document=t,this._attributePriority=new Map,this._fixGraveyardRangesData=[],this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this.listenTo(this._model,"applyOperation",(t,e)=>{const i=e[0];if(i.isDocumentOperation&&"marker"!=i.type&&"rename"!=i.type&&"noop"!=i.type){for(;this._fixGraveyardRangesData.length;){const{liveRange:t,sourcePosition:e}=this._fixGraveyardRangesData.shift();this._fixGraveyardSelection(t,e)}this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1}))}},{priority:"lowest"}),this.on("change:range",()=>{for(const t of this.getRanges())if(!this._document._validateSelectionRange(t))throw new hi.b("document-selection-wrong-position: Range from document selection starts or ends at incorrect position.",this,{range:t})}),this.listenTo(this._model.markers,"update",()=>this._updateMarkers()),this.listenTo(this._document,"change",(t,e)=>{!function(t,e){const i=t.document.differ;for(const n of i.getChanges()){if("insert"!=n.type)continue;const i=n.position.parent;n.length===i.maxOffset&&t.enqueueChange(e,t=>{const e=Array.from(i.getAttributeKeys()).filter(t=>t.startsWith("selection:"));for(const n of e)t.removeAttribute(n,i)})}}(this._model,e)})}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t{this._hasChangedRange=!0,e.root==this._document.graveyard&&this._fixGraveyardRangesData.push({liveRange:e,sourcePosition:n.deletionPosition})}),e}_updateMarkers(){const t=[];let e=!1;for(const e of this._model.markers){const i=e.getRange();for(const n of this.getRanges())i.containsRange(n,!n.isCollapsed)&&t.push(e)}const i=Array.from(this.markers);for(const i of t)this.markers.has(i)||(this.markers.add(i),e=!0);for(const i of Array.from(this.markers))t.includes(i)||(this.markers.remove(i),e=!0);e&&this.fire("change:marker",{oldMarkers:i,directChange:!1})}_updateAttributes(t){const e=Li(this._getSurroundingAttributes()),i=Li(this.getAttributes());if(t)this._attributePriority=new Map,this._attrs=new Map;else for(const[t,e]of this._attributePriority)"low"==e&&(this._attrs.delete(t),this._attributePriority.delete(t));this._setAttributesTo(e);const n=[];for(const[t,e]of this.getAttributes())i.has(t)&&i.get(t)===e||n.push(t);for(const[t]of i)this.hasAttribute(t)||n.push(t);n.length>0&&this.fire("change:attribute",{attributeKeys:n,directChange:!1})}_setAttribute(t,e,i=!0){const n=i?"normal":"low";return("low"!=n||"normal"!=this._attributePriority.get(t))&&(super.getAttribute(t)!==e&&(this._attrs.set(t,e),this._attributePriority.set(t,n),!0))}_removeAttribute(t,e=!0){const i=e?"normal":"low";return("low"!=i||"normal"!=this._attributePriority.get(t))&&(this._attributePriority.set(t,i),!!super.hasAttribute(t)&&(this._attrs.delete(t),!0))}_setAttributesTo(t){const e=new Set;for(const[e,i]of this.getAttributes())t.get(e)!==i&&this._removeAttribute(e,!1);for(const[i,n]of t){this._setAttribute(i,n,!1)&&e.add(i)}return e}*_getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty)for(const e of t.getAttributeKeys())if(e.startsWith("selection:")){const i=e.substr("selection:".length);yield[i,t.getAttribute(e)]}}_getSurroundingAttributes(){const t=this.getFirstPosition(),e=this._model.schema;let i=null;if(this.isCollapsed){const e=t.textNode?t.textNode:t.nodeBefore,n=t.textNode?t.textNode:t.nodeAfter;if(this.isGravityOverridden||(i=zr(e)),i||(i=zr(n)),!this.isGravityOverridden&&!i){let t=e;for(;t&&!i;)t=t.previousSibling,i=zr(t)}if(!i){let t=n;for(;t&&!i;)t=t.nextSibling,i=zr(t)}i||(i=this._getStoredAttributes())}else{const t=this.getFirstRange();for(const n of t){if(n.item.is("element")&&e.isObject(n.item))break;if("text"==n.type){i=n.item.getAttributes();break}}}return i}_fixGraveyardSelection(t,e){const i=e.clone(),n=this._model.schema.getNearestSelectionRange(i),o=this._ranges.indexOf(t);if(this._ranges.splice(o,1),t.detach(),n){const t=this._prepareRange(n);this._ranges.splice(o,0,t)}}}function zr(t){return t instanceof gr||t instanceof mr?t.getAttributes():null}class jr{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers)t(e);return this}}var Vr=function(t){return ti(t,5)};class Br extends jr{elementToElement(t){return this.add(function(t){return(t=Vr(t)).view=Hr(t.view,"container"),e=>{var i;e.on("insert:"+t.model,(i=t.view,(t,e,n)=>{const o=i(e.item,n.writer);if(!o)return;if(!n.consumable.consume(e.item,"insert"))return;const s=n.mapper.toViewPosition(e.range.start);n.mapper.bindElements(e.item,o),n.writer.insert(s,o)}),{priority:t.converterPriority||"normal"})}}(t))}attributeToElement(t){return this.add(function(t){let e="attribute:"+((t=Vr(t)).model.key?t.model.key:t.model);t.model.name&&(e+=":"+t.model.name);if(t.model.values)for(const e of t.model.values)t.view[e]=Hr(t.view[e],"attribute");else t.view=Hr(t.view,"attribute");const i=Ur(t);return n=>{n.on(e,function(t){return(e,i,n)=>{const o=t(i.attributeOldValue,n.writer),s=t(i.attributeNewValue,n.writer);if(!o&&!s)return;if(!n.consumable.consume(i.item,e.name))return;const r=n.writer,a=r.document.selection;if(i.item instanceof Pr||i.item instanceof Lr)r.wrap(a.getFirstRange(),s);else{let t=n.mapper.toViewRange(i.range);null!==i.attributeOldValue&&o&&(t=r.unwrap(t,o)),null!==i.attributeNewValue&&s&&r.wrap(t,s)}}}(i),{priority:t.converterPriority||"normal"})}}(t))}attributeToAttribute(t){return this.add(function(t){let e="attribute:"+((t=Vr(t)).model.key?t.model.key:t.model);t.model.name&&(e+=":"+t.model.name);if(t.model.values)for(const e of t.model.values)t.view[e]=Wr(t.view[e]);else t.view=Wr(t.view);const i=Ur(t);return n=>{var o;n.on(e,(o=i,(t,e,i)=>{const n=o(e.attributeOldValue,e),s=o(e.attributeNewValue,e);if(!n&&!s)return;if(!i.consumable.consume(e.item,t.name))return;const r=i.mapper.toViewElement(e.item),a=i.writer;if(!r)throw new hi.b("conversion-attribute-to-attribute-on-text: Trying to convert text node's attribute with attribute-to-attribute converter.",[e,i]);if(null!==e.attributeOldValue&&n)if("class"==n.key){const t=Array.isArray(n.value)?n.value:[n.value];for(const e of t)a.removeClass(e,r)}else if("style"==n.key){const t=Object.keys(n.value);for(const e of t)a.removeStyle(e,r)}else a.removeAttribute(n.key,r);if(null!==e.attributeNewValue&&s)if("class"==s.key){const t=Array.isArray(s.value)?s.value:[s.value];for(const e of t)a.addClass(e,r)}else if("style"==s.key){const t=Object.keys(s.value);for(const e of t)a.setStyle(e,s.value[e],r)}else a.setAttribute(s.key,s.value,r)}),{priority:t.converterPriority||"normal"})}}(t))}markerToElement(t){return this.add(function(t){return(t=Vr(t)).view=Hr(t.view,"ui"),e=>{var i;e.on("addMarker:"+t.model,(i=t.view,(t,e,n)=>{e.isOpening=!0;const o=i(e,n.writer);e.isOpening=!1;const s=i(e,n.writer);if(!o||!s)return;const r=e.markerRange;if(r.isCollapsed&&!n.consumable.consume(r,t.name))return;for(const e of r)if(!n.consumable.consume(e.item,t.name))return;const a=n.mapper,c=n.writer;c.insert(a.toViewPosition(r.start),o),n.mapper.bindElementToMarker(o,e.markerName),r.isCollapsed||(c.insert(a.toViewPosition(r.end),s),n.mapper.bindElementToMarker(s,e.markerName)),t.stop()}),{priority:t.converterPriority||"normal"}),e.on("removeMarker:"+t.model,(t.view,(t,e,i)=>{const n=i.mapper.markerNameToElements(e.markerName);if(n){for(const t of n)i.mapper.unbindElementFromMarkerName(t,e.markerName),i.writer.clear(i.writer.createRangeOn(t),t);i.writer.clearClonedElementsGroup(e.markerName),t.stop()}}),{priority:t.converterPriority||"normal"})}}(t))}markerToHighlight(t){return this.add(function(t){return e=>{var i;e.on("addMarker:"+t.model,(i=t.view,(t,e,n)=>{if(!e.item)return;if(!(e.item instanceof Pr||e.item instanceof Lr||e.item.is("textProxy")))return;const o=qr(i,e,n);if(!o)return;if(!n.consumable.consume(e.item,t.name))return;const s=Fr(o),r=n.writer,a=r.document.selection;if(e.item instanceof Pr||e.item instanceof Lr)r.wrap(a.getFirstRange(),s,a);else{const t=n.mapper.toViewRange(e.range),i=r.wrap(t,s);for(const t of i.getItems())if(t.is("attributeElement")&&t.isSimilar(s)){n.mapper.bindElementToMarker(t,e.markerName);break}}}),{priority:t.converterPriority||"normal"}),e.on("addMarker:"+t.model,function(t){return(e,i,n)=>{if(!i.item)return;if(!(i.item instanceof br))return;const o=qr(t,i,n);if(!o)return;if(!n.consumable.test(i.item,e.name))return;const s=n.mapper.toViewElement(i.item);if(s&&s.getCustomProperty("addHighlight")){n.consumable.consume(i.item,e.name);for(const t of vr._createIn(i.item))n.consumable.consume(t.item,e.name);s.getCustomProperty("addHighlight")(s,o,n.writer),n.mapper.bindElementToMarker(s,i.markerName)}}}(t.view),{priority:t.converterPriority||"normal"}),e.on("removeMarker:"+t.model,function(t){return(e,i,n)=>{if(i.markerRange.isCollapsed)return;const o=qr(t,i,n);if(!o)return;const s=Fr(o),r=n.mapper.markerNameToElements(i.markerName);if(r){for(const t of r)n.mapper.unbindElementFromMarkerName(t,i.markerName),t.is("attributeElement")?n.writer.unwrap(n.writer.createRangeOn(t),s):t.getCustomProperty("removeHighlight")(t,o.id,n.writer);n.writer.clearClonedElementsGroup(i.markerName),e.stop()}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}}function Fr(t){const e=new ro("span",t.attributes);return t.classes&&e._addClass(t.classes),t.priority&&(e._priority=t.priority),e._id=t.id,e}function Hr(t,e){return"function"==typeof t?t:(i,n)=>function(t,e,i){"string"==typeof t&&(t={name:t});let n;const o=Object.assign({},t.attributes);if("container"==i)n=e.createContainerElement(t.name,o);else if("attribute"==i){const i={priority:t.priority||ro.DEFAULT_PRIORITY};n=e.createAttributeElement(t.name,o,i)}else n=e.createUIElement(t.name,o);if(t.styles){const i=Object.keys(t.styles);for(const o of i)e.setStyle(o,t.styles[o],n)}if(t.classes){const i=t.classes;if("string"==typeof i)e.addClass(i,n);else for(const t of i)e.addClass(t,n)}return n}(t,n,e)}function Ur(t){return t.model.values?(e,i)=>{const n=t.view[e];return n?n(e,i):null}:t.view}function Wr(t){return"string"==typeof t?e=>({key:t,value:e}):"object"==typeof t?t.value?()=>t:e=>({key:t.key,value:e}):t}function qr(t,e,i){const n="function"==typeof t?t(e,i):t;return n?(n.priority||(n.priority=10),n.id||(n.id=e.markerName),n):null}class $r extends jr{elementToElement(t){return this.add(Yr(t))}elementToAttribute(t){return this.add(function(t){Qr(t=Vr(t));const e=Kr(t,!1),i=Gr(t.view),n=i?"element:"+i:"element";return i=>{i.on(n,e,{priority:t.converterPriority||"low"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=Vr(t);let e=null;("string"==typeof t.view||t.view.key)&&(e=function(t){"string"==typeof t.view&&(t.view={key:t.view});const e=t.view.key;let i;if("class"==e||"style"==e){i={["class"==e?"classes":"styles"]:t.view.value}}else{const n=void 0===t.view.value?/[\s\S]*/:t.view.value;i={attributes:{[e]:n}}}t.view.name&&(i.name=t.view.name);return t.view=i,e}(t));Qr(t,e);const i=Kr(t,!0);return e=>{e.on("element",i,{priority:t.converterPriority||"low"})}}(t))}elementToMarker(t){return this.add(function(t){return function(t){const e=t.model;t.model=(t,i)=>{const n="string"==typeof e?e:e(t);return i.createElement("$marker",{"data-name":n})}}(t=Vr(t)),Yr(t)}(t))}}function Yr(t){const e=function(t){const e=t.view?new Di(t.view):null;return(i,n,o)=>{let s={};if(e){const t=e.match(n.viewItem);if(!t)return;s=t.match}s.name=!0;const r=(a=t.model,c=n.viewItem,l=o.writer,a instanceof Function?a(c,l):l.createElement(a));var a,c,l;if(!r)return;if(!o.consumable.test(n.viewItem,s))return;const d=o.splitToAllowedParent(r,n.modelCursor);if(!d)return;o.writer.insert(r,d.position),o.convertChildren(n.viewItem,o.writer.createPositionAt(r,0)),o.consumable.consume(n.viewItem,s);const h=o.getSplitParts(r);n.modelRange=new vr(o.writer.createPositionBefore(r),o.writer.createPositionAfter(h[h.length-1])),d.cursorParent?n.modelCursor=o.writer.createPositionAt(d.cursorParent,0):n.modelCursor=n.modelRange.end}}(t=Vr(t)),i=Gr(t.view),n=i?"element:"+i:"element";return i=>{i.on(n,e,{priority:t.converterPriority||"normal"})}}function Gr(t){return"string"==typeof t?t:"object"==typeof t&&"string"==typeof t.name?t.name:null}function Qr(t,e=null){const i=null===e||(t=>t.getAttribute(e)),n="object"!=typeof t.model?t.model:t.model.key,o="object"!=typeof t.model||void 0===t.model.value?i:t.model.value;t.model={key:n,value:o}}function Kr(t,e){const i=new Di(t.view);return(n,o,s)=>{const r=i.match(o.viewItem);if(!r)return;const a=t.model.key,c="function"==typeof t.model.value?t.model.value(o.viewItem):t.model.value;null!==c&&(!function(t,e){const i="function"==typeof t?t(e):t;if("object"==typeof i&&!Gr(i))return!1;return!i.classes&&!i.attributes&&!i.styles}(t.view,o.viewItem)?delete r.match.name:r.match.name=!0,s.consumable.test(o.viewItem,r.match)&&(o.modelRange||(o=Object.assign(o,s.convertChildren(o.viewItem,o.modelCursor))),function(t,e,i,n){let o=!1;for(const s of Array.from(t.getItems({shallow:i})))n.schema.checkAttribute(s,e.key)&&(n.writer.setAttribute(e.key,e.value,s),o=!0);return o}(o.modelRange,{key:a,value:c},e,s)&&s.consumable.consume(o.viewItem,r.match)))}}class Jr{constructor(t){this.model=t,this.view=new ur,this.mapper=new yr,this.downcastDispatcher=new Cr({mapper:this.mapper});const e=this.model.document,i=e.selection,n=this.model.markers;this.listenTo(this.model,"_beforeChanges",()=>{this.view._disableRendering(!0)},{priority:"highest"}),this.listenTo(this.model,"_afterChanges",()=>{this.view._disableRendering(!1)},{priority:"lowest"}),this.listenTo(e,"change",()=>{this.view.change(t=>{this.downcastDispatcher.convertChanges(e.differ,n,t),this.downcastDispatcher.convertSelection(i,n,t)})},{priority:"low"}),this.listenTo(this.view.document,"selectionChange",function(t,e){return(i,n)=>{const o=n.newSelection,s=new Pr,r=[];for(const t of o.getRanges())r.push(e.toModelRange(t));s.setTo(r,{backward:o.isBackward}),s.isEqual(t.document.selection)||t.change(t=>{t.setSelection(s)})}}(this.model,this.mapper)),this.downcastDispatcher.on("insert:$text",(t,e,i)=>{if(!i.consumable.consume(e.item,"insert"))return;const n=i.writer,o=i.mapper.toViewPosition(e.range.start),s=n.createText(e.item.data);n.insert(o,s)},{priority:"lowest"}),this.downcastDispatcher.on("remove",(t,e,i)=>{const n=i.mapper.toViewPosition(e.position),o=e.position.getShiftedBy(e.length),s=i.mapper.toViewPosition(o,{isPhantom:!0}),r=i.writer.createRange(n,s),a=i.writer.remove(r.getTrimmed());for(const t of i.writer.createRangeIn(a).getItems())i.mapper.unbindViewElement(t)},{priority:"low"}),this.downcastDispatcher.on("selection",(t,e,i)=>{const n=i.writer,o=n.document.selection;for(const t of o.getRanges())t.isCollapsed&&t.end.parent.document&&i.writer.mergeAttributes(t.start);n.setSelection(null)},{priority:"low"}),this.downcastDispatcher.on("selection",(t,e,i)=>{const n=e.selection;if(n.isCollapsed)return;if(!i.consumable.consume(n,"selection"))return;const o=[];for(const t of n.getRanges()){const e=i.mapper.toViewRange(t);o.push(e)}i.writer.setSelection(o,{backward:n.isBackward})},{priority:"low"}),this.downcastDispatcher.on("selection",(t,e,i)=>{const n=e.selection;if(!n.isCollapsed)return;if(!i.consumable.consume(n,"selection"))return;const o=i.writer,s=n.getFirstPosition(),r=i.mapper.toViewPosition(s),a=o.breakAttributes(r);o.setSelection(a)},{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using(t=>{if("$graveyard"==t.rootName)return null;const e=new Jn(t.name);return e.rootName=t.rootName,e._document=this.view.document,this.mapper.bindElements(t,e),e})}destroy(){this.view.destroy(),this.stopListening()}}vi(Jr,Hn);class Zr{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const i=this.get(t);if(!i)throw new hi.b("commandcollection-command-not-found: Command does not exist.",this,{commandName:t});i.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands())t.destroy()}}class Xr{constructor(){this._consumables=new Map}add(t,e){let i;t.is("text")||t.is("documentFragment")?this._consumables.set(t,!0):(this._consumables.has(t)?i=this._consumables.get(t):(i=new ta,this._consumables.set(t,i)),i.add(e))}test(t,e){const i=this._consumables.get(t);return void 0===i?null:t.is("text")||t.is("documentFragment")?i:i.test(e)}consume(t,e){return!!this.test(t,e)&&(t.is("text")||t.is("documentFragment")?this._consumables.set(t,!1):this._consumables.get(t).consume(e),!0)}revert(t,e){const i=this._consumables.get(t);void 0!==i&&(t.is("text")||t.is("documentFragment")?this._consumables.set(t,!0):i.revert(e))}static consumablesFromElement(t){const e={name:!0,attributes:[],classes:[],styles:[]},i=t.getAttributeKeys();for(const t of i)"style"!=t&&"class"!=t&&e.attributes.push(t);const n=t.getClassNames();for(const t of n)e.classes.push(t);const o=t.getStyleNames();for(const t of o)e.styles.push(t);return e}static createFrom(t,e){if(e||(e=new Xr),t.is("text"))return e.add(t),e;t.is("element")&&e.add(t,Xr.consumablesFromElement(t)),t.is("documentFragment")&&e.add(t);for(const i of t.getChildren())e=Xr.createFrom(i,e);return e}}class ta{constructor(){this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){t.name&&(this._canConsumeName=!0);for(const e in this._consumables)e in t&&this._add(e,t[e])}test(t){if(t.name&&!this._canConsumeName)return this._canConsumeName;for(const e in this._consumables)if(e in t){const i=this._test(e,t[e]);if(!0!==i)return i}return!0}consume(t){t.name&&(this._canConsumeName=!1);for(const e in this._consumables)e in t&&this._consume(e,t[e])}revert(t){t.name&&(this._canConsumeName=!0);for(const e in this._consumables)e in t&&this._revert(e,t[e])}_add(t,e){const i=Lt(e)?e:[e],n=this._consumables[t];for(const e of i){if("attributes"===t&&("class"===e||"style"===e))throw new hi.b("viewconsumable-invalid-attribute: Classes and styles should be handled separately.",this);if(n.set(e,!0),"styles"===t)for(const t of En.getRelatedStyles(e))n.set(t,!0)}}_test(t,e){const i=Lt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){const t=n.get(e);if(void 0===t)return null;if(!t)return!1}else{const t="class"==e?"classes":"styles",i=this._test(t,[...this._consumables[t].keys()]);if(!0!==i)return i}return!0}_consume(t,e){const i=Lt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){if(n.set(e,!1),"styles"==t)for(const t of En.getRelatedStyles(e))n.set(t,!1)}else{const t="class"==e?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}}_revert(t,e){const i=Lt(e)?e:[e],n=this._consumables[t];for(const e of i)if("attributes"!==t||"class"!==e&&"style"!==e){!1===n.get(e)&&n.set(e,!0)}else{const t="class"==e?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}}}class ea{constructor(){this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",(t,e)=>{e[0]=new ia(e[0])},{priority:"highest"}),this.on("checkChild",(t,e)=>{e[0]=new ia(e[0]),e[1]=this.getDefinition(e[1])},{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t])throw new hi.b("schema-cannot-register-item-twice: A single item cannot be registered twice in the schema.",this,{itemName:t});this._sourceDefinitions[t]=[Object.assign({},e)],this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t])throw new hi.b("schema-cannot-extend-missing-item: Cannot extend an item which was not registered yet.",this,{itemName:t});this._sourceDefinitions[t].push(Object.assign({},e)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(t){let e;return e="string"==typeof t?t:t.is&&(t.is("text")||t.is("textProxy"))?"$text":t.name,this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!(!e||!e.isBlock)}isLimit(t){const e=this.getDefinition(t);return!!e&&!(!e.isLimit&&!e.isObject)}isObject(t){const e=this.getDefinition(t);return!(!e||!e.isObject)}isInline(t){const e=this.getDefinition(t);return!(!e||!e.isInline)}checkChild(t,e){return!!e&&this._checkContextMatch(e,t)}checkAttribute(t,e){const i=this.getDefinition(t.last);return!!i&&i.allowAttributes.includes(e)}checkMerge(t,e=null){if(t instanceof _r){const e=t.nodeBefore,i=t.nodeAfter;if(!(e instanceof br))throw new hi.b("schema-check-merge-no-element-before: The node before the merge position must be an element.",this);if(!(i instanceof br))throw new hi.b("schema-check-merge-no-element-after: The node after the merge position must be an element.",this);return this.checkMerge(e,i)}for(const i of e.getChildren())if(!this.checkChild(t,i))return!1;return!0}addChildCheck(t){this.on("checkChild",(e,[i,n])=>{if(!n)return;const o=t(i,n);"boolean"==typeof o&&(e.stop(),e.return=o)},{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",(e,[i,n])=>{const o=t(i,n);"boolean"==typeof o&&(e.stop(),e.return=o)},{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof _r)e=t.parent;else{e=(t instanceof vr?[t]:Array.from(t.getRanges())).reduce((t,e)=>{const i=e.getCommonAncestor();return t?t.getCommonAncestor(i,{includeSelf:!0}):i},null)}for(;!this.isLimit(e)&&e.parent;)e=e.parent;return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const i=[...t.getFirstPosition().getAncestors(),new mr("",t.getAttributes())];return this.checkAttribute(i,e)}{const i=t.getRanges();for(const t of i)for(const i of t)if(this.checkAttribute(i.item,e))return!0}return!1}*getValidRanges(t,e){t=function*(t){for(const e of t)yield*e.getMinimalFlatRanges()}(t);for(const i of t)yield*this._getValidRangesForRange(i,e)}getNearestSelectionRange(t,e="both"){if(this.checkChild(t,"$text"))return new vr(t);let i,n;"both"!=e&&"backward"!=e||(i=new wr({startPosition:t,direction:"backward"})),"both"!=e&&"forward"!=e||(n=new wr({startPosition:t}));for(const t of function*(t,e){let i=!1;for(;!i;){if(i=!0,t){const e=t.next();e.done||(i=!1,yield{walker:t,value:e.value})}if(e){const t=e.next();t.done||(i=!1,yield{walker:e,value:t.value})}}}(i,n)){const e=t.walker==i?"elementEnd":"elementStart",n=t.value;if(n.type==e&&this.isObject(n.item))return vr._createOn(n.item);if(this.checkChild(n.nextPosition,"$text"))return new vr(n.nextPosition)}return null}findAllowedParent(t,e){let i=t.parent;for(;i;){if(this.checkChild(i,e))return i;if(this.isLimit(i))return null;i=i.parent}return null}removeDisallowedAttributes(t,e){for(const i of t)if(i.is("text"))fa(this,i,e);else{const t=vr._createIn(i).getPositions();for(const i of t){fa(this,i.nodeBefore||i.parent,e)}}}createContext(t){return new ia(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={},e=this._sourceDefinitions,i=Object.keys(e);for(const n of i)t[n]=na(e[n],n);for(const e of i)oa(t,e);for(const e of i)sa(t,e);for(const e of i)ra(t,e),aa(t,e);for(const e of i)ca(t,e),la(t,e);this._compiledDefinitions=t}_checkContextMatch(t,e,i=e.length-1){const n=e.getItem(i);if(t.allowIn.includes(n.name)){if(0==i)return!0;{const t=this.getDefinition(n);return this._checkContextMatch(t,e,i-1)}}return!1}*_getValidRangesForRange(t,e){let i=t.start,n=t.start;for(const o of t.getItems({shallow:!0}))o.is("element")&&(yield*this._getValidRangesForRange(vr._createIn(o),e)),this.checkAttribute(o,e)||(i.isEqual(n)||(yield new vr(i,n)),i=_r._createAfter(o)),n=_r._createAfter(o);i.isEqual(n)||(yield new vr(i,n))}}vi(ea,Hn);class ia{constructor(t){if(t instanceof ia)return t;"string"==typeof t?t=[t]:Array.isArray(t)||(t=t.getAncestors({includeSelf:!0})),t[0]&&"string"!=typeof t[0]&&t[0].is("documentFragment")&&t.shift(),this._items=t.map(ua)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new ia([t]);return e._items=[...this._items,...e._items],e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map(t=>t.name)}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function na(t,e){const i={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],inheritTypesFrom:[]};return function(t,e){for(const i of t){const t=Object.keys(i).filter(t=>t.startsWith("is"));for(const n of t)e[n]=i[n]}}(t,i),da(t,i,"allowIn"),da(t,i,"allowContentOf"),da(t,i,"allowWhere"),da(t,i,"allowAttributes"),da(t,i,"allowAttributesOf"),da(t,i,"inheritTypesFrom"),function(t,e){for(const i of t){const t=i.inheritAllFrom;t&&(e.allowContentOf.push(t),e.allowWhere.push(t),e.allowAttributesOf.push(t),e.inheritTypesFrom.push(t))}}(t,i),i}function oa(t,e){for(const i of t[e].allowContentOf)if(t[i]){ha(t,i).forEach(t=>{t.allowIn.push(e)})}delete t[e].allowContentOf}function sa(t,e){for(const i of t[e].allowWhere){const n=t[i];if(n){const i=n.allowIn;t[e].allowIn.push(...i)}}delete t[e].allowWhere}function ra(t,e){for(const i of t[e].allowAttributesOf){const n=t[i];if(n){const i=n.allowAttributes;t[e].allowAttributes.push(...i)}}delete t[e].allowAttributesOf}function aa(t,e){const i=t[e];for(const e of i.inheritTypesFrom){const n=t[e];if(n){const t=Object.keys(n).filter(t=>t.startsWith("is"));for(const e of t)e in i||(i[e]=n[e])}}delete i.inheritTypesFrom}function ca(t,e){const i=t[e],n=i.allowIn.filter(e=>t[e]);i.allowIn=Array.from(new Set(n))}function la(t,e){const i=t[e];i.allowAttributes=Array.from(new Set(i.allowAttributes))}function da(t,e,i){for(const n of t)"string"==typeof n[i]?e[i].push(n[i]):Array.isArray(n[i])&&e[i].push(...n[i])}function ha(t,e){const i=t[e];return(n=t,Object.keys(n).map(t=>n[t])).filter(t=>t.allowIn.includes(i.name));var n}function ua(t){return"string"==typeof t?{name:t,*getAttributeKeys(){},getAttribute(){}}:{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute:e=>t.getAttribute(e)}}function fa(t,e,i){for(const n of e.getAttributeKeys())t.checkAttribute(e,n)||i.removeAttribute(n,e)}class ma{constructor(t={}){this._splitParts=new Map,this._modelCursor=null,this.conversionApi=Object.assign({},t),this.conversionApi.convertItem=this._convertItem.bind(this),this.conversionApi.convertChildren=this._convertChildren.bind(this),this.conversionApi.splitToAllowedParent=this._splitToAllowedParent.bind(this),this.conversionApi.getSplitParts=this._getSplitParts.bind(this)}convert(t,e,i=["$root"]){this.fire("viewCleanup",t),this._modelCursor=function(t,e){let i;for(const n of new ia(t)){const t={};for(const e of n.getAttributeKeys())t[e]=n.getAttribute(e);const o=e.createElement(n.name,t);i&&e.append(o,i),i=_r._createAt(o,0)}return i}(i,e),this.conversionApi.writer=e,this.conversionApi.consumable=Xr.createFrom(t),this.conversionApi.store={};const{modelRange:n}=this._convertItem(t,this._modelCursor),o=e.createDocumentFragment();if(n){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren()))e.append(t,o);o.markers=function(t,e){const i=new Set,n=new Map,o=vr._createIn(t).getItems();for(const t of o)"$marker"==t.name&&i.add(t);for(const t of i){const i=t.getAttribute("data-name"),o=e.createPositionBefore(t);n.has(i)?n.get(i).end=o.clone():n.set(i,new vr(o.clone())),e.remove(t)}return n}(o,e)}return this._modelCursor=null,this._splitParts.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,o}_convertItem(t,e){const i=Object.assign({viewItem:t,modelCursor:e,modelRange:null});if(t.is("element")?this.fire("element:"+t.name,i,this.conversionApi):t.is("text")?this.fire("text",i,this.conversionApi):this.fire("documentFragment",i,this.conversionApi),i.modelRange&&!(i.modelRange instanceof vr))throw new hi.b("view-conversion-dispatcher-incorrect-result: Incorrect conversion result was dropped.",this);return{modelRange:i.modelRange,modelCursor:i.modelCursor}}_convertChildren(t,e){const i=new vr(e);let n=e;for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);t.modelRange instanceof vr&&(i.end=t.modelRange.end,n=t.modelCursor)}return{modelRange:i,modelCursor:n}}_splitToAllowedParent(t,e){const i=this.conversionApi.schema.findAllowedParent(e,t);if(!i)return null;if(i===e.parent)return{position:e};if(this._modelCursor.parent.getAncestors().includes(i))return null;const n=this.conversionApi.writer.split(e,i),o=[];for(const t of n.range.getWalker())if("elementEnd"==t.type)o.push(t.item);else{const e=o.pop(),i=t.item;this._registerSplitPair(e,i)}return{position:n.position,cursorParent:n.range.end.parent}}_registerSplitPair(t,e){this._splitParts.has(t)||this._splitParts.set(t,[t]);const i=this._splitParts.get(t);this._splitParts.set(e,i),i.push(e)}_getSplitParts(t){let e;return e=this._splitParts.has(t)?this._splitParts.get(t):[t],e}_removeEmptyElements(){let t=!1;for(const e of this._splitParts.keys())e.isEmpty&&(this.conversionApi.writer.remove(e),this._splitParts.delete(e),t=!0);t&&this._removeEmptyElements()}}vi(ma,mi);class ga{constructor(t,e){this.model=t,this.processor=e,this.mapper=new yr,this.downcastDispatcher=new Cr({mapper:this.mapper}),this.downcastDispatcher.on("insert:$text",(t,e,i)=>{if(!i.consumable.consume(e.item,"insert"))return;const n=i.writer,o=i.mapper.toViewPosition(e.range.start),s=n.createText(e.item.data);n.insert(o,s)},{priority:"lowest"}),this.upcastDispatcher=new ma({schema:t.schema}),this.upcastDispatcher.on("text",(t,e,i)=>{if(i.schema.checkChild(e.modelCursor,"$text")&&i.consumable.consume(e.viewItem)){const t=i.writer.createText(e.viewItem.data);i.writer.insert(t,e.modelCursor),e.modelRange=vr._createFromPositionAndShift(e.modelCursor,t.offsetSize),e.modelCursor=e.modelRange.end}},{priority:"lowest"}),this.upcastDispatcher.on("element",(t,e,i)=>{if(!e.modelRange&&i.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:n}=i.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=n}},{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",(t,e,i)=>{if(!e.modelRange&&i.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:n}=i.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=n}},{priority:"lowest"}),this.decorate("init"),this.on("init",()=>{this.fire("ready")},{priority:"lowest"})}get(t){const{rootName:e="main",trim:i="empty"}=t||{};if(!this._checkIfRootsExists([e]))throw new hi.b("datacontroller-get-non-existent-root: Attempting to get data from a non-existing root.",this);const n=this.model.document.getRoot(e);return"empty"!==i||this.model.hasContent(n,{ignoreWhitespaces:!0})?this.stringify(n):""}stringify(t){const e=this.toView(t);return this.processor.toData(e)}toView(t){this.mapper.clearBindings();const e=vr._createIn(t),i=new Ao,n=new Co(new so);if(this.mapper.bindElements(t,i),this.downcastDispatcher.convertInsert(e,n),!t.is("documentFragment")){const e=function(t){const e=[],i=t.root.document;if(!i)return[];const n=vr._createIn(t);for(const t of i.model.markers){const i=n.getIntersection(t.getRange());i&&e.push([t.name,i])}return e}(t);for(const[t,i]of e)this.downcastDispatcher.convertMarkerAdd(t,i,n)}return i}init(t){if(this.model.document.version)throw new hi.b("datacontroller-init-document-not-empty: Trying to set initial data to not empty document.",this);let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new hi.b("datacontroller-init-non-existent-root: Attempting to init data on a non-existing root.",this);return this.model.enqueueChange("transparent",t=>{for(const i of Object.keys(e)){const n=this.model.document.getRoot(i);t.insert(this.parse(e[i],n),n,0)}}),Promise.resolve()}set(t){let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new hi.b("datacontroller-set-non-existent-root: Attempting to set data on a non-existing root.",this);this.model.enqueueChange("transparent",t=>{t.setSelection(null),t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const i of Object.keys(e)){const n=this.model.document.getRoot(i);t.remove(t.createRangeIn(n)),t.insert(this.parse(e[i],n),n,0)}})}parse(t,e="$root"){const i=this.processor.toView(t);return this.toModel(i,e)}toModel(t,e="$root"){return this.model.change(i=>this.upcastDispatcher.convert(t,i,e))}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t)if(!this.model.document.getRootNames().includes(e))return!1;return!0}}vi(ga,Hn);class pa{constructor(t,e){this._helpers=new Map,this._downcast=Array.isArray(t)?t:[t],this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=Array.isArray(e)?e:[e],this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(t,e){const i=this._downcast.includes(e);if(!this._upcast.includes(e)&&!i)throw new hi.b("conversion-add-alias-dispatcher-not-registered: Trying to register and alias for a dispatcher that nas not been registered.",this);this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:i})}for(t){if(!this._helpers.has(t))throw new hi.b("conversion-for-unknown-group: Trying to add a converter to an unknown dispatchers group.",this);return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:i}of ba(t))this.for("upcast").elementToElement({model:e,view:i,converterPriority:t.converterPriority})}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:i}of ba(t))this.for("upcast").elementToAttribute({view:i,model:e,converterPriority:t.converterPriority})}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:i}of ba(t))this.for("upcast").attributeToAttribute({view:i,model:e})}_createConversionHelpers({name:t,dispatchers:e,isDowncast:i}){if(this._helpers.has(t))throw new hi.b("conversion-group-exists: Trying to register a group name that has already been registered.",this);const n=i?new Br(e):new $r(e);this._helpers.set(t,n)}}function*ba(t){if(t.model.values)for(const e of t.model.values){const i={key:t.model.key,value:e},n=t.view[e],o=t.upcastAlso?t.upcastAlso[e]:void 0;yield*wa(i,n,o)}else yield*wa(t.model,t.view,t.upcastAlso)}function*wa(t,e,i){if(yield{model:t,view:e},i){i=Array.isArray(i)?i:[i];for(const e of i)yield{model:t,view:e}}}class ka{constructor(t="default"){this.operations=[],this.type=t}get baseVersion(){for(const t of this.operations)if(null!==t.baseVersion)return t.baseVersion;return null}addOperation(t){return t.batch=this,this.operations.push(t),t}}class _a{constructor(t){this.baseVersion=t,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);return t.__className=this.constructor.className,delete t.batch,delete t.isDocumentOperation,t}static get className(){return"Operation"}static fromJSON(t){return new this(t.baseVersion)}}class va{constructor(t){this.markers=new Map,this._children=new pr,t&&this._insertChild(0,t)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}is(t){return"documentFragment"==t||"model:documentFragment"==t}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const i of t)e=e.getChild(e.offsetToIndex(i));return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children)t.push(e.toJSON());return t}static fromJSON(t){const e=[];for(const i of t)i.name?e.push(br.fromJSON(i)):e.push(mr.fromJSON(i));return new va(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const i=function(t){if("string"==typeof t)return[new mr(t)];Ri(t)||(t=[t]);return Array.from(t).map(t=>"string"==typeof t?new mr(t):t instanceof gr?new mr(t.data,t.getAttributes()):t)}(e);for(const t of i)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,i)}_removeChildren(t,e=1){const i=this._children._removeNodes(t,e);for(const t of i)t.parent=null;return i}}function ya(t,e){const i=(e=Ca(e)).reduce((t,e)=>t+e.offsetSize,0),n=t.parent;Pa(t);const o=t.index;return n._insertChild(o,e),Ta(n,o+e.length),Ta(n,o),new vr(t,t.getShiftedBy(i))}function xa(t){if(!t.isFlat)throw new hi.b("operation-utils-remove-range-not-flat: Trying to remove a range which starts and ends in different element.",this);const e=t.start.parent;Pa(t.start),Pa(t.end);const i=e._removeChildren(t.start.index,t.end.index-t.start.index);return Ta(e,t.start.index),i}function Aa(t,e){if(!t.isFlat)throw new hi.b("operation-utils-move-range-not-flat: Trying to move a range which starts and ends in different element.",this);const i=xa(t);return ya(e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset),i)}function Ca(t){const e=[];t instanceof Array||(t=[t]);for(let i=0;it.maxOffset)throw new hi.b("move-operation-nodes-do-not-exist: The nodes which should be moved do not exist.",this);if(t===e&&i=i&&this.targetPosition.path[t]t._clone(!0))),e=new Oa(this.position,t,this.baseVersion);return e.shouldReceiveAttributes=this.shouldReceiveAttributes,e}getReversed(){const t=this.position.root.document.graveyard,e=new _r(t,[0]);return new Na(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffsett._clone(!0))),ya(this.position,t)}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t.nodes=this.nodes.toJSON(),t}static get className(){return"InsertOperation"}static fromJSON(t,e){const i=[];for(const e of t.nodes)e.name?i.push(br.fromJSON(e)):i.push(mr.fromJSON(e));const n=new Oa(_r.fromJSON(t.position,e),i,t.baseVersion);return n.shouldReceiveAttributes=t.shouldReceiveAttributes,n}}class Ra extends _a{constructor(t,e,i,n,o,s){super(s),this.name=t,this.oldRange=e?e.clone():null,this.newRange=i?i.clone():null,this.affectsData=o,this._markers=n}get type(){return"marker"}clone(){return new Ra(this.name,this.oldRange,this.newRange,this._markers,this.affectsData,this.baseVersion)}getReversed(){return new Ra(this.name,this.newRange,this.oldRange,this._markers,this.affectsData,this.baseVersion+1)}_execute(){const t=this.newRange?"_set":"_remove";this._markers[t](this.name,this.newRange,!0,this.affectsData)}toJSON(){const t=super.toJSON();return this.oldRange&&(t.oldRange=this.oldRange.toJSON()),this.newRange&&(t.newRange=this.newRange.toJSON()),delete t._markers,t}static get className(){return"MarkerOperation"}static fromJSON(t,e){return new Ra(t.name,t.oldRange?vr.fromJSON(t.oldRange,e):null,t.newRange?vr.fromJSON(t.newRange,e):null,e.model.markers,t.affectsData,t.baseVersion)}}class La extends _a{constructor(t,e,i,n){super(n),this.position=t,this.position.stickiness="toNext",this.oldName=e,this.newName=i}get type(){return"rename"}clone(){return new La(this.position.clone(),this.oldName,this.newName,this.baseVersion)}getReversed(){return new La(this.position.clone(),this.newName,this.oldName,this.baseVersion+1)}_validate(){const t=this.position.nodeAfter;if(!(t instanceof br))throw new hi.b("rename-operation-wrong-position: Given position is invalid or node after it is not an instance of Element.",this);if(t.name!==this.oldName)throw new hi.b("rename-operation-wrong-name: Element to change has different name than operation's old name.",this)}_execute(){this.position.nodeAfter.name=this.newName}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t}static get className(){return"RenameOperation"}static fromJSON(t,e){return new La(_r.fromJSON(t.position,e),t.oldName,t.newName,t.baseVersion)}}class Da extends _a{constructor(t,e,i,n,o){super(o),this.root=t,this.key=e,this.oldValue=i,this.newValue=n}get type(){return null===this.oldValue?"addRootAttribute":null===this.newValue?"removeRootAttribute":"changeRootAttribute"}clone(){return new Da(this.root,this.key,this.oldValue,this.newValue,this.baseVersion)}getReversed(){return new Da(this.root,this.key,this.newValue,this.oldValue,this.baseVersion+1)}_validate(){if(this.root!=this.root.root||this.root.is("documentFragment"))throw new hi.b("rootattribute-operation-not-a-root: The element to change is not a root element.",this,{root:this.root,key:this.key});if(null!==this.oldValue&&this.root.getAttribute(this.key)!==this.oldValue)throw new hi.b("rootattribute-operation-wrong-old-value: Changed node has different attribute value than operation's old attribute value.",this,{root:this.root,key:this.key});if(null===this.oldValue&&null!==this.newValue&&this.root.hasAttribute(this.key))throw new hi.b("rootattribute-operation-attribute-exists: The attribute with given key already exists.",this,{root:this.root,key:this.key})}_execute(){null!==this.newValue?this.root._setAttribute(this.key,this.newValue):this.root._removeAttribute(this.key)}toJSON(){const t=super.toJSON();return t.root=this.root.toJSON(),t}static get className(){return"RootAttributeOperation"}static fromJSON(t,e){if(!e.getRoot(t.root))throw new hi.b("rootattribute-operation-fromjson-no-root: Cannot create RootAttributeOperation. Root with specified name does not exist.",this,{rootName:t.root});return new Da(e.getRoot(t.root),t.key,t.oldValue,t.newValue,t.baseVersion)}}class za extends _a{constructor(t,e,i,n,o){super(o),this.sourcePosition=t.clone(),this.sourcePosition.stickiness="toPrevious",this.howMany=e,this.targetPosition=i.clone(),this.targetPosition.stickiness="toNext",this.graveyardPosition=n.clone()}get type(){return"merge"}get deletionPosition(){return new _r(this.sourcePosition.root,this.sourcePosition.path.slice(0,-1))}get movedRange(){const t=this.sourcePosition.getShiftedBy(Number.POSITIVE_INFINITY);return new vr(this.sourcePosition,t)}clone(){return new this.constructor(this.sourcePosition,this.howMany,this.targetPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.targetPosition._getTransformedByMergeOperation(this),e=this.sourcePosition.path.slice(0,-1),i=new _r(this.sourcePosition.root,e)._getTransformedByMergeOperation(this),n=new ja(t,this.howMany,this.graveyardPosition,this.baseVersion+1);return n.insertionPosition=i,n}_validate(){const t=this.sourcePosition.parent,e=this.targetPosition.parent;if(!t.parent)throw new hi.b("merge-operation-source-position-invalid: Merge source position is invalid.",this);if(!e.parent)throw new hi.b("merge-operation-target-position-invalid: Merge target position is invalid.",this);if(this.howMany!=t.maxOffset)throw new hi.b("merge-operation-how-many-invalid: Merge operation specifies wrong number of nodes to move.",this)}_execute(){const t=this.sourcePosition.parent;Aa(vr._createIn(t),this.targetPosition),Aa(vr._createOn(t),this.graveyardPosition)}toJSON(){const t=super.toJSON();return t.sourcePosition=t.sourcePosition.toJSON(),t.targetPosition=t.targetPosition.toJSON(),t.graveyardPosition=t.graveyardPosition.toJSON(),t}static get className(){return"MergeOperation"}static fromJSON(t,e){const i=_r.fromJSON(t.sourcePosition,e),n=_r.fromJSON(t.targetPosition,e),o=_r.fromJSON(t.graveyardPosition,e);return new this(i,t.howMany,n,o,t.baseVersion)}}class ja extends _a{constructor(t,e,i,n){super(n),this.splitPosition=t.clone(),this.splitPosition.stickiness="toNext",this.howMany=e,this.insertionPosition=ja.getInsertionPosition(t),this.insertionPosition.stickiness="toNone",this.graveyardPosition=i?i.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();return t.push(0),new _r(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new vr(this.splitPosition,t)}clone(){const t=new this.constructor(this.splitPosition,this.howMany,this.graveyardPosition,this.baseVersion);return t.insertionPosition=this.insertionPosition,t}getReversed(){const t=this.splitPosition.root.document.graveyard,e=new _r(t,[0]);return new za(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent,e=this.splitPosition.offset;if(!t||t.maxOffset{for(const e of t.getAttributeKeys())this.removeAttribute(e,t)};if(t instanceof vr)for(const i of t.getItems())e(i);else e(t)}move(t,e,i){if(this._assertWriterUsedCorrectly(),!(t instanceof vr))throw new hi.b("writer-move-invalid-range: Invalid range to move.",this);if(!t.isFlat)throw new hi.b("writer-move-range-not-flat: Range to move is not flat.",this);const n=_r._createAt(e,i);if(n.isEqual(t.start))return;if(this._addOperationForAffectedMarkers("move",t),!qa(t.root,n.root))throw new hi.b("writer-move-different-document: Range is going to be moved between different documents.",this);const o=t.root.document?t.root.document.version:null,s=new Na(t.start,t.end.offset-t.start.offset,n,o);this.batch.addOperation(s),this.model.applyOperation(s)}remove(t){this._assertWriterUsedCorrectly();const e=(t instanceof vr?t:vr._createOn(t)).getMinimalFlatRanges().reverse();for(const t of e)this._addOperationForAffectedMarkers("move",t),Wa(t.start,t.end.offset-t.start.offset,this.batch,this.model)}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore,i=t.nodeAfter;if(this._addOperationForAffectedMarkers("merge",t),!(e instanceof br))throw new hi.b("writer-merge-no-element-before: Node before merge position must be an element.",this);if(!(i instanceof br))throw new hi.b("writer-merge-no-element-after: Node after merge position must be an element.",this);t.root.document?this._merge(t):this._mergeDetached(t)}createPositionFromPath(t,e,i){return this.model.createPositionFromPath(t,e,i)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(t,e,i){return this.model.createSelection(t,e,i)}_mergeDetached(t){const e=t.nodeBefore,i=t.nodeAfter;this.move(vr._createIn(i),_r._createAt(e,"end")),this.remove(i)}_merge(t){const e=_r._createAt(t.nodeBefore,"end"),i=_r._createAt(t.nodeAfter,0),n=t.root.document.graveyard,o=new _r(n,[0]),s=t.root.document.version,r=new za(i,t.nodeAfter.maxOffset,e,o,s);this.batch.addOperation(r),this.model.applyOperation(r)}rename(t,e){if(this._assertWriterUsedCorrectly(),!(t instanceof br))throw new hi.b("writer-rename-not-element-instance: Trying to rename an object which is not an instance of Element.",this);const i=t.root.document?t.root.document.version:null,n=new La(_r._createBefore(t),t.name,e,i);this.batch.addOperation(n),this.model.applyOperation(n)}split(t,e){this._assertWriterUsedCorrectly();let i,n,o=t.parent;if(!o.parent)throw new hi.b("writer-split-element-no-parent: Element with no parent can not be split.",this);if(e||(e=o.parent),!t.parent.getAncestors({includeSelf:!0}).includes(e))throw new hi.b("writer-split-invalid-limit-element: Limit element is not a position ancestor.",this);do{const e=o.root.document?o.root.document.version:null,s=o.maxOffset-t.offset,r=new ja(t,s,null,e);this.batch.addOperation(r),this.model.applyOperation(r),i||n||(i=o,n=t.parent.nextSibling),o=(t=this.createPositionAfter(t.parent)).parent}while(o!==e);return{position:t,range:new vr(_r._createAt(i,"end"),_r._createAt(n,0))}}wrap(t,e){if(this._assertWriterUsedCorrectly(),!t.isFlat)throw new hi.b("writer-wrap-range-not-flat: Range to wrap is not flat.",this);const i=e instanceof br?e:new br(e);if(i.childCount>0)throw new hi.b("writer-wrap-element-not-empty: Element to wrap with is not empty.",this);if(null!==i.parent)throw new hi.b("writer-wrap-element-attached: Element to wrap with is already attached to tree model.",this);this.insert(i,t.start);const n=new vr(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(n,_r._createAt(i,0))}unwrap(t){if(this._assertWriterUsedCorrectly(),null===t.parent)throw new hi.b("writer-unwrap-element-no-parent: Trying to unwrap an element which has no parent.",this);this.move(vr._createIn(t),this.createPositionAfter(t)),this.remove(t)}addMarker(t,e){if(this._assertWriterUsedCorrectly(),!e||"boolean"!=typeof e.usingOperation)throw new hi.b("writer-addMarker-no-usingOperation: The options.usingOperation parameter is required when adding a new marker.",this);const i=e.usingOperation,n=e.range,o=void 0!==e.affectsData&&e.affectsData;if(this.model.markers.has(t))throw new hi.b("writer-addMarker-marker-exists: Marker with provided name already exists.",this);if(!n)throw new hi.b("writer-addMarker-no-range: Range parameter is required when adding a new marker.",this);return i?(Ua(this,t,null,n,o),this.model.markers.get(t)):this.model.markers._set(t,n,i,o)}updateMarker(t,e){this._assertWriterUsedCorrectly();const i="string"==typeof t?t:t.name,n=this.model.markers.get(i);if(!n)throw new hi.b("writer-updateMarker-marker-not-exists: Marker with provided name does not exists.",this);if(!e)return void this.model.markers._refresh(n);const o="boolean"==typeof e.usingOperation,s="boolean"==typeof e.affectsData,r=s?e.affectsData:n.affectsData;if(!o&&!e.range&&!s)throw new hi.b("writer-updateMarker-wrong-options: One of the options is required - provide range, usingOperations or affectsData.",this);const a=n.getRange(),c=e.range?e.range:a;o&&e.usingOperation!==n.managedUsingOperations?e.usingOperation?Ua(this,i,null,c,r):(Ua(this,i,a,null,r),this.model.markers._set(i,c,void 0,r)):n.managedUsingOperations?Ua(this,i,a,c,r):this.model.markers._set(i,c,void 0,r)}removeMarker(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?t:t.name;if(!this.model.markers.has(e))throw new hi.b("writer-removeMarker-no-marker: Trying to remove marker which does not exist.",this);const i=this.model.markers.get(e);i.managedUsingOperations?Ua(this,e,i.getRange(),null,i.affectsData):this.model.markers._remove(e)}setSelection(t,e,i){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(t,e,i)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._setSelectionAttribute(t,e);else for(const[e,i]of Li(t))this._setSelectionAttribute(e,i)}removeSelectionAttribute(t){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._removeSelectionAttribute(t);else for(const e of t)this._removeSelectionAttribute(e)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const i=this.model.document.selection;if(i.isCollapsed&&i.anchor.parent.isEmpty){const n=Lr._getStoreAttributeKey(t);this.setAttribute(n,e,i.anchor.parent)}i._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const i=Lr._getStoreAttributeKey(t);this.removeAttribute(i,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new hi.b("writer-incorrect-use: Trying to use a writer outside the change() block.",this)}_addOperationForAffectedMarkers(t,e){for(const i of this.model.markers){if(!i.managedUsingOperations)continue;const n=i.getRange();let o=!1;if("move"==t)o=e.containsPosition(n.start)||e.start.isEqual(n.start)||e.containsPosition(n.end)||e.end.isEqual(n.end);else{const t=e.nodeBefore,i=e.nodeAfter,s=n.start.parent==t&&n.start.isAtEnd,r=n.end.parent==i&&0==n.end.offset,a=n.end.nodeAfter==i,c=n.start.nodeAfter==i;o=s||r||a||c}o&&this.updateMarker(i.name,{range:n})}}}function Fa(t,e,i,n){const o=t.model,s=o.document;let r,a,c,l=n.start;for(const t of n.getWalker({shallow:!0}))c=t.item.getAttribute(e),r&&a!=c&&(a!=i&&d(),l=r),r=t.nextPosition,a=c;function d(){const n=new vr(l,r),c=n.root.document?s.version:null,d=new Ma(n,e,a,i,c);t.batch.addOperation(d),o.applyOperation(d)}r instanceof _r&&r!=l&&a!=i&&d()}function Ha(t,e,i,n){const o=t.model,s=o.document,r=n.getAttribute(e);let a,c;if(r!=i){if(n.root===n){const t=n.document?s.version:null;c=new Da(n,e,r,i,t)}else{a=new vr(_r._createBefore(n),t.createPositionAfter(n));const o=a.root.document?s.version:null;c=new Ma(a,e,r,i,o)}t.batch.addOperation(c),o.applyOperation(c)}}function Ua(t,e,i,n,o){const s=t.model,r=s.document,a=new Ra(e,i,n,s.markers,o,r.version);t.batch.addOperation(a),s.applyOperation(a)}function Wa(t,e,i,n){let o;if(t.root.document){const i=n.document,s=new _r(i.graveyard,[0]);o=new Na(t,e,s,i.version)}else o=new Ia(t,e);i.addOperation(o),n.applyOperation(o)}function qa(t,e){return t===e||t instanceof Va&&e instanceof Va}class $a{constructor(t){this._markerCollection=t,this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size}refreshItem(t){if(this._isInInsertedElement(t.parent))return;this._markRemove(t.parent,t.startOffset,t.offsetSize),this._markInsert(t.parent,t.startOffset,t.offsetSize);const e=vr._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}this._cachedChanges=null}bufferOperation(t){switch(t.type){case"insert":if(this._isInInsertedElement(t.position.parent))return;this._markInsert(t.position.parent,t.position.offset,t.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const e of t.range.getItems({shallow:!0}))this._isInInsertedElement(e.parent)||this._markAttribute(e);break;case"remove":case"move":case"reinsert":{if(t.sourcePosition.isEqual(t.targetPosition)||t.sourcePosition.getShiftedBy(t.howMany).isEqual(t.targetPosition))return;const e=this._isInInsertedElement(t.sourcePosition.parent),i=this._isInInsertedElement(t.targetPosition.parent);e||this._markRemove(t.sourcePosition.parent,t.sourcePosition.offset,t.howMany),i||this._markInsert(t.targetPosition.parent,t.getMovedRangeStart().offset,t.howMany);break}case"rename":{if(this._isInInsertedElement(t.position.parent))return;this._markRemove(t.position.parent,t.position.offset,1),this._markInsert(t.position.parent,t.position.offset,1);const e=vr._createFromPositionAndShift(t.position,1);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getRange();this.bufferMarkerChange(t.name,e,e,t.affectsData)}break}case"split":{const e=t.splitPosition.parent;this._isInInsertedElement(e)||this._markRemove(e,t.splitPosition.offset,t.howMany),this._isInInsertedElement(t.insertionPosition.parent)||this._markInsert(t.insertionPosition.parent,t.insertionPosition.offset,1),t.graveyardPosition&&this._markRemove(t.graveyardPosition.parent,t.graveyardPosition.offset,1);break}case"merge":{const e=t.sourcePosition.parent;this._isInInsertedElement(e.parent)||this._markRemove(e.parent,e.startOffset,1);const i=t.graveyardPosition.parent;this._markInsert(i,t.graveyardPosition.offset,1);const n=t.targetPosition.parent;this._isInInsertedElement(n)||this._markInsert(n,t.targetPosition.offset,e.maxOffset);break}}this._cachedChanges=null}bufferMarkerChange(t,e,i,n){const o=this._changedMarkers.get(t);o?(o.newRange=i,o.affectsData=n,null==o.oldRange&&null==o.newRange&&this._changedMarkers.delete(t)):this._changedMarkers.set(t,{oldRange:e,newRange:i,affectsData:n})}getMarkersToRemove(){const t=[];for(const[e,i]of this._changedMarkers)null!=i.oldRange&&t.push({name:e,range:i.oldRange});return t}getMarkersToAdd(){const t=[];for(const[e,i]of this._changedMarkers)null!=i.newRange&&t.push({name:e,range:i.newRange});return t}getChangedMarkers(){return Array.from(this._changedMarkers).map(t=>({name:t[0],data:{oldRange:t[1].oldRange,newRange:t[1].newRange}}))}hasDataChanges(){for(const[,t]of this._changedMarkers)if(t.affectsData)return!0;return this._changesInElement.size>0}getChanges(t={includeChangesInGraveyard:!1}){if(this._cachedChanges)return t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();const e=[];for(const t of this._changesInElement.keys()){const i=this._changesInElement.get(t).sort((t,e)=>t.offset===e.offset?t.type!=e.type?"remove"==t.type?-1:1:0:t.offsett.position.root!=e.position.root?t.position.root.rootNamei.offset){if(n>o){const t={type:"attribute",offset:o,howMany:n-o,count:this._changeCount++};this._handleChange(t,e),e.push(t)}t.nodesToHandle=i.offset-t.offset,t.howMany=t.nodesToHandle}else t.offset>=i.offset&&t.offseto?(t.nodesToHandle=n-o,t.offset=o):t.nodesToHandle=0);if("remove"==i.type&&t.offseti.offset){const o={type:"attribute",offset:i.offset,howMany:n-i.offset,count:this._changeCount++};this._handleChange(o,e),e.push(o),t.nodesToHandle=i.offset-t.offset,t.howMany=t.nodesToHandle}"attribute"==i.type&&(t.offset>=i.offset&&n<=o?(t.nodesToHandle=0,t.howMany=0,t.offset=0):t.offset<=i.offset&&n>=o&&(i.howMany=0))}}t.howMany=t.nodesToHandle,delete t.nodesToHandle}_getInsertDiff(t,e,i){return{type:"insert",position:_r._createAt(t,e),name:i,length:1,changeCount:this._changeCount++}}_getRemoveDiff(t,e,i){return{type:"remove",position:_r._createAt(t,e),name:i,length:1,changeCount:this._changeCount++}}_getAttributesDiff(t,e,i){const n=[];i=new Map(i);for(const[o,s]of e){const e=i.has(o)?i.get(o):null;e!==s&&n.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:o,attributeOldValue:s,attributeNewValue:e,changeCount:this._changeCount++}),i.delete(o)}for(const[e,o]of i)n.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:o,changeCount:this._changeCount++});return n}_isInInsertedElement(t){const e=t.parent;if(!e)return!1;const i=this._changesInElement.get(e),n=t.startOffset;if(i)for(const t of i)if("insert"==t.type&&n>=t.offset&&nn){for(let e=0;e{const i=e[0];if(i.isDocumentOperation&&i.baseVersion!==this.version)throw new hi.b("model-document-applyOperation-wrong-version: Only operations with matching versions can be applied.",this,{operation:i})},{priority:"highest"}),this.listenTo(t,"applyOperation",(t,e)=>{const i=e[0];i.isDocumentOperation&&this.differ.bufferOperation(i)},{priority:"high"}),this.listenTo(t,"applyOperation",(t,e)=>{const i=e[0];i.isDocumentOperation&&(this.version++,this.history.addOperation(i))},{priority:"low"}),this.listenTo(this.selection,"change",()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0}),this.listenTo(t.markers,"update",(t,e,i,n)=>{this.differ.bufferMarkerChange(e.name,i,n,e.affectsData),null===i&&e.on("change",(t,i)=>{this.differ.bufferMarkerChange(e.name,i,e.getRange(),e.affectsData)})})}get graveyard(){return this.getRoot("$graveyard")}createRoot(t="$root",e="main"){if(this.roots.get(e))throw new hi.b("model-document-createRoot-name-exists: Root with specified name already exists.",this,{name:e});const i=new Va(this,t,e);return this.roots.add(i),i}destroy(){this.selection.destroy(),this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(){return Array.from(this.roots,t=>t.rootName).filter(t=>"$graveyard"!=t)}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=Mi(this);return t.selection="[engine.model.DocumentSelection]",t.model="[engine.model.Model]",t}_handleChangeBlock(t){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(t),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",t.batch):this.fire("change",t.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){for(const t of this.roots)if(t!==this.graveyard)return t;return this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot(),e=this.model,i=e.schema,n=e.createPositionFromPath(t,[0]);return i.getNearestSelectionRange(n)||e.createRange(n)}_validateSelectionRange(t){return tc(t.start)&&tc(t.end)}_callPostFixers(t){let e=!1;do{for(const i of this._postFixers)if(this.selection.refresh(),e=i(t),e)break}while(e)}}function tc(t){const e=t.textNode;if(e){const i=e.data,n=t.offset-e.startOffset;return!Ja(i,n)&&!Za(i,n)}return!0}vi(Xa,mi);class ec{constructor(){this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){return this._markers.has(t)}get(t){return this._markers.get(t)||null}_set(t,e,i=!1,n=!1){const o=t instanceof ic?t.name:t,s=this._markers.get(o);if(s){const t=s.getRange();let r=!1;return t.isEqual(e)||(s._attachLiveRange(Nr.fromRange(e)),r=!0),i!=s.managedUsingOperations&&(s._managedUsingOperations=i,r=!0),"boolean"==typeof n&&n!=s.affectsData&&(s._affectsData=n,r=!0),r&&this.fire("update:"+o,s,t,e),s}const r=Nr.fromRange(e),a=new ic(o,r,i,n);return this._markers.set(o,a),this.fire("update:"+o,a,null,e),a}_remove(t){const e=t instanceof ic?t.name:t,i=this._markers.get(e);return!!i&&(this._markers.delete(e),this.fire("update:"+e,i,i.getRange(),null),this._destroyMarker(i),!0)}_refresh(t){const e=t instanceof ic?t.name:t,i=this._markers.get(e);if(!i)throw new hi.b("markercollection-refresh-marker-not-exists: Marker with provided name does not exists.",this);const n=i.getRange();this.fire("update:"+e,i,n,n,i.managedUsingOperations,i.affectsData)}*getMarkersAtPosition(t){for(const e of this)e.getRange().containsPosition(t)&&(yield e)}*getMarkersIntersectingRange(t){for(const e of this)null!==e.getRange().getIntersection(t)&&(yield e)}destroy(){for(const t of this._markers.values())this._destroyMarker(t);this._markers=null,this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values())e.name.startsWith(t+":")&&(yield e)}_destroyMarker(t){t.stopListening(),t._detachLiveRange()}}vi(ec,mi);class ic{constructor(t,e,i,n){this.name=t,this._liveRange=this._attachLiveRange(e),this._managedUsingOperations=i,this._affectsData=n}get managedUsingOperations(){if(!this._liveRange)throw new hi.b("marker-destroyed: Cannot use a destroyed marker instance.",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new hi.b("marker-destroyed: Cannot use a destroyed marker instance.",this);return this._affectsData}getStart(){if(!this._liveRange)throw new hi.b("marker-destroyed: Cannot use a destroyed marker instance.",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new hi.b("marker-destroyed: Cannot use a destroyed marker instance.",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new hi.b("marker-destroyed: Cannot use a destroyed marker instance.",this);return this._liveRange.toRange()}is(t){return"marker"==t||"model:marker"==t}_attachLiveRange(t){return this._liveRange&&this._detachLiveRange(),t.delegate("change:range").to(this),t.delegate("change:content").to(this),this._liveRange=t,t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}vi(ic,mi);class nc extends _a{get type(){return"noop"}clone(){return new nc(this.baseVersion)}getReversed(){return new nc(this.baseVersion+1)}_execute(){}static get className(){return"NoOperation"}}const oc={};oc[Ma.className]=Ma,oc[Oa.className]=Oa,oc[Ra.className]=Ra,oc[Na.className]=Na,oc[nc.className]=nc,oc[_a.className]=_a,oc[La.className]=La,oc[Da.className]=Da,oc[ja.className]=ja,oc[za.className]=za;class sc extends _r{constructor(t,e,i="toNone"){if(super(t,e,i),!this.root.is("rootElement"))throw new hi.b("model-liveposition-root-not-rootelement: LivePosition's root has to be an instance of RootElement.",t);rc.call(this)}detach(){this.stopListening()}is(t){return"livePosition"==t||"model:livePosition"==t||super.is(t)}toPosition(){return new _r(this.root,this.path.slice(),this.stickiness)}static fromPosition(t,e){return new this(t.root,t.path.slice(),e||t.stickiness)}}function rc(){this.listenTo(this.root.document.model,"applyOperation",(t,e)=>{const i=e[0];i.isDocumentOperation&&ac.call(this,i)},{priority:"low"})}function ac(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path,this.root=e.root,this.fire("change",t)}}vi(sc,mi);class cc{constructor(t,e,i){this.model=t,this.writer=e,this.position=i,this.canMergeWith=new Set([this.position.parent]),this.schema=t.schema,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null}handleNodes(t,e){t=Array.from(t);for(let i=0;i{if(!i.doNotResetEntireContent&&function(t,e){const i=t.getLimitElement(e);if(!e.containsEntireContent(i))return!1;const n=e.getFirstRange();if(n.start.parent==n.end.parent)return!1;return t.checkChild(i,"paragraph")}(o,e))return void function(t,e){const i=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(i)),dc(t,t.createPositionAt(i,0),e)}(t,e);const s=n.start,r=sc.fromPosition(n.end,"toNext");if(n.start.isTouching(n.end)||t.remove(n),i.leaveUnmerged||(!function t(e,i,n){const o=i.parent,s=n.parent;if(o==s)return;if(e.model.schema.isLimit(o)||e.model.schema.isLimit(s))return;if(!function(t,e,i){const n=new vr(t,e);for(const t of n.getWalker())if(i.isLimit(t.item))return!1;return!0}(i,n,e.model.schema))return;i=e.createPositionAfter(o),(n=e.createPositionBefore(s)).isEqual(i)||e.insert(s,i);e.merge(i);for(;n.parent.isEmpty;){const t=n.parent;n=e.createPositionBefore(t),e.remove(t)}t(e,i,n)}(t,s,r),o.removeDisallowedAttributes(s.parent.getChildren(),t)),hc(t,e,s),function(t,e){const i=t.checkChild(e,"$text"),n=t.checkChild(e,"paragraph");return!i&&n}(o,s)){const n=o.getNearestSelectionRange(s);i.doNotAutoparagraph&&n?hc(t,e,n):dc(t,s,e)}r.detach()})}function dc(t,e,i){const n=t.createElement("paragraph");t.insert(n,e),hc(t,i,t.createPositionAt(n,0))}function hc(t,e,i){e instanceof Lr?t.setSelection(i):e.setTo(i)}function uc(t,e){if("text"==e.type)return"word"===t.unit?function(t,e){let i=t.position.textNode;if(i){let n=t.position.offset-i.startOffset;for(;!mc(i.data,n,e)&&!gc(i,n,e);){t.next();const o=e?t.position.nodeAfter:t.position.nodeBefore;if(o&&o.is("text")){const n=o.data.charAt(e?0:o.data.length-1);' ,.?!:;"-()'.includes(n)||(t.next(),i=t.position.textNode)}n=t.position.offset-i.startOffset}}return t.position}(t.walker,t.isForward):function(t,e){const i=t.position.textNode;if(i){const n=i.data;let o=t.position.offset-i.startOffset;for(;Ja(n,o)||"character"==e&&Za(n,o);)t.next(),o=t.position.offset-i.startOffset}return t.position}(t.walker,t.unit,t.isForward);if(e.type==(t.isForward?"elementStart":"elementEnd")){if(t.schema.isObject(e.item))return _r._createAt(e.item,t.isForward?"after":"before");if(t.schema.checkChild(e.nextPosition,"$text"))return e.nextPosition}else{if(t.schema.isLimit(e.item))return void t.walker.skip(()=>!0);if(t.schema.checkChild(e.nextPosition,"$text"))return e.nextPosition}}function fc(t,e){const i=t.root,n=_r._createAt(i,e?"end":0);return e?new vr(t,n):new vr(n,t)}function mc(t,e,i){const n=e+(i?0:-1);return' ,.?!:;"-()'.includes(t.charAt(n))}function gc(t,e,i){return e===(i?t.endOffset:0)}function pc(t,e){const i=[];Array.from(t.getItems({direction:"backward"})).map(t=>e.createRangeOn(t)).filter(e=>(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end))).forEach(t=>{i.push(t.start.parent),e.remove(t)}),i.forEach(t=>{let i=t;for(;i.parent&&i.isEmpty;){const t=e.createRangeOn(i);i=i.parent,e.remove(t)}})}function bc(t){t.document.registerPostFixer(e=>function(t,e){const i=e.document.selection,n=e.schema,o=[];let s=!1;for(const t of i.getRanges()){const e=wc(t,n);e?(o.push(e),s=!0):o.push(t)}s&&t.setSelection(function(t){const e=[];e.push(t.shift());for(const i of t){const t=e.pop();if(i.isIntersecting(t)){const n=t.start.isAfter(i.start)?i.start:t.start,o=t.end.isAfter(i.end)?t.end:i.end,s=new vr(n,o);e.push(s)}else e.push(t),e.push(i)}return e}(o),{backward:i.isBackward})}(e,t))}function wc(t,e){return t.isCollapsed?function(t,e){const i=t.start,n=e.getNearestSelectionRange(i);if(!n)return null;if(!n.isCollapsed)return n;const o=n.start;if(i.isEqual(o))return null;return new vr(o)}(t,e):function(t,e){const i=t.start,n=t.end,o=e.checkChild(i,"$text"),s=e.checkChild(n,"$text"),r=e.getLimitElement(i),a=e.getLimitElement(n);if(r===a){if(o&&s)return null;if(function(t,e,i){const n=t.nodeAfter&&!i.isLimit(t.nodeAfter)||i.checkChild(t,"$text"),o=e.nodeBefore&&!i.isLimit(e.nodeBefore)||i.checkChild(e,"$text");return n||o}(i,n,e)){const t=i.nodeAfter&&e.isObject(i.nodeAfter)?null:e.getNearestSelectionRange(i,"forward"),o=n.nodeBefore&&e.isObject(n.nodeBefore)?null:e.getNearestSelectionRange(n,"backward"),s=t?t.start:i,r=o?o.start:n;return new vr(s,r)}}const c=r&&!r.is("rootElement"),l=a&&!a.is("rootElement");if(c||l){const t=i.nodeAfter&&n.nodeBefore&&i.nodeAfter.parent===n.nodeBefore.parent,o=c&&(!t||!_c(i.nodeAfter,e)),s=l&&(!t||!_c(n.nodeBefore,e));let d=i,h=n;return o&&(d=_r._createBefore(kc(r,e))),s&&(h=_r._createAfter(kc(a,e))),new vr(d,h)}return null}(t,e)}function kc(t,e){let i=t,n=i;for(;e.isLimit(n)&&n.parent;)i=n,n=n.parent;return i}function _c(t,e){return t&&e.isObject(t)}class vc{constructor(){this.markers=new ec,this.document=new Xa(this),this.schema=new ea,this._pendingChanges=[],this._currentWriter=null,["insertContent","deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach(t=>this.decorate(t)),this.on("applyOperation",(t,e)=>{e[0]._validate()},{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$block",{allowIn:"$root",isBlock:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",isLimit:!0}),this.schema.extend("$text",{allowIn:"$clipboardHolder"}),this.schema.register("$marker"),this.schema.addChildCheck((t,e)=>{if("$marker"===e.name)return!0}),bc(this)}change(t){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new ka,callback:t}),this._runPendingChanges()[0]):t(this._currentWriter)}catch(t){hi.b.rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{"string"==typeof t?t=new ka(t):"function"==typeof t&&(e=t,t=new ka),this._pendingChanges.push({batch:t,callback:e}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(t){hi.b.rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,i){return function(t,e,i,n){return t.change(o=>{let s;s=i?i instanceof Pr||i instanceof Lr?i:o.createSelection(i,n):t.document.selection;const r=s.getFirstPosition();s.isCollapsed||t.deleteContent(s,{doNotAutoparagraph:!0});const a=new cc(t,o,r);let c;c=e.is("documentFragment")?e.getChildren():[e],a.handleNodes(c,{isFirst:!0,isLast:!0});const l=a.getSelectionRange();l&&(s instanceof Lr?o.setSelection(l):s.setTo(l));const d=a.getAffectedRange()||t.createRange(r);return a.destroy(),d})}(this,t,e,i)}deleteContent(t,e){lc(this,t,e)}modifySelection(t,e){!function(t,e,i={}){const n=t.schema,o="backward"!=i.direction,s=i.unit?i.unit:"character",r=e.focus,a=new wr({boundaries:fc(r,o),singleCharacters:!0,direction:o?"forward":"backward"}),c={walker:a,schema:n,isForward:o,unit:s};let l;for(;l=a.next();){if(l.done)return;const i=uc(c,l.value);if(i)return void(e instanceof Lr?t.change(t=>{t.setSelectionFocus(i)}):e.setFocus(i))}}(this,t,e)}getSelectedContent(t){return function(t,e){return t.change(t=>{const i=t.createDocumentFragment(),n=e.getFirstRange();if(!n||n.isCollapsed)return i;const o=n.start.root,s=n.start.getCommonPath(n.end),r=o.getNodeByPath(s);let a;a=n.start.parent==n.end.parent?n:t.createRange(t.createPositionAt(r,n.start.path[s.length]),t.createPositionAt(r,n.end.path[s.length]+1));const c=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:!0}))e.is("textProxy")?t.appendText(e.data,e.getAttributes(),i):t.append(e._clone(!0),i);if(a!=n){const e=n._getTransformedByMove(a.start,t.createPositionAt(i,0),c)[0],o=t.createRange(t.createPositionAt(i,0),e.start);pc(t.createRange(e.end,t.createPositionAt(i,"end")),t),pc(o,t)}return i})}(this,t)}hasContent(t,e){const i=t instanceof br?vr._createIn(t):t;if(i.isCollapsed)return!1;for(const t of this.markers.getMarkersIntersectingRange(i))if(t.affectsData)return!0;const{ignoreWhitespaces:n=!1}=e||{};for(const t of i.getItems())if(t.is("textProxy")){if(!n)return!0;if(-1!==t.data.search(/\S/))return!0}else if(this.schema.isObject(t))return!0;return!1}createPositionFromPath(t,e,i){return new _r(t,e,i)}createPositionAt(t,e){return _r._createAt(t,e)}createPositionAfter(t){return _r._createAfter(t)}createPositionBefore(t){return _r._createBefore(t)}createRange(t,e){return new vr(t,e)}createRangeIn(t){return vr._createIn(t)}createRangeOn(t){return vr._createOn(t)}createSelection(t,e,i){return new Pr(t,e,i)}createBatch(t){return new ka(t)}createOperationFromJSON(t){return class{static fromJSON(t,e){return oc[t.__className].fromJSON(t,e)}}.fromJSON(t,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const t=[];for(this.fire("_beforeChanges");this._pendingChanges.length;){const e=this._pendingChanges[0].batch;this._currentWriter=new Ba(this,e);const i=this._pendingChanges[0].callback(this._currentWriter);t.push(i),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}return this.fire("_afterChanges"),t}}vi(vc,Hn);class yc{constructor(){this._listener=Object.create(ls)}listenTo(t){this._listener.listenTo(t,"keydown",(t,e)=>{this._listener.fire("_keydown:"+bo(e),e)})}set(t,e,i={}){const n=wo(t),o=i.priority;this._listener.listenTo(this._listener,"_keydown:"+n,(t,i)=>{e(i,()=>{i.preventDefault(),i.stopPropagation(),t.stop()}),t.return=!0},{priority:o})}press(t){return!!this._listener.fire("_keydown:"+bo(t),t)}destroy(){this._listener.stopListening()}}class xc extends yc{constructor(t){super(),this.editor=t}set(t,e,i={}){if("string"==typeof e){const t=e;e=(e,i)=>{this.editor.execute(t),i()}}super.set(t,e,i)}}class Ac{constructor(t={}){this._context=t.context||new Si({language:t.language}),this._context._addEditor(this,!t.context);const e=Array.from(this.constructor.builtinPlugins||[]);this.config=new ni(t,this.constructor.defaultConfig),this.config.define("plugins",e),this.config.define(this._context._getEditorConfig()),this.plugins=new xi(this,e,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this.commands=new Zr,this.set("state","initializing"),this.once("ready",()=>this.state="ready",{priority:"high"}),this.once("destroy",()=>this.state="destroyed",{priority:"high"}),this.set("isReadOnly",!1),this.model=new vc,this.data=new ga(this.model),this.editing=new Jr(this.model),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new pa([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new xc(this),this.keystrokes.listenTo(this.editing.view.document)}initPlugins(){const t=this.config,e=t.get("plugins"),i=t.get("removePlugins")||[],n=t.get("extraPlugins")||[];return this.plugins.init(e.concat(n),i)}destroy(){let t=Promise.resolve();return"initializing"==this.state&&(t=new Promise(t=>this.once("ready",t))),t.then(()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()}).then(()=>this.plugins.destroy()).then(()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()}).then(()=>this._context._removeEditor(this))}execute(...t){try{this.commands.execute(...t)}catch(t){hi.b.rethrowUnexpectedError(t,this)}}}vi(Ac,Hn);var Cc={setData(t){this.data.set(t)},getData(t){return this.data.get(t)}};var Tc={updateSourceElement(){if(!this.sourceElement)throw new hi.b("editor-missing-sourceelement: Cannot update the source element of a detached editor.",this);var t,e;t=this.sourceElement,e=this.data.get(),t instanceof HTMLTextAreaElement&&(t.value=e),t.innerHTML=e}};class Pc{getHtml(t){const e=document.implementation.createHTMLDocument("").createElement("div");return e.appendChild(t),e.innerHTML}}class Sc{constructor(){this._domParser=new DOMParser,this._domConverter=new os({blockFillerMode:"nbsp"}),this._htmlWriter=new Pc}toData(t){const e=this._domConverter.viewToDom(t,document);return this._htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this._domConverter.domToView(e)}_toDom(t){const e=this._domParser.parseFromString(t,"text/html"),i=e.createDocumentFragment(),n=e.body.childNodes;for(;n.length>0;)i.appendChild(n[0]);return i}}class Ec{constructor(t){this.editor=t,this._components=new Map}*names(){for(const t of this._components.values())yield t.originalName}add(t,e){if(this.has(t))throw new hi.b("componentfactory-item-exists: The item already exists in the component factory.",this,{name:t});this._components.set(Mc(t),{callback:e,originalName:t})}create(t){if(!this.has(t))throw new hi.b("componentfactory-item-missing: The required component is not registered in the factory.",this,{name:t});return this._components.get(Mc(t)).callback(this.editor.locale)}has(t){return this._components.has(Mc(t))}}function Mc(t){return String(t).toLowerCase()}class Ic{constructor(){this.set("isFocused",!1),this.set("focusedElement",null),this._elements=new Set,this._nextEventLoopTimeout=null}add(t){if(this._elements.has(t))throw new hi.b("focusTracker-add-element-already-exist",this);this.listenTo(t,"focus",()=>this._focus(t),{useCapture:!0}),this.listenTo(t,"blur",()=>this._blur(),{useCapture:!0}),this._elements.add(t)}remove(t){t===this.focusedElement&&this._blur(t),this._elements.has(t)&&(this.stopListening(t),this._elements.delete(t))}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=t,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout(()=>{this.focusedElement=null,this.isFocused=!1},0)}}vi(Ic,ls),vi(Ic,Hn);class Nc{constructor(t){this.editor=t,this.componentFactory=new Ec(t),this.focusTracker=new Ic,this._editableElementsMap=new Map,this.listenTo(t.editing.view.document,"layoutChanged",()=>this.update())}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy();for(const t of this._editableElementsMap.values())t.ckeditorInstance=null;this._editableElementsMap=new Map}setEditableElement(t,e){this._editableElementsMap.set(t,e),e.ckeditorInstance||(e.ckeditorInstance=this.editor)}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}}vi(Nc,mi);i(14);const Oc=new WeakMap;function Rc(t){const{view:e,element:i,text:n,isDirectHost:o=!0}=t,s=e.document;Oc.has(s)||(Oc.set(s,new Map),s.registerPostFixer(t=>Dc(s,t))),Oc.get(s).set(i,{text:n,isDirectHost:o}),e.change(t=>Dc(s,t))}function Lc(t,e){return!!e.hasClass("ck-placeholder")&&(t.removeClass("ck-placeholder",e),!0)}function Dc(t,e){const i=Oc.get(t);let n=!1;for(const[t,o]of i)zc(e,t,o)&&(n=!0);return n}function zc(t,e,i){const{text:n,isDirectHost:o}=i,s=o?e:function(t){if(1===t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement"))return e}return null}(e);let r=!1;return!!s&&(i.hostElement=s,s.getAttribute("data-placeholder")!==n&&(t.setAttribute("data-placeholder",n,s),r=!0),!function(t){const e=t.document;if(!e)return!1;const i=!Array.from(t.getChildren()).some(t=>!t.is("uiElement"));if(!e.isFocused&&i)return!0;const n=e.selection.anchor;return!(!i||!n||n.parent===t)}(s)?Lc(t,s)&&(r=!0):function(t,e){return!e.hasClass("ck-placeholder")&&(t.addClass("ck-placeholder",e),!0)}(t,s)&&(r=!0),r)}class jc{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e}),t.style.display="none",e&&t.parentNode.insertBefore(e,t.nextSibling)}restore(){this._replacedElements.forEach(({element:t,newElement:e})=>{t.style.display="",e&&e.remove()}),this._replacedElements=[]}}class Vc extends Nc{constructor(t,e){var i;super(t),this.view=e,this._toolbarConfig=(i=t.config.get("toolbar"),Array.isArray(i)?{items:i}:i?Object.assign({items:[]},i):{items:[]}),this._elementReplacer=new jc}get element(){return this.view.element}init(t){const e=this.editor,i=this.view,n=e.editing.view,o=i.editable,s=n.document.getRoot();o.name=s.rootName,i.render();const r=o.element;this.setEditableElement(o.name,r),this.focusTracker.add(r),i.editable.bind("isFocused").to(this.focusTracker),n.attachDomRoot(r),t&&this._elementReplacer.replace(t,this.element),this._initPlaceholder(),this._initToolbar(),this.fire("ready")}destroy(){const t=this.view,e=this.editor.editing.view;this._elementReplacer.restore(),e.detachDomRoot(t.editable.name),t.destroy(),super.destroy()}_initToolbar(){const t=this.editor,e=this.view,i=t.editing.view;e.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),e.stickyPanel.limiterElement=e.element,this._toolbarConfig.viewportTopOffset&&(e.stickyPanel.viewportTopOffset=this._toolbarConfig.viewportTopOffset),e.toolbar.fillFromConfig(this._toolbarConfig.items,this.componentFactory),function({origin:t,originKeystrokeHandler:e,originFocusTracker:i,toolbar:n,beforeFocus:o,afterBlur:s}){i.add(n.element),e.set("Alt+F10",(t,e)=>{i.isFocused&&!n.focusTracker.isFocused&&(o&&o(),n.focus(),e())}),n.keystrokes.set("Esc",(e,i)=>{n.focusTracker.isFocused&&(t.focus(),s&&s(),i())})}({origin:i,originFocusTracker:this.focusTracker,originKeystrokeHandler:t.keystrokes,toolbar:e.toolbar})}_initPlaceholder(){const t=this.editor,e=t.editing.view,i=e.document.getRoot(),n=t.sourceElement,o=t.config.get("placeholder")||n&&"textarea"===n.tagName.toLowerCase()&&n.getAttribute("placeholder");o&&Rc({view:e,element:i,text:o,isDirectHost:!1})}}class Bc extends yi{constructor(t){super({idProperty:"viewUid"}),this.on("add",(t,e,i)=>{e.isRendered||e.render(),e.element&&this._parentElement&&this._parentElement.insertBefore(e.element,this._parentElement.children[i])}),this.on("remove",(t,e)=>{e.element&&this._parentElement&&e.element.remove()}),this.locale=t,this._parentElement=null}destroy(){this.map(t=>t.destroy())}setParent(t){this._parentElement=t}delegate(...t){if(!t.length||!t.every(t=>"string"==typeof t))throw new hi.b("ui-viewcollection-delegate-wrong-events: All event names must be strings.",this);return{to:e=>{for(const i of this)for(const n of t)i.delegate(n).to(e);this.on("add",(i,n)=>{for(const i of t)n.delegate(i).to(e)}),this.on("remove",(i,n)=>{for(const i of t)n.stopDelegating(i,e)})}}}}class Fc{constructor(t){Object.assign(this,Jc(Kc(t))),this._isRendered=!1,this._revertData=null}render(){const t=this._renderNode({intoFragment:!0});return this._isRendered=!0,t}apply(t){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:t,isApplying:!0,revertData:this._revertData}),t}revert(t){if(!this._revertData)throw new hi.b("ui-template-revert-not-applied: Attempting to revert a template which has not been applied yet.",[this,t]);this._revertTemplateFromNode(t,this._revertData)}*getViews(){yield*function*t(e){if(e.children)for(const i of e.children)il(i)?yield i:nl(i)&&(yield*t(i))}(this)}static bind(t,e){return{to:(i,n)=>new Uc({eventNameOrFunction:i,attribute:i,observable:t,emitter:e,callback:n}),if:(i,n,o)=>new Wc({observable:t,emitter:e,attribute:i,valueIfTrue:n,callback:o})}}static extend(t,e){if(t._isRendered)throw new hi.b("template-extend-render: Attempting to extend a template which has already been rendered.",[this,t]);!function t(e,i){i.attributes&&(e.attributes||(e.attributes={}),tl(e.attributes,i.attributes));i.eventListeners&&(e.eventListeners||(e.eventListeners={}),tl(e.eventListeners,i.eventListeners));i.text&&e.text.push(...i.text);if(i.children&&i.children.length){if(e.children.length!=i.children.length)throw new hi.b("ui-template-extend-children-mismatch: The number of children in extended definition does not match.",e);let n=0;for(const o of i.children)t(e.children[n++],o)}}(t,Jc(Kc(e)))}_renderNode(t){let e;if(e=t.node?this.tag&&this.text:this.tag?this.text:!this.text,e)throw new hi.b('ui-template-wrong-syntax: Node definition must have either "tag" or "text" when rendering a new Node.',this);return this.text?this._renderText(t):this._renderElement(t)}_renderElement(t){let e=t.node;return e||(e=t.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(t),this._renderElementChildren(t),this._setUpListeners(t),e}_renderText(t){let e=t.node;return e?t.revertData.text=e.textContent:e=t.node=document.createTextNode(""),qc(this.text)?this._bindToObservable({schema:this.text,updater:Yc(e),data:t}):e.textContent=this.text.join(""),e}_renderAttributes(t){let e,i,n,o;if(!this.attributes)return;const s=t.node,r=t.revertData;for(e in this.attributes)if(n=s.getAttribute(e),i=this.attributes[e],r&&(r.attributes[e]=n),o=z(i[0])&&i[0].ns?i[0].ns:null,qc(i)){const a=o?i[0].value:i;r&&sl(e)&&a.unshift(n),this._bindToObservable({schema:a,updater:Gc(s,e,o),data:t})}else"style"==e&&"string"!=typeof i[0]?this._renderStyleAttribute(i[0],t):(r&&n&&sl(e)&&i.unshift(n),i=i.map(t=>t&&t.value||t).reduce((t,e)=>t.concat(e),[]).reduce(Xc,""),el(i)||s.setAttributeNS(o,e,i))}_renderStyleAttribute(t,e){const i=e.node;for(const n in t){const o=t[n];qc(o)?this._bindToObservable({schema:[o],updater:Qc(i,n),data:e}):i.style[n]=o}}_renderElementChildren(t){const e=t.node,i=t.intoFragment?document.createDocumentFragment():e,n=t.isApplying;let o=0;for(const s of this.children)if(ol(s)){if(!n){s.setParent(e);for(const t of s)i.appendChild(t.element)}}else if(il(s))n||(s.isRendered||s.render(),i.appendChild(s.element));else if(Qo(s))i.appendChild(s);else if(n){const e={children:[],bindings:[],attributes:{}};t.revertData.children.push(e),s._renderNode({node:i.childNodes[o++],isApplying:!0,revertData:e})}else i.appendChild(s.render());t.intoFragment&&e.appendChild(i)}_setUpListeners(t){if(this.eventListeners)for(const e in this.eventListeners){const i=this.eventListeners[e].map(i=>{const[n,o]=e.split("@");return i.activateDomEventListener(n,o,t)});t.revertData&&t.revertData.bindings.push(i)}}_bindToObservable({schema:t,updater:e,data:i}){const n=i.revertData;$c(t,e,i);const o=t.filter(t=>!el(t)).filter(t=>t.observable).map(n=>n.activateAttributeListener(t,e,i));n&&n.bindings.push(o)}_revertTemplateFromNode(t,e){for(const t of e.bindings)for(const e of t)e();if(e.text)t.textContent=e.text;else{for(const i in e.attributes){const n=e.attributes[i];null===n?t.removeAttribute(i):t.setAttribute(i,n)}for(let i=0;i$c(t,e,i);return this.emitter.listenTo(this.observable,"change:"+this.attribute,n),()=>{this.emitter.stopListening(this.observable,"change:"+this.attribute,n)}}}class Uc extends Hc{activateDomEventListener(t,e,i){const n=(t,i)=>{e&&!i.target.matches(e)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(i):this.observable.fire(this.eventNameOrFunction,i))};return this.emitter.listenTo(i.node,t,n),()=>{this.emitter.stopListening(i.node,t,n)}}}class Wc extends Hc{getValue(t){return!el(super.getValue(t))&&(this.valueIfTrue||!0)}}function qc(t){return!!t&&(t.value&&(t=t.value),Array.isArray(t)?t.some(qc):t instanceof Hc)}function $c(t,e,{node:i}){let n=function(t,e){return t.map(t=>t instanceof Hc?t.getValue(e):t)}(t,i);n=1==t.length&&t[0]instanceof Wc?n[0]:n.reduce(Xc,""),el(n)?e.remove():e.set(n)}function Yc(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function Gc(t,e,i){return{set(n){t.setAttributeNS(i,e,n)},remove(){t.removeAttributeNS(i,e)}}}function Qc(t,e){return{set(i){t.style[e]=i},remove(){t.style[e]=null}}}function Kc(t){return ei(t,t=>{if(t&&(t instanceof Hc||nl(t)||il(t)||ol(t)))return t})}function Jc(t){if("string"==typeof t?t=function(t){return{text:[t]}}(t):t.text&&function(t){Array.isArray(t.text)||(t.text=[t.text])}(t),t.on&&(t.eventListeners=function(t){for(const e in t)Zc(t,e);return t}(t.on),delete t.on),!t.text){t.attributes&&function(t){for(const e in t)t[e].value&&(t[e].value=[].concat(t[e].value)),Zc(t,e)}(t.attributes);const e=[];if(t.children)if(ol(t.children))e.push(t.children);else for(const i of t.children)nl(i)||il(i)||Qo(i)?e.push(i):e.push(new Fc(i));t.children=e}return t}function Zc(t,e){Array.isArray(t[e])||(t[e]=[t[e]])}function Xc(t,e){return el(e)?t:el(t)?e:`${t} ${e}`}function tl(t,e){for(const i in e)t[i]?t[i].push(...e[i]):t[i]=e[i]}function el(t){return!t&&0!==t}function il(t){return t instanceof rl}function nl(t){return t instanceof Fc}function ol(t){return t instanceof Bc}function sl(t){return"class"==t||"style"==t}i(16);class rl{constructor(t){this.element=null,this.isRendered=!1,this.locale=t,this.t=t&&t.t,this._viewCollections=new yi,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",(e,i)=>{i.locale=t}),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=Fc.bind(this,this)}createCollection(){const t=new Bc;return this._viewCollections.add(t),t}registerChild(t){Ri(t)||(t=[t]);for(const e of t)this._unboundChildren.add(e)}deregisterChild(t){Ri(t)||(t=[t]);for(const e of t)this._unboundChildren.remove(e)}setTemplate(t){this.template=new Fc(t)}extendTemplate(t){Fc.extend(this.template,t)}render(){if(this.isRendered)throw new hi.b("ui-view-render-already-rendered: This View has already been rendered.",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map(t=>t.destroy()),this.template&&this.template._revertData&&this.template.revert(this.element)}}vi(rl,ls),vi(rl,Hn);var al=function(t){return"string"==typeof t||!Lt(t)&&p(t)&&"[object String]"==f(t)};class cl extends Bc{attachToDom(){this._bodyCollectionContainer=new Fc({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");t||(t=function(t,e,i={},n=[]){const o=i&&i.xmlns,s=o?t.createElementNS(o,e):t.createElement(e);for(const t in i)s.setAttribute(t,i[t]);!al(n)&&Ri(n)||(n=[n]);for(let e of n)al(e)&&(e=t.createTextNode(e)),s.appendChild(e);return s}(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(t)),t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const t=document.querySelector(".ck-body-wrapper");t&&0==t.childElementCount&&t.remove()}}i(18);class ll extends rl{constructor(t){super(t),this.body=new cl(t)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}i(20);class dl extends rl{constructor(t){super(t),this.set("text"),this.set("for"),this.id=`ck-editor__label_${li()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class hl extends ll{constructor(t){super(t),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t,e=new dl;return e.text=t("bn"),e.extendTemplate({attributes:{class:"ck-voice-label"}}),e}}class ul extends rl{constructor(t,e,i){super(t),this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}}),this.name=null,this.set("isFocused",!1),this._editableElement=i,this._hasExternalElement=!!this._editableElement,this._editingView=e}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",()=>this._updateIsFocusedClasses()),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}_updateIsFocusedClasses(){const t=this._editingView;function e(e){t.change(i=>{const n=t.document.getRoot(e.name);i.addClass(e.isFocused?"ck-focused":"ck-blurred",n),i.removeClass(e.isFocused?"ck-blurred":"ck-focused",n)})}t.isRenderingInProgress?function i(n){t.once("change:isRenderingInProgress",(t,o,s)=>{s?i(n):e(n)})}(this):e(this)}}class fl extends ul{constructor(t,e,i){super(t,e,i),this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}})}render(){super.render();const t=this._editingView,e=this.t;t.change(i=>{const n=t.document.getRoot(this.name);i.setAttribute("aria-label",e("bo",[this.name]),n)})}}function ml(t){return e=>e+t}i(22);const gl=ml("px");class pl extends rl{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheLimiter",!1),this.set("_hasViewportTopOffset",!1),this.content=this.createCollection(),this._contentPanelPlaceholder=new Fc({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",t=>t?"block":"none"),height:e.to("isSticky",t=>t?gl(this._panelRect.height):null)}}}).render(),this._contentPanel=new Fc({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",t=>t?gl(this._contentPanelPlaceholder.getBoundingClientRect().width):null),top:e.to("_hasViewportTopOffset",t=>t?gl(this.viewportTopOffset):null),bottom:e.to("_isStickyToTheLimiter",t=>t?gl(this.limiterBottomOffset):null),marginLeft:e.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this._contentPanel]})}render(){super.render(),this._checkIfShouldBeSticky(),this.listenTo(ts.window,"scroll",()=>{this._checkIfShouldBeSticky()}),this.listenTo(this,"change:isActive",()=>{this._checkIfShouldBeSticky()})}_checkIfShouldBeSticky(){const t=this._panelRect=this._contentPanel.getBoundingClientRect();let e;this.limiterElement?(e=this._limiterRect=this.limiterElement.getBoundingClientRect(),this.isSticky=this.isActive&&e.top{this[e](),i()})}}get first(){return this.focusables.find(wl)||null}get last(){return this.focusables.filter(wl).slice(-1)[0]||null}get next(){return this._getFocusableItem(1)}get previous(){return this._getFocusableItem(-1)}get current(){let t=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find((e,i)=>{const n=e.element===this.focusTracker.focusedElement;return n&&(t=i),n}),t)}focusFirst(){this._focus(this.first)}focusLast(){this._focus(this.last)}focusNext(){this._focus(this.next)}focusPrevious(){this._focus(this.previous)}_focus(t){t&&t.focus()}_getFocusableItem(t){const e=this.current,i=this.focusables.length;if(!i)return null;if(null===e)return this[1===t?"first":"last"];let n=(e+i+t)%i;do{const e=this.focusables.get(n);if(wl(e))return e;n=(n+i+t)%i}while(n!==e);return null}}function wl(t){return!(!t.focus||"none"==ts.window.getComputedStyle(t.element).display)}class kl extends rl{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class _l{constructor(t,e){_l._observerInstance||_l._createObserver(),this._element=t,this._callback=e,_l._addElementCallback(t,e),_l._observerInstance.observe(t)}destroy(){_l._deleteElementCallback(this._element,this._callback)}static _addElementCallback(t,e){_l._elementCallbacks||(_l._elementCallbacks=new Map);let i=_l._elementCallbacks.get(t);i||(i=new Set,_l._elementCallbacks.set(t,i)),i.add(e)}static _deleteElementCallback(t,e){const i=_l._getElementCallbacks(t);i&&(i.delete(e),i.size||(_l._elementCallbacks.delete(t),_l._observerInstance.unobserve(t))),_l._elementCallbacks&&!_l._elementCallbacks.size&&(_l._observerInstance=null,_l._elementCallbacks=null)}static _getElementCallbacks(t){return _l._elementCallbacks?_l._elementCallbacks.get(t):null}static _createObserver(){let t;t="function"==typeof ts.window.ResizeObserver?ts.window.ResizeObserver:vl,_l._observerInstance=new t(t=>{for(const e of t){const t=_l._getElementCallbacks(e.target);if(t)for(const i of t)i(e)}})}}_l._observerInstance=null,_l._elementCallbacks=null;class vl{constructor(t){this._callback=t,this._elements=new Set,this._previousRects=new Map,this._periodicCheckTimeout=null}observe(t){this._elements.add(t),this._checkElementRectsAndExecuteCallback(),1===this._elements.size&&this._startPeriodicCheck()}unobserve(t){this._elements.delete(t),this._previousRects.delete(t),this._elements.size||this._stopPeriodicCheck()}_startPeriodicCheck(){const t=()=>{this._checkElementRectsAndExecuteCallback(),this._periodicCheckTimeout=setTimeout(t,100)};this.listenTo(ts.window,"resize",()=>{this._checkElementRectsAndExecuteCallback()}),this._periodicCheckTimeout=setTimeout(t,100)}_stopPeriodicCheck(){clearTimeout(this._periodicCheckTimeout),this.stopListening(),this._previousRects.clear()}_checkElementRectsAndExecuteCallback(){const t=[];for(const e of this._elements)this._hasRectChanged(e)&&t.push({target:e,contentRect:this._previousRects.get(e)});t.length&&this._callback(t)}_hasRectChanged(t){if(!t.ownerDocument.body.contains(t))return!1;const e=new Xs(t),i=this._previousRects.get(t),n=!i||!i.isEqual(e);return this._previousRects.set(t,e),n}}vi(vl,ls);class yl extends rl{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",t=>`ck-dropdown__panel_${t}`),e.if("isVisible","ck-dropdown__panel-visible")]},children:this.children,on:{selectstart:e.to(t=>t.preventDefault())}})}focus(){this.children.length&&this.children.first.focus()}focusLast(){if(this.children.length){const t=this.children.last;"function"==typeof t.focusLast?t.focusLast():t.focus()}}}i(24);function xl({element:t,target:e,positions:i,limiter:n,fitInViewport:o}){V(e)&&(e=e()),V(n)&&(n=n());const s=function(t){for(;t&&"html"!=t.tagName.toLowerCase();){if("static"!=ts.window.getComputedStyle(t).position)return t;t=t.parentElement}return null}(t.parentElement),r=new Xs(t),a=new Xs(e);let c,l;if(n||o){const t=n&&new Xs(n).getVisible(),e=o&&new Xs(ts.window);[l,c]=function(t,e,i,n,o){let s,r,a=0,c=0;const l=i.getArea();return t.some(t=>{const[d,h]=Al(t,e,i);let u,f;if(n)if(o){const t=n.getIntersection(o);u=t?t.getIntersectionArea(h):0}else u=n.getIntersectionArea(h);function m(){c=f,a=u,s=h,r=d}return o&&(f=o.getIntersectionArea(h)),o&&!n?f>c&&m():!o&&n?u>a&&m():(f>c&&u>=a||f>=c&&u>a)&&m(),u===l}),s?[r,s]:null}(i,a,r,t,e)||Al(i[0],a,r)}else[l,c]=Al(i[0],a,r);let{left:d,top:h}=Cl(c);if(s){const t=Cl(new Xs(s)),e=Js(s);d-=t.left,h-=t.top,d+=s.scrollLeft,h+=s.scrollTop,d-=e.left,h-=e.top}return{left:d,top:h,name:l}}function Al(t,e,i){const{left:n,top:o,name:s}=t(e,i);return[s,i.clone().moveTo(n,o)]}function Cl({left:t,top:e}){const{scrollX:i,scrollY:n}=ts.window;return{left:t+i,top:e+n}}class Tl extends rl{constructor(t,e,i){super(t);const n=this.bindTemplate;this.buttonView=e,this.panelView=i,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class"),this.set("id"),this.set("panelPosition","auto"),this.focusTracker=new Ic,this.keystrokes=new yc,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",n.to("class"),n.if("isEnabled","ck-disabled",t=>!t)],id:n.to("id"),"aria-describedby":n.to("ariaDescribedById")},children:[e,i]}),e.extendTemplate({attributes:{class:["ck-dropdown__button"]}})}render(){super.render(),this.listenTo(this.buttonView,"open",()=>{this.isOpen=!this.isOpen}),this.panelView.bind("isVisible").to(this,"isOpen"),this.on("change:isOpen",()=>{this.isOpen&&("auto"===this.panelPosition?this.panelView.position=Tl._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions}).name:this.panelView.position=this.panelPosition)}),this.keystrokes.listenTo(this.element),this.focusTracker.add(this.element);const t=(t,e)=>{this.isOpen&&(this.buttonView.focus(),this.isOpen=!1,e())};this.keystrokes.set("arrowdown",(t,e)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,e())}),this.keystrokes.set("arrowright",(t,e)=>{this.isOpen&&e()}),this.keystrokes.set("arrowleft",t),this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{southEast:t,southWest:e,northEast:i,northWest:n}=Tl.defaultPanelPositions;return"ltr"===this.locale.uiLanguageDirection?[t,e,i,n]:[e,t,n,i]}}Tl.defaultPanelPositions={southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.bottom-e.height,left:t.left-e.width+t.width,name:"nw"})},Tl._getOptimalPosition=xl;i(26);class Pl extends rl{constructor(){super();const t=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon"],viewBox:t.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",()=>{this._updateXMLContent(),this._colorFillPaths()}),this.on("change:fillColor",()=>{this._colorFillPaths()})}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),e=t.getAttribute("viewBox");for(e&&(this.viewBox=e),this.element.innerHTML="";t.childNodes.length>0;)this.element.appendChild(t.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach(t=>{t.style.fill=this.fillColor})}}i(28);class Sl extends rl{constructor(t){super(t),this.set("text",""),this.set("position","s");const e=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip",e.to("position",t=>"ck-tooltip_"+t),e.if("text","ck-hidden",t=>!t.trim())]},children:[{tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:e.to("text")}]}]})}}i(30);class El extends rl{constructor(t){super(t);const e=this.bindTemplate,i=li();this.set("class"),this.set("labelStyle"),this.set("icon"),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke"),this.set("label"),this.set("tabindex",-1),this.set("tooltip"),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.tooltipView=this._createTooltipView(),this.labelView=this._createLabelView(i),this.iconView=new Pl,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this)),this.setTemplate({tag:"button",attributes:{class:["ck","ck-button",e.to("class"),e.if("isEnabled","ck-disabled",t=>!t),e.if("isVisible","ck-hidden",t=>!t),e.to("isOn",t=>t?"ck-on":"ck-off"),e.if("withText","ck-button_with-text"),e.if("withKeystroke","ck-button_with-keystroke")],type:e.to("type",t=>t||"button"),tabindex:e.to("tabindex"),"aria-labelledby":`ck-editor__aria-label_${i}`,"aria-disabled":e.if("isEnabled",!0,t=>!t),"aria-pressed":e.to("isOn",t=>!!this.isToggleable&&String(t))},children:this.children,on:{mousedown:e.to(t=>{t.preventDefault()}),click:e.to(t=>{this.isEnabled?this.fire("execute"):t.preventDefault()})}})}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.tooltipView),this.children.add(this.labelView),this.withKeystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}_createTooltipView(){const t=new Sl;return t.bind("text").to(this,"_tooltipString"),t.bind("position").to(this,"tooltipPosition"),t}_createLabelView(t){const e=new rl,i=this.bindTemplate;return e.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:i.to("labelStyle"),id:`ck-editor__aria-label_${t}`},children:[{text:this.bindTemplate.to("label")}]}),e}_createKeystrokeView(){const t=new rl;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",t=>ko(t))}]}),t}_getTooltipString(t,e,i){return t?"string"==typeof t?t:(i&&(i=ko(i)),t instanceof Function?t(e,i):`${e}${i?` (${i})`:""}`):""}}class Ml extends El{constructor(t){super(t),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new Pl;return t.content=' ',t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),t}}i(32);class Il extends rl{constructor(){super(),this.items=this.createCollection(),this.focusTracker=new Ic,this.keystrokes=new yc,this._focusCycler=new bl({focusables:this.items,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"]},children:this.items})}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",(t,e)=>{this.focusTracker.add(e.element)}),this.items.on("remove",(t,e)=>{this.focusTracker.remove(e.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}class Nl extends rl{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item"]},children:this.children})}focus(){this.children.first.focus()}}class Ol extends rl{constructor(t){super(t),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}i(34);class Rl extends El{constructor(t){super(t),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new rl;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),t}}function Ll({emitter:t,activator:e,callback:i,contextElements:n}){t.listenTo(document,"mousedown",(t,{target:o})=>{if(e()){for(const t of n)if(t.contains(o))return;i()}})}i(36),i(38);function Dl(t,e=Ml){const i=new e(t),n=new yl(t),o=new Tl(t,i,n);return i.bind("isEnabled").to(o),i instanceof Ml?i.bind("isOn").to(o,"isOpen"):i.arrowView.bind("isOn").to(o,"isOpen"),function(t){(function(t){t.on("render",()=>{Ll({emitter:t,activator:()=>t.isOpen,callback:()=>{t.isOpen=!1},contextElements:[t.element]})})})(t),function(t){t.on("execute",e=>{e.source instanceof Rl||(t.isOpen=!1)})}(t),function(t){t.keystrokes.set("arrowdown",(e,i)=>{t.isOpen&&(t.panelView.focus(),i())}),t.keystrokes.set("arrowup",(e,i)=>{t.isOpen&&(t.panelView.focusLast(),i())})}(t)}(o),o}function zl(t,e){const i=t.locale,n=i.t,o=t.toolbarView=new Vl(i);o.set("ariaLabel",n("ca")),t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),e.map(t=>o.items.add(t)),t.panelView.children.add(o),o.items.delegate("execute").to(t)}function jl(t,e){const i=t.locale,n=t.listView=new Il(i);n.items.bindTo(e).using(({type:t,model:e})=>{if("separator"===t)return new Ol(i);if("button"===t||"switchbutton"===t){const n=new Nl(i);let o;return o="button"===t?new El(i):new Rl(i),o.bind(...Object.keys(e)).to(e),o.delegate("execute").to(n),n.children.add(o),n}}),t.panelView.children.add(n),n.items.delegate("execute").to(t)}i(40);class Vl extends rl{constructor(t,e){super(t);const i=this.bindTemplate,n=this.t;var o;this.options=e||{},this.set("ariaLabel",n("by")),this.items=this.createCollection(),this.focusTracker=new Ic,this.keystrokes=new yc,this.set("class"),this.set("isCompact",!1),this.itemsView=new Bl(t),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection(),this._focusCycler=new bl({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:["arrowleft","arrowup"],focusNext:["arrowright","arrowdown"]}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar",i.to("class"),i.if("isCompact","ck-toolbar_compact")],role:"toolbar","aria-label":i.to("ariaLabel")},children:this.children,on:{mousedown:(o=this,o.bindTemplate.to(t=>{t.target===o.element&&t.preventDefault()}))}}),this._behavior=this.options.shouldGroupWhenFull?new Hl(this):new Fl(this)}render(){super.render();for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",(t,e)=>{this.focusTracker.add(e.element)}),this.items.on("remove",(t,e)=>{this.focusTracker.remove(e.element)}),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e){t.map(t=>{"|"==t?this.items.add(new kl):e.has(t)?this.items.add(e.create(t)):console.warn(Object(hi.a)("toolbarview-item-unavailable: The requested toolbar item is unavailable."),{name:t})})}}class Bl extends rl{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class Fl{constructor(t){const e=t.bindTemplate;t.set("isVertical",!1),t.itemsView.children.bindTo(t.items).using(t=>t),t.focusables.bindTo(t.items).using(t=>t),t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class Hl{constructor(t){this.viewChildren=t.children,this.viewFocusables=t.focusables,this.viewItemsView=t.itemsView,this.viewFocusTracker=t.focusTracker,this.viewLocale=t.locale,this.ungroupedItems=t.createCollection(),this.groupedItems=t.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),this.resizeObserver=null,this.cachedPadding=null,t.itemsView.children.bindTo(this.ungroupedItems).using(t=>t),this.ungroupedItems.on("add",this._updateFocusCycleableItems.bind(this)),this.ungroupedItems.on("remove",this._updateFocusCycleableItems.bind(this)),t.children.on("add",this._updateFocusCycleableItems.bind(this)),t.children.on("remove",this._updateFocusCycleableItems.bind(this)),t.items.on("add",(t,e,i)=>{i>this.ungroupedItems.length?this.groupedItems.add(e,i-this.ungroupedItems.length):this.ungroupedItems.add(e,i),this._updateGrouping()}),t.items.on("remove",(t,e,i)=>{i>this.ungroupedItems.length?this.groupedItems.remove(e):this.ungroupedItems.remove(e),this._updateGrouping()}),t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element,this._enableGroupingOnResize()}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;let t;for(;this._areItemsOverflowing;)this._groupLastItem(),t=!0;if(!t&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const t=this.viewElement,e=this.viewLocale.uiLanguageDirection,i=new Xs(t.lastChild),n=new Xs(t);if(!this.cachedPadding){const i=ts.window.getComputedStyle(t),n="ltr"===e?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(i[n])}return"ltr"===e?i.right>n.right-this.cachedPadding:i.left{t&&t===e.contentRect.width||(this._updateGrouping(),t=e.contentRect.width)}),this._updateGrouping()}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new kl),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const t=this.viewLocale,e=t.t,i=Dl(t);return i.class="ck-toolbar__grouped-dropdown",i.panelPosition="ltr"===t.uiLanguageDirection?"sw":"se",zl(i,[]),i.buttonView.set({label:e("bz"),tooltip:!0,icon:' '}),i.toolbarView.items.bindTo(this.groupedItems).using(t=>t),i}_updateFocusCycleableItems(){this.viewFocusables.clear(),this.ungroupedItems.map(t=>{this.viewFocusables.add(t)}),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}i(42);class Ul extends hl{constructor(t,e,i={}){super(t),this.stickyPanel=new pl(t),this.toolbar=new Vl(t,{shouldGroupWhenFull:i.shouldToolbarGroupWhenFull}),this.editable=new fl(t,e)}render(){super.render(),this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class Wl extends Ac{constructor(t,e){super(e),ii(t)&&(this.sourceElement=t),this.data.processor=new Sc,this.model.document.createRoot();const i=!this.config.get("toolbar.shouldNotGroupWhenFull"),n=new Ul(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:i});this.ui=new Vc(this,n),function(t){if(!V(t.updateSourceElement))throw new hi.b("attachtoform-missing-elementapi-interface: Editor passed to attachToForm() must implement ElementApi.",t);const e=t.sourceElement;if(e&&"textarea"===e.tagName.toLowerCase()&&e.form){let i;const n=e.form,o=()=>t.updateSourceElement();V(n.submit)&&(i=n.submit,n.submit=()=>{o(),i.apply(n)}),n.addEventListener("submit",o),t.on("destroy",()=>{n.removeEventListener("submit",o),i&&(n.submit=i)})}}(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(t,e={}){return new Promise(i=>{const n=new this(t,e);i(n.initPlugins().then(()=>n.ui.init(ii(t)?t:null)).then(()=>{if(!ii(t)&&e.initialData)throw new hi.b("editor-create-initial-data: The config.initialData option cannot be used together with initial data passed in Editor.create().",null);const i=e.initialData||function(t){return ii(t)?(e=t,e instanceof HTMLTextAreaElement?e.value:e.innerHTML):t;var e}(t);return n.data.init(i)}).then(()=>n.fire("ready")).then(()=>n))})}}vi(Wl,Cc),vi(Wl,Tc);class ql{constructor(t){this.editor=t,this.set("isEnabled",!0),this._disableStack=new Set}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",$l,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",$l),this.isEnabled=!0)}destroy(){this.stopListening()}static get isContextPlugin(){return!1}}function $l(t){t.return=!1,t.stop()}vi(ql,Hn);class Yl{constructor(t){this.files=function(t){const e=t.files?Array.from(t.files):[],i=t.items?Array.from(t.items):[];if(e.length)return e;return i.filter(t=>"file"===t.kind).map(t=>t.getAsFile())}(t),this._native=t}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}}class Gl extends Os{constructor(t){super(t);const e=this.document;function i(t,i){i.preventDefault();const n=i.dropRange?[i.dropRange]:Array.from(e.selection.getRanges()),o=new ai(e,"clipboardInput");e.fire(o,{dataTransfer:i.dataTransfer,targetRanges:n}),o.stop.called&&i.stopPropagation()}this.domEventType=["paste","copy","cut","drop","dragover"],this.listenTo(e,"paste",i,{priority:"low"}),this.listenTo(e,"drop",i,{priority:"low"})}onDomEvent(t){const e={dataTransfer:new Yl(t.clipboardData?t.clipboardData:t.dataTransfer)};"drop"==t.type&&(e.dropRange=function(t,e){const i=e.target.ownerDocument,n=e.clientX,o=e.clientY;let s;i.caretRangeFromPoint&&i.caretRangeFromPoint(n,o)?s=i.caretRangeFromPoint(n,o):e.rangeParent&&(s=i.createRange(),s.setStart(e.rangeParent,e.rangeOffset),s.collapse(!0));return s?t.domConverter.domRangeToView(s):t.document.selection.getFirstRange()}(this.view,t)),this.fire(t.type,t,e)}}const Ql=["figcaption","li"];class Kl extends ql{static get pluginName(){return"Clipboard"}init(){const t=this.editor,e=t.model.document,i=t.editing.view,n=i.document;function o(i,o){const s=o.dataTransfer;o.preventDefault();const r=t.data.toView(t.model.getSelectedContent(e.selection));n.fire("clipboardOutput",{dataTransfer:s,content:r,method:i.name})}this._htmlDataProcessor=new Sc,i.addObserver(Gl),this.listenTo(n,"clipboardInput",e=>{t.isReadOnly&&e.stop()},{priority:"highest"}),this.listenTo(n,"clipboardInput",(t,e)=>{const n=e.dataTransfer;let o="";var s;n.getData("text/html")?o=function(t){return t.replace(/(\s+)<\/span>/g,(t,e)=>1==e.length?" ":e)}(n.getData("text/html")):n.getData("text/plain")&&((s=(s=n.getData("text/plain")).replace(//g,">").replace(/\n/g,"
").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g," ")).indexOf("
")>-1&&(s=`
${s}
`),o=s),o=this._htmlDataProcessor.toView(o),this.fire("inputTransformation",{content:o,dataTransfer:n}),i.scrollToTheSelection()},{priority:"low"}),this.listenTo(this,"inputTransformation",(t,e)=>{if(!e.content.isEmpty){const t=this.editor.data,i=this.editor.model,n=t.toModel(e.content,"$clipboardHolder");if(0==n.childCount)return;i.insertContent(n)}},{priority:"low"}),this.listenTo(n,"copy",o,{priority:"low"}),this.listenTo(n,"cut",(e,i)=>{t.isReadOnly?i.preventDefault():o(e,i)},{priority:"low"}),this.listenTo(n,"clipboardOutput",(i,n)=>{n.content.isEmpty||(n.dataTransfer.setData("text/html",this._htmlDataProcessor.toData(n.content)),n.dataTransfer.setData("text/plain",function t(e){let i="";if(e.is("text")||e.is("textProxy"))i=e.data;else if(e.is("img")&&e.hasAttribute("alt"))i=e.getAttribute("alt");else{let n=null;for(const o of e.getChildren()){const e=t(o);n&&(n.is("containerElement")||o.is("containerElement"))&&(Ql.includes(n.name)||Ql.includes(o.name)?i+="\n":i+="\n\n"),i+=e,n=o}}return i}(n.content))),"cut"==n.method&&t.model.deleteContent(e.selection)},{priority:"low"})}}class Jl{constructor(t){this.editor=t,this.set("value",void 0),this.set("isEnabled",!1),this._disableStack=new Set,this.decorate("execute"),this.listenTo(this.editor.model.document,"change",()=>{this.refresh()}),this.on("execute",t=>{this.isEnabled||t.stop()},{priority:"high"}),this.listenTo(t,"change:isReadOnly",(t,e,i)=>{i?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})}refresh(){this.isEnabled=!0}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",Zl,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",Zl),this.refresh())}execute(){}destroy(){this.stopListening()}}function Zl(t){t.return=!1,t.stop()}function*Xl(t,e){for(const i of e)i&&t.getAttributeProperties(i[0]).copyOnEnter&&(yield i)}vi(Jl,Hn);class td extends Jl{execute(){const t=this.editor.model,e=t.document;t.change(i=>{!function(t,e,i,n){const o=i.isCollapsed,s=i.getFirstRange(),r=s.start.parent,a=s.end.parent;if(n.isLimit(r)||n.isLimit(a))return void(o||r!=a||t.deleteContent(i));if(o){const t=Xl(e.model.schema,i.getAttributes());ed(e,s.start),e.setSelectionAttribute(t)}else{const n=!(s.start.isAtStart&&s.end.isAtEnd),o=r==a;t.deleteContent(i,{leaveUnmerged:n}),n&&(o?ed(e,i.focus):e.setSelection(a,0))}}(this.editor.model,i,e.selection,t.schema),this.fire("afterExecute",{writer:i})})}}function ed(t,e){t.split(e),t.setSelection(e.parent.nextSibling,0)}class id extends us{constructor(t){super(t);const e=this.document;e.on("keydown",(t,i)=>{if(this.isEnabled&&i.keyCode==po.enter){let n;e.once("enter",t=>n=t,{priority:"highest"}),e.fire("enter",new Ns(e,i.domEvent,{isSoft:i.shiftKey})),n&&n.stop.called&&t.stop()}})}observe(){}}class nd extends ql{static get pluginName(){return"Enter"}init(){const t=this.editor,e=t.editing.view,i=e.document;e.addObserver(id),t.commands.add("enter",new td(t)),this.listenTo(i,"enter",(i,n)=>{n.preventDefault(),n.isSoft||(t.execute("enter"),e.scrollToTheSelection())},{priority:"low"})}}class od extends Jl{execute(){const t=this.editor.model,e=t.document;t.change(i=>{!function(t,e,i){const n=i.isCollapsed,o=i.getFirstRange(),s=o.start.parent,r=o.end.parent,a=s==r;if(n){const n=Xl(t.schema,i.getAttributes());sd(t,e,o.end),e.removeSelectionAttribute(i.getAttributeKeys()),e.setSelectionAttribute(n)}else{const n=!(o.start.isAtStart&&o.end.isAtEnd);t.deleteContent(i,{leaveUnmerged:n}),a?sd(t,e,i.focus):n&&e.setSelection(r,0)}}(t,i,e.selection),this.fire("afterExecute",{writer:i})})}refresh(){const t=this.editor.model,e=t.document;this.isEnabled=function(t,e){if(e.rangeCount>1)return!1;const i=e.anchor;if(!i||!t.checkChild(i,"softBreak"))return!1;const n=e.getFirstRange(),o=n.start.parent,s=n.end.parent;if((rd(o,t)||rd(s,t))&&o!==s)return!1;return!0}(t.schema,e.selection)}}function sd(t,e,i){const n=e.createElement("softBreak");t.insertContent(n,i),e.setSelection(n,"after")}function rd(t,e){return!t.is("rootElement")&&(e.isLimit(t)||rd(t.parent,e))}class ad extends ql{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor,e=t.model.schema,i=t.conversion,n=t.editing.view,o=n.document;e.register("softBreak",{allowWhere:"$text",isInline:!0}),i.for("upcast").elementToElement({model:"softBreak",view:"br"}),i.for("downcast").elementToElement({model:"softBreak",view:(t,e)=>e.createEmptyElement("br")}),n.addObserver(id),t.commands.add("shiftEnter",new od(t)),this.listenTo(o,"enter",(e,i)=>{i.preventDefault(),i.isSoft&&(t.execute("shiftEnter"),n.scrollToTheSelection())},{priority:"low"})}}class cd{constructor(t,e=20){this.model=t,this.size=0,this.limit=e,this.isLocked=!1,this._changeCallback=(t,e)=>{"transparent"!=e.type&&e!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch()),this._batch}input(t){this.size+=t,this.size>=this.limit&&this._reset(!0)}lock(){this.isLocked=!0}unlock(){this.isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t){this.isLocked&&!t||(this._batch=null,this.size=0)}}class ld extends Jl{constructor(t,e){super(t),this._buffer=new cd(t.model,e),this._batches=new WeakSet}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(t={}){const e=this.editor.model,i=e.document,n=t.text||"",o=n.length,s=t.range||i.selection.getFirstRange(),r=t.resultRange;e.enqueueChange(this._buffer.batch,t=>{const a=s.isCollapsed;this._buffer.lock(),e.deleteContent(e.createSelection(s)),n&&e.insertContent(t.createText(n,i.selection.getAttributes()),s.start),r?t.setSelection(r):a&&t.setSelection(s.start.getShiftedBy(o)),this._buffer.unlock(),this._buffer.input(o),this._batches.add(this._buffer.batch)})}}function dd(t){let e=null;const i=t.model,n=t.editing.view,o=t.commands.get("input");function s(t){const s=i.document,a=n.document.isComposing,c=e&&e.isEqual(s.selection);e=null,o.isEnabled&&(function(t){if(t.ctrlKey)return!0;return hd.includes(t.keyCode)}(t)||s.selection.isCollapsed||a&&229===t.keyCode||!a&&229===t.keyCode&&c||r())}function r(){const t=o.buffer;t.lock(),i.enqueueChange(t.batch,()=>{i.deleteContent(i.document.selection)}),t.unlock()}fo.isAndroid?n.document.on("beforeinput",(t,e)=>s(e),{priority:"lowest"}):n.document.on("keydown",(t,e)=>s(e),{priority:"lowest"}),n.document.on("compositionstart",(function(){const t=i.document,e=1!==t.selection.rangeCount||t.selection.getFirstRange().isFlat;if(t.selection.isCollapsed||e)return;r()}),{priority:"lowest"}),n.document.on("compositionend",()=>{e=i.createSelection(i.document.selection)},{priority:"lowest"})}const hd=[bo("arrowUp"),bo("arrowRight"),bo("arrowDown"),bo("arrowLeft"),9,16,17,18,19,20,27,33,34,35,36,45,91,93,144,145,173,174,175,176,177,178,179,255];for(let t=112;t<=135;t++)hd.push(t);function ud(t){if(t.newChildren.length-t.oldChildren.length!=1)return;const e=function(t,e){const i=[];let n,o=0;return t.forEach(t=>{"equal"==t?(s(),o++):"insert"==t?(r("insert")?n.values.push(e[o]):(s(),n={type:"insert",index:o,values:[e[o]]}),o++):r("delete")?n.howMany++:(s(),n={type:"delete",index:o,howMany:1})}),s(),i;function s(){n&&(i.push(n),n=null)}function r(t){return n&&n.type==t}}($o(t.oldChildren,t.newChildren,fd),t.newChildren);if(e.length>1)return;const i=e[0];return i.values[0]&&i.values[0].is("text")?i:void 0}function fd(t,e){return t&&t.is("text")&&e&&e.is("text")?t.data===e.data:t===e}class md{constructor(t){this.editor=t,this.editing=this.editor.editing}handle(t,e){if(function(t){if(0==t.length)return!1;for(const e of t)if("children"===e.type&&!ud(e))return!0;return!1}(t))this._handleContainerChildrenMutations(t,e);else for(const i of t)this._handleTextMutation(i,e),this._handleTextNodeInsertion(i)}_handleContainerChildrenMutations(t,e){const i=function(t){const e=t.map(t=>t.node).reduce((t,e)=>t.getCommonAncestor(e,{includeSelf:!0}));if(!e)return;return e.getAncestors({includeSelf:!0,parentFirst:!0}).find(t=>t.is("containerElement")||t.is("rootElement"))}(t);if(!i)return;const n=this.editor.editing.view.domConverter.mapViewToDom(i),o=new os,s=this.editor.data.toModel(o.domToView(n)).getChild(0),r=this.editor.editing.mapper.toModelElement(i);if(!r)return;const a=Array.from(s.getChildren()),c=Array.from(r.getChildren()),l=a[a.length-1],d=c[c.length-1];l&&l.is("softBreak")&&d&&!d.is("softBreak")&&a.pop();const h=this.editor.model.schema;if(!gd(a,h)||!gd(c,h))return;const u=a.map(t=>t.is("text")?t.data:"@").join("").replace(/\u00A0/g," "),f=c.map(t=>t.is("text")?t.data:"@").join("").replace(/\u00A0/g," ");if(f===u)return;const m=$o(f,u),{firstChangeAt:g,insertions:p,deletions:b}=pd(m);let w=null;e&&(w=this.editing.mapper.toModelRange(e.getFirstRange()));const k=u.substr(g,p),_=this.editor.model.createRange(this.editor.model.createPositionAt(r,g),this.editor.model.createPositionAt(r,g+b));this.editor.execute("input",{text:k,range:_,resultRange:w})}_handleTextMutation(t,e){if("text"!=t.type)return;const i=t.newText.replace(/\u00A0/g," "),n=t.oldText.replace(/\u00A0/g," ");if(n===i)return;const o=$o(n,i),{firstChangeAt:s,insertions:r,deletions:a}=pd(o);let c=null;e&&(c=this.editing.mapper.toModelRange(e.getFirstRange()));const l=this.editing.view.createPositionAt(t.node,s),d=this.editing.mapper.toModelPosition(l),h=this.editor.model.createRange(d,d.getShiftedBy(a)),u=i.substr(s,r);this.editor.execute("input",{text:u,range:h,resultRange:c})}_handleTextNodeInsertion(t){if("children"!=t.type)return;const e=ud(t),i=this.editing.view.createPositionAt(t.node,e.index),n=this.editing.mapper.toModelPosition(i),o=e.values[0].data;this.editor.execute("input",{text:o.replace(/\u00A0/g," "),range:this.editor.model.createRange(n)})}}function gd(t,e){return t.every(t=>e.isInline(t))}function pd(t){let e=null,i=null;for(let n=0;n{new md(t).handle(i,n)})}(t)}isInput(t){return this.editor.commands.get("input")._batches.has(t)}}class wd extends Jl{constructor(t,e){super(t),this.direction=e,this._buffer=new cd(t.model,t.config.get("typing.undoStep"))}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model,i=e.document;e.enqueueChange(this._buffer.batch,n=>{this._buffer.lock();const o=n.createSelection(t.selection||i.selection),s=o.isCollapsed;if(o.isCollapsed&&e.modifySelection(o,{direction:this.direction,unit:t.unit}),this._shouldEntireContentBeReplacedWithParagraph(t.sequence||1))return void this._replaceEntireContentWithParagraph(n);if(o.isCollapsed)return;let r=0;o.getFirstRange().getMinimalFlatRanges().forEach(t=>{r+=io(t.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))}),e.deleteContent(o,{doNotResetEntireContent:s}),this._buffer.input(r),n.setSelection(o),this._buffer.unlock()})}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1)return!1;const e=this.editor.model,i=e.document.selection,n=e.schema.getLimitElement(i);if(!(i.isCollapsed&&i.containsEntireContent(n)))return!1;if(!e.schema.checkChild(n,"paragraph"))return!1;const o=n.getChild(0);return!o||"paragraph"!==o.name}_replaceEntireContentWithParagraph(t){const e=this.editor.model,i=e.document.selection,n=e.schema.getLimitElement(i),o=t.createElement("paragraph");t.remove(t.createRangeIn(n)),t.insert(o,n),t.setSelection(o,0)}}class kd extends us{constructor(t){super(t);const e=t.document;let i=0;function n(t,i,n){let o;e.once("delete",t=>o=t,{priority:Number.POSITIVE_INFINITY}),e.fire("delete",new Ns(e,i,n)),o&&o.stop.called&&t.stop()}e.on("keyup",(t,e)=>{e.keyCode!=po.delete&&e.keyCode!=po.backspace||(i=0)}),e.on("keydown",(t,e)=>{const o={};if(e.keyCode==po.delete)o.direction="forward",o.unit="character";else{if(e.keyCode!=po.backspace)return;o.direction="backward",o.unit="codePoint"}const s=fo.isMac?e.altKey:e.ctrlKey;o.unit=s?"word":o.unit,o.sequence=++i,n(t,e.domEvent,o)}),fo.isAndroid&&e.on("beforeinput",(e,i)=>{if("deleteContentBackward"!=i.domEvent.inputType)return;const o={unit:"codepoint",direction:"backward",sequence:1},s=i.domTarget.ownerDocument.defaultView.getSelection();s.anchorNode==s.focusNode&&s.anchorOffset+1!=s.focusOffset&&(o.selectionToRemove=t.domConverter.domSelectionToView(s)),n(e,i.domEvent,o)})}observe(){}}class _d extends ql{static get pluginName(){return"Delete"}init(){const t=this.editor,e=t.editing.view,i=e.document;if(e.addObserver(kd),t.commands.add("forwardDelete",new wd(t,"forward")),t.commands.add("delete",new wd(t,"backward")),this.listenTo(i,"delete",(i,n)=>{const o={unit:n.unit,sequence:n.sequence};if(n.selectionToRemove){const e=t.model.createSelection(),i=[];for(const e of n.selectionToRemove.getRanges())i.push(t.editing.mapper.toModelRange(e));e.setTo(i),o.selection=e}t.execute("forward"==n.direction?"forwardDelete":"delete",o),n.preventDefault(),e.scrollToTheSelection()}),fo.isAndroid){let t=null;this.listenTo(i,"delete",(e,i)=>{const n=i.domTarget.ownerDocument.defaultView.getSelection();t={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}},{priority:"lowest"}),this.listenTo(i,"keyup",(e,i)=>{if(t){const e=i.domTarget.ownerDocument.defaultView.getSelection();e.collapse(t.anchorNode,t.anchorOffset),e.extend(t.focusNode,t.focusOffset),t=null}})}}}class vd extends ql{static get requires(){return[bd,_d]}static get pluginName(){return"Typing"}}const yd=new Map;function xd(t,e,i){let n=yd.get(t);n||(n=new Map,yd.set(t,n)),n.set(e,i)}function Ad(t){return[t]}function Cd(t,e,i={}){const n=function(t,e){const i=yd.get(t);return i&&i.has(e)?i.get(e):Ad}(t.constructor,e.constructor);try{return n(t=t.clone(),e,i)}catch(t){throw t}}function Td(t,e,i){t=t.slice(),e=e.slice();const n=new Pd(i.document,i.useRelations,i.forceWeakRemove);n.setOriginalOperations(t),n.setOriginalOperations(e);const o=n.originalOperations;if(0==t.length||0==e.length)return{operationsA:t,operationsB:e,originalOperations:o};const s=new WeakMap;for(const e of t)s.set(e,0);const r={nextBaseVersionA:t[t.length-1].baseVersion+1,nextBaseVersionB:e[e.length-1].baseVersion+1,originalOperationsACount:t.length,originalOperationsBCount:e.length};let a=0;for(;a{if(t.key===e.key){const n=t.range.getDifference(e.range).map(e=>new Ma(e,t.key,t.oldValue,t.newValue,0)),o=t.range.getIntersection(e.range);return o&&i.aIsStrong&&n.push(new Ma(o,e.key,e.newValue,t.newValue,0)),0==n.length?[new nc(0)]:n}return[t]}),xd(Ma,Oa,(t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const i=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes).map(e=>new Ma(e,t.key,t.oldValue,t.newValue,t.baseVersion));if(e.shouldReceiveAttributes){const n=Md(e,t.key,t.oldValue);n&&i.unshift(n)}return i}return t.range=t.range._getTransformedByInsertion(e.position,e.howMany,!1)[0],[t]}),xd(Ma,za,(t,e)=>{const i=[];t.range.start.hasSameParentAs(e.deletionPosition)&&(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition))&&i.push(vr._createFromPositionAndShift(e.graveyardPosition,1));const n=t.range._getTransformedByMergeOperation(e);return n.isCollapsed||i.push(n),i.map(e=>new Ma(e,t.key,t.oldValue,t.newValue,t.baseVersion))}),xd(Ma,Na,(t,e)=>function(t,e){const i=vr._createFromPositionAndShift(e.sourcePosition,e.howMany);let n=null,o=[];i.containsRange(t,!0)?n=t:t.start.hasSameParentAs(i.start)?(o=t.getDifference(i),n=t.getIntersection(i)):o=[t];const s=[];for(let t of o){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const i=e.getMovedRangeStart(),n=t.start.hasSameParentAs(i);t=t._getTransformedByInsertion(i,e.howMany,n),s.push(...t)}n&&s.push(n._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,!1)[0]);return s}(t.range,e).map(e=>new Ma(e,t.key,t.oldValue,t.newValue,t.baseVersion))),xd(Ma,ja,(t,e)=>{if(t.range.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.range.end.offset++,[t];if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const i=t.clone();return i.range=new vr(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition)),t.range.end=e.splitPosition.clone(),t.range.end.stickiness="toPrevious",[t,i]}return t.range=t.range._getTransformedBySplitOperation(e),[t]}),xd(Oa,Ma,(t,e)=>{const i=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const n=Md(t,e.key,e.newValue);n&&i.push(n)}return i}),xd(Oa,Oa,(t,e,i)=>(t.position.isEqual(e.position)&&i.aIsStrong||(t.position=t.position._getTransformedByInsertOperation(e)),[t])),xd(Oa,Na,(t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t])),xd(Oa,ja,(t,e)=>(t.position=t.position._getTransformedBySplitOperation(e),[t])),xd(Oa,za,(t,e)=>(t.position=t.position._getTransformedByMergeOperation(e),[t])),xd(Ra,Oa,(t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]),t.newRange&&(t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]),[t])),xd(Ra,Ra,(t,e,i)=>{if(t.name==e.name){if(!i.aIsStrong)return[new nc(0)];t.oldRange=e.newRange?e.newRange.clone():null}return[t]}),xd(Ra,za,(t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByMergeOperation(e)),t.newRange&&(t.newRange=t.newRange._getTransformedByMergeOperation(e)),[t])),xd(Ra,Na,(t,e,i)=>{if(t.oldRange&&(t.oldRange=vr._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))),t.newRange){if(i.abRelation){const n=vr._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if("left"==i.abRelation.side&&e.targetPosition.isEqual(t.newRange.start))return t.newRange.start.path=i.abRelation.path,t.newRange.end=n.end,[t];if("right"==i.abRelation.side&&e.targetPosition.isEqual(t.newRange.end))return t.newRange.start=n.start,t.newRange.end.path=i.abRelation.path,[t]}t.newRange=vr._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]}),xd(Ra,ja,(t,e,i)=>{if(t.oldRange&&(t.oldRange=t.oldRange._getTransformedBySplitOperation(e)),t.newRange){if(i.abRelation){const n=t.newRange._getTransformedBySplitOperation(e);return t.newRange.start.isEqual(e.splitPosition)&&i.abRelation.wasStartBeforeMergedElement?t.newRange.start=_r._createAt(e.insertionPosition):t.newRange.start.isEqual(e.splitPosition)&&!i.abRelation.wasInLeftElement&&(t.newRange.start=_r._createAt(e.moveTargetPosition)),t.newRange.end.isEqual(e.splitPosition)&&i.abRelation.wasInRightElement?t.newRange.end=_r._createAt(e.moveTargetPosition):t.newRange.end.isEqual(e.splitPosition)&&i.abRelation.wasEndBeforeMergedElement?t.newRange.end=_r._createAt(e.insertionPosition):t.newRange.end=n.end,[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]}),xd(za,Oa,(t,e)=>(t.sourcePosition.hasSameParentAs(e.position)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e),t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e),[t])),xd(za,za,(t,e,i)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(i.bWasUndone){const i=e.graveyardPosition.path.slice();return i.push(0),t.sourcePosition=new _r(e.graveyardPosition.root,i),t.howMany=0,[t]}return[new nc(0)]}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!i.bWasUndone&&"splitAtSource"!=i.abRelation){const n="$graveyard"==t.targetPosition.root.rootName,o="$graveyard"==e.targetPosition.root.rootName,s=n&&!o;if(o&&!n||!s&&i.aIsStrong){const i=e.targetPosition._getTransformedByMergeOperation(e),n=t.targetPosition._getTransformedByMergeOperation(e);return[new Na(i,t.howMany,n,0)]}return[new nc(0)]}return t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),t.graveyardPosition.isEqual(e.graveyardPosition)&&i.aIsStrong||(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]}),xd(za,Na,(t,e,i)=>{const n=vr._createFromPositionAndShift(e.sourcePosition,e.howMany);return"remove"==e.type&&!i.bWasUndone&&!i.forceWeakRemove&&t.deletionPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.sourcePosition)?[new nc(0)]:(t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition.hasSameParentAs(e.sourcePosition)&&(t.howMany-=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e),t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e),t.graveyardPosition.isEqual(e.targetPosition)||(t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)),[t])}),xd(za,ja,(t,e,i)=>{if(e.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1),t.deletionPosition.isEqual(e.graveyardPosition)&&(t.howMany=e.howMany)),t.targetPosition.isEqual(e.splitPosition)){const n=0!=e.howMany,o=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(n||o||"mergeTargetNotMoved"==i.abRelation)return t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),[t]}if(t.sourcePosition.isEqual(e.splitPosition)){if("mergeSourceNotMoved"==i.abRelation)return t.howMany=0,t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t];if("mergeSameElement"==i.abRelation||t.sourcePosition.offset>0)return t.sourcePosition=e.moveTargetPosition.clone(),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}return t.sourcePosition.hasSameParentAs(e.splitPosition)&&(t.howMany=e.splitPosition.offset),t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}),xd(Na,Oa,(t,e)=>{const i=vr._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByInsertOperation(e,!1)[0];return t.sourcePosition=i.start,t.howMany=i.end.offset-i.start.offset,t.targetPosition.isEqual(e.position)||(t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)),[t]}),xd(Na,Na,(t,e,i)=>{const n=vr._createFromPositionAndShift(t.sourcePosition,t.howMany),o=vr._createFromPositionAndShift(e.sourcePosition,e.howMany);let s,r=i.aIsStrong,a=!i.aIsStrong;if("insertBefore"==i.abRelation||"insertAfter"==i.baRelation?a=!0:"insertAfter"!=i.abRelation&&"insertBefore"!=i.baRelation||(a=!1),s=t.targetPosition.isEqual(e.targetPosition)&&a?t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany):t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Id(t,e)&&Id(e,t))return[e.getReversed()];if(n.containsPosition(e.targetPosition)&&n.containsRange(o,!0))return n.start=n.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),n.end=n.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Nd([n],s);if(o.containsPosition(t.targetPosition)&&o.containsRange(n,!0))return n.start=n.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),n.end=n.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),Nd([n],s);const c=Ei(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if("prefix"==c||"extension"==c)return n.start=n.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),n.end=n.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),Nd([n],s);"remove"!=t.type||"remove"==e.type||i.aWasUndone||i.forceWeakRemove?"remove"==t.type||"remove"!=e.type||i.bWasUndone||i.forceWeakRemove||(r=!1):r=!0;const l=[],d=n.getDifference(o);for(const t of d){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany),t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const i="same"==Ei(t.start.getParentPath(),e.getMovedRangeStart().getParentPath()),n=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,i);l.push(...n)}const h=n.getIntersection(o);return null!==h&&r&&(h.start=h.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),h.end=h.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),0===l.length?l.push(h):1==l.length?o.start.isBefore(n.start)||o.start.isEqual(n.start)?l.unshift(h):l.push(h):l.splice(1,0,h)),0===l.length?[new nc(t.baseVersion)]:Nd(l,s)}),xd(Na,ja,(t,e,i)=>{let n=t.targetPosition.clone();t.targetPosition.isEqual(e.insertionPosition)&&e.graveyardPosition&&"moveTargetAfter"!=i.abRelation||(n=t.targetPosition._getTransformedBySplitOperation(e));const o=vr._createFromPositionAndShift(t.sourcePosition,t.howMany);if(o.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.howMany++,t.targetPosition=n,[t];if(o.start.hasSameParentAs(e.splitPosition)&&o.containsPosition(e.splitPosition)){let t=new vr(e.splitPosition,o.end);return t=t._getTransformedBySplitOperation(e),Nd([new vr(o.start,e.splitPosition),t],n)}t.targetPosition.isEqual(e.splitPosition)&&"insertAtSource"==i.abRelation&&(n=e.moveTargetPosition),t.targetPosition.isEqual(e.insertionPosition)&&"insertBetween"==i.abRelation&&(n=t.targetPosition);const s=[o._getTransformedBySplitOperation(e)];if(e.graveyardPosition){const n=o.start.isEqual(e.graveyardPosition)||o.containsPosition(e.graveyardPosition);t.howMany>1&&n&&!i.aWasUndone&&s.push(vr._createFromPositionAndShift(e.insertionPosition,1))}return Nd(s,n)}),xd(Na,za,(t,e,i)=>{const n=vr._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&n.containsPosition(e.sourcePosition))if("remove"!=t.type||i.forceWeakRemove){if(1==t.howMany)return i.bWasUndone?(t.sourcePosition=e.graveyardPosition.clone(),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]):[new nc(0)]}else if(!i.aWasUndone){const i=[];let n=e.graveyardPosition.clone(),o=e.targetPosition._getTransformedByMergeOperation(e);t.howMany>1&&(i.push(new Na(t.sourcePosition,t.howMany-1,t.targetPosition,0)),n=n._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1),o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1));const s=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition),r=new Na(n,1,s,0),a=r.getMovedRangeStart().path.slice();a.push(0);const c=new _r(r.targetPosition.root,a);o=o._getTransformedByMove(n,s,1);const l=new Na(o,e.howMany,c,0);return i.push(r),i.push(l),i}const o=vr._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByMergeOperation(e);return t.sourcePosition=o.start,t.howMany=o.end.offset-o.start.offset,t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]}),xd(La,Oa,(t,e)=>(t.position=t.position._getTransformedByInsertOperation(e),[t])),xd(La,za,(t,e)=>t.position.isEqual(e.deletionPosition)?(t.position=e.graveyardPosition.clone(),t.position.stickiness="toNext",[t]):(t.position=t.position._getTransformedByMergeOperation(e),[t])),xd(La,Na,(t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t])),xd(La,La,(t,e,i)=>{if(t.position.isEqual(e.position)){if(!i.aIsStrong)return[new nc(0)];t.oldName=e.newName}return[t]}),xd(La,ja,(t,e)=>{if("same"==Ei(t.position.path,e.splitPosition.getParentPath())&&!e.graveyardPosition){const e=new La(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}return t.position=t.position._getTransformedBySplitOperation(e),[t]}),xd(Da,Da,(t,e,i)=>{if(t.root===e.root&&t.key===e.key){if(!i.aIsStrong||t.newValue===e.newValue)return[new nc(0)];t.oldValue=e.newValue}return[t]}),xd(ja,Oa,(t,e)=>(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset{if(!t.graveyardPosition&&!i.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const i=e.graveyardPosition.path.slice();i.push(0);const n=new _r(e.graveyardPosition.root,i),o=ja.getInsertionPosition(new _r(e.graveyardPosition.root,i)),s=new ja(n,0,null,0);return s.insertionPosition=o,t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=ja.getInsertionPosition(t.splitPosition),t.graveyardPosition=s.insertionPosition.clone(),t.graveyardPosition.stickiness="toNext",[s,t]}return t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)&&t.howMany--,t.splitPosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=ja.getInsertionPosition(t.splitPosition),t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]}),xd(ja,Na,(t,e,i)=>{const n=vr._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const o=n.start.isEqual(t.graveyardPosition)||n.containsPosition(t.graveyardPosition);if(!i.bWasUndone&&o){const i=t.splitPosition._getTransformedByMoveOperation(e),n=t.graveyardPosition._getTransformedByMoveOperation(e),o=n.path.slice();o.push(0);const s=new _r(n.root,o);return[new Na(i,t.howMany,s,0)]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&n.containsPosition(t.splitPosition)){const i=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);return t.howMany-=i,t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition)return[new nc(0)];if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition))return[new nc(0)];if("splitBefore"==i.abRelation)return t.howMany=0,t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e),[t]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const n="$graveyard"==t.splitPosition.root.rootName,o="$graveyard"==e.splitPosition.root.rootName,s=n&&!o;if(o&&!n||!s&&i.aIsStrong){const i=[];return e.howMany&&i.push(new Na(e.moveTargetPosition,e.howMany,e.splitPosition,0)),t.howMany&&i.push(new Na(t.splitPosition,t.howMany,t.moveTargetPosition,0)),i}return[new nc(0)]}if(t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)),t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==i.abRelation)return t.howMany++,[t];if(e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==i.baRelation){const i=e.insertionPosition.path.slice();i.push(0);const n=new _r(e.insertionPosition.root,i);return[t,new Na(t.insertionPosition,1,n,0)]}return t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset0}addBatch(t){const e=this.editor.model.document.selection,i={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:i}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,i){const n=this.editor.model,o=n.document,s=[];for(const e of t){const t=Rd(e,i).find(t=>t.start.root!=o.graveyard);t&&s.push(t)}s.length&&n.change(t=>{t.setSelection(s,{backward:e})})}_undo(t,e){const i=this.editor.model,n=i.document;this._createdBatches.add(e);const o=t.operations.slice().filter(t=>t.isDocumentOperation);o.reverse();for(const t of o){const o=t.baseVersion+1,s=Array.from(n.history.getOperations(o)),r=Td([t.getReversed()],s,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(const o of r)e.addOperation(o),i.applyOperation(o),n.history.setOperationAsUndone(t,o)}}}function Rd(t,e){const i=t.getTransformedByOperations(e);i.sort((t,e)=>t.start.isBefore(e.start)?-1:1);for(let t=1;te.batch==t):this._stack.length-1,i=this._stack.splice(e,1)[0],n=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(n,()=>{this._undo(i.batch,n);const t=this.editor.model.document.history.getOperations(i.batch.baseVersion);this._restoreSelection(i.selection.ranges,i.selection.isBackward,t),this.fire("revert",i.batch,n)}),this.refresh()}}class Dd extends Od{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch("transparent");this.editor.model.enqueueChange(e,()=>{const i=t.batch.operations[t.batch.operations.length-1].baseVersion+1,n=this.editor.model.document.history.getOperations(i);this._restoreSelection(t.selection.ranges,t.selection.isBackward,n),this._undo(t.batch,e)}),this.refresh()}}class zd extends ql{static get pluginName(){return"UndoEditing"}constructor(t){super(t),this._batchRegistry=new WeakSet}init(){const t=this.editor;this._undoCommand=new Ld(t),this._redoCommand=new Dd(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",(t,e)=>{const i=e[0];if(!i.isDocumentOperation)return;const n=i.batch,o=this._redoCommand._createdBatches.has(n),s=this._undoCommand._createdBatches.has(n);this._batchRegistry.has(n)||"transparent"==n.type&&!o&&!s||(o?this._undoCommand.addBatch(n):s||(this._undoCommand.addBatch(n),this._redoCommand.clearStack()),this._batchRegistry.add(n))},{priority:"highest"}),this.listenTo(this._undoCommand,"revert",(t,e,i)=>{this._redoCommand.addBatch(i)}),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo")}}var jd=' ',Vd=' ';class Bd extends ql{init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?jd:Vd,o="ltr"==e.uiLanguageDirection?Vd:jd;this._addButton("undo",i("di"),"CTRL+Z",n),this._addButton("redo",i("dj"),"CTRL+Y",o)}_addButton(t,e,i,n){const o=this.editor;o.ui.componentFactory.add(t,s=>{const r=o.commands.get(t),a=new El(s);return a.set({label:e,icon:n,keystroke:i,tooltip:!0}),a.bind("isEnabled").to(r,"isEnabled"),this.listenTo(a,"execute",()=>{o.execute(t),o.editing.view.focus()}),a})}}class Fd extends ql{static get requires(){return[zd,Bd]}static get pluginName(){return"Undo"}}class Hd{constructor(t){this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}vi(Hd,Hn);class Ud extends Hd{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new yi({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(t){if("string"!=typeof t)throw new hi.b("pendingactions-add-invalid-message: The message must be a string.",this);const e=Object.create(Hn);return e.set("message",t),this._actions.add(e),this.hasAny=!0,e}remove(t){this._actions.remove(t),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}class Wd{constructor(){const t=new window.FileReader;this._reader=t,this._data=void 0,this.set("loaded",0),t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;return this.total=t.size,new Promise((i,n)=>{e.onload=()=>{const t=e.result;this._data=t,i(t)},e.onerror=()=>{n("error")},e.onabort=()=>{n("aborted")},this._reader.readAsDataURL(t)})}abort(){this._reader.abort()}}vi(Wd,Hn);class qd extends ql{static get pluginName(){return"FileRepository"}static get requires(){return[Ud]}init(){this.loaders=new yi,this.loaders.on("add",()=>this._updatePendingAction()),this.loaders.on("remove",()=>this._updatePendingAction()),this._loadersMap=new Map,this._pendingAction=null,this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",(t,e)=>e?t/e*100:0)}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter)return console.warn(Object(hi.a)("filerepository-no-upload-adapter: Upload adapter is not defined.")),null;const e=new $d(Promise.resolve(t),this.createUploadAdapter);return this.loaders.add(e),this._loadersMap.set(t,e),t instanceof Promise&&e.file.then(t=>{this._loadersMap.set(t,e)}).catch(()=>{}),e.on("change:uploaded",()=>{let t=0;for(const e of this.loaders)t+=e.uploaded;this.uploaded=t}),e.on("change:uploadTotal",()=>{let t=0;for(const e of this.loaders)e.uploadTotal&&(t+=e.uploadTotal);this.uploadTotal=t}),e}destroyLoader(t){const e=t instanceof $d?t:this.getLoader(t);e._destroy(),this.loaders.remove(e),this._loadersMap.forEach((t,i)=>{t===e&&this._loadersMap.delete(i)})}_updatePendingAction(){const t=this.editor.plugins.get(Ud);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t,i=t=>`${e("ai")} ${parseInt(t)}%.`;this._pendingAction=t.add(i(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",i)}}else t.remove(this._pendingAction),this._pendingAction=null}}vi(qd,Hn);class $d{constructor(t,e){this.id=li(),this._filePromiseWrapper=this._createFilePromiseWrapper(t),this._adapter=e(this),this._reader=new Wd,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",(t,e)=>e?t/e*100:0),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then(t=>this._filePromiseWrapper?t:null):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new hi.b("filerepository-read-wrong-status: You cannot call read if the status is different than idle.",this);return this.status="reading",this.file.then(t=>this._reader.read(t)).then(t=>(this.status="idle",t)).catch(t=>{if("aborted"===t)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:t})}upload(){if("idle"!=this.status)throw new hi.b("filerepository-upload-wrong-status: You cannot call upload if the status is different than idle.",this);return this.status="uploading",this.file.then(()=>this._adapter.upload()).then(t=>(this.uploadResponse=t,this.status="idle",t)).catch(t=>{if("aborted"===this.status)throw"aborted";throw this.status="error",t})}abort(){const t=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==t?this._reader.abort():"uploading"==t&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch(()=>{}),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(t){const e={};return e.promise=new Promise((i,n)=>{e.rejecter=n,e.isFulfilled=!1,t.then(t=>{e.isFulfilled=!0,i(t)}).catch(t=>{e.isFulfilled=!0,n(t)})}),e}}vi($d,Hn);function Yd(){let t=function(t){t=t.toLowerCase();const e=document.cookie.split(";");for(const i of e){const e=i.split("=");if(decodeURIComponent(e[0].trim().toLowerCase())===t)return decodeURIComponent(e[1])}return null}("ckCsrfToken");var e,i;return t&&40==t.length||(t=function(t){let e="";const i=new Uint8Array(t);window.crypto.getRandomValues(i);for(let t=0;t.5?n.toUpperCase():n}return e}(40),e="ckCsrfToken",i=t,document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(i)+";path=/"),t}class Gd extends ql{static get requires(){return[qd]}static get pluginName(){return"CKFinderUploadAdapter"}init(){const t=this.editor.config.get("ckfinder.uploadUrl");t&&(this.editor.plugins.get(qd).createUploadAdapter=e=>new Qd(e,t,this.editor.t))}}class Qd{constructor(t,e,i){this.loader=t,this.url=e,this.t=i}upload(){return this.loader.file.then(t=>new Promise((e,i)=>{this._initRequest(),this._initListeners(e,i,t),this._sendRequest(t)}))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.url,!0),t.responseType="json"}_initListeners(t,e,i){const n=this.xhr,o=this.loader,s=(0,this.t)("a")+` ${i.name}.`;n.addEventListener("error",()=>e(s)),n.addEventListener("abort",()=>e()),n.addEventListener("load",()=>{const i=n.response;if(!i||!i.uploaded)return e(i&&i.error&&i.error.message?i.error.message:s);t({default:i.url})}),n.upload&&n.upload.addEventListener("progress",t=>{t.lengthComputable&&(o.uploadTotal=t.total,o.uploaded=t.loaded)})}_sendRequest(t){const e=new FormData;e.append("upload",t),e.append("ckCsrfToken",Yd()),this.xhr.send(e)}}class Kd{static get pluginName(){return"BlockAutoformatEditing"}constructor(t,e,i){let n,o=null;"function"==typeof i?n=i:(o=t.commands.get(i),n=()=>{t.execute(i)}),t.model.document.on("change",(i,s)=>{if(o&&!o.isEnabled)return;if("transparent"==s.type)return;const r=Array.from(t.model.document.differ.getChanges()),a=r[0];if(1!=r.length||"insert"!==a.type||"$text"!=a.name||1!=a.length)return;const c=a.position.parent;if(!c.is("paragraph")||1!==c.childCount)return;const l=e.exec(c.getChild(0).data);l&&t.model.enqueueChange(t=>{const e=t.createPositionAt(c,0),i=t.createPositionAt(c,l[0].length),o=new Nr(e,i);!1!==n({match:l})&&t.remove(o),o.detach()})})}}class Jd{static get pluginName(){return"InlineAutoformatEditing"}constructor(t,e,i){let n,o,s,r;e instanceof RegExp?n=e:s=e,"string"==typeof i?o=i:r=i,s=s||(t=>{let e;const i=[],o=[];for(;null!==(e=n.exec(t))&&!(e&&e.length<4);){let{index:t,1:n,2:s,3:r}=e;const a=n+s+r;t+=e[0].length-a.length;const c=[t,t+n.length],l=[t+n.length+s.length,t+n.length+s.length+r.length];i.push(c),i.push(l),o.push([t+n.length,t+n.length+s.length])}return{remove:i,format:o}}),r=r||((e,i)=>{const n=t.model.schema.getValidRanges(i,o);for(const t of n)e.setAttribute(o,!0,t);e.removeSelectionAttribute(o)}),t.model.document.on("change",(e,i)=>{if("transparent"==i.type)return;const n=t.model,o=n.document.selection;if(!o.isCollapsed)return;const a=Array.from(n.document.differ.getChanges()),c=a[0];if(1!=a.length||"insert"!==c.type||"$text"!=c.name||1!=c.length)return;const l=o.focus,d=l.parent,{text:h,range:u}=function(t,e){let i=t.start;return{text:Array.from(t.getItems()).reduce((t,n)=>n.is("text")||n.is("textProxy")?t+n.data:(i=e.createPositionAfter(n),""),""),range:e.createRange(i,t.end)}}(n.createRange(n.createPositionAt(d,0),l),n),f=s(h),m=Zd(u.start,f.format,n),g=Zd(u.start,f.remove,n);m.length&&g.length&&n.enqueueChange(t=>{if(!1!==r(t,m))for(const e of g.reverse())t.remove(e)})})}}function Zd(t,e,i){return e.filter(t=>void 0!==t[0]&&void 0!==t[1]).map(e=>i.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1])))}function Xd(t,e){return(i,n)=>{if(!t.commands.get(e).isEnabled)return!1;const o=t.model.schema.getValidRanges(n,e);for(const t of o)i.setAttribute(e,!0,t);i.removeSelectionAttribute(e)}}class th extends Jl{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=void 0===t.forceValue?!this.value:t.forceValue;e.change(t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const o=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of o)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}})}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,i=t.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const t of i.getRanges())for(const i of t.getItems())if(e.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}class eh extends ql{static get pluginName(){return"BoldEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"bold"}),t.model.schema.setAttributeProperties("bold",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"bold",view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e?"bold"==e||Number(e)>=600?{name:!0,styles:["font-weight"]}:void 0:null}]}),t.commands.add("bold",new th(t,"bold")),t.keystrokes.set("CTRL+B","bold")}}class ih extends ql{init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("bold",i=>{const n=t.commands.get("bold"),o=new El(i);return o.set({label:e("g"),icon:' ',keystroke:"CTRL+B",tooltip:!0,isToggleable:!0}),o.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(o,"execute",()=>{t.execute("bold"),t.editing.view.focus()}),o})}}class nh extends ql{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:"italic"}),t.model.schema.setAttributeProperties("italic",{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:"italic",view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add("italic",new th(t,"italic")),t.keystrokes.set("CTRL+I","italic")}}class oh extends ql{init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("italic",i=>{const n=t.commands.get("italic"),o=new El(i);return o.set({label:e("d"),icon:' ',keystroke:"CTRL+I",tooltip:!0,isToggleable:!0}),o.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(o,"execute",()=>{t.execute("italic"),t.editing.view.focus()}),o})}}function sh(t){const e=t.next();return e.done?null:e.value}class rh extends Jl{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,i=e.schema,n=e.document.selection,o=Array.from(n.getSelectedBlocks()),s=void 0===t.forceValue?!this.value:t.forceValue;e.change(t=>{if(s){const e=o.filter(t=>ah(t)||lh(i,t));this._applyQuote(t,e)}else this._removeQuote(t,o.filter(ah))})}_getValue(){const t=sh(this.editor.model.document.selection.getSelectedBlocks());return!(!t||!ah(t))}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,i=sh(t.getSelectedBlocks());return!!i&&lh(e,i)}_removeQuote(t,e){ch(t,e).reverse().forEach(e=>{if(e.start.isAtStart&&e.end.isAtEnd)return void t.unwrap(e.start.parent);if(e.start.isAtStart){const i=t.createPositionBefore(e.start.parent);return void t.move(e,i)}e.end.isAtEnd||t.split(e.end);const i=t.createPositionAfter(e.end.parent);t.move(e,i)})}_applyQuote(t,e){const i=[];ch(t,e).reverse().forEach(e=>{let n=ah(e.start);n||(n=t.createElement("blockQuote"),t.wrap(e,n)),i.push(n)}),i.reverse().reduce((e,i)=>e.nextSibling==i?(t.merge(t.createPositionAfter(e)),e):i)}}function ah(t){return"blockQuote"==t.parent.name?t.parent:null}function ch(t,e){let i,n=0;const o=[];for(;n{if(t.endsWith("blockQuote")&&"blockQuote"==e.name)return!1}),t.conversion.elementToElement({model:"blockQuote",view:"blockquote"}),t.model.document.registerPostFixer(i=>{const n=t.model.document.differ.getChanges();for(const t of n)if("insert"==t.type){const n=t.position.nodeAfter;if(!n)continue;if(n.is("blockQuote")&&n.isEmpty)return i.remove(n),!0;if(n.is("blockQuote")&&!e.checkChild(t.position,n))return i.unwrap(n),!0;if(n.is("element")){const t=i.createRangeIn(n);for(const n of t.getItems())if(n.is("blockQuote")&&!e.checkChild(i.createPositionBefore(n),n))return i.unwrap(n),!0}}else if("remove"==t.type){const e=t.position.parent;if(e.is("blockQuote")&&e.isEmpty)return i.remove(e),!0}return!1})}afterInit(){const t=this.editor.commands.get("blockQuote");this.listenTo(this.editor.editing.view.document,"enter",(e,i)=>{const n=this.editor.model.document,o=n.selection.getLastPosition().parent;n.selection.isCollapsed&&o.isEmpty&&t.value&&(this.editor.execute("blockQuote"),this.editor.editing.view.scrollToTheSelection(),i.preventDefault(),e.stop())})}}i(44);class hh extends ql{init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("blockQuote",i=>{const n=t.commands.get("blockQuote"),o=new El(i);return o.set({label:e("k"),icon:' ',tooltip:!0,isToggleable:!0}),o.bind("isOn","isEnabled").to(n,"value","isEnabled"),this.listenTo(o,"execute",()=>{t.execute("blockQuote"),t.editing.view.focus()}),o})}}class uh extends ql{static get pluginName(){return"CKFinderUI"}init(){const t=this.editor,e=t.ui.componentFactory,i=t.t;e.add("ckfinder",e=>{const n=t.commands.get("ckfinder"),o=new El(e);return o.set({label:i("t"),icon:' ',tooltip:!0}),o.bind("isEnabled").to(n),o.on("execute",()=>{t.execute("ckfinder"),t.editing.view.focus()}),o})}}class fh extends us{observe(t){this.listenTo(t,"load",(t,e)=>{"IMG"==e.target.tagName&&this._fireEvents(e)},{useCapture:!0})}_fireEvents(t){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",t))}}function mh(t){return i=>{i.on(`attribute:${t}:image`,e)};function e(t,e,i){if(!i.consumable.consume(e.item,t.name))return;const n=i.writer,o=i.mapper.toViewElement(e.item).getChild(0);null!==e.attributeNewValue?n.setAttribute(e.attributeKey,e.attributeNewValue,o):n.removeAttribute(e.attributeKey,o)}}class gh{constructor(){this._stack=[]}add(t,e){const i=this._stack,n=i[0];this._insertDescriptor(t);const o=i[0];n===o||ph(n,o)||this.fire("change:top",{oldDescriptor:n,newDescriptor:o,writer:e})}remove(t,e){const i=this._stack,n=i[0];this._removeDescriptor(t);const o=i[0];n===o||ph(n,o)||this.fire("change:top",{oldDescriptor:n,newDescriptor:o,writer:e})}_insertDescriptor(t){const e=this._stack,i=e.findIndex(e=>e.id===t.id);if(ph(t,e[i]))return;i>-1&&e.splice(i,1);let n=0;for(;e[n]&&bh(e[n],t);)n++;e.splice(n,0,t)}_removeDescriptor(t){const e=this._stack,i=e.findIndex(e=>e.id===t);i>-1&&e.splice(i,1)}}function ph(t,e){return t&&e&&t.priority==e.priority&&wh(t.classes)==wh(e.classes)}function bh(t,e){return t.priority>e.priority||!(t.prioritywh(e.classes)}function wh(t){return Array.isArray(t)?t.sort().join(","):t}vi(gh,mi);function kh(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function _h(t,e,i={}){return fo.isEdge||e.setAttribute("contenteditable","false",t),e.addClass("ck-widget",t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=Ah,i.label&&function(t,e,i){i.setCustomProperty("widgetLabel",e,t)}(t,i.label,e),i.hasSelectionHandle&&function(t,e){const i=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),i=new Pl;return i.set("content",' '),i.render(),e.appendChild(i.element),e}));e.insert(e.createPositionAt(t,0),i),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),function(t,e,i,n){const o=new gh;o.on("change:top",(e,o)=>{o.oldDescriptor&&n(t,o.oldDescriptor,o.writer),o.newDescriptor&&i(t,o.newDescriptor,o.writer)}),e.setCustomProperty("addHighlight",(t,e,i)=>o.add(e,i),t),e.setCustomProperty("removeHighlight",(t,e,i)=>o.remove(e,i),t)}(t,e,(t,e,i)=>i.addClass(n(e.classes),t),(t,e,i)=>i.removeClass(n(e.classes),t)),t;function n(t){return Array.isArray(t)?t:[t]}}function vh(t){const e=t.getCustomProperty("widgetLabel");return e?"function"==typeof e?e():e:""}function yh(t,e){return e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t),fo.isEdge||(e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t),t.on("change:isReadOnly",(i,n,o)=>{e.setAttribute("contenteditable",o?"false":"true",t)})),t.on("change:isFocused",(i,n,o)=>{o?e.addClass("ck-editor__nested-editable_focused",t):e.removeClass("ck-editor__nested-editable_focused",t)}),t}function xh(t,e){const i=t.getSelectedElement();if(i&&e.schema.isBlock(i))return e.createPositionAfter(i);const n=t.getSelectedBlocks().next().value;if(n){if(n.isEmpty)return e.createPositionAt(n,0);const i=e.createPositionAfter(n);return t.focus.isTouching(i)?i:e.createPositionBefore(n)}return t.focus}function Ah(){return null}function Ch(t){const e=t.getSelectedElement();return e&&function(t){return!!t.getCustomProperty("image")&&kh(t)}(e)?e:null}function Th(t){return!!t&&t.is("image")}function Ph(t,e,i={}){const n=t.createElement("image",i),o=xh(e.document.selection,e);e.insertContent(n,o),n.parent&&t.setSelection(n,"on")}function Sh(t){const e=t.schema,i=t.document.selection;return function(t,e,i){const n=function(t,e){const i=xh(t,e).parent;if(i.isEmpty&&!i.is("$root"))return i.parent;return i}(t,i);return e.checkChild(n,"image")}(i,e,t)&&!function(t,e){const i=t.getSelectedElement();return i&&e.isObject(i)}(i,e)&&function(t){return[...t.focus.getAncestors()].every(t=>!t.is("image"))}(i)}class Eh extends Jl{refresh(){this.isEnabled=Sh(this.editor.model)}execute(t){const e=this.editor.model;e.change(i=>{const n=Array.isArray(t.source)?t.source:[t.source];for(const t of n)Ph(i,e,{src:t})})}}class Mh extends ql{static get pluginName(){return"ImageEditing"}init(){const t=this.editor,e=t.model.schema,i=t.t,n=t.conversion;t.editing.view.addObserver(fh),e.register("image",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["alt","src","srcset"]}),n.for("dataDowncast").elementToElement({model:"image",view:(t,e)=>Ih(e)}),n.for("editingDowncast").elementToElement({model:"image",view:(t,e)=>{return n=Ih(e),o=e,s=i("s"),o.setCustomProperty("image",!0,n),_h(n,o,{label:function(){const t=n.getChild(0).getAttribute("alt");return t?`${t} ${s}`:s}});var n,o,s}}),n.for("downcast").add(mh("src")).add(mh("alt")).add(function(){return e=>{e.on("attribute:srcset:image",t)};function t(t,e,i){if(!i.consumable.consume(e.item,t.name))return;const n=i.writer,o=i.mapper.toViewElement(e.item).getChild(0);if(null===e.attributeNewValue){const t=e.attributeOldValue;t.data&&(n.removeAttribute("srcset",o),n.removeAttribute("sizes",o),t.width&&n.removeAttribute("width",o))}else{const t=e.attributeNewValue;t.data&&(n.setAttribute("srcset",t.data,o),n.setAttribute("sizes","100vw",o),t.width&&n.setAttribute("width",t.width,o))}}}()),n.for("upcast").elementToElement({view:{name:"img",attributes:{src:!0}},model:(t,e)=>e.createElement("image",{src:t.getAttribute("src")})}).attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:{key:"srcset",value:t=>{const e={data:t.getAttribute("srcset")};return t.hasAttribute("width")&&(e.width=t.getAttribute("width")),e}}}).add(function(){return e=>{e.on("element:figure",t)};function t(t,e,i){if(!i.consumable.test(e.viewItem,{name:!0,classes:"image"}))return;const n=Array.from(e.viewItem.getChildren()).find(t=>t.is("img"));if(!n||!n.hasAttribute("src")||!i.consumable.test(n,{name:!0}))return;const o=i.convertItem(n,e.modelCursor),s=sh(o.modelRange.getItems());s&&(i.convertChildren(e.viewItem,i.writer.createPositionAt(s,0)),e.modelRange=o.modelRange,e.modelCursor=o.modelCursor)}}()),t.commands.add("imageInsert",new Eh(t))}}function Ih(t){const e=t.createEmptyElement("img"),i=t.createContainerElement("figure",{class:"image"});return t.insert(t.createPositionAt(i,0),e),i}function Nh(t,e,i){return i.createRange(Oh(t,e,!0,i),Oh(t,e,!1,i))}function Oh(t,e,i,n){let o=t.textNode||(i?t.nodeBefore:t.nodeAfter),s=null;for(;o&&o.getAttribute("linkHref")==e;)s=o,o=i?o.previousSibling:o.nextSibling;return s?n.createPositionAt(s,i?"before":"after"):t}class Rh extends Jl{constructor(t){super(t),this.manualDecorators=new yi}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document;this.value=e.selection.getAttribute("linkHref");for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id);this.isEnabled=t.schema.checkAttributeInSelection(e.selection,"linkHref")}execute(t,e={}){const i=this.editor.model,n=i.document.selection,o=[],s=[];for(const t in e)e[t]?o.push(t):s.push(t);i.change(e=>{if(n.isCollapsed){const r=n.getFirstPosition();if(n.hasAttribute("linkHref")){const a=Nh(r,n.getAttribute("linkHref"),i);e.setAttribute("linkHref",t,a),o.forEach(t=>{e.setAttribute(t,!0,a)}),s.forEach(t=>{e.removeAttribute(t,a)}),e.setSelection(a)}else if(""!==t){const s=Li(n.getAttributes());s.set("linkHref",t),o.forEach(t=>{s.set(t,!0)});const a=e.createText(t,s);i.insertContent(a,r),e.setSelection(e.createRangeOn(a))}}else{const r=i.schema.getValidRanges(n.getRanges(),"linkHref");for(const i of r)e.setAttribute("linkHref",t,i),o.forEach(t=>{e.setAttribute(t,!0,i)}),s.forEach(t=>{e.removeAttribute(t,i)})}})}_getDecoratorStateFromModel(t){return this.editor.model.document.selection.getAttribute(t)||!1}}class Lh extends Jl{refresh(){this.isEnabled=this.editor.model.document.selection.hasAttribute("linkHref")}execute(){const t=this.editor,e=this.editor.model,i=e.document.selection,n=t.commands.get("link");e.change(t=>{const o=i.isCollapsed?[Nh(i.getFirstPosition(),i.getAttribute("linkHref"),e)]:i.getRanges();for(const e of o)if(t.removeAttribute("linkHref",e),n)for(const i of n.manualDecorators)t.removeAttribute(i.id,e)})}}var Dh=function(t,e,i){var n=t.length;return i=void 0===i?n:i,!e&&i>=n?t:nn(t,e,i)},zh=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var jh=function(t){return zh.test(t)};var Vh=function(t){return t.split("")},Bh="[\\ud800-\\udfff]",Fh="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",Hh="\\ud83c[\\udffb-\\udfff]",Uh="[^\\ud800-\\udfff]",Wh="(?:\\ud83c[\\udde6-\\uddff]){2}",qh="[\\ud800-\\udbff][\\udc00-\\udfff]",$h="(?:"+Fh+"|"+Hh+")"+"?",Yh="[\\ufe0e\\ufe0f]?"+$h+("(?:\\u200d(?:"+[Uh,Wh,qh].join("|")+")[\\ufe0e\\ufe0f]?"+$h+")*"),Gh="(?:"+[Uh+Fh+"?",Fh,Wh,qh,Bh].join("|")+")",Qh=RegExp(Hh+"(?="+Hh+")|"+Gh+Yh,"g");var Kh=function(t){return t.match(Qh)||[]};var Jh=function(t){return jh(t)?Kh(t):Vh(t)};var Zh=function(t){return function(e){e=Ji(e);var i=jh(e)?Jh(e):void 0,n=i?i[0]:e.charAt(0),o=i?Dh(i,1).join(""):e.slice(1);return n[t]()+o}}("toUpperCase");const Xh=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,tu=/^(?:(?:https?|ftps?|mailto):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))/i;function eu(t,e){const i=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,i),i}function iu(t){return function(t){return t.replace(Xh,"").match(tu)}(t=String(t))?t:"#"}class nu{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach(t=>this._definitions.add(t)):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",(t,e,i)=>{if(!i.consumable.test(e.item,"attribute:linkHref"))return;const n=i.writer,o=n.document.selection;for(const t of this._definitions){const s=n.createAttributeElement("a",t.attributes,{priority:5});n.setCustomProperty("link",!0,s),t.callback(e.attributeNewValue)?e.item.is("selection")?n.wrap(o.getFirstRange(),s):n.wrap(i.mapper.toViewRange(e.range),s):n.unwrap(i.mapper.toViewRange(e.range),s)}},{priority:"high"})}}}class ou{constructor({id:t,label:e,attributes:i}){this.id=t,this.set("value"),this.label=e,this.attributes=i}}vi(ou,Hn);class su{constructor(t,e,i){this.model=t,this.attribute=i,this._modelSelection=t.document.selection,this._overrideUid=null,this._isNextGravityRestorationSkipped=!1,e.listenTo(this._modelSelection,"change:range",(t,e)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!e.directChange&&ru(this._modelSelection.getFirstPosition(),i)||this._restoreGravity())})}handleForwardMovement(t,e){const i=this.attribute;if(!(this._isGravityOverridden||t.isAtStart&&this._hasSelectionAttribute))return lu(t,i)&&this._hasSelectionAttribute?(this._preventCaretMovement(e),this._removeSelectionAttribute(),!0):au(t,i)||cu(t,i)&&this._hasSelectionAttribute?(this._preventCaretMovement(e),this._overrideGravity(),!0):void 0}handleBackwardMovement(t,e){const i=this.attribute;return this._isGravityOverridden?lu(t,i)&&this._hasSelectionAttribute?(this._preventCaretMovement(e),this._restoreGravity(),this._removeSelectionAttribute(),!0):(this._preventCaretMovement(e),this._restoreGravity(),t.isAtStart&&this._removeSelectionAttribute(),!0):lu(t,i)&&!this._hasSelectionAttribute?(this._preventCaretMovement(e),this._setSelectionAttributeFromTheNodeBefore(t),!0):t.isAtEnd&&cu(t,i)?this._hasSelectionAttribute?void(du(t,i)&&(this._skipNextAutomaticGravityRestoration(),this._overrideGravity())):(this._preventCaretMovement(e),this._setSelectionAttributeFromTheNodeBefore(t),!0):t.isAtStart?this._hasSelectionAttribute?(this._removeSelectionAttribute(),this._preventCaretMovement(e),!0):void 0:void(du(t,i)&&(this._skipNextAutomaticGravityRestoration(),this._overrideGravity()))}get _isGravityOverridden(){return!!this._overrideUid}get _hasSelectionAttribute(){return this._modelSelection.hasAttribute(this.attribute)}_overrideGravity(){this._overrideUid=this.model.change(t=>t.overrideSelectionGravity())}_restoreGravity(){this.model.change(t=>{t.restoreSelectionGravity(this._overrideUid),this._overrideUid=null})}_preventCaretMovement(t){t.preventDefault()}_removeSelectionAttribute(){this.model.change(t=>{t.removeSelectionAttribute(this.attribute)})}_setSelectionAttributeFromTheNodeBefore(t){const e=this.attribute;this.model.change(i=>{i.setSelectionAttribute(this.attribute,t.nodeBefore.getAttribute(e))})}_skipNextAutomaticGravityRestoration(){this._isNextGravityRestorationSkipped=!0}}function ru(t,e){return au(t,e)||cu(t,e)}function au(t,e){const{nodeBefore:i,nodeAfter:n}=t,o=!!i&&i.hasAttribute(e);return!!n&&n.hasAttribute(e)&&(!o||i.getAttribute(e)!==n.getAttribute(e))}function cu(t,e){const{nodeBefore:i,nodeAfter:n}=t,o=!!i&&i.hasAttribute(e),s=!!n&&n.hasAttribute(e);return o&&(!s||i.getAttribute(e)!==n.getAttribute(e))}function lu(t,e){const{nodeBefore:i,nodeAfter:n}=t,o=!!i&&i.hasAttribute(e);if(!!n&&n.hasAttribute(e)&&o)return n.getAttribute(e)!==i.getAttribute(e)}function du(t,e){return ru(t.getShiftedBy(-1),e)}i(46);const hu=/^(https?:)?\/\//;class uu extends ql{static get pluginName(){return"LinkEditing"}constructor(t){super(t),t.config.define("link",{addTargetToExternalLinks:!1})}init(){const t=this.editor,e=t.locale;t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:eu}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,e)=>eu(iu(t),e)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new Rh(t)),t.commands.add("unlink",new Lh(t));const i=function(t,e){const i={"Open in a new tab":t("dg"),Downloadable:t("dh")};return e.forEach(t=>(t.label&&i[t.label]&&(t.label=i[t.label]),t)),e}(t.t,function(t){const e=[];if(t)for(const[i,n]of Object.entries(t)){const t=Object.assign({},n,{id:`link${Zh(i)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(i.filter(t=>"automatic"===t.mode)),this._enableManualDecorators(i.filter(t=>"manual"===t.mode)),function({view:t,model:e,emitter:i,attribute:n,locale:o}){const s=new su(e,i,n),r=e.document.selection;i.listenTo(t.document,"keydown",(t,e)=>{if(!r.isCollapsed)return;if(e.shiftKey||e.altKey||e.ctrlKey)return;const i=e.keyCode==po.arrowright,n=e.keyCode==po.arrowleft;if(!i&&!n)return;const a=r.getFirstPosition(),c=o.contentLanguageDirection;let l;l="ltr"===c&&i||"rtl"===c&&n?s.handleForwardMovement(a,e):s.handleBackwardMovement(a,e),l&&t.stop()},{priority:di.get("high")+1})}({view:t.editing.view,model:t.model,emitter:this,attribute:"linkHref",locale:e}),this._setupLinkHighlight()}_enableAutomaticDecorators(t){const e=this.editor,i=new nu;e.config.get("link.addTargetToExternalLinks")&&i.add({id:"linkIsExternal",mode:"automatic",callback:t=>hu.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),i.add(t),i.length&&e.conversion.for("downcast").add(i.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,i=e.commands.get("link").manualDecorators;t.forEach(t=>{e.model.schema.extend("$text",{allowAttributes:t.id}),i.add(new ou(t)),e.conversion.for("downcast").attributeToElement({model:t.id,view:(e,n)=>{if(e){const e=i.get(t.id).attributes,o=n.createAttributeElement("a",e,{priority:5});return n.setCustomProperty("link",!0,o),o}}}),e.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:i.get(t.id).attributes},model:{key:t.id}})})}_setupLinkHighlight(){const t=this.editor,e=t.editing.view,i=new Set;e.document.registerPostFixer(e=>{const n=t.model.document.selection;let o=!1;if(n.hasAttribute("linkHref")){const s=Nh(n.getFirstPosition(),n.getAttribute("linkHref"),t.model),r=t.editing.mapper.toViewRange(s);for(const t of r.getItems())t.is("a")&&!t.hasClass("ck-link_selected")&&(e.addClass("ck-link_selected",t),i.add(t),o=!0)}return o}),t.conversion.for("editingDowncast").add(t=>{function n(){e.change(t=>{for(const e of i.values())t.removeClass("ck-link_selected",e),i.delete(e)})}t.on("insert",n,{priority:"highest"}),t.on("remove",n,{priority:"highest"}),t.on("attribute",n,{priority:"highest"}),t.on("selection",n,{priority:"highest"})})}}class fu extends Hd{static get pluginName(){return"Notification"}init(){this.on("show:warning",(t,e)=>{window.alert(e.message)},{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=`show:${t.type}`+(t.namespace?`:${t.namespace}`:"");this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class mu extends Jl{constructor(t){super(t),this.stopListening(this.editor.model.document,"change"),this.listenTo(this.editor.model.document,"change",()=>this.refresh(),{priority:"low"})}refresh(){const t=this.editor.commands.get("imageInsert"),e=this.editor.commands.get("link");this.isEnabled=t.isEnabled||e.isEnabled}execute(){const t=this.editor,e=this.editor.config.get("ckfinder.openerMethod")||"modal";if("popup"!=e&&"modal"!=e)throw new hi.b('ckfinder-unknown-openerMethod: The openerMethod config option must by "popup" or "modal".',t);const i=this.editor.config.get("ckfinder.options")||{};i.chooseFiles=!0;const n=i.onInit;i.language||(i.language=t.locale.uiLanguage),i.onInit=e=>{n&&n(e),e.on("files:choose",i=>{const n=i.data.files.toArray(),o=n.filter(t=>!t.isImage()),s=n.filter(t=>t.isImage());for(const e of o)t.execute("link",e.getUrl());const r=[];for(const t of s){const i=t.getUrl();r.push(i||e.request("file:getProxyUrl",{file:t}))}r.length&&gu(t,r)}),e.on("file:choose:resizedImage",e=>{const i=e.data.resizedUrl;if(i)gu(t,[i]);else{const e=t.plugins.get("Notification"),i=t.locale.t;e.showWarning(i("bj"),{title:i("bk"),namespace:"ckfinder"})}})},window.CKFinder[e](i)}}function gu(t,e){if(t.commands.get("imageInsert").isEnabled)t.execute("imageInsert",{source:e});else{const e=t.plugins.get("Notification"),i=t.locale.t;e.showWarning(i("bl"),{title:i("bm"),namespace:"ckfinder"})}}class pu extends ql{static get pluginName(){return"CKFinderEditing"}static get requires(){return[fu,Mh,uu]}init(){const t=this.editor;t.commands.add("ckfinder",new mu(t))}}const bu=/^data:(\S*?);base64,/;class wu{constructor(t,e,i){if(!t)throw new hi.b("fileuploader-missing-file: File must be provided as the first argument",null);if(!e)throw new hi.b("fileuploader-missing-token: Token must be provided as the second argument.",null);if(!i)throw new hi.b("fileuploader-missing-api-address: Api address must be provided as the third argument.",null);this.file=function(t){if("string"!=typeof t)return!1;const e=t.match(bu);return!(!e||!e.length)}(t)?function(t,e=512){try{const i=t.match(bu)[1],n=atob(t.replace(bu,"")),o=[];for(let t=0;tt(i)),this}onError(t){return this.once("error",(e,i)=>t(i)),this}abort(){this.xhr.abort()}send(){return this._prepareRequest(),this._attachXHRListeners(),this._sendRequest()}_prepareRequest(){const t=new XMLHttpRequest;t.open("POST",this._apiAddress),t.setRequestHeader("Authorization",this._token.value),t.responseType="json",this.xhr=t}_attachXHRListeners(){const t=this,e=this.xhr;function i(e){return()=>t.fire("error",e)}e.addEventListener("error",i("Network Error")),e.addEventListener("abort",i("Abort")),e.upload&&e.upload.addEventListener("progress",t=>{t.lengthComputable&&this.fire("progress",{total:t.total,uploaded:t.loaded})}),e.addEventListener("load",()=>{const t=e.status,i=e.response;if(t<200||t>299)return this.fire("error",i.message||i.error)})}_sendRequest(){const t=new FormData,e=this.xhr;return t.append("file",this.file),new Promise((i,n)=>{e.addEventListener("load",()=>{const t=e.status,o=e.response;return t<200||t>299?o.message?n(new hi.b("fileuploader-uploading-data-failed: Uploading file failed.",this,{message:o.message})):n(o.error):i(o)}),e.addEventListener("error",()=>n(new Error("Network Error"))),e.addEventListener("abort",()=>n(new Error("Abort"))),e.send(t)})}}vi(wu,mi);const ku={refreshInterval:36e5,autoRefresh:!0};class _u{constructor(t,e=ku){if(!t)throw new hi.b("token-missing-token-url: A `tokenUrl` must be provided as the first constructor argument.",this);this.set("value",e.initValue),this._refresh="function"==typeof t?t:()=>{return e=t,new Promise((t,i)=>{const n=new XMLHttpRequest;n.open("GET",e),n.addEventListener("load",()=>{const e=n.status,o=n.response;return e<200||e>299?i(new hi.b("token-cannot-download-new-token: Cannot download new token from the provided url.",null)):t(o)}),n.addEventListener("error",()=>i(new Error("Network Error"))),n.addEventListener("abort",()=>i(new Error("Abort"))),n.send()});var e},this._options=Object.assign({},ku,e)}init(){return new Promise((t,e)=>{this._options.autoRefresh&&this._startRefreshing(),this.value?t(this):this._refreshToken().then(t).catch(e)})}_refreshToken(){return this._refresh().then(t=>this.set("value",t)).then(()=>this)}destroy(){this._stopRefreshing()}_startRefreshing(){this._refreshInterval=setInterval(()=>this._refreshToken(),this._options.refreshInterval)}_stopRefreshing(){clearInterval(this._refreshInterval)}static create(t,e=ku){return new _u(t,e).init()}}vi(_u,Hn);var vu=_u;class yu extends Hd{static get pluginName(){return"CloudServices"}init(){const t=this.context.config.get("cloudServices")||{};for(const e in t)this[e]=t[e];if(this.tokenUrl)return this.token=new yu.Token(this.tokenUrl),this.token.init();this.token=null}}yu.Token=vu;class xu extends ql{static get requires(){return[qd,yu]}init(){const t=this.editor,e=t.plugins.get(yu),i=e.token,n=e.uploadUrl;i&&(this._uploadGateway=new xu._UploadGateway(i,n),t.plugins.get(qd).createUploadAdapter=t=>new Au(this._uploadGateway,t))}}class Au{constructor(t,e){this.uploadGateway=t,this.loader=e}upload(){return this.loader.file.then(t=>(this.fileUploader=this.uploadGateway.upload(t),this.fileUploader.on("progress",(t,e)=>{this.loader.uploadTotal=e.total,this.loader.uploaded=e.uploaded}),this.fileUploader.send()))}abort(){this.fileUploader.abort()}}xu._UploadGateway=class{constructor(t,e){if(!t)throw new hi.b("uploadgateway-missing-token: Token must be provided.",null);if(!e)throw new hi.b("uploadgateway-missing-api-address: Api address must be provided.",null);this._token=t,this._apiAddress=e}upload(t){return new wu(t,this._token,this._apiAddress)}};class Cu extends Os{constructor(t){super(t),this.domEventType="mousedown"}onDomEvent(t){this.fire(t.type,t)}}i(48);const Tu=wo("Ctrl+A");class Pu extends ql{static get pluginName(){return"Widget"}init(){const t=this.editor.editing.view,e=t.document;this._previouslySelected=new Set,this.editor.editing.downcastDispatcher.on("selection",(t,e,i)=>{this._clearPreviouslySelectedWidgets(i.writer);const n=i.writer,o=n.document.selection,s=o.getSelectedElement();let r=null;for(const t of o.getRanges())for(const e of t){const t=e.item;kh(t)&&!Su(t,r)&&(n.addClass("ck-widget_selected",t),this._previouslySelected.add(t),r=t,t==s&&n.setSelection(o.getRanges(),{fake:!0,label:vh(s)}))}},{priority:"low"}),t.addObserver(Cu),this.listenTo(e,"mousedown",(...t)=>this._onMousedown(...t)),this.listenTo(e,"keydown",(...t)=>this._onKeydown(...t),{priority:"high"}),this.listenTo(e,"delete",(t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())},{priority:"high"})}_onMousedown(t,e){const i=this.editor,n=i.editing.view,o=n.document;let s=e.target;if(function(t){for(;t;){if(t.is("editableElement")&&!t.is("rootElement"))return!0;if(kh(t))return!1;t=t.parent}return!1}(s)){if(fo.isSafari&&e.domEvent.detail>=3){const t=i.editing.mapper.toModelElement(s);this.editor.model.change(i=>{e.preventDefault(),i.setSelection(t,"in")})}return}if(!kh(s)&&(s=s.findAncestor(kh),!s))return;e.preventDefault(),o.isFocused||n.focus();const r=i.editing.mapper.toModelElement(s);this._setSelectionOverElement(r)}_onKeydown(t,e){const i=e.keyCode,n="ltr"===this.editor.locale.contentLanguageDirection,o=i==po.arrowdown||i==po[n?"arrowright":"arrowleft"];let s=!1;!function(t){return t==po.arrowright||t==po.arrowleft||t==po.arrowup||t==po.arrowdown}(i)?!function(t){return bo(t)==Tu}(e)?i===po.enter&&(s=this._handleEnterKey(e.shiftKey)):s=this._selectAllNestedEditableContent()||this._selectAllContent():s=this._handleArrowKeys(o),s&&(e.preventDefault(),t.stop())}_handleDelete(t){if(this.editor.isReadOnly)return;const e=this.editor.model.document.selection;if(!e.isCollapsed)return;const i=this._getObjectElementNextToSelection(t);return i?(this.editor.model.change(t=>{let n=e.anchor.parent;for(;n.isEmpty;){const e=n;n=e.parent,t.remove(e)}this._setSelectionOverElement(i)}),!0):void 0}_handleArrowKeys(t){const e=this.editor.model,i=e.schema,n=e.document.selection,o=n.getSelectedElement();if(o&&i.isObject(o)){const o=t?n.getLastPosition():n.getFirstPosition(),s=i.getNearestSelectionRange(o,t?"forward":"backward");return s&&e.change(t=>{t.setSelection(s)}),!0}if(!n.isCollapsed)return;const s=this._getObjectElementNextToSelection(t);return s&&i.isObject(s)?(this._setSelectionOverElement(s),!0):void 0}_handleEnterKey(t){const e=this.editor.model,i=e.document.selection.getSelectedElement();if(n=i,o=e.schema,n&&o.isObject(n)&&!o.isInline(n))return e.change(n=>{let o=n.createPositionAt(i,t?"before":"after");const s=n.createElement("paragraph");if(e.schema.isBlock(i.parent)){const t=e.schema.findAllowedParent(o,s);o=n.split(o,t).position}n.insert(s,o),n.setSelection(s,"in")}),!0;var n,o}_selectAllNestedEditableContent(){const t=this.editor.model,e=t.document.selection,i=t.schema.getLimitElement(e);return e.getFirstRange().root!=i&&(t.change(t=>{t.setSelection(t.createRangeIn(i))}),!0)}_selectAllContent(){const t=this.editor.model,e=this.editor.editing,i=e.view.document.selection.getSelectedElement();if(i&&kh(i)){const n=e.mapper.toModelElement(i.parent);return t.change(t=>{t.setSelection(t.createRangeIn(n))}),!0}return!1}_setSelectionOverElement(t){this.editor.model.change(e=>{e.setSelection(e.createRangeOn(t))})}_getObjectElementNextToSelection(t){const e=this.editor.model,i=e.schema,n=e.document.selection,o=e.createSelection(n);e.modifySelection(o,{direction:t?"forward":"backward"});const s=t?o.focus.nodeBefore:o.focus.nodeAfter;return s&&i.isObject(s)?s:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass("ck-widget_selected",e);this._previouslySelected.clear()}}function Su(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}class Eu extends Jl{refresh(){const t=this.editor.model.document.selection.getSelectedElement();this.isEnabled=Th(t),Th(t)&&t.hasAttribute("alt")?this.value=t.getAttribute("alt"):this.value=!1}execute(t){const e=this.editor.model,i=e.document.selection.getSelectedElement();e.change(e=>{e.setAttribute("alt",t.newValue,i)})}}class Mu extends ql{static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new Eu(this.editor))}}i(50);class Iu extends rl{constructor(t,e){super(t);const i=`ck-input-${li()}`,n=`ck-status-${li()}`;this.set("label"),this.set("value"),this.set("isReadOnly",!1),this.set("errorText",null),this.set("infoText",null),this.labelView=this._createLabelView(i),this.inputView=this._createInputView(e,i,n),this.statusView=this._createStatusView(n),this.bind("_statusText").to(this,"errorText",this,"infoText",(t,e)=>t||e);const o=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-input",o.if("isReadOnly","ck-disabled")]},children:[this.labelView,this.inputView,this.statusView]})}_createLabelView(t){const e=new dl(this.locale);return e.for=t,e.bind("text").to(this,"label"),e}_createInputView(t,e,i){const n=new t(this.locale,i);return n.id=e,n.ariaDescribedById=i,n.bind("value").to(this),n.bind("isReadOnly").to(this),n.bind("hasError").to(this,"errorText",t=>!!t),n.on("input",()=>{this.errorText=null}),n}_createStatusView(t){const e=new rl(this.locale),i=this.bindTemplate;return e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-input__status",i.if("errorText","ck-labeled-input__status_error"),i.if("_statusText","ck-hidden",t=>!t)],id:t,role:i.if("errorText","alert")},children:[{text:i.to("_statusText")}]}),e}select(){this.inputView.select()}focus(){this.inputView.focus()}}i(52);class Nu extends rl{constructor(t){super(t),this.set("value"),this.set("id"),this.set("placeholder"),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById");const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{type:"text",class:["ck","ck-input","ck-input-text",e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),readonly:e.to("isReadOnly"),"aria-invalid":e.if("hasError",!0),"aria-describedby":e.to("ariaDescribedById")},on:{input:e.to("input")}})}render(){super.render();const t=t=>{this.element.value=t||0===t?t:""};t(this.value),this.on("change:value",(e,i,n)=>{t(n)})}select(){this.element.select()}focus(){this.element.focus()}}function Ou({view:t}){t.listenTo(t.element,"submit",(e,i)=>{i.preventDefault(),t.fire("submit")},{useCapture:!0})}var Ru=' ',Lu=' ';i(54);class Du extends rl{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new Ic,this.keystrokes=new yc,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(e("cf"),Ru,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(e("cg"),Lu,"ck-button-cancel","cancel"),this._focusables=new Bc,this._focusCycler=new bl({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]})}render(){super.render(),this.keystrokes.listenTo(this.element),Ou({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach(t=>{this._focusables.add(t),this.focusTracker.add(t.element)})}_createButton(t,e,i,n){const o=new El(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createLabeledInputView(){const t=this.locale.t,e=new Iu(this.locale,Nu);return e.label=t("cl"),e.inputView.placeholder=t("cl"),e}}i(56);const zu=ml("px"),ju=ts.document.body;class Vu extends rl{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class"),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",t=>`ck-balloon-panel_${t}`),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",zu),left:e.to("left",zu)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(t){this.show();const e=Vu.defaultPositions,i=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthWest,e.northArrowSouthEast],limiter:ju,fitInViewport:!0},t),n=Vu._getOptimalPosition(i),o=parseInt(n.left),s=parseInt(n.top),r=n.name;Object.assign(this,{top:s,left:o,position:r})}pin(t){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(t):this._stopPinning()},this._startPinning(t),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(t){this.attachTo(t);const e=Bu(t.target),i=t.limiter?Bu(t.limiter):ju;this.listenTo(ts.document,"scroll",(n,o)=>{const s=o.target,r=e&&s.contains(e),a=i&&s.contains(i);!r&&!a&&e&&i||this.attachTo(t)},{useCapture:!0}),this.listenTo(ts.window,"resize",()=>{this.attachTo(t)})}_stopPinning(){this.stopListening(ts.document,"scroll"),this.stopListening(ts.window,"resize")}}function Bu(t){return ii(t)?t:Ks(t)?t.commonAncestorContainer:"function"==typeof t?Bu(t()):null}function Fu(t,e){return t.top-e.height-Vu.arrowVerticalOffset}function Hu(t){return t.bottom+Vu.arrowVerticalOffset}Vu.arrowHorizontalOffset=25,Vu.arrowVerticalOffset=10,Vu._getOptimalPosition=xl,Vu.defaultPositions={northArrowSouth:(t,e)=>({top:Fu(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s"}),northArrowSouthEast:(t,e)=>({top:Fu(t,e),left:t.left+t.width/2-e.width+Vu.arrowHorizontalOffset,name:"arrow_se"}),northArrowSouthWest:(t,e)=>({top:Fu(t,e),left:t.left+t.width/2-Vu.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouth:(t,e)=>({top:Fu(t,e),left:t.left-e.width/2,name:"arrow_s"}),northWestArrowSouthWest:(t,e)=>({top:Fu(t,e),left:t.left-Vu.arrowHorizontalOffset,name:"arrow_sw"}),northWestArrowSouthEast:(t,e)=>({top:Fu(t,e),left:t.left-e.width+Vu.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouth:(t,e)=>({top:Fu(t,e),left:t.right-e.width/2,name:"arrow_s"}),northEastArrowSouthEast:(t,e)=>({top:Fu(t,e),left:t.right-e.width+Vu.arrowHorizontalOffset,name:"arrow_se"}),northEastArrowSouthWest:(t,e)=>({top:Fu(t,e),left:t.right-Vu.arrowHorizontalOffset,name:"arrow_sw"}),southArrowNorth:(t,e)=>({top:Hu(t),left:t.left+t.width/2-e.width/2,name:"arrow_n"}),southArrowNorthEast:(t,e)=>({top:Hu(t),left:t.left+t.width/2-e.width+Vu.arrowHorizontalOffset,name:"arrow_ne"}),southArrowNorthWest:(t,e)=>({top:Hu(t),left:t.left+t.width/2-Vu.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorth:(t,e)=>({top:Hu(t),left:t.left-e.width/2,name:"arrow_n"}),southWestArrowNorthWest:(t,e)=>({top:Hu(t),left:t.left-Vu.arrowHorizontalOffset,name:"arrow_nw"}),southWestArrowNorthEast:(t,e)=>({top:Hu(t),left:t.left-e.width+Vu.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorth:(t,e)=>({top:Hu(t),left:t.right-e.width/2,name:"arrow_n"}),southEastArrowNorthEast:(t,e)=>({top:Hu(t),left:t.right-e.width+Vu.arrowHorizontalOffset,name:"arrow_ne"}),southEastArrowNorthWest:(t,e)=>({top:Hu(t),left:t.right-Vu.arrowHorizontalOffset,name:"arrow_nw"})};i(58),i(60);const Uu=ml("px");class Wu extends ql{static get pluginName(){return"ContextualBalloon"}constructor(t){super(t),this.positionLimiter=()=>{const t=this.editor.editing.view,e=t.document.selection.editableElement;return e?t.domConverter.mapViewToDom(e.root):null},this.set("visibleView",null),this.view=new Vu(t.locale),t.ui.view.body.add(this.view),t.ui.focusTracker.add(this.view.element),this._viewToStack=new Map,this._idToStack=new Map,this.set("_numberOfStacks",0),this.set("_singleViewMode",!1),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this.hasView(t.view))throw new hi.b("contextualballoon-add-view-exist: Cannot add configuration of the same view twice.",[this,t]);const e=t.stackId||"main";if(!this._idToStack.has(e))return this._idToStack.set(e,new Map([[t.view,t]])),this._viewToStack.set(t.view,this._idToStack.get(e)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!t.singleViewMode||this.showStack(e));const i=this._idToStack.get(e);t.singleViewMode&&this.showStack(e),i.set(t.view,t),this._viewToStack.set(t.view,i),i===this._visibleStack&&this._showView(t)}remove(t){if(!this.hasView(t))throw new hi.b("contextualballoon-remove-view-not-exist: Cannot remove the configuration of a non-existent view.",[this,t]);const e=this._viewToStack.get(t);this._singleViewMode&&this.visibleView===t&&(this._singleViewMode=!1),this.visibleView===t&&(1===e.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(e.values())[e.size-2])),1===e.size?(this._idToStack.delete(this._getStackId(e)),this._numberOfStacks=this._idToStack.size):e.delete(t),this._viewToStack.delete(t)}updatePosition(t){t&&(this._visibleStack.get(this.visibleView).position=t),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e)throw new hi.b("contextualballoon-showstack-stack-not-exist: Cannot show a stack that does not exist.",this);this._visibleStack!==e&&this._showView(Array.from(e.values()).pop())}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){return Array.from(this._idToStack.entries()).find(e=>e[1]===t)[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;t[e]||(e=0),this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;t[e]||(e=t.length-1),this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new qu(this.editor.locale),e=this.editor.locale.t;return this.view.content.add(t),t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",(t,e)=>!e&&t>1),t.on("change:isNavigationVisible",()=>this.updatePosition(),{priority:"low"}),t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",(t,i)=>{if(i<2)return"";const n=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("cm",[n,i])}),t.buttonNextView.on("execute",()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()}),t.buttonPrevView.on("execute",()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()}),t}_createFakePanelsView(){const t=new $u(this.editor.locale,this.view);return t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",(t,e)=>!e&&t>=2?Math.min(t-1,2):0),t.listenTo(this.view,"change:top",()=>t.updatePosition()),t.listenTo(this.view,"change:left",()=>t.updatePosition()),this.editor.ui.view.body.add(t),t}_showView({view:t,balloonClassName:e="",withArrow:i=!0,singleViewMode:n=!1}){this.view.class=e,this.view.withArrow=i,this._rotatorView.showView(t),this.visibleView=t,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),n&&(this._singleViewMode=!0)}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;return t&&!t.limiter&&(t=Object.assign({},t,{limiter:this.positionLimiter})),t}}class qu extends rl{constructor(t){super(t);const e=t.t,i=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new Ic,this.buttonPrevView=this._createButtonView(e("cn"),' '),this.buttonNextView=this._createButtonView(e("co"),' '),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",i.to("isNavigationVisible",t=>t?"":"ck-hidden")]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:i.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}showView(t){this.hideView(),this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const i=new El(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i}}class $u extends rl{constructor(t,e){super(t);const i=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=e,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",i.to("numberOfPanels",t=>t?"":"ck-hidden")],style:{top:i.to("top",Uu),left:i.to("left",Uu),width:i.to("width",Uu),height:i.to("height",Uu)}},children:this.content}),this.on("change:numberOfPanels",(t,e,i,n)=>{i>n?this._addPanels(i-n):this._removePanels(n-i),this.updatePosition()})}_addPanels(t){for(;t--;){const t=new rl;t.setTemplate({tag:"div"}),this.content.add(t),this.registerChild(t)}}_removePanels(t){for(;t--;){const t=this.content.last;this.content.remove(t),this.deregisterChild(t),t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView,{width:i,height:n}=new Xs(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:i,height:n})}}}function Yu(t){const e=t.editing.view,i=Vu.defaultPositions;return{target:e.domConverter.viewToDom(e.document.selection.getSelectedElement()),positions:[i.northArrowSouth,i.northArrowSouthWest,i.northArrowSouthEast,i.southArrowNorth,i.southArrowNorthWest,i.southArrowNorthEast]}}class Gu extends ql{static get requires(){return[Wu]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton(),this._createForm()}destroy(){super.destroy(),this._form.destroy()}_createButton(){const t=this.editor,e=t.t;t.ui.componentFactory.add("imageTextAlternative",i=>{const n=t.commands.get("imageTextAlternative"),o=new El(i);return o.set({label:e("bi"),icon:' ',tooltip:!0}),o.bind("isEnabled").to(n,"isEnabled"),this.listenTo(o,"execute",()=>{this._showForm()}),o})}_createForm(){const t=this.editor,e=t.editing.view.document;this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new Du(t.locale),this._form.render(),this.listenTo(this._form,"submit",()=>{t.execute("imageTextAlternative",{newValue:this._form.labeledInput.inputView.element.value}),this._hideForm(!0)}),this.listenTo(this._form,"cancel",()=>{this._hideForm(!0)}),this._form.keystrokes.set("Esc",(t,e)=>{this._hideForm(!0),e()}),this.listenTo(t.ui,"update",()=>{Ch(e.selection)?this._isVisible&&function(t){const e=t.plugins.get("ContextualBalloon");if(Ch(t.editing.view.document.selection)){const i=Yu(t);e.updatePosition(i)}}(t):this._hideForm(!0)}),Ll({emitter:this._form,activator:()=>this._isVisible,contextElements:[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;const t=this.editor,e=t.commands.get("imageTextAlternative"),i=this._form.labeledInput;this._isInBalloon||this._balloon.add({view:this._form,position:Yu(t)}),i.value=i.inputView.element.value=e.value||"",this._form.labeledInput.select()}_hideForm(t){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),t&&this.editor.editing.view.focus())}get _isVisible(){return this._balloon.visibleView===this._form}get _isInBalloon(){return this._balloon.hasView(this._form)}}class Qu extends ql{static get requires(){return[Mu,Gu]}static get pluginName(){return"ImageTextAlternative"}}i(62);class Ku extends ql{static get requires(){return[Mh,Pu,Qu]}static get pluginName(){return"Image"}}class Ju extends rl{constructor(t){super(t),this.buttonView=new El(t),this._fileInputView=new Zu(t),this._fileInputView.bind("acceptedType").to(this),this._fileInputView.bind("allowMultipleFiles").to(this),this._fileInputView.delegate("done").to(this),this.setTemplate({tag:"span",attributes:{class:"ck-file-dialog-button"},children:[this.buttonView,this._fileInputView]}),this.buttonView.on("execute",()=>{this._fileInputView.open()})}focus(){this.buttonView.focus()}}class Zu extends rl{constructor(t){super(t),this.set("acceptedType"),this.set("allowMultipleFiles",!1);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to(()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""})}})}open(){this.element.click()}}function Xu(t){const e=t.map(t=>t.replace("+","\\+"));return new RegExp(`^image\\/(${e.join("|")})$`)}function tf(t){return new Promise((e,i)=>{const n=t.getAttribute("src");fetch(n).then(t=>t.blob()).then(t=>{const o=function(t,e){return t.type?t.type:e.match(/data:(image\/\w+);base64/)?e.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}(t,n),s=function(t,e,i){try{return new File([t],e,{type:i})}catch(t){return null}}(t,`image.${o.replace("image/","")}`,o);s?e(s):i()}).catch(i)})}class ef extends ql{init(){const t=this.editor,e=t.t;t.ui.componentFactory.add("imageUpload",i=>{const n=new Ju(i),o=t.commands.get("imageUpload"),s=t.config.get("image.upload.types"),r=Xu(s);return n.set({acceptedType:s.map(t=>`image/${t}`).join(","),allowMultipleFiles:!0}),n.buttonView.set({label:e("y"),icon:' ',tooltip:!0}),n.buttonView.bind("isEnabled").to(o),n.on("done",(e,i)=>{const n=Array.from(i).filter(t=>r.test(t.type));n.length&&t.execute("imageUpload",{file:n})}),n})}}i(64),i(66),i(68);class nf extends ql{constructor(t){super(t),this.placeholder="data:image/svg+xml;utf8,"+encodeURIComponent(' ')}init(){this.editor.editing.downcastDispatcher.on("attribute:uploadStatus:image",(...t)=>this.uploadStatusChange(...t))}uploadStatusChange(t,e,i){const n=this.editor,o=e.item,s=o.getAttribute("uploadId");if(!i.consumable.consume(e.item,t.name))return;const r=n.plugins.get(qd),a=s?e.attributeNewValue:null,c=this.placeholder,l=n.editing.mapper.toViewElement(o),d=i.writer;if("reading"==a)return of(l,d),void sf(c,l,d);if("uploading"==a){const t=r.loaders.get(s);return of(l,d),void(t?(rf(l,d),function(t,e,i,n){const o=function(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});return t.setCustomProperty("progressBar",!0,e),e}(e);e.insert(e.createPositionAt(t,"end"),o),i.on("change:uploadedPercent",(t,e,i)=>{n.change(t=>{t.setStyle("width",i+"%",o)})})}(l,d,t,n.editing.view),function(t,e,i){if(i.data){const n=t.getChild(0);e.setAttribute("src",i.data,n)}}(l,d,t)):sf(c,l,d))}"complete"==a&&r.loaders.get(s)&&!fo.isEdge&&function(t,e,i){const n=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),n),setTimeout(()=>{i.change(t=>t.remove(t.createRangeOn(n)))},3e3)}(l,d,n.editing.view),function(t,e){cf(t,e,"progressBar")}(l,d),rf(l,d),function(t,e){e.removeClass("ck-appear",t)}(l,d)}}function of(t,e){t.hasClass("ck-appear")||e.addClass("ck-appear",t)}function sf(t,e,i){e.hasClass("ck-image-upload-placeholder")||i.addClass("ck-image-upload-placeholder",e);const n=e.getChild(0);n.getAttribute("src")!==t&&i.setAttribute("src",t,n),af(e,"placeholder")||i.insert(i.createPositionAfter(n),function(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});return t.setCustomProperty("placeholder",!0,e),e}(i))}function rf(t,e){t.hasClass("ck-image-upload-placeholder")&&e.removeClass("ck-image-upload-placeholder",t),cf(t,e,"placeholder")}function af(t,e){for(const i of t.getChildren())if(i.getCustomProperty(e))return i}function cf(t,e,i){const n=af(t,i);n&&e.remove(e.createRangeOn(n))}class lf{createDocumentFragment(t){return new Ao(t)}createElement(t,e,i){return new On(t,e,i)}createText(t){return new Ni(t)}clone(t,e=!1){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,i){return i._insertChild(t,e)}removeChildren(t,e,i){return i._removeChildren(t,e)}remove(t){const e=t.parent;return e?this.removeChildren(e.getChildIndex(t),1,e):[]}replace(t,e){const i=t.parent;if(i){const n=i.getChildIndex(t);return this.removeChildren(n,1,i),this.insertChild(n,e,i),!0}return!1}unwrapElement(t){const e=t.parent;if(e){const i=e.getChildIndex(t);this.remove(t),this.insertChild(i,t.getChildren(),e)}}rename(t,e){const i=new On(t,e.getAttributes(),e.getChildren());return this.replace(e,i)?i:null}setAttribute(t,e,i){i._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,i){y(t)&&void 0===i&&(i=e),i._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,i){i._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return Xn._createAt(t,e)}createPositionAfter(t){return Xn._createAfter(t)}createPositionBefore(t){return Xn._createBefore(t)}createRange(t,e){return new to(t,e)}createRangeOn(t){return to._createOn(t)}createRangeIn(t){return to._createIn(t)}createSelection(t,e,i){return new no(t,e,i)}}class df extends Jl{refresh(){this.isEnabled=Sh(this.editor.model)}execute(t){const e=this.editor,i=e.model,n=e.plugins.get(qd);i.change(e=>{const o=Array.isArray(t.file)?t.file:[t.file];for(const t of o)hf(e,i,n,t)})}}function hf(t,e,i,n){const o=i.createLoader(n);o&&Ph(t,e,{uploadId:o.id})}class uf extends ql{static get requires(){return[qd,fu,Kl]}static get pluginName(){return"ImageUploadEditing"}constructor(t){super(t),t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}})}init(){const t=this.editor,e=t.model.document,i=t.model.schema,n=t.conversion,o=t.plugins.get(qd),s=Xu(t.config.get("image.upload.types"));i.extend("image",{allowAttributes:["uploadId","uploadStatus"]}),t.commands.add("imageUpload",new df(t)),n.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(t.editing.view.document,"clipboardInput",(e,i)=>{if(n=i.dataTransfer,Array.from(n.types).includes("text/html")&&""!==n.getData("text/html"))return;var n;const o=Array.from(i.dataTransfer.files).filter(t=>!!t&&s.test(t.type)),r=i.targetRanges.map(e=>t.editing.mapper.toModelRange(e));t.model.change(i=>{i.setSelection(r),o.length&&(e.stop(),t.model.enqueueChange("default",()=>{t.execute("imageUpload",{file:o})}))})}),this.listenTo(t.plugins.get(Kl),"inputTransformation",(e,i)=>{const n=Array.from(t.editing.view.createRangeIn(i.content)).filter(t=>{return!(!(e=t.item).is("element","img")||!e.getAttribute("src"))&&(e.getAttribute("src").match(/^data:image\/\w+;base64,/g)||e.getAttribute("src").match(/^blob:/g))&&!t.item.getAttribute("uploadProcessed");var e}).map(t=>({promise:tf(t.item),imageElement:t.item}));if(!n.length)return;const s=new lf;for(const t of n){s.setAttribute("uploadProcessed",!0,t.imageElement);const e=o.createLoader(t.promise);e&&(s.setAttribute("src","",t.imageElement),s.setAttribute("uploadId",e.id,t.imageElement))}}),t.editing.view.document.on("dragover",(t,e)=>{e.preventDefault()}),e.on("change",()=>{const i=e.differ.getChanges({includeChangesInGraveyard:!0});for(const e of i)if("insert"==e.type&&"$text"!=e.name){const i=e.position.nodeAfter,n="$graveyard"==e.position.root.rootName;for(const e of ff(t,i)){const t=e.getAttribute("uploadId");if(!t)continue;const i=o.loaders.get(t);i&&(n?i.abort():"idle"==i.status&&this._readAndUpload(i,e))}}})}_readAndUpload(t,e){const i=this.editor,n=i.model,o=i.locale.t,s=i.plugins.get(qd),r=i.plugins.get(fu);return n.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","reading",e)}),t.read().then(()=>{const o=t.upload();if(fo.isSafari){const t=i.editing.mapper.toViewElement(e).getChild(0);i.editing.view.once("render",()=>{if(!t.parent)return;const e=i.editing.view.domConverter.mapViewToDom(t.parent);if(!e)return;const n=e.style.display;e.style.display="none",e._ckHack=e.offsetHeight,e.style.display=n})}return n.enqueueChange("transparent",t=>{t.setAttribute("uploadStatus","uploading",e)}),o}).then(t=>{n.enqueueChange("transparent",i=>{i.setAttributes({uploadStatus:"complete",src:t.default},e),this._parseAndSetSrcsetAttributeOnImage(t,e,i)}),a()}).catch(i=>{if("error"!==t.status&&"aborted"!==t.status)throw i;"error"==t.status&&i&&r.showWarning(i,{title:o("ag"),namespace:"upload"}),a(),n.enqueueChange("transparent",t=>{t.remove(e)})});function a(){n.enqueueChange("transparent",t=>{t.removeAttribute("uploadId",e),t.removeAttribute("uploadStatus",e)}),s.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,i){let n=0;const o=Object.keys(t).filter(t=>{const e=parseInt(t,10);if(!isNaN(e))return n=Math.max(n,e),!0}).map(e=>`${t[e]} ${e}w`).join(", ");""!=o&&i.setAttribute("srcset",{data:o,width:n},e)}}function ff(t,e){return Array.from(t.model.createRangeOn(e)).filter(t=>t.item.is("image")).map(t=>t.item)}class mf extends ql{static get pluginName(){return"ImageUpload"}static get requires(){return[uf,ef,nf]}}class gf extends Jl{refresh(){const t=this.editor.model,e=sh(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("paragraph"),this.isEnabled=!!e&&pf(e,t.schema)}execute(t={}){const e=this.editor.model,i=e.document;e.change(n=>{const o=(t.selection||i.selection).getSelectedBlocks();for(const t of o)!t.is("paragraph")&&pf(t,e.schema)&&n.rename(t,"paragraph")})}}function pf(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class bf extends ql{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model,i=t.data;t.commands.add("paragraph",new gf(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,e)=>bf.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,converterPriority:"low"}),i.upcastDispatcher.on("element",(t,e,i)=>{i.consumable.test(e.viewItem,{name:e.viewItem.name})&&kf(e.viewItem,e.modelCursor,i.schema)&&Object.assign(e,wf(e.viewItem,e.modelCursor,i))},{priority:"low"}),i.upcastDispatcher.on("text",(t,e,i)=>{e.modelRange||kf(e.viewItem,e.modelCursor,i.schema)&&Object.assign(e,wf(e.viewItem,e.modelCursor,i))},{priority:"lowest"}),e.document.registerPostFixer(t=>this._autoparagraphEmptyRoots(t)),t.data.on("ready",()=>{e.enqueueChange("transparent",t=>this._autoparagraphEmptyRoots(t))},{priority:"lowest"})}_autoparagraphEmptyRoots(t){const e=this.editor.model;for(const i of e.document.getRootNames()){const n=e.document.getRoot(i);if(n.isEmpty&&"$graveyard"!=n.rootName&&e.schema.checkChild(n,"paragraph"))return t.insertElement("paragraph",n),!0}}}function wf(t,e,i){const n=i.writer.createElement("paragraph");return i.writer.insert(n,e),i.convertItem(t,i.writer.createPositionAt(n,0))}function kf(t,e,i){const n=i.createContext(e);return!!i.checkChild(n,"paragraph")&&!!i.checkChild(n.push("paragraph"),t)}bf.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td"]);class _f extends Jl{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=sh(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some(e=>vf(t,e,this.editor.model.schema))}execute(t){const e=this.editor.model,i=e.document,n=t.value;e.change(t=>{const o=Array.from(i.selection.getSelectedBlocks()).filter(t=>vf(t,n,e.schema));for(const e of o)e.is(n)||t.rename(e,n)})}}function vf(t,e,i){return i.checkChild(t.parent,e)&&!i.isObject(t)}class yf extends ql{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[bf]}init(){const t=this.editor,e=t.config.get("heading.options"),i=[];for(const n of e)"paragraph"!==n.model&&(t.model.schema.register(n.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(n),i.push(n.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new _f(t,i))}afterInit(){const t=this.editor,e=t.commands.get("enter"),i=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",(e,n)=>{const o=t.model.document.selection.getFirstPosition().parent;i.some(t=>o.is(t.model))&&!o.is("paragraph")&&0===o.childCount&&n.writer.rename(o,"paragraph")})}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:di.get("low")+1})}}class xf{constructor(t,e){e&&zn(this,e),t&&this.set(t)}}vi(xf,Hn);i(11);class Af extends ql{init(){const t=this.editor,e=t.t,i=function(t){const e=t.t,i={Paragraph:e("dk"),"Heading 1":e("dl"),"Heading 2":e("dm"),"Heading 3":e("dn"),"Heading 4":e("do"),"Heading 5":e("dp"),"Heading 6":e("dq")};return t.config.get("heading.options").map(t=>{const e=i[t.title];return e&&e!=t.title&&(t.title=e),t})}(t),n=e("l"),o=e("m");t.ui.componentFactory.add("heading",e=>{const s={},r=new yi,a=t.commands.get("heading"),c=t.commands.get("paragraph"),l=[a];for(const t of i){const e={type:"button",model:new xf({label:t.title,class:t.class,withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(c,"value"),e.model.set("commandName","paragraph"),l.push(c)):(e.model.bind("isOn").to(a,"value",e=>e===t.model),e.model.set({commandName:"heading",commandValue:t.model})),r.add(e),s[t.model]=t.title}const d=Dl(e);return jl(d,r),d.buttonView.set({isOn:!1,withText:!0,tooltip:o}),d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),d.bind("isEnabled").toMany(l,"isEnabled",(...t)=>t.some(t=>t)),d.buttonView.bind("label").to(a,"value",c,"value",(t,e)=>{const i=t||e&&"paragraph";return s[i]?s[i]:n}),this.listenTo(d,"execute",e=>{t.execute(e.source.commandName,e.source.commandValue?{value:e.source.commandValue}:void 0),t.editing.view.focus()}),d})}}function Cf(t){for(const e of t.getChildren())if(e&&e.is("caption"))return e;return null}function Tf(t){const e=t.parent;return"figcaption"==t.name&&e&&"figure"==e.name&&e.hasClass("image")?{name:!0}:null}class Pf extends ql{static get pluginName(){return"ImageCaptionEditing"}init(){const t=this.editor,e=t.editing.view,i=t.model.schema,n=t.data,o=t.editing,s=t.t;i.register("caption",{allowIn:"image",allowContentOf:"$block",isLimit:!0}),t.model.document.registerPostFixer(t=>this._insertMissingModelCaptionElement(t)),t.conversion.for("upcast").elementToElement({view:Tf,model:"caption"});n.downcastDispatcher.on("insert:caption",Sf(t=>t.createContainerElement("figcaption"),!1));const r=function(t,e){return i=>{const n=i.createEditableElement("figcaption");return i.setCustomProperty("imageCaption",!0,n),Rc({view:t,element:n,text:e}),yh(n,i)}}(e,s("z"));o.downcastDispatcher.on("insert:caption",Sf(r)),o.downcastDispatcher.on("insert",this._fixCaptionVisibility(t=>t.item),{priority:"high"}),o.downcastDispatcher.on("remove",this._fixCaptionVisibility(t=>t.position.parent),{priority:"high"}),e.document.registerPostFixer(t=>this._updateCaptionVisibility(t))}_updateCaptionVisibility(t){const e=this.editor.editing.mapper,i=this._lastSelectedCaption;let n;const o=this.editor.model.document.selection,s=o.getSelectedElement();if(s&&s.is("image")){const t=Cf(s);n=e.toViewElement(t)}const r=Ef(o.getFirstPosition().parent);if(r&&(n=e.toViewElement(r)),n)return i?(i===n||(Mf(i,t),this._lastSelectedCaption=n),If(n,t)):(this._lastSelectedCaption=n,If(n,t));if(i){const e=Mf(i,t);return this._lastSelectedCaption=null,e}return!1}_fixCaptionVisibility(t){return(e,i,n)=>{const o=Ef(t(i)),s=this.editor.editing.mapper,r=n.writer;if(o){const t=s.toViewElement(o);t&&(o.childCount?r.removeClass("ck-hidden",t):r.addClass("ck-hidden",t))}}}_insertMissingModelCaptionElement(t){const e=this.editor.model,i=e.document.differ.getChanges(),n=[];for(const t of i)if("insert"==t.type&&"$text"!=t.name){const i=t.position.nodeAfter;if(i.is("image")&&!Cf(i)&&n.push(i),!i.is("image")&&i.childCount)for(const t of e.createRangeIn(i).getItems())t.is("image")&&!Cf(t)&&n.push(t)}for(const e of n)t.appendElement("caption",e);return!!n.length}}function Sf(t,e=!0){return(i,n,o)=>{const s=n.item;if((s.childCount||e)&&Th(s.parent)){if(!o.consumable.consume(n.item,"insert"))return;const e=o.mapper.toViewElement(n.range.start.parent),i=t(o.writer),r=o.writer;s.childCount||r.addClass("ck-hidden",i),function(t,e,i,n){const o=n.writer.createPositionAt(i,"end");n.writer.insert(o,t),n.mapper.bindElements(e,t)}(i,n.item,e,o)}}}function Ef(t){const e=t.getAncestors({includeSelf:!0}).find(t=>"caption"==t.name);return e&&e.parent&&"image"==e.parent.name?e:null}function Mf(t,e){return!t.childCount&&!t.hasClass("ck-hidden")&&(e.addClass("ck-hidden",t),!0)}function If(t,e){return!!t.hasClass("ck-hidden")&&(e.removeClass("ck-hidden",t),!0)}i(71);class Nf extends Jl{constructor(t,e){super(t),this.defaultStyle=!1,this.styles=e.reduce((t,e)=>(t[e.name]=e,e.isDefault&&(this.defaultStyle=e.name),t),{})}refresh(){const t=this.editor.model.document.selection.getSelectedElement();if(this.isEnabled=Th(t),t)if(t.hasAttribute("imageStyle")){const e=t.getAttribute("imageStyle");this.value=!!this.styles[e]&&e}else this.value=this.defaultStyle;else this.value=!1}execute(t){const e=t.value,i=this.editor.model,n=i.document.selection.getSelectedElement();i.change(t=>{this.styles[e].isDefault?t.removeAttribute("imageStyle",n):t.setAttribute("imageStyle",e,n)})}}function Of(t,e){for(const i of e)if(i.name===t)return i}var Rf=' ',Lf=' ',Df=' ',zf=' ';const jf={full:{name:"full",title:"Full size image",icon:Rf,isDefault:!0},side:{name:"side",title:"Side image",icon:zf,className:"image-style-side"},alignLeft:{name:"alignLeft",title:"Left aligned image",icon:Lf,className:"image-style-align-left"},alignCenter:{name:"alignCenter",title:"Centered image",icon:Df,className:"image-style-align-center"},alignRight:{name:"alignRight",title:"Right aligned image",icon:zf,className:"image-style-align-right"}},Vf={full:Rf,left:Lf,right:zf,center:Df};function Bf(t=[]){return t.map(Ff)}function Ff(t){if("string"==typeof t){const e=t;jf[e]?t=Object.assign({},jf[e]):(console.warn(Object(hi.a)("image-style-not-found: There is no such image style of given name."),{name:e}),t={name:e})}else if(jf[t.name]){const e=jf[t.name],i=Object.assign({},t);for(const n in e)t.hasOwnProperty(n)||(i[n]=e[n]);t=i}return"string"==typeof t.icon&&Vf[t.icon]&&(t.icon=Vf[t.icon]),t}class Hf extends ql{static get pluginName(){return"ImageStyleEditing"}init(){const t=this.editor,e=t.model.schema,i=t.data,n=t.editing;t.config.define("image.styles",["full","side"]);const o=Bf(t.config.get("image.styles"));e.extend("image",{allowAttributes:"imageStyle"});const s=function(t){return(e,i,n)=>{if(!n.consumable.consume(i.item,e.name))return;const o=Of(i.attributeNewValue,t),s=Of(i.attributeOldValue,t),r=n.mapper.toViewElement(i.item),a=n.writer;s&&a.removeClass(s.className,r),o&&a.addClass(o.className,r)}}(o);n.downcastDispatcher.on("attribute:imageStyle:image",s),i.downcastDispatcher.on("attribute:imageStyle:image",s),i.upcastDispatcher.on("element:figure",function(t){const e=t.filter(t=>!t.isDefault);return(t,i,n)=>{if(!i.modelRange)return;const o=i.viewItem,s=sh(i.modelRange.getItems());if(n.schema.checkAttribute(s,"imageStyle"))for(const t of e)n.consumable.consume(o,{classes:t.className})&&n.writer.setAttribute("imageStyle",t.name,s)}}(o),{priority:"low"}),t.commands.add("imageStyle",new Nf(t,o))}}i(73);class Uf extends ql{static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Full size image":t("n"),"Side image":t("o"),"Left aligned image":t("p"),"Centered image":t("q"),"Right aligned image":t("r")}}init(){const t=function(t,e){for(const i of t)e[i.title]&&(i.title=e[i.title]);return t}(Bf(this.editor.config.get("image.styles")),this.localizedDefaultStylesTitles);for(const e of t)this._createButton(e)}_createButton(t){const e=this.editor,i=`imageStyle:${t.name}`;e.ui.componentFactory.add(i,i=>{const n=e.commands.get("imageStyle"),o=new El(i);return o.set({label:t.title,icon:t.icon,tooltip:!0,isToggleable:!0}),o.bind("isEnabled").to(n,"isEnabled"),o.bind("isOn").to(n,"value",e=>e===t.name),this.listenTo(o,"execute",()=>{e.execute("imageStyle",{value:t.name}),e.editing.view.focus()}),o})}}class Wf extends ql{static get requires(){return[Wu]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",e=>{(function(t){const e=t.getSelectedElement();return!(!e||!kh(e))})(t.editing.view.document.selection)&&e.stop()},{priority:"high"})}this._toolbarDefinitions=new Map,this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",()=>{this._updateToolbarsVisibility()}),this.listenTo(t.ui,"update",()=>{this._updateToolbarsVisibility()}),this.listenTo(t.ui.focusTracker,"change:isFocused",()=>{this._updateToolbarsVisibility()},{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values())t.view.destroy()}register(t,{ariaLabel:e,items:i,getRelatedElement:n,balloonClassName:o="ck-toolbar-container"}){const s=this.editor,r=s.t,a=new Vl(s.locale);if(a.ariaLabel=e||r("aj"),this._toolbarDefinitions.has(t))throw new hi.b("widget-toolbar-duplicated: Toolbar with the given id was already added.",this,{toolbarId:t});a.fillFromConfig(i,s.ui.componentFactory),this._toolbarDefinitions.set(t,{view:a,getRelatedElement:n,balloonClassName:o})}_updateToolbarsVisibility(){let t=0,e=null,i=null;for(const n of this._toolbarDefinitions.values()){const o=n.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&o)if(this.editor.ui.focusTracker.isFocused){const s=o.getAncestors().length;s>t&&(t=s,e=o,i=n)}else this._isToolbarVisible(n)&&this._hideToolbar(n);else this._isToolbarInBalloon(n)&&this._hideToolbar(n)}i&&this._showToolbar(i,e)}_hideToolbar(t){this._balloon.remove(t.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){this._isToolbarVisible(t)?qf(this.editor,e):this._isToolbarInBalloon(t)||(this._balloon.add({view:t.view,position:$f(this.editor,e),balloonClassName:t.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",()=>{for(const t of this._toolbarDefinitions.values())if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);qf(this.editor,e)}}))}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function qf(t,e){const i=t.plugins.get("ContextualBalloon"),n=$f(t,e);i.updatePosition(n)}function $f(t,e){const i=t.editing.view,n=Vu.defaultPositions;return{target:i.domConverter.mapViewToDom(e),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast]}}class Yf extends Jl{constructor(t){super(t),this._childCommands=[]}refresh(){}execute(...t){this._getFirstEnabledCommand().execute(t)}registerChildCommand(t){this._childCommands.push(t),t.on("change:isEnabled",()=>this._checkEnabled()),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){return this._childCommands.find(t=>t.isEnabled)}}class Gf extends ql{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new Yf(t)),t.commands.add("outdent",new Yf(t))}}var Qf=' ',Kf=' ';class Jf extends ql{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,i=t.t,n="ltr"==e.uiLanguageDirection?Qf:Kf,o="ltr"==e.uiLanguageDirection?Kf:Qf;this._defineButton("indent",i("u"),n),this._defineButton("outdent",i("v"),o)}_defineButton(t,e,i){const n=this.editor;n.ui.componentFactory.add(t,o=>{const s=n.commands.get(t),r=new El(o);return r.set({label:e,icon:i,tooltip:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),this.listenTo(r,"execute",()=>{n.execute(t),n.editing.view.focus()}),r})}}class Zf extends Os{constructor(t){super(t),this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}i(75);class Xf extends rl{constructor(t,e=[]){super(t);const i=t.t;this.focusTracker=new Ic,this.keystrokes=new yc,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("cf"),Ru,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("cg"),Lu,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e),this._focusables=new Bc,this._focusCycler=new bl({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const n=["ck","ck-link-form"];e.length&&n.push("ck-link-form_layout-vertical"),this.setTemplate({tag:"form",attributes:{class:n,tabindex:"-1"},children:this.children})}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce((t,e)=>(t[e.name]=e.isOn,t),{})}render(){super.render(),Ou({view:this}),[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach(t=>{this._focusables.add(t),this.focusTracker.add(t.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new Iu(this.locale,Nu);return e.label=t("ck"),e.inputView.placeholder="https://example.com",e}_createButton(t,e,i,n){const o=new El(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const i of t){const t=new Rl(this.locale);t.set({name:i.id,label:i.label,withText:!0}),t.bind("isOn").to(i,"value"),t.on("execute",()=>{i.set("value",!t.isOn)}),e.add(t)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new rl;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map(t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}})),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}i(77);class tm extends rl{constructor(t){super(t);const e=t.t;this.focusTracker=new Ic,this.keystrokes=new yc,this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(e("cb"),' ',"unlink"),this.editButtonView=this._createButton(e("cc"),' ',"edit"),this.set("href"),this._focusables=new Bc,this._focusCycler=new bl({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render(),[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach(t=>{this._focusables.add(t),this.focusTracker.add(t.element)}),this.keystrokes.listenTo(this.element)}focus(){this._focusCycler.focusFirst()}_createButton(t,e,i){const n=new El(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n.delegate("execute").to(this,i),n}_createPreviewButton(){const t=new El(this.locale),e=this.bindTemplate,i=this.t;return t.set({withText:!0,tooltip:i("cd")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",t=>t&&iu(t)),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",t=>t||i("ce")),t.bind("isEnabled").to(this,"href",t=>!!t),t.template.tag="a",t.template.eventListeners={},t}}class em extends ql{static get requires(){return[Wu]}static get pluginName(){return"LinkUI"}init(){const t=this.editor;t.editing.view.addObserver(Zf),this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._balloon=t.plugins.get(Wu),this._createToolbarLinkButton(),this._enableUserBalloonInteractions()}destroy(){super.destroy(),this.formView.destroy()}_createActionsView(){const t=this.editor,e=new tm(t.locale),i=t.commands.get("link"),n=t.commands.get("unlink");return e.bind("href").to(i,"value"),e.editButtonView.bind("isEnabled").to(i),e.unlinkButtonView.bind("isEnabled").to(n),this.listenTo(e,"edit",()=>{this._addFormView()}),this.listenTo(e,"unlink",()=>{t.execute("unlink"),this._hideUI()}),e.keystrokes.set("Esc",(t,e)=>{this._hideUI(),e()}),e.keystrokes.set("Ctrl+K",(t,e)=>{this._addFormView(),e()}),e}_createFormView(){const t=this.editor,e=t.commands.get("link"),i=new Xf(t.locale,e.manualDecorators);return i.urlInputView.bind("value").to(e,"value"),i.urlInputView.bind("isReadOnly").to(e,"isEnabled",t=>!t),i.saveButtonView.bind("isEnabled").to(e),this.listenTo(i,"submit",()=>{t.execute("link",i.urlInputView.inputView.element.value,i.getDecoratorSwitchesState()),this._closeFormView()}),this.listenTo(i,"cancel",()=>{this._closeFormView()}),i.keystrokes.set("Esc",(t,e)=>{this._closeFormView(),e()}),i}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link"),i=t.t;t.keystrokes.set("Ctrl+K",(t,e)=>{e(),this._showUI(!0)}),t.ui.componentFactory.add("link",t=>{const n=new El(t);return n.isEnabled=!0,n.label=i("bh"),n.icon=' ',n.keystroke="Ctrl+K",n.tooltip=!0,n.isToggleable=!0,n.bind("isEnabled").to(e,"isEnabled"),n.bind("isOn").to(e,"value",t=>!!t),this.listenTo(n,"execute",()=>this._showUI(!0)),n})}_enableUserBalloonInteractions(){const t=this.editor.editing.view.document;this.listenTo(t,"click",()=>{this._getSelectedLinkElement()&&this._showUI()}),this.editor.keystrokes.set("Tab",(t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())},{priority:"high"}),this.editor.keystrokes.set("Esc",(t,e)=>{this._isUIVisible&&(this._hideUI(),e())}),Ll({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this._isFormInPanel)return;const t=this.editor.commands.get("link");this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this._balloon.visibleView===this.formView&&this.formView.urlInputView.select(),this.formView.urlInputView.inputView.element.value=t.value||""}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this._balloon.remove(this.formView),this.editor.editing.view.focus())}_showUI(t=!1){this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView)}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let i=this._getSelectedLinkElement(),n=s();const o=()=>{const t=this._getSelectedLinkElement(),e=s();i&&!t||!i&&e!==n?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),i=t,n=e};function s(){return e.selection.focus.getAncestors().reverse().find(t=>t.is("element"))}this.listenTo(t.ui,"update",o),this.listenTo(this._balloon,"change:visibleView",o)}get _isFormInPanel(){return this._balloon.hasView(this.formView)}get _areActionsInPanel(){return this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){return this._balloon.visibleView==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=t.document,i=this._getSelectedLinkElement();return{target:i?t.domConverter.mapViewToDom(i):t.domConverter.viewRangeToDom(e.selection.getFirstRange())}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection;if(e.isCollapsed)return im(e.getFirstPosition());{const i=e.getFirstRange().getTrimmed(),n=im(i.start),o=im(i.end);return n&&n==o&&t.createRangeIn(n).getTrimmed().isEqual(i)?n:null}}}function im(t){return t.getAncestors().find(t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e})}class nm extends Jl{constructor(t,e){super(t),this.type=e}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document,i=Array.from(e.selection.getSelectedBlocks()).filter(e=>sm(e,t.schema)),n=!0===this.value;t.change(t=>{if(n){let e=i[i.length-1].nextSibling,n=Number.POSITIVE_INFINITY,o=[];for(;e&&"listItem"==e.name&&0!==e.getAttribute("listIndent");){const t=e.getAttribute("listIndent");t=i;)s>o.getAttribute("listIndent")&&(s=o.getAttribute("listIndent")),o.getAttribute("listIndent")==s&&t[e?"unshift":"push"](o),o=o[e?"previousSibling":"nextSibling"]}}function sm(t,e){return e.checkChild(t.parent,"listItem")&&!e.isObject(t)}class rm extends Jl{constructor(t,e){super(t),this._indentBy="forward"==e?1:-1}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=t.document;let i=Array.from(e.selection.getSelectedBlocks());t.change(t=>{const e=i[i.length-1];let n=e.nextSibling;for(;n&&"listItem"==n.name&&n.getAttribute("listIndent")>e.getAttribute("listIndent");)i.push(n),n=n.nextSibling;this._indentBy<0&&(i=i.reverse());for(const e of i){const i=e.getAttribute("listIndent")+this._indentBy;i<0?t.rename(e,"paragraph"):t.setAttribute("listIndent",i,e)}})}_checkEnabled(){const t=sh(this.editor.model.document.selection.getSelectedBlocks());if(!t||!t.is("listItem"))return!1;if(this._indentBy>0){const e=t.getAttribute("listIndent"),i=t.getAttribute("listType");let n=t.previousSibling;for(;n&&n.is("listItem")&&n.getAttribute("listIndent")>=e;){if(n.getAttribute("listIndent")==e)return n.getAttribute("listType")==i;n=n.previousSibling}return!1}return!0}}function am(t,e){const i=e.mapper,n=e.writer,o="numbered"==t.getAttribute("listType")?"ol":"ul",s=function(t){const e=t.createContainerElement("li");return e.getFillerOffset=fm,e}(n),r=n.createContainerElement(o,null);return n.insert(n.createPositionAt(r,0),s),i.bindElements(t,s),s}function cm(t,e,i,n){const o=e.parent,s=i.mapper,r=i.writer;let a=s.toViewPosition(n.createPositionBefore(t));const c=hm(t.previousSibling,{sameIndent:!0,smallerIndent:!0,listIndent:t.getAttribute("listIndent")}),l=t.previousSibling;if(c&&c.getAttribute("listIndent")==t.getAttribute("listIndent")){const t=s.toViewElement(c);a=r.breakContainer(r.createPositionAfter(t))}else a=l&&"listItem"==l.name?s.toViewPosition(n.createPositionAt(l,"end")):s.toViewPosition(n.createPositionBefore(t));if(a=dm(a),r.insert(a,o),l&&"listItem"==l.name){const t=s.toViewElement(l),i=r.createRange(r.createPositionAt(t,0),a).getWalker({ignoreElementEnd:!0});for(const t of i)if(t.item.is("li")){const n=r.breakContainer(r.createPositionBefore(t.item)),o=t.item.parent,s=r.createPositionAt(e,"end");lm(r,s.nodeBefore,s.nodeAfter),r.move(r.createRangeOn(o),s),i.position=n}}else{const i=o.nextSibling;if(i&&(i.is("ul")||i.is("ol"))){let n=null;for(const e of i.getChildren()){const i=s.toModelElement(e);if(!(i&&i.getAttribute("listIndent")>t.getAttribute("listIndent")))break;n=e}n&&(r.breakContainer(r.createPositionAfter(n)),r.move(r.createRangeOn(n.parent),r.createPositionAt(e,"end")))}}lm(r,o,o.nextSibling),lm(r,o.previousSibling,o)}function lm(t,e,i){return!e||!i||"ul"!=e.name&&"ol"!=e.name||e.name!=i.name||e.getAttribute("class")!==i.getAttribute("class")?null:t.mergeContainers(t.createPositionAfter(e))}function dm(t){return t.getLastMatchingPosition(t=>t.item.is("uiElement"))}function hm(t,e){const i=!!e.sameIndent,n=!!e.smallerIndent,o=e.listIndent;let s=t;for(;s&&"listItem"==s.name;){const t=s.getAttribute("listIndent");if(i&&o==t||n&&o>t)return s;s=s.previousSibling}return null}function um(t,e,i,n){t.ui.componentFactory.add(e,o=>{const s=t.commands.get(e),r=new El(o);return r.set({label:i,icon:n,tooltip:!0,isToggleable:!0}),r.bind("isOn","isEnabled").to(s,"value","isEnabled"),r.on("execute",()=>{t.execute(e),t.editing.view.focus()}),r})}function fm(){const t=!this.isEmpty&&("ul"==this.getChild(0).name||"ol"==this.getChild(0).name);return this.isEmpty||t?0:Dn.call(this)}function mm(t){return(e,i,n)=>{const o=n.consumable;if(!o.test(i.item,"insert")||!o.test(i.item,"attribute:listType")||!o.test(i.item,"attribute:listIndent"))return;o.consume(i.item,"insert"),o.consume(i.item,"attribute:listType"),o.consume(i.item,"attribute:listIndent");const s=i.item;cm(s,am(s,n),n,t)}}function gm(t,e,i){if(!i.consumable.consume(e.item,"attribute:listType"))return;const n=i.mapper.toViewElement(e.item),o=i.writer;o.breakContainer(o.createPositionBefore(n)),o.breakContainer(o.createPositionAfter(n));const s=n.parent,r="numbered"==e.attributeNewValue?"ol":"ul";o.rename(r,s)}function pm(t,e,i){const n=i.mapper.toViewElement(e.item).parent,o=i.writer;lm(o,n,n.nextSibling),lm(o,n.previousSibling,n);for(const t of e.item.getChildren())i.consumable.consume(t,"insert")}function bm(t,e,i){if("listItem"!=e.item.name){let t=i.mapper.toViewPosition(e.range.start);const n=i.writer,o=[];for(;("ul"==t.parent.name||"ol"==t.parent.name)&&(t=n.breakContainer(t),"li"==t.parent.name);){const e=t,i=n.createPositionAt(t.parent,"end");if(!e.isEqual(i)){const t=n.remove(n.createRange(e,i));o.push(t)}t=n.createPositionAfter(t.parent)}if(o.length>0){for(let e=0;e0){const e=lm(n,i,i.nextSibling);e&&e.parent==i&&t.offset--}}lm(n,t.nodeBefore,t.nodeAfter)}}}function wm(t,e,i){const n=i.mapper.toViewPosition(e.position),o=n.nodeBefore,s=n.nodeAfter;lm(i.writer,o,s)}function km(t,e,i){if(i.consumable.consume(e.viewItem,{name:!0})){const t=i.writer,n=t.createElement("listItem"),o=function(t){let e=0,i=t.parent;for(;i;){if(i.is("li"))e++;else{const t=i.previousSibling;t&&t.is("li")&&e++}i=i.parent}return e}(e.viewItem);t.setAttribute("listIndent",o,n);const s=e.viewItem.parent&&"ol"==e.viewItem.parent.name?"numbered":"bulleted";t.setAttribute("listType",s,n);const r=i.splitToAllowedParent(n,e.modelCursor);if(!r)return;t.insert(n,r.position);const a=function(t,e,i){const{writer:n,schema:o}=i;let s=n.createPositionAfter(t);for(const r of e)if("ul"==r.name||"ol"==r.name)s=i.convertItem(r,s).modelCursor;else{const e=i.convertItem(r,n.createPositionAt(t,"end")),a=e.modelRange.start.nodeAfter;a&&a.is("element")&&!o.checkChild(t,a.name)&&(t=e.modelCursor.parent.is("listItem")?e.modelCursor.parent:Am(e.modelCursor),s=n.createPositionAfter(t))}return s}(n,e.viewItem.getChildren(),i);e.modelRange=t.createRange(e.modelCursor,a),r.cursorParent?e.modelCursor=t.createPositionAt(r.cursorParent,0):e.modelCursor=e.modelRange.end}}function _m(t,e,i){if(i.consumable.test(e.viewItem,{name:!0})){const t=Array.from(e.viewItem.getChildren());for(const e of t){!(e.is("li")||Tm(e))&&e._remove()}}}function vm(t,e,i){if(i.consumable.test(e.viewItem,{name:!0})){if(0===e.viewItem.childCount)return;const t=[...e.viewItem.getChildren()];let i=!1,n=!0;for(const e of t)i&&!Tm(e)&&e._remove(),e.is("text")?(n&&(e._data=e.data.replace(/^\s+/,"")),e.nextSibling&&!Tm(e.nextSibling)||(e._data=e.data.replace(/\s+$/,""))):Tm(e)&&(i=!0),n=!1}}function ym(t){return(e,i)=>{if(i.isPhantom)return;const n=i.modelPosition.nodeBefore;if(n&&n.is("listItem")){const e=i.mapper.toViewElement(n),o=e.getAncestors().find(Tm),s=t.createPositionAt(e,0).getWalker();for(const t of s){if("elementStart"==t.type&&t.item.is("li")){i.viewPosition=t.previousPosition;break}if("elementEnd"==t.type&&t.item==o){i.viewPosition=t.nextPosition;break}}}}}function xm(t,[e,i]){let n,o=e.is("documentFragment")?e.getChild(0):e;if(n=i?this.createSelection(i):this.document.selection,o&&o.is("listItem")){const t=n.getFirstPosition();let e=null;if(t.parent.is("listItem")?e=t.parent:t.nodeBefore&&t.nodeBefore.is("listItem")&&(e=t.nodeBefore),e){const t=e.getAttribute("listIndent");if(t>0)for(;o&&o.is("listItem");)o._setAttribute("listIndent",o.getAttribute("listIndent")+t),o=o.nextSibling}}}function Am(t){const e=new wr({startPosition:t});let i;do{i=e.next()}while(!i.value.item.is("listItem"));return i.value.item}function Cm(t,e,i,n,o,s){const r=hm(e.nodeBefore,{sameIndent:!0,smallerIndent:!0,listIndent:t,foo:"b"}),a=o.mapper,c=o.writer,l=r?r.getAttribute("listIndent"):null;let d;if(r)if(l==t){const t=a.toViewElement(r).parent;d=c.createPositionAfter(t)}else{const t=s.createPositionAt(r,"end");d=a.toViewPosition(t)}else d=i;d=dm(d);for(const t of[...n.getChildren()])Tm(t)&&(d=c.move(c.createRangeOn(t),d).end,lm(c,t,t.nextSibling),lm(c,t.previousSibling,t))}function Tm(t){return t.is("ol")||t.is("ul")}class Pm extends ql{static get pluginName(){return"ListEditing"}static get requires(){return[bf]}init(){const t=this.editor;t.model.schema.register("listItem",{inheritAllFrom:"$block",allowAttributes:["listType","listIndent"]});const e=t.data,i=t.editing;var n;t.model.document.registerPostFixer(e=>function(t,e){const i=t.document.differ.getChanges(),n=new Map;let o=!1;for(const n of i)if("insert"==n.type&&"listItem"==n.name)s(n.position);else if("insert"==n.type&&"listItem"!=n.name){if("$text"!=n.name){const i=n.position.nodeAfter;i.hasAttribute("listIndent")&&(e.removeAttribute("listIndent",i),o=!0),i.hasAttribute("listType")&&(e.removeAttribute("listType",i),o=!0);for(const e of Array.from(t.createRangeIn(i)).filter(t=>t.item.is("listItem")))s(e.previousPosition)}s(n.position.getShiftedBy(n.length))}else"remove"==n.type&&"listItem"==n.name?s(n.position):("attribute"==n.type&&"listIndent"==n.attributeKey||"attribute"==n.type&&"listType"==n.attributeKey)&&s(n.range.start);for(const t of n.values())r(t),a(t);return o;function s(t){const e=t.nodeBefore;if(e&&e.is("listItem")){let i=e;if(n.has(i))return;for(;i.previousSibling&&i.previousSibling.is("listItem");)if(i=i.previousSibling,n.has(i))return;n.set(t.nodeBefore,i)}else{const e=t.nodeAfter;e&&e.is("listItem")&&n.set(e,e)}}function r(t){let i=0,n=null;for(;t&&t.is("listItem");){const s=t.getAttribute("listIndent");if(s>i){let r;null===n?(n=s-i,r=i):(n>s&&(n=s),r=s-n),e.setAttribute("listIndent",r,t),o=!0}else n=null,i=t.getAttribute("listIndent")+1;t=t.nextSibling}}function a(t){let i=[],n=null;for(;t&&t.is("listItem");){const s=t.getAttribute("listIndent");if(n&&n.getAttribute("listIndent")>s&&(i=i.slice(0,s+1)),0!=s)if(i[s]){const n=i[s];t.getAttribute("listType")!=n&&(e.setAttribute("listType",n,t),o=!0)}else i[s]=t.getAttribute("listType");n=t,t=t.nextSibling}}}(t.model,e)),i.mapper.registerViewToModelLength("li",Sm),e.mapper.registerViewToModelLength("li",Sm),i.mapper.on("modelToViewPosition",ym(i.view)),i.mapper.on("viewToModelPosition",(n=t.model,(t,e)=>{const i=e.viewPosition,o=i.parent,s=e.mapper;if("ul"==o.name||"ol"==o.name){if(i.isAtEnd){const t=s.toModelElement(i.nodeBefore),o=s.getModelLength(i.nodeBefore);e.modelPosition=n.createPositionBefore(t).getShiftedBy(o)}else{const t=s.toModelElement(i.nodeAfter);e.modelPosition=n.createPositionBefore(t)}t.stop()}else if("li"==o.name&&i.nodeBefore&&("ul"==i.nodeBefore.name||"ol"==i.nodeBefore.name)){const r=s.toModelElement(o);let a=1,c=i.nodeBefore;for(;c&&Tm(c);)a+=s.getModelLength(c),c=c.previousSibling;e.modelPosition=n.createPositionBefore(r).getShiftedBy(a),t.stop()}})),e.mapper.on("modelToViewPosition",ym(i.view)),t.conversion.for("editingDowncast").add(e=>{e.on("insert",bm,{priority:"high"}),e.on("insert:listItem",mm(t.model)),e.on("attribute:listType:listItem",gm,{priority:"high"}),e.on("attribute:listType:listItem",pm,{priority:"low"}),e.on("attribute:listIndent:listItem",function(t){return(e,i,n)=>{if(!n.consumable.consume(i.item,"attribute:listIndent"))return;const o=n.mapper.toViewElement(i.item),s=n.writer;s.breakContainer(s.createPositionBefore(o)),s.breakContainer(s.createPositionAfter(o));const r=o.parent,a=r.previousSibling,c=s.createRangeOn(r);s.remove(c),a&&a.nextSibling&&lm(s,a,a.nextSibling),Cm(i.attributeOldValue+1,i.range.start,c.start,o,n,t),cm(i.item,o,n,t);for(const t of i.item.getChildren())n.consumable.consume(t,"insert")}}(t.model)),e.on("remove:listItem",function(t){return(e,i,n)=>{const o=n.mapper.toViewPosition(i.position).getLastMatchingPosition(t=>!t.item.is("li")).nodeAfter,s=n.writer;s.breakContainer(s.createPositionBefore(o)),s.breakContainer(s.createPositionAfter(o));const r=o.parent,a=r.previousSibling,c=s.createRangeOn(r),l=s.remove(c);a&&a.nextSibling&&lm(s,a,a.nextSibling),Cm(n.mapper.toModelElement(o).getAttribute("listIndent")+1,i.position,c.start,o,n,t);for(const t of s.createRangeIn(l).getItems())n.mapper.unbindViewElement(t);e.stop()}}(t.model)),e.on("remove",wm,{priority:"low"})}),t.conversion.for("dataDowncast").add(e=>{e.on("insert",bm,{priority:"high"}),e.on("insert:listItem",mm(t.model))}),t.conversion.for("upcast").add(t=>{t.on("element:ul",_m,{priority:"high"}),t.on("element:ol",_m,{priority:"high"}),t.on("element:li",vm,{priority:"high"}),t.on("element:li",km)}),t.model.on("insertContent",xm,{priority:"high"}),t.commands.add("numberedList",new nm(t,"numbered")),t.commands.add("bulletedList",new nm(t,"bulleted")),t.commands.add("indentList",new rm(t,"forward")),t.commands.add("outdentList",new rm(t,"backward"));const o=i.view.document;this.listenTo(o,"enter",(t,e)=>{const i=this.editor.model.document,n=i.selection.getLastPosition().parent;i.selection.isCollapsed&&"listItem"==n.name&&n.isEmpty&&(this.editor.execute("outdentList"),e.preventDefault(),t.stop())}),this.listenTo(o,"delete",(t,e)=>{if("backward"!==e.direction)return;const i=this.editor.model.document.selection;if(!i.isCollapsed)return;const n=i.getFirstPosition();if(!n.isAtStart)return;const o=n.parent;"listItem"===o.name&&(o.previousSibling&&"listItem"===o.previousSibling.name||(this.editor.execute("outdentList"),e.preventDefault(),t.stop()))},{priority:"high"});const s=t=>(e,i)=>{this.editor.commands.get(t).isEnabled&&(this.editor.execute(t),i())};t.keystrokes.set("Tab",s("indentList")),t.keystrokes.set("Shift+Tab",s("outdentList"))}afterInit(){const t=this.editor.commands,e=t.get("indent"),i=t.get("outdent");e&&e.registerChildCommand(t.get("indentList")),i&&i.registerChildCommand(t.get("outdentList"))}}function Sm(t){let e=1;for(const i of t.getChildren())if("ul"==i.name||"ol"==i.name)for(const t of i.getChildren())e+=Sm(t);return e}class Em extends ql{init(){const t=this.editor.t;um(this.editor,"numberedList",t("w"),' '),um(this.editor,"bulletedList",t("x"),' ')}}function Mm(t,e){return t=>{t.on("attribute:url:media",i)};function i(i,n,o){if(!o.consumable.consume(n.item,i.name))return;const s=n.attributeNewValue,r=o.writer,a=o.mapper.toViewElement(n.item);r.remove(r.createRangeIn(a));const c=t.getMediaViewElement(r,s,e);r.insert(r.createPositionAt(a,0),c)}}function Im(t,e,i,n){const o=t.createContainerElement("figure",{class:"media"});return o.getFillerOffset=Rm,t.insert(t.createPositionAt(o,0),e.getMediaViewElement(t,i,n)),o}function Nm(t){const e=t.getSelectedElement();return e&&e.is("media")?e:null}function Om(t,e,i){t.change(n=>{const o=n.createElement("media",{url:e});t.insertContent(o,i),n.setSelection(o,"on")})}function Rm(){return null}class Lm extends Jl{refresh(){const t=this.editor.model,e=t.document.selection,i=t.schema,n=e.getFirstPosition(),o=Nm(e);let s=n.parent;s!=s.root&&(s=s.parent),this.value=o?o.getAttribute("url"):null,this.isEnabled=i.checkChild(s,"media")}execute(t){const e=this.editor.model,i=e.document.selection,n=Nm(i);if(n)e.change(e=>{e.setAttribute("url",t,n)});else{const n=xh(i,e);Om(e,t,n)}}}class Dm{constructor(t,e){const i=e.providers,n=e.extraProviders||[],o=new Set(e.removeProviders),s=i.concat(n).filter(t=>{const e=t.name;return e?!o.has(e):(console.warn(Object(hi.a)("media-embed-no-provider-name: The configured media provider has no name and cannot be used."),{provider:t}),!1)});this.locale=t,this.providerDefinitions=s}hasMedia(t){return!!this._getMedia(t)}getMediaViewElement(t,e,i){return this._getMedia(e).getViewElement(t,i)}_getMedia(t){if(!t)return new zm(this.locale);t=t.trim();for(const e of this.providerDefinitions){const i=e.html;let n=e.url;Array.isArray(n)||(n=[n]);for(const e of n){const n=this._getUrlMatches(t,e);if(n)return new zm(this.locale,t,n,i)}}return null}_getUrlMatches(t,e){let i=t.match(e);if(i)return i;let n=t.replace(/^https?:\/\//,"");return i=n.match(e),i||(n=n.replace(/^www\./,""),i=n.match(e),i||null)}}class zm{constructor(t,e,i,n){this.url=this._getValidUrl(e),this._t=t.t,this._match=i,this._previewRenderer=n}getViewElement(t,e){const i={};if(e.renderForEditingView||e.renderMediaPreview&&this.url&&this._previewRenderer){this.url&&(i["data-oembed-url"]=this.url),e.renderForEditingView&&(i.class="ck-media__wrapper");const n=this._getPreviewHtml(e);return t.createUIElement("div",i,(function(t){const e=this.toDomElement(t);return e.innerHTML=n,e}))}return this.url&&(i.url=this.url),t.createEmptyElement("oembed",i)}_getPreviewHtml(t){return this._previewRenderer?this._previewRenderer(this._match):this.url&&t.renderForEditingView?this._getPlaceholderHtml():""}_getPlaceholderHtml(){const t=new Sl,e=new Pl;return t.text=this._t("Open media in new tab"),e.content=' ',e.viewBox="0 0 64 42",new Fc({tag:"div",attributes:{class:"ck ck-reset_all ck-media__placeholder"},children:[{tag:"div",attributes:{class:"ck-media__placeholder__icon"},children:[e]},{tag:"a",attributes:{class:"ck-media__placeholder__url",target:"_blank",rel:"noopener noreferrer",href:this.url},children:[{tag:"span",attributes:{class:"ck-media__placeholder__url__text"},children:[this.url]},t]}]}).render().outerHTML}_getValidUrl(t){return t?t.match(/^https?/)?t:"https://"+t:null}}i(79);class jm extends ql{static get pluginName(){return"MediaEmbedEditing"}constructor(t){super(t),t.config.define("mediaEmbed",{providers:[{name:"dailymotion",url:/^dailymotion\.com\/video\/(\w+)/,html:t=>''+`
'},{name:"spotify",url:[/^open\.spotify\.com\/(artist\/\w+)/,/^open\.spotify\.com\/(album\/\w+)/,/^open\.spotify\.com\/(track\/\w+)/],html:t=>''+`
'},{name:"youtube",url:[/^(?:m\.)?youtube\.com\/watch\?v=([\w-]+)/,/^(?:m\.)?youtube\.com\/v\/([\w-]+)/,/^youtube\.com\/embed\/([\w-]+)/,/^youtu\.be\/([\w-]+)/],html:t=>''+`VIDEO
'},{name:"vimeo",url:[/^vimeo\.com\/(\d+)/,/^vimeo\.com\/[^/]+\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/album\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/channels\/[^/]+\/(\d+)/,/^vimeo\.com\/groups\/[^/]+\/videos\/(\d+)/,/^vimeo\.com\/ondemand\/[^/]+\/(\d+)/,/^player\.vimeo\.com\/video\/(\d+)/],html:t=>''+`
'},{name:"instagram",url:/^instagram\.com\/p\/(\w+)/},{name:"twitter",url:/^twitter\.com/},{name:"googleMaps",url:/^google\.com\/maps/},{name:"flickr",url:/^flickr\.com/},{name:"facebook",url:/^facebook\.com/}]}),this.registry=new Dm(t.locale,t.config.get("mediaEmbed"))}init(){const t=this.editor,e=t.model.schema,i=t.t,n=t.conversion,o=t.config.get("mediaEmbed.previewsInData"),s=this.registry;t.commands.add("mediaEmbed",new Lm(t)),e.register("media",{isObject:!0,isBlock:!0,allowWhere:"$block",allowAttributes:["url"]}),n.for("dataDowncast").elementToElement({model:"media",view:(t,e)=>{const i=t.getAttribute("url");return Im(e,s,i,{renderMediaPreview:i&&o})}}),n.for("dataDowncast").add(Mm(s,{renderMediaPreview:o})),n.for("editingDowncast").elementToElement({model:"media",view:(t,e)=>{const n=t.getAttribute("url"),o=Im(e,s,n,{renderForEditingView:!0});return r=o,a=e,c=i("ah"),a.setCustomProperty("media",!0,r),_h(r,a,{label:c});var r,a,c}}),n.for("editingDowncast").add(Mm(s,{renderForEditingView:!0})),n.for("upcast").elementToElement({view:{name:"oembed",attributes:{url:!0}},model:(t,e)=>{const i=t.getAttribute("url");if(s.hasMedia(i))return e.createElement("media",{url:i})}}).elementToElement({view:{name:"div",attributes:{"data-oembed-url":!0}},model:(t,e)=>{const i=t.getAttribute("data-oembed-url");if(s.hasMedia(i))return e.createElement("media",{url:i})}})}}const Vm=/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]+$/;class Bm extends ql{static get requires(){return[Kl,Fd]}static get pluginName(){return"AutoMediaEmbed"}constructor(t){super(t),this._timeoutId=null,this._positionToInsert=null}init(){const t=this.editor,e=t.model.document;this.listenTo(t.plugins.get(Kl),"inputTransformation",()=>{const t=e.selection.getFirstRange(),i=sc.fromPosition(t.start);i.stickiness="toPrevious";const n=sc.fromPosition(t.end);n.stickiness="toNext",e.once("change:data",()=>{this._embedMediaBetweenPositions(i,n),i.detach(),n.detach()},{priority:"high"})}),t.commands.get("undo").on("execute",()=>{this._timeoutId&&(ts.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)},{priority:"high"})}_embedMediaBetweenPositions(t,e){const i=this.editor,n=i.plugins.get(jm).registry,o=new Nr(t,e),s=o.getWalker({ignoreElementEnd:!0});let r="";for(const t of s)t.item.is("textProxy")&&(r+=t.item.data);if(r=r.trim(),!r.match(Vm))return;if(!n.hasMedia(r))return;i.commands.get("mediaEmbed").isEnabled&&(this._positionToInsert=sc.fromPosition(t),this._timeoutId=ts.window.setTimeout(()=>{i.model.change(t=>{let e;this._timeoutId=null,t.remove(o),"$graveyard"!==this._positionToInsert.root.rootName&&(e=this._positionToInsert),Om(i.model,r,e),this._positionToInsert.detach(),this._positionToInsert=null})},100))}}i(81);class Fm extends rl{constructor(t,e){super(e);const i=e.t;this.focusTracker=new Ic,this.keystrokes=new yc,this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(i("cf"),Ru,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(i("cg"),Lu,"ck-button-cancel","cancel"),this._focusables=new Bc,this._focusCycler=new bl({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._validators=t,this.setTemplate({tag:"form",attributes:{class:["ck","ck-media-form"],tabindex:"-1"},children:[this.urlInputView,this.saveButtonView,this.cancelButtonView]})}render(){super.render(),Ou({view:this}),[this.urlInputView,this.saveButtonView,this.cancelButtonView].forEach(t=>{this._focusables.add(t),this.focusTracker.add(t.element)}),this.keystrokes.listenTo(this.element);const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t),this.listenTo(this.urlInputView.element,"selectstart",(t,e)=>{e.stopPropagation()},{priority:"high"})}focus(){this._focusCycler.focusFirst()}get url(){return this.urlInputView.inputView.element.value.trim()}set url(t){this.urlInputView.inputView.element.value=t.trim()}isValid(){this.resetFormStatus();for(const t of this._validators){const e=t(this);if(e)return this.urlInputView.errorText=e,!1}return!0}resetFormStatus(){this.urlInputView.errorText=null,this.urlInputView.infoText=this._urlInputViewInfoDefault}_createUrlInput(){const t=this.locale.t,e=new Iu(this.locale,Nu),i=e.inputView;return this._urlInputViewInfoDefault=t("ch"),this._urlInputViewInfoTip=t("ci"),e.label=t("cj"),e.infoText=this._urlInputViewInfoDefault,i.placeholder="https://example.com",i.on("input",()=>{e.infoText=i.element.value?this._urlInputViewInfoTip:this._urlInputViewInfoDefault}),e}_createButton(t,e,i,n){const o=new El(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.extendTemplate({attributes:{class:i}}),n&&o.delegate("execute").to(this,n),o}}class Hm extends ql{static get requires(){return[jm]}static get pluginName(){return"MediaEmbedUI"}init(){const t=this.editor,e=t.commands.get("mediaEmbed"),i=t.plugins.get(jm).registry;this.form=new Fm(function(t,e){return[e=>{if(!e.url.length)return t("am")},i=>{if(!e.hasMedia(i.url))return t("an")}]}(t.t,i),t.locale),t.ui.componentFactory.add("mediaEmbed",i=>{const n=Dl(i);return this._setUpDropdown(n,this.form,e,t),this._setUpForm(this.form,n,e),n})}_setUpDropdown(t,e,i){const n=this.editor,o=n.t,s=t.buttonView;function r(){n.editing.view.focus(),t.isOpen=!1}t.bind("isEnabled").to(i),t.panelView.children.add(e),s.set({label:o("al"),icon:' ',tooltip:!0}),s.on("open",()=>{e.url=i.value||"",e.urlInputView.select(),e.focus()},{priority:"low"}),t.on("submit",()=>{e.isValid()&&(n.execute("mediaEmbed",e.url),r())}),t.on("change:isOpen",()=>e.resetFormStatus()),t.on("cancel",()=>r())}_setUpForm(t,e,i){t.delegate("submit","cancel").to(e),t.urlInputView.bind("value").to(i,"value"),t.urlInputView.bind("isReadOnly").to(i,"isEnabled",t=>!t),t.saveButtonView.bind("isEnabled").to(i)}}i(83);function Um(t,e){if(!t.childCount)return;const i=new lf,n=function(t,e){const i=e.createRangeIn(t),n=new Di({name:/^p|h\d+$/,styles:{"mso-list":/.*/}}),o=[];for(const t of i)if("elementStart"===t.type&&n.match(t.item)){const e=Wm(t.item);o.push({element:t.item,id:e.id,order:e.order,indent:e.indent})}return o}(t,i);if(!n.length)return;let o=null;n.forEach((t,s)=>{if(!o||function(t,e){if(t.id!==e.id)return!0;const i=e.element.previousSibling;if(!i)return!0;return n=i,!(n.is("ol")||n.is("ul"));var n}(n[s-1],t)){const n=function(t,e){const i=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),n=/mso-level-number-format:([^;]*);/gi,o=i.exec(e);let s="decimal";if(o&&o[1]){const t=n.exec(o[1]);t&&t[1]&&(s=t[1].trim())}return{type:"bullet"!==s&&"image"!==s?"ol":"ul",style:s}}(t,e);o=function(t,e,i){const n=new On(t.type),o=e.parent.getChildIndex(e);return i.insertChild(o,n,e.parent),n}(n,t.element,i)}const r=function(t,e){return function(t,e){const i=new Di({name:"span",styles:{"mso-list":"Ignore"}}),n=e.createRangeIn(t);for(const t of n)"elementStart"===t.type&&i.match(t.item)&&e.remove(t.item)}(t,e),e.rename("li",t)}(t.element,i);i.appendChild(r,o)})}function Wm(t){const e={},i=t.getStyle("mso-list");if(i){const t=i.match(/(^|\s+)l(\d+)/i),n=i.match(/\s*lfo(\d+)/i),o=i.match(/\s*level(\d+)/i);t&&n&&o&&(e.id=t[2],e.order=n[1],e.indent=o[1])}return e}const qm=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class $m{isActive(t){return qm.test(t)}execute(t){const e=new lf;!function(t,e){for(const i of t.getChildren())if(i.is("b")&&"normal"===i.getStyle("font-weight")){const n=t.getChildIndex(i);e.remove(i),e.insertChild(n,i.getChildren(),t)}}(t.content,e),function(t,e){for(const i of e.createRangeIn(t)){const t=i.item;if(t.is("li")){const i=t.getChild(0);i.is("p")&&e.unwrapElement(i)}}}(t.content,e)}}function Ym(t){return t.replace(/(\s+)<\/span>/g,(t,e)=>1===e.length?" ":Array(e.length+1).join(" ").substr(0,e.length))}function Gm(t){const e=new DOMParser,i=function(t){return Ym(Ym(t)).replace(/([\s]*?)[\r\n]+(\s*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/ <\//g," ").replace(/ <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>(\s*[\r\n]\s*)<")}(function(t){const e=t.match(/<\/body>(.*?)(<\/html>|$)/);e&&e[1]&&(t=t.slice(0,e.index)+t.slice(e.index).replace(e[1],""));return t}(t=t.replace(/ abc
\n\t\t\t//\n\t\t\tif ( isAttribute && this._wrapAttributeElement( wrapElement, child ) ) {\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// Wrap the child if it is not an attribute element or if it is an attribute element that should be inside\n\t\t\t// `wrapElement` (due to priority).\n\t\t\t//\n\t\t\t// abc
--> abc
\n\t\t\t// abc
--> abc
\n\t\t\t//\n\t\t\telse if ( isText || isEmpty || isUI || ( isAttribute && shouldABeOutsideB( wrapElement, child ) ) ) {\n\t\t\t\t// Clone attribute.\n\t\t\t\tconst newAttribute = wrapElement._clone();\n\n\t\t\t\t// Wrap current node with new attribute.\n\t\t\t\tchild._remove();\n\t\t\t\tnewAttribute._appendChild( child );\n\n\t\t\t\tparent._insertChild( i, newAttribute );\n\t\t\t\tthis._addToClonedElementsGroup( newAttribute );\n\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it.\n\t\t\t//\n\t\t\t// abc
--> abc
\n\t\t\t//\n\t\t\telse if ( isAttribute ) {\n\t\t\t\tthis._wrapChildren( child, 0, child.childCount, wrapElement );\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each wrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of wrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between\n\t * `startOffset` and `endOffset` will be unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} parent\n\t * @param {Number} startOffset\n\t * @param {Number} endOffset\n\t * @param {module:engine/view/element~Element} unwrapElement\n\t */\n\t_unwrapChildren( parent, startOffset, endOffset, unwrapElement ) {\n\t\tlet i = startOffset;\n\t\tconst unwrapPositions = [];\n\n\t\t// Iterate over each element between provided offsets inside parent.\n\t\t// We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes,\n\t\t// so it could get messy. It is safer to it manually in this case.\n\t\twhile ( i < endOffset ) {\n\t\t\tconst child = parent.getChild( i );\n\n\t\t\t// Skip all text nodes. There should be no container element's here either.\n\t\t\tif ( !child.is( 'attributeElement' ) ) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// (In all examples, assume that `unwrapElement` is `` element.)\n\t\t\t//\n\t\t\t// If the child is similar to the given attribute element, unwrap it - it will be completely removed.\n\t\t\t//\n\t\t\t// abc xyz
--> abcxyz
\n\t\t\t//\n\t\t\tif ( child.isSimilar( unwrapElement ) ) {\n\t\t\t\tconst unwrapped = child.getChildren();\n\t\t\t\tconst count = child.childCount;\n\n\t\t\t\t// Replace wrapper element with its children\n\t\t\t\tchild._remove();\n\t\t\t\tparent._insertChild( i, unwrapped );\n\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\n\t\t\t\t// Save start and end position of moved items.\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + count )\n\t\t\t\t);\n\n\t\t\t\t// Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements.\n\t\t\t\ti += count;\n\t\t\t\tendOffset += count - 1;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes.\n\t\t\t// Partial unwrapping will happen only if the elements have the same name.\n\t\t\t//\n\t\t\t// abc xyz
--> abc xyz
\n\t\t\t// abc xyz
--> abc xyz
\n\t\t\t//\n\t\t\tif ( this._unwrapAttributeElement( unwrapElement, child ) ) {\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + 1 )\n\t\t\t\t);\n\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If other nested attribute is found, look through it's children for elements to unwrap.\n\t\t\t//\n\t\t\t// abc
-->
abc
\n\t\t\t//\n\t\t\tthis._unwrapChildren( child, 0, child.childCount, unwrapElement );\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each unwrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of unwrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset || position.offset == endOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Helper function for `view.writer.wrap`. Wraps range with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/range~Range} New range after wrapping, spanning over wrapping attribute element.\n\t */\n\t_wrapRange( range, attribute ) {\n\t\t// Break attributes at range start and end.\n\t\tconst { start: breakStart, end: breakEnd } = this._breakAttributesRange( range, true );\n\t\tconst parentContainer = breakStart.parent;\n\n\t\t// Wrap all children with attribute.\n\t\tconst newRange = this._wrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t\t// Merge attributes at the both ends and return a new range.\n\t\tconst start = this.mergeAttributes( newRange.start );\n\n\t\t// If start position was merged - move end position back.\n\t\tif ( !start.isEqual( newRange.start ) ) {\n\t\t\tnewRange.end.offset--;\n\t\t}\n\t\tconst end = this.mergeAttributes( newRange.end );\n\n\t\treturn new Range( start, end );\n\t}\n\n\t/**\n\t * Helper function for {@link #wrap}. Wraps position with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position\n\t * @param {module:engine/view/attributeelement~AttributeElement} attribute\n\t * @returns {module:engine/view/position~Position} New position after wrapping.\n\t */\n\t_wrapPosition( position, attribute ) {\n\t\t// Return same position when trying to wrap with attribute similar to position parent.\n\t\tif ( attribute.isSimilar( position.parent ) ) {\n\t\t\treturn movePositionToTextNode( position.clone() );\n\t\t}\n\n\t\t// When position is inside text node - break it and place new position between two text nodes.\n\t\tif ( position.parent.is( 'text' ) ) {\n\t\t\tposition = breakTextNode( position );\n\t\t}\n\n\t\t// Create fake element that will represent position, and will not be merged with other attributes.\n\t\tconst fakePosition = this.createAttributeElement();\n\t\tfakePosition._priority = Number.POSITIVE_INFINITY;\n\t\tfakePosition.isSimilar = () => false;\n\n\t\t// Insert fake element in position location.\n\t\tposition.parent._insertChild( position.offset, fakePosition );\n\n\t\t// Range around inserted fake attribute element.\n\t\tconst wrapRange = new Range( position, position.getShiftedBy( 1 ) );\n\n\t\t// Wrap fake element with attribute (it will also merge if possible).\n\t\tthis.wrap( wrapRange, attribute );\n\n\t\t// Remove fake element and place new position there.\n\t\tconst newPosition = new Position( fakePosition.parent, fakePosition.index );\n\t\tfakePosition._remove();\n\n\t\t// If position is placed between text nodes - merge them and return position inside.\n\t\tconst nodeBefore = newPosition.nodeBefore;\n\t\tconst nodeAfter = newPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof Text && nodeAfter instanceof Text ) {\n\t\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t\t}\n\n\t\t// If position is next to text node - move position inside.\n\t\treturn movePositionToTextNode( newPosition );\n\t}\n\n\t/**\n\t * \tWraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by\n\t * \tmerging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper\n\t * \telement to element being wrapped.\n\t *\n\t * \t@private\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * \t@param {module:engine/view/attributeelement~AttributeElement} toWrap AttributeElement to wrap using wrapper element.\n\t * \t@returns {Boolean} Returns `true` if elements are merged.\n\t */\n\t_wrapAttributeElement( wrapper, toWrap ) {\n\t\tif ( !canBeJoined( wrapper, toWrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't merge if name or priority differs.\n\t\tif ( wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if attributes can be merged.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are different we cannot wrap.\n\t\t\tif ( toWrap.hasAttribute( key ) && toWrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if styles can be merged.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( toWrap.hasStyle( key ) && toWrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Move only these attributes that are not present - other are similar.\n\t\t\tif ( !toWrap.hasAttribute( key ) ) {\n\t\t\t\tthis.setAttribute( key, wrapper.getAttribute( key ), toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( !toWrap.hasStyle( key ) ) {\n\t\t\t\tthis.setStyle( key, wrapper.getStyle( key ), toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getClassNames() ) {\n\t\t\tif ( !toWrap.hasClass( key ) ) {\n\t\t\t\tthis.addClass( key, toWrap );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing\n\t * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present\n\t * inside element being unwrapped.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} wrapper Wrapper AttributeElement.\n\t * @param {module:engine/view/attributeelement~AttributeElement} toUnwrap AttributeElement to unwrap using wrapper element.\n\t * @returns {Boolean} Returns `true` if elements are unwrapped.\n\t **/\n\t_unwrapAttributeElement( wrapper, toUnwrap ) {\n\t\tif ( !canBeJoined( wrapper, toUnwrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't unwrap if name or priority differs.\n\t\tif ( wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper attributes.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasAttribute( key ) || toUnwrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper classes.\n\t\tif ( !toUnwrap.hasClass( ...wrapper.getClassNames() ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper styles.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\t// If some styles are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasStyle( key ) || toUnwrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Remove all wrapper's attributes from unwrapped element.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.removeAttribute( key, toUnwrap );\n\t\t}\n\n\t\t// Remove all wrapper's classes from unwrapped element.\n\t\tthis.removeClass( Array.from( wrapper.getClassNames() ), toUnwrap );\n\n\t\t// Remove all wrapper's styles from unwrapped element.\n\t\tthis.removeStyle( Array.from( wrapper.getStyleNames() ), toUnwrap );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range.\n\t *\n\t * @private\n\t * @param {module:engine/view/range~Range} range Range which `start` and `end` positions will be used to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/range~Range} New range with located at break positions.\n\t */\n\t_breakAttributesRange( range, forceSplitText = false ) {\n\t\tconst rangeStart = range.start;\n\t\tconst rangeEnd = range.end;\n\n\t\tvalidateRangeContainer( range, this.document );\n\n\t\t// Break at the collapsed position. Return new collapsed range.\n\t\tif ( range.isCollapsed ) {\n\t\t\tconst position = this._breakAttributes( range.start, forceSplitText );\n\n\t\t\treturn new Range( position, position );\n\t\t}\n\n\t\tconst breakEnd = this._breakAttributes( rangeEnd, forceSplitText );\n\t\tconst count = breakEnd.parent.childCount;\n\t\tconst breakStart = this._breakAttributes( rangeStart, forceSplitText );\n\n\t\t// Calculate new break end offset.\n\t\tbreakEnd.offset += breakEnd.parent.childCount - count;\n\n\t\treturn new Range( breakStart, breakEnd );\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\n\t * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\n\t * is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\n\t *\n\t * @private\n\t * @param {module:engine/view/position~Position} position Position where to break attributes.\n\t * @param {Boolean} [forceSplitText=false] If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns {module:engine/view/position~Position} New position after breaking the attributes.\n\t */\n\t_breakAttributes( position, forceSplitText = false ) {\n\t\tconst positionOffset = position.offset;\n\t\tconst positionParent = position.parent;\n\n\t\t// If position is placed inside EmptyElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'emptyElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break inside EmptyElement instance.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-empty-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-empty-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside UIElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'uiElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break inside UIElement instance.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-ui-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-ui-element', this.document );\n\t\t}\n\n\t\t// There are no attributes to break and text nodes breaking is not forced.\n\t\tif ( !forceSplitText && positionParent.is( 'text' ) && isContainerOrFragment( positionParent.parent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Position's parent is container, so no attributes to break.\n\t\tif ( isContainerOrFragment( positionParent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Break text and start again in new position.\n\t\tif ( positionParent.is( 'text' ) ) {\n\t\t\treturn this._breakAttributes( breakTextNode( position ), forceSplitText );\n\t\t}\n\n\t\tconst length = positionParent.childCount;\n\n\t\t//
foobar{}
\n\t\t// foobar []
\n\t\t// foobar []
\n\t\tif ( positionOffset == length ) {\n\t\t\tconst newPosition = new Position( positionParent.parent, positionParent.index + 1 );\n\n\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t} else {\n\t\t\t// foo{}bar
\n\t\t\t// foo[]bar
\n\t\t\t// foo{}bar
\n\t\t\tif ( positionOffset === 0 ) {\n\t\t\t\tconst newPosition = new Position( positionParent.parent, positionParent.index );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t\t// foob{}ar
\n\t\t\t// foob[]ar
\n\t\t\t// foob []ar
\n\t\t\t// foob []ar
\n\t\t\telse {\n\t\t\t\tconst offsetAfter = positionParent.index + 1;\n\n\t\t\t\t// Break element.\n\t\t\t\tconst clonedNode = positionParent._clone();\n\n\t\t\t\t// Insert cloned node to position's parent node.\n\t\t\t\tpositionParent.parent._insertChild( offsetAfter, clonedNode );\n\t\t\t\tthis._addToClonedElementsGroup( clonedNode );\n\n\t\t\t\t// Get nodes to move.\n\t\t\t\tconst count = positionParent.childCount - positionOffset;\n\t\t\t\tconst nodesToMove = positionParent._removeChildren( positionOffset, count );\n\n\t\t\t\t// Move nodes to cloned node.\n\t\t\t\tclonedNode._appendChild( nodesToMove );\n\n\t\t\t\t// Create new position to work on.\n\t\t\t\tconst newPosition = new Position( positionParent.parent, offsetAfter );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was\n\t * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements\n\t * from the group now keep a reference to the given attribute element.\n\t *\n\t * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}.\n\t *\n\t * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to save.\n\t */\n\t_addToClonedElementsGroup( element ) {\n\t\t// Add only if the element is in document tree.\n\t\tif ( !element.root.is( 'rootElement' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse the element's children recursively to find other attribute elements that also might got inserted.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._addToClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = element.id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\tgroup = new Set();\n\t\t\tthis._cloneGroups.set( id, group );\n\t\t}\n\n\t\tgroup.add( element );\n\t\telement._clonesGroup = group;\n\t}\n\n\t/**\n\t * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element}\n\t * from its clones group.\n\t *\n\t * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it).\n\t * This allows to reference the whole group even if the element was already removed from the tree.\n\t *\n\t * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @private\n\t * @param {module:engine/view/attributeelement~AttributeElement} element Attribute element to remove.\n\t */\n\t_removeFromClonedElementsGroup( element ) {\n\t\t// Traverse the element's children recursively to find other attribute elements that also got removed.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = element.id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\treturn;\n\t\t}\n\n\t\tgroup.delete( element );\n\t\t// Not removing group from element on purpose!\n\t\t// If other parts of code have reference to this element, they will be able to get references to other elements from the group.\n\t}\n}\n\n// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements.\nfunction _hasNonUiChildren( parent ) {\n\treturn Array.from( parent.getChildren() ).some( child => !child.is( 'uiElement' ) );\n}\n\n/**\n * Attribute element need to be instance of attribute element.\n *\n * @error view-writer-wrap-invalid-attribute\n */\n\n// Returns first parent container of specified {@link module:engine/view/position~Position Position}.\n// Position's parent node is checked as first, then next parents are checked.\n// Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n//\n// @param {module:engine/view/position~Position} position Position used as a start point to locate parent container.\n// @returns {module:engine/view/containerelement~ContainerElement|module:engine/view/documentfragment~DocumentFragment|undefined}\n// Parent container element or `undefined` if container is not found.\nfunction getParentContainer( position ) {\n\tlet parent = position.parent;\n\n\twhile ( !isContainerOrFragment( parent ) ) {\n\t\tif ( !parent ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tparent = parent.parent;\n\t}\n\n\treturn parent;\n}\n\n// Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\n// can be wrapped otuside second element. It is done by comparing elements'\n// {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\n// {@link module:engine/view/element~Element#getIdentity identities} are compared.\n//\n// @param {module:engine/view/attributeelement~AttributeElement} a\n// @param {module:engine/view/attributeelement~AttributeElement} b\n// @returns {Boolean}\nfunction shouldABeOutsideB( a, b ) {\n\tif ( a.priority < b.priority ) {\n\t\treturn true;\n\t} else if ( a.priority > b.priority ) {\n\t\treturn false;\n\t}\n\n\t// When priorities are equal and names are different - use identities.\n\treturn a.getIdentity() < b.getIdentity();\n}\n\n// Returns new position that is moved to near text node. Returns same position if there is no text node before of after\n// specified position.\n//\n//\t\tfoo[]
-> foo{}
\n//\t\t[]foo
-> {}foo
\n//\n// @param {module:engine/view/position~Position} position\n// @returns {module:engine/view/position~Position} Position located inside text node or same position if there is no text nodes\n// before or after position location.\nfunction movePositionToTextNode( position ) {\n\tconst nodeBefore = position.nodeBefore;\n\n\tif ( nodeBefore && nodeBefore.is( 'text' ) ) {\n\t\treturn new Position( nodeBefore, nodeBefore.data.length );\n\t}\n\n\tconst nodeAfter = position.nodeAfter;\n\n\tif ( nodeAfter && nodeAfter.is( 'text' ) ) {\n\t\treturn new Position( nodeAfter, 0 );\n\t}\n\n\treturn position;\n}\n\n// Breaks text node into two text nodes when possible.\n//\n//\t\tfoo{}bar
-> foo[]bar
\n//\t\t{}foobar
-> []foobar
\n//\t\tfoobar{}
-> foobar[]
\n//\n// @param {module:engine/view/position~Position} position Position that need to be placed inside text node.\n// @returns {module:engine/view/position~Position} New position after breaking text node.\nfunction breakTextNode( position ) {\n\tif ( position.offset == position.parent.data.length ) {\n\t\treturn new Position( position.parent.parent, position.parent.index + 1 );\n\t}\n\n\tif ( position.offset === 0 ) {\n\t\treturn new Position( position.parent.parent, position.parent.index );\n\t}\n\n\t// Get part of the text that need to be moved.\n\tconst textToMove = position.parent.data.slice( position.offset );\n\n\t// Leave rest of the text in position's parent.\n\tposition.parent._data = position.parent.data.slice( 0, position.offset );\n\n\t// Insert new text node after position's parent text node.\n\tposition.parent.parent._insertChild( position.parent.index + 1, new Text( textToMove ) );\n\n\t// Return new position between two newly created text nodes.\n\treturn new Position( position.parent.parent, position.parent.index + 1 );\n}\n\n// Merges two text nodes into first node. Removes second node and returns merge position.\n//\n// @param {module:engine/view/text~Text} t1 First text node to merge. Data from second text node will be moved at the end of\n// this text node.\n// @param {module:engine/view/text~Text} t2 Second text node to merge. This node will be removed after merging.\n// @returns {module:engine/view/position~Position} Position after merging text nodes.\nfunction mergeTextNodes( t1, t2 ) {\n\t// Merge text data into first text node and remove second one.\n\tconst nodeBeforeLength = t1.data.length;\n\tt1._data += t2.data;\n\tt2._remove();\n\n\treturn new Position( t1, nodeBeforeLength );\n}\n\n// Checks if provided nodes are valid to insert. Checks if each node is an instance of\n// {@link module:engine/view/text~Text Text} or {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n// {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n// {@link module:engine/view/emptyelement~EmptyElement EmptyElement} or\n// {@link module:engine/view/uielement~UIElement UIElement}.\n//\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n// contains instances that are not {@link module:engine/view/text~Text Texts},\n// {@link module:engine/view/emptyelement~EmptyElement EmptyElements},\n// {@link module:engine/view/uielement~UIElement UIElements},\n// {@link module:engine/view/attributeelement~AttributeElement AttributeElements} or\n// {@link module:engine/view/containerelement~ContainerElement ContainerElements}.\n//\n// @param Iterable. nodes\n// @param {Object} errorContext\nfunction validateNodesToInsert( nodes, errorContext ) {\n\tfor ( const node of nodes ) {\n\t\tif ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define\n\t\t\t/**\n\t\t\t * Inserted nodes should be valid to insert. of {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n\t\t\t * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n\t\t\t * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\n\t\t\t * {@link module:engine/view/uielement~UIElement UIElement}, {@link module:engine/view/text~Text Text}.\n\t\t\t *\n\t\t\t * @error view-writer-insert-invalid-node\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-insert-invalid-node', errorContext );\n\t\t}\n\n\t\tif ( !node.is( 'text' ) ) {\n\t\t\tvalidateNodesToInsert( node.getChildren(), errorContext );\n\t\t}\n\t}\n}\n\nconst validNodesToInsert = [ Text, AttributeElement, ContainerElement, EmptyElement, UIElement ];\n\n// Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\n//\n// @param {module:engine/view/node~Node} node\n// @returns {Boolean} Returns `true` if node is instance of ContainerElement or DocumentFragment.\nfunction isContainerOrFragment( node ) {\n\treturn node && ( node.is( 'containerElement' ) || node.is( 'documentFragment' ) );\n}\n\n// Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\n// inside same {@link module:engine/view/containerelement~ContainerElement container element}.\n// Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\n//\n// @param {module:engine/view/range~Range} range\n// @param {Object} errorContext\nfunction validateRangeContainer( range, errorContext ) {\n\tconst startContainer = getParentContainer( range.start );\n\tconst endContainer = getParentContainer( range.end );\n\n\tif ( !startContainer || !endContainer || startContainer !== endContainer ) {\n\t\t/**\n\t\t * Range container is invalid. This can happen if {@link module:engine/view/range~Range#start range start} and\n\t\t * {@link module:engine/view/range~Range#end range end} positions are not placed inside same container or\n\t\t * parent container for these positions cannot be found.\n\t\t *\n\t\t * @error view-writer-invalid-range-container\n\t\t */\n\n\t\tthrow new CKEditorError( 'view-writer-invalid-range-container', errorContext );\n\t}\n}\n\n// Checks if two attribute elements can be joined together. Elements can be joined together if, and only if\n// they do not have ids specified.\n//\n// @private\n// @param {module:engine/view/element~Element} a\n// @param {module:engine/view/element~Element} b\n// @returns {Boolean}\nfunction canBeJoined( a, b ) {\n\treturn a.id === null && b.id === null;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/istext\n */\n\n/**\n * Checks if the object is a native DOM Text node.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isText( obj ) {\n\treturn Object.prototype.toString.call( obj ) == '[object Text]';\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\n\n/**\n * Set of utils related to block and inline fillers handling.\n *\n * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all\n * empty elements which should be selectable with elements or characters called \"fillers\". Unfortunately there is no one\n * universal filler, this is why two types are uses:\n *\n * * Block filler is an element which fill block elements, like ``. CKEditor uses ` ` as a block filler during the editing,\n * as browsers do natively. So instead of an empty `
` there will be `
`. The advantage of block filler is that\n * it is transparent for the selection, so when the caret is before the ` ` and user presses right arrow he will be\n * moved to the next paragraph, not after the ` `. The disadvantage is that it breaks a block, so it can not be used\n * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER ` ` filler} can be replaced with any other\n * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space}.\n *\n * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty\n * `` surrendered by text: `foo bar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width\n * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined\n * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to\n * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not\n * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional\n * code is needed to handle the caret.\n *\n * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the\n * view.\n *\n * @module engine/view/filler\n */\n\n/**\n * Non-breaking space filler creator. This is a function which creates ` ` text node.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~BR_FILLER\n * @function\n */\nexport const NBSP_FILLER = domDocument => domDocument.createTextNode( '\\u00A0' );\n\n/**\n * ` ` filler creator. This is a function which creates ` ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @function\n */\nexport const BR_FILLER = domDocument => {\n\tconst fillerBr = domDocument.createElement( 'br' );\n\tfillerBr.dataset.ckeFiller = true;\n\n\treturn fillerBr;\n};\n\n/**\n * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}.\n */\nexport const INLINE_FILLER_LENGTH = 7;\n\n/**\n * Inline filler which is a sequence of the zero width spaces.\n */\nexport const INLINE_FILLER = ( () => {\n\tlet inlineFiller = '';\n\n\tfor ( let i = 0; i < INLINE_FILLER_LENGTH; i++ ) {\n\t\tinlineFiller += '\\u200b';\n\t}\n\n\treturn inlineFiller;\n} )(); // Usu IIF so the INLINE_FILLER appears as a constant in the docs.\n\n/**\n * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true\n *\t\tstartsWithFiller( document.createTextNode( 'foo' ) ); // false\n *\t\tstartsWithFiller( document.createElement( 'p' ) ); // false\n *\n * @param {Node} domNode DOM node.\n * @returns {Boolean} True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function startsWithFiller( domNode ) {\n\treturn isText( domNode ) && ( domNode.data.substr( 0, INLINE_FILLER_LENGTH ) === INLINE_FILLER );\n}\n\n/**\n * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true\n *\t\tisInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false\n *\n * @param {Text} domText DOM text node.\n * @returns {Boolean} True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function isInlineFiller( domText ) {\n\treturn domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller( domText );\n}\n\n/**\n * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it,\n * if text node contains it.\n *\n *\t\tgetDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true\n *\t\tgetDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true\n *\n * @param {Text} domText DOM text node, possible with inline filler.\n * @returns {String} Data without filler.\n */\nexport function getDataWithoutFiller( domText ) {\n\tif ( startsWithFiller( domText ) ) {\n\t\treturn domText.data.slice( INLINE_FILLER_LENGTH );\n\t} else {\n\t\treturn domText.data;\n\t}\n}\n\n/**\n * Assign key observer which move cursor from the end of the inline filler to the beginning of it when\n * the left arrow is pressed, so the filler does not break navigation.\n *\n * @param {module:engine/view/view~View} view View controller instance we should inject quirks handling on.\n */\nexport function injectQuirksHandling( view ) {\n\tview.document.on( 'keydown', jumpOverInlineFiller );\n}\n\n// Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation.\nfunction jumpOverInlineFiller( evt, data ) {\n\tif ( data.keyCode == keyCodes.arrowleft ) {\n\t\tconst domSelection = data.domTarget.ownerDocument.defaultView.getSelection();\n\n\t\tif ( domSelection.rangeCount == 1 && domSelection.getRangeAt( 0 ).collapsed ) {\n\t\t\tconst domParent = domSelection.getRangeAt( 0 ).startContainer;\n\t\t\tconst domOffset = domSelection.getRangeAt( 0 ).startOffset;\n\n\t\t\tif ( startsWithFiller( domParent ) && domOffset <= INLINE_FILLER_LENGTH ) {\n\t\t\t\tdomSelection.collapse( domParent, 0 );\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/fastdiff\n */\n\n/**\n * Finds positions of the first and last change in the given string/array and generates a set of changes:\n *\n *\t\tfastDiff( '12a', '12xyza' );\n *\t\t// [ { index: 2, type: 'insert', values: [ 'x', 'y', 'z' ] } ]\n *\n *\t\tfastDiff( '12a', '12aa' );\n *\t\t// [ { index: 3, type: 'insert', values: [ 'a' ] } ]\n *\n *\t\tfastDiff( '12xyza', '12a' );\n *\t\t// [ { index: 2, type: 'delete', howMany: 3 } ]\n *\n *\t\tfastDiff( [ '1', '2', 'a', 'a' ], [ '1', '2', 'a' ] );\n *\t\t// [ { index: 3, type: 'delete', howMany: 1 } ]\n *\n *\t\tfastDiff( [ '1', '2', 'a', 'b', 'c', '3' ], [ '2', 'a', 'b' ] );\n *\t\t// [ { index: 0, type: 'insert', values: [ '2', 'a', 'b' ] }, { index: 3, type: 'delete', howMany: 6 } ]\n *\n * Passed arrays can contain any type of data, however to compare them correctly custom comparator function\n * should be passed as a third parameter:\n *\n *\t\tfastDiff( [ { value: 1 }, { value: 2 } ], [ { value: 1 }, { value: 3 } ], ( a, b ) => {\n *\t\t\treturn a.value === b.value;\n *\t\t} );\n *\t\t// [ { index: 1, type: 'insert', values: [ { value: 3 } ] }, { index: 2, type: 'delete', howMany: 1 } ]\n *\n * The resulted set of changes can be applied to the input in order to transform it into the output, for example:\n *\n *\t\tlet input = '12abc3';\n *\t\tconst output = '2ab';\n *\t\tconst changes = fastDiff( input, output );\n *\n *\t\tchanges.forEach( change => {\n *\t\t\tif ( change.type == 'insert' ) {\n *\t\t\t\tinput = input.substring( 0, change.index ) + change.values.join( '' ) + input.substring( change.index );\n *\t\t\t} else if ( change.type == 'delete' ) {\n *\t\t\t\tinput = input.substring( 0, change.index ) + input.substring( change.index + change.howMany );\n *\t\t\t}\n *\t\t} );\n *\n *\t\t// input equals output now\n *\n * or in case of arrays:\n *\n *\t\tlet input = [ '1', '2', 'a', 'b', 'c', '3' ];\n *\t\tconst output = [ '2', 'a', 'b' ];\n *\t\tconst changes = fastDiff( input, output );\n *\n *\t\tchanges.forEach( change => {\n *\t\t\tif ( change.type == 'insert' ) {\n *\t\t\t\tinput = input.slice( 0, change.index ).concat( change.values, input.slice( change.index ) );\n *\t\t\t} else if ( change.type == 'delete' ) {\n *\t\t\t\tinput = input.slice( 0, change.index ).concat( input.slice( change.index + change.howMany ) );\n *\t\t\t}\n *\t\t} );\n *\n *\t\t// input equals output now\n *\n * By passing `true` as the fourth parameter (`atomicChanges`) the output of this function will become compatible with\n * the {@link module:utils/diff~diff `diff()`} function:\n *\n *\t\tfastDiff( '12a', '12xyza' );\n *\t\t// [ 'equal', 'equal', 'insert', 'insert', 'insert', 'equal' ]\n *\n * The default output format of this function is compatible with the output format of\n * {@link module:utils/difftochanges~diffToChanges `diffToChanges()`}. The `diffToChanges()` input format is, in turn,\n * compatible with the output of {@link module:utils/diff~diff `diff()`}:\n *\n *\t\tconst a = '1234';\n *\t\tconst b = '12xyz34';\n *\n *\t\t// Both calls will return the same results (grouped changes format).\n *\t\tfastDiff( a, b );\n *\t\tdiffToChanges( diff( a, b ) );\n *\n *\t\t// Again, both calls will return the same results (atomic changes format).\n *\t\tfastDiff( a, b, null, true );\n *\t\tdiff( a, b );\n *\n *\n * @param {Array|String} a Input array or string.\n * @param {Array|String} b Input array or string.\n * @param {Function} [cmp] Optional function used to compare array values, by default `===` (strict equal operator) is used.\n * @param {Boolean} [atomicChanges=false] Whether an array of `inset|delete|equal` operations should\n * be returned instead of changes set. This makes this function compatible with {@link module:utils/diff~diff `diff()`}.\n * @returns {Array} Array of changes.\n */\nexport default function fastDiff( a, b, cmp, atomicChanges = false ) {\n\t// Set the comparator function.\n\tcmp = cmp || function( a, b ) {\n\t\treturn a === b;\n\t};\n\n\t// Transform text or any iterable into arrays for easier, consistent processing.\n\tif ( !Array.isArray( a ) ) {\n\t\ta = Array.from( a );\n\t}\n\n\tif ( !Array.isArray( b ) ) {\n\t\tb = Array.from( b );\n\t}\n\n\t// Find first and last change.\n\tconst changeIndexes = findChangeBoundaryIndexes( a, b, cmp );\n\n\t// Transform into changes array.\n\treturn atomicChanges ? changeIndexesToAtomicChanges( changeIndexes, b.length ) : changeIndexesToChanges( b, changeIndexes );\n}\n\n// Finds position of the first and last change in the given arrays. For example:\n//\n//\t\tconst indexes = findChangeBoundaryIndexes( [ '1', '2', '3', '4' ], [ '1', '3', '4', '2', '4' ] );\n//\t\tconsole.log( indexes ); // { firstIndex: 1, lastIndexOld: 3, lastIndexNew: 4 }\n//\n// The above indexes means that in the first array the modified part is `1[23]4` and in the second array it is `1[342]4`.\n// Based on such indexes, array with `insert`/`delete` operations which allows transforming first value into the second one\n// can be generated.\n//\n// @param {Array} arr1\n// @param {Array} arr2\n// @param {Function} cmp Comparator function.\n// @returns {Object}\n// @returns {Number} return.firstIndex Index of the first change in both values (always the same for both).\n// @returns {Number} result.lastIndexOld Index of the last common value in `arr1`.\n// @returns {Number} result.lastIndexNew Index of the last common value in `arr2`.\nfunction findChangeBoundaryIndexes( arr1, arr2, cmp ) {\n\t// Find the first difference between passed values.\n\tconst firstIndex = findFirstDifferenceIndex( arr1, arr2, cmp );\n\n\t// If arrays are equal return -1 indexes object.\n\tif ( firstIndex === -1 ) {\n\t\treturn { firstIndex: -1, lastIndexOld: -1, lastIndexNew: -1 };\n\t}\n\n\t// Remove the common part of each value and reverse them to make it simpler to find the last difference between them.\n\tconst oldArrayReversed = cutAndReverse( arr1, firstIndex );\n\tconst newArrayReversed = cutAndReverse( arr2, firstIndex );\n\n\t// Find the first difference between reversed values.\n\t// It should be treated as \"how many elements from the end the last difference occurred\".\n\t//\n\t// For example:\n\t//\n\t// \t\t\t\tinitial\t->\tafter cut\t-> reversed:\n\t// oldValue:\t'321ba'\t->\t'21ba'\t\t-> 'ab12'\n\t// newValue:\t'31xba'\t->\t'1xba'\t\t-> 'abx1'\n\t// lastIndex:\t\t\t\t\t\t\t-> 2\n\t//\n\t// So the last change occurred two characters from the end of the arrays.\n\tconst lastIndex = findFirstDifferenceIndex( oldArrayReversed, newArrayReversed, cmp );\n\n\t// Use `lastIndex` to calculate proper offset, starting from the beginning (`lastIndex` kind of starts from the end).\n\tconst lastIndexOld = arr1.length - lastIndex;\n\tconst lastIndexNew = arr2.length - lastIndex;\n\n\treturn { firstIndex, lastIndexOld, lastIndexNew };\n}\n\n// Returns a first index on which given arrays differ. If both arrays are the same, -1 is returned.\n//\n// @param {Array} arr1\n// @param {Array} arr2\n// @param {Function} cmp Comparator function.\n// @returns {Number}\nfunction findFirstDifferenceIndex( arr1, arr2, cmp ) {\n\tfor ( let i = 0; i < Math.max( arr1.length, arr2.length ); i++ ) {\n\t\tif ( arr1[ i ] === undefined || arr2[ i ] === undefined || !cmp( arr1[ i ], arr2[ i ] ) ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1; // Return -1 if arrays are equal.\n}\n\n// Returns a copy of the given array with `howMany` elements removed starting from the beginning and in reversed order.\n//\n// @param {Array} arr Array to be processed.\n// @param {Number} howMany How many elements from array beginning to remove.\n// @returns {Array} Shortened and reversed array.\nfunction cutAndReverse( arr, howMany ) {\n\treturn arr.slice( howMany ).reverse();\n}\n\n// Generates changes array based on change indexes from `findChangeBoundaryIndexes` function. This function will\n// generate array with 0 (no changes), 1 (deletion or insertion) or 2 records (insertion and deletion).\n//\n// @param {Array} newArray New array for which change indexes were calculated.\n// @param {Object} changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\n// @returns {Array.} Array of changes compatible with {@link module:utils/difftochanges~diffToChanges} format.\nfunction changeIndexesToChanges( newArray, changeIndexes ) {\n\tconst result = [];\n\tconst { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\n\n\t// Order operations as 'insert', 'delete' array to keep compatibility with {@link module:utils/difftochanges~diffToChanges}\n\t// in most cases. However, 'diffToChanges' does not stick to any order so in some cases\n\t// (for example replacing '12345' with 'abcd') it will generate 'delete', 'insert' order.\n\tif ( lastIndexNew - firstIndex > 0 ) {\n\t\tresult.push( {\n\t\t\tindex: firstIndex,\n\t\t\ttype: 'insert',\n\t\t\tvalues: newArray.slice( firstIndex, lastIndexNew )\n\t\t} );\n\t}\n\n\tif ( lastIndexOld - firstIndex > 0 ) {\n\t\tresult.push( {\n\t\t\tindex: firstIndex + ( lastIndexNew - firstIndex ), // Increase index of what was inserted.\n\t\t\ttype: 'delete',\n\t\t\thowMany: lastIndexOld - firstIndex\n\t\t} );\n\t}\n\n\treturn result;\n}\n\n// Generates array with set `equal|insert|delete` operations based on change indexes from `findChangeBoundaryIndexes` function.\n//\n// @param {Object} changeIndexes Change indexes object from `findChangeBoundaryIndexes` function.\n// @param {Number} newLength Length of the new array on which `findChangeBoundaryIndexes` calculated change indexes.\n// @returns {Array.} Array of changes compatible with {@link module:utils/diff~diff} format.\nfunction changeIndexesToAtomicChanges( changeIndexes, newLength ) {\n\tconst { firstIndex, lastIndexOld, lastIndexNew } = changeIndexes;\n\n\t// No changes.\n\tif ( firstIndex === -1 ) {\n\t\treturn Array( newLength ).fill( 'equal' );\n\t}\n\n\tlet result = [];\n\tif ( firstIndex > 0 ) {\n\t\tresult = result.concat( Array( firstIndex ).fill( 'equal' ) );\n\t}\n\n\tif ( lastIndexNew - firstIndex > 0 ) {\n\t\tresult = result.concat( Array( lastIndexNew - firstIndex ).fill( 'insert' ) );\n\t}\n\n\tif ( lastIndexOld - firstIndex > 0 ) {\n\t\tresult = result.concat( Array( lastIndexOld - firstIndex ).fill( 'delete' ) );\n\t}\n\n\tif ( lastIndexNew < newLength ) {\n\t\tresult = result.concat( Array( newLength - lastIndexNew ).fill( 'equal' ) );\n\t}\n\n\treturn result;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/diff\n */\n\nimport fastDiff from '../src/fastdiff';\n\n// The following code is based on the \"O(NP) Sequence Comparison Algorithm\"\n// by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\n\n/**\n * Calculates the difference between two arrays or strings producing an array containing a list of changes\n * necessary to transform input into output.\n *\n *\t\tdiff( 'aba', 'acca' ); // [ 'equal', 'insert', 'insert', 'delete', 'equal' ]\n *\n * This function is based on the \"O(NP) Sequence Comparison Algorithm\" by Sun Wu, Udi Manber, Gene Myers, Webb Miller.\n * Unfortunately, while it gives the most precise results, its to complex for longer strings/arrow (above 200 items).\n * Therefore, `diff()` automatically switches to {@link module:utils/fastdiff~fastDiff `fastDiff()`} when detecting\n * such a scenario. The return formats of both functions are identical.\n *\n * @param {Array|String} a Input array or string.\n * @param {Array|String} b Output array or string.\n * @param {Function} [cmp] Optional function used to compare array values, by default === is used.\n * @returns {Array} Array of changes.\n */\nexport default function diff( a, b, cmp ) {\n\t// Set the comparator function.\n\tcmp = cmp || function( a, b ) {\n\t\treturn a === b;\n\t};\n\n\tconst aLength = a.length;\n\tconst bLength = b.length;\n\n\t// Perform `fastDiff` for longer strings/arrays (see #269).\n\tif ( aLength > 200 || bLength > 200 || aLength + bLength > 300 ) {\n\t\treturn diff.fastDiff( a, b, cmp, true );\n\t}\n\n\t// Temporary action type statics.\n\tlet _insert, _delete;\n\n\t// Swapped the arrays to use the shorter one as the first one.\n\tif ( bLength < aLength ) {\n\t\tconst tmp = a;\n\n\t\ta = b;\n\t\tb = tmp;\n\n\t\t// We swap the action types as well.\n\t\t_insert = 'delete';\n\t\t_delete = 'insert';\n\t} else {\n\t\t_insert = 'insert';\n\t\t_delete = 'delete';\n\t}\n\n\tconst m = a.length;\n\tconst n = b.length;\n\tconst delta = n - m;\n\n\t// Edit scripts, for each diagonal.\n\tconst es = {};\n\t// Furthest points, the furthest y we can get on each diagonal.\n\tconst fp = {};\n\n\tfunction snake( k ) {\n\t\t// We use -1 as an alternative below to handle initial values ( instead of filling the fp with -1 first ).\n\t\t// Furthest points (y) on the diagonal below k.\n\t\tconst y1 = ( fp[ k - 1 ] !== undefined ? fp[ k - 1 ] : -1 ) + 1;\n\t\t// Furthest points (y) on the diagonal above k.\n\t\tconst y2 = fp[ k + 1 ] !== undefined ? fp[ k + 1 ] : -1;\n\t\t// The way we should go to get further.\n\t\tconst dir = y1 > y2 ? -1 : 1;\n\n\t\t// Clone previous changes array (if any).\n\t\tif ( es[ k + dir ] ) {\n\t\t\tes[ k ] = es[ k + dir ].slice( 0 );\n\t\t}\n\n\t\t// Create changes array.\n\t\tif ( !es[ k ] ) {\n\t\t\tes[ k ] = [];\n\t\t}\n\n\t\t// Push the action.\n\t\tes[ k ].push( y1 > y2 ? _insert : _delete );\n\n\t\t// Set the beginning coordinates.\n\t\tlet y = Math.max( y1, y2 );\n\t\tlet x = y - k;\n\n\t\t// Traverse the diagonal as long as the values match.\n\t\twhile ( x < m && y < n && cmp( a[ x ], b[ y ] ) ) {\n\t\t\tx++;\n\t\t\ty++;\n\t\t\t// Push no change action.\n\t\t\tes[ k ].push( 'equal' );\n\t\t}\n\n\t\treturn y;\n\t}\n\n\tlet p = 0;\n\tlet k;\n\n\t// Traverse the graph until we reach the end of the longer string.\n\tdo {\n\t\t// Updates furthest points and edit scripts for diagonals below delta.\n\t\tfor ( k = -p; k < delta; k++ ) {\n\t\t\tfp[ k ] = snake( k );\n\t\t}\n\n\t\t// Updates furthest points and edit scripts for diagonals above delta.\n\t\tfor ( k = delta + p; k > delta; k-- ) {\n\t\t\tfp[ k ] = snake( k );\n\t\t}\n\n\t\t// Updates furthest point and edit script for the delta diagonal.\n\t\t// note that the delta diagonal is the one which goes through the sink (m, n).\n\t\tfp[ delta ] = snake( delta );\n\n\t\tp++;\n\t} while ( fp[ delta ] !== n );\n\n\t// Return the final list of edit changes.\n\t// We remove the first item that represents the action for the injected nulls.\n\treturn es[ delta ].slice( 1 );\n}\n\n// Store the API in static property to easily overwrite it in tests.\n// Too bad dependency injection does not work in Webpack + ES 6 (const) + Babel.\ndiff.fastDiff = fastDiff;\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/insertat\n */\n\n/**\n * Inserts node to the parent at given index.\n *\n * @param {Element} parentElement Parent element.\n * @param {Number} index Insertions index.\n * @param {Node} nodeToInsert Node to insert.\n */\nexport default function insertAt( parentElement, index, nodeToInsert ) {\n\tparentElement.insertBefore( nodeToInsert, parentElement.childNodes[ index ] || null );\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/remove\n */\n\n/**\n * Removes given node from parent.\n *\n * @param {Node} node Node to remove.\n */\nexport default function remove( node ) {\n\tconst parent = node.parentNode;\n\n\tif ( parent ) {\n\t\tparent.removeChild( node );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/isnode\n */\n\n/**\n * Checks if the object is a native DOM Node.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isNode( obj ) {\n\tif ( obj ) {\n\t\tif ( obj.defaultView ) {\n\t\t\treturn obj instanceof obj.defaultView.Document;\n\t\t} else if ( obj.ownerDocument && obj.ownerDocument.defaultView ) {\n\t\t\treturn obj instanceof obj.ownerDocument.defaultView.Node;\n\t\t}\n\t}\n\n\treturn false;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* globals Node */\n\n/**\n * @module engine/view/renderer\n */\n\nimport ViewText from './text';\nimport ViewPosition from './position';\nimport { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller } from './filler';\n\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\nimport diff from '@ckeditor/ckeditor5-utils/src/diff';\nimport insertAt from '@ckeditor/ckeditor5-utils/src/dom/insertat';\nimport remove from '@ckeditor/ckeditor5-utils/src/dom/remove';\nimport ObservableMixin from '@ckeditor/ckeditor5-utils/src/observablemixin';\nimport CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\nimport isNode from '@ckeditor/ckeditor5-utils/src/dom/isnode';\nimport fastDiff from '@ckeditor/ckeditor5-utils/src/fastdiff';\nimport env from '@ckeditor/ckeditor5-utils/src/env';\n\n/**\n * Renderer is responsible for updating the DOM structure and the DOM selection based on\n * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}.\n * In other words, it renders the view to the DOM.\n *\n * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many\n * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring\n * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are\n * affected as little as possible.\n *\n * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions\n * to and from the DOM.\n */\nexport default class Renderer {\n\t/**\n\t * Creates a renderer instance.\n\t *\n\t * @param {module:engine/view/domconverter~DomConverter} domConverter Converter instance.\n\t * @param {module:engine/view/documentselection~DocumentSelection} selection View selection.\n\t */\n\tconstructor( domConverter, selection ) {\n\t\t/**\n\t\t * Set of DOM Documents instances.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.domDocuments = new Set();\n\n\t\t/**\n\t\t * Converter instance.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/domconverter~DomConverter}\n\t\t */\n\t\tthis.domConverter = domConverter;\n\n\t\t/**\n\t\t * Set of nodes which attributes changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedAttributes = new Set();\n\n\t\t/**\n\t\t * Set of elements which child lists changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedChildren = new Set();\n\n\t\t/**\n\t\t * Set of text nodes which text data changed and may need to be rendered.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Set.}\n\t\t */\n\t\tthis.markedTexts = new Set();\n\n\t\t/**\n\t\t * View selection. Renderer updates DOM selection based on the view selection.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/documentselection~DocumentSelection}\n\t\t */\n\t\tthis.selection = selection;\n\n\t\t/**\n\t\t * Indicates if the view document is focused and selection can be rendered. Selection will not be rendered if\n\t\t * this is set to `false`.\n\t\t *\n\t\t * @member {Boolean}\n\t\t */\n\t\tthis.isFocused = false;\n\n\t\t/**\n\t\t * The text node in which the inline filler was rendered.\n\t\t *\n\t\t * @private\n\t\t * @member {Text}\n\t\t */\n\t\tthis._inlineFiller = null;\n\n\t\t/**\n\t\t * DOM element containing fake selection.\n\t\t *\n\t\t * @private\n\t\t * @type {null|HTMLElement}\n\t\t */\n\t\tthis._fakeSelectionContainer = null;\n\t}\n\n\t/**\n\t * Marks a view node to be updated in the DOM by {@link #render `render()`}.\n\t *\n\t * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized.\n\t *\n\t * @see #markedAttributes\n\t * @see #markedChildren\n\t * @see #markedTexts\n\t *\n\t * @param {module:engine/view/document~ChangeType} type Type of the change.\n\t * @param {module:engine/view/node~Node} node Node to be marked.\n\t */\n\tmarkToSync( type, node ) {\n\t\tif ( type === 'text' ) {\n\t\t\tif ( this.domConverter.mapViewToDom( node.parent ) ) {\n\t\t\t\tthis.markedTexts.add( node );\n\t\t\t}\n\t\t} else {\n\t\t\t// If the node has no DOM element it is not rendered yet,\n\t\t\t// its children/attributes do not need to be marked to be sync.\n\t\t\tif ( !this.domConverter.mapViewToDom( node ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( type === 'attributes' ) {\n\t\t\t\tthis.markedAttributes.add( node );\n\t\t\t} else if ( type === 'children' ) {\n\t\t\t\tthis.markedChildren.add( node );\n\t\t\t} else {\n\t\t\t\t/**\n\t\t\t\t * Unknown type passed to Renderer.markToSync.\n\t\t\t\t *\n\t\t\t\t * @error renderer-unknown-type\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'view-renderer-unknown-type: Unknown type passed to Renderer.markToSync.', this );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and\n\t * the current view selection (if needed) to the DOM by applying a minimal set of changes to it.\n\t *\n\t * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection,\n\t * so it does as little as it is needed to update the DOM.\n\t *\n\t * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed\n\t * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be\n\t * removed as long as the selection is in the text node which needed it at first.\n\t */\n\trender() {\n\t\tlet inlineFillerPosition;\n\n\t\t// Refresh mappings.\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildrenMappings( element );\n\t\t}\n\n\t\t// There was inline filler rendered in the DOM but it's not\n\t\t// at the selection position any more, so we can remove it\n\t\t// (cause even if it's needed, it must be placed in another location).\n\t\tif ( this._inlineFiller && !this._isSelectionInInlineFiller() ) {\n\t\t\tthis._removeInlineFiller();\n\t\t}\n\n\t\t// If we've got the filler, let's try to guess its position in the view.\n\t\tif ( this._inlineFiller ) {\n\t\t\tinlineFillerPosition = this._getInlineFillerPosition();\n\t\t}\n\t\t// Otherwise, if it's needed, create it at the selection position.\n\t\telse if ( this._needsInlineFillerAtSelection() ) {\n\t\t\tinlineFillerPosition = this.selection.getFirstPosition();\n\n\t\t\t// Do not use `markToSync` so it will be added even if the parent is already added.\n\t\t\tthis.markedChildren.add( inlineFillerPosition.parent );\n\t\t}\n\n\t\tfor ( const element of this.markedAttributes ) {\n\t\t\tthis._updateAttrs( element );\n\t\t}\n\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildren( element, { inlineFillerPosition } );\n\t\t}\n\n\t\tfor ( const node of this.markedTexts ) {\n\t\t\tif ( !this.markedChildren.has( node.parent ) && this.domConverter.mapViewToDom( node.parent ) ) {\n\t\t\t\tthis._updateText( node, { inlineFillerPosition } );\n\t\t\t}\n\t\t}\n\n\t\t// Check whether the inline filler is required and where it really is in the DOM.\n\t\t// At this point in most cases it will be in the DOM, but there are exceptions.\n\t\t// For example, if the inline filler was deep in the created DOM structure, it will not be created.\n\t\t// Similarly, if it was removed at the beginning of this function and then neither text nor children were updated,\n\t\t// it will not be present.\n\t\t// Fix those and similar scenarios.\n\t\tif ( inlineFillerPosition ) {\n\t\t\tconst fillerDomPosition = this.domConverter.viewPositionToDom( inlineFillerPosition );\n\t\t\tconst domDocument = fillerDomPosition.parent.ownerDocument;\n\n\t\t\tif ( !startsWithFiller( fillerDomPosition.parent ) ) {\n\t\t\t\t// Filler has not been created at filler position. Create it now.\n\t\t\t\tthis._inlineFiller = addInlineFiller( domDocument, fillerDomPosition.parent, fillerDomPosition.offset );\n\t\t\t} else {\n\t\t\t\t// Filler has been found, save it.\n\t\t\t\tthis._inlineFiller = fillerDomPosition.parent;\n\t\t\t}\n\t\t} else {\n\t\t\t// There is no filler needed.\n\t\t\tthis._inlineFiller = null;\n\t\t}\n\n\t\tthis._updateSelection();\n\t\tthis._updateFocus();\n\n\t\tthis.markedTexts.clear();\n\t\tthis.markedAttributes.clear();\n\t\tthis.markedChildren.clear();\n\t}\n\n\t/**\n\t * Updates mappings of view element's children.\n\t *\n\t * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'.\n\t * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements.\n\t * Thanks to that these elements do not need to be re-rendered completely.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewElement The view element whose children mappings will be updated.\n\t */\n\t_updateChildrenMappings( viewElement ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM and there is no need to process it.\n\t\t\treturn;\n\t\t}\n\n\t\tconst actualDomChildren = this.domConverter.mapViewToDom( viewElement ).childNodes;\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument, { withChildren: false } )\n\t\t);\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\t\tconst actions = this._findReplaceActions( diff, actualDomChildren, expectedDomChildren );\n\n\t\tif ( actions.indexOf( 'replace' ) !== -1 ) {\n\t\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action === 'replace' ) {\n\t\t\t\t\tconst insertIndex = counter.equal + counter.insert;\n\t\t\t\t\tconst deleteIndex = counter.equal + counter.delete;\n\t\t\t\t\tconst viewChild = viewElement.getChild( insertIndex );\n\n\t\t\t\t\t// The 'uiElement' is a special one and its children are not stored in a view (#799),\n\t\t\t\t\t// so we cannot use it with replacing flow (since it uses view children during rendering\n\t\t\t\t\t// which will always result in rendering empty element).\n\t\t\t\t\tif ( viewChild && !viewChild.is( 'uiElement' ) ) {\n\t\t\t\t\t\tthis._updateElementMappings( viewChild, actualDomChildren[ deleteIndex ] );\n\t\t\t\t\t}\n\n\t\t\t\t\tremove( expectedDomChildren[ insertIndex ] );\n\t\t\t\t\tcounter.equal++;\n\t\t\t\t} else {\n\t\t\t\t\tcounter[ action ]++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates mappings of a given view element.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewElement The view element whose mappings will be updated.\n\t * @param {Node} domElement The DOM element representing the given view element.\n\t */\n\t_updateElementMappings( viewElement, domElement ) {\n\t\t// Remap 'DomConverter' bindings.\n\t\tthis.domConverter.unbindDomElement( domElement );\n\t\tthis.domConverter.bindElements( domElement, viewElement );\n\n\t\t// View element may have children which needs to be updated, but are not marked, mark them to update.\n\t\tthis.markedChildren.add( viewElement );\n\n\t\t// Because we replace new view element mapping with the existing one, the corresponding DOM element\n\t\t// will not be rerendered. The new view element may have different attributes than the previous one.\n\t\t// Since its corresponding DOM element will not be rerendered, new attributes will not be added\n\t\t// to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more\n\t\t// detailed case study.\n\t\t// Also there are cases where replaced element is removed from the view structure and then has\n\t\t// its attributes changed or removed. In such cases the element will not be present in `markedAttributes`\n\t\t// and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated.\n\t\t// To prevent such situations we always mark reused element to have its attributes rerenderd (#1560).\n\t\tthis.markedAttributes.add( viewElement );\n\t}\n\n\t/**\n\t * Gets the position of the inline filler based on the current selection.\n\t * Here, we assume that we know that the filler is needed and\n\t * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed,\n\t * it is somewhere at the selection position.\n\t *\n\t * Note: The filler position cannot be restored based on the filler's DOM text node, because\n\t * when this method is called (before rendering), the bindings will often be broken. View-to-DOM\n\t * bindings are only dependable after rendering.\n\t *\n\t * @private\n\t * @returns {module:engine/view/position~Position}\n\t */\n\t_getInlineFillerPosition() {\n\t\tconst firstPos = this.selection.getFirstPosition();\n\n\t\tif ( firstPos.parent.is( 'text' ) ) {\n\t\t\treturn ViewPosition._createBefore( this.selection.getFirstPosition().parent );\n\t\t} else {\n\t\t\treturn firstPos;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if the selection has not left the inline filler's text node.\n\t * If it is `true`, it means that the filler had been added for a reason and the selection did not\n\t * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler and selection are in the same place.\n\t */\n\t_isSelectionInInlineFiller() {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Note, we can't check if selection's position equals position of the\n\t\t// this._inlineFiller node, because of #663. We may not be able to calculate\n\t\t// the filler's position in the view at this stage.\n\t\t// Instead, we check it the other way – whether selection is anchored in\n\t\t// that text node or next to it.\n\n\t\t// Possible options are:\n\t\t// \"FILLER{}\"\n\t\t// \"FILLERadded-text{}\"\n\t\tconst selectionPosition = this.selection.getFirstPosition();\n\t\tconst position = this.domConverter.viewPositionToDom( selectionPosition );\n\n\t\tif ( position && isText( position.parent ) && startsWithFiller( position.parent ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Removes the inline filler.\n\t *\n\t * @private\n\t */\n\t_removeInlineFiller() {\n\t\tconst domFillerNode = this._inlineFiller;\n\n\t\t// Something weird happened and the stored node doesn't contain the filler's text.\n\t\tif ( !startsWithFiller( domFillerNode ) ) {\n\t\t\t/**\n\t\t\t * The inline filler node was lost. Most likely, something overwrote the filler text node\n\t\t\t * in the DOM.\n\t\t\t *\n\t\t\t * @error view-renderer-filler-was-lost\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-renderer-filler-was-lost: The inline filler node was lost.', this );\n\t\t}\n\n\t\tif ( isInlineFiller( domFillerNode ) ) {\n\t\t\tdomFillerNode.parentNode.removeChild( domFillerNode );\n\t\t} else {\n\t\t\tdomFillerNode.data = domFillerNode.data.substr( INLINE_FILLER_LENGTH );\n\t\t}\n\n\t\tthis._inlineFiller = null;\n\t}\n\n\t/**\n\t * Checks if the inline {@link module:engine/view/filler filler} should be added.\n\t *\n\t * @private\n\t * @returns {Boolean} `true` if the inline filler should be added.\n\t */\n\t_needsInlineFillerAtSelection() {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selectionPosition = this.selection.getFirstPosition();\n\t\tconst selectionParent = selectionPosition.parent;\n\t\tconst selectionOffset = selectionPosition.offset;\n\n\t\t// If there is no DOM root we do not care about fillers.\n\t\tif ( !this.domConverter.mapViewToDom( selectionParent.root ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( selectionParent.is( 'element' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Prevent adding inline filler inside elements with contenteditable=false.\n\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/1170\n\t\tif ( !isEditable( selectionParent ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We have block filler, we do not need inline one.\n\t\tif ( selectionOffset === selectionParent.getFillerOffset() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nodeBefore = selectionPosition.nodeBefore;\n\t\tconst nodeAfter = selectionPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof ViewText || nodeAfter instanceof ViewText ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks if text needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/text~Text} viewText View text to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\t_updateText( viewText, options ) {\n\t\tconst domText = this.domConverter.findCorrespondingDomText( viewText );\n\t\tconst newDomText = this.domConverter.viewToDom( viewText, domText.ownerDocument );\n\n\t\tconst actualText = domText.data;\n\t\tlet expectedText = newDomText.data;\n\n\t\tconst filler = options.inlineFillerPosition;\n\n\t\tif ( filler && filler.parent == viewText.parent && filler.offset == viewText.index ) {\n\t\t\texpectedText = INLINE_FILLER + expectedText;\n\t\t}\n\n\t\tif ( actualText != expectedText ) {\n\t\t\tconst actions = fastDiff( actualText, expectedText );\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action.type === 'insert' ) {\n\t\t\t\t\tdomText.insertData( action.index, action.values.join( '' ) );\n\t\t\t\t} else { // 'delete'\n\t\t\t\t\tdomText.deleteData( action.index, action.howMany );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if attribute list needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement The view element to update.\n\t */\n\t_updateAttrs( viewElement ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated\n\t\t\t// in 'this._updateChildrenMappings()'. There is no need to process it as new view element which\n\t\t\t// replaced old 'viewElement' mapping was also added to 'this.markedAttributes'\n\t\t\t// in 'this._updateChildrenMappings()' so it will be processed separately.\n\t\t\treturn;\n\t\t}\n\n\t\tconst domAttrKeys = Array.from( domElement.attributes ).map( attr => attr.name );\n\t\tconst viewAttrKeys = viewElement.getAttributeKeys();\n\n\t\t// Add or overwrite attributes.\n\t\tfor ( const key of viewAttrKeys ) {\n\t\t\tdomElement.setAttribute( key, viewElement.getAttribute( key ) );\n\t\t}\n\n\t\t// Remove from DOM attributes which do not exists in the view.\n\t\tfor ( const key of domAttrKeys ) {\n\t\t\tif ( !viewElement.hasAttribute( key ) ) {\n\t\t\t\tdomElement.removeAttribute( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if elements child list needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t * @param {module:engine/view/element~Element} viewElement View element to update.\n\t * @param {Object} options\n\t * @param {module:engine/view/position~Position} options.inlineFillerPosition The position where the inline\n\t * filler should be rendered.\n\t */\n\t_updateChildren( viewElement, options ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM.\n\t\t\t// There is no need to process it. It will be processed when re-inserted.\n\t\t\treturn;\n\t\t}\n\n\t\tconst inlineFillerPosition = options.inlineFillerPosition;\n\t\tconst actualDomChildren = this.domConverter.mapViewToDom( viewElement ).childNodes;\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, domElement.ownerDocument, { bind: true, inlineFillerPosition } )\n\t\t);\n\n\t\t// Inline filler element has to be created as it is present in the DOM, but not in the view. It is required\n\t\t// during diffing so text nodes could be compared correctly and also during rendering to maintain\n\t\t// proper order and indexes while updating the DOM.\n\t\tif ( inlineFillerPosition && inlineFillerPosition.parent === viewElement ) {\n\t\t\taddInlineFiller( domElement.ownerDocument, expectedDomChildren, inlineFillerPosition.offset );\n\t\t}\n\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\n\t\tlet i = 0;\n\t\tconst nodesToUnbind = new Set();\n\n\t\tfor ( const action of diff ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\tinsertAt( domElement, i, expectedDomChildren[ i ] );\n\t\t\t\ti++;\n\t\t\t} else if ( action === 'delete' ) {\n\t\t\t\tnodesToUnbind.add( actualDomChildren[ i ] );\n\t\t\t\tremove( actualDomChildren[ i ] );\n\t\t\t} else { // 'equal'\n\t\t\t\t// Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).\n\t\t\t\tthis._markDescendantTextToSync( this.domConverter.domToView( expectedDomChildren[ i ] ) );\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\t// Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during\n\t\t// comparision with the expected DOM. We don't need to check child nodes, because if child node was reinserted,\n\t\t// it was moved to DOM tree out of the removed node.\n\t\tfor ( const node of nodesToUnbind ) {\n\t\t\tif ( !node.parentNode ) {\n\t\t\t\tthis.domConverter.unbindDomElement( node );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shorthand for diffing two arrays or node lists of DOM nodes.\n\t *\n\t * @private\n\t * @param {Array.|NodeList} actualDomChildren Actual DOM children\n\t * @param {Array.|NodeList} expectedDomChildren Expected DOM children.\n\t * @returns {Array.} The list of actions based on the {@link module:utils/diff~diff} function.\n\t */\n\t_diffNodeLists( actualDomChildren, expectedDomChildren ) {\n\t\tactualDomChildren = filterOutFakeSelectionContainer( actualDomChildren, this._fakeSelectionContainer );\n\n\t\treturn diff( actualDomChildren, expectedDomChildren, sameNodes.bind( null, this.domConverter ) );\n\t}\n\n\t/**\n\t * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared\n\t * within one `insert`/`delete` action group, for example:\n\t *\n\t * \t\tActual DOM:\t\tFoo BarBaz Bax
\n\t * \t\tExpected DOM:\tBar123 Baz 456
\n\t * \t\tInput actions:\t[ insert, insert, delete, delete, equal, insert, delete ]\n\t * \t\tOutput actions:\t[ insert, replace, delete, equal, replace ]\n\t *\n\t * @private\n\t * @param {Array.} actions Actions array which is a result of the {@link module:utils/diff~diff} function.\n\t * @param {Array.|NodeList} actualDom Actual DOM children\n\t * @param {Array.} expectedDom Expected DOM children.\n\t * @returns {Array.} Actions array modified with the `replace` actions.\n\t */\n\t_findReplaceActions( actions, actualDom, expectedDom ) {\n\t\t// If there is no both 'insert' and 'delete' actions, no need to check for replaced elements.\n\t\tif ( actions.indexOf( 'insert' ) === -1 || actions.indexOf( 'delete' ) === -1 ) {\n\t\t\treturn actions;\n\t\t}\n\n\t\tlet newActions = [];\n\t\tlet actualSlice = [];\n\t\tlet expectedSlice = [];\n\n\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\texpectedSlice.push( expectedDom[ counter.equal + counter.insert ] );\n\t\t\t} else if ( action === 'delete' ) {\n\t\t\t\tactualSlice.push( actualDom[ counter.equal + counter.delete ] );\n\t\t\t} else { // equal\n\t\t\t\tnewActions = newActions.concat( diff( actualSlice, expectedSlice, areSimilar ).map( x => x === 'equal' ? 'replace' : x ) );\n\t\t\t\tnewActions.push( 'equal' );\n\t\t\t\t// Reset stored elements on 'equal'.\n\t\t\t\tactualSlice = [];\n\t\t\t\texpectedSlice = [];\n\t\t\t}\n\t\t\tcounter[ action ]++;\n\t\t}\n\n\t\treturn newActions.concat( diff( actualSlice, expectedSlice, areSimilar ).map( x => x === 'equal' ? 'replace' : x ) );\n\t}\n\n\t/**\n\t * Marks text nodes to be synchronized.\n\t *\n\t * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked.\n\t *\n\t * @private\n\t * @param {module:engine/view/node~Node} viewNode View node to sync.\n\t */\n\t_markDescendantTextToSync( viewNode ) {\n\t\tif ( !viewNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( viewNode.is( 'text' ) ) {\n\t\t\tthis.markedTexts.add( viewNode );\n\t\t} else if ( viewNode.is( 'element' ) ) {\n\t\t\tfor ( const child of viewNode.getChildren() ) {\n\t\t\t\tthis._markDescendantTextToSync( child );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the selection needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\t_updateSelection() {\n\t\t// If there is no selection - remove DOM and fake selections.\n\t\tif ( this.selection.rangeCount === 0 ) {\n\t\t\tthis._removeDomSelection();\n\t\t\tthis._removeFakeSelection();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst domRoot = this.domConverter.mapViewToDom( this.selection.editableElement );\n\n\t\t// Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element.\n\t\tif ( !this.isFocused || !domRoot ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Render selection.\n\t\tif ( this.selection.isFake ) {\n\t\t\tthis._updateFakeSelection( domRoot );\n\t\t} else {\n\t\t\tthis._removeFakeSelection();\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t}\n\n\t/**\n\t * Updates the fake selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the fake selection container should be added.\n\t */\n\t_updateFakeSelection( domRoot ) {\n\t\tconst domDocument = domRoot.ownerDocument;\n\n\t\tif ( !this._fakeSelectionContainer ) {\n\t\t\tthis._fakeSelectionContainer = createFakeSelectionContainer( domDocument );\n\t\t}\n\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\t// Bind fake selection container with the current selection *position*.\n\t\tthis.domConverter.bindFakeSelection( container, this.selection );\n\n\t\tif ( !this._fakeSelectionNeedsUpdate( domRoot ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !container.parentElement || container.parentElement != domRoot ) {\n\t\t\tdomRoot.appendChild( container );\n\t\t}\n\n\t\tcontainer.textContent = this.selection.fakeSelectionLabel || '\\u00A0';\n\n\t\tconst domSelection = domDocument.getSelection();\n\t\tconst domRange = domDocument.createRange();\n\n\t\tdomSelection.removeAllRanges();\n\t\tdomRange.selectNodeContents( container );\n\t\tdomSelection.addRange( domRange );\n\t}\n\n\t/**\n\t * Updates the DOM selection.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where the DOM selection should be rendered.\n\t */\n\t_updateDomSelection( domRoot ) {\n\t\tconst domSelection = domRoot.ownerDocument.defaultView.getSelection();\n\n\t\t// Let's check whether DOM selection needs updating at all.\n\t\tif ( !this._domSelectionNeedsUpdate( domSelection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-range selection is not available in most browsers, and, at least in Chrome, trying to\n\t\t// set such selection, that is not continuous, throws an error. Because of that, we will just use anchor\n\t\t// and focus of view selection.\n\t\t// Since we are not supporting multi-range selection, we also do not need to check if proper editable is\n\t\t// selected. If there is any editable selected, it is okay (editable is taken from selection anchor).\n\t\tconst anchor = this.domConverter.viewPositionToDom( this.selection.anchor );\n\t\tconst focus = this.domConverter.viewPositionToDom( this.selection.focus );\n\n\t\t// Focus the new editing host.\n\t\t// Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721).\n\t\tdomRoot.focus();\n\n\t\tdomSelection.collapse( anchor.parent, anchor.offset );\n\t\tdomSelection.extend( focus.parent, focus.offset );\n\n\t\t// Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n\t\tif ( env.isGecko ) {\n\t\t\tfixGeckoSelectionAfterBr( focus, domSelection );\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether a given DOM selection needs to be updated.\n\t *\n\t * @private\n\t * @param {Selection} domSelection The DOM selection to check.\n\t * @returns {Boolean}\n\t */\n\t_domSelectionNeedsUpdate( domSelection ) {\n\t\tif ( !this.domConverter.isDomSelectionCorrect( domSelection ) ) {\n\t\t\t// Current DOM selection is in incorrect position. We need to update it.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst oldViewSelection = domSelection && this.domConverter.domSelectionToView( domSelection );\n\n\t\tif ( oldViewSelection && this.selection.isEqual( oldViewSelection ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If selection is not collapsed, it does not need to be updated if it is similar.\n\t\tif ( !this.selection.isCollapsed && this.selection.isSimilar( oldViewSelection ) ) {\n\t\t\t// Selection did not changed and is correct, do not update.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Selections are not similar.\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks whether the fake selection needs to be updated.\n\t *\n\t * @private\n\t * @param {HTMLElement} domRoot A valid DOM root where a new fake selection container should be added.\n\t * @returns {Boolean}\n\t */\n\t_fakeSelectionNeedsUpdate( domRoot ) {\n\t\tconst container = this._fakeSelectionContainer;\n\t\tconst domSelection = domRoot.ownerDocument.getSelection();\n\n\t\t// Fake selection needs to be updated if there's no fake selection container, or the container currently sits\n\t\t// in a different root.\n\t\tif ( !container || container.parentElement !== domRoot ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Make sure that the selection actually is within the fake selection.\n\t\tif ( domSelection.anchorNode !== container && !container.contains( domSelection.anchorNode ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn container.textContent !== this.selection.fakeSelectionLabel;\n\t}\n\n\t/**\n\t * Removes the DOM selection.\n\t *\n\t * @private\n\t */\n\t_removeDomSelection() {\n\t\tfor ( const doc of this.domDocuments ) {\n\t\t\tconst domSelection = doc.getSelection();\n\n\t\t\tif ( domSelection.rangeCount ) {\n\t\t\t\tconst activeDomElement = doc.activeElement;\n\t\t\t\tconst viewElement = this.domConverter.mapDomToView( activeDomElement );\n\n\t\t\t\tif ( activeDomElement && viewElement ) {\n\t\t\t\t\tdoc.getSelection().removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the fake selection.\n\t *\n\t * @private\n\t */\n\t_removeFakeSelection() {\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\tif ( container ) {\n\t\t\tcontainer.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if focus needs to be updated and possibly updates it.\n\t *\n\t * @private\n\t */\n\t_updateFocus() {\n\t\tif ( this.isFocused ) {\n\t\t\tconst editable = this.selection.editableElement;\n\n\t\t\tif ( editable ) {\n\t\t\t\tthis.domConverter.focus( editable );\n\t\t\t}\n\t\t}\n\t}\n}\n\nmix( Renderer, ObservableMixin );\n\n// Checks if provided element is editable.\n//\n// @private\n// @param {module:engine/view/element~Element} element\n// @returns {Boolean}\nfunction isEditable( element ) {\n\tif ( element.getAttribute( 'contenteditable' ) == 'false' ) {\n\t\treturn false;\n\t}\n\n\tconst parent = element.findAncestor( element => element.hasAttribute( 'contenteditable' ) );\n\n\treturn !parent || parent.getAttribute( 'contenteditable' ) == 'true';\n}\n\n// Adds inline filler at a given position.\n//\n// The position can be given as an array of DOM nodes and an offset in that array,\n// or a DOM parent element and an offset in that element.\n//\n// @private\n// @param {Document} domDocument\n// @param {Element|Array.} domParentOrArray\n// @param {Number} offset\n// @returns {Text} The DOM text node that contains an inline filler.\nfunction addInlineFiller( domDocument, domParentOrArray, offset ) {\n\tconst childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes;\n\tconst nodeAfterFiller = childNodes[ offset ];\n\n\tif ( isText( nodeAfterFiller ) ) {\n\t\tnodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data;\n\n\t\treturn nodeAfterFiller;\n\t} else {\n\t\tconst fillerNode = domDocument.createTextNode( INLINE_FILLER );\n\n\t\tif ( Array.isArray( domParentOrArray ) ) {\n\t\t\tchildNodes.splice( offset, 0, fillerNode );\n\t\t} else {\n\t\t\tinsertAt( domParentOrArray, offset, fillerNode );\n\t\t}\n\n\t\treturn fillerNode;\n\t}\n}\n\n// Whether two DOM nodes should be considered as similar.\n// Nodes are considered similar if they have the same tag name.\n//\n// @private\n// @param {Node} node1\n// @param {Node} node2\n// @returns {Boolean}\nfunction areSimilar( node1, node2 ) {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\t!isText( node1 ) && !isText( node2 ) &&\n\t\tnode1.tagName.toLowerCase() === node2.tagName.toLowerCase();\n}\n\n// Whether two dom nodes should be considered as the same.\n// Two nodes which are considered the same are:\n//\n//\t\t* Text nodes with the same text.\n//\t\t* Element nodes represented by the same object.\n//\t\t* Two block filler elements.\n//\n// @private\n// @param {String} blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}.\n// @param {Node} node1\n// @param {Node} node2\n// @returns {Boolean}\nfunction sameNodes( domConverter, actualDomChild, expectedDomChild ) {\n\t// Elements.\n\tif ( actualDomChild === expectedDomChild ) {\n\t\treturn true;\n\t}\n\t// Texts.\n\telse if ( isText( actualDomChild ) && isText( expectedDomChild ) ) {\n\t\treturn actualDomChild.data === expectedDomChild.data;\n\t}\n\t// Block fillers.\n\telse if ( domConverter.isBlockFiller( actualDomChild ) &&\n\t\tdomConverter.isBlockFiller( expectedDomChild ) ) {\n\t\treturn true;\n\t}\n\n\t// Not matching types.\n\treturn false;\n}\n\n// The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n// When the native DOM selection is at the end of the block and preceded by e.g.\n//\n//\t\tfoo []
\n//\n// which happens a lot when using the soft line break, the browser fails to (visually) move the\n// caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range.\nfunction fixGeckoSelectionAfterBr( focus, domSelection ) {\n\tconst parent = focus.parent;\n\n\t// This fix works only when the focus point is at the very end of an element.\n\t// There is no point in running it in cases unrelated to the browser bug.\n\tif ( parent.nodeType != Node.ELEMENT_NODE || focus.offset != parent.childNodes.length - 1 ) {\n\t\treturn;\n\t}\n\n\tconst childAtOffset = parent.childNodes[ focus.offset ];\n\n\t// To stay on the safe side, the fix being as specific as possible, it targets only the\n\t// selection which is at the very end of the element and preceded by .\n\tif ( childAtOffset && childAtOffset.tagName == 'BR' ) {\n\t\tdomSelection.addRange( domSelection.getRangeAt( 0 ) );\n\t}\n}\n\nfunction filterOutFakeSelectionContainer( domChildList, fakeSelectionContainer ) {\n\tconst childList = Array.from( domChildList );\n\n\tif ( childList.length == 0 || !fakeSelectionContainer ) {\n\t\treturn childList;\n\t}\n\n\tconst last = childList[ childList.length - 1 ];\n\n\tif ( last == fakeSelectionContainer ) {\n\t\tchildList.pop();\n\t}\n\n\treturn childList;\n}\n\n// Creates a fake selection container for a given document.\n//\n// @private\n// @param {Document} domDocument\n// @returns {HTMLElement}\nfunction createFakeSelectionContainer( domDocument ) {\n\tconst container = domDocument.createElement( 'div' );\n\n\tObject.assign( container.style, {\n\t\tposition: 'fixed',\n\t\ttop: 0,\n\t\tleft: '-9999px',\n\t\t// See https://github.com/ckeditor/ckeditor5/issues/752.\n\t\twidth: '42px'\n\t} );\n\n\t// Fill it with a text node so we can update it later.\n\tcontainer.textContent = '\\u00A0';\n\n\treturn container;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* globals window, document */\n\n/**\n * @module utils/dom/global\n */\n\n/**\n * A helper (module) giving an access to the global DOM objects such as `window` and\n * `document`. Accessing these objects using this helper allows easy and bulletproof\n * testing, i.e. stubbing native properties:\n *\n *\t\timport global from 'ckeditor5/utils/dom/global.js';\n *\n *\t\t// This stub will work for any code using global module.\n *\t\ttestUtils.sinon.stub( global, 'window', {\n *\t\t\tinnerWidth: 10000\n *\t\t} );\n *\n *\t\tconsole.log( global.window.innerWidth );\n */\nexport default { window, document };\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/indexof\n */\n\n/**\n * Returns index of the node in the parent element.\n *\n * @param {Node} node Node which index is tested.\n * @returns {Number} Index of the node in the parent element. Returns 0 if node has no parent.\n */\nexport default function indexOf( node ) {\n\tlet index = 0;\n\n\twhile ( node.previousSibling ) {\n\t\tnode = node.previousSibling;\n\t\tindex++;\n\t}\n\n\treturn index;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* globals Node */\n\n/**\n * @module utils/dom/getancestors\n */\n\n/**\n * Returns all ancestors of given DOM node, starting from the top-most (root). Includes the given node itself. If the\n * node is a part of `DocumentFragment` that `DocumentFragment` will be returned. In contrary, if the node is\n * appended to a `Document`, that `Document` will not be returned (algorithms operating on DOM tree care for `Document#documentElement`\n * at most, which will be returned).\n *\n * @param {Node} node DOM node.\n * @returns {Array.} Array of given `node` parents.\n */\nexport default function getAncestors( node ) {\n\tconst nodes = [];\n\n\t// We are interested in `Node`s `DocumentFragment`s only.\n\twhile ( node && node.nodeType != Node.DOCUMENT_NODE ) {\n\t\tnodes.unshift( node );\n\t\tnode = node.parentNode;\n\t}\n\n\treturn nodes;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/domconverter\n */\n\n/* globals document, Node, NodeFilter, Text */\n\nimport ViewText from './text';\nimport ViewElement from './element';\nimport ViewPosition from './position';\nimport ViewRange from './range';\nimport ViewSelection from './selection';\nimport ViewDocumentFragment from './documentfragment';\nimport ViewTreeWalker from './treewalker';\nimport { BR_FILLER, getDataWithoutFiller, INLINE_FILLER_LENGTH, isInlineFiller, NBSP_FILLER, startsWithFiller } from './filler';\n\nimport global from '@ckeditor/ckeditor5-utils/src/dom/global';\nimport indexOf from '@ckeditor/ckeditor5-utils/src/dom/indexof';\nimport getAncestors from '@ckeditor/ckeditor5-utils/src/dom/getancestors';\nimport getCommonAncestor from '@ckeditor/ckeditor5-utils/src/dom/getcommonancestor';\nimport isText from '@ckeditor/ckeditor5-utils/src/dom/istext';\nimport { isElement } from 'lodash-es';\n\n// eslint-disable-next-line new-cap\nconst BR_FILLER_REF = BR_FILLER( document );\n\n/**\n * DomConverter is a set of tools to do transformations between DOM nodes and view nodes. It also handles\n * {@link module:engine/view/domconverter~DomConverter#bindElements binding} these nodes.\n *\n * The instance of DOMConverter is available in {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}.\n *\n * DomConverter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep a\n * state of a tree nor keeps synchronization between tree view and DOM tree (use {@link module:engine/view/document~Document}).\n *\n * DomConverter keeps DOM elements to View element bindings, so when the converter will be destroyed, the binding will\n * be lost. Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees.\n */\nexport default class DomConverter {\n\t/**\n\t * Creates DOM converter.\n\t *\n\t * @param {Object} options Object with configuration options.\n\t * @param {module:engine/view/filler~BlockFillerMode} [options.blockFillerMode='br'] The type of the block filler to use.\n\t */\n\tconstructor( options = {} ) {\n\t\t/**\n\t\t * The mode of a block filler used by DOM converter.\n\t\t *\n\t\t * @readonly\n\t\t * @member {'br'|'nbsp'} module:engine/view/domconverter~DomConverter#blockFillerMode\n\t\t */\n\t\tthis.blockFillerMode = options.blockFillerMode || 'br';\n\n\t\t/**\n\t\t * Elements which are considered pre-formatted elements.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#preElements\n\t\t */\n\t\tthis.preElements = [ 'pre' ];\n\n\t\t/**\n\t\t * Elements which are considered block elements (and hence should be filled with a\n\t\t * {@link #isBlockFiller block filler}).\n\t\t *\n\t\t * Whether an element is considered a block element also affects handling of trailing whitespaces.\n\t\t *\n\t\t * You can extend this array if you introduce support for block elements which are not yet recognized here.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Array.} module:engine/view/domconverter~DomConverter#blockElements\n\t\t */\n\t\tthis.blockElements = [ 'p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'dd', 'dt', 'figcaption' ];\n\n\t\t/**\n\t\t * Block {@link module:engine/view/filler filler} creator, which is used to create all block fillers during the\n\t\t * view to DOM conversion and to recognize block fillers during the DOM to view conversion.\n\t\t *\n\t\t * @readonly\n\t\t * @private\n\t\t * @member {Function} module:engine/view/domconverter~DomConverter#_blockFiller\n\t\t */\n\t\tthis._blockFiller = this.blockFillerMode == 'br' ? BR_FILLER : NBSP_FILLER;\n\n\t\t/**\n\t\t * DOM to View mapping.\n\t\t *\n\t\t * @private\n\t\t * @member {WeakMap} module:engine/view/domconverter~DomConverter#_domToViewMapping\n\t\t */\n\t\tthis._domToViewMapping = new WeakMap();\n\n\t\t/**\n\t\t * View to DOM mapping.\n\t\t *\n\t\t * @private\n\t\t * @member {WeakMap} module:engine/view/domconverter~DomConverter#_viewToDomMapping\n\t\t */\n\t\tthis._viewToDomMapping = new WeakMap();\n\n\t\t/**\n\t\t * Holds mapping between fake selection containers and corresponding view selections.\n\t\t *\n\t\t * @private\n\t\t * @member {WeakMap} module:engine/view/domconverter~DomConverter#_fakeSelectionMapping\n\t\t */\n\t\tthis._fakeSelectionMapping = new WeakMap();\n\t}\n\n\t/**\n\t * Binds given DOM element that represents fake selection to a **position** of a\n\t * {@link module:engine/view/documentselection~DocumentSelection document selection}.\n\t * Document selection copy is stored and can be retrieved by\n\t * {@link module:engine/view/domconverter~DomConverter#fakeSelectionToView} method.\n\t *\n\t * @param {HTMLElement} domElement\n\t * @param {module:engine/view/documentselection~DocumentSelection} viewDocumentSelection\n\t */\n\tbindFakeSelection( domElement, viewDocumentSelection ) {\n\t\tthis._fakeSelectionMapping.set( domElement, new ViewSelection( viewDocumentSelection ) );\n\t}\n\n\t/**\n\t * Returns {@link module:engine/view/selection~Selection view selection} instance corresponding to\n\t * given DOM element that represents fake selection. Returns `undefined` if binding to given DOM element does not exists.\n\t *\n\t * @param {HTMLElement} domElement\n\t * @returns {module:engine/view/selection~Selection|undefined}\n\t */\n\tfakeSelectionToView( domElement ) {\n\t\treturn this._fakeSelectionMapping.get( domElement );\n\t}\n\n\t/**\n\t * Binds DOM and View elements, so it will be possible to get corresponding elements using\n\t * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and\n\t * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.\n\t *\n\t * @param {HTMLElement} domElement DOM element to bind.\n\t * @param {module:engine/view/element~Element} viewElement View element to bind.\n\t */\n\tbindElements( domElement, viewElement ) {\n\t\tthis._domToViewMapping.set( domElement, viewElement );\n\t\tthis._viewToDomMapping.set( viewElement, domElement );\n\t}\n\n\t/**\n\t * Unbinds given `domElement` from the view element it was bound to. Unbinding is deep, meaning that all children of\n\t * `domElement` will be unbound too.\n\t *\n\t * @param {HTMLElement} domElement DOM element to unbind.\n\t */\n\tunbindDomElement( domElement ) {\n\t\tconst viewElement = this._domToViewMapping.get( domElement );\n\n\t\tif ( viewElement ) {\n\t\t\tthis._domToViewMapping.delete( domElement );\n\t\t\tthis._viewToDomMapping.delete( viewElement );\n\n\t\t\t// Use Array.from because of MS Edge (#923).\n\t\t\tfor ( const child of Array.from( domElement.childNodes ) ) {\n\t\t\t\tthis.unbindDomElement( child );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Binds DOM and View document fragments, so it will be possible to get corresponding document fragments using\n\t * {@link module:engine/view/domconverter~DomConverter#mapDomToView} and\n\t * {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.\n\t *\n\t * @param {DocumentFragment} domFragment DOM document fragment to bind.\n\t * @param {module:engine/view/documentfragment~DocumentFragment} viewFragment View document fragment to bind.\n\t */\n\tbindDocumentFragments( domFragment, viewFragment ) {\n\t\tthis._domToViewMapping.set( domFragment, viewFragment );\n\t\tthis._viewToDomMapping.set( viewFragment, domFragment );\n\t}\n\n\t/**\n\t * Converts view to DOM. For all text nodes, not bound elements and document fragments new items will\n\t * be created. For bound elements and document fragments function will return corresponding items.\n\t *\n\t * @param {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment} viewNode\n\t * View node or document fragment to transform.\n\t * @param {Document} domDocument Document which will be used to create DOM nodes.\n\t * @param {Object} [options] Conversion options.\n\t * @param {Boolean} [options.bind=false] Determines whether new elements will be bound.\n\t * @param {Boolean} [options.withChildren=true] If `true`, node's and document fragment's children will be converted too.\n\t * @returns {Node|DocumentFragment} Converted node or DocumentFragment.\n\t */\n\tviewToDom( viewNode, domDocument, options = {} ) {\n\t\tif ( viewNode.is( 'text' ) ) {\n\t\t\tconst textData = this._processDataFromViewText( viewNode );\n\n\t\t\treturn domDocument.createTextNode( textData );\n\t\t} else {\n\t\t\tif ( this.mapViewToDom( viewNode ) ) {\n\t\t\t\treturn this.mapViewToDom( viewNode );\n\t\t\t}\n\n\t\t\tlet domElement;\n\n\t\t\tif ( viewNode.is( 'documentFragment' ) ) {\n\t\t\t\t// Create DOM document fragment.\n\t\t\t\tdomElement = domDocument.createDocumentFragment();\n\n\t\t\t\tif ( options.bind ) {\n\t\t\t\t\tthis.bindDocumentFragments( domElement, viewNode );\n\t\t\t\t}\n\t\t\t} else if ( viewNode.is( 'uiElement' ) ) {\n\t\t\t\t// UIElement has its own render() method (see #799).\n\t\t\t\tdomElement = viewNode.render( domDocument );\n\n\t\t\t\tif ( options.bind ) {\n\t\t\t\t\tthis.bindElements( domElement, viewNode );\n\t\t\t\t}\n\n\t\t\t\treturn domElement;\n\t\t\t} else {\n\t\t\t\t// Create DOM element.\n\t\t\t\tif ( viewNode.hasAttribute( 'xmlns' ) ) {\n\t\t\t\t\tdomElement = domDocument.createElementNS( viewNode.getAttribute( 'xmlns' ), viewNode.name );\n\t\t\t\t} else {\n\t\t\t\t\tdomElement = domDocument.createElement( viewNode.name );\n\t\t\t\t}\n\n\t\t\t\tif ( options.bind ) {\n\t\t\t\t\tthis.bindElements( domElement, viewNode );\n\t\t\t\t}\n\n\t\t\t\t// Copy element's attributes.\n\t\t\t\tfor ( const key of viewNode.getAttributeKeys() ) {\n\t\t\t\t\tdomElement.setAttribute( key, viewNode.getAttribute( key ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( options.withChildren || options.withChildren === undefined ) {\n\t\t\t\tfor ( const child of this.viewChildrenToDom( viewNode, domDocument, options ) ) {\n\t\t\t\t\tdomElement.appendChild( child );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn domElement;\n\t\t}\n\t}\n\n\t/**\n\t * Converts children of the view element to DOM using the\n\t * {@link module:engine/view/domconverter~DomConverter#viewToDom} method.\n\t * Additionally, this method adds block {@link module:engine/view/filler filler} to the list of children, if needed.\n\t *\n\t * @param {module:engine/view/element~Element|module:engine/view/documentfragment~DocumentFragment} viewElement Parent view element.\n\t * @param {Document} domDocument Document which will be used to create DOM nodes.\n\t * @param {Object} options See {@link module:engine/view/domconverter~DomConverter#viewToDom} options parameter.\n\t * @returns {Iterable.} DOM nodes.\n\t */\n\t* viewChildrenToDom( viewElement, domDocument, options = {} ) {\n\t\tconst fillerPositionOffset = viewElement.getFillerOffset && viewElement.getFillerOffset();\n\t\tlet offset = 0;\n\n\t\tfor ( const childView of viewElement.getChildren() ) {\n\t\t\tif ( fillerPositionOffset === offset ) {\n\t\t\t\tyield this._blockFiller( domDocument );\n\t\t\t}\n\n\t\t\tyield this.viewToDom( childView, domDocument, options );\n\n\t\t\toffset++;\n\t\t}\n\n\t\tif ( fillerPositionOffset === offset ) {\n\t\t\tyield this._blockFiller( domDocument );\n\t\t}\n\t}\n\n\t/**\n\t * Converts view {@link module:engine/view/range~Range} to DOM range.\n\t * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.\n\t *\n\t * @param {module:engine/view/range~Range} viewRange View range.\n\t * @returns {Range} DOM range.\n\t */\n\tviewRangeToDom( viewRange ) {\n\t\tconst domStart = this.viewPositionToDom( viewRange.start );\n\t\tconst domEnd = this.viewPositionToDom( viewRange.end );\n\n\t\tconst domRange = document.createRange();\n\t\tdomRange.setStart( domStart.parent, domStart.offset );\n\t\tdomRange.setEnd( domEnd.parent, domEnd.offset );\n\n\t\treturn domRange;\n\t}\n\n\t/**\n\t * Converts view {@link module:engine/view/position~Position} to DOM parent and offset.\n\t *\n\t * Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.\n\t * If the converted position is directly before inline filler it is moved inside the filler.\n\t *\n\t * @param {module:engine/view/position~Position} viewPosition View position.\n\t * @returns {Object|null} position DOM position or `null` if view position could not be converted to DOM.\n\t * @returns {Node} position.parent DOM position parent.\n\t * @returns {Number} position.offset DOM position offset.\n\t */\n\tviewPositionToDom( viewPosition ) {\n\t\tconst viewParent = viewPosition.parent;\n\n\t\tif ( viewParent.is( 'text' ) ) {\n\t\t\tconst domParent = this.findCorrespondingDomText( viewParent );\n\n\t\t\tif ( !domParent ) {\n\t\t\t\t// Position is in a view text node that has not been rendered to DOM yet.\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet offset = viewPosition.offset;\n\n\t\t\tif ( startsWithFiller( domParent ) ) {\n\t\t\t\toffset += INLINE_FILLER_LENGTH;\n\t\t\t}\n\n\t\t\treturn { parent: domParent, offset };\n\t\t} else {\n\t\t\t// viewParent is instance of ViewElement.\n\t\t\tlet domParent, domBefore, domAfter;\n\n\t\t\tif ( viewPosition.offset === 0 ) {\n\t\t\t\tdomParent = this.mapViewToDom( viewParent );\n\n\t\t\t\tif ( !domParent ) {\n\t\t\t\t\t// Position is in a view element that has not been rendered to DOM yet.\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tdomAfter = domParent.childNodes[ 0 ];\n\t\t\t} else {\n\t\t\t\tconst nodeBefore = viewPosition.nodeBefore;\n\n\t\t\t\tdomBefore = nodeBefore.is( 'text' ) ?\n\t\t\t\t\tthis.findCorrespondingDomText( nodeBefore ) :\n\t\t\t\t\tthis.mapViewToDom( viewPosition.nodeBefore );\n\n\t\t\t\tif ( !domBefore ) {\n\t\t\t\t\t// Position is after a view element that has not been rendered to DOM yet.\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tdomParent = domBefore.parentNode;\n\t\t\t\tdomAfter = domBefore.nextSibling;\n\t\t\t}\n\n\t\t\t// If there is an inline filler at position return position inside the filler. We should never return\n\t\t\t// the position before the inline filler.\n\t\t\tif ( isText( domAfter ) && startsWithFiller( domAfter ) ) {\n\t\t\t\treturn { parent: domAfter, offset: INLINE_FILLER_LENGTH };\n\t\t\t}\n\n\t\t\tconst offset = domBefore ? indexOf( domBefore ) + 1 : 0;\n\n\t\t\treturn { parent: domParent, offset };\n\t\t}\n\t}\n\n\t/**\n\t * Converts DOM to view. For all text nodes, not bound elements and document fragments new items will\n\t * be created. For bound elements and document fragments function will return corresponding items. For\n\t * {@link module:engine/view/filler fillers} `null` will be returned.\n\t * For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.\n\t *\n\t * @param {Node|DocumentFragment} domNode DOM node or document fragment to transform.\n\t * @param {Object} [options] Conversion options.\n\t * @param {Boolean} [options.bind=false] Determines whether new elements will be bound.\n\t * @param {Boolean} [options.withChildren=true] If `true`, node's and document fragment's children will be converted too.\n\t * @param {Boolean} [options.keepOriginalCase=false] If `false`, node's tag name will be converter to lower case.\n\t * @returns {module:engine/view/node~Node|module:engine/view/documentfragment~DocumentFragment|null} Converted node or document fragment\n\t * or `null` if DOM node is a {@link module:engine/view/filler filler} or the given node is an empty text node.\n\t */\n\tdomToView( domNode, options = {} ) {\n\t\tif ( this.isBlockFiller( domNode, this.blockFillerMode ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// When node is inside UIElement return that UIElement as it's view representation.\n\t\tconst uiElement = this.getParentUIElement( domNode, this._domToViewMapping );\n\n\t\tif ( uiElement ) {\n\t\t\treturn uiElement;\n\t\t}\n\n\t\tif ( isText( domNode ) ) {\n\t\t\tif ( isInlineFiller( domNode ) ) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tconst textData = this._processDataFromDomText( domNode );\n\n\t\t\t\treturn textData === '' ? null : new ViewText( textData );\n\t\t\t}\n\t\t} else if ( this.isComment( domNode ) ) {\n\t\t\treturn null;\n\t\t} else {\n\t\t\tif ( this.mapDomToView( domNode ) ) {\n\t\t\t\treturn this.mapDomToView( domNode );\n\t\t\t}\n\n\t\t\tlet viewElement;\n\n\t\t\tif ( this.isDocumentFragment( domNode ) ) {\n\t\t\t\t// Create view document fragment.\n\t\t\t\tviewElement = new ViewDocumentFragment();\n\n\t\t\t\tif ( options.bind ) {\n\t\t\t\t\tthis.bindDocumentFragments( domNode, viewElement );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Create view element.\n\t\t\t\tconst viewName = options.keepOriginalCase ? domNode.tagName : domNode.tagName.toLowerCase();\n\t\t\t\tviewElement = new ViewElement( viewName );\n\n\t\t\t\tif ( options.bind ) {\n\t\t\t\t\tthis.bindElements( domNode, viewElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy element's attributes.\n\t\t\t\tconst attrs = domNode.attributes;\n\n\t\t\t\tfor ( let i = attrs.length - 1; i >= 0; i-- ) {\n\t\t\t\t\tviewElement._setAttribute( attrs[ i ].name, attrs[ i ].value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( options.withChildren || options.withChildren === undefined ) {\n\t\t\t\tfor ( const child of this.domChildrenToView( domNode, options ) ) {\n\t\t\t\t\tviewElement._appendChild( child );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn viewElement;\n\t\t}\n\t}\n\n\t/**\n\t * Converts children of the DOM element to view nodes using\n\t * the {@link module:engine/view/domconverter~DomConverter#domToView} method.\n\t * Additionally this method omits block {@link module:engine/view/filler filler}, if it exists in the DOM parent.\n\t *\n\t * @param {HTMLElement} domElement Parent DOM element.\n\t * @param {Object} options See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.\n\t * @returns {Iterable.} View nodes.\n\t */\n\t* domChildrenToView( domElement, options = {} ) {\n\t\tfor ( let i = 0; i < domElement.childNodes.length; i++ ) {\n\t\t\tconst domChild = domElement.childNodes[ i ];\n\t\t\tconst viewChild = this.domToView( domChild, options );\n\n\t\t\tif ( viewChild !== null ) {\n\t\t\t\tyield viewChild;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Converts DOM selection to view {@link module:engine/view/selection~Selection}.\n\t * Ranges which cannot be converted will be omitted.\n\t *\n\t * @param {Selection} domSelection DOM selection.\n\t * @returns {module:engine/view/selection~Selection} View selection.\n\t */\n\tdomSelectionToView( domSelection ) {\n\t\t// DOM selection might be placed in fake selection container.\n\t\t// If container contains fake selection - return corresponding view selection.\n\t\tif ( domSelection.rangeCount === 1 ) {\n\t\t\tlet container = domSelection.getRangeAt( 0 ).startContainer;\n\n\t\t\t// The DOM selection might be moved to the text node inside the fake selection container.\n\t\t\tif ( isText( container ) ) {\n\t\t\t\tcontainer = container.parentNode;\n\t\t\t}\n\n\t\t\tconst viewSelection = this.fakeSelectionToView( container );\n\n\t\t\tif ( viewSelection ) {\n\t\t\t\treturn viewSelection;\n\t\t\t}\n\t\t}\n\n\t\tconst isBackward = this.isDomSelectionBackward( domSelection );\n\n\t\tconst viewRanges = [];\n\n\t\tfor ( let i = 0; i < domSelection.rangeCount; i++ ) {\n\t\t\t// DOM Range have correct start and end, no matter what is the DOM Selection direction. So we don't have to fix anything.\n\t\t\tconst domRange = domSelection.getRangeAt( i );\n\t\t\tconst viewRange = this.domRangeToView( domRange );\n\n\t\t\tif ( viewRange ) {\n\t\t\t\tviewRanges.push( viewRange );\n\t\t\t}\n\t\t}\n\n\t\treturn new ViewSelection( viewRanges, { backward: isBackward } );\n\t}\n\n\t/**\n\t * Converts DOM Range to view {@link module:engine/view/range~Range}.\n\t * If the start or end position can not be converted `null` is returned.\n\t *\n\t * @param {Range} domRange DOM range.\n\t * @returns {module:engine/view/range~Range|null} View range.\n\t */\n\tdomRangeToView( domRange ) {\n\t\tconst viewStart = this.domPositionToView( domRange.startContainer, domRange.startOffset );\n\t\tconst viewEnd = this.domPositionToView( domRange.endContainer, domRange.endOffset );\n\n\t\tif ( viewStart && viewEnd ) {\n\t\t\treturn new ViewRange( viewStart, viewEnd );\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Converts DOM parent and offset to view {@link module:engine/view/position~Position}.\n\t *\n\t * If the position is inside a {@link module:engine/view/filler filler} which has no corresponding view node,\n\t * position of the filler will be converted and returned.\n\t *\n\t * If the position is inside DOM element rendered by {@link module:engine/view/uielement~UIElement}\n\t * that position will be converted to view position before that UIElement.\n\t *\n\t * If structures are too different and it is not possible to find corresponding position then `null` will be returned.\n\t *\n\t * @param {Node} domParent DOM position parent.\n\t * @param {Number} domOffset DOM position offset.\n\t * @returns {module:engine/view/position~Position} viewPosition View position.\n\t */\n\tdomPositionToView( domParent, domOffset ) {\n\t\tif ( this.isBlockFiller( domParent, this.blockFillerMode ) ) {\n\t\t\treturn this.domPositionToView( domParent.parentNode, indexOf( domParent ) );\n\t\t}\n\n\t\t// If position is somewhere inside UIElement - return position before that element.\n\t\tconst viewElement = this.mapDomToView( domParent );\n\n\t\tif ( viewElement && viewElement.is( 'uiElement' ) ) {\n\t\t\treturn ViewPosition._createBefore( viewElement );\n\t\t}\n\n\t\tif ( isText( domParent ) ) {\n\t\t\tif ( isInlineFiller( domParent ) ) {\n\t\t\t\treturn this.domPositionToView( domParent.parentNode, indexOf( domParent ) );\n\t\t\t}\n\n\t\t\tconst viewParent = this.findCorrespondingViewText( domParent );\n\t\t\tlet offset = domOffset;\n\n\t\t\tif ( !viewParent ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( startsWithFiller( domParent ) ) {\n\t\t\t\toffset -= INLINE_FILLER_LENGTH;\n\t\t\t\toffset = offset < 0 ? 0 : offset;\n\t\t\t}\n\n\t\t\treturn new ViewPosition( viewParent, offset );\n\t\t}\n\t\t// domParent instanceof HTMLElement.\n\t\telse {\n\t\t\tif ( domOffset === 0 ) {\n\t\t\t\tconst viewParent = this.mapDomToView( domParent );\n\n\t\t\t\tif ( viewParent ) {\n\t\t\t\t\treturn new ViewPosition( viewParent, 0 );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst domBefore = domParent.childNodes[ domOffset - 1 ];\n\t\t\t\tconst viewBefore = isText( domBefore ) ?\n\t\t\t\t\tthis.findCorrespondingViewText( domBefore ) :\n\t\t\t\t\tthis.mapDomToView( domBefore );\n\n\t\t\t\t// TODO #663\n\t\t\t\tif ( viewBefore && viewBefore.parent ) {\n\t\t\t\t\treturn new ViewPosition( viewBefore.parent, viewBefore.index + 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Returns corresponding view {@link module:engine/view/element~Element Element} or\n\t * {@link module:engine/view/documentfragment~DocumentFragment} for provided DOM element or\n\t * document fragment. If there is no view item {@link module:engine/view/domconverter~DomConverter#bindElements bound}\n\t * to the given DOM - `undefined` is returned.\n\t * For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.\n\t *\n\t * @param {DocumentFragment|Element} domElementOrDocumentFragment DOM element or document fragment.\n\t * @returns {module:engine/view/element~Element|module:engine/view/documentfragment~DocumentFragment|undefined}\n\t * Corresponding view element, document fragment or `undefined` if no element was bound.\n\t */\n\tmapDomToView( domElementOrDocumentFragment ) {\n\t\treturn this.getParentUIElement( domElementOrDocumentFragment ) || this._domToViewMapping.get( domElementOrDocumentFragment );\n\t}\n\n\t/**\n\t * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound},\n\t * corresponding text node is returned based on the sibling or parent.\n\t *\n\t * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used\n\t * to find the corresponding text node.\n\t *\n\t * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound}\n\t * element, it is used to find the corresponding text node.\n\t *\n\t * For all text nodes rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.\n\t *\n\t * Otherwise `null` is returned.\n\t *\n\t * Note that for the block or inline {@link module:engine/view/filler filler} this method returns `null`.\n\t *\n\t * @param {Text} domText DOM text node.\n\t * @returns {module:engine/view/text~Text|null} Corresponding view text node or `null`, if it was not possible to find a\n\t * corresponding node.\n\t */\n\tfindCorrespondingViewText( domText ) {\n\t\tif ( isInlineFiller( domText ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// If DOM text was rendered by UIElement - return that element.\n\t\tconst uiElement = this.getParentUIElement( domText );\n\n\t\tif ( uiElement ) {\n\t\t\treturn uiElement;\n\t\t}\n\n\t\tconst previousSibling = domText.previousSibling;\n\n\t\t// Try to use previous sibling to find the corresponding text node.\n\t\tif ( previousSibling ) {\n\t\t\tif ( !( this.isElement( previousSibling ) ) ) {\n\t\t\t\t// The previous is text or comment.\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst viewElement = this.mapDomToView( previousSibling );\n\n\t\t\tif ( viewElement ) {\n\t\t\t\tconst nextSibling = viewElement.nextSibling;\n\n\t\t\t\t// It might be filler which has no corresponding view node.\n\t\t\t\tif ( nextSibling instanceof ViewText ) {\n\t\t\t\t\treturn viewElement.nextSibling;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Try to use parent to find the corresponding text node.\n\t\telse {\n\t\t\tconst viewElement = this.mapDomToView( domText.parentNode );\n\n\t\t\tif ( viewElement ) {\n\t\t\t\tconst firstChild = viewElement.getChild( 0 );\n\n\t\t\t\t// It might be filler which has no corresponding view node.\n\t\t\t\tif ( firstChild instanceof ViewText ) {\n\t\t\t\t\treturn firstChild;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns corresponding DOM item for provided {@link module:engine/view/element~Element Element} or\n\t * {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment}.\n\t * To find a corresponding text for {@link module:engine/view/text~Text view Text instance}\n\t * use {@link #findCorrespondingDomText}.\n\t *\n\t * @param {module:engine/view/element~Element|module:engine/view/documentfragment~DocumentFragment} viewNode\n\t * View element or document fragment.\n\t * @returns {Node|DocumentFragment|undefined} Corresponding DOM node or document fragment.\n\t */\n\tmapViewToDom( documentFragmentOrElement ) {\n\t\treturn this._viewToDomMapping.get( documentFragmentOrElement );\n\t}\n\n\t/**\n\t * Finds corresponding text node. Text nodes are not {@link module:engine/view/domconverter~DomConverter#bindElements bound},\n\t * corresponding text node is returned based on the sibling or parent.\n\t *\n\t * If the directly previous sibling is a {@link module:engine/view/domconverter~DomConverter#bindElements bound} element, it is used\n\t * to find the corresponding text node.\n\t *\n\t * If this is a first child in the parent and the parent is a {@link module:engine/view/domconverter~DomConverter#bindElements bound}\n\t * element, it is used to find the corresponding text node.\n\t *\n\t * Otherwise `null` is returned.\n\t *\n\t * @param {module:engine/view/text~Text} viewText View text node.\n\t * @returns {Text|null} Corresponding DOM text node or `null`, if it was not possible to find a corresponding node.\n\t */\n\tfindCorrespondingDomText( viewText ) {\n\t\tconst previousSibling = viewText.previousSibling;\n\n\t\t// Try to use previous sibling to find the corresponding text node.\n\t\tif ( previousSibling && this.mapViewToDom( previousSibling ) ) {\n\t\t\treturn this.mapViewToDom( previousSibling ).nextSibling;\n\t\t}\n\n\t\t// If this is a first node, try to use parent to find the corresponding text node.\n\t\tif ( !previousSibling && viewText.parent && this.mapViewToDom( viewText.parent ) ) {\n\t\t\treturn this.mapViewToDom( viewText.parent ).childNodes[ 0 ];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focuses DOM editable that is corresponding to provided {@link module:engine/view/editableelement~EditableElement}.\n\t *\n\t * @param {module:engine/view/editableelement~EditableElement} viewEditable\n\t */\n\tfocus( viewEditable ) {\n\t\tconst domEditable = this.mapViewToDom( viewEditable );\n\n\t\tif ( domEditable && domEditable.ownerDocument.activeElement !== domEditable ) {\n\t\t\t// Save the scrollX and scrollY positions before the focus.\n\t\t\tconst { scrollX, scrollY } = global.window;\n\t\t\tconst scrollPositions = [];\n\n\t\t\t// Save all scrollLeft and scrollTop values starting from domEditable up to\n\t\t\t// document#documentElement.\n\t\t\tforEachDomNodeAncestor( domEditable, node => {\n\t\t\t\tconst { scrollLeft, scrollTop } = node;\n\n\t\t\t\tscrollPositions.push( [ scrollLeft, scrollTop ] );\n\t\t\t} );\n\n\t\t\tdomEditable.focus();\n\n\t\t\t// Restore scrollLeft and scrollTop values starting from domEditable up to\n\t\t\t// document#documentElement.\n\t\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/951\n\t\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/957\n\t\t\tforEachDomNodeAncestor( domEditable, node => {\n\t\t\t\tconst [ scrollLeft, scrollTop ] = scrollPositions.shift();\n\n\t\t\t\tnode.scrollLeft = scrollLeft;\n\t\t\t\tnode.scrollTop = scrollTop;\n\t\t\t} );\n\n\t\t\t// Restore the scrollX and scrollY positions after the focus.\n\t\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/951\n\t\t\tglobal.window.scrollTo( scrollX, scrollY );\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` when `node.nodeType` equals `Node.ELEMENT_NODE`.\n\t *\n\t * @param {Node} node Node to check.\n\t * @returns {Boolean}\n\t */\n\tisElement( node ) {\n\t\treturn node && node.nodeType == Node.ELEMENT_NODE;\n\t}\n\n\t/**\n\t * Returns `true` when `node.nodeType` equals `Node.DOCUMENT_FRAGMENT_NODE`.\n\t *\n\t * @param {Node} node Node to check.\n\t * @returns {Boolean}\n\t */\n\tisDocumentFragment( node ) {\n\t\treturn node && node.nodeType == Node.DOCUMENT_FRAGMENT_NODE;\n\t}\n\n\t/**\n\t * Returns `true` when `node.nodeType` equals `Node.COMMENT_NODE`.\n\t *\n\t * @param {Node} node Node to check.\n\t * @returns {Boolean}\n\t */\n\tisComment( node ) {\n\t\treturn node && node.nodeType == Node.COMMENT_NODE;\n\t}\n\n\t/**\n\t * Checks if the node is an instance of the block filler for this DOM converter.\n\t *\n\t *\t\tconst converter = new DomConverter( { blockFillerMode: 'br' } );\n\t *\n\t *\t\tconverter.isBlockFiller( BR_FILLER( document ) ); // true\n\t *\t\tconverter.isBlockFiller( NBSP_FILLER( document ) ); // false\n\t *\n\t * **Note:**: For the `'nbsp'` mode the method also checks context of a node so it cannot be a detached node.\n\t *\n\t * **Note:** A special case in the `'nbsp'` mode exists where the ` ` in `
` is treated as a block filler.\n\t *\n\t * @param {Node} domNode DOM node to check.\n\t * @returns {Boolean} True if a node is considered a block filler for given mode.\n\t */\n\tisBlockFiller( domNode ) {\n\t\tif ( this.blockFillerMode == 'br' ) {\n\t\t\treturn domNode.isEqualNode( BR_FILLER_REF );\n\t\t}\n\n\t\t// Special case for
in which case the should be treated as filler even\n\t\t// when we're in the 'nbsp' mode. See ckeditor5#5564.\n\t\tif ( domNode.tagName === 'BR' && hasBlockParent( domNode, this.blockElements ) && domNode.parentNode.childNodes.length === 1 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn isNbspBlockFiller( domNode, this.blockElements );\n\t}\n\n\t/**\n\t * Returns `true` if given selection is a backward selection, that is, if it's `focus` is before `anchor`.\n\t *\n\t * @param {Selection} DOM Selection instance to check.\n\t * @returns {Boolean}\n\t */\n\tisDomSelectionBackward( selection ) {\n\t\tif ( selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Since it takes multiple lines of code to check whether a \"DOM Position\" is before/after another \"DOM Position\",\n\t\t// we will use the fact that range will collapse if it's end is before it's start.\n\t\tconst range = document.createRange();\n\n\t\trange.setStart( selection.anchorNode, selection.anchorOffset );\n\t\trange.setEnd( selection.focusNode, selection.focusOffset );\n\n\t\tconst backward = range.collapsed;\n\n\t\trange.detach();\n\n\t\treturn backward;\n\t}\n\n\t/**\n\t * Returns parent {@link module:engine/view/uielement~UIElement} for provided DOM node. Returns `null` if there is no\n\t * parent UIElement.\n\t *\n\t * @param {Node} domNode\n\t * @returns {module:engine/view/uielement~UIElement|null}\n\t */\n\tgetParentUIElement( domNode ) {\n\t\tconst ancestors = getAncestors( domNode );\n\n\t\t// Remove domNode from the list.\n\t\tancestors.pop();\n\n\t\twhile ( ancestors.length ) {\n\t\t\tconst domNode = ancestors.pop();\n\t\t\tconst viewNode = this._domToViewMapping.get( domNode );\n\n\t\t\tif ( viewNode && viewNode.is( 'uiElement' ) ) {\n\t\t\t\treturn viewNode;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Checks if given selection's boundaries are at correct places.\n\t *\n\t * The following places are considered as incorrect for selection boundaries:\n\t * * before or in the middle of the inline filler sequence,\n\t * * inside the DOM element which represents {@link module:engine/view/uielement~UIElement a view ui element}.\n\t *\n\t * @param {Selection} domSelection DOM Selection object to be checked.\n\t * @returns {Boolean} `true` if the given selection is at a correct place, `false` otherwise.\n\t */\n\tisDomSelectionCorrect( domSelection ) {\n\t\treturn this._isDomSelectionPositionCorrect( domSelection.anchorNode, domSelection.anchorOffset ) &&\n\t\t\tthis._isDomSelectionPositionCorrect( domSelection.focusNode, domSelection.focusOffset );\n\t}\n\n\t/**\n\t * Checks if the given DOM position is a correct place for selection boundary. See {@link #isDomSelectionCorrect}.\n\t *\n\t * @private\n\t * @param {Element} domParent Position parent.\n\t * @param {Number} offset Position offset.\n\t * @returns {Boolean} `true` if given position is at a correct place for selection boundary, `false` otherwise.\n\t */\n\t_isDomSelectionPositionCorrect( domParent, offset ) {\n\t\t// If selection is before or in the middle of inline filler string, it is incorrect.\n\t\tif ( isText( domParent ) && startsWithFiller( domParent ) && offset < INLINE_FILLER_LENGTH ) {\n\t\t\t// Selection in a text node, at wrong position (before or in the middle of filler).\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.isElement( domParent ) && startsWithFiller( domParent.childNodes[ offset ] ) ) {\n\t\t\t// Selection in an element node, before filler text node.\n\t\t\treturn false;\n\t\t}\n\n\t\tconst viewParent = this.mapDomToView( domParent );\n\n\t\t// If selection is in `view.UIElement`, it is incorrect. Note that `mapDomToView()` returns `view.UIElement`\n\t\t// also for any dom element that is inside the view ui element (so we don't need to perform any additional checks).\n\t\tif ( viewParent && viewParent.is( 'uiElement' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Takes text data from a given {@link module:engine/view/text~Text#data} and processes it so\n\t * it is correctly displayed in the DOM.\n\t *\n\t * Following changes are done:\n\t *\n\t * * a space at the beginning is changed to ` ` if this is the first text node in its container\n\t * element or if a previous text node ends with a space character,\n\t * * space at the end of the text node is changed to ` ` if there are two spaces at the end of a node or if next node\n\t * starts with a space or if it is the last text node in its container,\n\t * * remaining spaces are replaced to a chain of spaces and ` ` (e.g. `'x x'` becomes `'x x'`).\n\t *\n\t * Content of {@link #preElements} is not processed.\n\t *\n\t * @private\n\t * @param {module:engine/view/text~Text} node View text node to process.\n\t * @returns {String} Processed text data.\n\t */\n\t_processDataFromViewText( node ) {\n\t\tlet data = node.data;\n\n\t\t// If any of node ancestors has a name which is in `preElements` array, then currently processed\n\t\t// view text node is (will be) in preformatted element. We should not change whitespaces then.\n\t\tif ( node.getAncestors().some( parent => this.preElements.includes( parent.name ) ) ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// 1. Replace the first space with a nbsp if the previous node ends with a space or there is no previous node\n\t\t// (container element boundary).\n\t\tif ( data.charAt( 0 ) == ' ' ) {\n\t\t\tconst prevNode = this._getTouchingViewTextNode( node, false );\n\t\t\tconst prevEndsWithSpace = prevNode && this._nodeEndsWithSpace( prevNode );\n\n\t\t\tif ( prevEndsWithSpace || !prevNode ) {\n\t\t\t\tdata = '\\u00A0' + data.substr( 1 );\n\t\t\t}\n\t\t}\n\n\t\t// 2. Replace the last space with nbsp if there are two spaces at the end or if the next node starts with space or there is no\n\t\t// next node (container element boundary).\n\t\t//\n\t\t// Keep in mind that Firefox prefers $nbsp; before tag, not inside it:\n\t\t//\n\t\t// Foo bar <-- bad.\n\t\t// Foo bar <-- good.\n\t\t//\n\t\t// More here: https://github.com/ckeditor/ckeditor5-engine/issues/1747.\n\t\tif ( data.charAt( data.length - 1 ) == ' ' ) {\n\t\t\tconst nextNode = this._getTouchingViewTextNode( node, true );\n\n\t\t\tif ( data.charAt( data.length - 2 ) == ' ' || !nextNode || nextNode.data.charAt( 0 ) == ' ' ) {\n\t\t\t\tdata = data.substr( 0, data.length - 1 ) + '\\u00A0';\n\t\t\t}\n\t\t}\n\n\t\t// 3. Create space+nbsp pairs.\n\t\treturn data.replace( / {2}/g, ' \\u00A0' );\n\t}\n\n\t/**\n\t * Checks whether given node ends with a space character after changing appropriate space characters to ` `s.\n\t *\n\t * @private\n\t * @param {module:engine/view/text~Text} node Node to check.\n\t * @returns {Boolean} `true` if given `node` ends with space, `false` otherwise.\n\t */\n\t_nodeEndsWithSpace( node ) {\n\t\tif ( node.getAncestors().some( parent => this.preElements.includes( parent.name ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst data = this._processDataFromViewText( node );\n\n\t\treturn data.charAt( data.length - 1 ) == ' ';\n\t}\n\n\t/**\n\t * Takes text data from native `Text` node and processes it to a correct {@link module:engine/view/text~Text view text node} data.\n\t *\n\t * Following changes are done:\n\t *\n\t * * multiple whitespaces are replaced to a single space,\n\t * * space at the beginning of a text node is removed if it is the first text node in its container\n\t * element or if the previous text node ends with a space character,\n\t * * space at the end of the text node is removed if there are two spaces at the end of a node or if next node\n\t * starts with a space or if it is the last text node in its container\n\t * * nbsps are converted to spaces.\n\t *\n\t * @param {Node} node DOM text node to process.\n\t * @returns {String} Processed data.\n\t * @private\n\t */\n\t_processDataFromDomText( node ) {\n\t\tlet data = node.data;\n\n\t\tif ( _hasDomParentOfType( node, this.preElements ) ) {\n\t\t\treturn getDataWithoutFiller( node );\n\t\t}\n\n\t\t// Change all consecutive whitespace characters (from the [ \\n\\t\\r] set –\n\t\t// see https://github.com/ckeditor/ckeditor5-engine/issues/822#issuecomment-311670249) to a single space character.\n\t\t// That's how multiple whitespaces are treated when rendered, so we normalize those whitespaces.\n\t\t// We're replacing 1+ (and not 2+) to also normalize singular \\n\\t\\r characters (#822).\n\t\tdata = data.replace( /[ \\n\\t\\r]{1,}/g, ' ' );\n\n\t\tconst prevNode = this._getTouchingInlineDomNode( node, false );\n\t\tconst nextNode = this._getTouchingInlineDomNode( node, true );\n\n\t\tconst shouldLeftTrim = this._checkShouldLeftTrimDomText( prevNode );\n\t\tconst shouldRightTrim = this._checkShouldRightTrimDomText( node, nextNode );\n\n\t\t// If the previous dom text node does not exist or it ends by whitespace character, remove space character from the beginning\n\t\t// of this text node. Such space character is treated as a whitespace.\n\t\tif ( shouldLeftTrim ) {\n\t\t\tdata = data.replace( /^ /, '' );\n\t\t}\n\n\t\t// If the next text node does not exist remove space character from the end of this text node.\n\t\tif ( shouldRightTrim ) {\n\t\t\tdata = data.replace( / $/, '' );\n\t\t}\n\n\t\t// At the beginning and end of a block element, Firefox inserts normal space + instead of non-breaking space.\n\t\t// This means that the text node starts/end with normal space instead of non-breaking space.\n\t\t// This causes a problem because the normal space would be removed in `.replace` calls above. To prevent that,\n\t\t// the inline filler is removed only after the data is initially processed (by the `.replace` above). See ckeditor5#692.\n\t\tdata = getDataWithoutFiller( new Text( data ) );\n\n\t\t// At this point we should have removed all whitespaces from DOM text data.\n\t\t//\n\t\t// Now, We will reverse the process that happens in `_processDataFromViewText`.\n\t\t//\n\t\t// We have to change chars, that were in DOM text data because of rendering reasons, to spaces.\n\t\t// First, change all ` \\u00A0` pairs (space + ) to two spaces. DOM converter changes two spaces from model/view to\n\t\t// ` \\u00A0` to ensure proper rendering. Since here we convert back, we recognize those pairs and change them back to ` `.\n\t\tdata = data.replace( / \\u00A0/g, ' ' );\n\n\t\t// Then, let's change the last nbsp to a space.\n\t\tif ( /( |\\u00A0)\\u00A0$/.test( data ) || !nextNode || ( nextNode.data && nextNode.data.charAt( 0 ) == ' ' ) ) {\n\t\t\tdata = data.replace( /\\u00A0$/, ' ' );\n\t\t}\n\n\t\t// Then, change character that is at the beginning of the text node to space character.\n\t\t// We do that replacement only if this is the first node or the previous node ends on whitespace character.\n\t\tif ( shouldLeftTrim ) {\n\t\t\tdata = data.replace( /^\\u00A0/, ' ' );\n\t\t}\n\n\t\t// At this point, all whitespaces should be removed and all created for rendering reasons should be\n\t\t// changed to normal space. All left are inserted intentionally.\n\t\treturn data;\n\t}\n\n\t/**\n\t * Helper function which checks if a DOM text node, preceded by the given `prevNode` should\n\t * be trimmed from the left side.\n\t *\n\t * @param {Node} prevNode\n\t */\n\t_checkShouldLeftTrimDomText( prevNode ) {\n\t\tif ( !prevNode ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( isElement( prevNode ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn /[^\\S\\u00A0]/.test( prevNode.data.charAt( prevNode.data.length - 1 ) );\n\t}\n\n\t/**\n\t * Helper function which checks if a DOM text node, succeeded by the given `nextNode` should\n\t * be trimmed from the right side.\n\t *\n\t * @param {Node} node\n\t * @param {Node} nextNode\n\t */\n\t_checkShouldRightTrimDomText( node, nextNode ) {\n\t\tif ( nextNode ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn !startsWithFiller( node );\n\t}\n\n\t/**\n\t * Helper function. For given {@link module:engine/view/text~Text view text node}, it finds previous or next sibling\n\t * that is contained in the same container element. If there is no such sibling, `null` is returned.\n\t *\n\t * @param {module:engine/view/text~Text} node Reference node.\n\t * @param {Boolean} getNext\n\t * @returns {module:engine/view/text~Text|null} Touching text node or `null` if there is no next or previous touching text node.\n\t */\n\t_getTouchingViewTextNode( node, getNext ) {\n\t\tconst treeWalker = new ViewTreeWalker( {\n\t\t\tstartPosition: getNext ? ViewPosition._createAfter( node ) : ViewPosition._createBefore( node ),\n\t\t\tdirection: getNext ? 'forward' : 'backward'\n\t\t} );\n\n\t\tfor ( const value of treeWalker ) {\n\t\t\t// ViewContainerElement is found on a way to next ViewText node, so given `node` was first/last\n\t\t\t// text node in its container element.\n\t\t\tif ( value.item.is( 'containerElement' ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// found – it works like a block boundary, so do not scan further.\n\t\t\telse if ( value.item.is( 'br' ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t// Found a text node in the same container element.\n\t\t\telse if ( value.item.is( 'textProxy' ) ) {\n\t\t\t\treturn value.item;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Helper function. For the given text node, it finds the closest touching node which is either\n\t * a text node or a ` `. The search is terminated at block element boundaries and if a matching node\n\t * wasn't found so far, `null` is returned.\n\t *\n\t * In the following DOM structure:\n\t *\n\t *\t\tfoobar bom
\n\t *\n\t * * `foo` doesn't have its previous touching inline node (`null` is returned),\n\t * * `foo`'s next touching inline node is `bar`\n\t * * `bar`'s next touching inline node is ` `\n\t *\n\t * This method returns text nodes and ` ` elements because these types of nodes affect how\n\t * spaces in the given text node need to be converted.\n\t *\n\t * @private\n\t * @param {Text} node\n\t * @param {Boolean} getNext\n\t * @returns {Text|Element|null}\n\t */\n\t_getTouchingInlineDomNode( node, getNext ) {\n\t\tif ( !node.parentNode ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst direction = getNext ? 'nextNode' : 'previousNode';\n\t\tconst document = node.ownerDocument;\n\t\tconst topmostParent = getAncestors( node )[ 0 ];\n\n\t\tconst treeWalker = document.createTreeWalker( topmostParent, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, {\n\t\t\tacceptNode( node ) {\n\t\t\t\tif ( isText( node ) ) {\n\t\t\t\t\treturn NodeFilter.FILTER_ACCEPT;\n\t\t\t\t}\n\n\t\t\t\tif ( node.tagName == 'BR' ) {\n\t\t\t\t\treturn NodeFilter.FILTER_ACCEPT;\n\t\t\t\t}\n\n\t\t\t\treturn NodeFilter.FILTER_SKIP;\n\t\t\t}\n\t\t} );\n\n\t\ttreeWalker.currentNode = node;\n\n\t\tconst touchingNode = treeWalker[ direction ]();\n\n\t\tif ( touchingNode !== null ) {\n\t\t\tconst lca = getCommonAncestor( node, touchingNode );\n\n\t\t\t// If there is common ancestor between the text node and next/prev text node,\n\t\t\t// and there are no block elements on a way from the text node to that ancestor,\n\t\t\t// and there are no block elements on a way from next/prev text node to that ancestor...\n\t\t\tif (\n\t\t\t\tlca &&\n\t\t\t\t!_hasDomParentOfType( node, this.blockElements, lca ) &&\n\t\t\t\t!_hasDomParentOfType( touchingNode, this.blockElements, lca )\n\t\t\t) {\n\t\t\t\t// Then they are in the same container element.\n\t\t\t\treturn touchingNode;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\n// Helper function.\n// Used to check if given native `Element` or `Text` node has parent with tag name from `types` array.\n//\n// @param {Node} node\n// @param {Array.} types\n// @param {Boolean} [boundaryParent] Can be given if parents should be checked up to a given element (excluding that element).\n// @returns {Boolean} `true` if such parent exists or `false` if it does not.\nfunction _hasDomParentOfType( node, types, boundaryParent ) {\n\tlet parents = getAncestors( node );\n\n\tif ( boundaryParent ) {\n\t\tparents = parents.slice( parents.indexOf( boundaryParent ) + 1 );\n\t}\n\n\treturn parents.some( parent => parent.tagName && types.includes( parent.tagName.toLowerCase() ) );\n}\n\n// A helper that executes given callback for each DOM node's ancestor, starting from the given node\n// and ending in document#documentElement.\n//\n// @param {Node} node\n// @param {Function} callback A callback to be executed for each ancestor.\nfunction forEachDomNodeAncestor( node, callback ) {\n\twhile ( node && node != global.document ) {\n\t\tcallback( node );\n\t\tnode = node.parentNode;\n\t}\n}\n\n// Checks if given node is a nbsp block filler.\n//\n// A is a block filler only if it is a single child of a block element.\n//\n// @param {Node} domNode DOM node.\n// @returns {Boolean}\nfunction isNbspBlockFiller( domNode, blockElements ) {\n\tconst isNBSP = isText( domNode ) && domNode.data == '\\u00A0';\n\n\treturn isNBSP && hasBlockParent( domNode, blockElements ) && domNode.parentNode.childNodes.length === 1;\n}\n\n// Checks if domNode has block parent.\n//\n// @param {Node} domNode DOM node.\n// @returns {Boolean}\nfunction hasBlockParent( domNode, blockElements ) {\n\tconst parent = domNode.parentNode;\n\n\treturn parent && parent.tagName && blockElements.includes( parent.tagName.toLowerCase() );\n}\n\n/**\n * Enum representing type of the block filler.\n *\n * Possible values:\n *\n * * `br` - for ` ` block filler used in editing view,\n * * `nbsp` - for ` ` block fillers used in the data.\n *\n * @typedef {String} module:engine/view/filler~BlockFillerMode\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/getcommonancestor\n */\n\nimport getAncestors from './getancestors';\n\n/**\n * Searches and returns the lowest common ancestor of two given nodes.\n *\n * @param {Node} nodeA First node.\n * @param {Node} nodeB Second node.\n * @returns {Node|DocumentFragment|Document|null} Lowest common ancestor of both nodes or `null` if nodes do not have a common ancestor.\n */\nexport default function getCommonAncestor( nodeA, nodeB ) {\n\tconst ancestorsA = getAncestors( nodeA );\n\tconst ancestorsB = getAncestors( nodeB );\n\n\tlet i = 0;\n\n\t// It does not matter which array is shorter.\n\twhile ( ancestorsA[ i ] == ancestorsB[ i ] && ancestorsA[ i ] ) {\n\t\ti++;\n\t}\n\n\treturn i === 0 ? null : ancestorsA[ i - 1 ];\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/iswindow\n */\n\n/**\n * Checks if the object is a native DOM Window.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isWindow( obj ) {\n\tconst stringifiedObject = Object.prototype.toString.apply( obj );\n\n\t// Returns `true` for the `window` object in browser environments.\n\tif ( stringifiedObject == '[object Window]' ) {\n\t\treturn true;\n\t}\n\n\t// Returns `true` for the `window` object in the Electron environment.\n\tif ( stringifiedObject == '[object global]' ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/emittermixin\n */\n\nimport { default as EmitterMixin, _getEmitterListenedTo, _setEmitterId } from '../emittermixin';\nimport uid from '../uid';\nimport isNode from './isnode';\nimport isWindow from './iswindow';\nimport { extend } from 'lodash-es';\n\n/**\n * Mixin that injects the DOM events API into its host. It provides the API\n * compatible with {@link module:utils/emittermixin~EmitterMixin}.\n *\n * DOM emitter mixin is by default available in the {@link module:ui/view~View} class,\n * but it can also be mixed into any other class:\n *\n *\t\timport mix from '../utils/mix.js';\n *\t\timport DomEmitterMixin from '../utils/dom/emittermixin.js';\n *\n *\t\tclass SomeView {}\n *\t\tmix( SomeView, DomEmitterMixin );\n *\n *\t\tconst view = new SomeView();\n *\t\tview.listenTo( domElement, ( evt, domEvt ) => {\n *\t\t\tconsole.log( evt, domEvt );\n *\t\t} );\n *\n * @mixin EmitterMixin\n * @mixes module:utils/emittermixin~EmitterMixin\n * @implements module:utils/dom/emittermixin~Emitter\n */\nconst DomEmitterMixin = extend( {}, EmitterMixin, {\n\t/**\n\t * Registers a callback function to be executed when an event is fired in a specific Emitter or DOM Node.\n\t * It is backwards compatible with {@link module:utils/emittermixin~EmitterMixin#listenTo}.\n\t *\n\t * @param {module:utils/emittermixin~Emitter|Node} emitter The object that fires the event.\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to be called on event.\n\t * @param {Object} [options={}] Additional options.\n\t * @param {module:utils/priorities~PriorityString|Number} [options.priority='normal'] The priority of this event callback. The higher\n\t * the priority value the sooner the callback will be fired. Events having the same priority are called in the\n\t * order they were added.\n\t * @param {Boolean} [options.useCapture=false] Indicates that events of this type will be dispatched to the registered\n\t * listener before being dispatched to any EventTarget beneath it in the DOM tree.\n\t */\n\tlistenTo( emitter, ...rest ) {\n\t\t// Check if emitter is an instance of DOM Node. If so, replace the argument with\n\t\t// corresponding ProxyEmitter (or create one if not existing).\n\t\tif ( isNode( emitter ) || isWindow( emitter ) ) {\n\t\t\tconst proxy = this._getProxyEmitter( emitter ) || new ProxyEmitter( emitter );\n\n\t\t\tproxy.attach( ...rest );\n\n\t\t\temitter = proxy;\n\t\t}\n\n\t\t// Execute parent class method with Emitter (or ProxyEmitter) instance.\n\t\tEmitterMixin.listenTo.call( this, emitter, ...rest );\n\t},\n\n\t/**\n\t * Stops listening for events. It can be used at different levels:\n\t * It is backwards compatible with {@link module:utils/emittermixin~EmitterMixin#listenTo}.\n\t *\n\t * * To stop listening to a specific callback.\n\t * * To stop listening to a specific event.\n\t * * To stop listening to all events fired by a specific object.\n\t * * To stop listening to all events fired by all object.\n\t *\n\t * @param {module:utils/emittermixin~Emitter|Node} [emitter] The object to stop listening to. If omitted, stops it for all objects.\n\t * @param {String} [event] (Requires the `emitter`) The name of the event to stop listening to. If omitted, stops it\n\t * for all events from `emitter`.\n\t * @param {Function} [callback] (Requires the `event`) The function to be removed from the call list for the given\n\t * `event`.\n\t */\n\tstopListening( emitter, event, callback ) {\n\t\t// Check if emitter is an instance of DOM Node. If so, replace the argument with corresponding ProxyEmitter.\n\t\tif ( isNode( emitter ) || isWindow( emitter ) ) {\n\t\t\tconst proxy = this._getProxyEmitter( emitter );\n\n\t\t\t// Element has no listeners.\n\t\t\tif ( !proxy ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\temitter = proxy;\n\t\t}\n\n\t\t// Execute parent class method with Emitter (or ProxyEmitter) instance.\n\t\tEmitterMixin.stopListening.call( this, emitter, event, callback );\n\n\t\tif ( emitter instanceof ProxyEmitter ) {\n\t\t\temitter.detach( event );\n\t\t}\n\t},\n\n\t/**\n\t * Retrieves ProxyEmitter instance for given DOM Node residing in this Host.\n\t *\n\t * @private\n\t * @param {Node} node DOM Node of the ProxyEmitter.\n\t * @returns {module:utils/dom/emittermixin~ProxyEmitter} ProxyEmitter instance or null.\n\t */\n\t_getProxyEmitter( node ) {\n\t\treturn _getEmitterListenedTo( this, getNodeUID( node ) );\n\t}\n} );\n\nexport default DomEmitterMixin;\n\n/**\n * Creates a ProxyEmitter instance. Such an instance is a bridge between a DOM Node firing events\n * and any Host listening to them. It is backwards compatible with {@link module:utils/emittermixin~EmitterMixin#on}.\n *\n * listenTo( click, ... )\n * +-----------------------------------------+\n * | stopListening( ... ) |\n * +----------------------------+ | addEventListener( click, ... )\n * | Host | | +---------------------------------------------+\n * +----------------------------+ | | removeEventListener( click, ... ) |\n * | _listeningTo: { | +----------v-------------+ |\n * | UID: { | | ProxyEmitter | |\n * | emitter: ProxyEmitter, | +------------------------+ +------------v----------+\n * | callbacks: { | | events: { | | Node (HTMLElement) |\n * | click: [ callbacks ] | | click: [ callbacks ] | +-----------------------+\n * | } | | }, | | data-ck-expando: UID |\n * | } | | _domNode: Node, | +-----------------------+\n * | } | | _domListeners: {}, | |\n * | +------------------------+ | | _emitterId: UID | |\n * | | DomEmitterMixin | | +--------------^---------+ |\n * | +------------------------+ | | | |\n * +--------------^-------------+ | +---------------------------------------------+\n * | | click (DOM Event)\n * +-----------------------------------------+\n * fire( click, DOM Event )\n *\n * @mixes module:utils/emittermixin~EmitterMixin\n * @implements module:utils/dom/emittermixin~Emitter\n * @private\n */\nclass ProxyEmitter {\n\t/**\n\t * @param {Node} node DOM Node that fires events.\n\t * @returns {Object} ProxyEmitter instance bound to the DOM Node.\n\t */\n\tconstructor( node ) {\n\t\t// Set emitter ID to match DOM Node \"expando\" property.\n\t\t_setEmitterId( this, getNodeUID( node ) );\n\n\t\t// Remember the DOM Node this ProxyEmitter is bound to.\n\t\tthis._domNode = node;\n\t}\n}\n\nextend( ProxyEmitter.prototype, EmitterMixin, {\n\t/**\n\t * Collection of native DOM listeners.\n\t *\n\t * @private\n\t * @member {Object} module:utils/dom/emittermixin~ProxyEmitter#_domListeners\n\t */\n\n\t/**\n\t * Registers a callback function to be executed when an event is fired.\n\t *\n\t * It attaches a native DOM listener to the DOM Node. When fired,\n\t * a corresponding Emitter event will also fire with DOM Event object as an argument.\n\t *\n\t * @method module:utils/dom/emittermixin~ProxyEmitter#attach\n\t * @param {String} event The name of the event.\n\t * @param {Function} callback The function to be called on event.\n\t * @param {Object} [options={}] Additional options.\n\t * @param {Boolean} [options.useCapture=false] Indicates that events of this type will be dispatched to the registered\n\t * listener before being dispatched to any EventTarget beneath it in the DOM tree.\n\t */\n\tattach( event, callback, options = {} ) {\n\t\t// If the DOM Listener for given event already exist it is pointless\n\t\t// to attach another one.\n\t\tif ( this._domListeners && this._domListeners[ event ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst domListener = this._createDomListener( event, !!options.useCapture );\n\n\t\t// Attach the native DOM listener to DOM Node.\n\t\tthis._domNode.addEventListener( event, domListener, !!options.useCapture );\n\n\t\tif ( !this._domListeners ) {\n\t\t\tthis._domListeners = {};\n\t\t}\n\n\t\t// Store the native DOM listener in this ProxyEmitter. It will be helpful\n\t\t// when stopping listening to the event.\n\t\tthis._domListeners[ event ] = domListener;\n\t},\n\n\t/**\n\t * Stops executing the callback on the given event.\n\t *\n\t * @method module:utils/dom/emittermixin~ProxyEmitter#detach\n\t * @param {String} event The name of the event.\n\t */\n\tdetach( event ) {\n\t\tlet events;\n\n\t\t// Remove native DOM listeners which are orphans. If no callbacks\n\t\t// are awaiting given event, detach native DOM listener from DOM Node.\n\t\t// See: {@link attach}.\n\n\t\tif ( this._domListeners[ event ] && ( !( events = this._events[ event ] ) || !events.callbacks.length ) ) {\n\t\t\tthis._domListeners[ event ].removeListener();\n\t\t}\n\t},\n\n\t/**\n\t * Creates a native DOM listener callback. When the native DOM event\n\t * is fired it will fire corresponding event on this ProxyEmitter.\n\t * Note: A native DOM Event is passed as an argument.\n\t *\n\t * @private\n\t * @method module:utils/dom/emittermixin~ProxyEmitter#_createDomListener\n\t * @param {String} event The name of the event.\n\t * @param {Boolean} useCapture Indicates whether the listener was created for capturing event.\n\t * @returns {Function} The DOM listener callback.\n\t */\n\t_createDomListener( event, useCapture ) {\n\t\tconst domListener = domEvt => {\n\t\t\tthis.fire( event, domEvt );\n\t\t};\n\n\t\t// Supply the DOM listener callback with a function that will help\n\t\t// detach it from the DOM Node, when it is no longer necessary.\n\t\t// See: {@link detach}.\n\t\tdomListener.removeListener = () => {\n\t\t\tthis._domNode.removeEventListener( event, domListener, useCapture );\n\t\t\tdelete this._domListeners[ event ];\n\t\t};\n\n\t\treturn domListener;\n\t}\n} );\n\n// Gets an unique DOM Node identifier. The identifier will be set if not defined.\n//\n// @private\n// @param {Node} node\n// @returns {String} UID for given DOM Node.\nfunction getNodeUID( node ) {\n\treturn node[ 'data-ck-expando' ] || ( node[ 'data-ck-expando' ] = uid() );\n}\n\n/**\n * Interface representing classes which mix in {@link module:utils/dom/emittermixin~EmitterMixin}.\n *\n * @interface Emitter\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/observer\n */\n\nimport DomEmitterMixin from '@ckeditor/ckeditor5-utils/src/dom/emittermixin';\nimport mix from '@ckeditor/ckeditor5-utils/src/mix';\n\n/**\n * Abstract base observer class. Observers are classes which listen to DOM events, do the preliminary\n * processing and fire events on the {@link module:engine/view/document~Document} objects.\n * Observers can also add features to the view, for instance by updating its status or marking elements\n * which need refresh on DOM events.\n *\n * @abstract\n */\nexport default class Observer {\n\t/**\n\t * Creates an instance of the observer.\n\t *\n\t * @param {module:engine/view/view~View} view\n\t */\n\tconstructor( view ) {\n\t\t/**\n\t\t * Instance of the view controller.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/view~View}\n\t\t */\n\t\tthis.view = view;\n\n\t\t/**\n\t\t * Reference to the {@link module:engine/view/document~Document} object.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/document~Document}\n\t\t */\n\t\tthis.document = view.document;\n\n\t\t/**\n\t\t * State of the observer. If it is disabled events will not be fired.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Boolean}\n\t\t */\n\t\tthis.isEnabled = false;\n\t}\n\n\t/**\n\t * Enables the observer. This method is called when the observer is registered to the\n\t * {@link module:engine/view/view~View} and after {@link module:engine/view/view~View#forceRender rendering}\n\t * (all observers are {@link #disable disabled} before rendering).\n\t *\n\t * A typical use case for disabling observers is that mutation observers need to be disabled for the rendering.\n\t * However, a child class may not need to be disabled, so it can implement an empty method.\n\t *\n\t * @see module:engine/view/observer/observer~Observer#disable\n\t */\n\tenable() {\n\t\tthis.isEnabled = true;\n\t}\n\n\t/**\n\t * Disables the observer. This method is called before\n\t * {@link module:engine/view/view~View#forceRender rendering} to prevent firing events during rendering.\n\t *\n\t * @see module:engine/view/observer/observer~Observer#enable\n\t */\n\tdisable() {\n\t\tthis.isEnabled = false;\n\t}\n\n\t/**\n\t * Disables and destroys the observer, among others removes event listeners created by the observer.\n\t */\n\tdestroy() {\n\t\tthis.disable();\n\t\tthis.stopListening();\n\t}\n\n\t/**\n\t * Starts observing the given root element.\n\t *\n\t * @method #observe\n\t * @param {HTMLElement} domElement\n\t * @param {String} name The name of the root element.\n\t */\n}\n\nmix( Observer, DomEmitterMixin );\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\nfunction isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n}\n\nexport default isEqualWith;\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/mutationobserver\n */\n\n/* globals window */\n\nimport Observer from './observer';\nimport ViewSelection from '../selection';\nimport { startsWithFiller, getDataWithoutFiller } from '../filler';\nimport { isEqualWith } from 'lodash-es';\n\n/**\n * Mutation observer class observes changes in the DOM, fires {@link module:engine/view/document~Document#event:mutations} event, mark view\n * elements as changed and call {@link module:engine/view/renderer~Renderer#render}.\n * Because all mutated nodes are marked as \"to be rendered\" and the\n * {@link module:engine/view/renderer~Renderer#render} is called, all changes will be reverted, unless the mutation will be handled by the\n * {@link module:engine/view/document~Document#event:mutations} event listener. It means user will see only handled changes, and the editor\n * will block all changes which are not handled.\n *\n * Mutation Observer also take care of reducing number of mutations which are fired. It removes duplicates and\n * mutations on elements which do not have corresponding view elements. Also\n * {@link module:engine/view/observer/mutationobserver~MutatedText text mutation} is fired only if parent element do not change child list.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @extends module:engine/view/observer/observer~Observer\n */\nexport default class MutationObserver extends Observer {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\t/**\n\t\t * Native mutation observer config.\n\t\t *\n\t\t * @private\n\t\t * @member {Object}\n\t\t */\n\t\tthis._config = {\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tcharacterDataOldValue: true,\n\t\t\tsubtree: true\n\t\t};\n\n\t\t/**\n\t\t * Reference to the {@link module:engine/view/view~View#domConverter}.\n\t\t *\n\t\t * @member {module:engine/view/domconverter~DomConverter}\n\t\t */\n\t\tthis.domConverter = view.domConverter;\n\n\t\t/**\n\t\t * Reference to the {@link module:engine/view/view~View#_renderer}.\n\t\t *\n\t\t * @member {module:engine/view/renderer~Renderer}\n\t\t */\n\t\tthis.renderer = view._renderer;\n\n\t\t/**\n\t\t * Observed DOM elements.\n\t\t *\n\t\t * @private\n\t\t * @member {Array.}\n\t\t */\n\t\tthis._domElements = [];\n\n\t\t/**\n\t\t * Native mutation observer.\n\t\t *\n\t\t * @private\n\t\t * @member {MutationObserver}\n\t\t */\n\t\tthis._mutationObserver = new window.MutationObserver( this._onMutations.bind( this ) );\n\t}\n\n\t/**\n\t * Synchronously fires {@link module:engine/view/document~Document#event:mutations} event with all mutations in record queue.\n\t * At the same time empties the queue so mutations will not be fired twice.\n\t */\n\tflush() {\n\t\tthis._onMutations( this._mutationObserver.takeRecords() );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tobserve( domElement ) {\n\t\tthis._domElements.push( domElement );\n\n\t\tif ( this.isEnabled ) {\n\t\t\tthis._mutationObserver.observe( domElement, this._config );\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tenable() {\n\t\tsuper.enable();\n\n\t\tfor ( const domElement of this._domElements ) {\n\t\t\tthis._mutationObserver.observe( domElement, this._config );\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdisable() {\n\t\tsuper.disable();\n\n\t\tthis._mutationObserver.disconnect();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis._mutationObserver.disconnect();\n\t}\n\n\t/**\n\t * Handles mutations. Deduplicates, mark view elements to sync, fire event and call render.\n\t *\n\t * @private\n\t * @param {Array.} domMutations Array of native mutations.\n\t */\n\t_onMutations( domMutations ) {\n\t\t// As a result of this.flush() we can have an empty collection.\n\t\tif ( domMutations.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst domConverter = this.domConverter;\n\n\t\t// Use map and set for deduplication.\n\t\tconst mutatedTexts = new Map();\n\t\tconst mutatedElements = new Set();\n\n\t\t// Handle `childList` mutations first, so we will be able to check if the `characterData` mutation is in the\n\t\t// element with changed structure anyway.\n\t\tfor ( const mutation of domMutations ) {\n\t\t\tif ( mutation.type === 'childList' ) {\n\t\t\t\tconst element = domConverter.mapDomToView( mutation.target );\n\n\t\t\t\t// Do not collect mutations from UIElements.\n\t\t\t\tif ( element && element.is( 'uiElement' ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( element && !this._isBogusBrMutation( mutation ) ) {\n\t\t\t\t\tmutatedElements.add( element );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle `characterData` mutations later, when we have the full list of nodes which changed structure.\n\t\tfor ( const mutation of domMutations ) {\n\t\t\tconst element = domConverter.mapDomToView( mutation.target );\n\n\t\t\t// Do not collect mutations from UIElements.\n\t\t\tif ( element && element.is( 'uiElement' ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( mutation.type === 'characterData' ) {\n\t\t\t\tconst text = domConverter.findCorrespondingViewText( mutation.target );\n\n\t\t\t\tif ( text && !mutatedElements.has( text.parent ) ) {\n\t\t\t\t\t// Use text as a key, for deduplication. If there will be another mutation on the same text element\n\t\t\t\t\t// we will have only one in the map.\n\t\t\t\t\tmutatedTexts.set( text, {\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\toldText: text.data,\n\t\t\t\t\t\tnewText: getDataWithoutFiller( mutation.target ),\n\t\t\t\t\t\tnode: text\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\t// When we added first letter to the text node which had only inline filler, for the DOM it is mutation\n\t\t\t\t// on text, but for the view, where filler text node did not existed, new text node was created, so we\n\t\t\t\t// need to fire 'children' mutation instead of 'text'.\n\t\t\t\telse if ( !text && startsWithFiller( mutation.target ) ) {\n\t\t\t\t\tmutatedElements.add( domConverter.mapDomToView( mutation.target.parentNode ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Now we build the list of mutations to fire and mark elements. We did not do it earlier to avoid marking the\n\t\t// same node multiple times in case of duplication.\n\n\t\t// List of mutations we will fire.\n\t\tconst viewMutations = [];\n\n\t\tfor ( const mutatedText of mutatedTexts.values() ) {\n\t\t\tthis.renderer.markToSync( 'text', mutatedText.node );\n\t\t\tviewMutations.push( mutatedText );\n\t\t}\n\n\t\tfor ( const viewElement of mutatedElements ) {\n\t\t\tconst domElement = domConverter.mapViewToDom( viewElement );\n\t\t\tconst viewChildren = Array.from( viewElement.getChildren() );\n\t\t\tconst newViewChildren = Array.from( domConverter.domChildrenToView( domElement, { withChildren: false } ) );\n\n\t\t\t// It may happen that as a result of many changes (sth was inserted and then removed),\n\t\t\t// both elements haven't really changed. #1031\n\t\t\tif ( !isEqualWith( viewChildren, newViewChildren, sameNodes ) ) {\n\t\t\t\tthis.renderer.markToSync( 'children', viewElement );\n\n\t\t\t\tviewMutations.push( {\n\t\t\t\t\ttype: 'children',\n\t\t\t\t\toldChildren: viewChildren,\n\t\t\t\t\tnewChildren: newViewChildren,\n\t\t\t\t\tnode: viewElement\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t// Retrieve `domSelection` using `ownerDocument` of one of mutated nodes.\n\t\t// There should not be simultaneous mutation in multiple documents, so it's fine.\n\t\tconst domSelection = domMutations[ 0 ].target.ownerDocument.getSelection();\n\n\t\tlet viewSelection = null;\n\n\t\tif ( domSelection && domSelection.anchorNode ) {\n\t\t\t// If `domSelection` is inside a dom node that is already bound to a view node from view tree, get\n\t\t\t// corresponding selection in the view and pass it together with `viewMutations`. The `viewSelection` may\n\t\t\t// be used by features handling mutations.\n\t\t\t// Only one range is supported.\n\n\t\t\tconst viewSelectionAnchor = domConverter.domPositionToView( domSelection.anchorNode, domSelection.anchorOffset );\n\t\t\tconst viewSelectionFocus = domConverter.domPositionToView( domSelection.focusNode, domSelection.focusOffset );\n\n\t\t\t// Anchor and focus has to be properly mapped to view.\n\t\t\tif ( viewSelectionAnchor && viewSelectionFocus ) {\n\t\t\t\tviewSelection = new ViewSelection( viewSelectionAnchor );\n\t\t\t\tviewSelection.setFocus( viewSelectionFocus );\n\t\t\t}\n\t\t}\n\n\t\t// In case only non-relevant mutations were recorded it skips the event and force render (#5600).\n\t\tif ( viewMutations.length ) {\n\t\t\tthis.document.fire( 'mutations', viewMutations, viewSelection );\n\n\t\t\t// If nothing changes on `mutations` event, at this point we have \"dirty DOM\" (changed) and de-synched\n\t\t\t// view (which has not been changed). In order to \"reset DOM\" we render the view again.\n\t\t\tthis.view.forceRender();\n\t\t}\n\n\t\tfunction sameNodes( child1, child2 ) {\n\t\t\t// First level of comparison (array of children vs array of children) – use the Lodash's default behavior.\n\t\t\tif ( Array.isArray( child1 ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Elements.\n\t\t\tif ( child1 === child2 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Texts.\n\t\t\telse if ( child1.is( 'text' ) && child2.is( 'text' ) ) {\n\t\t\t\treturn child1.data === child2.data;\n\t\t\t}\n\n\t\t\t// Not matching types.\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if mutation was generated by the browser inserting bogus br on the end of the block element.\n\t * Such mutations are generated while pressing space or performing native spellchecker correction\n\t * on the end of the block element in Firefox browser.\n\t *\n\t * @private\n\t * @param {Object} mutation Native mutation object.\n\t * @returns {Boolean}\n\t */\n\t_isBogusBrMutation( mutation ) {\n\t\tlet addedNode = null;\n\n\t\t// Check if mutation added only one node on the end of its parent.\n\t\tif ( mutation.nextSibling === null && mutation.removedNodes.length === 0 && mutation.addedNodes.length == 1 ) {\n\t\t\taddedNode = this.domConverter.domToView( mutation.addedNodes[ 0 ], {\n\t\t\t\twithChildren: false\n\t\t\t} );\n\t\t}\n\n\t\treturn addedNode && addedNode.is( 'element', 'br' );\n\t}\n}\n\n/**\n * Fired when mutation occurred. If tree view is not changed on this event, DOM will be reverted to the state before\n * mutation, so all changes which should be applied, should be handled on this event.\n *\n * Introduced by {@link module:engine/view/observer/mutationobserver~MutationObserver}.\n *\n * Note that because {@link module:engine/view/observer/mutationobserver~MutationObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/mutationobserver~MutationObserver\n * @event module:engine/view/document~Document#event:mutations\n * @param {Array.}\n * viewMutations Array of mutations.\n * For mutated texts it will be {@link module:engine/view/observer/mutationobserver~MutatedText} and for mutated elements it will be\n * {@link module:engine/view/observer/mutationobserver~MutatedChildren}. You can recognize the type based on the `type` property.\n * @param {module:engine/view/selection~Selection|null} viewSelection View selection that is a result of converting DOM selection to view.\n * Keep in\n * mind that the DOM selection is already \"updated\", meaning that it already acknowledges changes done in mutation.\n */\n\n/**\n * Mutation item for text.\n *\n * @see module:engine/view/document~Document#event:mutations\n * @see module:engine/view/observer/mutationobserver~MutatedChildren\n *\n * @typedef {Object} module:engine/view/observer/mutationobserver~MutatedText\n *\n * @property {String} type For text mutations it is always 'text'.\n * @property {module:engine/view/text~Text} node Mutated text node.\n * @property {String} oldText Old text.\n * @property {String} newText New text.\n */\n\n/**\n * Mutation item for child nodes.\n *\n * @see module:engine/view/document~Document#event:mutations\n * @see module:engine/view/observer/mutationobserver~MutatedText\n *\n * @typedef {Object} module:engine/view/observer/mutationobserver~MutatedChildren\n *\n * @property {String} type For child nodes mutations it is always 'children'.\n * @property {module:engine/view/element~Element} node Parent of the mutated children.\n * @property {Array.} oldChildren Old child nodes.\n * @property {Array.} newChildren New child nodes.\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/domeventdata\n */\n\nimport { extend } from 'lodash-es';\n\n/**\n * Information about a DOM event in context of the {@link module:engine/view/document~Document}.\n * It wraps the native event, which usually should not be used as the wrapper contains\n * additional data (like key code for keyboard events).\n */\nexport default class DomEventData {\n\t/**\n\t * @param {module:engine/view/view~View} view The instance of the view controller.\n\t * @param {Event} domEvent The DOM event.\n\t * @param {Object} [additionalData] Additional properties that the instance should contain.\n\t */\n\tconstructor( view, domEvent, additionalData ) {\n\t\t/**\n\t\t * Instance of the view controller.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/view~View} module:engine/view/observer/observer~Observer.DomEvent#view\n\t\t */\n\t\tthis.view = view;\n\n\t\t/**\n\t\t * The instance of the document.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/document~Document} module:engine/view/observer/observer~Observer.DomEvent#document\n\t\t */\n\t\tthis.document = view.document;\n\n\t\t/**\n\t\t * The DOM event.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Event} module:engine/view/observer/observer~Observer.DomEvent#domEvent\n\t\t */\n\t\tthis.domEvent = domEvent;\n\n\t\t/**\n\t\t * The DOM target.\n\t\t *\n\t\t * @readonly\n\t\t * @member {HTMLElement} module:engine/view/observer/observer~Observer.DomEvent#target\n\t\t */\n\t\tthis.domTarget = domEvent.target;\n\n\t\textend( this, additionalData );\n\t}\n\n\t/**\n\t * The tree view element representing the target.\n\t *\n\t * @readonly\n\t * @type module:engine/view/element~Element\n\t */\n\tget target() {\n\t\treturn this.view.domConverter.mapDomToView( this.domTarget );\n\t}\n\n\t/**\n\t * Prevents the native's event default action.\n\t */\n\tpreventDefault() {\n\t\tthis.domEvent.preventDefault();\n\t}\n\n\t/**\n\t * Stops native event propagation.\n\t */\n\tstopPropagation() {\n\t\tthis.domEvent.stopPropagation();\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/domeventobserver\n */\n\nimport Observer from './observer';\nimport DomEventData from './domeventdata';\n\n/**\n * Base class for DOM event observers. This class handles\n * {@link module:engine/view/observer/observer~Observer#observe adding} listeners to DOM elements,\n * {@link module:engine/view/observer/observer~Observer#disable disabling} and\n * {@link module:engine/view/observer/observer~Observer#enable re-enabling} events.\n * Child class needs to define\n * {@link module:engine/view/observer/domeventobserver~DomEventObserver#domEventType DOM event type} and\n * {@link module:engine/view/observer/domeventobserver~DomEventObserver#onDomEvent callback}.\n *\n * For instance:\n *\n *\t\tclass ClickObserver extends DomEventObserver {\n *\t\t\t// It can also be defined as a normal property in the constructor.\n *\t\t\tget domEventType() {\n *\t\t\t\treturn 'click';\n *\t\t\t}\n *\n *\t\t\tonDomEvent( domEvent ) {\n *\t\t\t\tthis.fire( 'click', domEvent );\n *\t\t\t}\n *\t\t}\n *\n * @extends module:engine/view/observer/observer~Observer\n */\nexport default class DomEventObserver extends Observer {\n\t/**\n\t * Type of the DOM event the observer should listen on. Array of types can be defined\n\t * if the obsever should listen to multiple DOM events.\n\t *\n\t * @readonly\n\t * @member {String|Array.} #domEventType\n\t */\n\n\t/**\n\t * Callback which should be called when the DOM event occurred. Note that the callback will not be called if\n\t * observer {@link #isEnabled is not enabled}.\n\t *\n\t * @see #domEventType\n\t * @abstract\n\t * @method #onDomEvent\n\t */\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\t/**\n\t\t * If set to `true` DOM events will be listened on the capturing phase.\n\t\t * Default value is `false`.\n\t\t *\n\t\t * @member {Boolean}\n\t\t */\n\t\tthis.useCapture = false;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tobserve( domElement ) {\n\t\tconst types = typeof this.domEventType == 'string' ? [ this.domEventType ] : this.domEventType;\n\n\t\ttypes.forEach( type => {\n\t\t\tthis.listenTo( domElement, type, ( eventInfo, domEvent ) => {\n\t\t\t\tif ( this.isEnabled ) {\n\t\t\t\t\tthis.onDomEvent( domEvent );\n\t\t\t\t}\n\t\t\t}, { useCapture: this.useCapture } );\n\t\t} );\n\t}\n\n\t/**\n\t * Calls `Document#fire()` if observer {@link #isEnabled is enabled}.\n\t *\n\t * @see module:utils/emittermixin~EmitterMixin#fire\n\t * @param {String} eventType The event type (name).\n\t * @param {Event} domEvent The DOM event.\n\t * @param {Object} [additionalData] The additional data which should extend the\n\t * {@link module:engine/view/observer/domeventdata~DomEventData event data} object.\n\t */\n\tfire( eventType, domEvent, additionalData ) {\n\t\tif ( this.isEnabled ) {\n\t\t\tthis.document.fire( eventType, new DomEventData( this.view, domEvent, additionalData ) );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/keyobserver\n */\n\nimport DomEventObserver from './domeventobserver';\nimport { getCode } from '@ckeditor/ckeditor5-utils/src/keyboard';\n\n/**\n * Observer for events connected with pressing keyboard keys.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @extends module:engine/view/observer/domeventobserver~DomEventObserver\n */\nexport default class KeyObserver extends DomEventObserver {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\tthis.domEventType = [ 'keydown', 'keyup' ];\n\t}\n\n\tonDomEvent( domEvt ) {\n\t\tthis.fire( domEvt.type, domEvt, {\n\t\t\tkeyCode: domEvt.keyCode,\n\n\t\t\taltKey: domEvt.altKey,\n\t\t\tctrlKey: domEvt.ctrlKey || domEvt.metaKey,\n\t\t\tshiftKey: domEvt.shiftKey,\n\n\t\t\tget keystroke() {\n\t\t\t\treturn getCode( this );\n\t\t\t}\n\t\t} );\n\t}\n}\n\n/**\n * Fired when a key has been pressed.\n *\n * Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.\n *\n * Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/keyobserver~KeyObserver\n * @event module:engine/view/document~Document#event:keydown\n * @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData\n */\n\n/**\n * Fired when a key has been released.\n *\n * Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.\n *\n * Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/keyobserver~KeyObserver\n * @event module:engine/view/document~Document#event:keyup\n * @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData\n */\n\n/**\n * The value of both events - {@link module:engine/view/document~Document#event:keydown} and\n * {@link module:engine/view/document~Document#event:keyup}.\n *\n * @class module:engine/view/observer/keyobserver~KeyEventData\n * @extends module:engine/view/observer/domeventdata~DomEventData\n * @implements module:utils/keyboard~KeystrokeInfo\n */\n\n/**\n * Code of the whole keystroke. See {@link module:utils/keyboard~getCode}.\n *\n * @readonly\n * @member {Number} module:engine/view/observer/keyobserver~KeyEventData#keystroke\n */\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","import isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/fakeselectionobserver\n */\n\nimport Observer from './observer';\nimport ViewSelection from '../selection';\nimport { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';\nimport { debounce } from 'lodash-es';\n\n/**\n * Fake selection observer class. If view selection is fake it is placed in dummy DOM container. This observer listens\n * on {@link module:engine/view/document~Document#event:keydown keydown} events and handles moving fake view selection to the correct place\n * if arrow keys are pressed.\n * Fires {@link module:engine/view/document~Document#event:selectionChange selectionChange event} simulating natural behaviour of\n * {@link module:engine/view/observer/selectionobserver~SelectionObserver SelectionObserver}.\n *\n * @extends module:engine/view/observer/observer~Observer\n */\nexport default class FakeSelectionObserver extends Observer {\n\t/**\n\t * Creates new FakeSelectionObserver instance.\n\t *\n\t * @param {module:engine/view/view~View} view\n\t */\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\t/**\n\t\t * Fires debounced event `selectionChangeDone`. It uses `lodash#debounce` method to delay function call.\n\t\t *\n\t\t * @private\n\t\t * @param {Object} data Selection change data.\n\t\t * @method #_fireSelectionChangeDoneDebounced\n\t\t */\n\t\tthis._fireSelectionChangeDoneDebounced = debounce( data => this.document.fire( 'selectionChangeDone', data ), 200 );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tobserve() {\n\t\tconst document = this.document;\n\n\t\tdocument.on( 'keydown', ( eventInfo, data ) => {\n\t\t\tconst selection = document.selection;\n\n\t\t\tif ( selection.isFake && _isArrowKeyCode( data.keyCode ) && this.isEnabled ) {\n\t\t\t\t// Prevents default key down handling - no selection change will occur.\n\t\t\t\tdata.preventDefault();\n\n\t\t\t\tthis._handleSelectionMove( data.keyCode );\n\t\t\t}\n\t\t}, { priority: 'lowest' } );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tthis._fireSelectionChangeDoneDebounced.cancel();\n\t}\n\n\t/**\n\t * Handles collapsing view selection according to given key code. If left or up key is provided - new selection will be\n\t * collapsed to left. If right or down key is pressed - new selection will be collapsed to right.\n\t *\n\t * This method fires {@link module:engine/view/document~Document#event:selectionChange} and\n\t * {@link module:engine/view/document~Document#event:selectionChangeDone} events imitating behaviour of\n\t * {@link module:engine/view/observer/selectionobserver~SelectionObserver}.\n\t *\n\t * @private\n\t * @param {Number} keyCode\n\t * @fires module:engine/view/document~Document#event:selectionChange\n\t * @fires module:engine/view/document~Document#event:selectionChangeDone\n\t */\n\t_handleSelectionMove( keyCode ) {\n\t\tconst selection = this.document.selection;\n\t\tconst newSelection = new ViewSelection( selection.getRanges(), { backward: selection.isBackward, fake: false } );\n\n\t\t// Left or up arrow pressed - move selection to start.\n\t\tif ( keyCode == keyCodes.arrowleft || keyCode == keyCodes.arrowup ) {\n\t\t\tnewSelection.setTo( newSelection.getFirstPosition() );\n\t\t}\n\n\t\t// Right or down arrow pressed - move selection to end.\n\t\tif ( keyCode == keyCodes.arrowright || keyCode == keyCodes.arrowdown ) {\n\t\t\tnewSelection.setTo( newSelection.getLastPosition() );\n\t\t}\n\n\t\tconst data = {\n\t\t\toldSelection: selection,\n\t\t\tnewSelection,\n\t\t\tdomSelection: null\n\t\t};\n\n\t\t// Fire dummy selection change event.\n\t\tthis.document.fire( 'selectionChange', data );\n\n\t\t// Call` #_fireSelectionChangeDoneDebounced` every time when `selectionChange` event is fired.\n\t\t// This function is debounced what means that `selectionChangeDone` event will be fired only when\n\t\t// defined int the function time will elapse since the last time the function was called.\n\t\t// So `selectionChangeDone` will be fired when selection will stop changing.\n\t\tthis._fireSelectionChangeDoneDebounced( data );\n\t}\n}\n\n// Checks if one of the arrow keys is pressed.\n//\n// @private\n// @param {Number} keyCode\n// @returns {Boolean}\nfunction _isArrowKeyCode( keyCode ) {\n\treturn keyCode == keyCodes.arrowright ||\n\t\tkeyCode == keyCodes.arrowleft ||\n\t\tkeyCode == keyCodes.arrowup ||\n\t\tkeyCode == keyCodes.arrowdown;\n}\n\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/selectionobserver\n */\n\n/* global setInterval, clearInterval */\n\nimport Observer from './observer';\nimport MutationObserver from './mutationobserver';\nimport { debounce } from 'lodash-es';\n\n/**\n * Selection observer class observes selection changes in the document. If selection changes on the document this\n * observer checks if there are any mutations and if DOM selection is different than the\n * {@link module:engine/view/document~Document#selection view selection}. Selection observer fires\n * {@link module:engine/view/document~Document#event:selectionChange} event only if selection change was the only change in the document\n * and DOM selection is different then the view selection.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @see module:engine/view/observer/mutationobserver~MutationObserver\n * @extends module:engine/view/observer/observer~Observer\n */\nexport default class SelectionObserver extends Observer {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\t/**\n\t\t * Instance of the mutation observer. Selection observer calls\n\t\t * {@link module:engine/view/observer/mutationobserver~MutationObserver#flush} to ensure that the mutations will be handled\n\t\t * before the {@link module:engine/view/document~Document#event:selectionChange} event is fired.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/observer/mutationobserver~MutationObserver}\n\t\t * module:engine/view/observer/selectionobserver~SelectionObserver#mutationObserver\n\t\t */\n\t\tthis.mutationObserver = view.getObserver( MutationObserver );\n\n\t\t/**\n\t\t * Reference to the view {@link module:engine/view/documentselection~DocumentSelection} object used to compare\n\t\t * new selection with it.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/documentselection~DocumentSelection}\n\t\t * module:engine/view/observer/selectionobserver~SelectionObserver#selection\n\t\t */\n\t\tthis.selection = this.document.selection;\n\n\t\t/* eslint-disable max-len */\n\t\t/**\n\t\t * Reference to the {@link module:engine/view/view~View#domConverter}.\n\t\t *\n\t\t * @readonly\n\t\t * @member {module:engine/view/domconverter~DomConverter} module:engine/view/observer/selectionobserver~SelectionObserver#domConverter\n\t\t */\n\t\t/* eslint-enable max-len */\n\t\tthis.domConverter = view.domConverter;\n\n\t\t/**\n\t\t * Set of documents which have added \"selectionchange\" listener to avoid adding listener twice to the same\n\t\t * document.\n\t\t *\n\t\t * @private\n\t\t * @member {WeakSet.} module:engine/view/observer/selectionobserver~SelectionObserver#_documents\n\t\t */\n\t\tthis._documents = new WeakSet();\n\n\t\t/**\n\t\t * Fires debounced event `selectionChangeDone`. It uses `lodash#debounce` method to delay function call.\n\t\t *\n\t\t * @private\n\t\t * @param {Object} data Selection change data.\n\t\t * @method #_fireSelectionChangeDoneDebounced\n\t\t */\n\t\tthis._fireSelectionChangeDoneDebounced = debounce( data => this.document.fire( 'selectionChangeDone', data ), 200 );\n\n\t\tthis._clearInfiniteLoopInterval = setInterval( () => this._clearInfiniteLoop(), 1000 );\n\n\t\t/**\n\t\t * Private property to check if the code does not enter infinite loop.\n\t\t *\n\t\t * @private\n\t\t * @member {Number} module:engine/view/observer/selectionobserver~SelectionObserver#_loopbackCounter\n\t\t */\n\t\tthis._loopbackCounter = 0;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tobserve( domElement ) {\n\t\tconst domDocument = domElement.ownerDocument;\n\n\t\t// Add listener once per each document.\n\t\tif ( this._documents.has( domDocument ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.listenTo( domDocument, 'selectionchange', () => {\n\t\t\tthis._handleSelectionChange( domDocument );\n\t\t} );\n\n\t\tthis._documents.add( domDocument );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\n\t\tclearInterval( this._clearInfiniteLoopInterval );\n\t\tthis._fireSelectionChangeDoneDebounced.cancel();\n\t}\n\n\t/**\n\t * Selection change listener. {@link module:engine/view/observer/mutationobserver~MutationObserver#flush Flush} mutations, check if\n\t * selection changes and fires {@link module:engine/view/document~Document#event:selectionChange} event on every change\n\t * and {@link module:engine/view/document~Document#event:selectionChangeDone} when selection stop changing.\n\t *\n\t * @private\n\t * @param {Document} domDocument DOM document.\n\t */\n\t_handleSelectionChange( domDocument ) {\n\t\tif ( !this.isEnabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure the mutation event will be before selection event on all browsers.\n\t\tthis.mutationObserver.flush();\n\n\t\t// If there were mutations then the view will be re-rendered by the mutation observer and selection\n\t\t// will be updated, so selections will equal and event will not be fired, as expected.\n\t\tconst domSelection = domDocument.defaultView.getSelection();\n\t\tconst newViewSelection = this.domConverter.domSelectionToView( domSelection );\n\n\t\t// Do not convert selection change if the new view selection has no ranges in it.\n\t\t//\n\t\t// It means that the DOM selection is in some way incorrect. Ranges that were in the DOM selection could not be\n\t\t// converted to the view. This happens when the DOM selection was moved outside of the editable element.\n\t\tif ( newViewSelection.rangeCount == 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.selection.isEqual( newViewSelection ) && this.domConverter.isDomSelectionCorrect( domSelection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure we are not in the infinite loop (#400).\n\t\t// This counter is reset each second. 60 selection changes in 1 second is enough high number\n\t\t// to be very difficult (impossible) to achieve using just keyboard keys (during normal editor use).\n\t\tif ( ++this._loopbackCounter > 60 ) {\n\t\t\t// Selection change observer detected an infinite rendering loop.\n\t\t\t// Most probably you try to put the selection in the position which is not allowed\n\t\t\t// by the browser and browser fixes it automatically what causes `selectionchange` event on\n\t\t\t// which a loopback through a model tries to re-render the wrong selection and again.\n\t\t\t//\n\t\t\t// @if CK_DEBUG // console.warn( 'Selection change observer detected an infinite rendering loop.' );\n\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.selection.isSimilar( newViewSelection ) ) {\n\t\t\t// If selection was equal and we are at this point of algorithm, it means that it was incorrect.\n\t\t\t// Just re-render it, no need to fire any events, etc.\n\t\t\tthis.view.forceRender();\n\t\t} else {\n\t\t\tconst data = {\n\t\t\t\toldSelection: this.selection,\n\t\t\t\tnewSelection: newViewSelection,\n\t\t\t\tdomSelection\n\t\t\t};\n\n\t\t\t// Prepare data for new selection and fire appropriate events.\n\t\t\tthis.document.fire( 'selectionChange', data );\n\n\t\t\t// Call` #_fireSelectionChangeDoneDebounced` every time when `selectionChange` event is fired.\n\t\t\t// This function is debounced what means that `selectionChangeDone` event will be fired only when\n\t\t\t// defined int the function time will elapse since the last time the function was called.\n\t\t\t// So `selectionChangeDone` will be fired when selection will stop changing.\n\t\t\tthis._fireSelectionChangeDoneDebounced( data );\n\t\t}\n\t}\n\n\t/**\n\t * Clears `SelectionObserver` internal properties connected with preventing infinite loop.\n\t *\n\t * @protected\n\t */\n\t_clearInfiniteLoop() {\n\t\tthis._loopbackCounter = 0;\n\t}\n}\n\n/**\n * Fired when selection has changed. This event is fired only when the selection change was the only change that happened\n * in the document, and old selection is different then the new selection.\n *\n * Introduced by {@link module:engine/view/observer/selectionobserver~SelectionObserver}.\n *\n * Note that because {@link module:engine/view/observer/selectionobserver~SelectionObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/selectionobserver~SelectionObserver\n * @event module:engine/view/document~Document#event:selectionChange\n * @param {Object} data\n * @param {module:engine/view/documentselection~DocumentSelection} data.oldSelection Old View selection which is\n * {@link module:engine/view/document~Document#selection}.\n * @param {module:engine/view/selection~Selection} data.newSelection New View selection which is converted DOM selection.\n * @param {Selection} data.domSelection Native DOM selection.\n */\n\n/**\n * Fired when selection stops changing.\n *\n * Introduced by {@link module:engine/view/observer/selectionobserver~SelectionObserver}.\n *\n * Note that because {@link module:engine/view/observer/selectionobserver~SelectionObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/selectionobserver~SelectionObserver\n * @event module:engine/view/document~Document#event:selectionChangeDone\n * @param {Object} data\n * @param {module:engine/view/documentselection~DocumentSelection} data.oldSelection Old View selection which is\n * {@link module:engine/view/document~Document#selection}.\n * @param {module:engine/view/selection~Selection} data.newSelection New View selection which is converted DOM selection.\n * @param {Selection} data.domSelection Native DOM selection.\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/focusobserver\n */\n\n/* globals setTimeout, clearTimeout */\n\nimport DomEventObserver from './domeventobserver';\n\n/**\n * {@link module:engine/view/document~Document#event:focus Focus}\n * and {@link module:engine/view/document~Document#event:blur blur} events observer.\n * Focus observer handle also {@link module:engine/view/rooteditableelement~RootEditableElement#isFocused isFocused} property of the\n * {@link module:engine/view/rooteditableelement~RootEditableElement root elements}.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @extends module:engine/view/observer/domeventobserver~DomEventObserver\n */\nexport default class FocusObserver extends DomEventObserver {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\tthis.domEventType = [ 'focus', 'blur' ];\n\t\tthis.useCapture = true;\n\t\tconst document = this.document;\n\n\t\tdocument.on( 'focus', () => {\n\t\t\tdocument.isFocused = true;\n\n\t\t\t// Unfortunately native `selectionchange` event is fired asynchronously.\n\t\t\t// We need to wait until `SelectionObserver` handle the event and then render. Otherwise rendering will\n\t\t\t// overwrite new DOM selection with selection from the view.\n\t\t\t// See https://github.com/ckeditor/ckeditor5-engine/issues/795 for more details.\n\t\t\t// Long timeout is needed to solve #676 and https://github.com/ckeditor/ckeditor5-engine/issues/1157 issues.\n\t\t\tthis._renderTimeoutId = setTimeout( () => view.forceRender(), 50 );\n\t\t} );\n\n\t\tdocument.on( 'blur', ( evt, data ) => {\n\t\t\tconst selectedEditable = document.selection.editableElement;\n\n\t\t\tif ( selectedEditable === null || selectedEditable === data.target ) {\n\t\t\t\tdocument.isFocused = false;\n\n\t\t\t\t// Re-render the document to update view elements.\n\t\t\t\tview.forceRender();\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Identifier of the timeout currently used by focus listener to delay rendering execution.\n\t\t *\n\t\t * @private\n\t\t * @member {Number} #_renderTimeoutId\n\t\t */\n\t}\n\n\tonDomEvent( domEvent ) {\n\t\tthis.fire( domEvent.type, domEvent );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tdestroy() {\n\t\tif ( this._renderTimeoutId ) {\n\t\t\tclearTimeout( this._renderTimeoutId );\n\t\t}\n\n\t\tsuper.destroy();\n\t}\n}\n\n/**\n * Fired when one of the editables gets focus.\n *\n * Introduced by {@link module:engine/view/observer/focusobserver~FocusObserver}.\n *\n * Note that because {@link module:engine/view/observer/focusobserver~FocusObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/focusobserver~FocusObserver\n * @event module:engine/view/document~Document#event:focus\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n\n/**\n * Fired when one of the editables loses focus.\n *\n * Introduced by {@link module:engine/view/observer/focusobserver~FocusObserver}.\n *\n * Note that because {@link module:engine/view/observer/focusobserver~FocusObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/focusobserver~FocusObserver\n * @event module:engine/view/document~Document#event:blur\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/observer/compositionobserver\n */\n\nimport DomEventObserver from './domeventobserver';\n\n/**\n * {@link module:engine/view/document~Document#event:compositionstart Compositionstart},\n * {@link module:engine/view/document~Document#event:compositionupdate compositionupdate} and\n * {@link module:engine/view/document~Document#event:compositionend compositionend} events observer.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @extends module:engine/view/observer/domeventobserver~DomEventObserver\n */\nexport default class CompositionObserver extends DomEventObserver {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\tthis.domEventType = [ 'compositionstart', 'compositionupdate', 'compositionend' ];\n\t\tconst document = this.document;\n\n\t\tdocument.on( 'compositionstart', () => {\n\t\t\tdocument.isComposing = true;\n\t\t} );\n\n\t\tdocument.on( 'compositionend', () => {\n\t\t\tdocument.isComposing = false;\n\t\t} );\n\t}\n\n\tonDomEvent( domEvent ) {\n\t\tthis.fire( domEvent.type, domEvent );\n\t}\n}\n\n/**\n * Fired when composition starts inside one of the editables.\n *\n * Introduced by {@link module:engine/view/observer/compositionobserver~CompositionObserver}.\n *\n * Note that because {@link module:engine/view/observer/compositionobserver~CompositionObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/compositionobserver~CompositionObserver\n * @event module:engine/view/document~Document#event:compositionstart\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n\n/**\n * Fired when composition is updated inside one of the editables.\n *\n * Introduced by {@link module:engine/view/observer/compositionobserver~CompositionObserver}.\n *\n * Note that because {@link module:engine/view/observer/compositionobserver~CompositionObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/compositionobserver~CompositionObserver\n * @event module:engine/view/document~Document#event:compositionupdate\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n\n/**\n * Fired when composition ends inside one of the editables.\n *\n * Introduced by {@link module:engine/view/observer/compositionobserver~CompositionObserver}.\n *\n * Note that because {@link module:engine/view/observer/compositionobserver~CompositionObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/compositionobserver~CompositionObserver\n * @event module:engine/view/document~Document#event:compositionend\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md.\n */\n\n/**\n * @module engine/view/observer/inputobserver\n */\n\nimport DomEventObserver from './domeventobserver';\n\n/**\n * Observer for events connected with data input.\n *\n * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.\n *\n * @extends module:engine/view/observer/domeventobserver~DomEventObserver\n */\nexport default class InputObserver extends DomEventObserver {\n\tconstructor( view ) {\n\t\tsuper( view );\n\n\t\tthis.domEventType = [ 'beforeinput' ];\n\t}\n\n\tonDomEvent( domEvent ) {\n\t\tthis.fire( domEvent.type, domEvent );\n\t}\n}\n\n/**\n * Fired before browser inputs (or deletes) some data.\n *\n * This event is available only on browsers which support DOM `beforeinput` event.\n *\n * Introduced by {@link module:engine/view/observer/inputobserver~InputObserver}.\n *\n * Note that because {@link module:engine/view/observer/inputobserver~InputObserver} is attached by the\n * {@link module:engine/view/view~View} this event is available by default.\n *\n * @see module:engine/view/observer/inputobserver~InputObserver\n * @event module:engine/view/document~Document#event:beforeinput\n * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.\n */\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/isrange\n */\n\n/**\n * Checks if the object is a native DOM Range.\n *\n * @param {*} obj\n * @returns {Boolean}\n */\nexport default function isRange( obj ) {\n\treturn Object.prototype.toString.apply( obj ) == '[object Range]';\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/getborderwidths\n */\n\n/**\n * Returns an object containing CSS border widths of a specified HTML element.\n *\n * @param {HTMLElement} element An element which has CSS borders.\n * @returns {Object} An object containing `top`, `left`, `right` and `bottom` properties\n * with numerical values of the `border-[top,left,right,bottom]-width` CSS styles.\n */\nexport default function getBorderWidths( element ) {\n\t// Call getComputedStyle on the window the element document belongs to.\n\tconst style = element.ownerDocument.defaultView.getComputedStyle( element );\n\n\treturn {\n\t\ttop: parseInt( style.borderTopWidth, 10 ),\n\t\tright: parseInt( style.borderRightWidth, 10 ),\n\t\tbottom: parseInt( style.borderBottomWidth, 10 ),\n\t\tleft: parseInt( style.borderLeftWidth, 10 )\n\t};\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/rect\n */\n\nimport isRange from './isrange';\nimport isWindow from './iswindow';\nimport getBorderWidths from './getborderwidths';\nimport isText from './istext';\nimport { isElement } from 'lodash-es';\n\nconst rectProperties = [ 'top', 'right', 'bottom', 'left', 'width', 'height' ];\n\n/**\n * A helper class representing a `ClientRect` object, e.g. value returned by\n * the native `object.getBoundingClientRect()` method. Provides a set of methods\n * to manipulate the rect and compare it against other rect instances.\n */\nexport default class Rect {\n\t/**\n\t * Creates an instance of rect.\n\t *\n\t *\t\t// Rect of an HTMLElement.\n\t *\t\tconst rectA = new Rect( document.body );\n\t *\n\t *\t\t// Rect of a DOM Range.\n\t *\t\tconst rectB = new Rect( document.getSelection().getRangeAt( 0 ) );\n\t *\n\t *\t\t// Rect of a window (web browser viewport).\n\t *\t\tconst rectC = new Rect( window );\n\t *\n\t *\t\t// Rect out of an object.\n\t *\t\tconst rectD = new Rect( { top: 0, right: 10, bottom: 10, left: 0, width: 10, height: 10 } );\n\t *\n\t *\t\t// Rect out of another Rect instance.\n\t *\t\tconst rectE = new Rect( rectD );\n\t *\n\t *\t\t// Rect out of a ClientRect.\n\t *\t\tconst rectF = new Rect( document.body.getClientRects().item( 0 ) );\n\t *\n\t * **Note**: By default a rect of an HTML element includes its CSS borders and scrollbars (if any)\n\t * ant the rect of a `window` includes scrollbars too. Use {@link #excludeScrollbarsAndBorders}\n\t * to get the inner part of the rect.\n\t *\n\t * @param {HTMLElement|Range|Window|ClientRect|module:utils/dom/rect~Rect|Object} source A source object to create the rect.\n\t */\n\tconstructor( source ) {\n\t\tconst isSourceRange = isRange( source );\n\n\t\t/**\n\t\t * The object this rect is for.\n\t\t *\n\t\t * @protected\n\t\t * @readonly\n\t\t * @member {HTMLElement|Range|ClientRect|module:utils/dom/rect~Rect|Object} #_source\n\t\t */\n\t\tObject.defineProperty( this, '_source', {\n\t\t\t// If the source is a Rect instance, copy it's #_source.\n\t\t\tvalue: source._source || source,\n\t\t\twritable: true,\n\t\t\tenumerable: false\n\t\t} );\n\n\t\tif ( isElement( source ) || isSourceRange ) {\n\t\t\t// The `Rect` class depends on `getBoundingClientRect` and `getClientRects` DOM methods. If the source\n\t\t\t// of a rect in an HTML element or a DOM range but it does not belong to any rendered DOM tree, these methods\n\t\t\t// will fail to obtain the geometry and the rect instance makes little sense to the features using it.\n\t\t\t// To get rid of this warning make sure the source passed to the constructor is a descendant of `window.document.body`.\n\t\t\t// @if CK_DEBUG // const sourceNode = isSourceRange ? source.startContainer : source;\n\t\t\t// @if CK_DEBUG // if ( !sourceNode.ownerDocument || !sourceNode.ownerDocument.body.contains( sourceNode ) ) {\n\t\t\t// @if CK_DEBUG // \tconsole.warn(\n\t\t\t// @if CK_DEBUG // \t\t'rect-source-not-in-dom: The source of this rect does not belong to any rendered DOM tree.',\n\t\t\t// @if CK_DEBUG // \t\t{ source } );\n\t\t\t// @if CK_DEBUG // }\n\n\t\t\tif ( isSourceRange ) {\n\t\t\t\tcopyRectProperties( this, Rect.getDomRangeRects( source )[ 0 ] );\n\t\t\t} else {\n\t\t\t\tcopyRectProperties( this, source.getBoundingClientRect() );\n\t\t\t}\n\t\t} else if ( isWindow( source ) ) {\n\t\t\tconst { innerWidth, innerHeight } = source;\n\n\t\t\tcopyRectProperties( this, {\n\t\t\t\ttop: 0,\n\t\t\t\tright: innerWidth,\n\t\t\t\tbottom: innerHeight,\n\t\t\t\tleft: 0,\n\t\t\t\twidth: innerWidth,\n\t\t\t\theight: innerHeight\n\t\t\t} );\n\t\t} else {\n\t\t\tcopyRectProperties( this, source );\n\t\t}\n\n\t\t/**\n\t\t * The \"top\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #top\n\t\t */\n\n\t\t/**\n\t\t * The \"right\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #right\n\t\t */\n\n\t\t/**\n\t\t * The \"bottom\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #bottom\n\t\t */\n\n\t\t/**\n\t\t * The \"left\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #left\n\t\t */\n\n\t\t/**\n\t\t * The \"width\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #width\n\t\t */\n\n\t\t/**\n\t\t * The \"height\" value of the rect.\n\t\t *\n\t\t * @readonly\n\t\t * @member {Number} #height\n\t\t */\n\t}\n\n\t/**\n\t * Returns a clone of the rect.\n\t *\n\t * @returns {module:utils/dom/rect~Rect} A cloned rect.\n\t */\n\tclone() {\n\t\treturn new Rect( this );\n\t}\n\n\t/**\n\t * Moves the rect so that its upper–left corner lands in desired `[ x, y ]` location.\n\t *\n\t * @param {Number} x Desired horizontal location.\n\t * @param {Number} y Desired vertical location.\n\t * @returns {module:utils/dom/rect~Rect} A rect which has been moved.\n\t */\n\tmoveTo( x, y ) {\n\t\tthis.top = y;\n\t\tthis.right = x + this.width;\n\t\tthis.bottom = y + this.height;\n\t\tthis.left = x;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Moves the rect in–place by a dedicated offset.\n\t *\n\t * @param {Number} x A horizontal offset.\n\t * @param {Number} y A vertical offset\n\t * @returns {module:utils/dom/rect~Rect} A rect which has been moved.\n\t */\n\tmoveBy( x, y ) {\n\t\tthis.top += y;\n\t\tthis.right += x;\n\t\tthis.left += x;\n\t\tthis.bottom += y;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns a new rect a a result of intersection with another rect.\n\t *\n\t * @param {module:utils/dom/rect~Rect} anotherRect\n\t * @returns {module:utils/dom/rect~Rect}\n\t */\n\tgetIntersection( anotherRect ) {\n\t\tconst rect = {\n\t\t\ttop: Math.max( this.top, anotherRect.top ),\n\t\t\tright: Math.min( this.right, anotherRect.right ),\n\t\t\tbottom: Math.min( this.bottom, anotherRect.bottom ),\n\t\t\tleft: Math.max( this.left, anotherRect.left )\n\t\t};\n\n\t\trect.width = rect.right - rect.left;\n\t\trect.height = rect.bottom - rect.top;\n\n\t\tif ( rect.width < 0 || rect.height < 0 ) {\n\t\t\treturn null;\n\t\t} else {\n\t\t\treturn new Rect( rect );\n\t\t}\n\t}\n\n\t/**\n\t * Returns the area of intersection with another rect.\n\t *\n\t * @param {module:utils/dom/rect~Rect} anotherRect [description]\n\t * @returns {Number} Area of intersection.\n\t */\n\tgetIntersectionArea( anotherRect ) {\n\t\tconst rect = this.getIntersection( anotherRect );\n\n\t\tif ( rect ) {\n\t\t\treturn rect.getArea();\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the area of the rect.\n\t *\n\t * @returns {Number}\n\t */\n\tgetArea() {\n\t\treturn this.width * this.height;\n\t}\n\n\t/**\n\t * Returns a new rect, a part of the original rect, which is actually visible to the user,\n\t * e.g. an original rect cropped by parent element rects which have `overflow` set in CSS\n\t * other than `\"visible\"`.\n\t *\n\t * If there's no such visible rect, which is when the rect is limited by one or many of\n\t * the ancestors, `null` is returned.\n\t *\n\t * @returns {module:utils/dom/rect~Rect|null} A visible rect instance or `null`, if there's none.\n\t */\n\tgetVisible() {\n\t\tconst source = this._source;\n\t\tlet visibleRect = this.clone();\n\n\t\t// There's no ancestor to crop with the overflow.\n\t\tif ( !isBody( source ) ) {\n\t\t\tlet parent = source.parentNode || source.commonAncestorContainer;\n\n\t\t\t// Check the ancestors all the way up to the .\n\t\t\twhile ( parent && !isBody( parent ) ) {\n\t\t\t\tconst parentRect = new Rect( parent );\n\t\t\t\tconst intersectionRect = visibleRect.getIntersection( parentRect );\n\n\t\t\t\tif ( intersectionRect ) {\n\t\t\t\t\tif ( intersectionRect.getArea() < visibleRect.getArea() ) {\n\t\t\t\t\t\t// Reduce the visible rect to the intersection.\n\t\t\t\t\t\tvisibleRect = intersectionRect;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// There's no intersection, the rect is completely invisible.\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tparent = parent.parentNode;\n\t\t\t}\n\t\t}\n\n\t\treturn visibleRect;\n\t}\n\n\t/**\n\t * Checks if all property values ({@link #top}, {@link #left}, {@link #right},\n\t * {@link #bottom}, {@link #width} and {@link #height}) are the equal in both rect\n\t * instances.\n\t *\n\t * @param {module:utils/dom/rect~Rect} rect A rect instance to compare with.\n\t * @returns {Boolean} `true` when Rects are equal. `false` otherwise.\n\t */\n\tisEqual( anotherRect ) {\n\t\tfor ( const prop of rectProperties ) {\n\t\t\tif ( this[ prop ] !== anotherRect[ prop ] ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks whether a rect fully contains another rect instance.\n\t *\n\t * @param {module:utils/dom/rect~Rect} anotherRect\n\t * @returns {Boolean} `true` if contains, `false` otherwise.\n\t */\n\tcontains( anotherRect ) {\n\t\tconst intersectRect = this.getIntersection( anotherRect );\n\n\t\treturn !!( intersectRect && intersectRect.isEqual( anotherRect ) );\n\t}\n\n\t/**\n\t * Excludes scrollbars and CSS borders from the rect.\n\t *\n\t * * Borders are removed when {@link #_source} is an HTML element.\n\t * * Scrollbars are excluded from HTML elements and the `window`.\n\t *\n\t * @returns {module:utils/dom/rect~Rect} A rect which has been updated.\n\t */\n\texcludeScrollbarsAndBorders() {\n\t\tconst source = this._source;\n\t\tlet scrollBarWidth, scrollBarHeight, direction;\n\n\t\tif ( isWindow( source ) ) {\n\t\t\tscrollBarWidth = source.innerWidth - source.document.documentElement.clientWidth;\n\t\t\tscrollBarHeight = source.innerHeight - source.document.documentElement.clientHeight;\n\t\t\tdirection = source.getComputedStyle( source.document.documentElement ).direction;\n\t\t} else {\n\t\t\tconst borderWidths = getBorderWidths( this._source );\n\n\t\t\tscrollBarWidth = source.offsetWidth - source.clientWidth - borderWidths.left - borderWidths.right;\n\t\t\tscrollBarHeight = source.offsetHeight - source.clientHeight - borderWidths.top - borderWidths.bottom;\n\t\t\tdirection = source.ownerDocument.defaultView.getComputedStyle( source ).direction;\n\n\t\t\tthis.left += borderWidths.left;\n\t\t\tthis.top += borderWidths.top;\n\t\t\tthis.right -= borderWidths.right;\n\t\t\tthis.bottom -= borderWidths.bottom;\n\t\t\tthis.width = this.right - this.left;\n\t\t\tthis.height = this.bottom - this.top;\n\t\t}\n\n\t\tthis.width -= scrollBarWidth;\n\n\t\tif ( direction === 'ltr' ) {\n\t\t\tthis.right -= scrollBarWidth;\n\t\t} else {\n\t\t\tthis.left += scrollBarWidth;\n\t\t}\n\n\t\tthis.height -= scrollBarHeight;\n\t\tthis.bottom -= scrollBarHeight;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns an array of rects of the given native DOM Range.\n\t *\n\t * @param {Range} range A native DOM range.\n\t * @returns {Array.} DOM Range rects.\n\t */\n\tstatic getDomRangeRects( range ) {\n\t\tconst rects = [];\n\t\t// Safari does not iterate over ClientRectList using for...of loop.\n\t\tconst clientRects = Array.from( range.getClientRects() );\n\n\t\tif ( clientRects.length ) {\n\t\t\tfor ( const rect of clientRects ) {\n\t\t\t\trects.push( new Rect( rect ) );\n\t\t\t}\n\t\t}\n\t\t// If there's no client rects for the Range, use parent container's bounding rect\n\t\t// instead and adjust rect's width to simulate the actual geometry of such range.\n\t\t// https://github.com/ckeditor/ckeditor5-utils/issues/153\n\t\t// https://github.com/ckeditor/ckeditor5-ui/issues/317\n\t\telse {\n\t\t\tlet startContainer = range.startContainer;\n\n\t\t\tif ( isText( startContainer ) ) {\n\t\t\t\tstartContainer = startContainer.parentNode;\n\t\t\t}\n\n\t\t\tconst rect = new Rect( startContainer.getBoundingClientRect() );\n\t\t\trect.right = rect.left;\n\t\t\trect.width = 0;\n\n\t\t\trects.push( rect );\n\t\t}\n\n\t\treturn rects;\n\t}\n}\n\n// Acquires all the rect properties from the passed source.\n//\n// @private\n// @param {module:utils/dom/rect~Rect} rect\n// @param {ClientRect|module:utils/dom/rect~Rect|Object} source\nfunction copyRectProperties( rect, source ) {\n\tfor ( const p of rectProperties ) {\n\t\trect[ p ] = source[ p ];\n\t}\n}\n\n// Checks if provided object is a HTML element.\n//\n// @private\n// @param {HTMLElement|Range} elementOrRange\n// @returns {Boolean}\nfunction isBody( elementOrRange ) {\n\tif ( !isElement( elementOrRange ) ) {\n\t\treturn false;\n\t}\n\n\treturn elementOrRange === elementOrRange.ownerDocument.body;\n}\n","/**\n * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module utils/dom/scroll\n */\n\nimport isRange from './isrange';\nimport Rect from './rect';\nimport isText from './istext';\n\nconst utils = {};\n\n/**\n * Makes any page `HTMLElement` or `Range` (`target`) visible inside the browser viewport.\n * This helper will scroll all `target` ancestors and the web browser viewport to reveal the target to\n * the user. If the `target` is already visible, nothing will happen.\n *\n * @param {HTMLElement|Range} options.target A target, which supposed to become visible to the user.\n * @param {Number} [options.viewportOffset] An offset from the edge of the viewport (in pixels)\n * the `target` will be moved by when the viewport is scrolled. It enhances the user experience\n * by keeping the `target` some distance from the edge of the viewport and thus making it easier to\n * read or edit by the user.\n */\nexport function scrollViewportToShowTarget( { target, viewportOffset = 0 } ) {\n\tconst targetWindow = getWindow( target );\n\tlet currentWindow = targetWindow;\n\tlet currentFrame = null;\n\n\t// Iterate over all windows, starting from target's parent window up to window#top.\n\twhile ( currentWindow ) {\n\t\tlet firstAncestorToScroll;\n\n\t\t// Let's scroll target's ancestors first to reveal it. Then, once the ancestor scrolls\n\t\t// settled down, the algorithm can eventually scroll the viewport of the current window.\n\t\t//\n\t\t// Note: If the current window is target's **original** window (e.g. the first one),\n\t\t// start scrolling the closest parent of the target. If not, scroll the closest parent\n\t\t// of an iframe that resides in the current window.\n\t\tif ( currentWindow == targetWindow ) {\n\t\t\tfirstAncestorToScroll = getParentElement( target );\n\t\t} else {\n\t\t\tfirstAncestorToScroll = getParentElement( currentFrame );\n\t\t}\n\n\t\t// Scroll the target's ancestors first. Once done, scrolling the viewport is easy.\n\t\tscrollAncestorsToShowRect( firstAncestorToScroll, () => {\n\t\t\t// Note: If the target does not belong to the current window **directly**,\n\t\t\t// i.e. it resides in an iframe belonging to the window, obtain the target's rect\n\t\t\t// in the coordinates of the current window. By default, a Rect returns geometry\n\t\t\t// relative to the current window's viewport. To make it work in a parent window,\n\t\t\t// it must be shifted.\n\t\t\treturn getRectRelativeToWindow( target, currentWindow );\n\t\t} );\n\n\t\t// Obtain the rect of the target after it has been scrolled within its ancestors.\n\t\t// It's time to scroll the viewport.\n\t\tconst targetRect = getRectRelativeToWindow( target, currentWindow );\n\n\t\tscrollWindowToShowRect( currentWindow, targetRect, viewportOffset );\n\n\t\tif ( currentWindow.parent != currentWindow ) {\n\t\t\t// Keep the reference to the